我正在开发一个运行CentOS 6.2的无头embedded式设备。 用户可以连接键盘,但不能连接显示器,而串行控制台则需要打开机箱,这是我们不希望用户必须做的事情。 这几乎避免了使用恢复USB驱动器启动的可能性,除非所有操作都是盲目地重新映像硬盘。 我想提供一些恢复设施,并且我已经写了一个工具,它在/ dev / tty1上代替getty来提供这些function。
一个这样的函数是fsck。 我已经find了如何重新挂载根和其他文件系统只读。 现在,它们是只读的,应该安全起见,然后重新启动。 不幸的是,fsck向我抱怨文件系统已经挂载,拒绝做任何事情。
我怎样才能强制fsck运行在一个只读的挂载分区?
根据我的研究,这将是一个晦涩难懂的事情。 “-f”只是意味着强制修复干净的(但是未安装的)分区。 我需要修复干净或不洁的安装分区。 根据我所读到的,这是“只有专家”应该做的事情,但是没有人花时间来解释专家是如何做的。 我希望有人可以透露给我。
顺便说一句,我注意到在Gentoo上的e2fsck 1.42.4会让你fsck挂载的分区,甚至挂载读写,但似乎只有这样做,如果fsck从terminal运行,所以它可以问用户,如果他们“确定他们想做一件如此危险的事情。 我不确定CentOS版本是否做同样的事情,但似乎fsck可以修复一个挂载的分区,但当它不能从terminal运行的时候,它肯定会拒绝。
最后一个select是我编译我自己的黑客fsck。 但恐怕我会以一种意想不到的方式搞砸了。
谢谢!
注意:原贴在这里 。
更新:在我写这个的时候,我不认为这是重要的,但是为了重新安装fs只读,我必须这样做:
echo s > /proc/sysrq-trigger echo s > /proc/sysrq-trigger echo u > /proc/sysrq-trigger
这是我能find的唯一方法。 其他所有人都抱怨文件系统正忙。 据我所知,这是“安全的”,但它可能与通常的方法稍有不同。 这可能是fsck不想修复它的原因。 它仍然认为它挂载了读写。
你可以 fsck一个只读文件系统,因为挂载只读不会像读写挂载那样标记为“脏”。 写入caching中没有任何更改,可能只是部分刷新到磁盘,因此所有的磁盘上结构都是一致的,可以安全地用于fsck修改。
但是,如果fsck做出任何更改,那么内核的文件系统驱动程序可能会变得混乱,因为它预期保持不变的东西改变了。 这不会影响文件系统本身的完整性(因为驱动程序没有写入),但可能会使系统运行不稳定。 为了避免这种情况,如果fsck对文件系统进行了任何更改,则应该重新启动。
过去一直在做“家电”式的项目,我做了一些部分解决这类问题的事情。
一个设备有足够的内存,所以根文件系统直接从initrd运行。 initrd有足够的fsck(force),然后挂载“/ mounts / persistent”和“/ mount / static”; 几乎所有需要的文件都在这两个文件系统中的一个上。
这有一个好处,即根文件系统从不需要“修复” – 如果出现任何问题,它将重新启动,并且initrd变得干净(因为正在使用的不是磁盘上的那个)。 initrd的任何更新都已经到位(以前的更新可用于引导)。 任何在“固件升级”(= new 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.
请记住,在重新读写之前必须重新启动!