FSCK и загрузка Linux

13 Фев
2008

Уже старая статья, написана если мне не изменяет память применительно к ALTLinux, в Ubuntu немного не так, но все равно думаю будет полезна желающим разобраться с принципами работы.

Итак, когда в Grub|LILO выбран пункт меню Linux загружается ядро, которое в свою чередь запускает программу init, которая запускает сценарий etc/rc.d/rc.sysinit устанавливающий различные системные переменные и выполняющий некоторую работу по инициализации истемы. Открываем этот файл.

Все что в нем есть я приводить естественно не буду, хотя там много интересных строк, становимся только на параметрах касающихся работы проверки разделов жестких
дисков и их монтирования.

# Start up swapping.

action $»Activating swap partitions: » swapon -a -e

В этой строке монтируются все свап разделы которые прописанный в /etc/fstab
(опция -а), а для того чтобы программа не слишком ругалась и не прекратила свою
работу в случае неудачи использована опция . Двигаемся дальше.

1. if [ -f /forcefsck ]; then

2. fsckoptions=»-f $fsckoptions»

3. elif [ -f /.autofsck ]; then

4. echo $»Your system appears to have shut down uncleanly»

5. AUTOFSCK_TIMEOUT=5

6. AUTOFSCK_DEF_CHECK=no

7. [ -f /etc/sysconfig/autofsck  ] && . /etc/sysconfig/autofsck

8. if ["$AUTOFSCK_DEF_CHECK" = "yes" ] ; then

9. AUTOFSCK_OPT=-f

10. else

11. AUTOFSCK_OPT=

12.fi

13.if [ "$PROMPT" !="no" ]; then

14. if[ "$AUTOFSCK_DEF_CHECK" = "yes" ] ; then

15. if /sbin/getkey -c $AUTOFSCK_TIMEOUT -m $»Press N within %d seconds to not
force file system integrity check…» n ; then AUTOFSCK_OPT=

16. fi

17. else

18. if  /sbin/getkey -c $AUTOFSCK_TIMEOUT -m $»Press Y within %d seconds to force
file system integrity check…» y ; then

19. AUTOFSCK_OPT=-f

20. fi

21. fi

22. echo

23. else

24. # PROMPT not allowed

25. if [ "$AUTOFSCK_DEF_CHECK" = "yes" ] ; then

26. echo $»Forcing file system integrity check due to default setting»

27. else

28. echo $»Not forcing file system integrity check due to default setting»

29. fi

30. fi

31. fsckoptions=»$AUTOFSCK_OPT $fsckoptions»

32. fi

О, это уже интересно. Первые две строки указывают на то, что если в корневом каталоге найдется файл /forcefsck,
то к некоей переменной fsckoptions следуя из названия которой в ней содержатся опции для нашей утилиты проверки fsck, добавляется опция -f ее назначение состоит в принудительной ее проверке даже в том случае когда система
выключена нормально т.е. если есть желание проверить файловые системы принудительно при загрузке совсем не обязательно для этого выдергивать вилку из розетки. В третьей строке проверяется наличие файла /.autofsck и если система его находит то, делается вывод, что компьютер был выключен не корректно. Такой трюк помогает не проверять множество возможно подключенных файловых систем, на наличие чистого бита, который как вы помните из показывает на корректное размонтирование, в каждой, а ограничиться всего лишь проверкой наличия одного единственного файла. Значит, делаем отсюда вывод где то там в скриптах участвующих в выключении компьютера этот файл должен красиво удаляться. В седьмой строке в том случае если компьютер выключен не корректно, проверяется наличие файла /etc/sysconfig/autofsck и если таковой
существует то он запускается на выполнение, что позволяет задать дополнительные переменные для проверки или выполнить еще какие-либо действия. Дальше подробно разбирать не будем, здесь просто в зависимости от различных условий добавляется или не добавляется к значению fsckoptions параметр -f и выводятся соответствующие сообщения. Обратите
внимание только на то как получается ответ пользователя в строках 15 и 18 с помощью программы /sbin/getkey.

Следующие интересные строки.

if [ -f /fastboot ] || grep -iq «fastboot» /proc/cmdline
2>/dev/null ; then

fastboot=yes

else

fastboot=

fi

В них проверяется наличие файла /fastboot или с помощью программы grep которая предназначена для поиска в файле строк удовлетворяющих заданному образцу разыскивается строка fastboot в некоем файле /proc/cmdline. А что это за файл такой к тому же находящийся как видите в каталоге /proc представляющем собой интерфейс к таблице процессов. Смотрим

