本文是博文 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 1
init
重新挂载/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 1
init
会重新挂载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
,以提高可靠性,防止意外修改文件系统。