
Глава 18. GEOM: Модульная инфраструктура преобразования дисковых запросов
Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.
Содержание
18.1. Краткий обзор
Эта глава описывает использование дисков, управляемых инфраструктурой GEOM во FreeBSD. Среди прочего, здесь описывается большая часть утилит управления RAID, использующих GEOM для настройки. В этой главе мы не будем вдаваться в подробности взаимодействия GEOM с подсистемой ввода/вывода или с программным кодом, эту информацию вы можете получить на странице справочника geom(4). Эта глава также не является подробным руководством по настройке RAID. Мы обсудим только типы RAID, поддерживаемые GEOM.
После прочтения этой главы вы будете знать:
Какие типы RAID поддерживает GEOM.
Как использовать стандартные утилиты для настройки, обслуживания и управления различными уровнями RAID.
Как с помощью GEOM создавать зеркальные, последовательные и шифрованные дисковые последовательности, а так же последовательности из дисков, присоединённых удалённо.
Как решать проблемы с дисками, присоединёнными к инфраструктуре GEOM.
Перед чтением этой главы вы должны:
Понимать, как FreeBSD работает с дисками (Устройства хранения).
Уметь сконфигурировать и установить новое ядро FreeBSD (Настройка ядра FreeBSD).
18.2. Введение в GEOM
GEOM позволяет классам - MBR, BSD labels, и так далее - получить доступ к устройству и управлять им, используя поставщиков GEOM (providers) или специальные файлы устройств, расположенные в каталоге /dev. GEOM поддерживает различные программные конфигурации RAID, и прозрачно предоставляет доступ к дискам системе и системным приложениям.
18.3. RAID0 - Создание дисковой последовательности (Striping)
Создание дисковой последовательности (Striping) - метод, применяемый, чтобы скомбинировать несколько физических дисков в один логический. Во многих случаях это делается с использованием аппаратных контроллеров. Дисковая подсистема GEOM предоставляет программную поддержку RAID0, иногда называемую дисковой последовательностью (Stripe).
В RAID уровня 0 данные разбиваются на блоки, которые параллельно записываются на все диски массива. Вместо того, чтобы ждать записи 256k на один диск, RAID0 может параллельно записывать по 64k на каждый из четырёх дисков, обеспечивая более высокую производительность ввода/вывода. Производительность также может быть увеличена за счет использования большего числа дисков.
Все диски последовательности RAID0 должны быть одного размера, так как запись и считывание с дисков происходят параллельно.