# cat /proc/cmdline

ro root=/dev/hda5 hdc=ide-scsi

Так это же строка в файле /boot/grub/grub.conf и соответствующая передаваемым ядру параметрам при запуске системы. Пошли дальше.

ROOTFSTYPE=`grep » / » /proc/mounts | awk ‘{ print $3 }’`

В этой строке переменной ROOTFSTYPE присваивается выполнение команды grep которая ищет слова начинающиеся с
обратного слеша в файле /proc/mounts в третьей позиции выбранной с помощью
программы awk. Смотрим что это за файл такой.

# cat /proc/mounts

rootfs / rootfs rw 0 0

/dev/root / ext3 rw 0 0

/proc /proc proc rw 0 0

none /dev/pts devpts rw 0 0

/dev/hda11 /home ext3 rw 0 0

/dev/hda2 /mnt/win_c vfat rw,nosuid,nodev 0 0

/dev/hda7 /usr/local ext3 rw 0 0

none /dev/shm tmpfs rw 0 0

automount(pid567) /mnt/auto autofs rw 0 0

Как видите это список всех файловых систем прописанных в /etc/fstab, а третью позицию занимает точки монтирования
т.е. /, /home и т.д. И кстати чтобы узнать какие файловые системы поддерживает ваше ядро на данный момент нужно
просто просмотреть содержимое файла /proc/filesystems:

$ cat /proc/filesystems

Пошли дальше.

if [ -z "$fastboot" -a "$ROOTFSTYPE" != "nfs"
]; then

# т.е. Если переменная $fastboot пустая (как ее заполнить мы уже
рассматривали) или $ROOTFSTYPE не равно nfs т.к. последняя является сетевой то ее проверка бесмысленна, выполняются все последующие действия.

STRING=$»Checking root filesystem»

echo $STRING

initlog -c «fsck -T -a $fsckoptions /»

# т.е. запускается команда проверки файловых систем с помощью ключа -с и
аккуратненько протоколируются его действия

rc=$? # запоминаем код завершения процесса

if [ "$rc" = "0" ];

then success «$STRING»

echo

elif [ "$rc" ="1" ];

then passed $»$STRING»

echo

fi

# если код ошибки больше 2 то выполняется ниже приведенный участок

if [ $rc -gt 1 ]; then failure «$STRING»

echo

echo

echo $»*** An error occurred during the file system check.»

echo $»*** Dropping you to a shell; the system will reboot»

echo $»*** when you leave the shell.»

PS1=$»(Repair filesystem) \# # «; export PS1

sulogin

# система переходит в однопользовательский режим с помощью вызова sulogin, для восстановления
файловой системы в ручную. А затем.

echo $»Unmounting file systems»

umount -a
# размонтируются все файловые системы

mount -n -o remount,ro /

# в этой строке перемонтируется корневая файловая система в режиме только для чтения, параметр -n указывает на то чтобы запись в файл /etc/mtab не производилась (данный файл содержит список все смонтированный файловых систем в
некоторых дистрибутивах это символическая ссылка на /proc/mounts)

echo $»Automatic reboot in progress.»

reboot -f # принудительная перезагрузка

elif [ "$rc" = "1" ]; then _RUN_QUOTACHECK=1

fi

fi

После проверки происходит монтирование в режиме чтения-записи.

action $»Remounting root filesystem in read-write mode: »

mount -n -o remount,rw /

Если посмотреть чуть ниже по файлу аналогичный код можно встретить и для остальных разделов только они проверяются
немного с другими опциями initlog -c «fsck -T -R -A -a $fsckoptions«.

Чуть ниже идет строка убирающая все флаги проверки и перезагрузки rm -f /fastboot /fsckoptions /forcefsck /.autofsck /halt /poweroff и еще дальше по скрипту создается файл сигнализации о чистом выключении системы.

# create the crash indicator flag to warn on crashes, offer fsck with
timeout

touch /.autofsck

Загрузились, поработали пора пришла выключаться. Итак, когда в командной строке набрана команда shutdown или halt начинает выполняться скрипт /etc/rc.d/init.d/halt (для Red Hat клонов ). Разобраться с данным скриптом не составит большого труда поэтому чтобы не занимать зря место остановлюсь лиш на общих вопросах. В файле встречается ссылка на файл /proc/swaps

$ cat /proc/swaps

