The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

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

Более того, в январе 2012 года, в разделе учебника, посвященного использованию
gmirror, я внезапно наткнулся на предостережение, которое прямо указывает на
невозможность сочетания 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, сразу, как только инсталлятор предоставит нам эту возможность:



Попав в командную строку, начинаем подготовку зеркала. Бегло проглядев вывод
команды 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. Теперь после
нашего краткого вмешательства, инсталлятор беспрепятственно позволит создать на
зеркале необходимые разделы. Более того все изменения будут даже динамически
отражаться на обеих половинах зеркала:



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

Когда все закончится, перезагружаемся проверить все-ли мы сделали правильно, но
здесь нас поджидает небольшой 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



Как видно на скриншоте, разделы удачно скопировались и на бОльшем диске
осталось 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 &#8216;geom_mirror_load="YES"&#8217; > /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, нужно
обязательно дожидаться окончания процесса синхронизации, иначе вы потеряете данные.
 
11.04.2012 , Автор: Mikhail Zakharov
Ключи: freebsd, gpt, raid, gmirror / Лицензия: CC-BY
Раздел:    Корень / Администратору / Система / Диски и файлы / RAID массивы

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, freebsd, 16:17, 11/04/2012 [ответить] [смотреть все]
  • +/
    Кому это нужно? Есть ZFS.
     
     
  • 2.2, Kibab, 17:50, 11/04/2012 [^] [ответить] [смотреть все] [показать ветку]
  • +/
    Иногда лучше жевать, чем говорить ;-)
     
  • 2.7, ALD, 23:35, 11/04/2012 [^] [ответить] [смотреть все] [показать ветку]
  • +/
    Перевел половину серверов на ZFS, правда засада с sendfile ZFS по сравнению ... весь текст скрыт [показать] [показать ветку]
     
  • 2.8, Alexander Sheiko, 23:41, 11/04/2012 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    ...с неслабыми аппетитами к оперативной памяти.
     
     
  • 3.12, iZEN, 07:46, 12/04/2012 [^] [ответить] [смотреть все]  
  • +/
    2 ГБ минимум ОЗУ потребуется ZFS, чтобы начать нормально работать Модули памяти... весь текст скрыт [показать]
     
     
  • 4.15, Alexander Sheiko, 22:40, 12/04/2012 [^] [ответить] [смотреть все]  
  • +/
    Всего навсего, если сравнить с UFS В 2 гига можно влепить не один сервер ... весь текст скрыт [показать]
     
     
  • 5.17, Аноним, 07:38, 13/04/2012 [^] [ответить] [смотреть все]  
  • +/
    Каждому инструменту свое место ... весь текст скрыт [показать]
     
  • 1.3, Kibab, 17:56, 11/04/2012 [ответить] [смотреть все]  
  • +/
    Статья годная!
    Можно было бы только добавить, что можно с инсталляционного диска сделать зеркала разделов всего на одном диске, далее перезагрузиться в мультиюзер и оттуда добавить к зеркалам остальные разделы. Будет меньше простой сервера.
     
  • 1.4, Аноним, 20:41, 11/04/2012 [ответить] [смотреть все]  
  • +/
    Добавлять диск в зеркало как ada0 - не совсем верно, т к при его замене, если н... весь текст скрыт [показать]
     
     
  • 2.5, iZEN, 21:28, 11/04/2012 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    Зачем вы выносите usr на отдельный раздел, я не понял Достаточно держать в это... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.6, Аноним, 22:26, 11/04/2012 [^] [ответить] [смотреть все]  
  • +/
    Исторически так сложилось, хотя я согласен, что вынос usr local более логично, ... весь текст скрыт [показать]
     
     
  • 4.10, iZEN, 07:44, 12/04/2012 [^] [ответить] [смотреть все]  
  • +/
    Вообще, давно можно ZFS во FreeBSD без разметки на разделы.
     
     
  • 5.13, Аноним, 09:42, 12/04/2012 [^] [ответить] [смотреть все]  
  • +/
    Можно, только все же лучше отдавать не весь винт под ФС, а чуть меньше, это можн... весь текст скрыт [показать]
     
  • 4.34, playnet, 16:15, 24/04/2012 [^] [ответить] [смотреть все]  
  • +/
    и при смерти диска с активным свопом с большой вероятностью получаем кернел п... весь текст скрыт [показать]
     
     
  • 5.36, Аноним, 10:29, 10/05/2012 [^] [ответить] [смотреть все]  
  • +/
    своп - это подстраховка, а не панацея, если у вас сервера уходят в своп - думайт... весь текст скрыт [показать]
     
  • 2.19, butcher, 12:49, 13/04/2012 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    1 Привыкайте пользоваться gpart 8 2 Сейчас gptboot умеет загружать систему т... весь текст скрыт [показать] [показать ветку]
     
  • 2.24, terr0rist, 12:38, 16/04/2012 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    во фре сидят не болваны, и синхронизация происходит не одновременно, а по очеред... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.25, Аноним, 13:42, 16/04/2012 [^] [ответить] [смотреть все]  
  • +/
    а давайте проверим, че уж голословно-то говорить uname -r 8 2-RELEASE mdcon... весь текст скрыт [показать]
     
     
  • 4.27, nuclight, 01:26, 17/04/2012 [^] [ответить] [смотреть все]  
  • +/
    Этот тест ни разу не показателен, по той причине, что разделы одного диска имеют... весь текст скрыт [показать]
     
     
  • 5.29, Аноним, 10:11, 17/04/2012 [^] [ответить] [смотреть все]  
  • +/
    Я так и думал, что так скажут, ну протестировали бы сами, проблема что-ли una... весь текст скрыт [показать]
     
  • 2.28, nuclight, 01:33, 17/04/2012 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    Во-первых, не нужно отдельный tmp это уже на один раздел меньше , да и с usr ... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.30, Аноним, 10:37, 17/04/2012 [^] [ответить] [смотреть все]  
  • +/
    на tmp у меня стоит noexec и nosymfollow, на var я не могу поставить, как мини... весь текст скрыт [показать]
     
     
  • 4.32, nuclight, 20:50, 18/04/2012 [^] [ответить] [смотреть все]  
  • +/
    Это на самом деле нафиг не нужно Когда-то много лет назад я тоже баловался флаг... весь текст скрыт [показать]
     
     
  • 5.33, Аноним, 22:32, 18/04/2012 [^] [ответить] [смотреть все]  
  • +/
    gt оверквотинг удален по noexec-у согласен, хотя nosymfollow все же работает, ... весь текст скрыт [показать]
     
  • 3.31, iZEN, 21:18, 17/04/2012 [^] [ответить] [смотреть все]  
  • +/
    fsck может штатно запуститься с задержкой, какой требуется Нужно просто указать... весь текст скрыт [показать]
     
  • 1.9, dima, 04:20, 12/04/2012 [ответить] [смотреть все]  
  • +/
    ну почему все через жопу :(
     
     
  • 2.11, iZEN, 07:45, 12/04/2012 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    > ну почему все через жопу :(

    Так надо.


     
  • 1.14, Slava, 15:01, 12/04/2012 [ответить] [смотреть все]  
  • +/
    >> Однако нужно забыть сделать диск ada1 загрузочным

    Всё-таки наверное лучше НЕ забыть )

     
  • 1.16, Bocha, 06:12, 13/04/2012 [ответить] [смотреть все]  
  • +/
    "Кроме того, раздел /dev/da0p3 - содержит корневую файловую систему" - наверное всё таки ada0p3? А то при чем тут сказёвый диск непонятно откуда.

    А вообще суть строчки в том, что раздел смонтирован, и размонтировать его не получится, поэтому в текущем положении изменить его не возможно.

    А так ли это? Разве sysctl kern.geom.debugflags=16 не решает эту проблему? А то как-то тупо, получается, что удаленно зеркало построить нельзя. Вот раньше gmirror тоже не мог метадату записать на рабочий винт, Operation not permitted дескать, но делаем sysctl kern.geom.debugflags=16 и всё получается, остается поправить fstab и перезагрузиться, скрестив пальцы.

     
  • 1.18, butcher, 11:31, 13/04/2012 [ответить] [смотреть все]  
  • –1 +/
    Второй метод считаю некорректным, хоть он и рабочий. Зеркало нужно делать до того, как создали файловые системы. Либо использовать резервирование последних блоков для метаданных GEOM классов при вызове newfs (ключ -r).
     
     
  • 2.20, Аноним, 14:21, 13/04/2012 [^] [ответить] [смотреть все] [показать ветку]  
  • –1 +/
    Полностью согласен Более того, при полном заполнении раздела затерем последние ... весь текст скрыт [показать] [показать ветку]
     
     
  • 3.23, Black Hawk, 12:38, 15/04/2012 [^] [ответить] [смотреть все]  
  • +1 +/
    Интересно почему ведь newfs уже вызывается на зеркало непосредственно newfs s... весь текст скрыт [показать]
     
     
  • 4.26, Аноним, 13:59, 16/04/2012 [^] [ответить] [смотреть все]  
  • +/
    А где вы видите newfs , я вот вижу, что человек делает разметку ada1, как на ada... весь текст скрыт [показать]
     
  • 1.21, mitiok, 12:27, 14/04/2012 [ответить] [смотреть все]  
  • +/
    используйте load. ошибки вынуждавшие использовать исключиельно round-robin исправлены 100500 лет назад
     
  • 1.22, Nekit, 12:59, 14/04/2012 [ответить] [смотреть все]  
  • +/
    >> Терзаемый неприятным чувством, что поддержка GPT...

    Мда... Матчасть совсем не изучена.

    Во-первых: GPT в этом релизе довели до ума, другими словами, теперь она совсем не сырая.
    Во-вторых: GPT делает копию таблицы разделов в конце диска. Ну и gmirror то же так делает. В итоге получается, что при создании зеркала затирается резервная копия разделов GPT. Отсюда:
    1) сообщения (точнее даже предупреждения) об ошибках на этапе загрузки.
    2) риск потери данных, всвязи отсутствия бэкапа сектора GPT.

    А так работать вполне будет, что и выявлено к концу статьи.

    И кстати, об этом писал сам человек, который занимается разработкой GPT во фри.

     
  • 1.35, Oleg, 00:20, 08/05/2012 [ответить] [смотреть все]  
  • +/
    Хорошо написано.
    Еще одна статья о настройке RAID1 на разделах GPT, используя как инструмент gmirror: http://muff.kiev.ua/content/gmirror-programnyi-raid-1-i-gpt
     
  • 1.37, Владимир, 17:47, 23/11/2012 [ответить] [смотреть все]  
  • +/
    БОльшое спасибо за статью, однако
    "mount /dev/mirror/gm0p3 /mnt" выдает Invalid argument
     
  • 1.38, шмидт, 11:11, 24/09/2013 [ответить] [смотреть все]  
  • +/
    в первой части (вторую вообще не читал) не нужно перезагружаться второй раз, когда инстолляция закончена, то инстоллятор предлагает зайти сразу в консоль, там корневая фс уже смонтирована в /mnt и можно поправить конфиг загрузчика.
     
  • 1.40, robin, 16:41, 11/05/2015 [ответить] [смотреть все]  
  • +/
    если ada0 диск был заменен. как восстановить массив ?
     
     
  • 2.41, Oleg, 18:13, 11/05/2015 [^] [ответить] [смотреть все] [показать ветку]  
  • +/
    > если ada0 диск был заменен. как восстановить массив ?

    gmirror insert gm0 /dev/ada0

     
     
  • 3.42, robin, 12:49, 12/05/2015 [^] [ответить] [смотреть все]  
  • +/
    а если зерколо из раздеов ? а не с целых дисков
     
     
  • 4.43, robin, 12:53, 12/05/2015 [^] [ответить] [смотреть все]  
  • +/
    > а если зерколо из раздеов ? а не с целых дисков, например:

    $ gmirror status
           Name    Status  Components
    mirror/boot  COMPLETE  ada0p1 (ACTIVE)
                           ada1p1 (ACTIVE)
    mirror/root  COMPLETE  ada0p2 (ACTIVE)
                           ada1p2 (ACTIVE)
    mirror/swap  COMPLETE  ada0p3 (ACTIVE)
                           ada1p3 (ACTIVE)

     
  • 1.44, robin, 15:31, 12/05/2015 [ответить] [смотреть все]  
  • +/
    сам спросил сам ответил Восстановление после дисковых сбоев допустим диск ada0... весь текст скрыт [показать]
     
  • 1.45, mezantrop, 09:38, 26/07/2017 [ответить] [смотреть все]  
  • +/
    Ха, я думал, что эта моя старенькая заметка давно потерялась! Только странно, что она здесь проходит под чужим аккаунтом  - однофамилец из Новосибирска. Понятно, что много воды утекло уже и текст, наверное, не актуален, но если можно, поправьте, пожалуйста :)
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor