本文是博文 https://blog.csdn.net/wenhao_ir/article/details/146051313 的子博文。
在 Linux 启动过程中,默认情况下 init 进程可能会重新挂载根文件系统,这是因为 内核最初挂载根文件系统的方式可能不符合用户空间的需求。
1. Linux 启动时的根文件系统挂载流程
-
内核挂载根文件系统
- 内核根据
bootargs里的root=选项找到根文件系统设备,并尝试挂载它。 - 例如:
root=/dev/mmcblk1p2 rootwait rw - 这表示 内核会挂载
/dev/mmcblk1p2作为根文件系统,并设置为读写模式(rw)。
- 内核根据
-
init可能重新挂载- 进入用户空间后,
init进程(比如systemd或init脚本)可能会 重新挂载根文件系统,原因包括:- 需要挂载为 只读(ro) 进行完整性检查
- 需要进行 文件系统修复(fsck)
- 需要 调整挂载选项(如启用 journaling 或其他参数)
- 具体方式取决于
/etc/fstab里的配置。例如:
这会让/dev/mmcblk1p2 / ext4 ro 0 1init重新挂载/dev/mmcblk1p2为 只读(ro)。
- 进入用户空间后,
-
init可能执行mount -o remount- 一些系统 启动时默认挂载根文件系统为只读,然后
init在适当的时候 重新挂载为读写:mount -o remount,rw / - 这样可以确保文件系统在启动时得到保护,并且
fsck检查完成后才进入读写模式。
- 一些系统 启动时默认挂载根文件系统为只读,然后
2. 为什么 init 需要重新挂载?
- 文件系统检查(fsck)
- 某些系统在启动时会先以 只读模式(ro) 挂载根文件系统,以便
fsck检查并修复错误,确保数据完整性。
- 某些系统在启动时会先以 只读模式(ro) 挂载根文件系统,以便
- 日志文件系统(Journaling)调整
- 部分文件系统(如
ext4)可能需要在init阶段调整日志模式或启用barrier等选项,因此init会重新挂载。
- 部分文件系统(如
- 系统安全和完整性
- 在某些嵌入式系统中,默认以 只读模式(ro) 运行,以防止意外修改系统文件,
init可能在需要时切换为读写模式(rw)。
- 在某些嵌入式系统中,默认以 只读模式(ro) 运行,以防止意外修改系统文件,
- 挂载选项调整
init可能根据/etc/fstab里的配置改变挂载方式,例如:
这样/dev/mmcblk1p2 / ext4 defaults,noatime 0 1init会重新挂载mmcblk1p2并启用noatime选项。
3. rw 在 u-boot的bootargs 中的作用
rw让 内核直接以读写模式(rw)挂载根文件系统,避免init重新挂载。- 但即使
bootargs里写了rw,init仍然可以在启动过程中重新挂载根文件系统(通常基于/etc/fstab配置)。 - 如果
bootargs里是ro,那么init可能会 检查文件系统后再挂载为rw。
4. 结论
- Linux 内核挂载根文件系统后,
init可能会根据需要重新挂载(remount)。 - 如果
bootargs里是rw,内核会直接以读写模式挂载,但init仍然可以重新挂载。 - 如果
bootargs里是ro,系统可能会先进行fsck,然后init在适当的时候remount rw。 - 嵌入式系统有时会默认
ro,以提高可靠性,防止意外修改文件系统。
