news 2026/9/24 13:33:06

Linux实战|Swap交换空间 + CentOS7系统启动流程 + 故障修复完整笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux实战|Swap交换空间 + CentOS7系统启动流程 + 故障修复完整笔记

Linux实战|Swap交换空间 + CentOS7系统启动流程 + 故障修复完整笔记

引言

本篇适合CentOS7运维入门同学。读完本篇博客你将掌握:

  1. 计算机存储器层级原理,理解虚拟内存、Swap交换空间是什么,学会创建、激活、持久化配置swap;
  2. CentOS7完整开机启动流程,搞懂BIOS/UEFI → GRUB2 → kernel → initramfs → systemd整套链路;
  3. systemd的target目标单元,传统运行级别与target对应关系,临时切换、修改开机默认启动目标;
  4. 两种重置root密码实操方法(rd.break、init=/bin/bash),SELinux的.autorelabel作用;
  5. /etc/fstab配置错误导致开机进入emergency紧急模式,常见故障复现与修复;
  6. GRUB2引导配置、菜单加密、内核参数修改;MBR引导损坏、内核文件丢失故障修复思路;
  7. 拓展:LUKS磁盘加密简单实操,理解vmlinuz与initramfs分开设计的底层原因。

本章大量内容属于系统底层故障排错,虚拟机反复实验效果最好,不建议在生产真机随意测试密码重置、破坏引导的操作。

前置说明

环境:CentOS7虚拟机,root权限;建议额外添加一块测试硬盘用于swap分区实验; ✅前置知识:熟悉磁盘分区、mkfs格式化、mount挂载、了解/etc/fstab作用; ✅新手友好:零基础可以跟着实操;底层概念会使用比喻通俗讲解。

💡代码块中#后面是注释,不要复制输入终端。 ⚠️密码重置、破坏grub引导属于高危操作,仅在测试虚拟机练习,不要操作业务服务器!


一、存储器层级与Swap交换空间

比喻:计算机存储像金字塔,越靠上速度越快、价格越贵、容量越小。CPU寄存器 → CPU高速缓存 → 物理内存(RAM) → 硬盘/U盘(辅助存储器)。

1.1 物理内存与虚拟内存基础

  • 内存最小单位叫page页,CentOS7默认一页大小4KiB

  • 进程使用

    虚拟地址

    ,由CPU内部

    MMU内存管理单元

    转换成真实物理内存地址。

    为什么不直接访问物理内存?

    1. 虚拟内存 = 物理内存 + Swap交换磁盘空间,内存可以“超配”;
    2. 解决内存碎片化,进程看到连续虚拟地址,实际物理内存可以东一块西一块。

1.2 什么是Swap交换空间

Swap就是Linux的虚拟内存(相当于Windows的pagefile.sys虚拟内存页面文件),放在磁盘上。

  1. 物理内存紧张的时候,内核把暂时不用的内存数据写到swap磁盘分区,腾出物理内存给正在活跃的程序;
  2. 程序再次需要这部分数据,再从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大小
≤2GiB2倍物理内存3倍物理内存
2‑8GiB等于物理内存2倍物理内存
8‑64GiB至少4GiB1.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-s

1.6 关闭swap

swapoff /dev/sdb1# 关闭单个swap分区swapoff-a# 关闭/etc/fstab里面全部swap

1.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目标,启动服务,出现登录界面。

  1. POST上电自检:BIOS/UEFI固件初始化硬件,选择启动磁盘;
  2. GRUB2引导加载器:读取磁盘的grub.cfg,展示内核启动菜单;
  3. GRUB加载vmlinuz内核镜像+initramfs(临时内存文件系统),把控制权交给内核;
  4. initramfs里面包含各种硬件驱动,识别硬盘、LVM等硬件;
  5. 内核切换真正根文件系统,启动systemd,systemd是CentOS7的PID=1一号进程;
  6. systemd加载default.target默认目标;挂载/etc/fstab里面所有文件系统,启动各项系统服务;
  7. 启动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
1rescue.target / emergency.target单用户救援模式,无网络,root登录,用于修复故障
2多用户无NFS,CentOS7很少用
3multi‑user.target文本命令行多用户模式,无图形界面
4预留未使用
5graphical.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

启动时临时修改内核参数进入救援模式

  1. 开机,grub菜单按e编辑内核条目;

  2. linux16行末尾追加参数,例如systemd.unit=multi-user.target

  3. Ctrl+x

    用修改后的参数启动系统。

    这个修改临时生效,重启丢失,用于系统故障排查。

四、两种重置root密码方法(虚拟机实操)

⚠️仅测试虚拟机使用!两种方法都需要在grub启动菜单修改内核参数。

方法一:rd.break方式

  1. 重启,grub界面按e编辑内核;
  2. linux16行末尾增加rd.break,按Ctrl+x启动;
  3. 此时真实根文件系统只读挂载到 /sysroot
mount-oremount,rw /sysroot# 重新挂载为读写模式chroot/sysroot# 切换到真实系统根echo"新密码"|passwd--stdinroot# SELinux开启必须创建.autorelabel,否则登录异常touch/.autorelabelexitexit# 两次exit,系统继续启动,会执行SELinux重新标记,自动重启一次

