探索布莱恩·沃德 (Brian Ward) 所著的《Linux 工作原理》这本书,我通常对此毫无疑问。但是这个。在“6.7.0 关闭系统”中有一个有序的作业列表。
以只读模式 (6) 重新挂载根文件系统后,通过同步程序 (7) 写入缓冲数据。
以只读模式挂载后如何在文件系统中写入数据?可能是一个错误,正确的顺序是首先写入缓冲区(7)然后卸载(5)并重新安装(6)?
1. init asks every process to shut down cleanly.
2. If a process doesn’t respond after a while, init kills it, first
trying a TERM signal.
3. If the TERM signal doesn’t work, init uses the KILL signal on any
stragglers.
4. The system locks system files into place and makes other preparations
for shutdown.
5. The system unmounts all filesystems other than the root.
6. The system remounts the root filesystem read-only.
7. The system writes all buffered data out to the filesystem with the
sync program.
8. The final step is to tell the kernel to reboot or stop with the
reboot(2) system call. This can be done by init or an auxiliary program
such as reboot, halt, or poweroff.
PS 这本书太棒了,这是几个章节中唯一解决的问题。
有文件系统驱动程序(它将某些块存储介质上的块转换为目录和文件),并且在其下面有一个缓存层(以便您可以快速将数据写入存储介质,并继续执行其他操作,而内核实际上需要关心在后台将数据写入存储设备,因为这通常相对较慢)。
sync
确保仍在该缓存层中的所有内容都写入存储。因此,如果您愿意的话,这是关于文件系统“下方”的数据。
只读是挂载点的一个属性。换句话说,您无法通过挂载(点)更改文件系统。这并不意味着较低层(例如块层或缓存层)不能对文件系统进行任何更改。(可能实际上并不存在缓存层之类的东西。我猜,更像是块层负责缓存。)
为了防止对文件系统进行任何潜在的更改,分区或驱动器本身需要通过某种方式设为只读。
blockdev --setro
(甚至可能不会“切断”任何缓冲数据刷新到设备上的效果。它可能需要设备本身禁止对其任何逻辑块的写访问。)从文件和目录的角度来看,您对它们所做的更改不会因为它们是否已写入实际存储而有所不同。换句话说,除非文件系统驱动程序以某种“同步模式”运行(如果有的话),您从文件中读取的内容可能仍然在写入缓冲区/缓存中,直到从文件系统驱动程序一直向下刷新。
sync -f path/to/mountpoint
请求文件系统驱动程序(例如)。(不过,由于其他原因,刷新可能会在幕后发生。)我确实想知道在 Linux 中,在以只读模式重新挂载挂载后,是否真的需要任何显式同步/刷新。我会有点惊讶的是,它不会导致像卸载这样的隐含问题。