RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
После ряда успешных экспериментов по использованию ZFS во FreeBSD я
решил создать эту страничку. Думаю, найдутся те, кому покажется это
интересным.
Опишу процесс установки, которым я уже неоднократно пользовался
для установки FreeBSD 8.0-CURRENT, используя в качестве корневой
файловой системы (да и вообще, всех файловых систем) ZFS.
Установочный Flash диск
Первой системой, куда я устанавливал FreeBSD подобным образом был
мой EeePC. И установка происходила с USB Flash, так как USB CD у меня
нет... Процесс подготовки флэшки имеет некоторые особенности, возможно
я опишу их позже. Пока только замечу, что она представляет собой
установленную систему в корень которой скопирован каталог с
дистрибутивом из установочного ISO образа FreeBSD.
Если взглянуть на содержимое корневой файловой системы этой флэшки, то
можно увидеть вот что:
И так. Устанавливаю я на обычный офисный компьютер, до этого на нём был FreeDOS.
В качестве таблицы разделов я буду использовать GPT, поэтому предварительно нужно удалить текущую таблицу разделов.
Удаляю все (в данном случае единственный) разделы:
# gpart delete -i 1 ad4 ad4s1 deleted
Уничтожаю таблицу разделов:
# gpart destroy ad4 ad4 destroyed
Теперь создаю таблицу GPT и 3 раздела - 1-ый для установки на него
загрузчика, 2-ой для раздела подкачки (swap), 3-ий для ZFS пула, куда
будет устанавливаться система.
Создаваемый раздел характеризуется тремя параметрами: смещение
начального блока LBA, размер и тип. Доступный для использования блок
LBA можно определить по выводу команды gpart show ad4. В первом столбце строки с записью "- free -" выводится номер блока, с которого начинается неиспользуемое пространство.
Загрузочный раздел начинается по смещению 34 блока от начала
диска - сразу после таблицы GPT. Его размер я задаю в 256 блоков, это
составляет 128кБайт. В принципе для моих целей достаточно и 32кБайт, но
я сделал с запасом. Тип раздела "freebsd-boot" означает, что этот
раздел выделен специально под загрузчик FreeBSD:
Параметр -b указывает смещение начального блока создаваемого
раздела, а -s - его размер. Уже начиная с версии 8.0-BETA1 в параметрах
утилиты gpart можно опускать эти параметры, а так же использовать
суффиксы для указания размера создаваемого раздела. По-умолчанию,
смещение начального блока берётся минимальным возможным. А размер, если
не указан - всё оставшееся свободное пространство. Например, та же
команда для создания загрузочного раздела выглядела бы вот так:
# gpart add -s 128k -t freebsd-boot ad4
Теперь создаю раздел для свопа. Цель создания отдельного раздела для
свопа в том, чтобы была возможность записи в него дампа ядра при
паниках. А подобная возможность для свопа, который находится на ZFS,
вроде бы, ещё не реализована. Размер раздела будет 2ГБайта, в блоках
это = 1024*1024*2*2 (в 1кБайте два блока). Тип раздела "freebsd-swap":
После создания пула его корень будет смонтирован в /mnt и определён как загрузочный раздел (через свойство bootfs).
Теперь можно создать дополнительные разделы. Предварительно я устанавливаю свойство atime=off для корневой системы, чтобы оно унаследовалось всеми вновь создаваемыми файловыми системами:
Поясню для чего создавать столько отдельных файловых систем:
различные свойства для файловых систем, например, компрессия
для /usr/src, /usr/ports и /var/crash, а для /usr/ports/distfiles
компрессия отключена;
большая гибкость при планировании бэкапов, например, для /var/db и /usr/home можно создавать снэпшоты по отдельному расписанию;
у меня иногда возникает необходимость смонтировать /usr/obj в другое место (например, в chroot другой системы).
Установка системы
Устанавливать систему я буду традиционным способом - чере sysinstall. Для этого нужно его просто запустить :)
Далее, я выбираю пункт "Custom installation" и в подпунтке "Options" я изменяю следующие настройки:
Release Name = 8.0-BETA2-amd64
Это имя должно совпадать с именем каталога, в котором находятся файлы скопированные с ISO образа.
Install Root = /mnt
Это путь, куда смонтирован корень файловой системы ZFS.
Media Type = File System
После выбора File System оставляю поле ввода пустым.
После выхода из окна настройки "Options", я выбираю необходимые
для установки компоненты "Distributions". Помимо всего прочего,
обязательно нужно установить исходные тексты системы.
В принципе, это всё. Жмём "Commit" и ждём пока всё скопируется.
Первоначальные настройки и загрузчик
После установки системы переношу ядро с модулями в каталог /mnt/boot/kernel:
Использование идентификатора GPT позволит в дальнейшем забыть про
редактирование fstab при изменении именования диска, например, после
включения диска в другой SATA порт или использовании эксперементального
ahci(4) драйвера.
Теперь добавлю загрузку модуля zfs в loader.conf и rc.conf:
В опции загрузчика vfs.root.mountfrom указываю тип файловой системы zfs и имя пула amd64.
Теперь
нужно скомпилировать новый загрузчик. Нужен он для загрузки системы с
ZFS, к сожалению, по умолчанию поддержка ZFS в загрузчике отключена.
Для этого я и установливал исходники системы. Поддержка ZFS включается
опцией LOADER_ZFS_SUPPORT, её я добавлю в /mnt/etc/src.conf для того,
чтобы при дальнейших обновлениях системы случайно не забыть её.
На флэшке у меня установлена FreeBSD для i386, а сейчас я
устанавливаю версию для amd64. Чтобы не "насиловать" флэшку, я создам
символическую ссылку /usr/obj на /mnt/usr/obj.
Вообще, если бы я устанавливал не amd64 версию системы, то я бы смонтировал devfs в /mnt/dev, затем сделал chroot /mnt,
собрал там загрузчик и установил его, но в данном случае это
проблематично. Поэтому в /etc/src.conf моей флэшки тоже содержится
нужная опция:
# cat /etc/src.conf LOADER_ZFS_SUPPORT=YES
И так, скомпилирую и установлю новый загрузчик:
# cd /mnt/usr/src/sys/boot/ # make DESTDIR=/mnt TARGET=amd64 TARGET_ARCH=amd64 obj depend all # cd i386/loader/ # make DESTDIR=/mnt TARGET=amd64 TARGET_ARCH=amd64 install
Для make важным параметром здесь является DESTDIR=/mnt. Благодаря ему loader будет установлен в /mnt/boot/.
Финальные шаги
В завершение осталось сделать несколько действий:
Записать защитный MBR перед таблицей GPT. Он служит для защиты
GPT таблицы от операционок и программ, которые ничего не знают о GPT.
# gpart bootcode -b /mnt/boot/pmbr ad4 ad4 has bootcode
Записать загрузочный код в созданный ранее раздел с типом "freebsd-boot". Этот код содержится в файле /mnt/boot/gptzfsboot.
# gpart bootcode -p /mnt/boot/gptzfsboot -i 1 ad4
Скопировать zpool.cache, в котором содержится информация о
созданном пуле ZFS. Он нужен для того, чтобы свежеустановленная система
сразу нашла ZFS пул без предварительного его импорта командой zpool import.
Изменить точки монтирования для основных файловых систем.
# zfs set mountpoint=legacy amd64 # zfs set mountpoint=/usr amd64/usr # zfs set mountpoint=/var amd64/var # zfs set mountpoint=/tmp amd64/tmp
Для корневой файловой системы точка монтирования установлена в
legacy. Т.е. ZFS не будет монтировать корневую файловую систему
автоматически. Она будет смонтирована после того как ядро инициирует
монтирование корневой файловой системы.