Проверка и восстановление стуктуры файловой системы
Структура файловой системы, описанная выше в терминах i-узлов, блоков, косвенных блоков и суперблока, может быть нарушена и требовать восстановления. Например, при разрушении информации в трижды косвенном блоке могут появиться следующие проблемы:
- некоторый блок может быть вне системы, т.е. не являться частью файла и не быть в списке свободных блоков;
- могут появиться дубли i-узлов, т.е. описывать один и тот же файл дважды;
- некоторый блок может одновременно быть частью файла и быть в списке свободных блоков;
- некоторый файл может существовать, не будучи включенным ни в один каталог.
К счастью, структура файловой системы обладает некоторой избыточностью, позволяющей восстанавливать отдельные поломки. Вот некоторые виды избыточности:
- блок данных, являющийся каталогом, содержит имена файлов и номера i-узлов; где-то есть i-узел, соответствующий этому каталогу, и этот i-узел должен быть каталогом, а не обычным файлом;
- блок, включенный в список свободных блоков, теоретически не может быть частью какого-либо файла; для проверки этого достаточно сканировать все i-узлы для просмотра всех блоков, занятых файлами, и сканировать список свободных блоков;
- аналогично, блок, принадлежащий файлу, должен принадлежать только одному файлу; это легко проверить.
Эти и другие виды избыточности использует программа проверки файловой системы, запускаемая командой fsck (file system check). В различных реализациях существуют разные команды проверки целостности файловой системы: icheck, dcheck, ncheck. Однако все они в большей или меньшей степени перекрываются командой fsck. Типичное выполнение команды fsck выглядит следующим образом:
/etc/fsck ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Free List
Из примера видно, что fsck выполняется в несколько фаз.
На этих фазах производится следующая работа:
- проверка целостности i-узлов (счетчик связи, тип и формат i-узла);
- проверка каталогов, указывающих на i-узлы, содержащие ошибки;
- проверка каталогов, на которые нет ссылок;
- проверка счетчиков связей в каталога и файлах;
- проверка неверных блоков и дублированных блоков в списке свободных блоков, неиспользуемых блоков, которые должны быть включены, но не включены в список свободных блоков, и счетчика общего числа свободных блоков.
Команда по умолчанию всегда проверяет корневую файловую систему: все другие файловые системы проверяются, если их имена занесены в файл /etc/checklist.
Следующий пример показывает действия команды fsck и администратора в случае обнаружения дубля i-узла для файла /user/src/sys/ux; администратор принимает решение удалить этот плохой файл, отвечая в диалоге согласием y (yes) на вопросы команды.
/etc/fsck ** Phase 1 - Check blocks and sizes 528627 BAD I = 66 ** Phase 2 - Check pathnames DUP/BAD I = 66 OWNER = root MODE = 100755 SIZE = 78409 MTIME = Jul 16 18:45 1987 FILE = /usr/src/sys/ux REMOVE ? y ** Phase 3 - Check connectivity ** Phase 4 - Check Reference Count BAD/DUP I = 66 OWNER = root MODE = 100755 SIZE = 78409 MTIME = Jul 16 18:45 1987 FILE = /usr/src/sys/ux CLEAR ? y UNREF FILE I = 36 OWNER = root MODE = 100600 SIZE = 0 MTIME = Jul 17 09:40 1987 RECONNECT ? y ** Phase 5 - Check Frec List 157 BLK(S) MISSING BAD FREE LIST SALVAGE ? y ** Phase 6 - Salvage Free List 302 files 5833 blocks 371 free
Обратите внимание на появление шестой фазы, которой не было при нормальном выполнении команды. На этой фазе уточняется и восстанавливается список свободных блоков.
После выполнения fsck, связанного с "починкой" файловой системы, может появиться сообщение:
***** BOOT UNIX (NO SYNC!) *****,
требующее перезагрузки системы без выполнения команды sync. Если этого не сделать, работа по восстановлению списка свободных блоков будет утрачена, так как копии управляющих таблиц и буфера в оперативной памяти остались старыми. Для их обновления требуется перезагрузка без выгрузки буферов на диск командой sync.
Необходимым условием правильной работы fsck является также наличие пустого каталога /lost+found в корневом каталоге. Если при выполнении fsck будут найдены каталоги, на которые никто не ссылается в проверяемой файловой системе, они будут подключены в каталог /lost+found для дальнейшего изучения их принадлежности.