В данной статье описывается процесс установки операционной системы FreeBSD 9.1 amd64 на зазеркалированные средствами gmirror диски, используя для разметки GPT-формат разделов. Использоваться будут 4 жёстких диска (зеркало для корневой файловой системы и зеркало для раздела с данными), которые сначала очистим от служебной информации, попарно зазеркалируем их, запишем GPT и после этого установим систему. Подготовку и настройку системы будем осуществлять через установочный образ FreeBSD 9.1 amd64 disc1. Загружаемся с образа, попадаем в bsdinstall, переходим в «Shell».
Попав в консоль, необходимо узнать каким образом система определила установленные в сервер жёсткие диски.
# geom disk list
Geom name: ada0 Providers: 1. Name: ada0 Mediasize: 500107862016 (465G) Sectorsize: 512 Stripesize: 4096 Stripeoffset: 0 Mode: r1w1e1 descr: HGST HTE545050A7E380 ident: (null) fwsectors: 63 fwheads: 16 Geom name: ada1 Providers: 1. Name: ada1 Mediasize: 500107862016 (465G) Sectorsize: 512 Stripesize: 4096 Stripeoffset: 0 Mode: r1w1e1 descr: HGST HTE545050A7E380 ident: (null) fwsectors: 63 fwheads: 16 Geom name: ada2 Providers: 1. Name: ada2 Mediasize: 1000204886016 (931G) Sectorsize: 512 Mode: r1w1e1 descr: Hitachi HUA722010CLA330 ident: (null) fwsectors: 63 fwheads: 16 Geom name: ada3 Providers: 1. Name: ada3 Mediasize: 1000204886016 (931G) Sectorsize: 512 Mode: r1w1e1 descr: Hitachi HUA722010CLA330 ident: (null) fwsectors: 63 fwheads: 16
Видим, что имеем два диска ada0 и ada1 по 465G, на которых будет установлено зеркало с корневой файловой системой (/), а также два диска ada2 и ada3 по 931G для файловой системы с пользовательскими данными (/vs).
Если установленные жёсткие диски являются новыми и никоим образом не использовались, данный раздел можно пропустить. В данном разделе описывается подготовка дисков к установке новой системы, а именно удаление служебной информации GPT с дисков.
Для начала подгружаем модуль ядра geom_mirror.
# gmirror load
Geom_mirror определил наличие двух зеркал.
GEOM_MIRROR: Device mirror/gm1 launched (2/2). GEOM_MIRROR: Device mirror/gm0 launched (2/2).
Проверим какие диски содержатся в зеркалах.
# gmirror status
Name Status Components mirror/gm1 COMPLETE ada3 (ACTIVE) ada2 (ACTIVE) mirror/gm0 COMPLETE ada1 (ACTIVE) ada0 (ACTIVE)
Опеределяем, что на этих зеркалах находятся таблицы разделов GPT.
# gpart show
=> 34 976773100 mirror/gm0 GPT (465G) 34 6 - free - (3.0k) 40 256 1 freebsd-boot (128k) 296 16777216 2 freebsd-swap (8.0G) 16777512 959995616 3 freebsd-ufs (457G) 976773128 6 - free - (3.0k) => 34 1953525100 mirror/gm1 GPT (931G) 34 6 - free - (3.0k) 40 1953525094 1 freebsd-ufs (931G)
Удаляем GPT-таблицы с каждого зеркала.
# gpart destroy -F mirror/gm0
mirror/gm0 destroyed
# gpart destroy -F mirror/gm1
mirror/gm1 destroyed
Теперь проверяем разделы - они отсутствуют.
# gpart show
Если же GPT-таблицы были записаны не в зеркало, а на определённые диски, то также удаляем разметку с конкретных жёстких дисков.
# gpart destroy -F ada0
ada0 destroyed
# gpart destroy -F ada1
ada1 destroyed
# gpart destroy -F ada2
ada2 destroyed
# gpart destroy -F ada3
ada3 destroyed
Если установленные жёсткие диски являются новыми и никоим образом не использовались, данный раздел также можно пропустить. В данном разделе описывается подготовка дисков к установке новой системы, а именно удаление служебной информации MBR с дисков.
# gpart show
=> 63 976773104 mirror/gm0 MBR (465G) 63 63 - free - (31k) 126 976772979 1 freebsd (465G) 976773105 62 - free - (31k)
На этих зеркалах находится загрузочная запись MBR (Master Boot Record). Удаляется существующая таблица разделов MBR также, как и GPT.
# gpart destroy -F mirror/gm0
mirror/gm0 destroyed
# gpart destroy -F mirror/gm1
mirror/gm1 destroyed
Также как и с GPT - если MBR был записан не в зеркало, а на определённых дисках, то также удаляем разметку с конкретных жёстких дисков.
# gpart destroy -F ada0
ada0 destroyed
# gpart destroy -F ada1
ada1 destroyed
# gpart destroy -F ada2
ada2 destroyed
# gpart destroy -F ada3
ada3 destroyed
Если установленные жёсткие диски являются новыми и никоим образом не использовались, этот раздел можно также пропустить. В данном разделе описывается подготовка дисков к установке новой системы, а именно удаление служебной информации GEOM с дисков и удаление существующего массива RAID1.
Сначала удаляем из каждого зеркала по одному диску.
# gmirror remove gm0 ada1
GEOM_MIRROR: Device gm0: provider ada1 destroyed.
# gmirror remove gm1 ada3
GEOM_MIRROR: Device gm1: provider ada3 destroyed.
После этого инициируем полное удаление зеркал
# gmirror stop gm0
GEOM_MIRROR: Device gm0: provider mirror/gm0 destroyed. GEOM_MIRROR: Device gm0 destroyed
# gmirror stop gm1
GEOM_MIRROR: Device gm1: provider mirror/gm1 destroyed. GEOM_MIRROR: Device gm1 destroyed
На жёстких дисках ada0 и ada2, находящихся в gm0 и gm1 во время уничтожения зеркал, необходимо удалить метаинформацию, которая осталась после уничтожения массива (вывод будет пустым при успешном удалении служебной информации с дисков).
# gmirror clear ada0 # gmirror clear ada2
Можно было обойтись без удаления из каждого зеркала по одному диску (gmirror remove), описанного в начале раздела, а сразу уничтожить массивы (gmirror stop), тогда для каждого диска необходимо было произвести операцию очистки метаинформации GEOM (gmirror clear). Операция удаления из каждого зеркала по одному диску (gmirror remove) в начале раздела показана для общей информации по управлению gmirror.
Проверяем, осталось ли что-нибудь ещё на дисках относительно GPT и Gmirror.
# gpart show
# gmirror status
Если вывод данных команд оболочки отсутствует, значит вся служебная информация с дисков удалена, и теперь всё готово к созданию нового массива RAID1 с помощью Gmirror.
Для начала подгружаем модуль ядра geom_mirror, если это не было сделано в первом разделе.
# gmirror load
Следующими двумя несложными командами создаём два массива данных (gm0 из ada0 и ada1, gm1 из ada2 и ada3), gm0 и gm1 - метки созданных массивов, round-robin - тип алгоритма поочерёдной балансировки нагрузки на диски в массиве. Тип может быть load (по-умолчанию, чтение с менее нагруженного диска), prefer (чтение с компонента массива с наибольшим приоритетом), round-robin (поочерёдное чтение со всех компонентов массива), split (распаралеливать запрос больше определённого размера или ему равного на N дисков, которые находятся в массиве).
# gmirror label -vb round-robin gm0 /dev/ada0 /dev/ada1
GEOM_MIRROR: Device mirror/gm0 launched (2/2) Metadata value stored on /dev/ada0 Metadata value stored on /dev/ada1 Done.
# gmirror label -vb round-robin gm1 /dev/ada2 /dev/ada3
GEOM_MIRROR: Device mirror/gm1 launched (2/2) Metadata value stored on /dev/ada2 Metadata value stored on /dev/ada3 Done.
Вот и всё, зеркала готовы.
Чтобы показать как добавляются диски в массив, можно создать массивы с единичными дисками, а потом добавить по соответствующиму диску в каждый массив, но тогда потребуется время на синхронизацию добавленных дисков с зеркалом.
# gmirror label -vb round-robin gm0 /dev/ada0 # gmirror label -vb round-robin gm1 /dev/ada2 # gmirror status
Name Status Components mirror/gm1 COMPLETE ada2 (ACTIVE) mirror/gm0 COMPLETE ada0 (ACTIVE)
Добавляем соответствующие незадействованные диски в созданные массивы.
# gmirror insert gm0 ada1
GEOM_MIRROR: Device gm0: rebuilding provider ada1
# gmirror insert gm1 ada3
GEOM_MIRROR: Device gm1: rebuilding provider ada3
После этого можно наблюдать процесс синхронизации дисков в массивах. Синхронизация продолжится до получения добавленными дисками статуса ACTIVE, до получения массивами статуса COMPLETE.
# gmirror status
Name Status Components mirror/gm1 DEGRADED ada2 (ACTIVE) ada3 (SYNCHRONIZING, 1%) mirror/gm0 DEGRADED ada0 (ACTIVE) ada1 (SYNCHRONIZING, 10%)
Проверим состояние созданных массивов, после синхронизации. Если статус массивов COMPLETE, можно продолжать подготовку к установке операционной системы FreeBSD.
# gmirror status
Name Status Components mirror/gm1 COMPLETE ada3 (ACTIVE) ada2 (ACTIVE) mirror/gm0 COMPLETE ada1 (ACTIVE) ada0 (ACTIVE)
Массивы RAID1 синхронизировались.
Далее мы должны записать таблицы разделов GPT на зеркалированные области, разметить диск для загрузочной области freebsd, раздела подкачки, корневой файловой системы и файловой системы для данных (/vs). Файловые системы будут работать с помощью механизма Soft Updates с журналированием.
Создаём таблицу разделов диска для первого зеркала:
# gpart create -s gpt mirror/gm0
mirror/gm0 created
Создаём разделы с загрузочной областью freebsd, подкачки, корневой файловой системы:
# gpart add -b 40 -s 128k -t freebsd-boot -l "bootcode" mirror/gm0
mirror/gm0p1 added
# gpart add -s 8G -t freebsd-swap -l "swap" mirror/gm0
mirror/gm0p2 added
# gpart add -t freebsd-ufs -l "root" mirror/gm0
mirror/gm0p3 added
Делаем область mirror/gm0 загрузочной.
# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 mirror/gm0
bootcode written to mirror/gm0
Создаём таблицу разделов GPT для второго зеркала:
# gpart create -s gpt mirror/gm1
mirror/gm1 created
# gpart add -b 40 -t freebsd-ufs -l "vs" mirror/gm1
mirror/gm1p1 added
В случае ошибок можно удалить раздел (-i 1 - метка раздела ada0p1) и пересоздать его с нужными параметрами.
# gpart delete -i 1 ada0
Созданные разделы можно наблюдать в /dev/gpt.
# ls /dev/gpt
bootcode root swap vs
Создаём файловые системы (-O2 - тип файловой системы UFS2, -U - включение механизма Soft Updates).
# newfs -U -O2 /dev/gpt/root # newfs -U -O2 /dev/gpt/vs
Включаем механизм журналирования Soft Updates для созданных файловых систем.
# tunefs -j enable /dev/gpt/root
Using inode 4 in cg 0 for 33554432 byte journal tunefs: soft updates journaling set
# tunefs -j enable /dev/gpt/vs
Using inode 4 in cg 0 for 33554432 byte journal tunefs: soft updates journaling set
# gpart show
=> 34 976773100 mirror/gm0 GPT (465G) 34 6 - free - (3.0k) 40 256 1 freebsd-boot (128k) 296 16777216 2 freebsd-swap (8.0G) 16777512 959995616 3 freebsd-ufs (457G) 976773128 6 - free - (3.0k) => 34 1953525100 mirror/gm1 GPT (931G) 34 6 - free - (3.0k) 40 1953525094 1 freebsd-ufs (931G)
Самую подробную информацию по разделам зеркалированных областей можно получить с помощью команды gpart list.
# gpart list
Geom name: mirror/gm0 modified: false state: OK fwheads: 255 fwsectors: 63 last: 976773133 first: 34 entries: 128 scheme: GPT Providers: 1. Name: mirror/gm0p1 Mediasize: 131072 (128k) Sectorsize: 512 Stripesize: 4096 Stripeoffset: 0 Mode: r0w0e0 rawuuid: 8a5188ff-934d-11e3-8273-002590d78702 rawtype: 83bd6b9d-7f41-11dc-be0b-001560b84f0f label: bootcode length: 131072 offset: 20480 type: freebsd-boot index: 1 end: 295 start: 40 2. Name: mirror/gm0p2 Mediasize: 8589934592 (8.0G) Sectorsize: 512 Stripesize: 4096 Stripeoffset: 0 Mode: r0w0e0 rawuuid: 954b8eea-934d-11e3-8273-002590d78702 rawtype: 516e7cb5-6ecf-11d6-8ff8-00022d09712b label: swap length: 8589934592 offset: 151552 type: freebsd-swap index: 2 end: 16777511 start: 296 3. Name: mirror/gm0p3 Mediasize: 491517755392 (457G) Sectorsize: 512 Stripesize: 4096 Stripeoffset: 0 Mode: r1w1e1 rawuuid: aa0fa3b7-934d-11e3-8273-002590d78702 rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b label: root length: 491517755392 offset: 8590086144 type: freebsd-ufs index: 3 end: 976773127 start: 16777512 Consumers: 1. Name: mirror/gm0 Mediasize: 500107861504 (465G) Sectorsize: 512 Stripesize: 4096 Stripeoffset: 0 Mode: r1w1e2 Geom name: mirror/gm1 modified: false state: OK fwheads: 255 fwsectors: 63 last: 1953525133 first: 34 entries: 128 scheme: GPT Providers: 1. Name: mirror/gm1p1 Mediasize: 1000204848128 (931G) Sectorsize: 512 Stripesize: 0 Stripeoffset: 20480 Mode: r1w1e1 rawuuid: f3f64281-9351-11e3-8273-002590d78702 rawtype: 516e7cb6-6ecf-11d6-8ff8-00022d09712b label: vs length: 1000204848128 offset: 20480 type: freebsd-ufs index: 1 end: 1953525133 start: 40 Consumers: 1. Name: mirror/gm1 Mediasize: 1000204885504 (931G) Sectorsize: 512 Mode: r1w1e2
Далее - устанавливаем операционную систему. Мы можем выбрать два способа установки FreeBSD 9.1: либо установить через стандартный инсталлятор bsdinstall, либо вручную, оперируя командной оболочкой.
Действительно, на то он и инсталлятор, чтобы автоматически делать множество ручной работы. Возвращаемся из shell'а в bsdinstall командой exit.
# exit
Далее в стандартном режиме отвечаем на вопросы инсталлятора, доходим до меню выбора способа создания партиций, выбираем «Manual».
Указываем для ранее созданных файловых систем точки монтирования / (корневая файловая система) и /vs (файловая система для данных) подтверждаем внесение изменений «Commit». Обращаю внимание, что указанные точки монтирования файловых систем будут динамически отражаться на обоих компонентах зеркал.
Подтверждаем начало инсталляции и ожидаем завершения установки.
После завершения установки переходим в консоль (инсталлятор предложит). Принудительно отмонтируем файловые системы /mnt и /mnt/vs, автоматически примонтированные во время инсталляции.
# umount -f /mnt/vs # umount -f /mnt
После этого попадём снова в псевдографическое меню и выбираем «LiveCD». Указываем логин root, попадаем в систему. Проверяем статус зеркал RAID1, монтируем корневую файловую систему в /mnt и добавляем в /boot/loader.conf загрузку модуля geom_mirror при старте системы. Перезагружаемся.
login: root
# gmirror status
Name Status Components mirror/gm1 COMPLETE ada3 (ACTIVE) ada2 (ACTIVE) mirror/gm0 COMPLETE ada1 (ACTIVE) ada0 (ACTIVE)
Примонтируем корневую файловую систему, добавим в /boot/loader.conf загрузку модуля ядра geom_mirror при старте системы и перезагружаем операционную систему.
# mount /dev/mirror/gm0p3 /mnt # echo 'geom_mirror_load="YES"' >> /mnt/boot/loader.conf # reboot
Не во всех случаях установка FreeBSD из bdsinstall подходит (например, пишется скрипт для автоматической установки системы данным способом), поэтому опишем процесс установки FreeBSD из командной оболочки. После создания зеркал, разделов и файловых систем из Shell выходить не нужно.
Монтируем корневую файловую систему.
# mount /dev/gpt/root /mnt
Приступаем к непосредственной установке системы.
# cd /usr/freebsd-dist/ # export DESTDIR=/mnt # for file in base.txz kernel.txz lib32.txz src.txz; > do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done
Набор архивов из /usr/freebsd-dist можно определить для установки, исходя из нужд:
base.txz - мир (сама система, окружение ядра) doc.txz - документация FreeBSD games.txz - небольшой набор игр (например, fortune) kernel.txz - ядро системы lib32.txz - библиотеки 32х битных приложений для совместимости с 64х битными системами ports.txz - коллекция портов src.txz - исходные коды системы и ядра
Необходимо для установленной системы создать fstab с указанием точек и опций монтирования файловых систем
# cat > /mnt/etc/fstab << __EOF__ > # Device Mountpoint FStype Options Dump Pass /dev/mirror/gm0p2 none swap sw 0 0 /dev/mirror/gm0p3 / ufs rw 1 1 /dev/mirror/gm1p1 /vs ufs rw 2 2 > __EOF__
Создаём недостающие директории для точек монтирования.
# mkdir /mnt/vs
Добавим в /boot/loader.conf загрузку модуля ядра geom_mirror при старте системы и перезагружаем операционную систему.
# echo 'geom_mirror_load="YES"' >> /mnt/boot/loader.conf # reboot
После этого FreeBSD загружается в обычном режиме. Проверяем файловые системы (journaled soft-updates) и статус массивов RAID1.
# mount
/dev/mirror/gm0p3 on / (ufs, local, journaled soft-updates) devfs on /dev (devfs, local, multilabel) /dev/mirror/gm1p1 on /vs (ufs, local, journaled soft-updates)
# gmirror status
Name Status Components mirror/gm0 COMPLETE ada0 (ACTIVE) ada1 (ACTIVE) mirror/gm1 COMPLETE ada2 (ACTIVE) ada3 (ACTIVE)
Операционная система FreeBSD 9.1, установленная на зеркало RAID1 с таблицей разделов GPT, готова к использованию. Не лишнем будет устроить тестирование зеркалам, отключая поочерёдно диски. Не стоит забывать, что следует дожидаться полной синхронизации компонентов массива при включении дисков в массив, в противном случае можно лишиться данных.