内存不够用之后:Swap、Linux 启动链与那些能救命的救援操作
2026/9/24 14:55:25 网站建设 项目流程

内存不够用之后:Swap、Linux 启动链与那些能救命的救援操作

上一篇把存储从 RAID 拼到 LVM,讲的是"盘怎么组织"。这一篇换个方向:内存不够了怎么办,以及系统启动不起来的时候,从哪一层开始救。

这两件事看着不挨着,其实是同一条逻辑的两端——计算机永远在用"慢一点的存储"兜底"快一点的存储"。内存不够,拿磁盘当内存(Swap);内核启动时认不出磁盘,就先用一段内存里的临时文件系统兜底(initramfs);系统彻底起不来,就换个介质把它当数据盘挂起来救(救援模式)。

顺着这条线往下走,把 Swap 和启动链一起捋清楚。


一、存储器的金字塔:为什么必须有 Swap

计算机的存储器是一个塔式结构,越往上越快、越贵、越小:

为什么要分层?因为快的做不大,大的快不了。用一块巨大的 SRAM 当内存,成本高到没人付得起;全用磁盘当内存,CPU 等的每一纳秒都在浪费。分层就是为了在性能和价格之间取平衡,靠缓存把热数据往上层搬。

数据访问的顺序也是自上而下的:CPU 先在寄存器找,找不到查 Cache,再找不到去内存,还找不到才落到磁盘——每次往下走一步,都顺手把数据往上层缓存一份。

顺手记两个内存的硬指标:

  • 存取时间:每次与 CPU 交换数据的耗时,以纳秒计。SDRAM 芯片通常在 5~10ns。
  • 带宽 = 频率 × 位宽 ÷ 8。以 DDR4-3600、64 位为例,单通道 3600MHz × 64bit ÷ 8 = 28800MB/s;双通道翻倍,57600MB/s。注意 1B = 8bit,这个除以 8 是最常被忘掉的一步。

内存的价格和容量都有边界,这个边界一旦撞上,就需要 Swap。

Swap 到底在做什么

Swap 是受内核内存子系统控制的磁盘区域。内存紧张时,内核挑出那些"分给了进程、但暂时没人碰"的内存页,写到磁盘上,把 RAM 腾出来给别人用。过程分三种情况:

  1. 内存超限:内核把空闲的内存页换出到 Swap,重新分配 RAM 页面。
  2. 程序要访问已换出的页:内核先找另一个空闲页写出去,再把需要的页从 Swap 换回来。
  3. 程序要访问的数据本来就在 Swap:直接从 Swap 读,比回原始磁盘位置读更快。

一句话:内存不够时,先把暂时不用的数据挪到硬盘上,腾出内存给正在跑的程序。作用和 Windows 的pagefile.sys是一回事。

但要说清楚一条边界:Swap 只是应急手段。它落在磁盘上,速度比物理内存慢几个数量级。真嫌慢,加内存,别指望靠 Swap 撑性能。它保证的是"进程不被 OOM 杀掉",不是"跑得快"。

系统里通常已经有一块 Swap(CentOS 7 安装在 LVM 上时是/dev/dm-1)。下面讲怎么查看、增加和管理。


二、Swap 的查看、创建与管理

先用 free 看清现状

[root@centos7 ~]# freetotal usedfreeshared buff/cache available Mem:40261563304603528844121361668523485576Swap:406322804063228

默认单位 KiB,加-m看 MiB,-h更直观。

这几个字段经常被误读,逐个说清:

字段含义
total物理内存总量
used已使用 = total − free − buffers − cache
free完全没被任何程序占用的内存
shared多个进程共享的内存
buffers被改过、但还没写回磁盘的数据
cached从磁盘读过、暂时留着备用的数据(未修改)
available真正能被新程序用上的内存

最关键的一点:别盯着free判断内存够不够,要看available

free小得可怜、available却很充裕,是健康状态——内存被拿去做缓存了,需要时随时能吐出来。反过来,available都见底了,那才是真紧张。同理,看到cached占了几百 M 别慌,那不是泄漏,那是好事。

Swap 要开多大

没有放之四海皆准的数字,看内存总量和工作负载,应用厂商有时也会给建议。一条通行的参考:

