《UNIX/Linux系统管理技术手册-读书笔记-第二章

1. 引导过程总览

知识内容 作用/任务
引导(booting):计算机“自己把自己启动起来”的完整流程。 理解系统启动各阶段,便于定位启动失败的原因。
引导四大阶段:①加载引导代码 → ②加载内核 → ③运行启动脚本/守护进程 → ④维护进程与状态。 知道每个阶段做什么,故障时能判断出问题出在哪个环节。
现代变化:UEFI取代传统BIOS,systemd取代传统init,云/容器化改变引导管理模式。 适应新环境(云实例、容器),不再依赖物理控制台。

2. 系统固件(BIOS vs UEFI)

知识内容 能做什么
传统BIOS:使用MBR(主引导记录),引导块仅512字节,只能加载第二阶段引导程序。 理解老旧系统引导机制,处理MBR损坏或分区表问题。
UEFI:使用GPT分区表,能直接读取FAT文件系统,从EFI系统分区(ESP)加载引导目标(可以是内核或引导程序)。 支持更大磁盘、更安全引导(Secure Boot)、无需隐匿引导块。
efibootmgr:用户空间工具,可查看/修改UEFI引导顺序和引导项。 efibootmgr -v查看当前引导配置;efibootmgr -o 0004,0002修改引导顺序。
UEFI变量可写:rm -rf / 可能删除UEFI变量,永久损坏固件配置。 操作UEFI系统时谨慎,避免灾难性误操作。

实操要点:新硬件用UEFI+GPT,老硬件/虚拟机可能仍是BIOS+MBR。云环境通常抽象了固件层,无需关心。

3. 引导装载程序(Boot Loader)

知识内容 能做什么
引导装载程序任务:①识别并加载内核;②提供交互式菜单选择内核/OS;③传递内核启动参数。 多系统引导、内核版本切换、传递调试/恢复参数。
GRUB2(主流Linux默认):理解常见文件系统,从/boot/grub/grub.cfg读取配置。 引导Linux系统,菜单选择内核版本,故障时进入单用户/紧急模式。
grub.cfg:由grub-mkconfigupdate-grub自动生成,内核升级后自动更新。 不要手工编辑grub.cfg(会被覆盖);通过/etc/default/grub/etc/grub.d/定制。
GRUB交互式命令bootlinuxrebootsearch等。 启动时按e编辑引导项,按c进入命令行,手动加载内核调试。

GRUB常用内核启动参数

参数 作用
single-s 进入单用户模式(rescue.target)
systemd.unit=emergency.target 进入紧急模式(更精简,不挂载文件系统)
init=/bin/bash 直接用bash作为init进程,跳过所有服务
root=/dev/xxx 手动指定根设备
debug 开启内核调试输出

实操要点:内核更新后老内核保留,引导菜单可回退。修改内核参数永久生效需编辑/etc/default/grub中的GRUB_CMDLINE_LINUX

4. FreeBSD引导过程

知识内容 能做什么
BIOS路线(boot0):多阶段引导链,MBR → boot0 → 卷引导记录 → loader。 理解FreeBSD在传统BIOS下的引导方式,使用boot0cfg调整。
UEFI路线:ESP分区中的/boot/bootx64.efi → loader.efi。 UEFI环境下直接引导FreeBSD;ESP损坏时用dd恢复镜像。
loader.conf:引导装载程序的配置文件(Forth脚本),位于/boot/loader.conf 设置引导超时、传递内核参数、修改引导画面等;不要改/boot/defaults/loader.conf
loader交互式命令lsunloadloadboot 引导时按ESC进入loader提示符,手动加载其他内核(如load /boot/kernel/kernel.old)。

5. 系统管理守护进程(init / systemd)

5.1 init的职责与实现

知识内容 能做什么
PID 1(init):内核启动后的第一个用户态进程,负责启动/停止服务、切换操作模式。 所有进程的祖先进程,系统管理的根基。
运行模式:单用户(最小服务)、多用户(命令行)、图形化(GUI)。 不同场景下切换系统运行状态。
三种主流init实现:①传统SysV init(串行,依赖shell脚本);②BSD init(简单,/etc/rc);③systemd(现代,并行,依赖管理)。 知道不同系统的管理方式:Linux主流systemd,FreeBSD用BSD init。

5.2 systemd详解(重点)

systemd是当前Linux发行版的标准init实现,集成了服务管理、日志、登录管理等。

概念 是什么 能做什么
单元(Unit) systemd管理的实体:服务(.service)、套接字(.socket)、挂载点(.mount)、目标(.target)、计时器(.timer)等。 统一管理系统资源,不只是服务。
单元文件位置 /usr/lib/systemd/system(软件包提供,勿改)、/etc/systemd/system(本地定制,优先级高)、/run/systemd/system(临时)。 知道去哪里查看和覆盖服务配置。
systemctl 通用管理命令,类似Git的子命令风格。 管理服务的启动/停止/启用/禁用/状态查看/日志查看。

systemctl常用子命令速查

子命令 功能
systemctl list-units --type=service 列出当前活动服务
systemctl list-unit-files --type=service 列出所有已安装服务单元文件及状态
systemctl start/stop/restart <unit> 立即启动/停止/重启服务
systemctl enable/disable <unit> 设置/取消开机自启
systemctl status <unit> 查看服务状态+最近日志
systemctl isolate <target> 切换运行模式(如multi-user.target)
systemctl get-default / set-default 查看/设置默认启动目标
systemctl daemon-reload 重新加载所有单元文件(修改配置后执行)
systemctl edit <unit> 创建覆盖文件,定制服务配置(推荐方式)
systemctl mask/unmask <unit> 彻底冻结/解冻服务(比disable更强)

