Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Файловая система —> root ZFS, GPT

'Установка FreeBSD на ZFS/root' или 'Пособие себе на память - 1'

Автор: Fomalhaut.


ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ

  • 1. Разметка диска
  • 2. Создание файловых систем
  • 3. Установка системы
  • 4. Завершение установки
  • 5. Выделение памяти для ZFS
  • 6. Параметры монтирования
  • 7. Обновление ZFS
  • 8. Решение мелких проблем
    Заключение
    Спасибы
    Дополнительная информация

    ВВЕДЕНИЕ

    Потихоньку созрел и для таких экспериментов. :D Много тонкостей, которые постарался охватить в этом описании.
    Задача: установить систему целиком (в том числе и root) на раздел с ZFS используя для разбивки не MBR, а GPT.
    Согласно рекомендациям, если планируется использовать ZFS, то 64-битная версия системы предпочтительней, поэтому в качестве установочного диска использован официальный DVD FreeBSD-8.1-RELEASE-amd64-dvd1.iso. Для выхода в консоль выбран пункт "Fixit..." в меню sysinstall-а с монтированием CD/DVD.
    Не смотря на "Fixit$" для всех действий требуется права root (изменено для корректной обработки парсером сайта). Без метки "Fixit$" будет представляться результат работы команды, выводимый на консоль. И так, приступим...

    1. Разметка диска

    На сервере, куда будет устанавливать FreeBSD 8.1-RELEASE установлено 2 SCSI жёстких диска по 72Гб, объединённых в "зеркало" на RAID-контроллере. В системе RAID виден, как устройство /dev/ipsd0.
    Если до этого момента на жёстком диске были созданы разделы - необходимо их удалить. В первую очередь это, скорее всего была таблица разделов на основе MBR, а во вторых мы будем со всем разбираться с самого начала.
    Для работы с разбивкой GPT используется утилита gpart. Её же можно использовать и для работы с MBR.

    1.1. Просматриваем, что есть на жёстком диске:
    Fixit$ gpart show ipsd0
    =>       63 312581745 ipsd0 MBR  (149G)
             63  11293632     1 !12 [active]  (5.4G)
       11293695 301288113       - free -  (144G)
    

    1.2. Удаляем раздел[ы]:
    Fixit$ gpart delete -i 1 ipsd0
    ipsd0s1 deleted
    

    1.3. Уничтожаем существующую таблицу разделов (в данном случае - MBR):
    Fixit$ gpart destroy ipsd0
    ipsd0 destroyed
    

    1.4. Создаём таблицу GPT:
    Fixit$ gpart create -s GPT ipsd0
    ad4 created
    Fixit$ gpart show ipsd0
    =>       34 312581741 ipsd0 GPT  (149G)
             34 312581741       - free —  (149G)
    

    1.5. Создаём разделы. Создаваемый раздел характеризуется тремя параметрами: смещение начального блока LBA, размер и тип. Доступный для использования блок LBA можно определить по выводу команды gpart show ad4. В первом столбце строки с записью "- free -" выводится номер блока, с которого начинается неиспользуемое пространство.
    Для упрощения манипулирования разделами стоит присваивать GPT разделам метки. Например, если в дальнейшем будет необходимость создавать RAID-массивы средствами ZFS (RAIDZ).
    Так же обращаю внимание, что с появлением новых жёстких дисков, имеющих размер кластера 4кБ необходимо следить, чтобы начальный и конечный сектора (блоки) были выравнены по 4кБ. При этом не стоит забывать, что для внешних (относительно жёсткого диска) систем контроллер последнего эмулирует размер сектора всё таким же 512 байтным. В случае не выравненности разделов возникает проблема сильного снижения скорости передачи данных с активным использованием жёсткого диска в процессе работы.
    1.5.а. Создаём раздел для загрузчика. Тут есть несколько тонкостей.
    Первое: размер раздела для загрузчика не должен быть больше 545 кБ, иначе при загрузке появится сообщение "Boot loader too large" и загрузка остановится.
    Второе: по умолчанию началом первого раздела за GPT является 34 блок, но если в качестве целевого жёсткого диска будет использоваться жёсткий диск с 4кБ секторами, то в качестве первого блока для раздела freebsd-boot необходимо использовать не 34, а 40 блок (т.е. сделать необходимое выравнивание).


    Необходимо сделать выравнивание начала раздела, чтобы было кратно 4кБ. Контроллер жёсткого диска для системы всё равно представляется "винтом" с 512 кБайтным блоком, и сам осуществляет трансляцию 4кБ <-> 512Б. Поэтому, например, по умолчанию, за GPT начинается раздел с 34 блока, т.е. с 17 кБайта (напомню, что блок для системы выглядит всё равно как 512 б), а кратным 4кБ будет 40 блок или 20-й кБайт.
    В приницпе, для UFS такого выравнивания было бы достаточно (у неё фиксированный разбмер собственного блока, равный 16кБ), а вот с ZFS, имеющей переменный (не фиксированный) размер блока - несколько сложнее. Поэтому ей лучше, чтобы жёсткий диск представлялся реальными (в данном случае - 4кБ) блоками, а ведь современные HDD с 4кБ блоками для системы представляются всё так же с 512Б блоками - трансляция осуществляется контроллером "винта".
    Для такой обратной трансляции используется специальный GEOM класс NOP, управляемый через утилиту gnop. Вот как это сделано у levsha: в /etc/rc.d/ создаётся скрипт gnop:
    # cat /etc/rc.d/gnop 
    #!/bin/sh
    #
    
    # PROVIDE: gnop
    # REQUIRE: mountcritlocal
    # BEFORE:  zfs
    # KEYWORD: nojail
    
    . /etc/rc.subr
    
    name="gnop"
    rcvar=`set_rcvar`
    start_cmd="do_gnop"
    stop_cmd=":"
    
    do_gnop()
    {
            for d in $gnop_disks
            do
                    if [ -e /dev/$d.nop ]
                    then
                            echo "gnop: device $d already configured"
                    else
                            echo -n "gnop: configuring device $d ..."
                            gnop create -v $gnop_flags $d
                    fi
            done
    }
    
    load_rc_config $name
    run_rc_command "$1"
    

    Данному скрипту даются соответствующие права:
    $ chmod 555 /etc/rc.d/gnop   # -r-xr-xr-x
    

    Для использования этого скрипта используется /etc/rc.conf:
    gnop_enable="YES" # загрузка gnop
    gnop_disks="ada0 ada1 ada2 ada3" # какие диски обрабатывать
    gnop_flags="-S 4096" # в какого размера сектор транслировать
    

    Этот "велосипед" требуется для того, чтобы ZFS вся система (ОС и компьютер) работала оптимально: у ZFS размер собственного блока не фиксирован и ориентируется на размер блока "винта", т.е. в любом случае на 512 байт (т.к. "винт" всегда это рапортует).
    Между тем попалась информация, что в Windows 7 сделано выравнивание первого раздела в 2048 блоков, т.е. в 1МБ. Но сам это не проверял: нету у меня Вантуза. :)



    Загрузочный раздел начинается по смещению 34 блока от начала диска - сразу после таблицы GPT. Его размер задаём в 256 блоков, это составляет 128кБайт (). В принципе для моих целей достаточно и 32кБайт, но я сделал с запасом. Тип раздела "freebsd-boot" означает, что этот раздел выделен специально под загрузчик FreeBSD:
    Fixit$ gpart add -b 34 -s 256 -t freebsd-boot ipsd0
    ipsd0p1 added
    

    Параметр -b указывает смещение начального блока создаваемого раздела, а -s - его размер (дополнения к цифрам k, m, g означают, что размер задан не в блоках, а в кило-, мега-, гигабайтах). Уже начиная с версии 8.0-BETA1 в параметрах утилиты gpart можно опускать эти параметры, а так же использовать суффиксы для указания размера создаваемого раздела.
    По-умолчанию, смещение начального блока берётся минимальным возможным. И если в случае жёсткого диска с 512 Б секторами в этом случае можно не указывать «-b 34», то в случае 4кБ секторов необходимо указать в обязательном порядке «-b 40». При создании остальных разделов тоже надо помнить о выравнивании. Здесь же в дальнейшем будет всё приводиться для обычных (пока ещё) жёстких дисков с 512Б секторами.
    Размер, если не указан - всё оставшееся свободное пространство. Например, та же команда для создания загрузочного раздела выглядела бы вот так:
    Fixit$ gpart add -s 128k -t freebsd-boot -l boot0 ipsd0
    

    Где «boot0» - фиксированная «метка» GPT-раздела, по которой он так же будет доступен, как и по обычному идентификатору (в моём случае /dev/ipsd0p1). Такая же метка может быть дана любым другим разделам. Доступен данный идентификатор будет после перезагрузки в каталоге /dev/gpt:
    Fixit$ ls /dev/gpt
    boot0
    

    1.5.б. Создаём раздел для swap-а.
    Можно создать swap и на ZFS, но тогда не будет возможности записи дампа ядра при kernel panic. Размер раздела будет 4 ГБ, в блоках это = 1024*1024*2*4 (в 1кБ два блока). Тип раздела — freebsd-swap:
    Fixit$ gpart add -b 290 -s 8388608 -t freebsd-swap -l swap0 ipsd0
    ipsd0p2 added
    

    1.5.в. Создаём раздел для ZFS пула, отведя ему остатки. Тип раздела — freebsd-zfs. Начало и конец раздела можно не указывать, если под него выделяется всё оставшееся место на жёстких дисках, как в моём случае.
    Fixit$ gpart add -t freebsd-zfs -l disk0 ipsd0
    ipsd0p3 added
    

    Итоговая таблица GPT будет такой:
    Fixit$ gpart show ipsd0
    =>       34 312581741 ipsd0 GPT (68G)
             34       256     1 freebsd-boot  (128K)
            290   8388608     2 freebsd-swap  (4.0G)
        8388608 134983357     3 freebsd-zfs  (64G)
    

    Можно вывести и по указанным идентификаторам:
    Fixit$ gpart show -l ipsd0
    =>       34 312581741 ipsd0 GPT (68G)
             34       256     1 boot0  (128K)
            290   8388608     2 swap0  (4.0G)
        8388608 134983357     3 disk0  (64G)
    

    Недавно в утилиту gpart была добавлена новая функциональность: возможность резервного копирования и восстановления таблицы разделов: gpart backup/restore.

    2. Создание файловых систем

    Сразу отмечу, что «файловой системой» и «dataset-ом» в контексте ZFS в разных источниках называют одно и тоже.

    2.1. Для работы с разделами с ZFS необходимо подгрузить соответствующие модули ядра.
    Fixit$ kldload /mnt2/boot/kernel/opensolaris.ko
    Fixit$ kldload /mnt2/boot/kernel/zfs.ko
    

    Каталог /mnt2/ является симлинком на /dist/, поэтому здесь и далее вместо /mnt2/ можно напрямую указывать /dist/.

    2.2. Созданные на этапе "Разметка диска" разделы для системы представляются следующим образом:
    Fixit$ ls -l /dev/ipsd0*
    crw-r----- 1 root operator 0, 63 29 июл 11:57 /dev/ipsd0
    crw-r----- 1 root operator 0, 79 29 июл 12:42 /dev/ipsd0p1
    crw-r----- 1 root operator 0, 86 29 июл 13:00 /dev/ipsd0p2
    crw-r----- 1 root operator 0, 88 29 июл 13:03 /dev/ipsd0p3
    

    Третий раздел - созданный нами freebsd-zfs. На нём и создадим пул командой zpool:
    Fixit$ zpool create -m /mnt systor /dev/ipsd0p3
    


    Если понадобится создавать пул на "зеркале", то это можно сделать либо сразу объединив диски/разделы (три варианта):
    1. Fixit$ zpool create systor mirror ipsd0 ipsd1 #объединение дисков
    2. Fixit$ zpool create systor mirror ipsd0p3 ipsd1p3 #объединение разделов
    3. Fixit$ zpool create systor mirror gpt/disk0 gpt/disk1 #через метку
    

    либо создав как обычно, на одном диске/разделе, и потом присоединив второй (три соответствующих варианта):
    1. Fixit$ zpool attach systor ipsd0 ipsd1 #объединение с диском ipsd1
    2. Fixit$ zpool attach systor ipsd0p3 ipsd1p3 #объединение с разделом ipsd1p3
    3. Fixit$ zpool attach systor gpt/disk0 gpt/disk1 #через метку
    



    После создания пула его корень будет смонтирован в /mnt. Осталось указать, что этот пул будет загрузочным (через свойство bootfs):
    Fixit$ zpool set bootfs=systor systor
    


    Если ранее на этом разделе был ZFS-пул (назовём его oldzpool) и его надо пересоздать, то предварительно удалим. Если пул был root-овым, то простой импорт
    Fixit$ zpool import
    

    или принудительный
    Fixit$ zpool import -f oldzpool
    

    приведёт к «поломке» загруженной системы. В этом случае на ввод любой команды выведется следующее (в общем виде):
    ---//--- Shared object ---//--- not found, required by ---//---
    

    Поэтому "старые" пулы необходимо монтировать принудительно в отдельную директорию, например, в /mnt_old/:
    Fixit$ zpool import -R /mnt_old/ -f oldzpool
    

    Стоит уточнить, что надо обязательно указывать для монтирования каталог, причём отличный от того, куда смонтирован активный пул (если он есть).
    Остаётся удалить пул:
    Fixit$ zpool destroy -f oldzpool
    

    Определённые в пуле файловые системы будут так же утеряны (удалены).



    Дальнейшие действия по созданию файловый систем производятся командой zfs.

    2.3. Укажем алгоритм подсчёта контрольных сумм:
    Fixit$ zfs set checksum=fletcher4 systor
    

    В ZFS поддерживается три алгоритма для подсчёта контрольных сумм: fletcher2, fletcher4, sha256.

    2.4. Теперь можно создать дополнительные разделы. Предварительно я устанавливаю свойство atime=off для корневой системы, чтобы оно унаследовалось всеми вновь создаваемыми файловыми системами:
    Fixit$ zfs set atime=off systor
    Fixit$ zfs create systor/var
    Fixit$ zfs create systor/usr
    Fixit$ zfs create systor/tmp
    Fixit$ zfs create systor/var/tmp
    Fixit$ zfs create systor/var/empty
    Fixit$ zfs create -o compression=gzip systor/var/crash
    Fixit$ zfs create -o compression=gzip -o mountpoint=/mnt/usr/src systor/src
    Fixit$ zfs create -o compression=gzip -o mountpoint=/mnt/usr/ports systor/ports
    Fixit$ zfs create -o mountpoint=/mnt/usr/ports/distfiles systor/distfiles
    Fixit$ zfs create -o mountpoint=/mnt/usr/home systor/home
    Fixit$ zfs create -o mountpoint=/mnt/usr/local systor/local
    Fixit$ zfs create -o mountpoint=/mnt/usr/obj systor/obj
    Fixit$ zfs create systor/var/db
    Fixit$ chmod 1777 /mnt/tmp /mnt/var/tmp
    


    Для информации:
    a) сжатие может быть установлено в состояние on, off, lzjb, gzip, gzip-N (где N представляет целое от 1 (быстрое сжатие) до 9 (лучшее сжатие, по умолчанию gzip значит gzip-6);
    b) сжатие вызывает некоторую задержку при доступе к файлам (как при записи, так и при чтении), поэтому режим сжатия рекомендуется использовать для файловых систем нечастого использования.


    Если swap создавать не в виде отдельного GPT-раздела, а внутри ZFS пула: то сделать это можно таким образом:
    zfs create -V 1gb systor/swap
    zfs set org.freebsd:swap=on systor/swap
    zfs set checksum=off systor/swap
    

    При этом стоит не забывать, что при этом не будет возможности получить crash dump ядра в случае необходимости.
    Посмотрим результат (мы не делали swap на ZFS):
    Fixit$ zfs list
    NAME               USED  AVAIL  REFER  MOUNTPOINT
    systor             342K  62.0G    22K  /mnt
    systor/distfiles    18K  62.0G    18K  /mnt/usr/ports/distfiles
    systor/home         18K  62.0G    18K  /mnt/usr/home
    systor/local        18K  62.0G    18K  /mnt/usr/local
    systor/obj          18K  62.0G    18K  /mnt/usr/obj
    systor/ports        37K  62.0G    19K  /mnt/usr/ports
    systor/src          18K  62.0G    18K  /mnt/usr/src
    systor/tmp          18K  62.0G    18K  /mnt/tmp
    systor/usr          95K  62.0G    22K  /mnt/usr
    systor/var          76K  62.0G    22K  /mnt/var
    systor/var/crash    18K  62.0G    18K  /mnt/var/crash
    systor/var/db       18K  62.0G    18K  /mnt/var/db
    systor/var/empty    18K  62.0G    18K  /mnt/var/empty
    systor/var/tmp      18K  62.0G    18K  /mnt/var/tmp
    

    Для чего создано так много отдельных файловых систем:
      - различные свойства для файловых систем, например, компрессия для /usr/src, /usr/ports и /var/crash;
      - большая гибкость при планировании резервного копирования, например, для /var/db, /usr/home и /usr/local можно создавать снэпшоты по отдельному расписанию;
    иногда возникает необходимость смонтировать /usr/obj в другое место (например, в chroot другой системы).
    Для просмотра свойств созданных файловых систем можно воспользоваться командой:
    Fixit$ zfs get -r -s local all
    

    А если необходимо глянуть все свойства, в том числе и наследуемые:
    Fixit$ zfs get -r -s local,inherited all
    

    Свойства dataset-а (например, compression), наследуются вложенными dataset-ами.
    Свойства можно посмотреть и по другому:
    Fixit$ zfs list -o name,mountpoint,exec,compression -r zdata
    

    3. Установка системы

    3.1. Устанавливаем защитный Protected MBR (pmbr) от программ, не знающих GPT, и GPART загрузчик gptzfsboot:
    Fixit$ gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ipsd0
    

    3.2. Установим систему в созданный пул systor:
    Fixit$ cd /dist/8.1-RELEASE
    Fixit$ export DESTDIR=/mnt
    Fixit$ for dir in base catpages dict doc games info lib32 manpages ports; \
           do (cd $dir ; ./install.sh) ; done
    Fixit$ cd src ; ./install.sh all
    Fixit$ cd ../kernels ; ./install.sh generic
    Fixit$ cd /mnt/boot ; cp -Rlp GENERIC/* /mnt/boot/kernel/
    

    ВАЖНО ДЛЯ i386 СБОРКИ: В этой версии FreeBSD в строке цикла for не надо указывать lib32. Так же было зачемено, что почему-то при отработке ./install.sh на ports система замирает секунд на 15 (хотя по "Num lock", например, реагирует) и вываливается с трапом. Поэтому при установке i386 версии системы лучше не указывать ports для установки: потом легко можно поставить с того же диска или через portsnap, например.

    3.3. Для датасета systor/var/empty установим режим "только чтение":
    Fixit$ zfs set readonly=on systor/var/empty
    

    3.4. Переключимся в режим (chroot) для ZFS-пула /systor:
    Fixit$ chroot /mnt
    

    3.5. Создадим /etc/rc.conf:
    Fixit$ echo 'zfs_enable="YES"' > /etc/rc.conf
    Fixit$ echo 'hostname="stalker.mydomain.local"' >> /etc/rc.conf
    Fixit$ echo 'defaultrouter="192.168.1.4"' >> /etc/rc.conf
    Fixit$ echo 'ifconfig_re0="192.168.1.3 netmask 0xffffff00"' >> /etc/rc.conf
    Fixit$ echo 'ifconfig_re1="DHCP"' >> /etc/rc.conf
    Fixit$ echo 'sshd_enable="YES"' >> /etc/rc.conf
    

    В данном примере re0, re1 — сетевые интерфейсы в новой системе.

    3.6. Создадим /boot/loader.conf:
    Fixit$ echo 'zfs_load="YES"' > /boot/loader.conf
    Fixit$ echo 'vfs.root.mountfrom="zfs:systor"' >> /boot/loader.conf
    

    3.7. Установим системный загрузчик с поддержкой ZFS.
    "В состав базовой системы добавлен zfsloader, который позволяет загружать систему с ZFS-разделов (для использования загрузчика zfsloader необходимо установить загрузочный код zfsboot или gptzfsboot);" (выдержка из описания к 8.1-RELEASE). Т.е. загрузчик в комплекте 8.1-RELEASE уже поддерживает ZFS в полном объёме.
    В для более старых версий системы необходимо скомпилировать загрузчик с поддержкой ZFS:
    Fixit$ echo 'LOADER_ZFS_SUPPORT=YES' > /etc/src.conf
    Fixit$ mount -t devfs devfs /dev
    Fixit$ export DESTDIR=""
    Fixit$ cd /usr/src/sys/boot/
    Fixit$ make obj
    Fixit$ make depend
    Fixit$ make
    Fixit$ cd i386/loader
    Fixit$ make install
    

    3.8. Зададим пароль root-а:
    Fixit$ passwd
    

    3.9. Установим локальную временную зону:
    Fixit$ tzsetup
    

    3.10. Создадим бинарную базу почтовых алиасов /etc/mail/aliases.db:
    Fixit$ cd /etc/mail
    Fixit$ make aliases
    

    3.11. Создадим для новых пользователей профиль "по умолчанию":
    Fixit$ adduser -C
    

    3.12. Выйдем из режима chroot:
    Fixit$ umount /dev
    Fixit$ exit
    

    3.13. Создадим zpool.cache, в котором содержится информация о созданном пуле ZFS. Он нужен для того, чтобы свежеустановленная система сразу нашла ZFS пул без предварительного его импорта командой zpool import:
    Fixit$ zpool set cachefile=/mnt/boot/zfs/zpool.cache systor
    

    4. Завершение установки

    4.1. Создадим файл /etc/fstab:
    Fixit$ cat << EOF > /mnt/etc/fstab
    # Device        Mountpoint   FStype   Options   Dump   Pass#
    proc            /proc        procfs   rw        0      0
    EOF
    Fixit$ mkdir /proc
    

    Для подключения swap-партиции можно воспользоваться прямым указанием номера партиции на устройстве:
    Fixit$ echo '/dev/ipsd0p2    none    swap   sw    0   0' >> /systor/etc/fstab
    

    А можно воспользоваться возможностями GPT:
    Fixit$ glabel list | grep gpt
    1. Name: gpt/boot0
    1. Name: gptid/6a992733-a9f5-11df-8040-0011258e011c
    1. Name: gpt/swap0
    1. Name: gptid/99e63961-a9f5-11df-8040-0011258e011
    

    Т.е. можно воспользоваться созданной ранее GPT-меткой:
    Fixit$ echo '/dev/gpt/swap0  none    swap   sw    0   0' >> /systor/etc/fstab
    

    Или же воспользоваться GPT-идентификатором, что позволит в дальнейшем забыть о необходимости редактирования /etc/fstab при изменении именования диска (при подключении "винчестера" к другому SAS/SCSI/SATA/PATA-порту или при использовании, например, экспериментального AHCI-драйвера):
    Fixit$ glabel status | grep ipsd0p2 | grep -v swap0 >> /systor/etc/fstab
    Fixit$ vi /systor/etc/fstab
    Fixit$ cat /systor/etc/fstab | grep gptid
    /dev/gptid/99e63961-a9f5-11df-8040-0011258e011  none    swap   sw    0   0
    

    4.2. Отмонтируем все ZFS файловые системы:
    Fixit$ export LD_LIBRARY_PATH=/mnt2/lib
    Fixit$ cd /
    Fixit$ zfs unmount -a
    

    4.3. Сменим точки монтирования файловых систем:
    Fixit$ zfs set mountpoint=legacy systor
    Fixit$ zfs set mountpoint=/var systor/var
    Fixit$ zfs set mountpoint=/var/db systor/var/db
    Fixit$ zfs set mountpoint=/var/tmp systor/var/tmp
    Fixit$ zfs set mountpoint=/var/empty systor/var/empty
    Fixit$ zfs set mountpoint=/var/crash systor/var/crash
    Fixit$ zfs set mountpoint=/usr systor/usr
    Fixit$ zfs set mountpoint=/usr/src systor/src
    Fixit$ zfs set mountpoint=/usr/ports systor/ports
    Fixit$ zfs set mountpoint=/usr/ports/distfiles systor/distfiles
    Fixit$ zfs set mountpoint=/usr/home systor/home
    Fixit$ zfs set mountpoint=/usr/local systor/local
    Fixit$ zfs set mountpoint=/usr/obj systor/obj
    Fixit$ zfs set mountpoint=/tmp systor/tmp
    

    4.4. Выйдем из Fixit режима, возвратившись в sysinstall. Удалим установочный DVD с FreeBSD и произведём загрузку установленной системы.

    5. Выделение памяти для ZFS

    При загрузке ядро будет выводить предупреждения, что необходимо сконфигурировать переменными ядра распределение памяти для работы ZFS.
    Мои настройки /boot/loader.conf для машины с 2 ГБ памяти:
    vm.kmem_size="1024M"
    vm.kmem_size_max="1024M"
    vfs.zfs.arc="512M"
    vfs.zfs.arc_max="512M"
    vfs.zfs.vdev.cache.size="10M"
    vfs.zfs.prefetch_disable=1
    

    Если всё таки устанавливается версия i386, то для более правильной настройки стоит получше изучить ZFS, в особенности в части тюнинга.
    Например, для домашнего сервера (Pentium 4 2.66GHz / 1280 MB), куда amd64 не устанавливалась в виду отсутствия поддержки 64битных расширений, пришлось ставить i386 сборку, а для ZFS задать такие параметры памяти:
    vm.kmem_size="512M"
    vm.kmem_size_max="512M"
    vfs.zfs.arc="80M"
    vfs.zfs.arc_max="80M"
    vfs.zfs.vdev.cache.size="30M"
    vfs.zfs.prefetch_disable=1
    

    Есть важное уточнение (опять же - для i386): если выставляется kmem более 512 Мб, то система падает в "кернел паник" с "руганью" на kmem_suballoc. Суть в том, что по умолчанию указать можно не более 512 Мб, а для бОльших значений (до 1Гб) необходимо пересобрать ядро с параметром:
    options KVA_PAGES=512
    

    По умочанию KVA_PAGES=256, что и является причиной ограничения.

    6. Параметры монтирования

    В процессе эксплуатации система, где установлена FreeBSD, так или иначе будет подвергаться различным воздействиям: положительным (например, настройка, обработка информации) и отрицательным (какие-либо ошибки, попытки взлома (особенно, если система будет иметь выход в сеть Интернет) или что-то ещё).
    Для защиты от негативных воздействий (тем более - умышленных) на уровне файловой системы (идея и для UFS и для ZFS едина) можно воспользоваться таким свойством, как "read only" (только чтение).
    В следующей таблице для всех датасетов ZFS, из ранее созданных по данной статье, указаны режимы монтирования, рекомендованные для использования FreeBSD в активном режиме:
    Датасет
    Точка монтирования
    Режим
    systor / RO Ex
    systor/var /var RW
    systor/var/db /var/db RO
    systor/var/tmp /var/tmp RW
    systor/var/empty /var/empty RW
    systor/var/crash /var/crash RW
    systor/usr /usr RO Ex
    systor/src /usr/src RO
    systor/ports /usr/ports RO
    systor/distfiles /usr/ports/distfiles RO
    systor/home /usr/home RW
    systor/local /usr/local RO Ex
    systor/obj /usr/obj RO
    systor/tmp /tmp RW

    RO - только чтение, RW - чтение и запись, Ex - запуск

    7. Обновление ZFS

    15 сентября 2010 г. в восьмую ветку FreeBSD был добавлен исходный код 15-й версии ZFS (точнее: 15-й версии пул и 4-й версии датасетов).
    Просмотреть текущие версии пула и датасетов можно так:
    $ zpool upgrade     # с -v - кратная информация по версиям
    $ zfs upgrade       # с -v - кратная информация по версиям
    

    Если ставить изначально систему с ZFS более ранней версией и затем обновиться, то необходимо будет обновить версии пула и датасетов:
    $ zpool upgrade -a  # обновление пула
    $ zfs upgrade -a    # обновление датасетов
    

    Обновление произойдёт без каких-либо дополнительных действий в процессе работы системы.
    В дополнении к этому: в 15-й версии используется библиотека python для поддержки подкоманд утилиты zfs (zfs allow, zfs unallow, zfs groupspace, zfs userspace), поэтому требуется её установить:
    $ cd /usr/ports/sysutils/py-zfs/
    $ make install clean
    

    Возможно в будущих релизах системы эту библиотеку интегрируют в дистрибутив, но пока - ручками. :)

    8. Решение мелких проблем

    ПРОБЛЕМА №1:
    При загрузке с диска (LiveFS или установочного) возможно появление ошибки на этапе загрузки ядра (у меня проявилось на сервере IBM x346, когда к нему подключил DVD-дисковод):
    SMP: AP CPU#1 Launched!
    acd0: TIMEOUT - READ_BIG retrying (1 retry left)
    acd0: TIMEOUT - READ_BIG retrying (0 retries left)
    acd0: FAILURE - READ_BIG timed out
    

    Данная проблема может быть решена установкой параметра DMA в загрузчике (loader prompt):
    set hw.ata.atapi_dma=0
    boot
    

    Для постоянного применения данного параметра его необходимо прописать в файл /etc/sysctl.conf.

    ПРОБЛЕМА №2:
    Если по какой-либо причине (например, для корректировки /boot/loder.conf, иначе система не загружается - как раз мой случай) для доступа к данный на ZFS пуле пришлось его монтировать с ключём -R (принудительное монтирование пула в заданный каталог)
    Fixit$ zpool import -R /mnt_new -f systor
    

    , то потребуется восстановить файл /boot/zfs/zpool.cache, т.к. сбросилось свойство пула cachefile, что видно при просмотре свойств пула:
    Fixit$ zpool get all systor
    

    Но это не самая простая (и не очевидная) задача. Надо сделать:
    первое: смонтировать корень данного пула (его точка монтирования изменилась на none и поэтому при импорте он стал недоступен):
    Fixit$ zfs umount -a
    Fixit$ zfs set mountpoint=/ systor
    Fixit$ zfs mount
    

    второе: обновить файл zpool.cache инициализацией соотв.значения свойства cachefile:
    Fixit$ zpool set cachefile=/mnt_new/boot/zfs/zpool.cache systor
    

    Всё: после перезагрузки восстановленный пул будет испортирован корректно.

    ПРОБЛЕМА №3:
    Был момент, когда SATA кабель одного из "винтов" выскочил из материнки, а я не заметил. В итоге всё загрузилось нормально и работало (два диска gpt/disk0 и gpt/disk1 в зеркале (домашний сервер), но при просмотре статуса zpool status заметил, что один "винт" не доступен.
    Вернув кабель назад в разъём после загрузки увидел, что ZFS зафиксировала несовпадение контрольных сумм:
    $ zpool status
    pool: systor
    state: ONLINE
    status: One or more devices has experienced an unrecoverable error. An
    attempt was made to correct the error. Applications are unaffected.
    action: Determine if the device needs to be replaced, and clear the errors
    using 'zpool clear' or replace the device with 'zpool replace'.
    see: http://www.sun.com/msg/ZFS-8000-9P
    scrub: none requested
    config:
    
            NAME           STATE     READ WRITE CKSUM
            systor         ONLINE       0     0     0
              mirror       ONLINE       0     0     0
                gpt/disk0  ONLINE       0     0     11
                gpt/disk1  ONLINE       0     0     0
    
    errors: No known data errors
    

    Для коррекции зафиксированных несовпадений контрольных сумм CKSUM сделал проверку (в нотации ZFS - очистку (scrubbing)) изменений:
    $ zpool scrub systor           # явная очистка данных ZFS в пуле systor
    $ zpool clear systor gpt/disk0 # очистка списка ошибок для диска gpt/disk0
    

    Если же возникла необходимость извлечь, например, сбойный диск, то в указанном варианте это можно было бы сделать так:
    $ zpool detach systor gpt/disk0
    

    Это можно делать как при работе системы (а после выключения удалить "винт" физически из системы), так и после физического отключения/удаления диска.

    Заключение

    Сервер установлен, можно продолжать настройку и установку ПО.
    Если у читателей есть предложения/вопросы/конструктивная_критика - прошу их высказать в комментариях. :)   В данной статье использованы ранее найденные по этой теме материалы, но постарался учесть изменения, присущие последним изменениям в системе.
    P.S. Уже после установки нашёл ссылку, где предложен скрипт для установки и настройки ZFS.
    P.P.S. Ещё прислали ссылку на переработанный специально дистрибутив, "заточенный" для установки системы: mfsBSD. Туда интегрирован патч для ZFS v.15 (был и с интегрированным v.28, но по какой-то причине его убрали).

    Спасибы

    Огромное спасибо Andrey V.Elsukov aka bu7cher за терпеливые ответы на множество вопросов. :)
    А так же участникам freebsd@conference.jabber.ru.

    Дополнительная информация

    1. Руководство FreeBSD. Глава 19. Поддержка файловых систем;
    2. Использование gpart;
    3. Изучаем ZFS;
    4. ZFS — новый взгляд на файловые системы;
    5. ZFS-Only FreeBSD;
    6. ZFS и FreeBSD: советы и подсказки;
    7. Тестируем ZFS, моделируем отказы дисков;
    8. Увеличичения размера ZFS пула;
    9. Тестирование поведения RAID-Z массива во FreeBSD при полном отказе одного из дисков;
    10. Руководство по администрированию файловых систем ZFS Solaris (PDF, рус);
    11. Solaris ZFS Administration Guide (PDF, eng);
    12. Архитектура ZFS (PDF);
    13. "Дневник" Jeff Bonwick - одного из разработчиков ZFS;
    14. Шпаргалка по ZFS.
    Примечание: [11] новее, чем [10], но на английском.



    размещено: 2010-12-05,
    последнее обновление: 2016-12-03,
    автор: Fomalhaut


    gonzo111, 2010-12-05 в 1:11:41

    вроде неплохое хауту :)
    1 ссылку на форум сделай для обсуждения
    в "разделе про сайт"
    2 не понял зачем это
     Укажем алгоритм подсчёта контрольных сумм
    # zfs set checksum=fletcher4 systor ?????

    gonzo111, 2010-12-05 в 1:21:28

    3) я вот читаю статьи и везде все одно и тоже делают -ставят сжатие на ports,у меня это вызывает улыбку - нахрена сжимать несчастные 300мб какой профит??? да еще и получить лишние тормоза при установке из портов...:)

    Fomalhaut, 2010-12-05 в 13:28:42

    gonzo111: Ссылку на форум добавил. Там же и ответ на остальное. :)

    gx, 2010-12-05 в 17:44:47

    Нужно добавить линк на оф. вики - это я так понял первоисточник.

    Так посмотриш на это, аж страшно станет - столько команд...
    Есть ради чего мучаться?

    Fomalhaut, 2010-12-05 в 18:16:30

    gx: Нет, первоисточником была статья всё того же bu7cher на opennet-ом ВиКи, с чьего разрешения я и использовал её для написания своего обновлённого варианта. Конечно, читалось много другим материалов, в том числе и с официальных ВиКи. Перечислять всё - много, да и всего прочитанного не вспомню, хотя в черновиках собирал ссылки: с десятка два набралось. :)
    А "мучаться" есть ради чего (по крайней мере для меня): разобраться в GPT и gpart, деталях создания и обслуживания ZFS и пр. Т.к. в будущем хочу домашнюю систему целиком перевести на FreeBSD, а домашний архив - на ZFS и GLI (такая вот паранойя :D ).

    Ludenus, 2010-12-07 в 22:00:46

    Большое спасибо.

    Сделано полное исследование: постановка задачи, даны ссылки и успешно установленная система. Важно, что задача заключаласть не просто в написании непроходимого скрипта, но в полном "разборе полетов" и обобщении существующих рекомендаций.

    Я бы эту работу отнес не к HOWTO, а к рекомендациям best practice.

    Fomalhaut, 2010-12-08 в 9:52:20

    Ludenus: Спасибо. Но всё равно уже немного подправил от первоначального варианта: были исправления/уточнения/дополнения. :)

    Nirnroot, 2010-12-21 в 12:03:32

    Лучше подождать девятки. По моим тестам, там повысилась скорость и вдвое упало потребление памяти. А 8ку нужно обновить, чтобы приплыл патч на металинк - ускорит систему, особенно загруженную.

    Fomalhaut, 2010-12-22 в 3:13:30

    Nirnroot: Лучше, наверное, будет обновиться с 8.2 до 9.0 по выходу последней. :)
    Систему я уже обновил до 8.2-PRERELEASE, а вод до 9.0-CURRENT - не охота: CURRENT он и есть CURRENT - для разработчиков, а не для активного использования.

    i, 2010-12-28 в 8:47:37

    >установлено 2 SCSI жёстких диска по 72Гб, объединённых в \"зеркало\" на RAID-контроллере

    а зачем, если через zfs собирать зеркало правильнее?

    >zpool create systor mirror ipsd0p3 ipds1p3

    хотя эта строка намекает, что таки нет железного зеркала и оно делается ZFS-ом.
    Не понятно как у тебя на самом деле сделно...

    Fomalhaut, 2010-12-28 в 10:32:48

    i: Ну можно почитать внимательней: по поводу этой строки написано буквально следующее: "...Если понадобится создавать пул на "зеркале", то это можно сделать...". Ключевое слово: ""если": кому-то понадобится сделать именно такой вариант.
    По поводу аппаратного RAID-а уже обмусоливалось на форуме, где эта статья обсуждалась: вот ссылка.

    i, 2010-12-28 в 15:24:19

    читать до просветления:
    http://blogs.sun.com/bonwick/ru/

    Fomalhaut, 2010-12-29 в 11:07:24

    i: Давайте обсуждение данного вопроса перенесём всё таки на форум.

    Серёжа, 2011-02-07 в 17:53:16

    http://mfsbsd.vx.sk/

    Fomalhaut, 2011-02-07 в 19:48:53

    Серёжа:
    Я знаю про эту сборку: ссылка есть в статье.

    ttys, 2011-02-22 в 11:59:57

    10. Руководство по администрированиюфайловых систем ZFS Solaris (PDF);
    сцылка битая

    Fomalhaut, 2011-02-22 в 14:17:51

    ttys: Ораклясты (эти... нехорошие люди) закрывают доступ то к одному, то к другому. :(
    Все ссылки на момент написания/редактирования статьи были рабочими.
    P.S. Надо будет выложить этот документ куда-нибудь.

    ttys, 2011-02-22 в 14:20:28

    ложи в ftp://ftp.lissyara.su/
    =)

    reva, 2011-03-06 в 11:53:38

    Добрый день, хочу обратить на возможные проблемы с которыми столкнулся при реализации выше описанного:

    1. Описанная выше схема не работает для FreeBSD 8.2 p0 - перепробовал все варианты установки из раздела http://wiki.freebsd.org/ZFS но загрузить систему не получается.
    2. FreeBSD 8.1 работает великолепно, однако есть проблема с zfs mirror boot (Если физически отключить первый диск из mirror пула zfs, то со второго нельзя загрузиться). Описание проблемы и решения можно найти тут http://forums.freebsd.org/showthread.php?t=16535

    Fomalhaut, 2011-03-06 в 19:19:31

    reva: Очень странно: я ставил с 8.2-RC3 - проблем не видел. Причём ставил на zfs mirror: на этой системе сейчас и работаю.
    Дёргал (случайно) винт, о чём написал в "ПРОБЛЕМА №3". Причём отключался именно первый (у меня disk0), но заметил это не сразу: система загрузилась и работала.
    Но сигнал принял: проверю после праздников на работе: мне как раз надо в виртуалке поставить систему. Зеркало там не надо, но для эксперимента сделать не мешает. :)

    Boba, 2011-03-10 в 18:35:22

    В пункте 3.1 наверно все таки не ad0, а для рассматриваемого примера ipsd0?

    Fomalhaut, 2011-03-17 в 8:28:53

    Boba: Исправил - спасибо за сообщение. :)

    5chme1, 2011-11-05 в 17:21:46

    Сейчас можно с диска PC-BSD поставить FreeBSD, в том числе и с ZFS

    link, 2012-05-05 в 9:31:43

    _http://blogs.sun.com/bonwick/ru/
    переехал на
    https://blogs.oracle.com/bonwick/ru/

    ttys, 2012-05-05 в 13:35:32

    404 Not Found!

    Sorry, that page does not exist. Please try another location or you can search...

    linx, 2013-04-29 в 13:06:03

    Root On ZFS @ FreeBSD 9

    LOLO, 2013-10-03 в 23:44:10

    АФТАР ЕБЛАН

    salimk, 2013-10-23 в 15:43:23

    Здравствуйте товарищщи!
    Для Sun Fire (sparc64):

    1. Разметка диска
    sunlabel -B da0
    gpart destroy -F da0
    gpart create -s vtoc8 da0
    gpart add -s 512M -t freebsd-ufs /dev/da0
    gpart add -s 4G -t freebsd-swap /dev/da0
    gpart add -t freebsd-zfs /dev/da0

    ##2.2
    zpool create -f -m /mnt zroot /dev/da0d
    Далее делаем все также



    3. Установка системы
    пункт 3.1 не делаем

    mkdir /mnt/bootdir
    newfs -m 0 /dev/da0a
    mount /dev/da0a /mnt/bootdir

    далее делаем все также


    ##3.5
    echo 'zfs_enable="YES"' > /etc/rc.conf

    echo 'zfs_load="YES"' > /boot/loader.conf
    echo 'vfs.root.mountfrom="zfs:zroot"' >> /boot/loader.conf
    echo 'vfs.zfs.prefetch_disable="1"' >> /boot/loader.conf
    echo 'console="ofw"' >> /boot/loader.conf

    mv boot bootdir/
    ln -s bootdir/boot /boot
    chflags -h sunlink /boot

    работает 100%
    gpart show da0
    =>       0  71087625  da0  VTOC8  (33G)
            0   1044225    1  freebsd-ufs  (509M)
      1044225   4192965    2  freebsd-swap  (2G)
      5237190  65850435    4  freebsd-zfs  (31G)

    ttys, 2016-01-08 в 16:43:00

    Всё: после перезагрузки восстановленный пул будет испортирован корректно.



  •  

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.1979 секунд
    Из них PHP: 59%; SQL: 41%; Число SQL-запросов: 77 шт.
    Исходный размер: 106380; Сжатая: 22701