Установка руками FreeBSD 8.x на раздел/зеркало с ZFS

Делаем всё при помощи Fixit (CD/DVD)


узнать о ZFS больше можно где-то тут http://ru.wikipedia.org/wiki/Zettabyte_File_System

Для сего деяния нам обязательно нужен или DVD с FreeBSD или диск только с LiveFS.
Особым извращенцам можно взять Frenzy, последний на данный момент 1.3.
Дело в том, что на всех этих дистрибутивах есть живая система, в среде которой, есть возможность подготовить хранилища на ZFS, руками установить систему и отконфигурить ее.
С обычного диска-инсталятора, увы установка на ZFS не поддерживается.

Так как ZFS все чудеса вытворяет программно, нет необходимости в аппаратных RAID контроллерах, что в свою очередь может сыграть определенную роль при выборе железа и сильно удешевляет реализацию..
Итак загружаемся с диска, выбираем (182 Russian Federation), затем кодировку KOI-8R, и оказываемся в главном меню текстового инсталятора.
Здесь выбираем:
Fixit Repair mode with CDROM/DVD/floppy or start shell
2 CDROM/DVD Use the live filesystem CDROM/DVD
Прогружается отвлеченная система, с корнем примонтирования в /mnt2.

Сначала разберемся с накопителями, которые нашлись в системе.

Fixit# atacontrol list
ATA channel 0:
Master: acd0 <Optiarc DVD RW AD-5200A/1.05> ATA/ATAPI revision 0
Slave:       no device present
ATA channel 1:
Master:      no device present
Slave:       no device present
ATA channel 2:
Master:  ad4 <WDC WD5000AAKS-00V1A0/05.01D05> SATA revision 2.x
Slave:       no device present
ATA channel 3:
Master:  ad6 <WDC WD5000AAKS-00V1A0/05.01D05> SATA revision 2.x
Slave:       no device present
ATA channel 4:
Master:      no device present
Slave:       no device present
ATA channel 5:
Master:      no device present
Slave:       no device present

Следует указать, что таким способом можно определить только IDE и SATA диски — (например ad4). Диски размещенные на SCSI/SAS контроллерах (например da0) лучше просматривать при помощи родного драйвера (например mpt или ciss), но не все драйвера это поддерживают. Посмотреть как вообще определились все устройства в системе можно нажав клавишу Scroll Lock и переместиться стрелками до верху, просмотреть вывод ядра. Еще проще набрать команду dmesg | more.

В моем случае, накопители определились как ad4 и ad6.
ZFS абсолютно без разницы, на каких физических носителях будут располагаться разделы. Главное чтоб разделы имели одинаковый размер и остальные характеристики. Но все равно настоятельно рекомендую применять абсолютно одинаковые диски, вплоть до партии и прошивки, чтобы не создавать перекоса в производительности оных..
На сегодня самым распространенным типом раздела является MBR (Master Boot Record), но тут есть маленькое «но». Такого типа разделы поддерживают размер до 2-ух ТерраБайт максимум и не более 4-ёх на одном физическом диске, а все раширенные и логические разделы — это уже извращение, для увеличения их количества.
В свете настоящего времени и достижения накопителями порога в 3ТБ, тема таких ограничений особенно актуальна.
Более продвинутая схема разбивки диска — это GPT (GUID Partition Table). Позволяет 128 основных разделов на одном физическом диске и вплоть до 18000 ТБ на раздел.
Чтобы загружать ОС с GPT разделов, на железе подразумевается наличие EFI (Extensible Firmware Interface) или UEFI (Universal…) вместо обычного BIOS и MBR.
На FreeBSD эта проблема решается крайне просто — BIOS здесь нужен лишь для того, чтобы передать управление системе, а дальше можно загружаться с чего угодно, главное чтобы это «что-угодно» было прикручено на этапе начальной загрузки к FreeBSD. В нашем случае это будет ZFS Loader.


Узнать больше о GPT

Ну что же, приступим.
Для разбивки жестких дисков, будем пользоваться true-инструментом gpart, все что нужно он умеет и очень прост в обращении.
Сначала убедимся что винты пустые