Procedure: Создание дисковой последовательности из неформатированных ATA дисков
Загрузите модуль geom_stripe.ko:
# kldload geom_stripe
Убедитесь, что существует подходящая точка монтирования. Если вы планируете сделать логический диск корневым разделом, используйте временную точку монтирования, например /mnt:
# mkdir /mnt
Определите имена устройств, которые будут объединены в последовательность, и создайте новое устройство для последовательности. Например, чтобы создать дисковую последовательность из двух неиспользуемых и неразмеченных ATA дисков, например /dev/ad2 и /dev/ad3:
# gstripe label -v st0 /dev/ad2 /dev/ad3 Metadata value stored on /dev/ad2. Metadata value stored on /dev/ad3. Done.
Запишите стандартную метку, также известную как таблица разделов, в новый том, и установите стандартный загрузчик:
# bsdlabel -wB /dev/stripe/st0
Теперь в /dev/stripe кроме st0 появились ещё два устройства - st0a и st0c. Теперь создайте файловую систему на устройстве st0a, используя утилиту
newfs
:# newfs -U /dev/stripe/st0a
На экране промелькнет множество цифр, и через несколько секунд процесс будет завершен. Логический диск создан и готов к монтированию.
Смонтируйте его вручную:
# mount /dev/stripe/st0a /mnt
Чтобы монтировать созданную дисковую последовательность автоматически во время загрузки, добавьте информацию о ней в файл /etc/fstab. Создайте постоянную точку монтирования и назовите её, к примеру, stripe:
# mkdir /stripe
# echo "/dev/stripe/st0a /stripe ufs rw 2 2" \
>> /etc/fstab
Чтобы модуль geom_stripe.ko автоматически загружался во время инициализации системы, добавьте строку в /boot/loader.conf:
# echo 'geom_stripe_load="YES"' >> /boot/loader.conf
18.4. RAID1 - Зеркалирование (Mirroring)
Зеркалирование (Mirroring) - технология, применяемая как в корпоративной среде, так и на домашних компьютерах. Она позволяет создавать резервные копии "на лету". Зеркалирование, по сути, означает, что диск A является копией диска B. Или, возможно, диск C+D является копией диска A+B. Вне зависимости от конфигурации, основной аспект - дублирование информации. Позже, эта информация может быть с легкостью восстановлена или сохранена как резервная копия без остановки системы, или даже физически помещена в хранилище данных.
Перед началом, убедитесь, что у вас есть два физических диска равной емкости. Далее в этом примере подразумевается, что это диски прямого доступа (direct access, da(4)) с интерфейсом SCSI.
18.4.1. Зеркалирование первичных дисков
В статье предполагается, что FreeBSD установлена на первый жесткий диск, определяемый системой как da0. Это устройство будет целевым для утилиты gmirror(8).
Перед построением зеркала включите дополнительную отладочную информацию и откройте доступ к устройству. Это достигается установкой следующего значения переменной sysctl(8) kern.geom.debugflags
:
# sysctl kern.geom.debugflags=17
Теперь создайте зеркало. Начните процесс с сохранения метаданных на первом диске. В результате выполнения следующей команды будет создано устройство вида /dev/mirror/gm:
Создание зеркала на диске, с которого произведена загрузка, может повлечь за собой потерю данных в том случае, если данными занят последний сектор диска. Риск повреждения данных меньше, если создание зеркала немедленно следует за свежей установкой FreeBSD. |
# gmirror label -vb round-robin gm0 /dev/da0
Система должна выдать следующее сообщение:
Metadata value stored on /dev/da0.
Done.
Инициализируйте GEOM, это повлечет за собой загрузку модуля ядра /boot/kernel/geom_mirror.ko:
# gmirror load
После успешного завершения команды будет создано устройство gm0 в каталоге /dev/mirror. |
Включите автоматическую загрузку модуля geom_mirror.ko во время старта операционной системы:
# echo 'geom_mirror_load="YES"' >> /boot/loader.conf
Отредактируйте файл /etc/fstab, заменив в нём упоминания старого имени устройства da0 новым именем устройства зеркала gm0.
Если vi(1) - ваш любимый текстовый редактор, то эта задача решается просто:
Сделайте резервную копию файла fstab, набрав в vi(1) |
Независимо от аппаратного интерфейса дисков (SCSI или ATA), устройство RAID будет именоваться всегда одинаково - gm. Содержимое файла fstab должно выглядеть подобно следующему:
# Device Mountpoint FStype Options Dump Pass# /dev/mirror/gm0s1b none swap sw 0 0 /dev/mirror/gm0s1a / ufs rw 1 1 /dev/mirror/gm0s1d /usr ufs rw 0 0 /dev/mirror/gm0s1f /home ufs rw 2 2 #/dev/mirror/gm0s2d /store ufs rw 2 2 /dev/mirror/gm0s1e /var ufs rw 2 2 /dev/acd0 /cdrom cd9660 ro,noauto 0 0
Перезагрузите систему:
# shutdown -r now
С этого момента во время каждой загрузки система должна использовать устройство gm0 вместо устройства da0. Удостовериться в этом можно так: дождитесь загрузки системы, наберите команду mount
и просмотрите её вывод:
# mount
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/mirror/gm0s1a 1012974 224604 707334 24% /
devfs 1 1 0 100% /dev
/dev/mirror/gm0s1f 45970182 28596 42263972 0% /home
/dev/mirror/gm0s1d 6090094 1348356 4254532 24% /usr
/dev/mirror/gm0s1e 3045006 2241420 559986 80% /var
devfs 1 1 0 100% /var/named/dev
Как и ожидалось, вывод выглядит корректно. И в заключение, чтобы начать синхронизацию данных, включите в зеркало диск da1 при помощи следующей команды:
# gmirror insert gm0 /dev/da1
Во время построения зеркала статус процесса построения может быть проверен следующей командой:
# gmirror status
Вывод вышеприведённой команды для построенного и синхронизированного зеркала выглядит подобно следующему:
Name Status Components
mirror/gm0 COMPLETE da0
da1
Если есть какие-либо неполадки или зеркало находится в процессе построения, в выводе команды будет обозначен статус DEGRADED
вместо статуса COMPLETE
.
18.4.2. Решение проблем
18.4.2.1. Система не загружается
Если система прекращает загрузку и выдает строку:
ffs_mountroot: can't find rootvp Root mount failed: 6 mountroot>
Перезагрузите компьютер кнопкой питания или кнопкой "Reset". В загрузочном меню выберите опцию (6). Это приведет к тому, что система выдаст приглашение loader(8). Загрузите модуль ядра вручную:
OK? load geom_mirror
OK? boot
Если это сработало, модуль ядра по какой-либо причине не загрузился правильно. Проверьте корректность соответствующей записи в /boot/loader.conf. Если проблема осталась, добавьте строку:
options GEOM_MIRROR
в файл конфигурации ядра, пересоберите и переустановите ядро. Это должно устранить проблему.
18.4.3. Восстановление после дисковых сбоев
Примечательной особенностью зеркалирования является то, что если диск вышел из строя, то он, пожалуй, может быть заменён вообще без ущерба для данных.
Принимая во внимание предыдущую конфигурацию RAID1, предположим, что устройство da1 вышло из строя, и ему требуется замена. Перед заменой определите, какой именно диск вышел из строя, а потом выключите систему. Теперь дефектный диск может быть заменён новым, после чего необходимо снова загрузить систему. После загрузки системы для замещения диска в зеркале могут быть использованы следующие команды:
# gmirror forget gm0
# gmirror insert gm0 /dev/da1
Для наблюдения за статусом построения используйте команду gmirror status
. Вывод этой команды достаточно прост и понятен.
18.5. Сетевые устройства GEOM Gate
GEOM включает в себя поддержку работы с удаленными устройствами по сети, например с дисками, CD-ROM и т.д. путем использования gate утилит. Это подобно работе с NFS.
Для начала необходимо создать файл экспорта. В этом файле указывается, кому разрешен доступ к экспортируемым ресурсам и какой уровень доступа предоставляется. Например для того, чтобы экспортировать четвертый слайс первого SCSI диска, достаточно следующей записи в файле /etc/gg.exports:
192.168.1.0/24 RW /dev/da0s4d
Это позволит всем компьютерам внутри частной сети получить доступ к разделу da0s4d.
Чтобы экспортировать устройство, убедитесь, что оно не смонтировано, и запустите сервер ggated(8):
# ggated
Теперь, чтобы смонтировать устройство на клиентском компьютере выполните следующие команды:
# ggatec create -o rw 192.168.1.1 /dev/da0s4d
ggate0
# mount /dev/ggate0 /mnt
С этого момента устройство доступно в точке монтирования /mnt.
Необходимо заметить, что попытка смонтировать устройство, уже смонтированное как сетевой или локальный диск, закончится неудачей. |
Когда устройство больше не нужно, оно может быть размонтировано командой umount(8), как любое другое дисковое устройство.
18.6. Метки дисковых устройств
Во время загрузки системы, ядро FreeBSD создает файлы для обнаруженных устройств. Этот метод обнаружения устройств создает некоторые проблемы, например если новое дисковое устройство подключается через USB. Может получиться так, что этому диску будет присвоено имя устройства da0, а устройство с прежним именем da0 получит следующее имя, da1. Это приведет к проблемам монтирования файловых систем, записанных в /etc/fstab. На самом деле, это может даже помешать загрузке системы.
Одно из решений состоит в расположении SCSI устройств в таком порядке, чтобы новые устройства, добавляемые к SCSI контроллеру, занимали свободные номера устройств. Но что делать с USB устройствами, которые могут занять место основного SCSI диска? Это случается потому, что USB устройства обычно тестируются до SCSI контроллера. Решение может состоять в подключении этих устройств после загрузки системы. Другое решение - использование ATA диска и исключение SCSI устройств из /etc/fstab.
Есть и лучшее решение. С помощью утилиты glabel
, администратор или пользователь могут пометить дисковые устройства и использовать эти метки в /etc/fstab. Поскольку glabel
сохраняет метки в последнем секторе заданного устройства, они сохраняются и после перезагрузки. Используя эти метки вместо имени устройств, можно всегда смонтировать файловую систему независимо от назначенного имени устройства.
Очевидно, что метки должны быть постоянными. Утилита |
18.6.1. Типы меток и примеры
Существует два типа меток, основной (generic) тип и метки файловой системы. Метки могут быть постоянными или временными. Постоянные метки создаются командой tunefs(8) или newfs(8). В дальнейшем они будут автоматически создаваться в подкаталоге каталога /dev, имя которого определяется в соответствии с типом файловой системы. Например, метки файловых систем UFS2 будут расположены в каталоге /dev/ufs. Постоянные метки также можно создать при помощи команды glabel label
. Эти метки не зависят от типа файловой системы, поэтому они будут перечисляться в каталоге /dev/label.
Временные метки не сохраняются после перезагрузки. Эти метки создаются в каталоге /dev/label, они хорошо подходят для экспериментов. Временную метку можно создать командой glabel create
. За более детальной информацией обратитесь к странице справочника glabel(8).
Чтобы создать постоянную метку для файловой системы UFS2 не нарушая самих данных, выполните следующую команду:
# tunefs -L home /dev/da3
Если файловая система заполнена, это может привести к повреждению данных; в случае заполненной файловой системы надо или удалить ненужные файлы, или не добавлять метки. |
Метка должна появиться в /dev/ufs и может быть добавлена в /etc/fstab:
/dev/ufs/home /home ufs rw 2 2
Во время запуска |
Теперь файловую систему можно смонтировать как обычно:
# mount /home
Если модуль ядра geom_label.ko указан в /boot/loader.conf и загружается вместе с системой, или в ядре указана опция GEOM_LABEL
, метку устройства можно изменять без какого-либо негативного для системы эффекта.
Файловая система может быть создана с меткой по умолчанию путем использования флага -L
команды newfs
. Обратитесь к странице справочника newfs(8) за более подробной информацией.
Для удаления метки можно использовать следующую команду:
# glabel destroy home
В следующем примере показано, как устанавливаются метки на разделы загрузочного диска.
Пример 1. Установка меток на разделы загрузочного диска
Установка и задействование постоянных меток на разделах загрузочного диска предоставит возможность операционной системе загружаться нормально в том случае, если диск был переключен на другой контроллер, или даже переставлен на другую машину. В этом примере был задействован один диск ATA, определяемый системой как ad0. Также в примере подразумевается, что система использует типичную для FreeBSD схему разделения дискового пространства на слайсы и размещения на них файловых систем /, /var, /usr, /tmp и раздела подкачки.
Перезагрузите систему, дождитесь меню загрузчика. Нажатием клавиши 4 выберите однопользовательский режим. Далее, введите следующие команды:
# glabel label rootfs /dev/ad0s1a
GEOM_LABEL: Label for provider /dev/ad0s1a is label/rootfs
# glabel label var /dev/ad0s1d
GEOM_LABEL: Label for provider /dev/ad0s1d is label/var
# glabel label usr /dev/ad0s1f
GEOM_LABEL: Label for provider /dev/ad0s1f is label/usr
# glabel label tmp /dev/ad0s1e
GEOM_LABEL: Label for provider /dev/ad0s1e is label/tmp
# glabel label swap /dev/ad0s1b
GEOM_LABEL: Label for provider /dev/ad0s1b is label/swap
# exit
Система продолжит загрузку в многопользовательский режим. По завершении загрузки откройте файл /etc/fstab и замените в нём традиционные имена файлов устройств на соответствующие устройствам метки. Результат будет выглядеть подобно следующему:
# Device Mountpoint FStype Options Dump Pass# /dev/label/swap none swap sw 0 0 /dev/label/rootfs / ufs rw 1 1 /dev/label/tmp /tmp ufs rw 2 2 /dev/label/usr /usr ufs rw 2 2 /dev/label/var /var ufs rw 2 2
Перезагрузите еще раз систему. Если всё прошло успешно, система загрузится как обычно, а вывод команды mount
отобразит следующее:
# mount
/dev/label/rootfs on / (ufs, local)
devfs on /dev (devfs, local)
/dev/label/tmp on /tmp (ufs, local, soft-updates)
/dev/label/usr on /usr (ufs, local, soft-updates)
/dev/label/var on /var (ufs, local, soft-updates)
Начиная с FreeBSD 7.2, GEOM класс glabel(8) поддерживает новый тип меток для файловых систем UFS. Новый тип меток базируется на уникальных идентификаторах файловых систем, называемых ufsid
. Во время загрузки системы они автоматически создаются и помещаются в каталог /dev/ufsid. Перечисление меток должным образом в файле /etc/fstab делает возможным монтирование разделов по значениям ufsid
. Чтобы получить перечень файловых систем и соответствующих им меток ufsid
, выполните команду glabel status
:
% glabel status
Name Status Components
ufsid/486b6fc38d330916 N/A ad4s1d
ufsid/486b6fc16926168e N/A ad4s1f
В данном примере ad4s1d содержит файловую систему /var, а ad4s1f соответствует файловой системе /usr. Эти файловые системы можно также монтировать, указав значения их ufsid
в файле /etc/fstab:
/dev/ufsid/486b6fc38d330916 /var ufs rw 2 2 /dev/ufsid/486b6fc16926168e /usr ufs rw 2 2
Таким способом могут быть смонтированы любые разделы с метками ufsid
, что исключает необходимость создания постоянных меток вручную и в то же время позволяет воспользоваться преимуществами монтирования по меткам.
18.7. Журналирование UFS средствами GEOM
С выходом FreeBSD 7.0 был реализован долгожданный механизм ведения журналов для файловых систем. Сама реализация этого механизма осуществляется средствами системы GEOM, а конфигурирование выполняется утилитой gjournal(8).
Что такое журналирование? Журналирование сохраняет протокол транзакций файловой системы, то есть: изменения, составляющие логически завершенную операцию записи, сперва вносятся в журнал, а модификация метаданных и данных самого файла выполняется позже. В дальнейшем журнал может быть задействован для повторного выполнения транзакций на файловой системе с целью предотвращения нарушения целостности файловой системы.
Журналирование - это еще одним механизм предотвращения утери данных и нарушения целостности файловой системы. В отличие от механизма Soft Updates, который отслеживает и периодически сохраняет обновления метаданных, и механизма снэпшотов, который создает образ файловой системы, сам журнал хранится в специально отведенном для этой задачи пространстве диска, и, в некоторых случаях, может содержаться целиком на отдельном диске.
В отличие от других реализаций журналирования файловых систем, метод gjournal
работает на блочном уровне, он не встроен в файловую систему; это лишь надстройка над системой GEOM.
Чтобы включить поддержку gjournal
, в файле конфигурации ядра FreeBSD должна присутствовать следующая опция (включено по умолчанию для FreeBSD 7.0 и более поздних версий систем):
options UFS_GJOURNAL
Журналируемым устройствам, монтируемым во время загрузки системы, также потребуется модуль ядра geom_journal.ko. Внесите следующую запись в файл /boot/loader.conf:
geom_journal_load="YES"
В качестве альтернативы, функции вышеупомянутого модуля можно встроить в специализированное ядро. Для этого добавьте следующую опцию в файл конфигурации ядра:
options GEOM_JOURNAL
Для создания журнала на новой файловой системе выполните следующие шаги (здесь и далее подразумевается, что da4 есть новый SCSI диск):
# gjournal load
# gjournal label /dev/da4
На этом этапе в каталоге /dev должны присутствовать файлы устройств /dev/da4 и /dev/da4.journal. Теперь необходимо создать файловую систему:
# newfs -O 2 -J /dev/da4.journal
Предыдущая команда создаст файловую систему UFS2 на журналируемом устройстве.
Смонтируйте устройство в требуемый каталог файловой системы:
# mount /dev/da4.journal /mnt
В случае наличия нескольких слайсов, журнал создается для каждого из них. Например, если есть два слайса, и они называются ad4s1 и ad4s2, то утилитой |
Для увеличения производительности может потребоваться хранение журнала на отдельном диске. В таких случаях необходимо указать имя поставщика журнала или устройства хранения после имени устройства, на котором планируется включение журналирования. Журналирование также может быть активировано утилитой tunefs
на действующих файловых системах; однако, всегда создавайте резервную копию перед попытками изменить настройки файловой системы. В большинстве случаев, выполнение команды gjournal
завершится ошибкой, если создание журнала невозможно, в то время как некорректное использование команды tunefs
не защитит против потери данных.
Также возможно журналирование загрузочного диска системы FreeBSD. За детальными инструкциями по этой возможности обратитесь к статье Настройка журналирования UFS для настольного компьютера.
Изменено: 18 февраля 2025 г. by Fernando Apesteguía