cat /proc/cmdline是唯一可信的当前内核启动参数来源,它原样记录内核实际接收的原始参数,不依赖配置文件或shell解析;而/etc/default/grub中的GRUB_CMDLINE_LINUX仅为模板,必须执行grub2-mkconfig -o /boot/grub2/grub.cfg才能生效。

直接改 /etc/default/grub 里的 GRUB_CMDLINE_LINUX,然后运行 grub2-mkconfig 生效 —— 这是唯一可靠、持久的方式。临时改启动参数(比如进单用户模式时加 rd.break)不会保存,重启就丢。
怎么找到当前生效的内核启动参数
用 cat /proc/cmdline 看当前运行内核实际加载的参数,这是最准的。它和 /etc/default/grub 里的 GRUB_CMDLINE_LINUX 不一定一致 —— 后者只是模板,没执行 grub2-mkconfig 就不会写入 /boot/grub2/grub.cfg。
常见误操作:改完 /etc/default/grub 忘了重生成配置,导致参数完全不生效。
-
grub2-editenv list只显示默认启动项,不显示启动参数 -
cat /boot/grub2/grub.cfg | grep linux16能看到已编译进配置的参数,但它是只读输出,不能直接编辑
修改 GRUB_CMDLINE_LINUX 的关键注意事项
这个字段是空格分隔的键值对集合,所有参数都会被加到每个内核启动行末尾。别手抖多加引号或换行,否则 GRUB 解析失败,系统可能卡在启动菜单。
- 追加参数时,用空格分隔,例如:
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifnames=0 biosdevname=0" - 删除某个参数,必须完整删掉对应键值对(如去掉
rhgb就删掉整个rhgb,不是只删=后面) -
rd.break、init=/bin/bash这类调试参数绝对不要写进这里,它们会破坏正常启动流程 - 如果用了 SELinux,加
selinux=0会彻底禁用,比enforcing=0更激进,慎用
为什么必须运行 grub2-mkconfig
/etc/default/grub 是模板,/boot/grub2/grub.cfg 才是 GRUB2 实际读取的配置文件。不执行 grub2-mkconfig -o /boot/grub2/grub.cfg,改再多次模板也白搭。
- 执行前建议先备份:
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak - 命令成功后会打印
Found linux image: ...列出所有检测到的内核,确认你改的参数出现在每一行末尾 - 如果报错 “permission denied”,说明你没用 root 权限;如果提示 “no such file or directory”,检查
/boot/grub2/是否存在且可写
改完不生效?优先排查这三处
多数问题出在路径、权限或缓存上,而不是语法本身。
- 确认改的是
/etc/default/grub,不是/boot/grub2/grub.cfg(后者是自动生成的,手动改会被覆盖) - 确认执行了
grub2-mkconfig -o /boot/grub2/grub.cfg,且返回done - 重启后仍没生效?用
cat /proc/cmdline对比,如果还是旧参数,说明配置没刷进去 —— 很可能是/boot分区满了,grub2-mkconfig写失败但没报错
最隐蔽的坑:某些云厂商镜像或定制 ISO 会把 /boot 挂为只读,grub2-mkconfig 看似成功,其实根本没写入。遇到这种情况,先 mount -o remount,rw /boot 再试。


















