Создание журналируемых файловых систем с помощью gjournal(8)


Газификация частного дома цена, сколько стоит провести газ в частный дом elezargaz.ru.

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

В течение многих лет операционная система FreeBSD опиралась на механизм Soft Updates, позволяющий реализовать многие функции журналирования без полного внедрения журналируемой файловой системы. Однако с ростом объемов жестких дисков все больше и больше стала ощущаться недостаточность функциональности Soft Updates. UFS и UFS2 известны как стабильные и надежные файловые системы. Реализация функций журналирования требует такого глубокого изменения файловой системы UFS2, что это поставило бы под угрозу с трудом заработанную добрую репутацию FreeBSD, даже если бы эти изменения вносил программист, обладающий редкой комбинацией солнечного оптимизма и дремучего фанатизма.

Эта задача была трудноосуществима, пока не появились наращиваемые модули GEOM. Если добавление функции журналирования в UFS2 — сложная задача, почему бы не создать между диском и UFS2 промежуточный уровень, реализующий журналирование? И здесь на сцену выходит gjournal(8). Для gjournal(8) требует лишь нескольких точек входа в реализацию файловой системы, чтобы узнать, куда записывать изменения, затем gjournal выполняет фактическую запись. Это устраняет необходимость запуска fsck(8) во время загрузки после краха системы.

gjournal(8) — это новая функциональная возможность, появившаяся в версии FreeBSD 7, и в действительности представляет собой довольно радикальный подход к проблеме журналирования. Многие с успехом используют gjournal(8), но в настоящий момент эта особенность по- прежнему должна рассматриваться как экспериментальная. Я использую ее в многотерабайтной файловой системе, которая содержит миллионы файлов, созданных программой Netflow. Однако в сравнении со зрелой файловой системой UFS, gjournal(8) — это неопытный малыш. Несмотря на то что ошибки исправляются по мере их обнаружения, на вашу долю может выпасть счастье наткнуться на новую ошибку, которая поставит ваши данные под угрозу. Я вас предупредил, а вы думайте.

По умолчанию файл журнала занимает один гигабайт дискового пространства, что малопригодно для небольших файловых систем. Для файловых систем с объемом менее 20 Гбайт я обычно использую механизм Soft Updates, а журналирование применяю в более крупных файловых системах. Журналирование и Soft Updates — это взаимоисключающие механизмы: вы можете использовать оба механизма на одном и том же сервере, но никак не в одной и той же файловой системе.

Внедрение gjournal(8) в файловую систему приводит к уничтожению всех данных в этой файловой системе. (При определенных обстоятельствах этого можно избежать, но в большинстве случаев лучше не полагаться на это.) Если вам требуется включить функцию журналирования в существующую файловую систему, сначала создайте резервную копию и подготовьтесь к восстановлению из нее. Учитывая объемы современных дисков, нет ничего сложного в том, чтобы скопировать порядка 400 Мбайт или что-то около того из раздела /usr на другой раздел диска, настроить журналирование раздела /usr в однопользовательском режиме и восстановить содержимое /usr. Изначально на других разделах хранится еще меньше данных, следовательно, их проще будет преобразовать. Думаю, как только gjournal(8) утратит свой экспериментальный статус, поддержка этого механизма будет интегрирована в инсталлятор.

Конфигурирование gjournal(8)

Для работы gjournal(8) требуется файл журнала. Журнал может быть отдельным дисковым устройством или располагаться в разделе, содержащем журналируемую файловую систему. Если и журнал и файловая система располагаются на одном диске, с точки зрения производительности нет смысла делить его на два раздела. Однако если разместить журнал на отдельном диске, вы можете ощутить увеличение производительности. (Я не имею в виду два старомодных диска АТА, подключенных к одному контроллеру!) Для наших примеров будем исходить из предположения, что файл журнала располагается на том же разделе диска, что и файловая система.

