3、默认目标单元与内核参数:如何设置默认启动目标,通过内核命令行参数临时切换目标
在 systemd 的启动流程中,目标单元(target unit) 是定义系统当前运行状态的同步点。默认目标决定了 systemd 在初始化阶段最终要激活的单元集合。理解如何设置和临时切换默认目标,是故障排查中绕过损坏服务、进入恢复环境的核心技能。
3.1 默认目标单元的概念与查看
默认目标通常是一个符号链接,指向 /lib/systemd/system/ 或 /etc/systemd/system/ 下的某个 .target 文件。最常见的默认目标是 graphical.target(图形界面)或 multi-user.target(多用户文本模式)。
| 目标单元 | 描述 | 典型用途 |
|---|---|---|
poweroff.target |
关机 | 系统关闭 |
rescue.target |
单用户救援模式,挂载基本文件系统 | 修复损坏的系统配置 |
multi-user.target |
多用户文本模式,不启动图形界面 | 服务器、故障排查 |
graphical.target |
多用户图形模式 | 桌面系统 |
reboot.target |
重启 | 系统重启 |
查看当前默认目标:
systemctl get-default
查看当前激活的目标单元(即系统当前处于的运行级别):
systemctl list-units --type=target --state=active
提示: 在 systemd 中,
runlevel 命令已被保留为兼容性接口,但实际查询结果来自 systemd。建议直接使用 systemctl 命令。
3.2 永久设置默认启动目标
使用 systemctl set-default 命令可以永久更改默认目标。该命令会更新 /etc/systemd/system/default.target 符号链接。
语法:
systemctl set-default <target-name>.target
示例: 将默认启动目标设置为多用户文本模式
systemctl set-default multi-user.target
验证更改:
systemctl get-default
# 输出: multi-user.target
恢复为图形模式:
systemctl set-default graphical.target
注意: 永久更改默认目标会影响所有后续启动。在故障排查时,建议优先使用临时切换方法,确认修复后再做永久更改。
3.3 通过内核命令行参数临时切换目标
在 GRUB 引导阶段,通过编辑内核命令行参数可以临时覆盖默认目标,仅对当前启动生效。这是进入救援环境或跳过损坏服务的最常用方法。
关键参数:
| 内核参数 | 等效目标 | 适用场景 |
|---|---|---|
systemd.unit=rescue.target |
救援模式 | 修复 fstab、root 密码重置 |
systemd.unit=multi-user.target |
多用户文本模式 | 跳过图形驱动或显示管理器故障 |
systemd.unit=emergency.target |
紧急模式 | 最小化环境,仅挂载 rootfs(只读) |
1 或 single |
rescue.target(兼容) | 传统单用户模式 |
操作步骤(以 GRUB 为例):
- 重启系统,在 GRUB 菜单出现时,按
e键进入编辑模式。 - 找到以
linux或linux16开头的行(内核命令行)。 - 在该行末尾添加一个空格,然后输入
systemd.unit=multi-user.target。 - 按
Ctrl+X或F10启动系统。
示例内核命令行片段:
linux /vmlinuz-5.15.0-generic root=/dev/sda1 ro quiet splash systemd.unit=multi-user.target
故障排查技巧: 如果系统因某个服务挂起,使用
systemd.unit=multi-user.target 启动后,可以执行 systemctl list-units --failed 查看失败服务,然后逐一禁用或修复。
3.4 默认目标与内核参数的关系流程图
下图展示了从 GRUB 加载内核参数到 systemd 选择目标单元的完整流程:
3.5 常见故障场景与临时切换实战
以下表格总结了典型故障场景及对应的内核参数解决方案:
| 故障现象 | 推荐内核参数 | 后续操作 |
|---|---|---|
| 显示管理器(GDM/LightDM)崩溃,无法进入桌面 | systemd.unit=multi-user.target |
登录后禁用或重装显示管理器 |
挂载 /etc/fstab 中某个分区失败导致启动卡住 |
systemd.unit=rescue.target |
修复 fstab 或注释错误条目 |
| 网络服务(NetworkManager)启动超时 | systemd.unit=multi-user.target |
禁用 NetworkManager,改用 systemd-networkd |
| 根文件系统损坏,需要 fsck | systemd.unit=emergency.target |
手动执行 fsck /dev/sda1 |
| 忘记 root 密码 | systemd.unit=rescue.target |
使用 passwd 重置密码 |
重要: 使用
emergency.target 时,根文件系统以只读方式挂载。执行修复操作前,需要先执行 mount -o remount,rw / 重新挂载为读写模式。
3.6 验证临时切换是否生效
系统启动后,可以通过以下命令确认当前激活的目标单元:
systemctl list-units --type=target --state=active | grep -E "rescue|multi-user|graphical|emergency"
或者直接查看默认目标是否被覆盖:
systemctl get-default
# 输出仍为之前的永久设置(如 graphical.target)
# 但当前运行级别是 multi-user.target(临时生效)
使用 runlevel 命令查看当前和之前的运行级别:
runlevel
# 输出示例: N 3 (N 表示没有之前的运行级别,3 表示当前运行级别对应 multi-user.target)
最佳实践: 在排查故障时,始终先使用内核参数临时切换目标。确认问题定位并修复后,再考虑是否使用
systemctl set-default 永久更改默认目标。这样可以避免因误操作导致系统无法正常启动。