$ gpart show
=>       32  286677088  ad4  MBR  (137G)
32  286677088    1  freebsd  [active]  (137G)

=>        0  286677088  ad4s1  BSD  (137G)
0    1048576      1  freebsd-ufs  (512M)
1048576    8388608      2  freebsd-swap  (4.0G)
9437184   14624768      4  freebsd-ufs  (7.0G)
24061952    1048576      5  freebsd-ufs  (512M)
25110528  261566560      6  freebsd-ufs  (125G)

Как видим нет, необходимо сначала убить все разделы на всех дисках, которые будут оформляться под ZFS, ну или на ваше усмотрение.
Делается это просто: «-i» это номер раздела или индекс или label, который нужно убить и ad4 это устройство, на котором находится этот индекс.
например так:

#gpart delete -i 1 ad4

После проведения всех операций удаления лэйблов, можно вообще полностью вычистить диск/и:

#gpart destroy ad4

Теперь, когда жесткие чистые, создадим основные разделы:

# gpart create -s GPT ad4
ad4 created
# gpart create -s GPT ad6
ad6 created
# gpart show
=>       34  976773101  ad4  GPT  (466G)
=>       34  976773101  ad6  GPT  (466G)

Если собираем «зеракло» =) на ZFS, то обязательно делаем все одинаково для обоих жестких дисков!!.
Напиливаем разделы.
Загрузочный раздел, раздел подкачки, раздел данных:

# gpart add -s 128k -t freebsd-boot ad4
ad4p1 added
# gpart add -s 128k -t freebsd-boot ad6
ad6p1 added

Здесь, при создании раздела подкачки (SWAP) нужно дать Label «-l swap0» и «-l swap1». Делается это для отвязки от имени диска в системе и ориентирования на метки GPT. Поможет это в том случае, если жесткий диск будет переподключен в другой порт и определится по другому (ad5 вместо ad4 например), fstab править не придется. SWAP оформим зеркалом на gmirror. Оношения к ZFS данный раздел иметь не будет, так как им «рулит» другой модуль ядра — geom_mirror.ko. Не забудьте добавить его в /boot/loader.conf строчкой geom_mirror_load=»YES»
!!!!! Если есть желание замутить файл подкачки при помощи ZFS, то действия в этой секции пропускаем и чешем ниже !!!!!

# gpart add -s 3G -t freebsd-swap -l swap0 ad4
ad4p2 added
# gpart add -s 3G -t freebsd-swap -l swap1 ad6
ad6p2 added
# kldload /mnt2/boot/kernel/geom_mirror.ko
# gmirror label -b prefer swap gpt/swap0 gpt/swap1

Оставшееся место целиком отдадим под ZFS пул, здесь также следуем принципу ориентирования на метки GPT: «-l disс0».
Одно важное отличие для зеркала: на втором диске ad6 — ZFS пул оформляем как GPT: «-l disс1».

# gpart add -t freebsd-zfs -l disс0 ad4
ad4p3 added
# gpart add -t freebsd-zfs -l disс1 ad6
ad6p3 added

В итоге видим следующую картину:

# gpart show
=>       34  976773101  ad4  GPT  (466G)
34        256    1  freebsd-boot  (128K)
290    6291456    2  freebsd-swap  (3.0G)
6291746  970481389    3  freebsd-zfs  (463G)

=>       34  976773101  ad6  GPT  (466G)
34        256    1  freebsd-boot  (128K)
290    6291456    2  freebsd-swap  (3.0G)
6291746  970481389    3  freebsd-zfs  (463G)

Прописываем ZFS загрузчик. при создании зеркала, загрузчик нужно поставить на каждый диск обязательно. Взять его можно в корневом каталоге, в папке /boot/….
Так как все началось с FIXIT, то родной корневой каталог /mnt2

Fixit# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad4
bootcode written to ad4
Fixit# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad6
bootcode written to ad6

Может правда написать, что ad4 Has bootcode. Это значит, что загрузчик уже прописан. Но проверить все рано нужно, страшного ничего не будет =).
Начинаем работать с ZFS, для этого нужно в систему подгрузить модули ее:

