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 为例):

  1. 重启系统,在 GRUB 菜单出现时,按 e 键进入编辑模式。
  2. 找到以 linux 或 linux16 开头的行(内核命令行)。
  3. 在该行末尾添加一个空格,然后输入 systemd.unit=multi-user.target。
  4. 按 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 选择目标单元的完整流程:

默认目标选择流程:内核参数 vs 默认配置 GRUB 引导加载器 内核命令行参数 systemd.unit=xxx.target 默认目标符号链接 /etc/systemd/system/default.target 参数存在? (优先级更高) 使用内核参数指定的目标 临时生效(仅本次启动) 使用默认目标符号链接 永久生效(除非再次更改) 内核参数优先级高于默认符号链接 故障排查时优先使用临时参数

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 永久更改默认目标。这样可以避免因误操作导致系统无法正常启动。