Да, да да! Это снова очередная статья о личном опыте использования ОС FreeBSD на основе файловой системы ZFS. Но лучше много информации чем ее отсутствие :)
Лирическое...
Если вы периодически просматривали этот блог по диагонали, то очевидно заметили что FreeBSD в нем периодически мелькала (то как прокси для деления инета с другом, то сваливалась в десктоп ОС) и вот теперь я решил создать NAS на ее основе. Вы скажите ведь есть FreeNAS, зачем нам заморачиваться с FreeBSD? В ответ возражу что я просто люблю эту ОС, поэтому и обожаю копаться в ней. Вот и все. :)
Техническое...
О прекрасной файловой системе (не лишенной конечно недостатков как и все в нашем мире) ZFS вы и без меня в wikipedia прочитаете. Перебрав множество руководств в сети я остановился на официальном по адресу: wiki.freebsd.org/RootOnZFS/GPTZFSBoot/Mirror. В данном случае я ставил в конфигурации зеркала из 2 дисков по 640Гб.
Итак первым делом нам понадобиться DVD-диск с FreeBSD. У меня был диск 8.1-REALESE. Далее после автозапуска исталятора и выбора страны и языка выбираем Fixit. После чего запуститься sh.
1. Создаем GPT-схему (в терминологии windows это ближе к понятию том) разбивки жестких дисков.
1. Создаем GPT-схему (в терминологии windows это ближе к понятию том) разбивки жестких дисков.
Fixit# gpart create -s gpt ad4
Fixit# gpart create -s gpt ad6ad4 и ad6 это имена моих дисков. Посмотреть ваши вы можете выполнив:
Fixit# dmesg| grep SATA
Fixit# dmesg| grep IDE
2. Создаем партиции (что-то вроде разделов) на них. Мы как и в рекомендации создадим 3 партиции:
- загрузочную в 64кб,
- подкачки на 4Гб,
- корень системы все оставшееся место (в данном случае 590Гб).
Своп партицию создали отдельно, т.к. в случае аварии на ZFS свопе краш-дамп не создаться.
- загрузочную в 64кб,
- подкачки на 4Гб,
- корень системы все оставшееся место (в данном случае 590Гб).
Своп партицию создали отдельно, т.к. в случае аварии на ZFS свопе краш-дамп не создаться.
Fixit# gpart add -b 34 -s 128 -t freebsd-boot ad4
Fixit# gpart add -b 162 -s 8388608 -t freebsd-swap -l swap0 ad4
Fixit# gpart add -b 8388770 -s 590G -t freebsd-zfs -l disk0 ad4
Fixit# gpart add -b 34 -s 128 -t freebsd-boot ad6
Fixit# gpart add -b 162 -s 8388608 -t freebsd-swap -l swap1 ad6
Fixit# gpart add -b 8388770 -s 590G -t freebsd-zfs -l disk1 ad6
Вот тут первая засада! Если не указывать параметр "-s" при создании последних партиций, то будет использовано все доступное место. Чего ж тут плохого спросите вы. А то что в зеркале 2 и более винчестера и реальные емкости у них тоже разные. На моих винчестерах WD серии Green на 640Гб "маркетинговой емкости" доступно реально 596Гб. А расхождение между винчестерами составило 528,25Мб! А это означает что если "упадет" больший диск, то зеркало не восстановиться.
Именно поэтому размер последней партиции = общая реальная емкость - 2 * расхождение в размере - своп - загрузочная - 2*17кб(GPT-таблица)
Расхождение в размере берем удвоенное, т.к. страхуемся вдруг третий винчестер, который когда нибудь придет на замену, будет содержать большее расхождение в емкости. Двойной размер GPT-таблиц обеспечен их двойным хранением в начале и конце диска. Я не стал заморачиваться и заложил на эти расходы 2.2Гб (да, наверно больше чем нужно, но я собираю NAS и данные на нем мои проекты мне чрезвычайно важны).
Реальный размер диска легко узнать выполнив:
Именно поэтому размер последней партиции = общая реальная емкость - 2 * расхождение в размере - своп - загрузочная - 2*17кб(GPT-таблица)
Расхождение в размере берем удвоенное, т.к. страхуемся вдруг третий винчестер, который когда нибудь придет на замену, будет содержать большее расхождение в емкости. Двойной размер GPT-таблиц обеспечен их двойным хранением в начале и конце диска. Я не стал заморачиваться и заложил на эти расходы 2.2Гб (да, наверно больше чем нужно, но я собираю NAS и данные на нем мои проекты мне чрезвычайно важны).
Реальный размер диска легко узнать выполнив:
Fixit# gpart list имя_диска
В разделе Consumer параметр Mediasize.
Кстати в параметрах -b (смещение) и -s (длинна) применяется следующий вид аргументов:
- 0-9 = LBA-блоки (1 блок 512Б)
- 0-9k = размер в килобайтах
- 0-9M = размер в мегабайтах
- 0-9G = размер в гигабайтах
Проверить корректность "разбивки диска" можно выполнив:
Кстати в параметрах -b (смещение) и -s (длинна) применяется следующий вид аргументов:
- 0-9 = LBA-блоки (1 блок 512Б)
- 0-9k = размер в килобайтах
- 0-9M = размер в мегабайтах
- 0-9G = размер в гигабайтах
Проверить корректность "разбивки диска" можно выполнив:
Fixit# gpart show имя_дискаЕсли вы ошиблись при разметке, то вам помогут следующие команды:
- удаление партиции
Fixit# gpart delete -i номер_партиции имя_диска-удаление схемы (предварительно удалив все партиции)
Fixit# gpart destroy имя_диска
Номер партиции можно увидеть либо через команду gpart list (параметр index), либо gpart show (3-й столбик). Ну чтоже пойдем далее.
3. Установим защитный MBR-сектор и gptzfs-загрузчик:
3. Установим защитный MBR-сектор и gptzfs-загрузчик:
Fixit# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad4
Fixit# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad6
В случае ошибки "operation not permitted" выполните:
Fixit# sysctl kern.geom.debugflags=0x10
4. Загрузим модули поддержки ZFS:
Fixit# kldload /mnt2/boot/kernel/opensolaris.ko
Fixit# kldload /mnt2/boot/kernel/zfs.ko
5. Создадим ZFS-пул под названием zroot (название может быть любым):
Fixit# mkdir /boot/zfs
Fixit# zpool create zroot mirror /dev/gpt/disk0 /dev/gpt/disk1
Fixit# zpool set bootfs=zroot zroot
6. Создадим файловые системы в ZFS-пуле:
Сначала установим нужный нам механизм расчета контрольных сумм. В мануале рекомендован fletcher4. Я же установил sha256, т.к. он более устойчив, но и более "тяжелый" для процессора.
Сначала установим нужный нам механизм расчета контрольных сумм. В мануале рекомендован fletcher4. Я же установил sha256, т.к. он более устойчив, но и более "тяжелый" для процессора.
Fixit# zfs set checksum=fletcher4 zroot
Файловые системы оставим пока по умолчанию, ZFS тем и славиться что можно в любой момент что-то добавить не останавливая компьютер.
Fixit# zfs create -o compression=on -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 ; ln -s /usr/home home
Fixit# zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
Fixit# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
Fixit# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
Fixit# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
Fixit# zfs create zroot/var
Fixit# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
Fixit# zfs create -o exec=off -o setuid=off zroot/var/db
Fixit# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
Fixit# zfs create -o exec=off -o setuid=off zroot/var/empty
Fixit# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
Fixit# zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
Fixit# zfs create -o exec=off -o setuid=off zroot/var/run
Fixit# zfs create -o compression=lzjb -o exec=on -o setuid=off
Fixit# chmod 1777 /zroot/var/tmp
7. Установим систему FreeBSD на диск:
Fixit# cd /dist/8.0-*
Fixit# export DESTDIR=/zroot
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 /zroot/boot ; cp -Rlp GENERIC/* /zroot/boot/kernel/
8. Переключаем партицию /var/empty в readonly:
Fixit# zfs set readonly=on zroot/var/empty
9. Перемонтируем корень системы:
Fixit# chroot /zroot
10. Создадим основной конфигурационный файл /etc/rc.conf.
Сначала скажем что наши тома используют ZFS:
Сначала скажем что наши тома используют ZFS:
Fixit# echo 'zfs_enable="YES"' > /etc/rc.conf
Потом сообщим система ее имя:
Fixit# echo 'hostname="nas.mydomain.local"' >> /etc/rc.conf
А за одно пропишем это в файл hosts (особенно если ваш домен, как например .local не может быть разрешен доступными DNS-серверами):
Fixit# echo '127.0.0.1 nas.mydomain.local' >> /etc/hosts
Именно с отсутствием этой записи (а вернее с невозможностью разрезолвить свое DNS-имя) были связаны и долгая загрузка самой системы на строке "configuring syscons: blanktime" и долгий старт mc.
Далее установим конфигурацию сетевой карты:
Далее установим конфигурацию сетевой карты:
Fixit# echo 'ifconfig_nfe0="DHCP"' >> /etc/rc.conf
Можно и по другому (статический адрес):
Fixit# echo 'ifconfig_nfe0="inet 192.168.0.3 netmask 255.255.255.0"' >> /etc/rc.conf
Fixit# echo 'defaultrouter="192.168.0.1"' >> /etc/rc.conf
во всех командах nfe0 - имя моей карты, узнать вашу вы можете так:
Fixit# dmesg | grep Network
или так
Fixit# ifconfig
При этом последняя команда покажет и псевдо-устройство lo0 (интерфейс локальной петли)
11. Создадим конфигурационный файл загрузчика:
11. Создадим конфигурационный файл загрузчика:
Fixit# echo 'zfs_load="YES"' > /boot/loader.conf
Fixit# echo 'vfs.root.mountfrom="zfs:zroot"' >> /boot/loader.conf
12. Установим загрузчик 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
13. Ставим пароль на root'a:
Fixit# passwd
14. Выбираем часовой пояс:
Fixit# tzsetup
15. Создаем базу alias'ов /etc/mail/aliases.db:
Fixit# cd /etc/mail
Fixit# make aliases
16. Отключаем текущий корень системы:
Fixit# umount /dev
Fixit# exit
17. Сохраняем файл конфигурации ZFS в каталоге корневой установленной системы (это один из важных файлов ZFS сохраните его потом в надежном месте):
Fixit# cp /boot/zfs/zpool.cache /zroot/boot/zfs/zpool.cache
18. Подключаем своп:
18.1 Вариант 1 - это использование всех партиций свопа как независимых. Для этого создаем файл fstab, описывающий конфигурацию файловых систем:
18.1 Вариант 1 - это использование всех партиций свопа как независимых. Для этого создаем файл fstab, описывающий конфигурацию файловых систем:
Fixit# cat << EOF > /zroot/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/gpt/swap0 none swap sw 0 0
/dev/gpt/swap1 none swap sw 0 0
EOF
18.2 Вариант 2 - использование зеркалированного свопа (RAID-1)
18.2.1 Для второго варианта (а я использую его как самый устойчивый и просто интересный) нужно подгрузить модуль поддержки зеркала:
18.2.1 Для второго варианта (а я использую его как самый устойчивый и просто интересный) нужно подгрузить модуль поддержки зеркала:
Fixit# kldload /mnt2/boot/kernel/geom_mirror.ko
18.2.2 Собрать зеркало:
Fixit# gmirror label -b prefer swap gpt/swap0 gpt/swap1
Вот тут тоже иногда ошибка скачет. Бывает пишет что не видит swap0 и в каталоге /dev/gpt/ файлы устройств swap0 и swap1 пропадают, то смотрим собралось ли зеркало:
Fixit# gmirror status
В случае успеха переходим далее.
18.2.3 Создаем файл fstab, описывающий конфигурацию файловых систем:
18.2.3 Создаем файл fstab, описывающий конфигурацию файловых систем:
Fixit# cat << EOF > /zroot/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/swap none swap sw 0 0
EOF
18.2.4 Добавляем в загрузчик модуль поддержки зеркала:
Fixit# echo 'geom_mirror_load="YES"' >> /zroot/boot/loader.conf
19. Выставим корректный путь к библиотекам:
Fixit# export LD_LIBRARY_PATH=/mnt2/lib
20. Демонтируем все файловые системы ZFS:
Fixit# zfs unmount -a
Бывает и тут ошибка "device busy", тогда пишем:
Fixit# cd /
и повторяем предыдущую команду.
21. Установим точки загрузки для ZFS-пула:
21. Установим точки загрузки для ZFS-пула:
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
Все, готово! Выполняем exit и выходим из sysinstall с перезагрузкой.