FreeBSD-9.0: жизнь с GPT и gmirror

С релизом FreeBSD-9.0, GPT-формат партиций жестких дисков стал, наконец, для моей любимой операционной системы делом обыденным, ведь даже новый, страшноватый на вид и достаточно неудобный в использовании, инсталлятор предполагает использование GPT по-умолчанию.

Однако в связи с переходом на GPT-разметку дисков возникают и сложности, поскольку очень многое, в том числе и документация, продолжает быть завязано на ныне устаревший механизм MBR-партиций или слайсов. Так, например, к своему огорчению я обнаружил, что большинство разделов Handbook’а посвященных дискам, GEOM-классам и файловым системам изобилуют примерами работ со старыми слайсами, а не используют для этой цели новый формат GPT.

Более того, в январе 2012 года, в разделе учебника, посвященного использованию gmirror, я внезапно наткнулся на предостережение (http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/geom-mirror.html), которое прямо указывает на невозможность сочетания FreeBSD-9.x, gmirror и GPT-разметки дисков:

“Warning: Creating a mirror out of the boot drive may result in data loss if any data has been stored on the last sector of the disk. This risk is reduced if creating the mirror is done promptly after a fresh install of FreeBSD. The following procedure is also incompatible with the default installation settings of FreeBSD 9.X which use the new GPT partition scheme. GEOM will overwrite GPT metadata, causing data loss and possibly an unbootable system.”

Примечательно, что в русскоязычном варианте Handbook’а часть этого предупреждения относительно использования GPT-партиций вместе с gmirror во FreeBSD-9.x попросту отсутствует.

Терзаемый неприятным чувством, что поддержка GPT дисков во FreeBSD далека еще от совершенства, я решил выяснить, действительно-ли в настоящий момент дисковый функционал FreeBSD-9.0R не может объединить технологии gmirror – программного зеркала (RAID-1) и партиций GPT.

Чаще всего gmirror используется в двух вариантах. Первый, это формирование зеркала из «сырых» дисков, с последующим созданием на зеркале партиций и файловых систем. Договоримся для краткости называть его gmirror+GPT.

Второй способ предполагает создание одной, или нескольких партиций на диске и последующее мирроризование этих партиций на другой диск. Этот метод будем называть GPT+gmirror.

gmirror+GPT

Итак, чтобы при помощи gmirror собрать RAID-1, а затем создать поверх него разделы GPT нам потребуется дистрибутив FreeBSD-9.0R и два установленных в компьютер жестких диска.

Рекомендуется, чтобы оба жестких диска были одинаковыми по всем характеристикам: объему, скорости вращения шпинделей, размеру буфера памяти и т.д. И хоть эти условия для применения gmirror не являются обязательными, однако нужно понимать, что в случае использования различия дисков, характеристики зеркала будут определяться худшим диском.

К сожалению, в настоящий момент инсталлятор FreeBSD не умеет управлять модулем gmirror, поэтому создавать RAID-1 нам придется своими собственными руками. Для этого загружаемся с инсталляционного диска но, запуская установку, переходим в shell, сразу, как только инсталлятор предоставит нам эту возможность:

Freebsd-GPT-gmirror-1

Попав в командную строку, начинаем подготовку зеркала. Бегло проглядев вывод команды dmesg, обнаруживаем, что в связи с новым именованием устройств во FreeBSD-9.0, в нашем случае диски определились как ada0 и ada1. Ну, раз так, значит так, создадим из них зеркало gm0 и сразу же загрузим его:

# gmirror label gm0 ada0 ada1
# gmirror load

Теперь в системе появился новый диск – gm0. Убедиться в этом можно посмотрев вывод команды:

 # ls -la /dev/mirror/gm0

Однако этот диск пока сырой. Поэтому определим для него схему разбиения на партиции, в нашем случае — GPT и сделаем этот диск загрузочным:

 # gpart create -s gpt mirror/gm0
 # gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 mirror/gm0

На этом первая часть вмешательства в обычный ход инсталляции FreeBSD может быть закончена. В самом деле, зачем людям работать руками, если инсталлятор со всем остальным может справиться самостоятельно? Поэтому смело набираем exit и выходим из shell’а, чтобы вернуться в инсталлятор, где нам будет предложено установить имя хоста и выбрать компоненты дистрибутива.

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

Freebsd-GPT-gmirror-2

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

Когда все закончится, перезагружаемся проверить все-ли мы сделали правильно, но здесь нас поджидает небольшой fail. С прискорбием мы обнаруживаем, что система загрузиться не может: ядро попросту не понимает, что такое gmirror и не видит зеркала.

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

Далее загружаем модуль gmirror и, вспомнив, что корневая файловая система находится на gm0p3, монтируем корень в /mnt.