物理内存常规 Swap需要 Hibernate 时的 Swap
2GiB 或以下2 倍 RAM3 倍 RAM
2GiB ~ 8GiB等同 RAM2 倍 RAM
8GiB ~ 64GiB至少 4GiB1.5 倍 RAM
64GiB 以上至少 4GiB不建议 Hibernate

Hibernate(休眠)会让这条规则整体上调,因为休眠要把整个内存的内容写进 Swap 再断电,恢复时读回来。Swap 比内存小,休眠就直接失败。笔记本和台式机才关心这个,服务器一般不做休眠。

创建一块新的 Swap

parted划分区,把文件系统类型设为linux-swap

[root@centos7 ~]# parted /dev/sdb mklabel gpt[root@centos7 ~]# parted /dev/sdb unit MiB mkpart swap01 linux-swap 1 2049[root@centos7 ~]# parted /dev/sdb unit MiB print# 格式化 Swap 空间[root@centos7 ~]# mkswap /dev/sdb1Setting up swapspace version1, size=2097148KiB no label,UUID=2bf4e179-3648-4412-9495-3b278df4acd6

mkswap输出的 UUID 记下来,后面写 fstab 要用。

技巧:如果没有空闲分区,也可以直接用文件做 Swap(dd造一个文件 →mkswapswapon),临时救急很方便。但文件 Swap 在有文件系统开销的路径上性能略差,长期用还是分区或独立 LV 更稳。

激活与优先级

# 激活[root@centos7 ~]# swapon /dev/sdb1# 查看已激活的 Swap 列表[root@centos7 ~]# swapon -sFilename Type Size Used Priority /dev/dm-1 partition40632280-2/dev/sdb1 partition20971480-3

优先级(Priority)是个容易被忽略但很有用的东西。值在-1 到 32767之间,越大越优先。值越大越先用——内核会先把高优先级的 Swap 用满,再用低优先级的。

[root@centos7 ~]# swapon -p 4 /dev/sdb1

这个参数的实际价值:把 SSD 上的 Swap 设成高优先级、机械盘上的设成低优先级,让换页优先落在快盘上。多个 Swap 同等优先级时,内核按激活顺序依次填满,不指定就等于放弃了这个调度权。

关闭与持久化

# 关闭单个[root@centos7 ~]# swapoff /dev/sdb1# 关闭 fstab 里所有 Swap[root@centos7 ~]# swapoff -a

注意swapoff不是立刻返回的——内核要把这块 Swap 里的数据全部换回内存。如果 Swap 已用空间超过当前内存余量,swapoff会一直卡住甚至触发 OOM。生产上关 Swap 前先确认free里的可用内存够装下 Swap 的used

持久化写/etc/fstab

UUID=2bf4e179-3648-4412-9495-3b278df4acd6 swap swap pri=4 0 0

pri=4就是优先级。用 UUID 而不是/dev/sdb1——设备名会随插拔和顺序变化,UUID 不会。

# 激活 fstab 中所有 Swap[root@centos7 ~]# swapon -a

swapon -a是个好习惯:改完 fstab 立刻执行它,出错的条目会当场报错,而不是"等到下次重启才发现写错了"。同理,改完挂载项先跑mount -a验证——后面启动故障那节会讲到,fstab 写错是要开不了机的。


三、CentOS 7 的启动链:谁把控制权交给谁

系统从通电到出现登录提示符,中间是一串严格的接力。理解启动的全部意义,就是知道这根链子在哪个环节断的。

一句话概括这根链条:

加电 → 固件(POST) → 引导设备 → GRUB2 → kernel + initramfs → systemd(PID 1) → default.target → 登录

逐步拆开:

1. 加电,固件自检。UEFI 或 BIOS 运行 POST,初始化硬件。这个阶段按 F2 之类的组合键进固件配置。

2. 固件找启动设备,加载 boot loader。按固件里配的顺序,读启动磁盘的 MBR,把控制权交给 GRUB2。

  • 配置:grub2-install,负责把 GRUB2 装到磁盘上。

3. GRUB2 读取配置,显示菜单。/boot/grub2/grub.cfg加载,列出可启动的系统让你选。

  • 配置:改/etc/grub.d/目录和/etc/default/grub,再用grub2-mkconfig生成grub.cfg

