С релизом FreeBSD-9.0, GPT-формат разделов жестких дисков стал, наконец, делом обыденным, ведь даже новый инсталлятор предполагает использование GPT по-умолчанию. Однако в связи с переходом на GPT-разметку дисков возникают и сложности, поскольку очень многое, в том числе и документация, продолжает быть завязано на ныне устаревший механизм MBR-разделов или слайсов. Так, например, к своему огорчению я обнаружил, что большинство разделов Handbook'а посвященных дискам, GEOM-классам и файловым системам изобилуют примерами работ со старыми слайсами, а не используют для этой цели новый формат GPT.Более того, в январе 2012 года, в разделе учебника, посвященного использованию gmirror, я внезапно наткнулся на [[http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ge... предостережение]], которое прямо указывает на невозможность сочетания 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, сразу, как только инсталлятор предоставит нам эту возможность:
[[IMG /opennews/pics_base/0_1334145441.png]]
Попав в командную строку, начинаем подготовку зеркала. Бегло проглядев вывод команды 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. Теперь после нашего краткого вмешательства, инсталлятор беспрепятственно позволит создать на зеркале необходимые разделы. Более того все изменения будут даже динамически отражаться на обеих половинах зеркала:
[[IMG /opennews/pics_base/0_1334145506.png]]
Далее инсталляция пойдет как по маслу в обычном порядке и до своего логического завершения.
Когда все закончится, перезагружаемся проверить все-ли мы сделали правильно, но здесь нас поджидает небольшой 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
На этом действительно все. Перезагружаемся и получаем работоспособную систему. Чтобы убедиться в этом, можно безбоязненно проводить тесты по поочередному отключению дисков.
Единственный нюанс, внимательный администратор заметит во время загрузки системы настораживающее предупреждение:
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
[[IMG /opennews/pics_base/0_1334145557.png]]
Как видно на скриншоте, разделы удачно скопировались и на бОльшем диске осталось 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, нужно обязательно дожидаться окончания процесса синхронизации, иначе вы потеряете данные.
URL:
Обсуждается: http://www.opennet.dev/tips/info/2681.shtml