从按下电源键到出现登录提示符,要经过固件自检、GRUB2 引导、内核与 initramfs、systemd 拉起 target 一串环节,任何一环断了系统就起不来。
本文把启动过程拆成九步,讲清 systemd target 与传统运行级别的对应、运行目标的查看与切换,最后给出 root 密码重置的四种方法。
文中命令名均标注英文全称,完整清单见文末《附:命令英文全称速查表》。
本文概要:
| 项目 | 内容 |
|---|---|
| 文章主题 | 从按下电源键到出现登录提示符的九步启动过程、systemd target 与传统运行级别的对应关系、运行目标的查看与切换,以及忘记 root 密码时的四种重置方法 |
| 所属类别 | Linux 系统管理 → 启动与引导 → systemd 运行目标 |
| 知识关键字 | POST · UEFI / BIOS · MBR · GRUB2 ·vmlinuz·initramfs· systemd · target · 运行级别 ·rd.break·init=/bin/bash·single/rescue.target |
一、CentOS 7 启动过程
| 步骤 | 发生了什么 | 配置方式 |
|---|---|---|
| 1 | 固件(现代 UEFI 或更旧的 BIOS)运行 POST 自检,初始化硬件 | 开机按 F2 等组合键进固件配置 |
| 2 | 固件按启动顺序搜索设备,读启动盘上的 MBR,控制权交给 GRUB2 | grub2-install |
| 3 | GRUB2 读/boot/grub2/grub.cfg,显示启动菜单 | /etc/default/grub、grub2-mkconfig |
| 4 | 按选中条目把 kernel 与 initramfs 载入内存,内核用 initramfs 里的驱动初始化硬件 | dracut、lsinitrd |
| 5 | initramfs 执行/sbin/init作为 PID 1,在 CentOS 中它指向 systemd | 内核参数init= |
| 6 | systemd 加载内核命令行指定的 target,或系统配置的default.target | systemctl set-default |
| 7 | sysinit.target完成初始化:按/etc/fstab挂载文件系统、激活systemd-journald | /etc/fstab |
| 8 | default.target激活设为开机启动的单元 | systemctl enable |
| 9 | getty.target打开 tty1 终端,等待登录 | systemctl enable |
二、systemd target
target 是给其他单元分组的单元:multi-user.target包含chronyd.service、crond.service等服务。target 之间也可互相包含,链路由外到内是graphical.target→multi-user.target→basic.target→sysinit.target。
2.1 systemctl list-dependencies 用法速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
systemctl | 查询与控制系统服务管理器 | system control |
list-dependencies | 列出指定单元的依赖关系 | list dependencies |
graphical.target | 目标单元(位置参数),也可写服务名 | target |
--reverse | 查反向依赖,即谁依赖它 | reverse |
--all | 递归展开全部依赖,不截断 | all |
--plain | 纯文本列表输出,不画树形线 | plain,便于脚本处理 |
2.2 最简演示
# 正向依赖:graphical.target 拉起了哪些单元[root@zhb-m1 ~]# systemctl list-dependencies graphical.targetgraphical.target ● ├─gdm.service ● └─multi-user.target......# 反向依赖:sshd.service 被哪些 target 拉起[root@zhb-m1 ~]# systemctl list-dependencies sshd.service --reversesshd.service ● └─multi-user.target ● └─graphical.target三、运行级别与运行目标
SysVinit 定义了 7 个运行级别(0-6),systemd 用 target 承接:
| 级别 | target | 作用 |
|---|---|---|
| 0 | 关机,等同shutdown -h now | |
| 1 | rescue.target、emergency.target | 单用户模式:仅 root 登录,无网络服务,用于系统修复 |
| 2 | 多用户无 NFS,Debian 等发行版默认与级别 3 相同 | |
| 3 | multi-user.target | 完全多用户(文本界面),启动全部网络服务 |
| 4 | 预留级别,默认未使用 | |
| 5 | graphical.target | 图形化多用户:在级别 3 之上启动图形界面 |
| 6 | 重启,等同shutdown -r now |
CentOS 6 用/etc/inittab里的id:5:initdefault:设默认级别;CentOS 7 起该文件失效,改由default.target决定。
四、设置运行目标
4.1 systemctl isolate / get-default / set-default 用法速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
systemctl isolate | 立即切换到指定 target,停用新 target 不需要的单元 | isolate(隔离) |
systemctl get-default | 查看开机默认 target | get default |
systemctl set-default | 设置开机默认 target,本质是改default.target软链接 | set default |
multi-user.target | 文本多用户目标(位置参数) | 对应运行级别 3 |
graphical.target | 图形化目标(位置参数) | 对应运行级别 5 |
rescue.target | 救援目标(位置参数) | 对应运行级别 1 |
4.2 切换与设置默认目标
[root@zhb-m1 ~]# systemctl isolate multi-user.target # 立即切到文本目标[root@zhb-m1 ~]# systemctl isolate graphical.target # 立即切到图形目标[root@zhb-m1 ~]# systemctl get-defaultgraphical.target[root@zhb-m1 ~]# systemctl set-default multi-user.target # 改开机默认目标,重启后生效4.3 临时用其它目标启动
在某次启动时把systemd.unit=<target>.target追加到内核命令行,只对本次启动生效,常用于排查启动故障。
按任意键中断启动菜单倒计时(Enter 除外,它用于正常启动)。
光标移到第一个内核条目,按e编辑。
在linux16行末尾追加
systemd.unit=multi-user.target,按Ctrl+x启动。
五、重置 ROOT 密码
密码丢失时的做法分两类:用 Live CD 挂载根文件系统改/etc/shadow;或者让启动停在 initramfs 阶段,先拿到 root shell 再改。
下面四个方法按是否需要原 root 密码分两组:5.1、5.2 不需要,用于密码已丢失;5.3、5.4 需要,用于已知密码时的维护。
5.1 方法 1:rd.break
追加rd.break(操作同 4.3),启动停在 initramfs 移交控制权之前,真实根以只读挂在/sysroot:
switch_root:/# mount -o remount,rw /sysroot # 重新读写挂载switch_root:/# chroot /sysroot # 切换到真实根sh-4.2# echo 123 | passwd --stdin root # 设新密码,123 换成自己的sh-4.2# touch /.autorelabel # 开启 SELinux 时必须执行sh-4.2# exit # 退出两次,继续启动switch_root:/# exit开启 SELinux 时,退出后会先完成全盘重新标记,再自动重启一次。
5.2 方法 2:init=/bin/bash
追加init=/bin/bash,启动在移交控制权前中断,直接给出 root shell,真实根以只读挂在/:
bash-4.2# mount -o remount,rw /sh-4.2# passwd -d root # 清空密码,进系统后重设sh-4.2# touch /.autorelabel # 开启 SELinux 时必须执行sh-4.2# exec /usr/lib/systemd/systemd # 继续启动passwd -d也可换成vi /etc/shadow,用已知用户的密码串替换 root 的密码字段。
⚠️注意:开启 SELinux 时改完密码必须
touch /.autorelabel。initramfs 里改出的/etc/shadow没有正确的 SELinux 标签,不重新标记会被拒绝登录——这一步漏掉是重置密码失败最常见的原因。
5.3 方法 3:single
在linux16行末尾追加rw single:
| 参数 | 含义 | 英文原意 |
|---|---|---|
rw | 根以读写挂载,省掉进系统后再 remount | read-write |
single | 单用户模式,等价写法还有s与1 | single-user mode |
启动后提示输入 root 密码,通过后直接得到读写挂载的 root shell:
sh-4.2# passwd root # 改密码sh-4.2# exec /usr/lib/systemd/systemd # 继续启动⚠️注意:systemd 系统里
single、s、1都只是rescue.target的别名,依旧会要求输入 root 密码。所以密码已忘记时只有 5.1、5.2 可用——「单用户模式免密码」是 SysV init 时代的说法。
5.4 方法 4:rescue.target
在linux16行末尾追加systemd.unit=rescue.target:
| 参数 | 含义 | 英文原意 |
|---|---|---|
systemd.unit= | 覆盖本次启动的默认目标,仅对本次生效 | systemd unit |
rescue.target | 救援目标:挂载文件系统、拉起基本服务,给出 root shell | rescue target |
emergency.target | 紧急目标:根只读挂载,不挂其余文件系统、不启服务 | emergency target |
启动停在救援模式并要求 root 密码,进入后可改密码、修/etc/fstab、卸载冲突挂载,完成后systemctl reboot或继续进入默认目标。
5.5 四种方法对比
| 方法 | 内核参数 | 需原密码 | 根文件系统状态 | 适用场景 |
|---|---|---|---|---|
| rd.break | rd.break | 否 | 只读挂/sysroot,需 remount,rw + chroot | 忘记密码(首选) |
| init=/bin/bash | init=/bin/bash | 否 | 只读挂/,需 remount,rw | 忘记密码(备选) |
| single | rw single | 是 | 读写挂/ | 已知密码时的维护 |
| rescue.target | systemd.unit=rescue.target | 是 | 读写挂/,基本服务已起 | 已知密码时的修复 |
| emergency.target | systemd.unit=emergency.target | 是 | 只读挂/ | 文件系统损坏、fstab 错误 |
rescue 与 emergency 的差别:前者按/etc/fstab挂载全部文件系统、拉起基本服务、根已读写;后者根只读、其余不挂载、几乎不启服务。
📚 参考资料(官方文档 · 中英双语)
- systemd.target(5) 目标单元手册
- systemctl(1) 服务管理命令手册
- systemd.special(7) 特殊目标单元手册
- bootup(7) 系统启动流程手册
- passwd(1) 密码修改命令手册
附:命令英文全称速查表
| 命令 / 缩写 | 英文全称 / 原意 | 作用 |
|---|---|---|
systemctl | systemcontrol | 管理系统与服务,查看 / 切换运行目标 |
systemd | system daemon | 系统与服务管理器,PID 1 |
target | target(目标) | 单元分组,承接传统运行级别 |
rd.break | ramdisk break | 内核参数,让启动停在 initramfs 阶段 |
SELinux | Security-EnhancedLinux | 强制访问控制机制,改密码后需重新标记 |
getty | gettty | 打开终端并等待用户登录 |
PID | ProcessID | 进程号 |
POST | Power-OnSelf-Test | 开机自检 |
UEFI/BIOS | UnifiedExtensibleFirmwareInterface /BasicInputOutputSystem | 现代 / 传统系统固件 |
initramfs | initialRAMfilesystem | 临时内存文件系统,存放启动所需驱动与脚本 |
vmlinuz | virtualmemory LINUz | 压缩后的 Linux 内核镜像 |
GRUB | GRandUnifiedBootloader | 启动加载器 |
MBR | MasterBootRecord | 主引导记录 |
总结:启动链路是"固件自检 → MBR → GRUB2 → kernel + initramfs → systemd → default.target → sysinit.target → 开机服务 → getty"。
运行目标用systemctl get-default/set-default管理。
密码丢失则用rd.break或init=/bin/bash在 initramfs 阶段拿一个 root shell。