Linux: Принудительно установить fsck файловой системы, доступной только для чтения?
Я занимаюсь разработкой встроенного безголового устройства под управлением CentOS 6.2. Пользователь может подключить клавиатуру, но не монитор, и последовательная консоль потребует открытия корпуса, чего мы не хотим, чтобы пользователь делал. Все это в значительной степени устраняет возможность использования загрузочного USB-накопителя для загрузки, если только все, что он делает, это слепо перезаписывает жесткий диск. Я хотел бы предоставить некоторые средства восстановления, и я написал инструмент, который появляется на /dev/tty1 вместо getty для обеспечения этих функций.
Одной из таких функций является fsck. Я узнал, как перемонтировать корневую и другие файловые системы только для чтения. Теперь, когда они доступны только для чтения, можно безопасно их fsck и затем перезагрузить. К сожалению, fsck жалуется мне, что файловые системы смонтированы и отказывается что-либо делать.
Как заставить fsck работать на смонтированном разделе только для чтения?
Исходя из моих исследований, это должно быть чем-то неясным. "-f" просто означает принудительное восстановление чистого (но не смонтированного) раздела. Мне нужно починить чистую или нечистую смонтированную перегородку. Из того, что я прочитал, это то, что должны делать "только эксперты", но никто не удосужился объяснить, как это делают эксперты. Я надеюсь, что кто-то может открыть это мне.
Кстати, я заметил, что e2fsck 1.42.4 в Gentoo позволит вам fsck смонтированный раздел, даже смонтированный read-write, но, похоже, он делает это только если fsck запускается из терминала, поэтому он может спросить пользователя, если они Вы уверены, что хотите сделать что-то настолько опасное. Я не уверен, что версия CentOS делает то же самое, но кажется, что fsck может восстановить смонтированный раздел, но он категорически отказывается, когда не запускается из терминала.
Один из последних вариантов для меня - собрать свой собственный взломанный fsck. Но боюсь, я все испорчу каким-то неожиданным образом.
Спасибо!
Примечание: изначально размещено здесь.
Обновление: я не думал, что это будет иметь значение в то время, когда я писал это, но для того, чтобы перемонтировать fs только для чтения, я должен был сделать это:
echo s > /proc/sysrq-trigger
echo s > /proc/sysrq-trigger
echo u > /proc/sysrq-trigger
Это был единственный способ найти это. Все остальное жаловалось на занятость файловой системы. Насколько я знаю, это "безопасно", но, вероятно, немного отличается от обычного подхода. И это может быть причиной того, что fsck не хочет его ремонтировать. Он все еще думает, что он смонтирован для чтения и записи.
3 ответа
Вы можете fsck
файловая система только для чтения, потому что монтирование только для чтения не помечает ее как "грязную", как монтирование для чтения и записи. В кэше записи нет никаких изменений, которые могли бы быть только частично сброшены на диск, поэтому все структуры на диске согласованы и безопасны для fsck
модифицировать.
Однако если fsck
При внесении каких-либо изменений драйвер файловой системы ядра может быть сбит с толку, потому что вещи, которые он ожидал оставить постоянными, вместо этого изменились из-под него. Это не повлияет на целостность самой файловой системы (поскольку драйвер не записывает в нее данные), но может сделать работающую систему нестабильной. Чтобы этого избежать, перезагрузите компьютер, если fsck
внесены какие-либо изменения в вашей файловой системе.
В прошлом я работал над проектом типа "устройства", и я сделал несколько вещей, которые частично решают эту проблему.
У одного устройства было достаточно памяти, поэтому корневая файловая система запускалась непосредственно из initrd. У initrd достаточно fsck (force), затем монтировать "/mounts/persistent" и "/mount/static"; почти все файлы, необходимые после этого, находились в одной из этих двух файловых систем.
Преимущество этого заключалось в том, что корневая файловая система никогда не нуждалась в "исправлении" - если что-то пойдет не так, перезагрузится, и initrd выйдет чистым (поскольку используемая не была на диске). Любые обновления initrd были просто введены (для загрузки доступны предыдущие); любые файлы, не относящиеся к исходному "статическому", необходимые после того, как "обновление прошивки" (= новый initrd) с этого момента пошли на initrd. В любом случае "статическая" файловая система была доступна только для чтения. Необходимо создать резервную копию только постоянной файловой системы и "текущей версии прошивки". У меня были копии всех прошивок до их отправки.
Вы пробовали с -p
или же -y
переключатели? Я всегда делаю это на компьютере без головы Debian, и это работает.
Из справочной страницы fsck.ext2:
-p Automatically repair ("preen") the file system. This option
will cause e2fsck to automatically fix any filesystem problems
that can be safely fixed without human intervention. If e2fsck
discovers a problem which may require the system administrator
to take additional corrective action, e2fsck will print a
description of the problem and then exit with the value 4 logi-
cally or'ed into the exit code. (See the EXIT CODE section.)
This option is normally used by the system's boot scripts. It
may not be specified at the same time as the -n or -y options.
-y Assume an answer of `yes' to all questions; allows e2fsck to be
used non-interactively. This option may not be specified at the
same time as the -n or -p options.
Помните, что вы должны перезагрузиться перед повторным подключением чтения-записи!