方法二:init=/bin/bash方式

  1. grub编辑内核,linux16行末尾追加init=/bin/bash
  2. 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救援模式。 修复:

  1. 输入root密码登录;
  2. vim编辑/etc/fstab注释错误那一行
  3. exit继续系统启动;
  4. 排查正确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盘救援模式):

  1. 光盘启动,选择 Troubleshooting → Rescue a CentOS system;
  2. 系统识别硬盘系统,chroot切换到硬盘系统根/mnt/sysimage
chroot/mnt/sysimage grub2-install /dev/sda# 在硬盘sda重建MBR引导程序exitexit

6.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


🚨新手常见坑合集

  1. ❌swap分区配置fstab,忘记写pri=优先级,swap使用顺序不符合预期

    ✅fstab的swap字段可以配置pri=数字,数字越大优先使用。

  2. ❌重置root密码,SELinux开启,忘记创建/.autorelabel

    ✅系统启动SELinux不会重新标记/etc/shadow,修改的密码不生效,必须touch /.autorelabel

  3. ❌直接手动编辑/boot/grub2/grub.cfg,系统升级内核配置被覆盖丢失

    ✅修改/etc/default/grub,运行grub2‑mkconfig生成,不要直接改cfg。

  4. ❌写完/etc/fstab直接重启,没有执行mount -a测试,服务器开机进入emergency紧急模式

    ✅修改fstab之后,务必执行mount -a验证没有报错。

  5. ❌rd.break重置密码,忘记执行mount -o remount,rw /sysroot,只读文件系统无法修改密码

    ✅rd.break环境/sysroot默认只读,必须重新挂载读写。

  6. ❌swapoff -a / swapon -a操作,误以为会修改/etc/fstab

    ✅swapon‑a只是读取fstab执行激活,不会修改fstab文件本身,持久化要手动编辑fstab。

  7. ❌MBR修复救援模式忘记chroot,直接执行grub2‑install,写入到U盘救援介质,而不是硬盘系统。

    ✅救援模式一定要chroot /mnt/sysimage,再执行grub2‑install。

总结

  1. Swap交换空间:磁盘充当虚拟内存,缓解物理内存不足;mkswap格式化swap,swapon激活;写入/etc/fstab实现开机自动挂载;swap不能替代物理内存。
  2. CentOS7启动流程:BIOS/UEFI → GRUB2 → vmlinuz内核+initramfs → systemd;target目标替代传统运行级别,multi‑user.target文本,graphical.target图形。
  3. 重置root密码:rd.break、init=/bin/bash两种方案;SELinux环境必须touch /.autorelabel
  4. /etc/fstab故障:写错设备、挂载点、文件系统损坏,会进入emergency救援模式;写完fstab务必mount -a测试。
  5. GRUB2:不直接修改grub.cfg;修改default/grub,使用grub2‑mkconfig生成;支持密码加密;MBR引导损坏用安装光盘救援模式修复。
  6. LUKS分区加密,实现硬盘被拆走之后数据无法直接读取。

思考题&互动

  1. swap的作用是什么?业务内存不足优先加大内存还是加大swap?
  2. multi‑user.target 和 graphical.target分别代表什么?如何设置开机默认进入文本模式?
  3. rd.break重置root密码,为什么要执行touch /.autorelabel
  4. 修改完/etc/fstab之后,为什么建议执行mount -a再重启机器?
  5. MBR引导446字节引导程序损坏,该如何修复?

欢迎评论区分享你的踩坑经历,建议虚拟机完整复现启动故障实验,加深理解!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 13:32:44

【Dify】智能表格自动化应用

以数据驱动的智能化自动处理正逐步成为数字时代的核心需求。结合Excel、Flask与Dify平台,数据流动与AI能力得以深度整合,推动表格处理的自动化、智能化。 本文聚焦于以标准化Excel为数据源,构建本地API服务,并借助Dify平台完成数据的智能解析、批量分析与结构化输出的完整…

作者头像 李华
网站建设 2026/9/24 13:30:40

【Dify】批量翻译自动化应用

多语种翻译需求在内容分发、企业运营、国际交流等场景中不断增长。自动化批量翻译工具正成为提升效率、降低人工成本的关键手段。 本文围绕Dify批量翻译工作流,介绍核心模型、节点分工、实际流程与典型应用案例,帮助自学编程群体理解其原理及落地价值。 文章目录 批量翻译 核…

作者头像 李华
网站建设 2026/9/24 13:29:50

Django实现xAdmin更新表单自动同步到其他模型

在内容管理系统(CMS)中,通常会遇到这样一个需求:编辑一个模块的内容后,能够自动同步更新到另一个模块,但这些内容可能需要根据不同的规则进行调整或删减。这样可以使得相同的内容在不同模块中得到不同的用途和展示效果。 在本教程中,将详细介绍如何通过Django的adminx机…

作者头像 李华
网站建设 2026/9/24 13:29:40

Django重写User模型修改明文密码加密方法

在Django项目中,使用默认的用户管理系统时,可能会遇到用户密码以明文方式存储的问题。这不仅影响用户体验,也对安全性产生了较大的隐患。因此,在开发过程中,需要对Django的用户管理机制进行调整,确保用户密码在创建时能够被正确加密存储,避免以明文形式显示。 本文将通过…

作者头像 李华
网站建设 2026/9/24 13:29:19

示波器实测RS485:从波形看懂差分信号与串口调试实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华