RHEL7磁盘管理与XFS文件系统实战:从分区到LVM
1. 内容整体设计与思路拆解1.1 为什么文件系统和磁盘管理是RHEL7运维的第一道坎先说个真实场景。某天凌晨两点监控告警突然响了一看是某台RHEL7测试服务器的/data分区使用率到了97%。我登上去先执行df -h发现空间快满了但du -sh /data/*算下来却对不上账有个已删掉的日志文件还被某进程占着句柄空间根本没释放。这其实就是典型的文件系统管理工作平时不起眼关键时刻不懂底层逻辑连排查方向都没有。文件系统在RHEL7里承担着数据组织、存储访问、权限控制这三件大事磁盘管理则决定了你的数据最终落在哪、空间够不够、坏了怎么恢复。前者解决怎么存后者解决存在哪两者配合构成整个存储链路的地基。RHEL7又是一个很有意思的版本默认文件系统从ext4切换到了XFS引入了基于部分UUID管理的机制systemd接管了很多挂载逻辑。这意味着你如果用老一套RHEL6的经验去套很多细节会踩坑。这篇内容适合刚接触RHEL7的新人也适合从其他发行版或旧版本迁移过来的运维。我会把平时自己排查问题、给服务器加盘扩容、处理文件系统损坏时积累的真实操作手法全部摊开来讲每一步都解释清楚为什么这么做争取你看完就能直接在自己的机器上复现一套完整的文件系统和磁盘管理方案。1.2 磁盘管理的整体思路框架RHEL7下一条完整的存储链路是物理磁盘 → 分区可选→ 文件系统 → 挂载点 → 业务使用。Linux下所有设备都被抽象成文件物理磁盘是/dev/sda、/dev/sdb这样的块设备文件分区后变成/dev/sda1、/dev/sda2格式化后挂到某个目录目录里的文件最后通过文件系统写入磁盘块。很多新手容易把文件系统和磁盘搞混。硬盘是硬件分区表是描述硬盘布局的元数据文件系统是在分区之上建立的一套怎么把文件存进块的规则。你在Windows里C盘右键格式化就是在创建文件系统。RHEL7默认给分区建的是XFS这是从RHEL7开始才转正的主力格式底层继承自SGI的IRIX系统在高并发、大文件、大容量场景下表现出色。理解之后的实操路径就很清晰了。先看磁盘怎么识别和命名再决定分区的工具和策略然后创建文件系统挂载上并写入开机自动挂载配置最后在LVM基础上实现动态扩容。我会照着这个思路一步步展开。2. 磁盘识别与设备命名规则2.1 RHEL7下的设备文件名到底怎么来的RHEL7的设备文件不使用传统的固定编号而是由udev服务在内核发现设备时动态创建保存在/dev目录下。第一块SCSI/SATA磁盘叫/dev/sda第二块叫/dev/sdb依次递增。这里的字母是按内核探测到磁盘的顺序来定的不是按主板接口位置定的所以在某些环境下重启机器后设备名可能发生变化。分区就是在这块盘后面加数字/dev/sda1表示第一块磁盘的第一个分区/dev/sda2表示第二个分区。你会发现RHEL7安装系统的时候装出来的分区路径一般长这样/dev/mapper/centos-root这是逻辑卷的设备路径根因在于RHEL7安装程序默认采用LVM方案物理卷其实是/dev/sda2但上面叠加了卷组VG和逻辑卷LV的抽象层。NVMe固态硬盘的命名规则又不一样是/dev/nvme0n1这样的形式nvme0表示第一个NVMe控制器n1表示命名空间下的第一块盘分区是/dev/nvme0n1p1。虚拟机里常见的/dev/vda是KVM虚拟化环境下的virtio磁盘云服务器上基本都要习惯这种命名方式。还有个容易忽略的点/dev目录看起来像普通目录但它其实是devtmpfs文件系统。设备节点不是真实文件而是内核接口的入口。你往这个文件里写数据就是往设备驱动提交IO请求。理解这一点之后你就知道为什么dd if/dev/zero of/dev/sdb可以把一块盘清干净——你写的是块设备而不是某个目录里的文件。2.2 用lsblk和blkid快速掌握全盘结构刚接手一台RHEL7服务器时第一件事不是看分区表而是执行lsblk。这是我最常用的命令之一它用树状结构展示块设备关系比老式的fdisk -l直观太多。[rootlocalhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 99G 0 part ├─centos-root 253:0 0 50G 0 lvm / ├─centos-swap 253:1 0 4G 0 lvm [SWAP] └─centos-data 253:2 0 45G 0 lvm /data这个输出把整个存储结构一眼摊开sda是100G的物理盘sda1是1G的/boot分区sda2是99G的LVM物理卷上面建了root、swap、data三个逻辑卷。TYPE列标明了设备类型是disk、part还是lvm。MOUNTPOINT列显示挂载关系。[rootlocalhost ~]# lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 xfs b2a70f86-4931-4c76-8f72-1c4bc28f5d3e /boot └─sda2 LVM2_member GFLY3j-PbOc-Km0T-aDq5-9XcS-e3RK-qHfJAZ ├─centos-root xfs 8f3cd2b6-1e9a-4c30-9dfc-aaef5f6dbb1b / └─centos-swap swap 8d9a206b-3d13-4f28-9d5e-6b9a7dcc5c34 [SWAP]-f参数会额外显示文件系统类型、标签和UUID。UUID是文件系统的全局唯一标识符RHEL7的/etc/fstab默认靠它识别文件系统而不是靠设备路径。这里有个实际原因前面说了设备名会因启动顺序变化但UUID不会变用UUID挂载才是稳妥的做法。blkid是另一个常用命令直接查看块设备的属性。如果某个分区没有文件系统blkid没有任何输出这反而是个有效判据说明这块盘还没格式化。对新加的数据盘我通常先lsblk确认设备名再用blkid确认是不是裸盘决策路径一目了然。注意lsblk看不到文件系统内部的使用情况只能看到块设备关系。看空间使用要用df -h这是两个维度的问题别搞混了。3. 分区工具选型与实操手法3.1 MBR和GPT分区表格式决定上限分区表是一块磁盘的目录记录着磁盘上有哪些分区、每个分区的起始位置和大小。RHEL7支持两种分区表格式MBRMaster Boot Record和GPTGUID Partition Table。MBR是老古董诞生于上世纪80年代。它有几个硬性限制一是分区容量上限2TB超过2TB的盘用MBR会浪费空间二是只能记录4个主分区想要更多分区就得牺牲一个主分区去建扩展分区再在扩展分区里切逻辑分区组织结构相当繁琐。但MBR的兼容性最好老旧的BIOS引导环境还是要用它。GPT是随着UEFI固件一起普及的新标准。它用64位扇区号寻址支持最大9.4ZB的卷容量基本上等于没有上限默认支持128个分区。而且GPT在每个分区表和引导信息都有冗余副本一块损坏了可以从另一份恢复比MBR的容错性高不少。选型其实不复杂记住原则就行2TB以下、纯BIOS引导、兼容老硬件用MBR2TB以上、UEFI引导、需要大量分区用GPT。RHEL7安装UEFI模式下自动创建的/boot分区要求必须是GPT格式老BIOS模式则推荐MBR安装程序会处理这件事。实际工作中遇到新加的大容量数据盘一律按GPT处理省得后面扩容时才发现分区表格式成了瓶颈。3.2 fdisk与parted的取舍与完整演练RHEL7环境下的分区工具有三个fdisk、gdisk和parted。fdisk支持MBR分区表新版也扩展了GPT支持gdisk专门处理GPTparted两者都支持适合脚本化操作。我个人的经验是MBR分区用fdiskGPT分区用parted或gdisk。虽然fdisk也能处理GPT但交互格式在某些场景下不太直观。下面以一块新加的20G磁盘为例走一遍完整流程。# 假设新盘是 /dev/sdb先把分区表重置为GPT [rootlocalhost ~]# parted /dev/sdb mklabel gpt Information: You may need to update /etc/fstab. # 创建第一个分区从1MiB开始大小10GiB [rootlocalhost ~]# parted /dev/sdb mkpart primary 1MiB 10GiB Information: You may need to update /etc/fstab. # 创建第二个分区从10GiB开始到磁盘末尾 [rootlocalhost ~]# parted /dev/sdb mkpart primary 10GiB 100% Information: You may need to update /etc/fstab. # 查看分区结果 [rootlocalhost ~]# parted /dev/sdb print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 21.5GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 10.7GB 10.7GB primary 2 10.7GB 21.5GB 10.7GB primaryparted的分区起始位置建议不要从0开始而是从1MiB或1MB起。这是对齐alignment策略因为现代硬盘物理扇区是4096字节逻辑扇区是512字节如果分区起始位置不对齐4K物理扇区边界每次IO都会跨越两个物理扇区性能下降会很明显尤其是SSD上损耗更突出。如果你习惯老派的fdisk交互界面过程长这样[rootlocalhost ~]# fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-41943039, default 2048): Using default value 2048 Last sector, sectors or size{K,M,G} (2048-41943039, default 41943039): 10G Partition 1 of type Linux and of size 10 GiB is set Command (m for help): w The partition table has been altered!这里的2048就是起始扇区对应1MiB的偏移512字节×20481MiB这个数值是fdisk自动帮我们对齐好的。最后按w才会真正写入分区表如果反悔了按q退出即可所有更改都不会生效。这是fdisk很重要的一点特性所有改动只在内存里直到w才落盘。分完区之后内核不一定立刻识别到新分区表。最靠谱的办法是执行partprobe /dev/sdb让内核重新读取或者干脆重启。如果执行lsblk后看不到新分区先试partprobe这比反复拔插磁盘要安全得多。4. 文件系统创建与XFS实战管理4.1 为什么RHEL7把默认文件系统从ext4换成了XFSRHEL7正式把安装程序默认的文件系统从ext4切换到了XFS。这一步不是随便拍的脑袋背后有几个硬核理由。XFS是高性能的64位日志文件系统最早由SGI为IRIX系统开发设计目标就是处理超大文件和大容量存储。单文件最大支持8EiBexbibyte文件系统最大支持16EiBext4在部分环境下单文件系统上限是16TB某些内核版本可达1EiB但默认配置受限在动辄几十TB甚至PB级别的存储需求面前XFS的优势不言而喻。在元数据管理上XFS的架构也考虑得更充分。它把磁盘分成多个分配组allocation group每个组相对独立地管理自身的inode和数据区。这种设计让XFS在高并发写入时能并行处理多个分配组的元数据更新减少了锁冲突。结合我实际压测的结果多线程小文件写入场景下XFS表现稳定单线程读大文件场景下更明显吞吐量容易跑满硬件上限。日志机制同样是XFS的强项。RHEL6及之前的ext3/ext4用日志记录元数据变更XFS在此基础上对日志做了更细的划分称为日志区log area。即使突然掉电重启后文件系统检查时间也远小于同体量的ext系列这个体验在很多生产场景里直接决定了可用性。不过XFS有一个重要限制不能在在线状态下缩小只能扩大。ext4可以缩小但XFS不行。所以你规划XFS分区或者LVM逻辑卷时一开始的容量配比要想清楚。后面我会细讲怎么合理规划避免缩容的尴尬。4.2 mkfs系列命令的使用与参数讲解文件系统创建用mkfs命令族实现。mkfs.xfs创建XFS文件系统mkfs.ext4创建ext4文件系统mkfs.vfat做U盘格式化。也可以统一用mkfs -t xfs /dev/sdb1效果等价。继续上面的分区结果给/dev/sdb1创建XFS文件系统[rootlocalhost ~]# mkfs.xfs /dev/sdb1 meta-data/dev/sdb1 isize512 agcount4, agsize655360 blks sectsz512 attr2, projid64bit1 crc1 finobt0, sparse0, rmapbt0 reflink0 data bsize4096 blocks2621440, imaxpct25 sunit0 swidth0 blks naming version 2 bsize4096 ascii-ci0 ftype1 log internal log bsize4096 blocks2560, version2 sectsz512 sunit0 blks, lazy-count1 realtime none extsz4096 blocks0, rxtsz4096输出里几个关键参数值得注意。bsize4096是数据块的默认大小一个块4KiB适合大多数业务场景。如果存储的是大量小文件比如邮件队列可以考虑-b size2048减少内部碎片如果全是视频、镜像等大文件-b size8192或-b size16384反而能提高顺序读写效率。isize512是inode大小默认512字节装的是文件元数据一般不用改。agcount4是分配组数量对于超大磁盘或者明确高并发场景可以用-d agcount手动调大分配组数量。格式化时顺手写上标签方便后续管理[rootlocalhost ~]# mkfs.xfs -L data_disk /dev/sdb1 [rootlocalhost ~]# blkid /dev/sdb1 /dev/sdb1: UUID3f8f16c4-9c2f-4d2e-95b5-d21a3a1e8c41 TYPExfs LABELdata_disk标签不参与文件系统识别但有助于日常维护。尤其是多块数据盘的环境lsblk -f一眼就能看清哪块盘对应的业务用途不用逐块盘去翻UUID。ext4的创建方式同理mkfs.ext4 -L data_disk /dev/sdb1。如果你想在RHEL7上用ext4完全是允许的只是默认不推荐除非有老版本的兼容需求。混合使用并没有硬性限制但同一种业务尽量统一一种文件系统运维复杂度会低很多。4.3 挂载操作与fstab自动挂载的完整配置文件系统建好之后关键是挂载。创建挂载点目录然后mount[rootlocalhost ~]# mkdir -p /data [rootlocalhost ~]# mount /dev/sdb1 /data [rootlocalhost ~]# df -h /data Filesystem Size Used Avail Use% Mounted on /dev/sdb1 10G 33M 10G 1% /data挂载时可以加参数控制访问行为和IO策略。比如我经常在日志存储分片上挂noatime参数避免读文件时频繁更新访问时间戳减少不必要的写IO[rootlocalhost ~]# mount -o rw,noatime,nodiratime /dev/sdb1 /data卸载用umount /data。有时候进程占用文件导致卸载失败umount -l /data可以执行惰性卸载先脱离目录树等句柄释放后再真正卸载适合处理设备忙的场景。但手动挂载有个大坑重启后不会自动挂载。想要开机生效必须写入/etc/fstab。这个文件的格式非常标准一共6列每一列都不能写错列数字段含义示例1设备标识支持UUID、设备路径、标签UUID3f8f16c4-9c2f-4d2e-95b5-d21a3a1e8c412挂载点目录路径/data3文件系统类型xfs、ext4、swap等xfs4挂载选项mount参数defaults、noatime等defaults,noatime5是否dump备份0不备份1备份06fsck检查顺序0不检查1根分区2其他分区0实际写入一行UUID3f8f16c4-9c2f-4d2e-95b5-d21a3a1e8c41 /data xfs defaults,noatime 0 0写完fstab之后不要直接重启验证先用mount -a让系统按fstab内容重新挂载一遍没有报错基本就稳了。这是我和很多运维朋友反复强调的习惯fstab一旦写错开机时会卡在修复模式那时候再改文件就麻烦多了。挂载参数中的defaults其实包含rw、suid、dev、exec、auto、nouser、async等一组默认值。如果挂载的是纯数据盘出于安全考虑可以显式加nosuid,nodev,noexec禁止执行文件、设备文件和setuid位削弱潜在攻击面的影响。我在存放用户上传文件的挂载点上一定会加这三件套。还有一个特殊文件系统swap交换分区。它的fstab写法不太一样第五第六列都要写0UUID8d9a206b-3d13-4f28-9d5e-6b9a7dcc5c34 swap swap defaults 0 0启停swap也不用mount而是用swapon -a和swapoff -a。查看交换分区使用情况用free -h。5. LVM逻辑卷管理RHEL7的默认存储方案5.1 从一格盘一块分区到池化存储前面讲的分区方案有一个明显的痛点分区创建之后大小就固定了想扩大得重新分区、重建文件系统业务必然中断。RHEL7安装时默认采用了LVM逻辑卷管理方案目的就是解决这个刚性约束。LVM把存储抽象成三层PV物理卷→ VG卷组→ LV逻辑卷。可以这样理解PV是一块块待命的水桶VG是这些水桶组成的大水池LV则是从水池里圈出来的一格水用来浇灌业务这块田。水池的水是流动的哪块田需要更多水直接从水池里调拨不需要重新买桶。PV就是分区或者整块硬盘创建LVM前需要把磁盘或分区标记为LVM物理卷。VG聚合了多个PV的容量形成统一空间池。LV从VG里划分具体大小格式化成文件系统后挂载使用。RHEL7默认安装时系统自动把/dev/sda2设置成PV建了一个叫centos的VG然后从VG里切出root、swap等LV这也是为什么lsblk里能看到/dev/mapper/centos-root这样的设备路径。生产环境里我强烈建议数据目录也走LVM一旦业务增长需要扩容热插拔新盘、在线扩展LV业务无感知这个优势在缩容需求少的场景下完美契合。5.2 从裸盘到逻辑卷的完整创建流程现在实操一把把之前分好的/dev/sdb1和/dev/sdb2都纳入LVM建一个卷组然后切逻辑卷挂载。先初始化物理卷[rootlocalhost ~]# pvcreate /dev/sdb1 /dev/sdb2 Physical volume /dev/sdb1 successfully created. Physical volume /dev/sdb2 successfully created. [rootlocalhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 --- 10.00g 10.00g /dev/sdb2 lvm2 --- 10.00g 10.00g然后创建卷组名字取vg_data[rootlocalhost ~]# vgcreate vg_data /dev/sdb1 /dev/sdb2 Volume group vg_data successfully created [rootlocalhost ~]# vgs VG #PV #LV #SN Attr VSize VFree vg_data 2 0 0 wz--n- 19.99g 19.99g接着创建逻辑卷比如切一个8G的LV叫lv_web[rootlocalhost ~]# lvcreate -n lv_web -L 8G vg_data Logical volume lv_web created. [rootlocalhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_web vg_data -wi-a----- 8.00g-L 8G是按固定大小创建也可以用-l 100%FREE把VG剩余空间全部给某个LV。逻辑卷设备路径自动生成在/dev/mapper/vg_data-lv_web同时/dev/vg_data/lv_web也是个等价入口。接下来就是格式化挂载和普通分区完全一样[rootlocalhost ~]# mkfs.xfs /dev/vg_data/lv_web [rootlocalhost ~]# mkdir -p /var/web [rootlocalhost ~]# mount /dev/vg_data/lv_web /var/web开机自动挂载同样写fstab设备名建议用/dev/mapper/vg_data-lv_web或者直接LV路径也可以像普通分区一样用UUID。5.3 在线扩容与缩容的限制和正确姿势LVM最大的福利是扩容几乎无感。继续上面的场景假设/var/web空间快满了VG里还剩12G空间给lv_web扩充6G[rootlocalhost ~]# lvextend -L 6G /dev/vg_data/lv_web Size of logical volume vg_data/lv_web changed from 8.00 GiB (2048 extents) to 14.00 GiB (3584 extents). Logical volume vg_data/lv_web successfully resized. [rootlocalhost ~]# xfs_growfs /var/web meta-data/dev/mapper/vg_data-lv_web isize512 agcount4, agsize524288 blks data blocks changed from 2097152 to 3584000这一步有两个关键点。lvextend只是扩大LV逻辑边界文件系统并不知道必须用xfs_growfs让XFS在线扩展到新的容量边界。ext4文件系统则用resize2fs /dev/vg_data/lv_web来完成同样的工作。顺序不能反先扩展块设备再扩展文件系统。如果VG本身空间也不够那就得先给VG扩容。新加一块盘执行pvcreate /dev/sdc然后vgextend vg_data /dev/sdcVG就有更多空间可以分配给LV了。整个过程不需要卸载挂载点在线完成。缩容这件事在XFS上是不能在线执行的。除非你提前规划好否则一个XFS的逻辑卷一旦建大了想缩回去基本上只能备份、重建、恢复。这是XFS设计上的取舍毕竟它优先保证的是大容量和高性能。如果用ext4缩回去的流程是先umount卸载再e2fsck -f强制检查然后resize2fs /dev/vg_data/lv_web 8G把文件系统缩小最后lvreduce -L 8G /dev/vg_data/lv_web缩小逻辑卷。缩容必须先缩文件系统再缩LV扩容则相反先扩LV再扩文件系统方向千万别搞反。这类操作前做好备份永远不嫌多。LVM还自带快照功能lvcreate -s -n snap_web -L 2G /dev/vg_data/lv_web可以创建一致性快照做重大变更前拍个快照出问题秒回滚是生产环境标准动作。6. 常见问题与排查技巧实录6.1 df和du统计口径不一致的真相df和du统计结果对不上的问题是我在论坛和实际运维群里见过最多的问题之一。df统计的是文件系统整体使用量按文件系统块来计算du统计的是目录树里所有文件的逻辑大小。两者口径完全不同。经典翻车场景拿du -sh /var/log看到日志才2G但df -h显示/分区已经用了90%。最常见的原因是有个进程一直打开着某个已删除的大文件文件句柄没释放磁盘空间被占用但目录里看不到。排查命令是lsof | grep deleted[rootlocalhost ~]# lsof | grep deleted java 12345 app 123w REG 253,0 1073741824 524298 /tmp/jvm.log (deleted)解决办法是重启对应进程或服务空间自动释放。如果找不到具体进程可以先lsof L1列出所有被删除但打开的文件。养成这个习惯之后处理磁盘满了但不知道谁占的就会顺畅很多。还有一种情况是文件系统预留空间。XFS默认预留一部分空间给元数据和碎片整理使用df显示的Used不含预留部分。ext4默认预留5%给root用户这些你都可以通过tune2fs调整但一般不建议动。6.2 inode耗尽能写文件却说磁盘满磁盘剩着大量空间但新建文件时报No space left on device这类问题十有八九是inode耗尽了。inode是文件系统里的元数据索引节点每个文件或目录都对应一个inode存储了权限、所有者、大小、时间戳以及数据块指针。文件系统容量再大inode数量也是有限的如果全是小文件可能先撞上的是inode上限。查询方法[rootlocalhost ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 655360 35840 619520 6% /boot /dev/mapper/centos-root 1280160 1280140 20 100% /IUse%到了100%就是inode耗尽。典型的制造者是邮件队列、消息中间件、以及误配置的统计程序每次刷新生成一个新文件但从来不清旧文件。处理方式比较简单粗暴但有效清理掉大量无用的零碎小文件释放inode。如果业务特性确实需要海量小文件建文件系统时可以用-i参数加大inode密度比如mkfs.xfs -i maxpct50提高inode总数占空间的比例。6.3 磁盘IO高和损坏的快速识别手段磁盘管理不只是分区和挂载健康监测同样重要。我从sysstat包里带了两个工具iostat和sar。[rootlocalhost ~]# iostat -x 1 5 Linux 3.10.0-1160.el7.x86_64 (localhost) 05/20/2024 _x86_64_ (2 CPU) Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 2.00 0.00 6.00 0.00 28.00 9.33 0.01 2.00 0.00 2.00 2.00 1.20核心看三列%util表示设备繁忙程度await表示IO请求平均等待时间svctm是设备的实际服务时间。如果await远高于svctm说明有大量IO在队列里排队通常是并发压力过大或者磁盘本身性能触顶。再结合r/s和w/s的读写请求数量基本能判断是业务洪峰还是硬件瓶颈。物理磁盘故障有另一个检查通道smartctl[rootlocalhost ~]# smartctl -H /dev/sda SMART overall-health self-assessment test result: PASSED如果返回FAILED这块盘基本可以判定为需要尽快更换。smartctl -a /dev/sda还能看到Reallocated_Sector_Ct重映射扇区数等底层健康指标。这个数值持续增长说明盘片物理介质正在退化趁数据还能读出来赶紧做迁移。RHEL7默认没有预装smartmontools需要yum install smartmontools。我第一次接到一个磁盘性能异常的工单iostat一切正常怀疑是有坏道装上smartctl一查Reallocated_Sector_Ct已经涨到上千了换盘之后问题立刻消失。健康检查这种工作别等故障发生了才做。6.4 fstab写错导致开机进修复模式的处理这是文件系统管理里堪称必修课的翻车现场。/etc/fstab里某个UUID写错、设备路径找不到、或者格式不对重启后系统的根文件系统挂载完成后在挂载后续分区时发现失败会直接掉进emergency模式提示输入root密码维护。此时系统大概率处于只读状态第一件事是重新挂载读写[rootlocalhost ~]# mount -o remount,rw /然后编辑fstab把问题行注释掉或者修正。关键是怎么知道哪一行有问题。用blkid重新核对UUID跟fstab里的逐项比对。修完后执行mount -a验证一遍再重启。更稳妥的做法是每次修改fstab前都先备份并且用mount -a做模拟验证。我在团队里有条不成文的规定修改fstab文件必须两条命令连跑改完立刻mount -a通过后再做其他操作。这套流程帮我避免过好几次无意义的紧急工单。在线扩容的场景还要留意如果挂载点本身没问题但扩容后df不生效多半是忘了xfs_growfs这步重新执行即可。最后分享一个实用技巧整个文件系统和磁盘管理的内容到这里基本覆盖了。最后送上一套我自己维护RHEL7存储环境时常做的三查三备查lsblk确认拓扑查df -h看容量查df -i盯inode备份fstab、备份LVM配置、备份重要数据的快照。这个系列偏基础但基础不牢很容易在高级操作上翻车。我见过太多人在没理解磁盘是怎么被发现、分区表是什么格式、文件系统有什么区别的情况下就直接操作生产环境最后把数据搞丢。实际操作中我的体会是RHEL7这套存储管理工具链已经相当成熟常用的无非lsblk看盘、fdisk/parted分区、mkfs格式化、mount/fstab挂载、pvcreate/vgcreate/lvcreate管LVM排查时df/du/lsof/iostat/smartctl来回切换。把每个环节的为什么想清楚遇到问题时自然就有排查路径。某个环境遇到LVM元数据损坏、XFS文件系统崩溃这样的极端场景我后面再单独写一篇专门讲恢复流程那些操作比基础篇刺激多了但也更需要这里的基础做支撑。