Linux实战|Swap交换空间 + CentOS7系统启动流程 + 故障修复完整笔记
引言
本篇适合CentOS7运维入门同学。读完本篇博客你将掌握:
- 计算机存储器层级原理,理解虚拟内存、Swap交换空间是什么,学会创建、激活、持久化配置swap;
- CentOS7完整开机启动流程,搞懂BIOS/UEFI → GRUB2 → kernel → initramfs → systemd整套链路;
- systemd的target目标单元,传统运行级别与target对应关系,临时切换、修改开机默认启动目标;
- 两种重置root密码实操方法(rd.break、init=/bin/bash),SELinux的
.autorelabel作用; /etc/fstab配置错误导致开机进入emergency紧急模式,常见故障复现与修复;- GRUB2引导配置、菜单加密、内核参数修改;MBR引导损坏、内核文件丢失故障修复思路;
- 拓展:LUKS磁盘加密简单实操,理解vmlinuz与initramfs分开设计的底层原因。
本章大量内容属于系统底层故障排错,虚拟机反复实验效果最好,不建议在生产真机随意测试密码重置、破坏引导的操作。
前置说明
✅环境:CentOS7虚拟机,root权限;建议额外添加一块测试硬盘用于swap分区实验; ✅前置知识:熟悉磁盘分区、mkfs格式化、mount挂载、了解/etc/fstab作用; ✅新手友好:零基础可以跟着实操;底层概念会使用比喻通俗讲解。
💡代码块中
#后面是注释,不要复制输入终端。 ⚠️密码重置、破坏grub引导属于高危操作,仅在测试虚拟机练习,不要操作业务服务器!
一、存储器层级与Swap交换空间
比喻:计算机存储像金字塔,越靠上速度越快、价格越贵、容量越小。CPU寄存器 → CPU高速缓存 → 物理内存(RAM) → 硬盘/U盘(辅助存储器)。
1.1 物理内存与虚拟内存基础
内存最小单位叫page页,CentOS7默认一页大小
4KiB。进程使用
虚拟地址
,由CPU内部
MMU内存管理单元转换成真实物理内存地址。
为什么不直接访问物理内存?
- 虚拟内存 = 物理内存 + Swap交换磁盘空间,内存可以“超配”;
- 解决内存碎片化,进程看到连续虚拟地址,实际物理内存可以东一块西一块。
1.2 什么是Swap交换空间
Swap就是Linux的虚拟内存(相当于Windows的pagefile.sys虚拟内存页面文件),放在磁盘上。
- 物理内存紧张的时候,内核把暂时不用的内存数据写到swap磁盘分区,腾出物理内存给正在活跃的程序;
- 程序再次需要这部分数据,再从swap读回内存。
⚠️swap只是临时救急手段!磁盘速度远慢于真实内存,业务真正内存不足优先加物理内存,不要过度依赖swap。
1.3 查看内存与swap
free-m# -m 以MB为单位查看内存、swap整体使用情况字段解释:
Mem:物理内存 total总大小、used已用、free空闲、buff/cache缓冲区缓存;Swap:交换分区 total总大小、used已经使用、free空闲swap。
1.4 swap空间参考规划
| 物理内存大小 | 建议swap大小 | 休眠hibernate需要swap大小 |
|---|---|---|
| ≤2GiB | 2倍物理内存 | 3倍物理内存 |
| 2‑8GiB | 等于物理内存 | 2倍物理内存 |
| 8‑64GiB | 至少4GiB | 1.5倍物理内存 |
| >64GiB | 至少4GiB | 不建议开启休眠 |
笔记本台式机hibernate休眠:关机前把全部内存内容写入swap,开机从swap恢复内存状态,因此swap必须大于等于内存。
1.5 创建、激活swap分区
# 1. 在sdb磁盘创建gpt分区表,分出2G的linux‑swap类型分区parted/dev/sdb mklabel gptparted/dev/sdb unit MiB mkpart swap01 linux-swap12049# 2. mkswap格式化swap分区mkswap/dev/sdb1# 3. 激活swap;-p指定优先级,数字越大优先级越高swapon-p4/dev/sdb1# 查看当前所有swap设备swapon-s1.6 关闭swap
swapoff /dev/sdb1# 关闭单个swap分区swapoff-a# 关闭/etc/fstab里面全部swap1.7 开机自动激活swap(写入/etc/fstab)
获取swap分区UUID
blkid /dev/sdb1编辑/etc/fstab增加一行:
UUID="这里复制你的swap的UUID"swap swappri=400生效验证
swapon-a# 读取fstab激活所有swapswapon-s
pri=4代表swap优先级,数值越大内核优先使用这个swap。
二、CentOS7完整系统启动流程
完整流程:通电POST自检 → UEFI/BIOS固件 → GRUB2引导器 → 加载vmlinuz内核+initramfs临时内存文件系统 → systemd(PID=1) → 加载target目标,启动服务,出现登录界面。
- POST上电自检:BIOS/UEFI固件初始化硬件,选择启动磁盘;
- GRUB2引导加载器:读取磁盘的
grub.cfg,展示内核启动菜单; - GRUB加载vmlinuz内核镜像+initramfs(临时内存文件系统),把控制权交给内核;
- initramfs里面包含各种硬件驱动,识别硬盘、LVM等硬件;
- 内核切换真正根文件系统,启动
systemd,systemd是CentOS7的PID=1一号进程; - systemd加载
default.target默认目标;挂载/etc/fstab里面所有文件系统,启动各项系统服务; - 启动getty终端,出现登录提示符。
重要文件:
/boot/grub2/grub.cfg:grub主配置,禁止直接手动修改,通过grub2‑mkconfig生成;/etc/default/grub:grub变量配置;/etc/grub.d/:脚本片段,生成grub.cfg的素材;- initramfs:内存临时文件系统,存放启动阶段必须的驱动脚本。
三、systemd target启动目标(替代传统运行级别)
CentOS7不再使用传统sysvinit运行级别数字,改用
target单元,target可以把一组服务打包成一个整体。
| 传统运行级别 | systemd target | 说明 |
|---|---|---|
| 0 | — | 关机halt |
| 1 | rescue.target / emergency.target | 单用户救援模式,无网络,root登录,用于修复故障 |
| 2 | — | 多用户无NFS,CentOS7很少用 |
| 3 | multi‑user.target | 文本命令行多用户模式,无图形界面 |
| 4 | — | 预留未使用 |
| 5 | graphical.target | 图形桌面模式 |
| 6 | — | 系统重启reboot |
操作命令
# 查看当前开机默认目标systemctl get-default# 修改开机默认进入文本模式systemctl set-default multi-user.target# 临时立刻切换到图形,不需要重启systemctl isolate graphical.target# 查看target之间依赖关系systemctl list-dependencies graphical.target systemctl list-dependencies sshd.service--reverse启动时临时修改内核参数进入救援模式
开机,grub菜单按
e编辑内核条目;在
linux16行末尾追加参数,例如systemd.unit=multi-user.target;按
Ctrl+x用修改后的参数启动系统。
这个修改临时生效,重启丢失,用于系统故障排查。
四、两种重置root密码方法(虚拟机实操)
⚠️仅测试虚拟机使用!两种方法都需要在grub启动菜单修改内核参数。
方法一:rd.break方式
- 重启,grub界面按
e编辑内核; - 在
linux16行末尾增加rd.break,按Ctrl+x启动; - 此时真实根文件系统只读挂载到 /sysroot
mount-oremount,rw /sysroot# 重新挂载为读写模式chroot/sysroot# 切换到真实系统根echo"新密码"|passwd--stdinroot# SELinux开启必须创建.autorelabel,否则登录异常touch/.autorelabelexitexit# 两次exit,系统继续启动,会执行SELinux重新标记,自动重启一次方法二:init=/bin/bash方式
- grub编辑内核,
linux16行末尾追加init=/bin/bash; - Ctrl+x启动,直接得到root shell,根文件系统只读挂载在
/
mount-oremount,rw /# 重新挂载根为读写passwd-droot# 删除root密码,登录不需要密码touch/.autorelabel# selinux标记文件# 启动真正systemd,继续完整系统启动exec/usr/lib/systemd/systemd关键点:SELinux开启环境,必须创建
/.autorelabel文件,否则修改完密码无法正常登录系统。
五、/etc/fstab配置错误导致开机进入emergency紧急模式
/etc/fstab写错会开机超时,进入emergency救援shell,输入root密码登录修复。
故障场景1:挂载点目录被删除
现象:开机可以进入系统,只是该条目挂载失败。
修复:要么恢复目录,注释fstab错误行,执行
mount -a。
故障场景2:设备名称写错,设备不存在
现象:开机等待1分30秒超时,进入emergency救援模式。 修复:
- 输入root密码登录;
- vim编辑
/etc/fstab,注释错误那一行; exit继续系统启动;- 排查正确UUID,修正fstab配置。
故障场景3:磁盘文件系统损坏
现象:启动尝试fsck修复失败,进入emergency模式
# xfs修复xfs_repair /dev/sdb1exit实操好习惯:写完fstab,执行
mount -a测试,确认全部挂载正常,再重启服务器,防止开不了机。
六、GRUB2引导配置与故障修复
6.1 grub基础配置
- 不要直接修改
/boot/grub2/grub.cfg; - 修改
/etc/default/grub、/etc/grub.d/*脚本; - 修改完成执行
grub2‑mkconfig -o /boot/grub2/grub.cfg生成配置。
# 修改grub菜单超时时间vim/etc/default/grubGRUB_TIMEOUT=10# 重新生成配置文件grub2-mkconfig-o/boot/grub2/grub.cfgreboot内核参数常用说明:
rhgb:图形化开机界面;quiet:减少开机输出日志;ro:启动初期根文件系统只读挂载。
6.2 GRUB菜单加密,防止开机修改内核参数
# 生成PBKDF2加密密码哈希grub2-mkpasswd-pbkdf2# 写入 /boot/grub2/user.cfgvim/boot/grub2/user.cfgGRUB2_PASSWORD=复制生成的长哈希字符串# 更新grub配置grub2-mkconfig-o/boot/grub2/grub.cfg加密后,grub按e编辑内核启动项需要输入密码。
6.3 MBR引导程序损坏故障
故障现象:硬盘446字节引导程序被清零,开机无法从硬盘启动。 修复步骤(CentOS7安装光盘/U盘救援模式):
- 光盘启动,选择 Troubleshooting → Rescue a CentOS system;
- 系统识别硬盘系统,chroot切换到硬盘系统根
/mnt/sysimage
chroot/mnt/sysimage grub2-install /dev/sda# 在硬盘sda重建MBR引导程序exitexit6.4 /boot内核vmlinuz或者initramfs文件丢失
现象:启动提示找不到内核文件。 修复:进入救援模式,从rpm包提取对应内核文件,恢复到/boot目录,退出重启。
七、拓展:LUKS磁盘加密(防止硬盘被拆走读取数据)
LUKS:Linux统一密钥设置,对整个分区加密;注意不加密/boot分区,/boot仍然明文。
# 安装工具yuminstallcryptsetup-y# 初始化加密分区,会清空分区全部数据!cryptsetup luksFormat /dev/sdb1# 打开加密分区,映射设备/dev/mapper/crypt_diskcryptsetupopen/dev/sdb1 crypt_disk# 格式化挂载mkfs.xfs /dev/mapper/crypt_diskmkdir/mnt/encryptedmount/dev/mapper/crypt_disk /mnt/encrypted# 卸载关闭加密umount/mnt/encrypted cryptsetup close crypt_disk开机自动加密挂载需要配置/etc/crypttab配合/etc/fstab。
🚨新手常见坑合集
❌swap分区配置fstab,忘记写
pri=优先级,swap使用顺序不符合预期✅fstab的swap字段可以配置
pri=数字,数字越大优先使用。❌重置root密码,SELinux开启,忘记创建
/.autorelabel✅系统启动SELinux不会重新标记/etc/shadow,修改的密码不生效,必须
touch /.autorelabel。❌直接手动编辑
/boot/grub2/grub.cfg,系统升级内核配置被覆盖丢失✅修改
/etc/default/grub,运行grub2‑mkconfig生成,不要直接改cfg。❌写完/etc/fstab直接重启,没有执行
mount -a测试,服务器开机进入emergency紧急模式✅修改fstab之后,务必执行
mount -a验证没有报错。❌rd.break重置密码,忘记执行
mount -o remount,rw /sysroot,只读文件系统无法修改密码✅rd.break环境/sysroot默认只读,必须重新挂载读写。
❌swapoff -a / swapon -a操作,误以为会修改/etc/fstab
✅swapon‑a只是读取fstab执行激活,不会修改fstab文件本身,持久化要手动编辑fstab。
❌MBR修复救援模式忘记chroot,直接执行grub2‑install,写入到U盘救援介质,而不是硬盘系统。
✅救援模式一定要chroot /mnt/sysimage,再执行grub2‑install。
总结
- Swap交换空间:磁盘充当虚拟内存,缓解物理内存不足;mkswap格式化swap,swapon激活;写入/etc/fstab实现开机自动挂载;swap不能替代物理内存。
- CentOS7启动流程:BIOS/UEFI → GRUB2 → vmlinuz内核+initramfs → systemd;target目标替代传统运行级别,
multi‑user.target文本,graphical.target图形。 - 重置root密码:rd.break、init=/bin/bash两种方案;SELinux环境必须
touch /.autorelabel。 - /etc/fstab故障:写错设备、挂载点、文件系统损坏,会进入emergency救援模式;写完fstab务必
mount -a测试。 - GRUB2:不直接修改grub.cfg;修改default/grub,使用
grub2‑mkconfig生成;支持密码加密;MBR引导损坏用安装光盘救援模式修复。 - LUKS分区加密,实现硬盘被拆走之后数据无法直接读取。
思考题&互动
- swap的作用是什么?业务内存不足优先加大内存还是加大swap?
- multi‑user.target 和 graphical.target分别代表什么?如何设置开机默认进入文本模式?
- rd.break重置root密码,为什么要执行
touch /.autorelabel? - 修改完/etc/fstab之后,为什么建议执行
mount -a再重启机器? - MBR引导446字节引导程序损坏,该如何修复?
欢迎评论区分享你的踩坑经历,建议虚拟机完整复现启动故障实验,加深理解!