# gmirror load
 # mount /dev/mirror/gm0p3 /mnt

Теперь остается добавить модуль gmirror в loader.conf для загрузки его вместе с ядром при старте системы:

# echo ‘geom_mirror_load="YES"’ > /mnt/boot/loader.conf

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

Единственный нюанс, внимательный администратор заметит во время загрузки системы настораживающий warning:

gptboot: invalid backup GPT header

Andrey V. Elsukov – один из разработчиков FreeBSD объясняет это предупреждение так:

“Причина понятна – GPT была создана поверх зеркала. Размер провайдера mirror/gm0 на 1 сектор меньше, чем размер диска, так как gmirror забирает последний сектор для хранения своих метаданных. Загрузчик gptboot ничего не знает о программном зеркале и ищет резервный заголовок GPT в конце диска, а там находятся метаданные gmirror.

Тут есть небольшое разногласие между gptboot и GEOM_PART_GPT. Некоторое время назад я изменил алгоритм проверки корректности GPT в GEOM_PART_GPT. А именно, после прочтения основного заголовка GPT и проверки его контрольной суммы, резервный заголовок считывается по хранящемуся в основном заголовке адресу. В случае, когда основной заголовок повреждён, резервный заголовок ищется в конце диска.”

Как видим из объяснения разработчика, ничего вроде бы страшного не происходит. И хотя у нас отсутствует запасной заголовок GPT в конце диска, это не критично, правда до тех пор, пока все работает.

GPT+gmirror

Этот вариант отличает от предыдущего тем, что мирроризуется не диск целиком, а отдельные его партиции. Как и для первого случая, нам потребуется дистрибутив FreeBSD-9.0R и два жестких диска, установленных в машину.

Как и прежде рекомендуется, чтобы диски были полностью одинаковыми. Тем не менее, если случилось так, что один диск больше другого, то инсталляцию FreeBSD лучше проводить на диск меньшего объема. Это поможет избежать лишних расчетов размеров партиций, при зеркалировании их с большего диска на меньший.

В остальном первоначальная установка FreeBSD-9.0R ничем не отличается от обычной инсталляции по-умолчанию. Вся настройка зеркалирования начинается, в тот момент, когда мы загружаем свежепроинсталлированную систему и попадаем в консоль.

Как и в предыдущем случае, диски определились как ada0 и ada1. FreeBSD установлена на меньший по размеру диск – ada0. Первым делом сохраним разметку диска и восстановим её на другом диске:

# gpart backup ada0 > ada0.gpt
 # gpart restore -F /dev/ada1 < ada0.gpt
 # gpart show

Как видно на скриншоте, партиции удачно скопировались и на бОльшем диске осталось 5GB свободного неразмеченного места. Теперь по логике вещей, можно начать зеркалирование партиций.

Однако нужно забыть сделать диск ada1 загрузочным, ведь мы зеркалируем не весь диск целиком, а только его партиции. Иначе с выходом из строя ada0, система не сможет загрузится с ada1. Поэтому:

# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada1

Кроме того, раздел /dev/da0p3 – содержит корневую файловую систему, он смонтирован, и размонтировать его не получится, поэтому в текущем положении изменить его не возможно.

Поэтому перезагружаем систему и запускаемся с инсталляционного диска, где привычно уже заходим в shell и на каждом разделе диска ada0 создаем зеркало и загружаем его:

# gmirror label -vb round-robin boot /dev/ada0p1
# gmirror label -vb round-robin swap /dev/ada0p2
# gmirror label -vb round-robin root /dev/ada0p3
# gmirror load

Итого у нас получаютcя 3 зеркала. Сразу же добавляем к зеркалам по их второй половине:

# gmirror insert boot /dev/ada1p1
# gmirror insert swap /dev/ada1p2
# gmirror insert root /dev/ada1p3

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

# gmirror status

А пока дожидаемся окончания этого процесса, чтобы зря не терять времени, можно не спеша сделать еще 2 полезные вещи. Первая, добавить модуль gmirror в загрузку ядра:

 # mount /dev/mirror/root /mnt
 # echo ‘geom_mirror_load="YES"’ > /mnt/boot/loader.conf

И вторая, отредактировать fstab в соответствии с измененными под зеркала именами партиций:

# cat /mnt/etc/fstab
#Device Mountpoint FStype Options Dump Pass#
/dev/mirror/swap none swap sw 0 0
/dev/mirror/root / ufs rw 1 1

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

2012 год

Advertisements

About mezzantrop

10 years of experience in large SAN and storage environments: mainly Hitachi, HP and Brocade. Now I am a proud SAN/storage IBMer. Empty – expect-like tool author. FreeBSD enthusiast.
This entry was posted in My projects, Very old stuff and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s