3. 常用启动参数详解(上):root、ro、rw、quiet、splash
启动参数这东西,说白了就是你在 GRUB 界面按 e 之后,往 linux 那一行末尾加的那些字符串。每个参数都像一把钥匙,能打开内核某个行为开关。今天我们先聊几个最基础的——它们几乎出现在每一台 Linux 机器的启动命令行里。
3.1 root:告诉内核根文件系统在哪
root= 是启动参数里最重要的一个,没有之一。内核启动后要挂载根文件系统,它得知道设备在哪。这个参数就是干这个的。
核心作用:指定根文件系统所在设备,内核据此挂载 /。
写法有好几种,我列个表给你看:
| 写法 | 示例 | 说明 |
|---|---|---|
| 设备节点 | root=/dev/sda2 |
传统方式,依赖设备名顺序 |
| UUID | root=UUID=xxxx-xxxx |
推荐方式,不依赖设备名 |
| PARTUUID | root=PARTUUID=xxxx |
GPT 分区表专用,更稳定 |
| LABEL | root=LABEL=rootfs |
按卷标识别,适合固定环境 |
我个人习惯用 UUID。为什么?因为设备名会变。你插个 U 盘,/dev/sda 可能就变成 /dev/sdb 了。UUID 是分区格式化时生成的唯一标识,只要不重新格式化,它就不会变。
小技巧:用 blkid 命令可以查看所有分区的 UUID。比如 blkid /dev/sda2,输出里直接复制那串 UUID 就行。
我在项目中遇到过一台服务器,每次重启后根分区就挂载失败。查了半天,发现是 BIOS 检测硬盘顺序偶尔会变,导致 /dev/sda2 指向了别的分区。改成 UUID 后,问题再没出现过。
3.2 ro 与 rw:根文件系统的挂载模式
这两个参数控制根文件系统挂载时的读写权限。它们通常紧跟在 root= 后面。
ro:只读挂载
ro 让内核以只读方式挂载根文件系统。你可能会问:系统启动后不是要写日志、创建临时文件吗?只读怎么用?
嗯,这里要注意。内核在挂载根文件系统后,会先做一系列检查(比如 fsck),然后才由 init 系统重新挂载为读写。所以 ro 只是启动阶段的保护措施——防止在文件系统检查还没完成时,就有进程往里写数据。
避坑:如果你在 ro 模式下强制写文件,内核会报 Read-only file system 错误。这不是 bug,是保护机制在起作用。
rw:直接读写挂载
rw 就简单了——内核直接以读写模式挂载根文件系统。跳过只读阶段,启动速度会快一点点,但风险也大:如果文件系统有损坏,写操作可能加剧问题。
我曾经在一台嵌入式设备上为了省那 0.5 秒的启动时间,用了 rw。结果有一次意外断电,文件系统元数据损坏,系统直接起不来了。从那以后,我老老实实改回 ro,让 fsck 先跑一遍再说。
| 参数 | 行为 | 适用场景 |
|---|---|---|
ro |
只读挂载,启动后由 init 重新挂载为读写 | 生产环境、需要 fsck 检查的场景 |
rw |
直接读写挂载,跳过只读阶段 | 开发调试、追求极致启动速度 |
3.3 quiet:让内核闭嘴
quiet 的意思是「安静模式」。加了它,内核启动时的日志输出会被大幅压缩——只显示严重错误级别的信息。
你想想看,没有 quiet 的时候,启动时满屏滚动的内核消息,密密麻麻的。普通用户看到会慌,运维人员看着也烦。加上 quiet,屏幕就干净多了,只留一个漂亮的启动画面或者简单的进度条。
注意:quiet 只是抑制了控制台输出,日志仍然会写入内核环形缓冲区。你可以用 dmesg 命令查看完整的启动日志。
但调试的时候千万别加 quiet。我记得有一次排查内核 panic,对方说「启动到一半就黑了,什么提示都没有」。我问「你加了 quiet 吧?」他说「是啊,为了好看」。去掉 quiet 之后,panic 信息直接打印在屏幕上,问题五分钟就定位了。
3.4 splash:启动画面的开关
splash 通常和 quiet 配合使用。它告诉内核:启动时显示一个图形化的启动画面(比如发行版的 logo + 进度条)。
这个参数本身不干活,它只是一个标志。真正绘制启动画面的是用户空间的 plymouth 或 fbsplash 服务。splash 的作用是让这些服务知道「现在可以接管屏幕了」。
| 组合 | 效果 |
|---|---|
| 不加任何参数 | 满屏内核日志滚动 |
只加 quiet |
日志被抑制,屏幕基本空白或显示少量信息 |
quiet splash |
显示图形化启动画面,用户看不到任何日志 |
调试建议:排查启动问题时,去掉 quiet 和 splash,让内核把完整日志打印出来。这是最直接的排错手段。
3.5 这些参数是怎么配合的?
光说单个参数没意思,我们看看它们在实际启动流程中是怎么协作的。下面这张图能帮你理清关系:
流程其实不复杂:GRUB 把参数传给内核,内核根据 root= 找到设备,按 ro 或 rw 挂载,然后根据 quiet 和 splash 决定怎么输出信息。最后 init 系统接管,把根文件系统重新挂载为读写,启动画面也由用户空间的服务来绘制。
3.6 实战:在 GRUB 中配置这些参数
说了这么多,怎么改?以最常见的 GRUB2 为例:
# 编辑 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="root=UUID=abcdef12-3456-7890-abcd-ef1234567890 ro"
# 更新 GRUB 配置
sudo update-grub # Debian/Ubuntu
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
这里有两个变量:
GRUB_CMDLINE_LINUX_DEFAULT:正常启动时使用的参数GRUB_CMDLINE_LINUX:所有启动项都会包含的参数
我个人习惯把 root= 和 ro 放在 GRUB_CMDLINE_LINUX 里,确保恢复模式也有正确的根设备。而 quiet splash 这种「美化类」参数,只放在默认启动项里。
重要:修改 /etc/default/grub 后,一定要执行 update-grub 或对应的命令。否则配置不会生效。我见过有人改完文件就重启,然后说「怎么没变化?」——嗯,你猜怎么着。
3.7 避坑总结
最后,把我这些年踩过的坑整理一下:
- 不要用设备节点名指定 root——设备顺序会变,UUID 才是王道。
- 生产环境用 ro,别用 rw——多花 0.3 秒做 fsck,比系统挂了再修划算得多。
- 排查问题去掉 quiet 和 splash——日志是排错的第一手资料,别藏着掖着。
- 改完 GRUB 配置记得 update-grub——这步忘了,改再多都是白搭。
这些基础参数看着简单,但用对了能省很多事。下一组参数我们聊 init、systemd.unit 和 single——它们决定了系统启动后跑什么、怎么跑。到时候你会发现,启动参数的玩法比想象中多得多。