Fast File System


«Грязные» диски

Нет, диски не пачкаются при эксплуатации (хотя пыль на пластине причинит ей вред, да и вода, безусловно, будет некстати). «Грязный» дисковый раздел FFS находится в неопределенном состоянии: операционная система запрашивает информацию, которая находится в этом разделе, но данные не были записаны полностью. Возможно, записана только часть блоков данных, либо изменен индексный дескриптор, а данные не записаны, либо имеется комбинация этих двух вариантов. Если при записи на диск выключается питание, в системе появляется «грязный» диск.

fsck(8)

В состав операционной системы FreeBSD входит мощный инструмент для проверки файловых систем — fsck(8). Если при загрузке системы будет найден «грязный» диск, fsck автоматически проверит диск и постарается устранить неполадки. Данные, не записанные на диск, будут утеряны, но fsck сделает все возможное, чтобы привести в порядок те данные, что остались. При благоприятном исходе все встанет на свои места — за исключением незаписанных данных!

Неудачный автоматический запуск fsck

Иногда перезагрузка заканчивается неудачно, и вы попадаете в однопользовательский режим, где вас просят запустить fsck(8) вручную. Здесь у вас есть выбор: либо запустить fsck, либо нет. Если ввести команду fsck, эта программа проверит каждый блок и индексный дескриптор на диске. Вероятно, она найдет все блоки, не связанные с соответствующими индексными дескрипторами. Далее программа постарается выяснить былое соответствие. Однако она не сможет сказать, к какому каталогу принадлежат эти файлы.

fsck спросит, надо ли выполнить перегруппировку. Если вы ответите n, программа удалит поврежденные файлы. В случае ответа y потерянный файл будет помещен в каталог находок (например, /usr/lost+found) в разделе, в котором он был найден. В качестве названия файла будет выступать некое число. Если таких файлов немного, их можно попробовать идентифицировать вручную, а в случае большого числа файлов их можно просмотреть с помощью таких инструментов, как file(1) или grep(1), и произвести идентификацию.

Отключение приглашения fsck

Если диск стал «грязным» во время масштабной операции, на нем может появиться множество потерянных файлов. Чтобы не тратить время, снова и снова набирая y и предписывая fsck восстанавливать каждый файл, можно запустить команду fsck -y, заранее ответив у на все вопросы. Это намного проще, чем сидеть и без конца набирать y.

Систему можно настроить на автоматический запуск fsck -y при начальной загрузке. Однако я не рекомендую такой шаг: если есть хотя бы малейший шанс, что моя файловая система вознесется в цифровые небеса, я хочу знать об этом. Я хочу сам набирать опасную команду и трепетать, наблюдая за работой fsck(8). Кроме того, всегда неприятно обнаружить «мусор» в системе, не имея ни малейшего понятия о том, что произошло. Однако если вы более безрассудны, чем я, установите параметр fsck_y_enable="YES" в файле /etc/rc.conf.

ВНИМАНИЕ!

Запуск fsck с ключом -y не гарантирует полную безопасность. Когда я работал с экспериментальными файловыми системами в ветке -current или выполнял не совсем обычные операции, благодаря fsck -y в каталогах /usr/lost+found и /var/lost+found иногда оказывалось содержимое всего диска. После этого восстанавливать файлы было чрезвычайно трудно. Следует заметить, что в стабильной версии FreeBSD-stable со стандартной файловой системой UFS я не испытывал никаких трудностей.

Что вместо fsck -y

Какой у вас есть выбор вместо fsck -y? Программы fsdb(8) и clri(8) позволяют отлаживать файловую систему и перенаправлять файлы в надлежащее место. Можно восстановить имена файлов и разместить их в исходных каталогах. Однако это трудно* — такой путь рекомендуется только Мастерам Файловых Систем из Тайного Клана Ниндзя.

Запуск fsck в фоновом режиме

Возможность запуска fsck в фоновом режиме придает файловой системе FFS некоторые преимущества журналируемых файловых систем, без фактического использования части жесткого диска для ведения журнала. Когда после загрузки FreeBSD обнаруживает наличие fsck, работающей в фоновом режиме, она монтирует «грязные» диски в режиме чтения/записи. Утилита fsck(8) работает в фоновом режиме, несмотря на то, что сервер продолжает свою работу, отыскивает потерянные куски файлов и ставит их на место.

Фактически при работе в фоновом режиме fsck проходит две основных стадии. Когда во время инициализации процесса загрузки FreeBSD обнаруживает «грязные» диски, она запускает fsck(8) для выполнения предварительной оценки их состояния. fsck(8) решает, возможно ли их восстановление в ходе работы системы или требуется полноценный запуск fsck в однопользовательском режиме. В большинстве случаев fsck предполагает, что работа может быть продолжена, и дает разрешение на продолжение загрузки системы. Когда система достигает однопользовательского режима, fsck запускается в фоновом режиме с низким приоритетом и выполняет проверку разделов одного за другим. Результаты работы fsck выводятся в файл протокола /var/log/messages.

