相关这个问题:有一个必须以只读方式安装的根文件系统(假设它完全损坏),我可以重新格式化分区或dd
在其上使用较旧的备份映像(然后重新启动)吗?
我想文件系统在安装时不会喜欢那些根本性的改变(即使是只读的)。
或者,作为一个类似的问题:除了交互式运行 fsck(即使用其他工具对分区数据执行永久更改)之外,是否还有其他可能性来修复错误的根文件系统?
答案1
好吧,除了交互式运行之外,您可以尝试fsck -y
像我在另一个问题中的回答一样:-P
如果您想要dd
在 rootfs 之上创建一个映像,最好的选择是在挂载 rootfs 之前从 initramfs 执行此操作。
你能在系统启动到该 rootfs 的情况下执行此操作,但这是 Unix 为您提供绳索的事情之一(循环已经很好地为您绑住了)。文件系统根本不喜欢它(“嘿,我期望那里有一个索引节点,这是什么垃圾?!”)。确保其真正只读,例如,没有日志重播。
如果您避免访问文件系统,您可能会逃脱惩罚。这意味着您的源映像不能位于 rootfs 上。那真是个糟糕的主意。
运行 dd 后,shutdown -r now
将不起作用(也不起作用,包括ls
和cat
)。相反,我建议您使用看门狗(甚至是软狗)来强制重置,或者使用/proc/sysrq-trigger
—echo
通常是 shell 内置命令,因此您仍然应该能够运行echo
.
我不确定你在做什么,但听起来你可能正在建造某种设备。您应该考虑保留只读 rootfs,并使用覆盖(union mounts、aufs 等)来进行更改,类似于 livecd 的工作方式。或者,也可以拥有一个仅用于备份或恢复的 rootfs(类似于许多 Android 手机的工作方式)。
答案2
你可以试试。但是,我强烈建议不要这样做。这可能会使您正在运行的程序崩溃,因为内核可能会从内存中卸载部分程序,然后从原始文件中重新加载它们。确保将程序及其正在使用的任何文件(特别是包括所有共享库)复制到不同的文件系统(可以是 tmpfs 文件系统)。
从理论上讲,最糟糕的情况是您最终读取到错误的数据。由于某些时候出现错误,文件系统可能会以只读方式重新安装。实际上,您可能最终会导致内核崩溃。无论如何,您最终都有一个无法使用的文件系统的巨大风险。
如果要对根分区执行 fsck,请从 initramfs 执行。而我第二德罗伯特的推荐通过联合文件系统增强的只读根文件系统。