Назад | Перейти на главную страницу

Linux: принудительно установить fsck для смонтированной файловой системы, доступной только для чтения?

Я разрабатываю безголовое встраиваемое устройство под управлением CentOS 6.2. Пользователь может подключить клавиатуру, но не монитор, а для последовательной консоли потребуется открыть корпус, чего мы не хотим, чтобы пользователь делал. Все это в значительной степени исключает возможность использования USB-накопителя для восстановления для загрузки, если только он не слепо воссоздает образ жесткого диска. Я хотел бы предоставить некоторые средства восстановления, и я написал инструмент, который появляется на / dev / tty1 вместо getty для обеспечения этих функций.

Одна из таких функций - fsck. Я узнал, как перемонтировать корневую и другие файловые системы в режиме только для чтения. Теперь, когда они доступны только для чтения, их можно безопасно проверить с помощью fsck и затем перезагрузить. К сожалению, fsck жалуется мне, что файловые системы смонтированы, и отказывается что-либо делать.

Как заставить fsck запускаться на смонтированном разделе только для чтения?

Основываясь на моем исследовании, это должно быть что-то неясное. "-f" означает принудительное восстановление чистого (но не смонтированного) раздела. Мне нужно восстановить чистый или нечистый смонтированный раздел. Из того, что я читал, это то, что должны делать «только эксперты», но никто не удосужился объяснить, как это делают эксперты. Я надеюсь, что кто-нибудь сможет мне это рассказать.

Кстати, я заметил, что e2fsck 1.42.4 в Gentoo позволит вам fsck смонтированный раздел, даже смонтированный для чтения и записи, но, похоже, это происходит только в том случае, если fsck запускается с терминала, поэтому он может спросить пользователя, если они уверен, что они хотят сделать что-то настолько опасное. Я не уверен, что версия CentOS делает то же самое, но похоже, что fsck МОЖЕТ восстановить смонтированный раздел, но он категорически отказывается, когда не запускается с терминала.

Последний вариант для меня - скомпилировать собственный взломанный fsck. Но боюсь, что неожиданно все испорчу.

Спасибо!

Примечание: изначально опубликовано Вот.

Обновление: я не думал, что это будет иметь значение в то время, когда я писал это, но, чтобы перемонтировать fs только для чтения, мне пришлось сделать следующее:

echo s > /proc/sysrq-trigger
echo s > /proc/sysrq-trigger
echo u > /proc/sysrq-trigger

Это был единственный способ сделать это. Все остальные жаловались на то, что файловая система занята. Насколько я знаю, это «безопасно», но, вероятно, он немного отличается от обычного подхода. И это может быть причиной, по которой fsck не хочет его ремонтировать. Он все еще думает, что смонтирован для чтения-записи.

Вы жестяная банка 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.

Помните, что перед повторным монтированием чтения-записи вам необходимо перезагрузиться!