Filename Type Size Used Priority

/dev/hda6 partition 128484 0 -1

как видите в нем описанные все смонтированные разделы свап. Затем идет ряд на вид ужасных конструкция с применением регулярных выражений основная задача которых найти все смонтированные разделы и корректно их размонтировать. А если уж не получится по хорошему, то с помощью конструкции umount -f file_system и umount -a -f их размонтируют в любом случае. И в самом конце файла встречается наш старый знакомый

# remove the crash indicator flag

rm -f /.autofsck

С помощью которого мы убираем файл указывающий на чистое размонтирование всех файловых систем. Вот и все по работе fsck при загрузке и остановке системы. Но возникает вполне закономерный вопрос связанный с работой данной утилиты с различными ФС и которые к тому же могут изменяться на уже работающей системе. Неужели при добавлении какой то новомодной суперсовременной файловой системы прийдется обновлять данную утилиту, чтобы она могла корректно ее опознать и естественно проверить. А вот и нет. Разработчики не стали усложнять жизнь ни себе ни другим (все тот же принцип KISS) все дело в том, что проверку всех файловых систем данная утилита не проводит, а вызывает для этого специализированную программу проверки отдельно для каждой файловой системы. Так для проверки ext2fs вызывается fsck.ext2 или e2fsck, для ext3 – fsck.ext3, но правда весь секрет состоит в том, что это одна и та же программа имеющая несколько имен путем создания соответствующих ссылок в чем легко убедиться просмотрев номер inоde.

$ ls -i /sbin/e2fsck /sbin/fsck.ext2 /sbin/fsck.ext3

96264 /sbin/e2fsck 96264 /sbin/fsck.ext2 96264 /sbin/fsck.ext3

Как видите он абсолютно одинаков, что правда учитывая похожесть ext2 и ext3 не должно вызывать удивление. А для проверки ReiserFS применяется … правильно /sbin/fsck.reiserfs, которая правда тоже является ссылкой, но символической на программу reiserfsck.

$ ls -l /sbin/fsck.reiserfs

lrwxrwxrwx 1 root root 10 Авг 13 16:11 /sbin/fsck.reiserfs -> reiserfsck

Отсюда простой вывод утилита fsck просто вызывает программу с именем файловой системы и при добавлении новой ничего менять не надо. Просто устанавливаем утилиты которые всегда лежат на сайте производителя и проверяем на всякий случай наличие ссылки на fsck.file_system_name, и все. Естественно можно напрямую запускать эти утилиты для проверки той или иной (но только обязательно размонтированнной) файловой системы, которую как и в Windows рекомендуется проводить не реже чем раз на три месяца. Но только учтите, что дополнительные опции у каждой программы свои и отличаются от опций fsck.

Опции утилиты fsck

-s – Вывод содержимого суперблока перед проверкой ФС
-А – Проверка всех ФС указанных в файле /etc/fstab за один проход
-V – Подробный отчет
-t – fstype Позволяет задать тип ФС иначе команда попытается определить его по файлу /etc/fstab, а если ее там нет то по-умолчанию считается ext2fs. При этом возможно задание нескольких ФС через запятую или использование отрицания ‘no’ или ‘!’
-а – Автоматическое исправление всех ошибок без запроса у пользователя
-r – Запрос подтверждения у пользователя на исправление
-l – Выводит список всех имен файлов в файловой системе
-C – Показ статус бара при проверке (корректно, правда только для ext2fs)
-N – Показ того что было сделано
-P – Параллельная проверка корневой ФС вместе с другими
-R – При проверке всех файловых систем отменяет проверку корневой
-Т – Не показывает при запуске заголовок
-c – Проверка на bad blocks

Переменные используемые утилитой fsck

FSCK_FORCE_ALL_PARALLEL – Будет проверять указанные устройства параллельно (полезно например для RAID)
FSCK_MAX_INST – Позволяет ограничить максимальное число одновременно проверяемых ФС (по-умолчанию 0 т.е. без ограничений)
PATH – Путь для поиска программ и устройств для проверки
FSTAB_FILE – Позволяет заменить /etc/fstab на другой

Код завершения fsck

0 Без ошибок
1 Исправленные ошибки файловой системы
2 Система должна быть перезагружена
4 ошибки файловой системы которые невозможно исправить
8 Операционная ошибка
16 Синтаксическая ошибка
128 Библиотечная ошибка

На этом знакомство с программой fsck пожалуй закончим.

Комментировать

Наверх