1.5.3 启动流程与运行级别/Target切换

启动流程与运行级别/Target切换#

本节围绕 systemd 的启动链路与 Target 切换,给出原理草图、命令示例、排错与练习,确保可操作落地。

启动流程原理草图#

文章图片

运行级别与 Target 对应关系#

  • runlevel 0 → poweroff.target
  • runlevel 1 → rescue.target
  • runlevel 3 → multi-user.target
  • runlevel 5 → graphical.target
  • runlevel 6 → reboot.target

查看与切换 Target(含命令解释)#

# 查看当前默认 Target(返回 multi-user.target 或 graphical.target)
systemctl get-default

# 查看当前正在运行的 Target
systemctl list-units --type=target --state=active

# 设置默认 Target(写入 /etc/systemd/system/default.target)
systemctl set-default multi-user.target

# 临时切换到救援模式(停止不属于该 Target 的服务)
systemctl isolate rescue.target

启动参数与临时切换示例(GRUB)#

# 临时进入多用户模式(图形界面异常时使用)
# 在 GRUB 界面按 e,找到 linux 行追加:
systemd.unit=multi-user.target
# Ctrl+X 启动,进入文本界面

# 永久配置(仅示例,需谨慎)
# /etc/default/grub
GRUB_CMDLINE_LINUX="systemd.unit=multi-user.target"
# 更新 GRUB
grub2-mkconfig -o /boot/grub2/grub.cfg

启动诊断与排错(完整排障链路)#

# 1) 分析启动耗时
systemd-analyze

# 2) 查看耗时排序
systemd-analyze blame | head -20

# 3) 查看关键依赖链
systemctl list-dependencies multi-user.target

# 4) 查看失败服务
systemctl --failed

# 5) 查看本次启动日志
journalctl -b -p err

示例:服务未随 Target 启动的排错与修复#

# 现象:自建服务 myapp 未随 multi-user.target 启动
systemctl status myapp.service

# 检查服务是否设置了 WantedBy
systemctl cat myapp.service
# 期望看到:
# [Install]
# WantedBy=multi-user.target

# 若缺失,补充配置
sudo tee /etc/systemd/system/myapp.service >/dev/null <<'EOF'
[Unit]
Description=MyApp Service
After=network.target

[Service]
ExecStart=/usr/local/bin/myapp
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 重新加载与启用
systemctl daemon-reload
systemctl enable --now myapp.service

# 验证是否被 Target 拉起
systemctl list-dependencies multi-user.target | grep myapp

常见问题与处理#

  • 启动卡在某个服务:用 systemd-analyze blame 找到耗时服务,配合 journalctl -u <unit> 查看原因。
  • 切换 Target 后网络断开:检查 network.target 依赖关系与网卡服务是否启用。
  • 救援模式无法登录:检查 root 密码与 rd.break 流程,必要时从单用户模式修复。

练习#

1) 将默认 Target 切换为 multi-user.target,重启验证并恢复。
2) 添加一个自定义服务,确保随 multi-user.target 启动。
3) 模拟服务失败(临时写错 ExecStart),用 journalctl -u 定位并修复。