内存不够用之后:Swap、Linux 启动链与那些能救命的救援操作 内存不够用之后Swap、Linux 启动链与那些能救命的救援操作上一篇把存储从 RAID 拼到 LVM讲的是盘怎么组织。这一篇换个方向内存不够了怎么办以及系统启动不起来的时候从哪一层开始救。这两件事看着不挨着其实是同一条逻辑的两端——计算机永远在用慢一点的存储兜底快一点的存储。内存不够拿磁盘当内存Swap内核启动时认不出磁盘就先用一段内存里的临时文件系统兜底initramfs系统彻底起不来就换个介质把它当数据盘挂起来救救援模式。顺着这条线往下走把 Swap 和启动链一起捋清楚。一、存储器的金字塔为什么必须有 Swap计算机的存储器是一个塔式结构越往上越快、越贵、越小为什么要分层因为快的做不大大的快不了。用一块巨大的 SRAM 当内存成本高到没人付得起全用磁盘当内存CPU 等的每一纳秒都在浪费。分层就是为了在性能和价格之间取平衡靠缓存把热数据往上层搬。数据访问的顺序也是自上而下的CPU 先在寄存器找找不到查 Cache再找不到去内存还找不到才落到磁盘——每次往下走一步都顺手把数据往上层缓存一份。顺手记两个内存的硬指标存取时间每次与 CPU 交换数据的耗时以纳秒计。SDRAM 芯片通常在 510ns。带宽 频率 × 位宽 ÷ 8。以 DDR4-3600、64 位为例单通道 3600MHz × 64bit ÷ 8 28800MB/s双通道翻倍57600MB/s。注意 1B 8bit这个除以 8 是最常被忘掉的一步。内存的价格和容量都有边界这个边界一旦撞上就需要 Swap。Swap 到底在做什么Swap 是受内核内存子系统控制的磁盘区域。内存紧张时内核挑出那些分给了进程、但暂时没人碰的内存页写到磁盘上把 RAM 腾出来给别人用。过程分三种情况内存超限内核把空闲的内存页换出到 Swap重新分配 RAM 页面。程序要访问已换出的页内核先找另一个空闲页写出去再把需要的页从 Swap 换回来。程序要访问的数据本来就在 Swap直接从 Swap 读比回原始磁盘位置读更快。一句话内存不够时先把暂时不用的数据挪到硬盘上腾出内存给正在跑的程序。作用和 Windows 的pagefile.sys是一回事。但要说清楚一条边界Swap 只是应急手段。它落在磁盘上速度比物理内存慢几个数量级。真嫌慢加内存别指望靠 Swap 撑性能。它保证的是进程不被 OOM 杀掉不是跑得快。系统里通常已经有一块 SwapCentOS 7 安装在 LVM 上时是/dev/dm-1。下面讲怎么查看、增加和管理。二、Swap 的查看、创建与管理先用 free 看清现状[rootcentos7 ~]# freetotal usedfreeshared buff/cache available Mem:40261563304603528844121361668523485576Swap:406322804063228默认单位 KiB加-m看 MiB-h更直观。这几个字段经常被误读逐个说清字段含义total物理内存总量used已使用 total − free − buffers − cachefree完全没被任何程序占用的内存shared多个进程共享的内存buffers被改过、但还没写回磁盘的数据cached从磁盘读过、暂时留着备用的数据未修改available真正能被新程序用上的内存最关键的一点别盯着free判断内存够不够要看available。free小得可怜、available却很充裕是健康状态——内存被拿去做缓存了需要时随时能吐出来。反过来available都见底了那才是真紧张。同理看到cached占了几百 M 别慌那不是泄漏那是好事。Swap 要开多大没有放之四海皆准的数字看内存总量和工作负载应用厂商有时也会给建议。一条通行的参考物理内存常规 Swap需要 Hibernate 时的 Swap2GiB 或以下2 倍 RAM3 倍 RAM2GiB 8GiB等同 RAM2 倍 RAM8GiB 64GiB至少 4GiB1.5 倍 RAM64GiB 以上至少 4GiB不建议 HibernateHibernate休眠会让这条规则整体上调因为休眠要把整个内存的内容写进 Swap 再断电恢复时读回来。Swap 比内存小休眠就直接失败。笔记本和台式机才关心这个服务器一般不做休眠。创建一块新的 Swap用parted划分区把文件系统类型设为linux-swap[rootcentos7 ~]# parted /dev/sdb mklabel gpt[rootcentos7 ~]# parted /dev/sdb unit MiB mkpart swap01 linux-swap 1 2049[rootcentos7 ~]# parted /dev/sdb unit MiB print# 格式化 Swap 空间[rootcentos7 ~]# mkswap /dev/sdb1Setting up swapspace version1, size2097148KiB no label,UUID2bf4e179-3648-4412-9495-3b278df4acd6mkswap输出的 UUID 记下来后面写 fstab 要用。技巧如果没有空闲分区也可以直接用文件做 Swapdd造一个文件 →mkswap→swapon临时救急很方便。但文件 Swap 在有文件系统开销的路径上性能略差长期用还是分区或独立 LV 更稳。激活与优先级# 激活[rootcentos7 ~]# swapon /dev/sdb1# 查看已激活的 Swap 列表[rootcentos7 ~]# swapon -sFilename Type Size Used Priority /dev/dm-1 partition40632280-2/dev/sdb1 partition20971480-3优先级Priority是个容易被忽略但很有用的东西。值在-1 到 32767之间越大越优先。值越大越先用——内核会先把高优先级的 Swap 用满再用低优先级的。[rootcentos7 ~]# swapon -p 4 /dev/sdb1这个参数的实际价值把 SSD 上的 Swap 设成高优先级、机械盘上的设成低优先级让换页优先落在快盘上。多个 Swap 同等优先级时内核按激活顺序依次填满不指定就等于放弃了这个调度权。关闭与持久化# 关闭单个[rootcentos7 ~]# swapoff /dev/sdb1# 关闭 fstab 里所有 Swap[rootcentos7 ~]# swapoff -a注意swapoff不是立刻返回的——内核要把这块 Swap 里的数据全部换回内存。如果 Swap 已用空间超过当前内存余量swapoff会一直卡住甚至触发 OOM。生产上关 Swap 前先确认free里的可用内存够装下 Swap 的used。持久化写/etc/fstabUUID2bf4e179-3648-4412-9495-3b278df4acd6 swap swap pri4 0 0pri4就是优先级。用 UUID 而不是/dev/sdb1——设备名会随插拔和顺序变化UUID 不会。# 激活 fstab 中所有 Swap[rootcentos7 ~]# swapon -aswapon -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 的软链接。配置内核参数initcommand。6. systemd 加载 target。加载内核命令行传来的 target或系统默认的default.target通常通向文本或图形登录界面。配置systemctl set-default。7.default.target拉起依赖。它依赖sysinit.target完成系统初始化读/etc/fstab挂载文件系统、启动systemd-journald等同时激活开机自启的单元最后激活getty.target打开 tty1 供登录。配置/etc/fstab、systemctl enable。记住链条的形状就够了固件只管把接力棒交给 GRUBGRUB 只管把内核和 initramfs 送进内存内核靠 initramfs 里那点驱动摸到真正的根最后 systemd 接手把系统拉起来。任何一环断了现象都不同——这也是排障时定位层级的依据。targetsystemd 里的运行级别systemd 用 target 类型单元来分组。multi-user.target里装着chronyd.service、crond.service、firewalld.service这些target 之间还能互相包含graphical.target→multi-user.target→basic.target→sysinit.target。# 看依赖关系往下[rootcentos7 ~]# systemctl list-dependencies graphical.target# 看反向依赖谁依赖了 sshd[rootcentos7 ~]# 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—多用户无 NFS3multi-user.target完全多用户文本界面4—预留未使用5graphical.target图形化多用户6—重启CentOS 6 之前靠/etc/inittab里的id:5:initdefault:设默认级别CentOS 7 已经改用 systemdinittab 不再是配置入口。# 当前会话切换 target立即生效[rootcentos7 ~]# systemctl isolate multi-user.target# 查看开机默认 target[rootcentos7 ~]# systemctl get-defaultgraphical.target# 设置开机默认 target[rootcentos7 ~]# systemctl set-default multi-user.targetisolate是当场切set-default是改了下次才生效两个别混。启动时临时换 target排障时经常需要临时以某个 target 启动不用改任何配置启动时按任意键Enter 除外那是正常启动中断倒计时光标移到第一个条目按e编辑找到以linux16开头的那行末尾追加systemd.unitmulti-user.target按CtrlX启动。这个改动是临时的重启即失效——所以它是排障的首选手段试错零成本。四、GRUB2 配置改哪里别改哪里最容易踩的坑先放前面不要直接改/boot/grub2/grub.cfg。这个文件是grub2-mkconfig生成的产物。你手改一行下次任何一次内核更新或执行grub2-mkconfig都会把它覆盖掉——你改的东西凭空消失还不报错。正确做法是改源头再重新生成。路径角色/boot/grub2/主配置目录grub.cfg、grubenv、user.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路径不同别找错。改超时时间和内核参数[rootcentos7 ~]# vim /etc/default/grubGRUB_TIMEOUT10GRUB_CMDLINE_LINUXrd.lvm.lvcentos/root rd.lvm.lvcentos/swap rhgb quiet# 生成配置文件这一步不能省[rootcentos7 ~]# grub2-mkconfig -o /etc/grub2.cfg改完必须grub2-mkconfig重新生成这是 GRUB 配置里唯一不能忘的一步。改/etc/default/grub不重新生成等于什么都没做。常用内核参数参数作用rhgb启用图形化启动界面quiet减少启动日志输出换成debug则输出详细日志ro/rw根文件系统以只读 / 读写挂载root指定根文件系统设备如root/dev/sda1crashkernelauto预留给内核崩溃转储的内存net.ifnames0关掉网卡一致性命名ens33改回传统名eth0biosdevname0配合上一条彻底关掉基于 BIOS 的命名规则net.ifnames0这条在很多老脚本、老文档里都会遇到——想让网卡叫回eth0就靠它。全部内核参数的权威说明在kernel-doc包里[rootcentos7 ~]# yum install kernel-doc -y[rootcentos7 ~]# less /usr/share/doc/kernel-doc-$(uname -r)/Documentation/admin-guide/kernel-parameters.txt不知道某个启动参数是什么意思时查这份文档不要靠猜。uname -r拿到当前内核版本直接拼路径。设默认启动条目# 看有哪些条目[rootcentos7 ~]# grep -o ^menu.*CentOS L.*Core) /etc/grub2.cfgmenuentryCentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)menuentryCentOS Linux (0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2) 7 (Core)# 改默认条目[rootcentos7 ~]# vim /boot/grub2/grubenvsaved_entryCentOS Linux(0-rescue-43c2aa8a5c024d90af4e8da0b3881cb2)7(Core)技巧系统有 rescue 条目时先把它设成默认启动项重启验证能进救援环境再切回正常条目——等于给自己留好了后路。GRUB 菜单加密GRUB 明文暴露有个隐患谁都能在启动菜单按e改内核参数轻松拿到 root shell下文会演示。要堵这个口子就给菜单加密。# 生成 PBKDF2 密码哈希[rootcentos7 ~]# grub2-mkpasswd-pbkdf2Enter password: redhat Reenter password: redhat PBKDF2hashof your password is grub.pbkdf2.sha512.10000.649DDB2F...8FF0CentOS 7 上/etc/grub.d/01_users脚本会自动读取/boot/grub2/user.cfg里的GRUB2_PASSWORD生成superusers[rootcentos7 ~]# vim /boot/grub2/user.cfgGRUB2_PASSWORDgrub.pbkdf2.sha512.10000.649DDB2F...8FF0# 重新生成配置并重启[rootcentos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg[rootcentos7 ~]# reboot生效后在启动菜单按e会要求输入用户名root和密码验证通过才能编辑。解除加密删掉/boot/grub2/user.cfg重新执行grub2-mkconfig。但注意——如果忘记密码这条路你走不了得靠光盘救援把/boot/grub2/user.cfg删除。一个必须知道的前提GRUB 加密防的是在启动菜单动手脚不防把磁盘拆下来挂到别的机器上读。盘在别人手里加密菜单形同虚设——真正要防这一层得用 LUKS 全盘加密见最后一节。五、三类启动故障现象、定位、处理启动链的每一环断了现象都不一样。先看现象再定层级这是排障的基本功。故障一GRUB 引导程序本身坏了制造现场往 MBR 前 446 字节写零正好覆盖引导程序不动分区表[rootcentos7 ~]# dd if/dev/zero of/dev/sda bs1 count446现象系统不从硬盘启动转而尝试其他启动设备。定位MBR 的第一个组成部分引导程序占 446 字节后面是 4 个各 16 字节的分区表项最后 2 字节结束标志AA55。前 446 字节被清固件把控制权交过来却没人接——链条从第 2 步就断了。处理用光盘启动进救援模式重装引导程序。开机从光盘启动选Troubleshooting选Rescue a CentOS system稍等进入选择界面输入1系统会被挂载到/mnt/sysimage切根并确认是读写挂载sh-4.2# chroot /mnt/sysimagebash-4.2# mount | grep root/dev/mapper/centos-root on /typexfs(rw,relatime,seclabel,attr2,inode64,noquota)这里必须确认rw。救援模式挂进来的根默认可能是只读只读状态下写不进去任何东西你会被命令执行成功但重启没变化坑一次。确认系统所在磁盘重装引导程序bash-4.2# grub2-install /dev/sdaInstallingfori386-pc platform. Installation finished. No error reported.连按两次exit退出第一次退 chroot第二次退出系统重启。故障二引导文件丢失制造现场[rootcentos7 ~]# mv /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64{,.ori}[rootcentos7 ~]# reboot现象系统无法启动提示找不到 vmlinuz 文件。定位GRUB 还在链条的第 4 步断了——它按配置去加载内核文件不在了。处理和上面一样先从光盘进救援模式拿到 root shell再把文件恢复回去从其他系统复制、或从 rpm 包里提取两次exit继续启动。# 从 rpm 包中提取内核文件示例[rootcentos7 ~]# 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。[rootcentos7 ~]# echo /dev/sdb1 /data01 xfs defaults 0 0 /etc/fstab[rootcentos7 ~]# mount -a[rootcentos7 ~]# df -h /data01表现 1挂载点不存在—— 删掉/data01目录后重启。[rootcentos7 ~]# umount /data01[rootcentos7 ~]# rmdir /data01结果能正常进系统挂载点被自动创建。这条很重要systemd 处理 fstab 时会自动mkdir缺失的挂载点。所以挂载点没了不算大事——但如果这是你手误删的、本该存在的目录系统会给你悄悄建一个空的原来挂在那的内容就消失了。看到挂载后目录是空的先想想是不是这个原因。表现 2设备名写错 / 设备不存在—— 把sdb1改成sdb2。[rootcentos7 ~]# vim /etc/fstab/dev/sdb2 /data01 xfs defaults00结果启动时找不到该设备等 1 分 30 秒超时后进入 emergency 模式。改回正确设备名或注释掉该行后输入exit继续启动。那 1 分 30 秒是 systemd 默认的设备等待超时不是卡死。知道这个数字就不会误判为系统挂了。表现 3文件系统损坏—— 直接往设备头写零[rootcentos7 ~]# dd if/dev/zero of/dev/sdb1 bs1M count1结果启动时尝试修复失败提示进 emergency 模式。输 root 密码进入后修复[rootcentos7 ~]# xfs_repair /dev/sdb1修复完成exit继续启动。xfs 用xfs_repairext4 用fsck别用错工具——拿 fsck 去修 xfs只会得到一堆错误提示。三种表现对照病因现象处理挂载点不存在正常启动目录被自动创建通常无需处理设备名错 / 设备缺失等待 90 秒 → emergency改对设备名或注释该行文件系统损坏修复失败 → emergencyxfs_repair/fsck预防这条故障最有效的办法是写 UUID 而不是设备名。blkid拿到 UUID 写进 fstab设备名怎么变都不影响。救援手段不止一种上面全部用光盘但共同思路是把硬盘上的系统当作数据挂到另一个环境里再修。所以手段可以是光盘进 Rescue a CentOS system最标准U 盘启动盘没有光驱的机器用这个把故障盘拔下来挂到另一台机器系统都进不去时这是最后的办法。六、用启动参数救命改 root 密码的两种姿势root 密码忘了靠启动参数可以绕过——这也是GRUB 明文菜单很危险的原因。共同前提启动时按任意键Enter 除外中断倒计时光标移到第一个内核条目按e找到linux16开头那行在其末尾追加参数最后CtrlX启动。姿势一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:/# exittouch /.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 解密工具、初始化脚本。拆开的三个理由职责分离降低维护复杂度。内核升级不必同步改动驱动驱动更新不必重新编译内核。精简内核体积。把所有硬件驱动都塞进 vmlinuz体积会急剧膨胀加载和解压都变慢。initramfs 按当前硬件定制只带必需的。适配多硬件。同一版 vmlinuz 搭配不同的 initramfs就能适配 SATA、NVMe、RAID、加密存储等各种环境。那为什么不直接用真正的根启动因为内核一开始够不着真正的根缺驱动。通用内核只带少量通用驱动认不出 NVMe、RAID 控制器这类设备。initramfs 先加载缺失的驱动内核才能识别存储设备。复杂配置处理不了。LVM 要激活、LUKS 要解密、网络根要连网——这些操作必须在挂载根之前完成而那时真正的根还没挂上来。initramfs 提供了一个能跑这些工具的环境。稳定性和安全。真正的根可能损坏、挂载异常直接启动会卡死且难排查。initramfs 作为过渡层能在挂根前做检查出问题还能提供应急环境解密逻辑放在临时环境里执行也不必暴露在内核中。过渡层这三个字是理解 Linux 启动的钥匙。前面rd.break能拿到 shell正是因为在 initramfs 阶段可以人为打断——如果内核直接起真正的根这个救命入口根本不存在。八、LUKS盘被拿走也不给看前面提过GRUB 密码挡不住把磁盘拆走这一招。要防这个得加密磁盘本身。LUKSLinux Unified Key Setup是 Linux 下主流的磁盘加密标准安装系统时在安装位置里就能勾选。加密后有两个效果开机必须输密码否则读不出盘里的数据用救援模式修盘时同样要输密码。注意LUKS 加密的是数据分区不会加密/boot目录也就是 GRUB 菜单那部分。这是设计使然——GRUB 自己还得能从/boot里把内核读出来。手动加密一块数据盘以/dev/sdb1为例# 1. 装工具[rootcentos7 ~]# yum install cryptsetup -y# 2. 初始化 LUKS 分区会提示不可逆覆盖输入大写 YES 确认[rootcentos7 ~]# cryptsetup luksFormat /dev/sdb1这一步会清空分区原有数据先备份。密码建议至少 8 位含大小写、数字、特殊字符。# 3. 打开映射验证密码后生成 /dev/mapper/crypt_disk[rootcentos7 ~]# cryptsetup open /dev/sdb1 crypt_disk# 4. 对映射设备做文件系统[rootcentos7 ~]# mkfs.xfs /dev/mapper/crypt_disk# 5. 挂载使用[rootcentos7 ~]# mkdir /mnt/encrypted[rootcentos7 ~]# mount /dev/mapper/crypt_disk /mnt/encrypted注意加密设备不能直接格式化或挂载必须先cryptsetup open映射成一个/dev/mapper/下的设备。这是 LUKS 使用中最容易卡住的一步——设备在那里但你没打开它之前内核看到的只是一堆密文。用完关闭[rootcentos7 ~]# umount /mnt/encrypted[rootcentos7 ~]# cryptsetup close crypt_disk开机自动挂载# 1. 取分区 UUID[rootcentos7 ~]# blkid /dev/sdb1# 2. 写 crypttab映射名 UUID 密钥文件 luks[rootcentos7 ~]# echo crypt_disk UUIDxxxx-xxxx-xxxx none luks /etc/crypttab# 3. 写 fstab挂映射设备[rootcentos7 ~]# echo /dev/mapper/crypt_disk /mnt/encrypted xfs defaults 0 0 /etc/fstabcrypttab四个字段映射名、加密分区 UUID、密钥文件路径none表示开机手动输密码、luks。想免去开机输密码把密钥存成文件权限设600在 crypttab 里指向它并把密钥添加给加密设备[rootcentos7 ~]# cryptsetup luksAddKey /dev/sdb1 /root/luks_key这一步要掂量清楚密钥文件躺在系统里等于把钥匙和锁放在同一个口袋开机不再需要人工输入也就失去了盘被拿走就读不出的大部分意义——除非密钥文件本身在别处比如独立的 U 盘。方便和安全在这里只能选一个。收尾这一篇里真正值得记住的零散命令可以查下面这些是查不到的判断。关于内存和 Swap看available别看free。free小是缓存占着健康available见底才是真缺。Swap 是应急不是性能方案。真慢就加内存。多块 Swap 用pri排序。让换页优先落到 SSD 上。swapoff会卡。Swap 里的数据得装得回内存才行装不下就 OOM。改完 fstab 立刻mount -a/swapon -a验证。别等重启才发现写错。关于启动与 GRUB别改grub.cfg改/etc/default/grub再grub2-mkconfig。手改生成的产物迟早被覆盖。启动菜单按e只影响这一次。试错零成本排障首选。net.ifnames0就是让网卡叫回eth0。GRUB 加密不防拔盘。要防这个用 LUKS。关于故障处理先看现象再定层级。启动链里哪一环断了现象都不同。fstab 三种错三种表现。挂载点不存在会正常启动设备名错等 90 秒进 emergency文件系统损坏要xfs_repair。touch /.autorelabel不能漏。改了/etc/shadow又开着 SELinux漏了就白改。救援模式第一件事确认根是读写挂载。只读状态下你的操作全都不算数。fstab 和 crypttab 写 UUID。设备名会变UUID 不会。一句话总结这一篇内存不够用磁盘兜磁盘认不出用内存里的临时系统兜系统起不来换个介质把它当数据盘挂起来救。每一层兜底都是上一层失灵时的退路。