在CentOS系统中,grubby是一个专门用于管理和修改内核启动参数的命令行工具,它直接操作GRUB2引导加载程序的配置文件,让你无需手动编辑复杂的grub配置就能快速更新内核启动项。如果你需要给内核添加启动参数、删除参数、设置默认内核或者修改某个内核的启动选项,grubby就是最直接、最安全的方式。比如你想给内核添加"intel_iommu=on"参数来开启IOMMU虚拟化支持,或者添加"nomodeset"来解决显卡驱动问题,一条grubby命令就能搞定,而且重启后立即生效。
grubby工具的基本原理和适用场景
CentOS 7及以上版本默认使用GRUB2作为引导加载程序,内核启动参数存储在/boot/grub2/grub.cfg文件中。但这个文件是自动生成的,手动修改不仅容易出错,而且在执行grub2-mkconfig时会被覆盖。grubby工具的作用就是通过修改/boot/grub2/grubenv和内核配置文件来间接更新grub.cfg,保证修改持久化且不会被覆盖。它适用于所有使用GRUB2的CentOS/RHEL 7、8、9系列系统。
grubby命令的基本语法结构
grubby的命令格式非常直观,核心结构如下:
grubby --update-kernel=ALL|DEFAULT|内核版本号 --args="参数1 参数2" --remove-args="参数"
其中--update-kernel指定要修改哪个内核,ALL表示所有已安装的内核,DEFAULT表示当前默认内核,也可以指定具体的内核版本号比如--update-kernel=/boot/vmlinuz-3.10.0-1160.el7.x86_64。--args用来添加参数,--remove-args用来删除参数。参数之间用空格分隔,多个参数需要用引号包裹。
查看当前内核和启动参数
在修改之前,你需要先了解当前系统的内核情况。使用以下命令查看所有已安装的内核:
grubby --info=ALL
这会列出每个内核的路径、索引号、内核版本、initramfs路径以及当前的启动参数。如果你只想看默认内核的信息:
grubby --info=DEFAULT
输出示例通常包含类似这样的内容:index=0, kernel="/boot/vmlinuz-3.10.0-1160.el7.x86_64", args="ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet",这些args后面的内容就是当前的启动参数。
添加内核启动参数的具体操作
这是最常见的使用场景。假设你需要为所有内核添加"intel_iommu=on iommu=pt"这两个参数来支持PCI设备直通:
grubby --update-kernel=ALL --args="intel_iommu=on iommu=pt"
如果你只想修改默认内核:
grubby --update-kernel=DEFAULT --args="intel_iommu=on iommu=pt"
执行完成后,用grubby --info=ALL再次查看,确认参数已经添加到args字段中。注意,grubby会自动去重,如果参数已经存在就不会重复添加。
再比如你需要添加"nomodeset"参数来解决某些服务器显卡驱动不兼容导致的黑屏问题:
grubby --update-kernel=ALL --args="nomodeset"
删除内核启动参数
如果某个参数导致了系统启动异常,你需要将其删除。比如要删除之前添加的"nomodeset":
grubby --update-kernel=ALL --remove-args="nomodeset"
你也可以一次性删除多个参数,用空格分隔:
grubby --update-kernel=ALL --remove-args="param1 param2 param3"
设置默认启动内核
当系统安装了多个内核时,你可能需要指定默认从哪个内核启动。先查看内核列表获取索引号:
grubby --info=ALL | grep ^index
然后设置默认内核,比如设置索引为2的内核为默认:
grubby --set-default-index=2
或者直接指定内核路径:
grubby --set-default=/boot/vmlinuz-3.10.0-1160.el7.x86_64
修改指定内核的启动参数(精确到单个内核)
有时候你不想影响所有内核,只想修改某一个特定版本的内核参数。这时需要指定完整的内核路径:
grubby --update-kernel=/boot/vmlinuz-3.10.0-1160.el7.x86_64 --args="net.ifnames=0 biosdevname=0"
这个例子是将网卡命名方式改回传统的eth0、eth1格式,而不是新的ens33、ens192格式。这种精确修改在多内核环境中非常有用,比如你在测试新内核但不想影响生产内核的配置。
grubby修改后如何验证和生效
grubby命令执行后修改会立即写入grubenv和相关配置,但需要重启系统才能让新参数生效。重启前建议做一次验证:
grubby --info=ALL
确认参数已经正确写入。重启后可以通过以下命令查看当前运行内核的实际参数:
cat /proc/cmdline
这个文件显示的是当前正在运行的内核实际使用的启动参数,和grubby中显示的args应该一致。如果不一致,说明可能有其他地方覆盖了参数,需要排查。
grubby与手动编辑grub配置的对比
很多运维人员习惯直接编辑/etc/default/grub然后运行grub2-mkconfig,这种方式在CentOS 7上可行,但在CentOS 8/9上已经不推荐,因为grub.cfg的生成逻辑更加复杂。grubby的优势在于:第一,它直接操作内核条目级别,不会误改其他配置;第二,修改后不会被grub2-mkconfig覆盖;第三,支持针对单个内核精确修改;第四,命令简单不容易出错。手动编辑方式的风险在于一旦写错grub.cfg可能导致系统无法启动,而grubby有内置的安全检查机制。
常见的内核启动参数实用场景汇总
在实际运维中,以下是一些高频使用的内核参数及其用途:
1. "intel_iommu=on"或"amd_iommu=on":开启IOMMU硬件虚拟化,KVM虚拟机做设备直通时必须开启。
2. "iommu=pt":IOMMU直通模式,性能更好,适合PCI设备直通场景。
3. "nomodeset":禁用内核模式设置,解决显卡驱动不兼容导致的启动黑屏。
4. "net.ifnames=0 biosdevname=0":恢复传统网卡命名规则。
5. "crashkernel=auto"或"crashkernel=512M":配置内核崩溃转储内存大小。
6. "transparent_hugepage=never":关闭透明大页,数据库服务器常用优化项。
7. "elevator=noop"或"elevator=deadline":修改磁盘IO调度算法,SSD推荐noop,机械盘推荐deadline。
8. "console=ttyS0,115200":配置串口控制台,远程管理服务器时非常关键。
使用grubby批量添加这些参数的示例:
grubby --update-kernel=ALL --args="transparent_hugepage=never elevator=noop console=ttyS0,115200"
CentOS 8和9中grubby的变化
CentOS 8和9中grubby依然可用,但需要注意:默认的grub配置目录从/boot/grub2变成了/boot/grub2(路径相同但配置结构有调整),而且/etc/default/grub文件在某些最小安装中可能不存在。grubby在这些版本中仍然是官方推荐的内核参数修改工具,但如果系统使用了BLS(Boot Loader Specification)方式管理引导,grubby的行为可能会有细微差异。建议在操作前先用grubby --info=ALL确认当前引导配置方式。
grubby操作的注意事项和最佳实践
第一,修改前务必备份当前grubenv文件:cp /boot/grub2/grubenv /boot/grub2/grubenv.bak,万一出问题可以恢复。
第二,不要随意删除ro(只读)或root=这类核心参数,这些参数一旦丢失系统将无法找到根文件系统导致启动失败。
第三,批量修改ALL内核时要谨慎,特别是生产环境,建议先在一个内核上测试,确认没问题后再批量应用。
第四,修改完成后一定要重启验证,不要只看grubby --info的输出就认为万事大吉,实际运行参数以/proc/cmdline为准。
第五,如果系统使用了dracut生成initramfs,某些涉及存储和网络的参数修改后可能需要重新生成initramfs:dracut -f /boot/initramfs-$(uname -r).img $(uname -r)。
grubby在自动化运维中的应用
在大规模服务器管理中,grubby非常适合写入自动化脚本。比如你需要批量为100台CentOS服务器开启IOMMU,可以写一个简单的Shell脚本:
#!/bin/bash
grubby --update-kernel=ALL --args="intel_iommu=on iommu=pt"
if [ $? -eq 0 ]; then
echo "参数添加成功,请重启生效"
grubby --info=DEFAULT
else
echo "参数添加失败,请检查"
fi这种方式比手动登录每台服务器编辑配置高效得多,也降低了人为操作失误的风险。
总结
grubby是CentOS运维中修改内核启动参数最高效、最安全的工具。它操作简单、支持精确到单个内核的修改、修改持久不会被覆盖,特别适合生产环境使用。掌握grubby的常用命令和参数含义,能够帮助运维人员快速解决内核启动相关问题,无论是开启硬件虚拟化、修复显卡驱动、调整IO调度还是配置串口控制台,都能通过几条命令完成。建议每个CentOS运维人员都将grubby作为日常工具熟练使用。
