
磁盘管理是Linux运维里最基础也最容易踩坑的环节。很多人刚接触Linux时觉得“不就是分个区、挂个载嘛”可真到线上环境你会发现磁盘管理涉及的不仅仅是几条命令还有文件系统选型、分区表格式、LVM规划、I/O性能排查、故障恢复这一整套东西。这篇文章我会从实际运维的角度出发把Linux磁盘管理的常用操作和背后的原理都过一遍包括我这些年踩过的坑和一些不算冷门但很多人不知道的小技巧。不管你是刚入门的新手还是已经写过不少shell脚本的老手这篇文章都值得花几分钟看一遍。1. 磁盘信息收集动手之前先看清家底1.1 怎么确认系统识别到了磁盘拿到一台新服务器或者插上一块新硬盘第一件事不是急着分区而是先确认系统有没有识别到这个块设备。Linux里一切皆文件磁盘也不例外它会被映射成/dev目录下的设备文件比如/dev/sda、/dev/sdb、/dev/nvme0n1这样的名字。最常见的查看命令是lsblk这个命令会以树状结构列出所有块设备以及它们之间的依赖关系比如分区、挂载点、容量大小一眼就能看明白。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 49G 0 part / └─sda3 8:3 0 50G 0 part /homesda是一整块物理磁盘下面挂着的sda1、sda2、sda3是它上面的分区。MOUNTPOINT列告诉你这块分区当前被挂载到哪里。如果你新插了一块盘但lsblk里看不到那问题就大了很可能硬件层面就没有识别出来这时候用dmesg或者fdisk -l再看一下确认是驱动问题还是线缆松了。裸设备或者是整块盘已经存在但还没分区的情况下lsblk会显示磁盘本身比如sdb下面没有子分区容量也是整块盘的大小。这种情况下你就可以直接对它进行分区操作了。1.2 用这些工具看磁盘更清楚除了lsblk还有几个命令也特别好用我平时排查问题基本就是这几件套轮着用fdisk -l显示所有磁盘和分区的详细信息包括扇区数、起始位置、分区类型。适合看磁盘的整体布局和确认分区表格式。blkid查看块设备的UUID和文件系统类型。这个命令在配置/etc/fstab时几乎是必用的因为用UUID挂载比直接用设备名更稳。df -h查看已挂载文件系统的空间使用情况。注意它只能看到已挂载的分区看不到未挂载的裸盘。lsblk -f同时显示文件系统类型和UUID比单独执行blkid看起来更直观。parted新一代分区工具支持GPT分区表最大可以管理2TB以上的磁盘而老的fdisk对GPT的支持不太友好。我个人的习惯是先用lsblk看整体结构再用blkid确认文件系统类型和UUID。如果怀疑某块盘有坏道或者硬件故障就直接上smartctlSmartmontools工具包里的查SMART信息。smartctl -a /dev/sdaSMART信息里最关键的几个字段是Reallocated_Sector_Ct重映射扇区数、Pending_Sector待映射扇区、UDMA_CRC_Error_Count传输错误计数。这几个数字一旦异常增长这块盘基本就是“准备好后事”的状态了该备份数据就赶紧备份别等到系统IO卡死再后悔。2. 分区与格式化从一块裸盘到可用的文件系统2.1 分区表格式怎么选MBR还是GPT磁盘分区之前必须决定用哪种分区表。MBRMaster Boot Record是老标准最多支持4个主分区单分区最大2TB这个限制在现代硬件面前已经完全不够看了。GPTGUID Partition Table是新一代标准分区数量基本没有限制单分区最大可以到9.4ZB理论值现在新装的系统、新买的磁盘基本都默认用GPT。如果你的硬盘超过2TB或者你打算分超过4个主分区直接用GPT。那怎么判断当前磁盘的分区表是什么格式可以用fdisk -l看输出如果显示Disklabel type: gpt就是GPT显示dos就是MBR。也可以用parted来查看parted /dev/sdb print在输出末尾会有一行Partition Table: gpt。2.2 用fdisk给磁盘分区经典但别在GPT大分区上翻车fdisk是最经典的分区工具适合操作MBR分区表也基本支持GPT老版本不太行新版本没问题。它没有parted那么复杂交互式操作也比较友好。比如给/dev/sdb分区fdisk /dev/sdb进入交互界面后输入n新建分区p查看分区表w保存退出。整个过程它会问你分区的起始扇区和结束扇区正常情况下直接回车用默认值就行它会自动把剩余空间全部分给这个分区。如果只想分一部分空间可以用10G这样的语法指定结束位置。有一点要注意fdisk默认创建的是MBR分区表。如果你新盘是GPT格式fdisk也能识别和处理但如果你需要从MBR转GPT就需要用parted或者gdisk。在已经分区并且有数据的盘上转换分区表格式是超级危险的操作数据直接报废所以千万别在生产环境上试验。2.3 用parted管理GPT分区2TB以上磁盘的正确姿势当磁盘容量超过2TBfdisk基本就无能为力了这时候用parted。它的命令风格跟fdisk不太一样但逻辑更直接支持脚本化操作。给一块3TB的盘分一个完整分区parted /dev/sdb mklabel gpt mkpart primary ext4 0% 100% print quit我的习惯是先mklabel gpt确定分区表格式再用百分比方式来指定范围这样不用自己算扇区数特别省心。如果你要用脚本批量操作parted也支持非交互模式parted /dev/sdb --script mklabel gpt parted /dev/sdb --script mkpart primary 0% 100%这里顺便提一句parted创建的GPT分区会有个“BIOS boot partition”的小分区如果在老主板Legacy BIOS上引导系统这个小分区是必须的。UEFI启动则不需要。2.4 格式化文件系统选型直接影响性能和容量分区之后就是格式化也就是创建文件系统。Linux里最常用的文件系统是ext4、XFS、Btrfs各有优劣ext4老牌稳妥兼容性最好大量老系统默认选择。适合普通文件和通用存储。XFS高并发大文件性能突出是很多大数据场景和RHEL系默认文件系统。删除大文件速度极快恢复难度大。Btrfs支持快照、压缩、校验和功能丰富但性能和稳定性在某些场景不如ext4/XFS成熟。格式化的命令是mkfs基本用法mkfs.ext4 /dev/sdb1 mkfs.xfs /dev/sdb1格式化之前务必确认设备名一旦执行该分区上原有数据全部清空没有任何提示。实际操作中我见过有人不小心把/dev/sda系统盘当成/dev/sdb数据盘格式化了直接原地失业。所以开始之前用lsblk和df -h来回看三遍确保设备名是对的。如果你的文件系统需要开启LVM支持在格式化之前先创建PV再创建VG、LV最后在LV上格式化。直接对物理分区格式化后再做LVM不是不行但后面扩展的时候会麻烦很多。3. 挂载管理让格式化后的磁盘真正能被使用3.1 手动挂载和卸载分区格式化了系统并不会自动使用它。你需要把它挂载到一个目录上这个目录就是挂载点。比如要把/dev/sdb1挂载到/mnt/datamkdir -p /mnt/data mount /dev/sdb1 /mnt/data挂载之后往/mnt/data里写数据就是往这块盘里写数据。卸载umount /mnt/data卸载的时候要确认没有进程正在使用这个挂载点否则会提示target is busy。这时候用lsof f -- /mnt/data或者fuser -m /mnt/data找到占用进程处理完再卸载。别忘了直接拔盘之前必须先卸载哪怕你只是想关机。3.2 开机自动挂载fstab配置详解手动挂载只在当前会话有效重启之后就没了。要让系统开机自动挂载必须写入/etc/fstab文件。每一行代表一个挂载配置字段依次是设备标识、挂载点、文件系统类型、挂载选项、dump备份标志、fsck检查顺序。比如挂载/dev/sdb1到/mnt/data文件系统ext4可以写/dev/sdb1 /mnt/data ext4 defaults 0 0这里defaults是一组默认挂载选项的集合包括rw读写、suid、dev、exec、auto、nouser、async。实际使用中可能会根据场景调整比如NFS挂载需要加_netdev防止网络没起来就尝试挂载导致系统卡住。修改/etc/fstab之前强烈建议你备份一份原文件并尝试用mount -a测试一下配置是否正确。如果fstab写错了启动的时候系统会进入紧急模式emergency mode处理起来很麻烦。我之前吃过这个亏把挂载点路径写错一位重启后直接进不去系统只能从单用户模式修复。提示在/et/fstab里挂载设备时尽量用UUID而不是/dev/sdb1。因为设备名在系统重启后可能变化比如新增硬盘导致设备名顺延而UUID不会变。3.3 用UUID挂载设备名变化也不再慌查看设备的UUIDblkid /dev/sdb1输出类似/dev/sdb1: UUID8a6e2a2e-7c78-4a2f-a9d0-7e615b2a1e7f TYPEext4然后/etc/fstab里写UUID8a6e2a2e-7c78-4a2f-a9d0-7e615b2a1e7f /mnt/data ext4 defaults 0 1注意最后的数字0 1第一个0表示不参与dump备份第二个1表示优先级1根分区一般为1其他分区一般写2或0。这个顺序不能乱写反了可能导致开机时fsck顺序异常。如果是XFS文件系统也可以用UUID挂载区别不大。我个人的习惯是如果机器上有多块数据盘我也会在/etc/fstab里给每块盘加一个nofail选项比如UUIDxxx /mnt/data xfs defaults,nofail 0 0这样即使某块盘掉了系统也能正常启动不会因为找不到挂载点就卡在紧急模式。这对笔记本用户和服务器维护都很实用。4. LVM让磁盘空间像搭积木一样灵活4.1 为什么需要LVM分区规划的痛点传统分区方式有个让人头疼的问题如果规划时给/home分了100G结果后来数据多了不够用想要扩充分区就只能想办法腾出相邻的未分配空间或者再插一块新盘重新规划非常麻烦。LVMLogical Volume Manager就是来解决这个痛点的。LVM把物理分区PVPhysical Volume组合成一个逻辑卷组VGVolume Group然后在VG上划分逻辑卷LVLogical Volume。应用看到的只是LV它的大小可以随时调整而底层物理磁盘怎么分布不用管。这就像你原本只有几个固定大小的抽屉分区LVM相当于一个大柜子你可以在柜子里随时调整隔板想放多少东西就放多少。4.2 创建LVM的完整流程假设你有两块盘/dev/sdb和/dev/sdc想把它们合并成一个大的逻辑卷来用。流程如下创建PVpvcreate /dev/sdb /dev/sdc创建VG名字叫vg_datavgcreate vg_data /dev/sdb /dev/sdc创建LV名字叫lv_data容量20G也可以直接说-l 100%FREE用完所有空间lvcreate -L 20G -n lv_data vg_data格式化并挂载mkfs.ext4 /dev/vg_data/lv_data mkdir -p /mnt/data mount /dev/vg_data/lv_data /mnt/data在/etc/fstab里挂载时可以用/dev/mapper/vg_data-lv_data或者直接用UUID。我习惯用UUID同样的道理设备路径在某些情况下可能变化UUID更安稳。查看LVM信息用pvs、vgs、lvs三个命令分别对应PV、VG、LV的状态比一个个pvdisplay、vgdisplay方便得多。4.3 扩容LVM在线操作不再重启扩容是LVM最大的卖点。比如上面这个lv_data20G不够用了VG里还剩空间原本100G只用了20G直接扩lvextend -L 30G /dev/vg_data/lv_data扩展之后还要同步文件系统大小否则文件系统还是老的容量。ext4用resize2fsXFS用xfs_growfsresize2fs /dev/vg_data/lv_data # 或者 xfs_growfs /mnt/data注意XFS只能在线扩容不能缩容而ext4可以缩容但更推荐在线扩容别想着在线缩容风险极大。如果VG空间也不够那就再插一块新盘然后pvcreate /dev/sdd vgextend vg_data /dev/sdd之后继续lvextend就行。整个过程不需要卸载、不需要重启业务几乎无感知。这也是为什么生产环境里LVM几乎成了标配。4.4 缩容LVM必须离线且风险很高如果你确实需要缩容LVM比如把一个LV从100G缩到80G操作必须先卸载再检查文件系统然后缩小文件系统和LV。以ext4为例umount /mnt/data e2fsck -f /dev/vg_data/lv_data resize2fs /dev/vg_data/lv_data 80G lvreduce -L 80G /dev/vg_data/lv_data mount /dev/vg_data/lv_data /mnt/data顺序绝对不能反必须先缩文件系统再缩LV而且操作前必须备份数据。XFS压根不支持缩容所以规划空间时别把XFS和缩容设想在一起。全生产线上能不动就不动缩容量好几次深夜事故都是这么来的。5. 磁盘监控与性能排查别等磁盘满了才发现5.1 空间监控三件套df、du、inode最常用的当然是df -h查看文件系统空间使用率。但很多新手不知道还有个隐藏杀手叫inode耗尽。哪怕磁盘空间还有50Ginode用完了照样无法创建新文件进程日志写不进去数据库直接报错。查看inode使用率df -i如果某个分区IUse%到了100%说明inode耗尽了。这种情况通常是因为该分区上创建了大量小文件比如邮件队列、缓存目录、临时文件。解决办法是删除无用的小文件或者在规划时给该分区单独挂载避免和其他大文件共用分区。du用来排查目录占用空间du -sh /var/log du -sh /opt/*du会比较耗时尤其是在大目录上生产环境可以在业务低峰期跑或者用--max-depth1控制输出层级。5.2 I/O性能排查iostat和iotop如果系统变卡、磁盘读写慢先看iostatiostat -x 1重点看%util和await字段。%util接近100%说明磁盘已经接近饱和await是平均I/O响应时间超过几十毫秒甚至上百毫秒就说明负载异常。这时候再看具体是哪个进程在疯狂读写用iotopiotop -o-o只显示有I/O操作的进程能直接看到是哪个PID在疯狂吃磁盘定位到进程后再分析它为什么这么活跃。5.3 掉盘与只读灾难现场最怕的事磁盘只读一般分两种一种是文件系统被标记为只读挂载另一种是磁盘硬件本身出现异常。文件系统只读通常表现为touch test都报Read-only file system。排查思路先看dmesg有没有IO错误或者文件系统报错日志。如果只是某一块盘只读先尝试重新以读写方式挂载mount -o remount,rw /mountpoint如果重新挂载成功说明可能是系统挂载参数或临时状态问题。如果重新挂载还是报只读很有可能是文件系统损坏或者硬件故障。这时候第一件事是备份数据然后卸载用fsck检查修复。这里要特别提醒一句fsck不是万能灵药修复可能进一步损坏数据尤其是日志型文件系统。在没有备份的前提下别随便在业务盘上跑fsck。如果是根分区只读最保险的做法是重启到救援模式再用工具处理。6. 常见故障与解决我在生产环境踩过的那些坑6.1 /etc/fstab写错开机进紧急模式的急救这是运维必修课。假设你在/etc/fstab里写了一个不存在的设备重启后系统会进入紧急模式。典型现象启动日志里报Failed to mount /mnt/data然后让你输入root密码维护。我的处理流程进入紧急模式后先让根分区可写mount -o remount,rw /备份原fstabcp /etc/fstab /etc/fstab.bak编辑/etc/fstab把错误的那行注释掉或改成正确的设备。mount -a测试没问题后重启。如果你记不清fstab里该写什么把原来的备份内容直接恢复也行。日常维护时改fstab之前一定先备份这个习惯能省下一晚上的抢救时间。6.2 磁盘空间不足但du显示占用不大隐藏的已删除文件有时候df -h显示使用率100%但du -sh /算出来却只用了50%差异可能来自已删除但仍被进程占用的文件。Linux里文件被删除但进程还打开着fd空间不会释放直到进程退出。经典案例如删掉了一个正在被持续写入的日志文件但日志进程还持有文件句柄。查看哪个进程占用了已删除的文件lsof | grep deleted找到PID和文件名后重启对应进程或者重载服务空间就会释放。这个方法比随便找目录rm靠谱多了也是排查“磁盘满了但找不到大文件”场景的第一思路。6.3 挂载点目录出现“感叹号”或者数据不可见如果你在生产环境里用NAS或云盘挂载偶尔会遇到挂载点目录显示异常比如ls看到目录名带感叹号或者挂载点里的文件不见了。多数情况下是挂载失败或者挂载点被覆盖了。排查步骤mount | grep 挂载点确认当前是不是真的挂载上了。lsblk看设备状态。如果设备没有挂载成功但目录里却有文件很可能是挂载失败后系统把数据写到了挂载点原本的目录里而不是磁盘上。这时候先把挂载点里的文件转移到安全位置再重新挂载设备然后决定是否合并。这种“目录有数据但挂载后数据消失”的坑在云服务器和NAS场景里特别常见一定要先确认挂载状态再动手别乱rm -rf。6.4 磁盘有坏道SMART和fsck怎么配合生产环境遇到磁盘SMART报Reallocated_Sector_Ct持续增加说明盘片存在不稳定扇区。我一般做这几步立刻备份关键数据哪怕速度很慢也要做。用smartctl -t short /dev/sdb跑个短自检看是否有大量Pending扇区。如果故障进一步恶化直接在线替换磁盘把数据从RAID里踢出来加一块热备盘。如果你用的是单盘没有RAID那就只能停机备份后换盘。fsck对坏道无能为力它只能修复文件系统元数据层面的损坏。物理坏道是硬件层面的别指望软件能搞定。很多时候在坏道上跑fsck反而会卡住因为读取坏扇区会不断重试系统瞬间变卡。遇到这种情况能导数据就赶紧导导不出来就放弃换盘是第一优先级。7. 我个人的几条磁盘管理经验最后分享几条我在实际运维中反复验证过的小心得不一定写在哪本手册里但都挺实用。第一新机器拿到手先规划LVM不要用裸分区直接挂载大量数据。哪怕你只用了VG的一小部分预留的扩展能力在未来能帮你省很多事。我见过太多同事在三五年后面临“根分区满了但/home还有一大片空着”的尴尬LVM虽然不能解决跨VG的调整问题但至少单VG内部的空间调度非常灵活。第二所有关键数据盘在/etc/fstab里都加nofail挂在辅助盘上宁可这块盘启动时没挂上也不要让整个系统起不来。这样即使盘掉了你还能进系统排查和修复不至于被锁在门外。第三定期看SMART。可以在cron里写个脚本每天检查Reallocated_Sector_Ct、Pending_Sector、UDMA_CRC_Error_Count发现异常直接邮件告警。磁盘故障从来不是瞬间发生的而是慢慢累积的提前发现能把灾难变成普通维护。第四遇到磁盘全盘只读的情况千万别反复try mount。先看dmesg确认是硬件故障还是文件系统问题。如果日志明确报Buffer I/O error那基本就是盘坏了数据恢复优先级最高然后立刻换盘。第五文件系统选型上中小规模数据用ext4最稳大数据量高并发用XFS需要快照和子卷管理再考虑Btrfs。不要盲目追求“高端”文件系统稳定性排在第一位。磁盘管理这件事说难不难说简单也不简单。很多人都是出了问题才去翻资料但真正有效的做法是在平时就做好规划、监控和演练。我这篇文章里讲的都是日常操作中最常用、也最容易踩坑的部分如果能在你动手之前帮到你那就值了。