mount -o remount,ro / 实际上做了什么(在引擎盖下)

Mar*_*ter 7 shutdown kernel mount readonly root-filesystem

要将已挂载的文件系统重新挂载为只读,我可以使用以下命令:

mount -o remount,ro /foo
Run Code Online (Sandbox Code Playgroud)

这用于例如关闭序列中,其中根文件系统 ( /) 以只读方式重新安装,就在halt/reboot调用之前。

实际上重新挂载为只读有什么作用?它是否会更改内核中的某些“标志”,从而拒绝写入?

编写自己的程序除了将给定的文件系统重新挂载为只读之外什么都不做会有多困难?

Ste*_*itt 11

挂载或重新挂载文件系统是使用mount(2)系统调用完成的。重新挂载时,这需要目标位置(挂载点)、挂载操作中要使用的标志以及用于所涉及的特定文件系统的任何额外数据。重新挂载只读时,使用的标志是MS_RDONLYand MS_REMOUNT; 您还应该提供首次安装文件系统时使用的任何其他标志。

在执行一些清理(基本上完成任何未完成的写入)后,重新挂载只读文件系统确实会在内核的文件系统数据结构中设置一个标志。您可以在源代码中看到它是如何处理ext4:如果ext4文件系统以读写方式挂载,然后以只读方式重新挂载,则文件系统将同步,配额被暂停,并s_flags在超级块结构中更新以指示文件系统是只读的. 然后在整个内核中使用它来拒绝写入;例如sb_permission,请参阅防止对只读文件系统进行写访问的示例。

如果您想自己执行此操作,可以尝试mount()按照上面链接的联机帮助页使用适当的选项进行调用。对于完整的解决方案,我相信您需要确定当前的挂载标志并更新它们,但是您可以硬编码一个简单的程序来匹配您当前安装的文件系统...

  • 内核会为你完成这一切,你需要做的就是调用`mount()`。 (2认同)