我正在开发一款无头嵌入式设备,运行 CentOS 6.2。用户可以连接键盘,但不能连接显示器,而串行控制台需要打开机箱,我们不希望用户这样做。这几乎消除了使用恢复 USB 驱动器进行启动的可能性,除非它所做的只是盲目地重新映像硬盘驱动器。我想提供一些恢复功能,并且我已经编写了一个在 /dev/tty1 上代替 getty 的工具来提供这些功能。
其中一个功能是 fsck。我已经找到了如何将根文件系统和其他文件系统重新挂载为只读。现在它们是只读的,对它们进行 fsck 然后重新启动应该是安全的。不幸的是,fsck 向我抱怨文件系统已挂载并拒绝执行任何操作。
如何强制 fsck 在只读挂载分区上运行?
根据我的研究,这肯定是件不太容易理解的事情。“-f”只是表示强制修复干净的(但未挂载)分区。我需要修复干净或未挂载的分区。据我所知,这是“只有专家”才能做的事情,但没有人费心解释专家是如何做到的。我希望有人能告诉我这一点。
顺便说一句,我注意到 Gentoo 上的 e2fsck 1.42.4 允许您对已挂载的分区进行 fsck,即使是以读写方式挂载的分区,但似乎只有在从终端运行 fsck 时才会这样做,因此它会询问用户是否确定要执行如此危险的操作。我不确定 CentOS 版本是否做同样的事情,但看起来 fsck 可以修复已挂载的分区,但当不是从终端运行时,它会断然拒绝。
最后一个选择是我自己编译一个破解版的 fsck。但我担心会以意想不到的方式搞砸它。
谢谢!
注:原文发布这里。
更新:我写这篇文章的时候并不认为这有什么关系,但是为了以只读方式重新挂载 fs,我必须这样做:
echo s > /proc/sysrq-trigger
echo s > /proc/sysrq-trigger
echo u > /proc/sysrq-trigger
那是我能找到的唯一方法。其他一切都抱怨文件系统繁忙。据我所知,这是“安全的”,但它的重新安装方式可能与通常的方法略有不同。这可能是 fsck 不想修复它的原因。它仍然认为它是以读写方式安装的。
答案1
你能 fsck
只读文件系统,因为以只读方式挂载不会像以读写方式挂载那样将其标记为“脏”。写入缓存中没有可能仅部分刷新到磁盘的更改,因此所有磁盘上的结构都是一致的并且可以安全地fsck
进行修改。
但是,如果fsck
进行任何更改,内核的文件系统驱动程序可能会变得混乱,因为它预期保持不变的内容反而发生了变化。这不会影响文件系统本身的完整性(因为驱动程序不会写入它),但可能会使正在运行的系统不稳定。为避免这种情况,如果fsck
对文件系统进行了任何更改,您应该重新启动。
答案2
过去我曾参与过“家电”类型的项目,并做了一些事情来部分解决此类问题。
一个设备有足够的内存,因此根文件系统直接从 initrd 运行。initrd 有足够的内存来 fsck(强制),然后挂载“/mounts/persistent”和“/mount/static”;此后所需的几乎所有文件都在这两个文件系统之一上。
这样做的好处是根文件系统永远不需要“修复”——如果出现任何问题,它会重新启动,并且 initrd 会恢复正常(因为正在使用的不是磁盘上的)。对 initrd 的任何更新都只是到位(以前的更新可用,用于启动);从那时起,“固件升级”(=新 initrd)后所需的任何不在原始“静态”上的文件都会转到 initrd 上。无论如何,“静态”文件系统都是只读的。只需要备份持久文件系统和“当前固件版本”。在发送之前,我有所有固件的副本。
答案3
您尝试过使用-p
或-y
开关吗?我总是在 Debian 无头机上这样做,而且有效。
-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.
请记住,重新安装读写之前必须重新启动!