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 定位并修复。