Загрузите модуль ядра командой gjournal load или загрузите модуль geom_journal.ko вручную. Кроме того, модуль ядра можно загрузить во время старта системы, добавив соответствующую инструкцию в файл /boot /loader.conf‘.

Теперь нужно пометить раздел как журналируемый. Ниже выполняется преобразование /dev/da0s1d, единственного раздела на этом диске, в журналируемый раздел:

# gjournal label /dev/da0s1d
gjournal: File system exists on /dev/da0s1d and this operation would destroy it. Use -f if you really want to do it.
(Перевод: gjournal: Ha /dev/da0s1d файловая система уже существует и эта операция может разрушить ее. Если вы действительно хотите сделать это, используйте ключ -f.)

Скажем так: слово преобразование — не совсем то слово, которое мне хотелось бы употребить. В действительности, мы уничтожаем существующую файловую систему и помещаем файл журнала в конец раздела.

# gjournal label -f /dev/da0s1d

gjournal подготовит устройство журналирования для этого раздела. Вместо того чтобы создать отдельный каталог для устройств журналирования в /dev, эта команда просто добавляет расширение .journal к имени файла устройства раздела. Все остальные операции с файловой системой должны выполняться над этим устройством журналирования.

Журналирование и newfs(8)

Теперь создадим файловую систему на устройстве журналирования, но вместо ключа -U, разрешающего использование механизма Soft Updates, используем ключ -J, разрешающий журналирование.

# newfs -J /dev/da0s1d.journal
/dev/da0s1d.journal: 7651.7MB (15670656 sectors) block size 16384, fragment size 2048
...

Обратите внимание на объем устройства с журналированием. Диск имеет объем 8,5 Гбайт, а устройство с журналированием — 7 651 Мбайт. Куда пропал целый гигабайт? Его занял файл журнала. Это вполне предсказуемо и нормально.

Монтирование журналируемых файловых систем

Большинство разделов UFS2 монтируются в синхронном режиме, однако журналируемые файловые системы должны монтироваться в асинхронном режиме. Как говорилось в главе 8, в случае монтирования в асинхронном режиме, когда данные сбрасываются на диск, система не ожидает, пока они фактически будут записаны на диск. Функция журналирования сама выполняет проверку и контролирует целостность. Укажите параметр async в поле параметров монтирования в файле /etc/fstab:

/dev/da0s1d.journal     /usr     ufs     rw,async     2     2

Отдельное устройство журналирования

Основное преимущество применения отдельного устройства журналирования состоит в том, что оно может — может — помочь сохранить существующую файловую систему. gjournal(8) сохраняет свои метаданные в последнем секторе раздела. Если последний сектор уже используется файловой системой, то ее нельзя преобразовать и придется пересоздать с помощью newfs. Имя устройства журналирования передается команде label в виде второго аргумента. Ниже устройство /dev/da0s1d помечается как журналируемая файловая система, журнал для которой размещается на устройстве /dev/da1s1e. Если последний сектор раздела предназначенной для журналирования файловой системы уже используется, gjournal(8) выдаст предупреждение.

# gjournal label /dev/da0s1d da1s1e

Далее, чтобы создать журналируемую файловую систему на устройстве /dev/da0s1d, вместо newfs используется команда tunefs(8), которая активизирует механизм журналирования и запрещает применение механизма Soft Updates для существующей файловой системы:

# tunefs -J enable -n disable /dev/ad0s1d

Теперь можно смонтировать новую журналируемую файловую систему на устройстве .journal с параметром async.

Отключение функции журналирования

Как и для модулей GEOM, обслуживающих дисковые массивы RAID, чтобы отключить функцию журналирования, нужно выполнить команду gjournal stop и gjournal clear для файла устройства, чтобы стереть метаданные gjournal на разделе:

# gjournal stop da0s1d.journal
# gjournal clear /dev/da0s1d

Затем можно выгрузить модуль ядра, чтобы завершить процедуру отключения функции журналирования в системе.

Комментарии запрещены.