4. 加载 kernel 和 initramfs 到内存。按选中条目的配置,把内核和 initramfs 载入内存,控制权交给内核,同时把内核参数、initramfs 的内存位置一并传过去。内核在 initramfs 里找到硬件驱动,初始化硬件。

  • 配置:/etc/dracut.conf.d/dracut命令;lsinitrd可以查看 initramfs 内容。

5. initramfs 执行/sbin/init,作为 PID 1。在 CentOS 7 上,/sbin/init是指向 systemd 的软链接。

  • 配置:内核参数init=command

6. systemd 加载 target。加载内核命令行传来的 target,或系统默认的default.target,通常通向文本或图形登录界面。

  • 配置:systemctl set-default

7.default.target拉起依赖。它依赖sysinit.target完成系统初始化(读/etc/fstab挂载文件系统、启动systemd-journald等),同时激活开机自启的单元,最后激活getty.target打开 tty1 供登录。

  • 配置:/etc/fstabsystemctl enable

记住链条的形状就够了:固件只管把接力棒交给 GRUB,GRUB 只管把内核和 initramfs 送进内存,内核靠 initramfs 里那点驱动摸到真正的根,最后 systemd 接手把系统拉起来。任何一环断了,现象都不同——这也是排障时定位层级的依据。

target:systemd 里的"运行级别"

systemd 用 target 类型单元来分组。multi-user.target里装着chronyd.servicecrond.servicefirewalld.service这些;target 之间还能互相包含:graphical.targetmulti-user.targetbasic.targetsysinit.target

# 看依赖关系(往下)[root@centos7 ~]# systemctl list-dependencies graphical.target# 看反向依赖:谁依赖了 sshd[root@centos7 ~]# systemctl list-dependencies sshd.service --reversesshd.service ● └─multi-user.target ● └─graphical.target

反向依赖这个查法很实用:想知道"关掉这个服务的后果是什么"、“它属于哪个 target”--reverse一查就清楚。

传统的 SysVinit 有 7 个运行级别,和 target 的对应关系:

级别对应 target作用
0关机
1emergency.target/rescue.target单用户模式,仅 root,无网络,用于修复
2多用户,无 NFS
3multi-user.target完全多用户,文本界面
4预留,未使用
5graphical.target图形化多用户
6重启

CentOS 6 之前靠/etc/inittab里的id:5:initdefault:设默认级别;CentOS 7 已经改用 systemd,inittab 不再是配置入口

# 当前会话切换 target(立即生效)[root@centos7 ~]# systemctl isolate multi-user.target# 查看开机默认 target[root@centos7 ~]# systemctl get-defaultgraphical.target# 设置开机默认 target[root@centos7 ~]# systemctl set-default multi-user.target

isolate当场切set-default改了下次才生效,两个别混。

启动时临时换 target

排障时经常需要临时以某个 target 启动,不用改任何配置:

  1. 启动时按任意键(Enter 除外,那是正常启动)中断倒计时;
  2. 光标移到第一个条目,按e编辑;
  3. 找到以linux16开头的那行,末尾追加systemd.unit=multi-user.target
  4. Ctrl+X启动

这个改动是临时的,重启即失效——所以它是排障的首选手段,试错零成本。


四、GRUB2 配置:改哪里,别改哪里

最容易踩的坑先放前面:不要直接改/boot/grub2/grub.cfg

这个文件是grub2-mkconfig生成的产物。你手改一行,下次任何一次内核更新或执行grub2-mkconfig都会把它覆盖掉——你改的东西凭空消失,还不报错。正确做法是改源头,再重新生成。

路径角色
/boot/grub2/主配置目录:grub.cfggrubenvuser.cfg
/etc/grub2.cfg指向/boot/grub2/grub.cfg的软链接
/etc/grub.d/数字开头的脚本,按序执行;00_header会读/etc/default/grub
/etc/default/grub定义变量:超时时间、内核参数等——日常改这里
/boot/grub2/grubenv默认启动条目

EFI 启动方式的配置文件是/etc/grub2-efi.cfg,路径不同,别找错。

改超时时间和内核参数

[root@centos7 ~]# vim /etc/default/grubGRUB_TIMEOUT=10GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"# 生成配置文件(这一步不能省)[root@centos7 ~]# grub2-mkconfig -o /etc/grub2.cfg

