云原生运维学习笔记交换空间、系统启动与grub2故障处理今天的内容特别硬核——交换空间管理、系统启动原理、GRUB2配置和故障处理。说实话看到课表的时候心里咯噔一下因为系统启动这块以前总觉得是“黑盒”开机就开机了从来没想过背后发生了什么。但跟着老师一步步操作下来发现其实整个流程都有迹可循理解了之后再看那些开机报错心里就有底了。课前还有一个小练习是逻辑卷扩缩容的正好复习一下昨天的内容。这篇博客就当作我的课堂笔记把重点、踩过的坑和自己的理解都记下来希望能帮到同样在学的朋友。环境还是老样子CentOS 7root用户所有命令都实际跑过。课前练习逻辑卷扩缩容题目是这样的[rootserver ~]# df -hT /home/ /文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-home xfs 147G 33M 147G1% /home /dev/mapper/centos-root xfs 50G1.6G 49G4% /要求/home缩减100G/root扩展100G数据不能丢。这个练习考察的是逻辑卷的缩减和扩展。XFS文件系统不支持缩减所以不能直接缩/home。思路应该是先把/home的数据备份或迁移走删除/home逻辑卷释放空间给/root扩展然后再重建/home。或者如果卷组有足够空闲空间直接扩展/root/home不动也行——但题目要求/home缩减100G那就得按流程来。这个练习让我意识到LVM的灵活性虽然好但缩减操作确实麻烦生产环境要谨慎。Linux交换空间管理计算机存储器的层次结构老师先带我们回顾了计算机存储器的层次结构。计算机存储器速度越快成本越高。为了获得好的性能/价格比各种存储器组成一个层状的塔式结构CPU寄存器CPU内部用来存放数据的小型存储区域速度最快容量最小。CPU高速缓存Cache容量小、速度快的高缓冲存储器由SRAM组成直接制作在CPU芯片内速度几乎与CPU一样快。主存储器内存存放指令和数据能由CPU直接随机存取。速度比Cache慢但容量大得多。辅助存储器磁盘速度慢得多但容量大可持久化存储。CPU读取数据的顺序是寄存器 → Cache → 内存 → 磁盘。如果在寄存器中找不到数据就从Cache中找Cache中没有就从内存中找内存中没有就从磁盘中找并将数据缓存在内存中。这个层次结构的设计就是为了在速度和成本之间取得平衡。物理内存与虚拟内存计算机系统将内存划分为固定大小的块称为page标准page大小为4KiB。进程并不直接对物理内存寻址每个进程具有虚拟地址空间。当进程请求内存时MMU内存管理单元将虚拟地址映射到物理地址。为什么CPU不直接访问物理地址老师给了两个原因虚拟内存的容量是物理内存和交换空间的总和虚拟地址负责映射到物理内存地址和交换空间地址。进程希望内存是连续的。如果直接访问物理地址内核很难保证物理地址空间连续因为进程运行和退出会导致内存碎片化。虚拟地址在虚拟内存中是连续的MMU负责映射到物理地址。这个设计很巧妙——每个进程都以为自己独占一块连续的内存实际上是MMU在背后做了映射。Swap空间是什么Swap交换空间是受Linux内核内存子系统控制的磁盘区域。它的功能有三个当内存使用量超过限制时内核寻找已分配给进程但空闲的内存页将其写入交换空间并向其他进程重新分配RAM页面。如果某个程序需要访问磁盘上的页面内核会找到另一个空闲内存页将其写入磁盘然后从交换区重新调用所需页面。如果某个程序需要访问的数据存放在交换空间则该程序直接从交换空间读取数据而不需要从磁盘原始位置读取进而提高速度。简单说Swap就是在内存不够时把暂时不用的数据存到硬盘上腾出内存给别的程序用。和Windows的虚拟内存pagefile.sys作用一样。但要注意交换空间只是临时的解决办法。交换区位于磁盘上速度比物理内存慢得多如果需要更快的速度最好的办法仍然是加大物理内存。查看内存[rootcentos7 ~]# freetotal usedfreeshared buff/cache available Mem:40261563304603528844121361668523485576Swap:406322804063228输出说明Memtotal物理内存、used已使用、free未使用、shared共享内存、buff/cache缓存、available可用。Swaptotal交换空间、used已使用、free未使用。我习惯用free -h单位更直观。Swap空间大小Swap空间大小要根据物理内存和系统用途来定。老师给了一张表物理内存(RAM)交换空间允许HIBERNATE时的交换空间2GiB或以下两倍的RAM三倍的RAM2GiB和8GiB之间同等的RAM两倍的RAM8GiB和64GiB之间至少4GiB1.5倍的RAM64GiB以上至少4GiB不建议Hibernate笔记本电脑和台式机的Hibernate功能会在关机前使用交换空间保存RAM内容重新开机时从交换空间恢复所以需要更大的交换空间。创建交换空间# 使用parted创建分区文件系统类型设置为linux-swap[rootcentos7 ~]# parted /dev/sdb mklabel gpt[rootcentos7 ~]# parted /dev/sdb unit MiB mkpart swap01 swap 1 2049# 格式化swap空间[rootcentos7 ~]# mkswap /dev/sdb1Setting up swapspace version1, size2097148KiB no label,UUID2bf4e179-3648-4412-9495-3b278df4acd6激活和取消激活# 激活swap空间[rootcentos7 ~]# swapon /dev/sdb1# 查看swap设备列表[rootcentos7 ~]# swapon -sFilename Type Size Used Priority /dev/dm-1 partition40632280-2/dev/sdb1 partition20971480-3# 指定优先级[rootcentos7 ~]# swapon -p 4 /dev/sdb1# 取消激活[rootcentos7 ~]# swapoff /dev/sdb1多个交换空间具有相同优先级时系统会按顺序使用——先用第一个满了再用第二个。指定优先级可以强制使用顺序值越大优先级越高。持久化激活修改/etc/fstab文件UUID2bf4e179-3648-4412-9495-3b278df4acd6 swap swap pri4 0 0然后用swapon -a激活所有交换设备swapoff -a取消激活。Linux系统启动原理CentOS 7启动过程这是今天的重头戏。老师从较高层面概述了CentOS 7的启动过程接通电源固件运行POST系统固件UEFI或BIOS运行开机自检初始化硬件。固件搜索启动设备根据配置顺序搜索启动磁盘上的MBR读取boot loaderGRUB2将控制权交给它。GRUB2加载配置从/boot/grub2/grub.cfg加载配置显示操作系统菜单。加载kernel和initramfs根据选定条目从磁盘加载kernel和initramfs到内存。initramfs是一个存档包含启动时所有必要硬件的内核模块、初始化脚本等。initramfs执行/sbin/init作为PID 1。在CentOS中/sbin/init是指向systemd的链接。systemd加载target加载从内核命令行传递的target或系统配置的default.target。default.target依赖sysinit.targetsysinit.target用于初始化系统例如读取/etc/fstab挂载文件系统激活systemd-journald等。激活开机启动的单元。激活getty.target打开tty1终端用于用户登录。这个流程看起来简单但每一步都有很多细节。老师带我们看了target之间的依赖关系[rootcentos7 ~]# systemctl list-dependencies graphical.targetgraphical.target ● ├─accounts-daemon.service ● ├─gdm.service ● ├─network.service ● └─multi-user.target......# 查看反向依赖[rootcentos7 ~]# systemctl list-dependencies sshd.service --reversesshd.service ● └─multi-user.target ● └─graphical.targettarget是可以嵌套的graphical.target包含multi-user.targetmulti-user.target包含basic.targetbasic.target包含sysinit.target。理解了这层关系就知道为什么systemctl set-default multi-user.target可以切换运行级别了。系统启动级别传统的SysVinit系统定义了7个运行级别0-6CentOS 7用target来模拟运行级别target作用0关机1emergency.target rescue.target单用户模式用于系统修复2多用户模式无NFS3multi-user.target完全多用户模式文本界面4预留级别5graphical.target图形化多用户模式6重启设置系统运行目标# 查看系统开机默认运行target[rootcentos7 ~]# systemctl get-defaultgraphical.target# 设置系统当前运行target[rootcentos7 ~]# systemctl isolate multi-user.target# 设置系统开机默认运行target[rootcentos7 ~]# systemctl set-default multi-user.target在系统启动时选择其它目标在启动时按任意键中断倒计时Enter除外将光标移至第一个内核条目按e编辑在以linux16开头的行末尾附加systemd.unitmulti-user.target按Ctrlx启动。这个配置是临时生效的常用于故障排除。重置ROOT密码这个技能特别实用——万一忘了root密码怎么办有两种方法方法1rd.break重启系统按任意键中断倒计时。按e编辑第一个内核条目。在以linux16开头的行末尾附加rd.break按Ctrlx启动。系统显示root shell磁盘上的根文件系统以只读方式挂载在/sysroot。重新挂载为读写mount -o remount,rw /sysroot切换root位置chroot /sysroot设置新密码echo 123 | passwd --stdin root如果开启了SELinux创建/.autorelabel文件。执行exit两次系统继续启动。方法2init/bin/bash重启系统按任意键中断倒计时。按e编辑第一个内核条目。在以linux16开头的行末尾附加init/bin/bash按Ctrlx启动。系统显示root shell根文件系统以只读方式挂载在/。重新挂载为读写mount -o remount,rw /删除root密码passwd -d root如果开启了SELinux创建/.autorelabel文件。执行exec /usr/lib/systemd/systemd继续启动。这两种方法我都试了一遍都能成功重置密码。关键是理解initramfs阶段和实际系统阶段的区别。/etc/fstab引起的启动问题/etc/fstab配置错误是常见的启动故障原因。老师演示了三种情况故障1挂载点不存在[rootcentos7 ~]# umount /data01[rootcentos7 ~]# rmdir /data01重启后系统自动创建挂载点正常启动。故障2设备名称错误将/etc/fstab中的/dev/sdb1改为/dev/sdb2不存在的设备重启后启动过程中找不到设备按Esc查看启动过程。1分30秒超时后进入emergency模式。修改为正确的值或注释该条目输入exit继续启动。故障3破坏文件系统[rootcentos7 ~]# dd if/dev/zero of/dev/sdb1 bs1M count1重启后系统尝试修复文件系统失败后进入emergency模式。输入root密码进入执行xfs_repair /dev/sdb1修复然后exit继续启动。这些故障模拟让我理解了/etc/fstab的重要性——配错了可能导致系统起不来。GRUB2配置GRUB2的主要配置文件/boot/grub2/grub.cfg主配置文件不要直接修改。/etc/grub.d/脚本目录按数字顺序执行。/etc/default/grub定义grub启动变量信息。/boot/grub2/grubenv设定默认启动条目。修改配置后需要执行grub2-mkconfig -o /etc/grub2.cfg生成新的配置文件。修改菜单超时时间[rootcentos7 ~]# vim /etc/default/grubGRUB_TIMEOUT10[rootcentos7 ~]# grub2-mkconfig -o /etc/grub2.cfg修改内核启动参数[rootcentos7 ~]# vim /etc/default/grubGRUB_CMDLINE_LINUXrd.lvm.lvcentos/root rd.lvm.lvcentos/swap rhgb quiet consolettyS0rhgb启用图形化启动界面。quiet减少启动过程中的日志输出。consolettyS0启动信息显示到ttyS0终端。GRUB菜单加密# 生成密码[rootcentos7 ~]# grub2-mkpasswd-pbkdf2Enter password: redhat Reenter password: redhat PBKDF2hashof your password is grub.pbkdf2.sha512...# 创建用户配置文件[rootcentos7 ~]# vim /boot/grub2/user.cfgGRUB2_PASSWORDgrub.pbkdf2.sha512...# 重新生成配置文件[rootcentos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg加密后按e编辑启动条目时需要输入用户名root和密码。GRUB2故障处理故障1grub引导程序故障[rootcentos7 ~]# dd if/dev/zero of/dev/sda bs1 count446这会清除MBR中的引导程序系统无法从硬盘启动。解决方法用光盘启动选择Troubleshooting → Rescue a CentOS system进入救援模式后sh-4.2# chroot /mnt/sysimagebash-4.2# grub2-install /dev/sdabash-4.2# exitsh-4.2# exit故障2引导文件丢失[rootcentos7 ~]# mv /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64{,.ori}系统无法启动提示文件找不到。解决方法类似用光盘启动进入救援模式从其他系统复制或从rpm包提取恢复文件。这些故障处理让我意识到GRUB2虽然平时不出问题但一旦出问题就很麻烦。掌握救援模式的操作很有必要。思考题老师留了几个思考题我觉得挺有意思1. 如何避免别人获得磁盘后读取数据用LUKSLinux Unified Key Setup加密磁盘。安装系统时可以配置加密启动时需要输入密码才能读取数据。手动加密数据盘的步骤是cryptsetup luksFormat→cryptsetup open→mkfs→mount。还可以配置/etc/crypttab实现开机自动挂载。在操作系统安装配置安装位置的时候可以使用LUKS加密磁盘:效果系统启动的时候必须输入密码才能读取硬盘中数据。修复磁盘的时候同样需要输入密码。2. 为什么将vmlinuz和initramfs分开职责分离降低维护复杂度精简内核体积提升启动效率适配多硬件与场景增强通用性。3. Linux为什么不直接使用真正的根启动缺少驱动无法识别真正的根设备无法处理复杂的根目录配置如LVM、LUKS保障启动流程的稳定性与安全性。课后总结今天的内容偏底层但非常实用。交换空间部分理解了Swap的作用和创建方法。虽然现在内存越来越大Swap用得少了但理解它的原理对排查内存问题有帮助。系统启动原理部分终于把开机过程搞清楚了。以前只知道按电源键等登录界面现在知道背后经历了固件→GRUB2→kernel→initramfs→systemd→target这么多步骤。理解了这个流程再看启动报错就知道卡在哪一步了。GRUB2故障处理部分掌握了两种重置root密码的方法以及MBR损坏和引导文件丢失的修复方法。这些技能在实际工作中可能一年用不上一次但用上的时候就是救命的。踩过的坑rd.break和init/bin/bash两种方法的区别、/etc/fstab配错导致系统进入emergency模式、GRUB2加密后需要输入用户名和密码……这些都是实际操作才会遇到的问题。希望这篇笔记能帮到同样在学云原生运维的朋友。系统启动和grub2是Linux的底层知识理解了这些以后遇到启动故障就不会慌了。大家一起加油