单元文件核心语法

区块 配置项 作用
[Unit] Description 描述信息
After / Before 执行顺序控制(非依赖)
Wants / Requires 依赖关系(Wants软依赖,Requires硬依赖)
Conflicts 互斥关系
[Service] Type 服务类型(simple/forking/oneshot等)
ExecStart / ExecStop / ExecReload 启动/停止/重载命令
PIDFile PID文件路径(Type=forking时必需)
KillMode / KillSignal 终止行为控制
PrivateTmp 隔离/tmp,增强安全
[Install] WantedBy / RequiredBy 在哪个目标下启用(对应enable命令)

覆盖文件定制服务(不修改原包文件)

# 推荐方式:使用systemctl edit
sudo systemctl edit nginx.service
# 在编辑器中写入覆盖内容
[Service]
ExecStart=
ExecStart=/usr/sbin/nginx -c /usr/local/nginx.conf
# 保存后执行
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

systemd目标(Target) vs 传统运行级

传统运行级 systemd目标 说明
0 poweroff.target 关机
1, s, single rescue.target 单用户模式(救援)
emergency.target 紧急模式(更精简,不挂载文件系统)
2, 3, 4 multi-user.target 多用户命令行模式
5 graphical.target 图形化多用户模式
6 reboot.target 重启

systemd日志(journald)

知识内容 能做什么
journald:systemd内置日志框架,收集内核+服务所有消息。 统一日志查看,不再需要翻/var/log下多个文件。
journalctl:日志查看命令。 journalctl全量查看;journalctl -b查看本次引导日志;journalctl -b -1看上次引导;journalctl -u nginx只看特定服务。
持久化存储:编辑/etc/systemd/journald.conf设置Storage=persistent 保留历史引导日志,便于事后排查。

6. FreeBSD init与启动脚本

知识内容 能做什么
BSD init:不支持运行级,执行/etc/rc进入完全引导状态。 理解FreeBSD启动流程。
rc.conf:主配置文件,位于/etc/rc.conf/etc/defaults/rc.conf为默认值(勿改)。 设置服务是否开机自启(如sshd_enable="YES")。
rc.d脚本:位于/etc/rc.d/(系统)和/usr/local/etc/rc.d/(第三方软件)。 启动脚本标准位置,由rcorder排序执行。
service命令:实时管理服务。 sudo service sshd stop停止服务;onestart/onestop忽略rc.conf配置强制操作。

7. 重新引导与关机

命令 功能
halt 关闭系统(写入日志、杀进程、回写缓存、挂起内核)
halt -p 关闭系统并切断电源
reboot 重新引导系统
shutdown 定时关机+向登录用户发警告(多用户时代产物,现已较少用)

云系统注意:AWS的Stop/Reboot/Terminate含义不同。Terminate会删除实例及其根磁盘(除非启用终止保护)。优先通过OS内部halt/reboot关机,控制台操作需谨慎。

8. 系统无法引导的应对策略

8.1 三种恢复方法

方法 适用场景
回退到已知良好状态(备份/快照恢复) 最快,云环境首选,物理机需有近期全盘镜像
单用户/救援/紧急模式 能进入引导装载程序,但正常引导失败
挂载到另一系统检查 引导阶段早期就失败,或需要修复根文件系统

8.2 单用户模式(rescue.target)

操作 方法
进入方式 GRUB启动时编辑内核参数,添加single-ssystemd.unit=rescue.target
紧急模式(更精简) systemd.unit=emergency.target,不挂载文件系统,适合fsck修复
重新挂载根为读写 mount -o rw,remount /(Linux);FreeBSD需指定设备
退出继续引导 exit或Ctrl+D

单用户模式会提示输入root密码——如果你忘了root密码,这个方法无效,需用方法3(挂载到另一系统)。

8.3 FreeBSD单用户

  • 引导菜单选"Boot Single User";
  • 或选"Escape to loader prompt"进入loader命令行环境。

8.4 云系统恢复(AWS为例)

步骤 操作
1 在相同可用区启动恢复实例(同一基础镜像)
2 停止(非终止)故障实例
3 将故障实例的EBS卷分离 → 挂载到恢复实例
4 登录恢复实例,挂载卷,执行修复(修改配置、fsck、替换内核等)
5 卸载卷 → 从恢复实例分离 → 重新挂回故障实例 → 启动

哲学:云服务器是“牛”不是“宠物”——出问题就用备份替换,而不是费时费力抢救。但恢复能力仍然需要掌握,尤其是关键数据未分离的场景。


9. 本章核心命令速查表

命令 用途
efibootmgr -v 查看UEFI引导配置
efibootmgr -o 0004,0002 修改UEFI引导顺序
systemctl status/start/stop/restart 服务管理
systemctl enable/disable 开关开机自启
systemctl isolate multi-user.target 切换到多用户模式
systemctl get-default/set-default 查看/设置默认引导目标
systemctl edit <unit> 创建覆盖文件定制服务
systemctl daemon-reload 重载单元文件
journalctl -b -u nginx 查看本次引导中nginx服务的日志
halt -p / reboot 关机/重启
mount -o rw,remount / 单用户模式下重新挂载根为读写

总结:第2章的核心是引导全链路(固件→引导装载程序→内核→init/systemd→服务)和故障恢复能力。重点掌握:

  1. systemd的systemctl/journalctl——日常服务管理必用;
  2. GRUB内核参数(single/emergency)——救系统于水火;
  3. 云环境恢复流程——虚拟化时代必备技能;
  4. 理解UEFI vs BIOS差异——新老硬件通吃。