要将已安装的文件系统重新挂载为只读,我可以使用以下命令:
mount -o remount,ro /foo
例如,这在关闭序列中使用,其中根文件系统 ( /
) 在调用之前以只读方式重新安装halt/reboot
。
重新挂载为只读实际上有什么作用?它是否会更改内核中的某些“标志”,从而导致写入被拒绝?
编写自己的程序,除了将给定的文件系统重新挂载为只读之外什么都不做,会有多困难?
答案1
挂载或重新挂载文件系统是使用mount(2)
系统调用。重新挂载时,它会获取目标位置(挂载点)、挂载操作中使用的标志以及用于所涉及的特定文件系统的任何额外数据。当以只读方式重新安装时,使用的标志是MS_RDONLY
和MS_REMOUNT
;您还应该提供首次安装文件系统时使用的任何其他标志。
在执行一些清理操作(基本上完成所有未完成的写入)之后,以只读方式重新挂载文件系统确实会在内核的文件系统数据结构中设置一个标志。你可以看到它是如何处理的源ext4
代码:如果ext4
文件系统以读写方式挂载,然后以只读方式重新挂载,则文件系统将同步,配额将暂停,并s_flags
更新超级块结构以指示文件系统为只读。然后在整个内核中使用它来拒绝写入;参见例如sb_permission
这会阻止对只读文件系统的写访问。
如果您想自己执行此操作,可以尝试mount()
根据上面链接的联机帮助页使用适当的选项进行调用。对于完整的解决方案,我相信您需要确定当前的安装标志并更新它们,但是您可以硬编码一个简单的程序以匹配您的文件系统当前安装的内容...