Пока fsck работает в фоновом режиме, можно ожидать снижения производительности приложений, выполняющих действия с жестким диском. fsck(8) забирает на себя значительную долю производительности диска. Если система медленная, она станет еще медленнее.

По окончании работы fsck в фоновом режиме можно заглянуть в файл /var/log/messages и проверить наличие сообщений об ошибках. На предварительном этапе fsck может ошибиться в своих оценках, и, возможно, для восстановления раздела действительно потребуется полноценный запуск fsck в однопользовательском режиме. Если будет обнаружено подобное сообщение, предусмотрите несколько часов простоя системы на проведение восстановительных работ. Очень неприятно останавливать систему для проведения запланированных работ, однако гораздо неприятнее производить незапланированную остановку, вызванную падением напряжения и работой команды fsck -y в однопользовательском режиме.

Принудительное монтирование «грязных» дисков в режиме чтения/записи

Если вам очень захочется вынудить FreeBSD монтировать «грязный» диск в режиме чтения/записи без использования fsck в фоновом режиме, вы можете это сделать. Но результаты вам не понравятся. Очень. Но поскольку о такой возможности упоминается в странице руководства mount(8), некоторые читатели могут решить, что в этом нет ничего плохого, если заранее не знают, чем это грозит. Для принудительного монтирования в режиме чтения/записи используются флаги -w (read-write — чтение/запись) и -f (force — принудительно) команды mount(8).

Монтирование «грязного» раздела в режиме чтения/записи приведет к повреждению данных. Обратите внимание на отсутствие в этом предложении слова может. Кроме того, в этом предложении отсутствует слово восстановление. Монтирование «грязной» файловой системы может привести к краху системы. Эта операция может разрушить еще оставшиеся на разделе данные и даже уничтожить саму файловую систему. Принудительное монтирование «грязной» файловой системы в режиме чтения/записи — это табу. Никогда не производите его.

Синхронизация и остановка FFS

Во время остановки операционной системы FreeBSD ядро производит синхронизацию всех данных на жестком диске, помечает диск как «чистый» и останавливается. Эти операции с диском выполняются процессом ядра с именем syncer. В ходе подготовки к остановке системы syncer сообщает о ходе синхронизации данных на жестком диске.

В процессе остановки вы будете наблюдать малопонятные сообщения от процесса syncer. В действительности syncer не опускается до работы с блоками и индексными дескрипторами, требующими обновления, — он работает с виртуальными индексными дескрипторами, требующими синхронизации. Благодаря механизму Soft Updates операция записи в один виртуальный индексный дескриптор может приводить к появлению другого виртуального дескриптора, требующего обновления. Вы можете увидеть, как быстро уменьшающееся число буферов, требующих записи на диск, вдруг раз-другой прыгает между нулем и каким-нибудь небольшим значением — это результат фактической синхронизации с жестким диском.

Подлинные подробности о FFS

Если вы хотите побольше узнать о FFS, загрузите схему внутреннего устройства ядра FFS, которую можно найти в документе http://phk.freebsd.dk/misc/ufs.pdf. Чтобы распечатать ее, вам потребуется широкоформатный архитектурный принтер или 18 листов обычной бумаги, а также новая лента для принтера.

Запуск fsck в фоновом режиме, fsck -y, обычный запуск fsck — вот напасть-то!

В реальной жизни могут встретиться все эти варианты использования fsck(8), но как понять, когда FreeBSD использует каждую из этих команд? При принятии решения, когда и как запускать fsck(8), FreeBSD использует следующие условия:

  • Если файловая система не содержит ошибок, она монтируется без запуска fsck(8).
  • Если во время загрузки файловая система не задействует механизм Soft Updates и окажется «грязной», FreeBSD запускает fsck. Если будут обнаружены серьезные повреждения файловой системы, FreeBSD остановится и запросит вашего вмешательства. Здесь вы сможете либо запустить команду fsck -y, либо вручную подтвердить все попытки восстановления файлов.
  • Если во время загрузки файловая система задействует механизм Soft Updates и окажется «грязной», FreeBSD выполнит оценочную проверку с помощью fsck(8). В случае умеренных повреждений FreeBSD запустит fsck(8) в фоне, в многопользовательском режиме. Если будут обнаружены серьезные повреждения, FreeBSD прервет загрузку и потребует вмешательства либо в виде запуска команды fsck -y, либо в виде принятия или отклонения каждой обнаруженной проблемы.
  • Если во время загрузки файловая система задействует механизм журналирования и окажется «грязной», FreeBSD восстановит данные из журнала и продолжит загрузку. Журналируемые файловые системы редко требуют восстановления с помощью fsck(8).

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