Fixit# kldload /mnt2/boot/kernel/opensolaris.ko
Fixit# kldload /mnt2/boot/kernel/zfs.ko

Создадим пул ZFS. Здесь для зеркала будет отличие в создании. Имя пула — zroot, а может быть любым на ваше усмотрение.

Fixit# mkdir /boot/zfs
########!!!!!!!!########
Fixit# zpool create zroot /dev/gpt/disc0 # для одного диска "пулим" пространство диска disc0
########!!!!!!!!########
Fixit# zpool create zroot mirror /dev/gpt/disc0 /dev/gpt/disc1 # для "зеракла" "пулим" пространство двух дисков: disc0 и disc1
########!!!!!!!!########
Fixit# zpool set bootfs=zroot zroot

Прикрутим алгоритм проверки контрольных сумм fletcher4 на наш пул:

Fixit# zfs set checksum=fletcher4 zroot

Создадим в самой файловой системе ZFS обозначения для точек монтирования и разные опции для них:

Fixit# zfs create -o compression=gzip -o exec=on -o setuid=off zroot/tmp
Fixit# chmod 1777 /zroot/tmp
Fixit# zfs create zroot/usr
Fixit# zfs create zroot/usr/home
Fixit# cd /zroot
Fixit# ln -s /usr/home home
Fixit# zfs create zroot/var
# !!Файл подкачки, если решили садить его на ZFS, если нет ищите "как" выше!! #
Fixit# zfs create -V 4G zroot/swap
Fixit# zfs set org.freebsd:swap=on zroot/swap
Fixit# zfs set checksum=off zroot/swap

Если файл подкачки собирали при помощи gmirror, то сейчас нужно сделать следующее:

# папки придется создавать ручками, автоматом как-то не выходило:
# mkdir /zroot/etc
# ee /zroot/etc/fstab

# Device                       Mountpoint              FStype  Options         Dump    Pass#
/dev/mirror/swap               none                    swap    sw              0       0

# mkdir /zroot/boot
# echo 'geom_mirror_load="YES"' >> /zroot/boot/loader.conf

Ставим систему, «ставим» конечно громко сказано, но это и есть процесс установки, только руками =). По сути распаковываем фрю в соответствующие места.. Дистрибутив берите любой 8-ой ветки, с любого доступного места. Здесь 8.2-RC1 с сидюка.. У Вас может быть 8.2-RELEASE например. Папки src и ports пришлось создать ручками, сами почему-то не захотели.

Fixit# mkdir /zroot/usr/src
Fixit# mkdir /zroot/usr/ports
Fixit# cd /dist/8.2-RC1/
Fixit# export DESTDIR=/zroot
Fixit# cd base
Fixit# ./install.sh
Fixit# cd ../catpages
Fixit# ./install.sh
Fixit# cd ../dict
Fixit# ./install.sh
Fixit# cd ../doc
Fixit# ./install.sh
Fixit# cd ../info
Fixit# ./install.sh
Fixit# cd ../kernels
Fixit# ./install.sh generic
Fixit# cd ../manpages
Fixit# ./install.sh
Fixit# cd ../src
Fixit# ./install.sh all
Fixit# cd ../ports
Fixit# ./install.sh

#### для amd64#####
Fixit# cd ../lib32
Fixit# ./install.sh
#################
Fixit# cd /zroot/boot
Fixit# cp -Rlp GENERIC/* /zroot/boot/kernel/

Делаем chroot в систему и правим конфиги:

Fixit# chroot /zroot
Fixit# echo 'zfs_enable="YES"' > /etc/rc.conf
Fixit# echo 'hostname="test.mydomain.local"' >> /etc/rc.conf

При небольшом количестве «рамы» (< 512MB~4GB) система валится в панику, дабы избежать такого козлячего поведения, которое многих бесит и заставляет бросать начатое, нужно слегка отТюнить это дело.. добавить опции vm.kmem.. Если оперативной памяти нууу очень много (>4GB) и архитектура amd64, можно наверное как-бэ и забить (занавесить).