改完必须grub2-mkconfig重新生成,这是 GRUB 配置里唯一不能忘的一步。改/etc/default/grub不重新生成,等于什么都没做。

常用内核参数:

参数作用
rhgb启用图形化启动界面
quiet减少启动日志输出;换成debug则输出详细日志
ro/rw根文件系统以只读 / 读写挂载
root=指定根文件系统设备,如root=/dev/sda1
crashkernel=auto预留给内核崩溃转储的内存
net.ifnames=0关掉网卡一致性命名(ens33),改回传统名(eth0
biosdevname=0配合上一条,彻底关掉基于 BIOS 的命名规则

net.ifnames=0这条在很多老脚本、老文档里都会遇到——想让网卡叫回eth0,就靠它。

全部内核参数的权威说明在kernel-doc包里:

[root@centos7 ~]# yum install kernel-doc -y[root@centos7 ~]# less /usr/share/doc/kernel-doc-$(uname -r)/Documentation/admin-guide/kernel-parameters.txt

不知道某个启动参数是什么意思时,查这份文档,不要靠猜。uname -r拿到当前内核版本,直接拼路径。

设默认启动条目

# 看有哪些条目[root@centos7 ~]# grep -o "^menu.*CentOS L.*Core)'" /etc/grub2.cfgmenuentry'CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)'menuentry'CentOS Linux (0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2) 7 (Core)'# 改默认条目[root@centos7 ~]# vim /boot/grub2/grubenvsaved_entry=CentOS Linux(0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2)7(Core)

技巧:系统有 rescue 条目时,先把它设成默认启动项,重启验证能进救援环境,再切回正常条目——等于给自己留好了后路。

GRUB 菜单加密

GRUB 明文暴露有个隐患:谁都能在启动菜单按e改内核参数,轻松拿到 root shell(下文会演示)。要堵这个口子,就给菜单加密。

# 生成 PBKDF2 密码哈希[root@centos7 ~]# grub2-mkpasswd-pbkdf2Enter password: redhat Reenter password: redhat PBKDF2hashof your password is grub.pbkdf2.sha512.10000.649DDB2F...8FF0

CentOS 7 上/etc/grub.d/01_users脚本会自动读取/boot/grub2/user.cfg里的GRUB2_PASSWORD,生成superusers

[root@centos7 ~]# vim /boot/grub2/user.cfgGRUB2_PASSWORD=grub.pbkdf2.sha512.10000.649DDB2F...8FF0# 重新生成配置并重启[root@centos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg[root@centos7 ~]# reboot

生效后,在启动菜单按e会要求输入用户名root和密码,验证通过才能编辑。

解除加密:删掉/boot/grub2/user.cfg,重新执行grub2-mkconfig。但注意——如果忘记密码,这条路你走不了,得靠光盘救援,把/boot/grub2/user.cfg删除。

一个必须知道的前提:GRUB 加密防的是"在启动菜单动手脚",不防把磁盘拆下来挂到别的机器上读。盘在别人手里,加密菜单形同虚设——真正要防这一层,得用 LUKS 全盘加密,见最后一节。


五、三类启动故障:现象、定位、处理

启动链的每一环断了,现象都不一样。先看现象,再定层级,这是排障的基本功。

故障一:GRUB 引导程序本身坏了

制造现场(往 MBR 前 446 字节写零,正好覆盖引导程序,不动分区表):

[root@centos7 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446

现象:系统不从硬盘启动,转而尝试其他启动设备。

定位:MBR 的第一个组成部分引导程序占 446 字节,后面是 4 个各 16 字节的分区表项,最后 2 字节结束标志AA55。前 446 字节被清,固件把控制权交过来却没人接——链条从第 2 步就断了。

处理:用光盘启动进救援模式,重装引导程序。

  1. 开机从光盘启动,选Troubleshooting
  2. Rescue a CentOS system
  3. 稍等进入选择界面,输入1,系统会被挂载到/mnt/sysimage
  4. 切根,并确认是读写挂载:
sh-4.2# chroot /mnt/sysimagebash-4.2# mount | grep root/dev/mapper/centos-root on /typexfs(rw,relatime,seclabel,attr2,inode64,noquota)

这里必须确认rw。救援模式挂进来的根默认可能是只读,只读状态下写不进去任何东西,你会被"命令执行成功但重启没变化"坑一次。

  1. 确认系统所在磁盘,重装引导程序:
bash-4.2# grub2-install /dev/sdaInstallingfori386-pc platform. Installation finished. No error reported.
  1. 连按两次exit退出(第一次退 chroot,第二次退出系统),重启。

故障二:引导文件丢失

制造现场

[root@centos7 ~]# mv /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64{,.ori}[root@centos7 ~]# reboot

现象:系统无法启动,提示找不到 vmlinuz 文件。

定位:GRUB 还在,链条的第 4 步断了——它按配置去加载内核,文件不在了。

处理:和上面一样,先从光盘进救援模式拿到 root shell,再把文件恢复回去(从其他系统复制、或从 rpm 包里提取),两次exit继续启动。

# 从 rpm 包中提取内核文件(示例)[root@centos7 ~]# rpm2cpio kernel-3.10.0-1160.71.1.el7.x86_64.rpm | cpio -idmv

恢复文件有个前提:得知道该还原哪个版本。出事前uname -r的结果、或者 GRUB 菜单里那条menuentry里的版本号,都是线索。

故障三:/etc/fstab 写错

这类故障最常见,也最值得细看——它有三种不同表现,对应三种不同的病因。

先有个正常现场:/dev/sdb1格式化为 xfs,挂到/data01,写进 fstab。

[root@centos7 ~]# echo '/dev/sdb1 /data01 xfs defaults 0 0' >> /etc/fstab[root@centos7 ~]# mount -a[root@centos7 ~]# df -h /data01

表现 1:挂载点不存在—— 删掉/data01目录后重启。

[root@centos7 ~]# umount /data01[root@centos7 ~]# rmdir /data01

结果:能正常进系统,挂载点被自动创建。

这条很重要:systemd 处理 fstab 时会自动mkdir缺失的挂载点。所以挂载点没了不算大事——但如果这是你手误删的、本该存在的目录,系统会给你悄悄建一个空的,原来挂在那的内容就"消失"了。看到挂载后目录是空的,先想想是不是这个原因。

表现 2:设备名写错 / 设备不存在—— 把sdb1改成sdb2

[root@centos7 ~]# vim /etc/fstab/dev/sdb2 /data01 xfs defaults00

结果:启动时找不到该设备,等 1 分 30 秒超时后进入 emergency 模式

改回正确设备名(或注释掉该行)后输入exit,继续启动。

那 1 分 30 秒是 systemd 默认的设备等待超时,不是卡死。知道这个数字,就不会误判为系统挂了。

表现 3:文件系统损坏—— 直接往设备头写零:

[root@centos7 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1

结果:启动时尝试修复失败,提示进 emergency 模式。输 root 密码进入后修复:

[root@centos7 ~]# xfs_repair /dev/sdb1

修复完成,exit继续启动。xfs 用xfs_repair,ext4 用fsck,别用错工具——拿 fsck 去修 xfs,只会得到一堆错误提示。

三种表现对照:

病因现象处理
挂载点不存在正常启动,目录被自动创建通常无需处理
设备名错 / 设备缺失等待 90 秒 → emergency改对设备名或注释该行
文件系统损坏修复失败 → emergencyxfs_repair/fsck

预防这条故障,最有效的办法是写 UUID 而不是设备名。blkid拿到 UUID 写进 fstab,设备名怎么变都不影响。

救援手段不止一种

上面全部用光盘,但共同思路是:把硬盘上的系统当作数据挂到另一个环境里,再修。所以手段可以是:

  • 光盘:进 Rescue a CentOS system,最标准;
  • U 盘启动盘:没有光驱的机器用这个;
  • 把故障盘拔下来挂到另一台机器:系统都进不去时,这是最后的办法。

六、用启动参数救命:改 root 密码的两种姿势

root 密码忘了,靠启动参数可以绕过——这也是"GRUB 明文菜单很危险"的原因。

共同前提:启动时按任意键(Enter 除外)中断倒计时,光标移到第一个内核条目,按e,找到linux16开头那行,在其末尾追加参数,最后Ctrl+X启动。

姿势一:rd.break

在内核参数末尾加rd.break它的作用是:在 initramfs 把控制权交给真正的系统之前,停下来给一个 root shell。

switch_root:/# mount -o remount,rw /sysroot # 根此时以只读挂在 /sysroot,先改成读写switch_root:/# chroot /sysroot # 切换根sh-4.2# echo 新密码 | passwd --stdin rootsh-4.2# touch /.autorelabel # SELinux 开启时必做sh-4.2# exitswitch_root:/# exit

touch /.autorelabel这行千万别漏。改了/etc/shadow之后,这个文件在 SELinux 眼里成了"未标记文件",不触发一次全盘重新标记,重启后 root 依然登录不了——你会以为密码没改成功,反复重来。代价是重新标记比较慢,但比登不进去强。

姿势二:init=/bin/bash

linux16那行末尾追加init=/bin/bash它让内核直接跑 bash,跳过 systemd 及其后续全部初始化,你现在就在真正的根上,只是文件系统是只读的。

bash-4.2# mount -o remount,rw /bash-4.2# passwd -d root # 先删除 root 密码bash-4.2# touch /.autorelabelbash-4.2# exec /usr/lib/systemd/systemd # 接着把系统启起来

删掉密码后正常启动,用 root 空密码登录,再重设密码。

两种姿势的区别,记这一条就够了:

rd.breakinit=/bin/bash
打断位置initramfs 移交给系统之前完全跳过 systemd
真正的根只读挂在/sysroot只读挂在/
后续操作chroot /sysroot直接在/操作
继续启动exit两次exec /usr/lib/systemd/systemd

也可以用 Live CD 启动后直接改/etc/shadow,删掉或替换 root 的密码字段。路子更粗暴,但盘不在本机时是唯一选择。


七、进阶:vmlinuz 和 initramfs 为什么分开

这个问题值得单独说——它直接解释了"为什么启动要绕这么一圈",也是前几节所有救援操作的底层原因。

vmlinuz是压缩后的内核镜像,提供进程管理、内存管理、调度这些核心能力,要求通用、稳定、不能频繁动。

initramfs是一个临时的内存文件系统,装的是启动阶段要用的"辅助工具":特定磁盘驱动、LVM 模块、LUKS 解密工具、初始化脚本。

拆开的三个理由:

  1. 职责分离,降低维护复杂度。内核升级不必同步改动驱动;驱动更新不必重新编译内核。
  2. 精简内核体积。把所有硬件驱动都塞进 vmlinuz,体积会急剧膨胀,加载和解压都变慢。initramfs 按当前硬件定制,只带必需的。
  3. 适配多硬件。同一版 vmlinuz 搭配不同的 initramfs,就能适配 SATA、NVMe、RAID、加密存储等各种环境。

那为什么不直接用真正的根启动?

因为内核一开始够不着真正的根

  1. 缺驱动。通用内核只带少量通用驱动,认不出 NVMe、RAID 控制器这类设备。initramfs 先加载缺失的驱动,内核才能识别存储设备。
  2. 复杂配置处理不了。LVM 要激活、LUKS 要解密、网络根要连网——这些操作必须在挂载根之前完成,而那时真正的根还没挂上来。initramfs 提供了一个能跑这些工具的环境。
  3. 稳定性和安全。真正的根可能损坏、挂载异常,直接启动会卡死且难排查。initramfs 作为过渡层,能在挂根前做检查,出问题还能提供应急环境;解密逻辑放在临时环境里执行,也不必暴露在内核中。

"过渡层"这三个字,是理解 Linux 启动的钥匙。前面rd.break能拿到 shell,正是因为在 initramfs 阶段可以人为打断——如果内核直接起真正的根,这个救命入口根本不存在。


八、LUKS:盘被拿走也不给看

前面提过,GRUB 密码挡不住"把磁盘拆走"这一招。要防这个,得加密磁盘本身。

LUKS(Linux Unified Key Setup)是 Linux 下主流的磁盘加密标准,安装系统时在"安装位置"里就能勾选。加密后有两个效果:

  • 开机必须输密码,否则读不出盘里的数据;
  • 用救援模式修盘时,同样要输密码。

注意:LUKS 加密的是数据分区,不会加密/boot目录,也就是 GRUB 菜单那部分。这是设计使然——GRUB 自己还得能从/boot里把内核读出来。

手动加密一块数据盘

/dev/sdb1为例:

# 1. 装工具[root@centos7 ~]# yum install cryptsetup -y# 2. 初始化 LUKS 分区(会提示不可逆覆盖,输入大写 YES 确认)[root@centos7 ~]# cryptsetup luksFormat /dev/sdb1

这一步会清空分区原有数据,先备份。密码建议至少 8 位,含大小写、数字、特殊字符。

# 3. 打开映射:验证密码后生成 /dev/mapper/crypt_disk[root@centos7 ~]# cryptsetup open /dev/sdb1 crypt_disk# 4. 对映射设备做文件系统[root@centos7 ~]# mkfs.xfs /dev/mapper/crypt_disk# 5. 挂载使用[root@centos7 ~]# mkdir /mnt/encrypted[root@centos7 ~]# mount /dev/mapper/crypt_disk /mnt/encrypted

注意:加密设备不能直接格式化或挂载,必须先cryptsetup open映射成一个/dev/mapper/下的设备。这是 LUKS 使用中最容易卡住的一步——设备在那里,但你没打开它之前,内核看到的只是一堆密文。

用完关闭:

[root@centos7 ~]# umount /mnt/encrypted[root@centos7 ~]# cryptsetup close crypt_disk

开机自动挂载

# 1. 取分区 UUID[root@centos7 ~]# blkid /dev/sdb1# 2. 写 crypttab:映射名 UUID 密钥文件 luks[root@centos7 ~]# echo "crypt_disk UUID=xxxx-xxxx-xxxx none luks" >> /etc/crypttab# 3. 写 fstab,挂映射设备[root@centos7 ~]# echo "/dev/mapper/crypt_disk /mnt/encrypted xfs defaults 0 0" >> /etc/fstab

crypttab四个字段:映射名、加密分区 UUID、密钥文件路径(none表示开机手动输密码)、luks

想免去开机输密码,把密钥存成文件(权限设600),在 crypttab 里指向它,并把密钥添加给加密设备:

[root@centos7 ~]# cryptsetup luksAddKey /dev/sdb1 /root/luks_key

这一步要掂量清楚:密钥文件躺在系统里,等于把钥匙和锁放在同一个口袋,开机不再需要人工输入,也就失去了"盘被拿走就读不出"的大部分意义——除非密钥文件本身在别处(比如独立的 U 盘)。方便和安全,在这里只能选一个。


收尾:这一篇里真正值得记住的

零散命令可以查,下面这些是查不到的判断。

关于内存和 Swap

  1. available,别看freefree小是缓存占着,健康;available见底才是真缺。
  2. Swap 是应急,不是性能方案。真慢就加内存。
  3. 多块 Swap 用pri排序。让换页优先落到 SSD 上。
  4. swapoff会卡。Swap 里的数据得装得回内存才行,装不下就 OOM。
  5. 改完 fstab 立刻mount -a/swapon -a验证。别等重启才发现写错。

关于启动与 GRUB

  1. 别改grub.cfg,改/etc/default/grubgrub2-mkconfig手改生成的产物,迟早被覆盖。
  2. 启动菜单按e只影响这一次。试错零成本,排障首选。
  3. net.ifnames=0就是让网卡叫回eth0
  4. GRUB 加密不防拔盘。要防这个,用 LUKS。

关于故障处理

  1. 先看现象,再定层级。启动链里哪一环断了,现象都不同。
  2. fstab 三种错,三种表现。挂载点不存在会正常启动;设备名错等 90 秒进 emergency;文件系统损坏要xfs_repair
  3. touch /.autorelabel不能漏。改了/etc/shadow又开着 SELinux,漏了就白改。
  4. 救援模式第一件事:确认根是读写挂载。只读状态下你的操作全都不算数。
  5. fstab 和 crypttab 写 UUID。设备名会变,UUID 不会。

一句话总结这一篇:内存不够,用磁盘兜;磁盘认不出,用内存里的临时系统兜;系统起不来,换个介质把它当数据盘挂起来救。每一层兜底,都是上一层失灵时的退路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询