Руководства, соответствующей fsck(ADM).
.
- 4-20 -
Краткое описание этапов fsck
Команда fsck просматривает и проверяет каждую из вышеупомя-
нутых структур. На каждом этапе выполняется сравнение компонен-
тов и проверка согласованности этих компонентов друг с другом.
На этапе 1 проверяются блоки и размеры. Команда fsck читает
список индексных дескрипторов файлов, чтобы определить размеры и
отыскать блоки, используемые каждым из файлов. Эти дескрипторы
файлов проверяются на действительность (проверка типа и размера
дескриптора, проверка на равенство нулю счетчика связей) и на на-
личие дефектных или дублированных блоков. (Дефектными являются
блоки, значения которых выходят за границы файловой системы.)
Когда fsck спрашивает, следует ли чистить дескриптор файла, это
означает обнуление в нем дефектной информации. В итоге файл или
каталог, соответствующий этому дескриптору, будет удален. Дубли-
рованный блок означает, что два дескриптора указывают один и тот
же блок на диске. Команда fsck пытается определить оригинальный
дескриптор, чтобы скорректировать дубликат на этапе 2.
На этапе 2 проверяются имена путей. Должны быть удалены эле-
менты каталога для файлов, удаленных на этапе 1. На этапе 2 исп-
равляются ошибки, вызванные неправильным состоянием индексных
дескрипторов файлов, выходом указателей этих дескрипторов за пре-
делы диапазона; исправляются каталоги, указывающие на дефектные
дескрипторы файлов, как описано выше. В случае файлов с дублиро-
ванными блоками, обнаруженными на этапе 1, fsck попытается уда-
лить оба файла (это одна из немногих ситуаций, требующих вмеша-
тельства администратора системы).
На этапе 3 проверяются связи. На этапе 2 удалены каталоги,
не указывающие на действительные файлы. На этапе 3 восстанавли-
ваются связи с файлами, которые выпали из структуры каталога.
Все действительные файлы, на которые нет ссылки, помещаются в
специальный каталог под названием lost+found. Поскольку каталог
был отсоединен, имя файла теряется; в каталоге lost+found файлу
присваивается номер.
На этапе 4 проверяются счетчики обращений. Команда fsck про-
веряет счетчик связей для каждого элемента, благополучно прошед-
шего этапы 2 и 3. В некоторых случаях файлы, на которые не было
указателя в структуре каталога, но которые все же обладают ин-
дексными дескрипторами, могут быть вновь связаны с файловой
системой по каталогу lost+found.
На этапе 5 проверяется свободный список. Команда fsck изу-
чает список свободных блоков, составляемый файловой системой, и
разрешает отсутствующие или неназначенные блоки, которые были
ранее назначены или удалены. При обнаружении нарушения целост-
ности fsck выдает приглашение перестроить список.
На этапе 6 восстанавливается свободный список. Система ре-
конструирует список свободных блоков в соответствии с измененной
файловой системой, если это было определено на этапе 5.
.
- 4-21 -
Автоматическая проверка файловой системы
Иногда операционная система во время старта выдает запрос
на проверку файловой системы. Обычно это имеет место после не-
нормального останова (например, в результате потери мощности в
питании). После проверки файловой системы все файлы, разрушенные
в процессе останова, восстанавливаются.
Исправление файловой системы с помощью команды fsdb
Если после фатального сбоя суперблок файловой системы ока-
зывается настолько поврежден, что fsck не в состоянии его вос-
становить, можно с помощью команды fsdb ("filesystem debugger" -
"отладчик файловой системы") вручную исправить суперблок, наста-
вив "заплат". С большой вероятностью команда fsdb понадобится,
если fsck аварийно прекращается или выдает слишком много ошибок.
Так как fsdb - очень мощное средство, позволяющее не-
посредственно изменять суперблок (который содержит важную инфор-
мацию о файловой системе), использовать его следует с величайшей
осторожностью. Почти во всех случаях, когда требуется применить
fsdb, приходится менять только одну или две ячейки суперблока,
представляющие fsize и isize; им возвращаются значения, обычные
для вашей файловой системы. fsize - общее число блоков в файловой
системе; isize - количество индексных дескрипторов файлов, назна-
ченных файловой системе.
Далее приводятся порядок использования fsdb в целях измене-
ния значений fsize и isize.
1. Получите нормальные значения fsize и isize в вашей файло-
вой системе. Вы должны были записать их согласно инструкции в
конце процедуры установки, описанной в документе Installation
Guide. Если вы этого не сделали, можно получить размер файловой
системы с помощью divvy и оценить число индексных дескрипторов
файлов. Для определения размера файловой системы воспользуйтесь
командой
divvy -b 1 -c 1
Размеры файловых систем выводятся на экран в виде диапазона но-
меров блоков. Нужно вычесть номер начального блока из номера
последнего, и получится размер файловой системы. Приблизительное
число индексных дескрипторов файлов равно размеру, умноженному на
.125.
2. Убедитесь в том, что fsize и isize вашей файловой систе-
мы запорчены.
3. Найдите fsize и isize в суперблоке.
4. Установите fsize и isize равными их нормальным значениям.
.
- 4-22 -
Все эти шаги подробно описаны в последующих разделах. В
странице Руководства, соответствующей fsdb(ADM), приведено нес-
колько других способов применения fsdb для просмотра и обработки
суперблока; однако эти возможности рекомендуется использовать
только опытным администраторам системы.
Проверка нарушения значений fsize и isize
При проверке файловой системы после фатального сбоя команда
fsck считывает из суперблока размер файловой системы. Если зна-
чения fsize и isize, хранящиеся в этот момент в суперблоке, не
являются нормальными значениями для файловой системы, fsck выда-
ет на экран результаты проверки размера и заканчивает работу,
как показано в следующем примере:
+--------------------------------------------------------------
| # fsck /dev/root
| /dev/root
| /dev/root File System: / Volume: root
| Size check: fsize 0 isize 0
| #
|
Сравните значения fsize и isize, выданные командой fsck (в
нашем примере - 0), с нормальными значениями вашей файловой сис-
темы. Если они отличаются, придется выполнить fsdb, чтобы заме-
нить значения в суперблоке на нормальные значения файловой сис-
темы.
Иногда неправильной оказывается только одна из этих вели-
чин, хотя информация, выданная fsck, показывает нарушение обоих
значений. При выполнении fsdb вы увидите фактические значения
fsize и isize, записанные в суперблоке, и поймете, сколько зна-
чений вам придется менять - одно или оба. Для выполнения fsdb
введите следующую команду, задав в качестве filesystem имя фай-
ловой системы:
Ъ2fsdb /dev/filesystem
Полученный в результате вывод будет аналогичен приведенно-
му в следующем примере:
+--------------------------------------------------------------
| # fsdb /dev/root
| /dev/root(/): 1K byte Block File System
| FSIZE = 1895959976, ISIZE = 7216
|
В данном примере fsdb показывает, что некорректно только
значение fsize (хотя fsck выдала некорректность обоих). fsdb
всегда работает аккуратнее.
.
- 4-23 -
Поиск fsize и isize в суперблоке
Чтобы заново установить значения fsize и/или isize, нужно
уметь отыскивать эти значения в суперблоке. Это можно сделать,
перейдя к первому адресу суперблока и проверив первые два значе-
ния, которые и есть суть fsize и isize. В файловых системах UNIX
суперблок начинается по адресу 512, а в файловых системах XENIX
- по адресу 1024. Вот пример для файловой системы UNIX:
+--------------------------------------------------------------
| # fsdb /dev/root
| /dev/root(/): 1K byte Block File System
| FSIZE = 28890, ISIZE = 7216
| 512
| 001000: 000705 (453)
|
| 001002: 000000 (0)
|
| 001004: 070332 (28890)
|
(Клавиша используется для перехода от одного значения в
суперблоке к другому.) Выводятся следующие величины: адрес (в
восьмеричном виде), записанное по этому адресу значение (также в
восьмеричном виде) и его десятичный эквивалент (в скобках). Убе-
диться в том, что вы находитесь в нужном месте суперблока, можно
следующим образом: третья выведенная на экран величина (после
второго нажатия клавиши ) - fsize - должна совпадать со
значением, выведенным командой fsdb при ее запуске (FSIZE). За-
метим, что fsdb выдает значения в блоках по 1К. Если вы возьмете
размер файловой системы у команды df, то он окажется ровно вдвое
больше размера, сообщаемого командой fsdb. Это связано с тем,
что df выдает ответы в 512-байтных блоках. Если вам нужно изме-
нить значение FSIZE, имея размер, выданный командой df, его сле-
дует разделить на два. Если же вы использовали номер из команды
divvy, его преобразовывать не надо, так как divvy, как и fsdb,
пользуется блоками 1К.
Со значением ISIZE дело обстоит иначе. Это значение, выдан-
ное командой fsdb, нужно преобразовать, прежде чем сравнивать со
значением первой величины в суперблоке (isize).
Значение isize, записанное в суперблоке, является адресом
первого блока, расположенного после блоков, которые выделены для
индексных дескрипторов файлов. Чтобы сделать значение isize более
выразительным, fsdb преобразует этот адрес в число назначенных
индексный дескрипторов файлов (ISIZE). Это число нужно преобразо-
вать обратно в адрес блока путем деления ISIZE на 16 (число деск-
рипторов в блоке) и сложения с 2 (для учета первых блоков файло-
вой системы, которые используются для других целей: блок началь-
ной загрузки и суперблок). Результат (isize) должен равняться
числу, выведенному на экран в качестве первого адреса в супербло-
ке.
.
- 4-24 -
Установка нормальных значений для fsize и isize
Теперь, когда вы знаете точное местоположение fsize и isize
в суперблоке, вы можете использовать fsdb, чтобы перейти непос-
редственно к соответствующему адресу, пройти суперблок по словам
и присвоить адресу новое значение.
Замечание
Прежде чем пользоваться командой fsdb, убедитесь в том, что
файловая система демонтирована.
Чтобы перейти к первому адресу суперблока, введите команду
абсолютного адреса, который фиксирован для файловой системы (512
для файловых систем UNIX и 1024 для файловых систем XENIX). В
следующем примере проверяется файловая система UNIX:
+--------------------------------------------------------------
| 512
| 001000: 000173 (123)
|
По умолчанию fsdb считывает адреса, вводимые вами в виде деся-
тичных слов (512), а выводит адреса восьмеричными байтами
(001000). Значение, хранящееся по заданному адресу, также выво-
дится в восьмеричном виде (в скобках дается десятичный эквива-
лент).
Введя адрес в виде слова, можете нажимать , чтобы
продвигаться в суперблоке каждый раз на одно слово.
+--------------------------------------------------------------
| 002000: 000173 (123)
|
| 002002: 000000 (0)
|
| 002004: 007461 (3889)
|
В файловых системах UNIX для достижения значения fsize нужно
дважды нажать , а в файловых системах XENIX - только
один раз. (Это связано со способом хранения значений в супербло-
ке для файловых систем UNIX.)
.
- 4-25 -
Замечание
Если при вводе начального адреса на экране появится следую-
щее сообщение об ошибке:
block out of range (блок вне диапазона)