Fixit# echo 'zfs_load="YES"' > /boot/loader.conf
Fixit# echo 'vfs.root.mountfrom="zfs:zroot"' >> /boot/loader.conf
Fixit# echo 'vfs.zfs.prefetch_disable=1' >> /boot/loader.conf
Fixit# echo 'vm.kmem_size="330M"' >> /boot/loader.conf
Fixit# echo 'vm.kmem_size_max="330M"' >> /boot/loader.conf
Fixit# echo 'vfs.zfs.arc_max="40M"' >> /boot/loader.conf
Fixit# echo 'vfs.zfs.vdev.cache.size="5M"' >> /boot/loader.conf
Fixit# echo 'loader_logo="beastie"' >> /boot/loader.conf

Устанавливаем пароль суперпользователя, временную зону и выходим из чрута:

Fixit# passwd
Fixit# tzsetup
Fixit# cd /etc/mail
Fixit# make aliases
Fixit# exit
Fixit# mkdir /boot/zfs
Fixit# zpool export zroot
Fixit# zpool import zroot
Fixit# cp /boot/zfs/zpool.cache /zroot/boot/zfs/zpool.cache

Экспортируем LD_LIBRARY_PATH:

Fixit# export LD_LIBRARY_PATH=/mnt2/lib

Размонтируем все разделы zfs и изменим их точки монтирования:

Fixit# zfs umount -a
Fixit# zfs set mountpoint=legacy zroot
Fixit# zfs set mountpoint=/tmp zroot/tmp
Fixit# zfs set mountpoint=/usr zroot/usr
Fixit# zfs set mountpoint=/var zroot/var

Теперь выходим из Fixit и sysinstall.
Если все хорошо, можно перегрузиться..
Внимательно смотрим на загрузку системы, замечаем немного медленную отработку загрузчика и нормальную загрузку дальше..
После загрузки проверяем, что натворили:

# mount
zroot on / (zfs, local)
devfs on /dev (devfs, local, multilabel)
zroot/tmp on /tmp (zfs, local, nosuid)
zroot/usr on /usr (zfs, local)
zroot/usr/home on /usr/home (zfs, local)
zroot/var on /var (zfs, local)

# zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
zroot           3,31G   450G   522M  legacy
zroot/tmp         40K   450G    40K  /tmp
zroot/usr       2,71G   450G  2,71G  /usr
zroot/usr/home  1021K   450G  1021K  /usr/home
zroot/var       87,5M   450G  87,5M  /var

# zpool status
pool: zroot
state: ONLINE
scrub: none requested
config:

NAME           STATE     READ WRITE CKSUM
zroot          ONLINE       0     0     0
mirror       ONLINE       0     0     0
gpt/disc0  ONLINE       0     0     0
gpt/disc1  ONLINE       0     0     0

errors: No known data errors

Ну что же, вроде бы получилось. Если нет, не хлюздим, ищем ошибки и их устраняем. По другому специалистом не станешь.

Единственный минус заключается в том, что если умрет один диск, загрузка станет невозможной, Загрузчик ZFS ругается на отсутствие винта. Говорят, лечится переходом на более новую версию zpool выше 14. Если машину не перегружать с заранее зная о мертвом винте, и заменить его на горячую (это можно легко сделать на AHCI), то все не так плохо.
На данный момент ситуация выглядит так:

gate# zpool upgrade
This system is currently running ZFS pool version 14.

All pools are formatted using this version.

Все дальнейшие извращения, во избежание получения геммороя на боевом сервере, производились по такой же схеме на виртуальной мафынке VMware.
Итак продолжим:
На 15 версии пула таких проблем не замечено, даже при загрузке с одним винтом проблем нет, все прекрррасно грузится.

