Linux 系统的启动过程相较于其他操作系统略为复杂,其内核在启动过程中可以接受众多参数的控制。通过启动命令行,就可以在系统启动时为内核提供众多初始信息。
可以将这些参数视为在操作系统开始运行之前向内核发出的特殊指令。
通过这些参数,可以告诉内核:
- 根文件系统位于哪个磁盘
- 需要使用多少内存
- 是否加载某些硬件功能
- 甚至如何处理启动过程中的错误
没有它们,内核就不知道如何正确初始化系统。
1] 系统参数的来源
启动参数通常由引导加载程序提供。引导加载程序是一个在计算机启动后立即运行的小程序,其任务是将内核加载到内存中。
- 在大多数现代 Linux 发行版中,该引导加载程序是 GRUB(GRand Unified Bootloader)
- 一些轻量级发行版可能使用 Syslinux 或 LILO
当引导加载程序将控制权移交给内核时,它也会传递这些启动时参数给内核。
图.1 Linux 主机启动顺序示意图
一个简单的 GRUB 启动参数示例如下:
linux /vmlinuz-6.x root=/dev/sda1 ro quiet splash
执行过程如下:
- root=/dev/sda1 → 告知内核根文件系统的位置
- ro → 首先将根文件系统挂载为只读
- quiet → 隐藏大多数启动信息,以实现更简洁的启动
- splash → 显示启动画面而不是文本
因此,在 Linux 开始初始化服务之前,内核就已经知道该做什么了。
2] 启动参数的组织方式
启动参数并非只是随机切换的参数;它们根据其控制系统的各个部分被组织成不同的类别。
让我们来深入讲解一下。
1. 系统基础部分
这个部分会传递给内核如何启动系统以及根文件系统位置等信息:
- root=/dev/… → 包含根文件系统的设备
- ro → 首先以只读方式挂载根文件系统(最安全)
- rw→ 立即以读写方式挂载根文件系统
- init=/path/to/init → 使用自定义 init 程序(例如,用于救援或测试)
2. 控制台和调试部分
这部分参数控制系统启动期间显示的消息,这些消息对于出现问题时的故障排除特别有用:
- quiet → 隐藏大多数启动消息
- debug → 启用详细调试输出
- console=ttyS0,115200 → 将消息直接发送到串行控制台(用于远程调试)
- loglevel=3 → 控制消息详细程度(0 = 紧急情况,7 = 完整详细信息)
3. 硬件控制部分
有时,ACPI 或 APIC 等硬件功能可能会导致问题,因此可以根据需要调整或禁用它们:
- noapic → 禁用 APIC,可用于修复旧硬件上的某些问题
- acpi=off → 关闭 ACPI,禁用高级电源管理
- pci=noacpi → 阻止 ACPI 处理 PCI 中断
4. 内核和 CPU 管理部分
设置内核使用内存的容量以及 CPU 核心的数量:
- mem=512M → 将可用内存限制为 512 MB
- maxcpus=2 → 仅使用 2 个 CPU 核心
- nosmp → 完全禁用多处理器支持
5. 恢复与故障排查部分
处理崩溃、调试或暂时绕过安全强制措施的选项:
- initcall_debug → 跟踪初始化调用(调试启动问题)
- panic=10 → 内核崩溃 10 秒后自动重启
- selinux=0 → 禁用 SELinux 强制措施
3] 修改启动参数
1. 临时添加启动参数
有时我们需要更改 Linux 的启动方式,例如禁用某些功能(例如 ACPI),但又不想永久更改系统。这时,临时启动参数就派上用场了。
重启计算机,在 BIOS/UEFI 屏幕显示后立即访问 GRUB 菜单。如果菜单没有自动显示,请按住 Shift(BIOS 系统)或 Esc(UEFI 系统)。
选中要启动的内核,然后按 e 键编辑启动命令,并查找以 linux 或 linuxefi 开头的行。此行会告诉系统要加载哪个内核以及要使用哪些选项。
在该行末尾添加临时参数。例如,要临时禁用 ACPI,可以添加 acpi=off:
linux /vmlinuz-6.x root=/dev/sda1 ro quiet splash acpi=off
之后,按 Crtl+x 组键或 F10 键来使用修改的启动项启动系统。
这将仅在本次会话使用指定的参数启动系统。重新启动后,系统将恢复到正常设置。
2. 永久修改启动参数
如果临时设置的参数有效,并且希望之后每次启动时都应用它,则需要对 GRUB 配置文件进行编辑。
$ sudo vi /etc/default/grub
找到如下行:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
在引号内添加参数。例如,要永久禁用 ACPI:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi=off"
修改完成后,还需要使用如下命令让修改生效:
$ sudo update-grub # for Debian/Ubuntu $ sudo grub2-mkconfig -o /boot/grub2/grub.cfg # for Fedora/RHEL
之后,每次启动系统都会按设置内容启动了。
4] 10 项常用的启动参数
以下是一些是最常用的 Linux 内核启动参数,每个系统管理员都应该熟悉。它们有助于控制系统启动、管理硬件、优化性能以及快速排除启动问题。
参数 | 类别 | 功能说明 |
---|---|---|
root=/dev/sda1 | 系统基础 | 指定包含根文件系统的设备 |
ro | 系统基础 | 启动时将根文件系统以只读方式挂载以确保安全 |
rw | 系统基础 | 立即将根文件系统以读写方式挂载 |
quiet | 控制台和调试 | 抑制大多数启动消息以实现更干净的启动 |
debug | 控制台和调试 | 启用详细内核消息以帮助排除启动问题 |
acpi=off | 硬件控制 | 禁用 ACPI(高级配置和电源接口) |
noapic | 硬件控制 | 用高级可编程中断控制器 |
mem=512M | 内存和 CPU 管理 | 将可用内存限制为 512 MB |
maxcpus=2 | 内存和 CPU 管理 | 限制系统仅使用 2 个 CPU 核心 |
init=/path/to/init | 恢复与故障排查 | 允许使用自定义初始化程序启动 |
启动时参数就像 Linux 内核的密钥一样;它们允许我们精确控制系统的启动方式、硬件的初始化方式以及问题的处理方式。
无论是调试顽固的启动问题、调整性能,还是试验内核功能,这些参数都能让我们掌控 Linux 机器的底层功能。
因此,如果再遇到 Linux 机器无法启动,或者只是想提升系统性能时,请记住,答案可能就是在内核命令行中多加几个参数而已。