ZFS filesystem version 4
ZFS storage pool version 15
Timecounters tick every 10.000 msec
usbus0: 12Mbps Full Speed USB v1.0
usbus1: 480Mbps High Speed USB v2.0
ad0: 15360MB <VMware Virtual IDE Hard Drive 00000001> at ata0-master UDMA33
ugen0.1: <Intel> at usbus0
uhub0: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
ugen1.1: <(0x15ad)> at usbus1
uhub1: <(0x15ad) EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus1
acd0: CDROM <VMware Virtual IDE CDROM Drive/00000001> at ata1-master UDMA33
uhub0: 2 ports with 2 removable, self powered
uhub1: 6 ports with 6 removable, self powered
SMP: AP CPU #1 Launched!
SMP: AP CPU #3 Launched!
SMP: AP CPU #2 Launched!
Root mount waiting for: GMIRROR
Root mount waiting for: GMIRROR
GEOM_MIRROR: Force device swap start due to timeout.
GEOM_MIRROR: Device mirror/swap launched (1/2).
Trying to mount root from zfs:zroot
BSD# gmirror status
Name    Status  Components
mirror/swap  DEGRADED  ad0p2
BSD# zpool status -v
pool: zroot
state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
see: http://www.sun.com/msg/ZFS-8000-2Q
scrub: none requested
config:

NAME           STATE     READ WRITE CKSUM
zroot          DEGRADED     0     0     0
mirror       DEGRADED     0     0     0
gpt/disc0  ONLINE       0     0     0
gpt/disc1  UNAVAIL      0     0     0  cannot open

errors: No known data errors

При возникновении такой ситуации, убираете второй мертвый винт, ставите такой же по размеру LBA, создаете при помощи gpart такую же разметку как было.
Теперь нужно разобраться с двумя зеркалами: одно у нас на gmirror поднято, второе на ZFS. В мануале «man gmirror», как написано, так и сделаем:

One disk failed.  Replace it with a brand new one:

gmirror forget data
gmirror insert data da1

forget      Forget about components which are not connected.  This com-
mand is useful when a disk has failed and cannot be recon-
nected, preventing the remove command from being used to
remove it.
insert      Add the given component(s) to the existing mirror.

Additional options include:

-h           Hardcode providers' names in metadata.

-i           Mark component(s) as inactive immediately after
insertion.

-p priority  Specifies priority of the given component(s).
BSD# gmirror status
Name    Status  Components
mirror/swap  DEGRADED  ad0p2
BSD# gmirror forget swap
BSD# gmirror status
Name    Status  Components
mirror/swap  COMPLETE  ad0p2
BSD# gmirror insert swap gpt/swap1
GEOM_MIRROR: Device swap: rebuilding provider ad1p2.
GEOM_MIRROR: Device swap: rebuilding provider ad1p2 finished.
BSD# gmirror status
Name    Status  Components
mirror/swap  COMPLETE  ad0p2
ad1p2

Далее цепляем, в качестве замены, новый чистый раздел командой zpool replace примерно так:

BSD# zpool replace
missing pool name argument
usage:
replace [-f] <pool> <device> [new-device]

BSD# zpool replace zroot gpt/disc1 gpt/disc1
If you boot from pool 'zroot', you may need to update
boot code on newly attached disk 'gpt/disc1'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

BSD# zpool status
pool: zroot
state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h2m, 78.64% done, 0h0m to go
config:

NAME                 STATE     READ WRITE CKSUM
zroot                DEGRADED     0     0     0
mirror             DEGRADED     0     0     0
gpt/disc0        ONLINE       0     0     0
replacing        DEGRADED     0     0     0
gpt/disc1/old  UNAVAIL      0     0     0  cannot open
gpt/disc1      ONLINE       0     0     0  1.10G resilvered

errors: No known data errors

Ну что же, ZFS пошуршит жесткими дисками и покажет такую картинку

BSD# zpool status
pool: zroot
state: ONLINE
scrub: resilver completed after 0h3m with 0 errors on Wed Nov 23 00:13:22 2011
config:

NAME           STATE     READ WRITE CKSUM
zroot          ONLINE       0     0     0
mirror       ONLINE       0     0     0
gpt/disc0  ONLINE       0     0     0
gpt/disc1  ONLINE       0     0     0  1.40G resilvered

errors: No known data errors

На этом, думаю тему можно считать полностью раскрытой и собственно закрытой.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

CAPTCHA изображение

*