拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux磁盘与文件系统从入门到排查:分区、LVM、NFS与常见故障

先交代一个背景我上个月处理了一台业务服务器的磁盘告警从发现分区快满到最终完成LVM在线扩容前前后后折腾了大半天。过程中带了个刚入门的朋友一起排查发现他最大的困惑不是命令不会敲而是对磁盘、分区、文件系统、挂载这些概念之间的关系完全是割裂的——会分区但不知道分区表在做什么会mkfs但说不清inode是什么知道sync这个命令但不理解它到底在保护什么。这篇文章我就把这些碎片拼起来从磁盘分区讲到文件系统原理从LVM扩容讲到NFS远程挂载最后把我这些年踩过的磁盘相关坑整理成一份排查手册。内容覆盖了日常运维和高频面试题里关于Linux磁盘与文件系统的绝大部分考点适合刚接触Linux的初学者也适合有一定基础但遇到磁盘类问题容易抓瞎的运维新人。1. 先搞清楚Linux磁盘管理的整体框架1.1 从一块裸盘到可用存储中间隔了哪几层很多人拿到一块新磁盘第一反应就是“格式化”。但格式化只是整个链条里的一环。一块物理磁盘真正能被系统使用需要经过三层加工分区、创建文件系统、挂载。分区是把一块物理磁盘划分成多个逻辑区域每个区域相当于一块独立的“小块磁盘”。分区的信息记录在磁盘开头的分区表里这块区域非常关键操作系统靠它识别磁盘上有哪些分区、每个分区从哪里开始到哪里结束。你在Windows磁盘管理器里看到的“磁盘必须经过初始化逻辑磁盘管理器才能访问”的报错本质就是这块磁盘的分区表缺失或无法识别——Windows不认识它Linux也一样不认。创建文件系统的动作就是我们常说的“格式化”它会在分区上建立一套数据组织结构比如ext4、xfs、btrfs这些。文件系统决定了数据以什么方式存放、怎么索引、怎么保证一致性。没有文件系统的分区即使能识别也没法正常读写文件。挂载则是把文件系统和Linux的目录树关联起来。Linux的目录结构是一个以根/为起点的树任何存储设备都必须“挂”到某个目录上才能访问。这个设计的好处是极其灵活一块盘可以挂到任意位置而且不同设备之间可以实现目录级别的拼接。日常用到的挂载命令就是mount卸载用umount。这三层的关系可以打一个装修的比方分区表是整栋楼的户型图文件系统是每户的装修方案挂载则是给每户挂上门牌号。户型图错了整栋楼都找不到房间装修方案烂住起来到处是坑门牌号不挂有房也没法住。1.2 分区表选MBR还是GPT不是拍脑袋决定的分区表目前就两种主流MBR和GPT。选哪一个不是看心情而是看两块硬指标——磁盘容量和引导方式。MBR是传统方案它把分区表保存在磁盘第一个扇区总共512字节的空间里既要放引导代码又要放分区表所以只能记录4个主分区单个分区最大支持2TB。超过2TB的磁盘用MBR后面多出来的空间就是浪费。GPT是较新的标准它把分区表放在磁盘头部和尾部各一份支持128个分区理论容量上限是9.4ZB而且自带CRC校验分区表损坏了还能从备份恢复。实际操作中我的建议很直接系统盘和数据盘只要磁盘大于2TB或者需要超过4个主分区一律用GPT。现在新装的服务器和PC主板基本都是UEFI引导配合GPT分区表是标准组合。老的BIOSMBR组合在兼容性上有优势但只有极老旧的机器才需要考虑。Linux下创建分区表的工具有三个fdisk、gdisk、parted。fdisk是老牌工具对MBR支持最好gdisk是fdisk的GPT版本parted则是命令行分区神器既能分区也能调整分区大小。记住一个原则分区表类型在创建分区的第一步就要定下来中途切换非常麻烦涉及数据迁移和引导修复普通人别折腾。1.3 常用磁盘命令速查运维就靠这几条Linux磁盘管理命令看似很多但80%的场景就是那么几条。我把日常最高频的整理成一张表覆盖查看、分区、格式化、挂载、扩容这几类核心操作操作类型常用命令用途说明查看磁盘与分区lsblk树状显示块设备与分区关系首选查看设备UUID/类型blkid显示文件系统类型和UUID写fstab必须要查看分区表fdisk -l查看MBR分区表GPT用gdisk -l磁盘分区fdisk/gdisk/parted交互式创建删除分区创建文件系统mkfs.ext4 /dev/sdb1把分区格式化为指定文件系统挂载/卸载mount /dev/sdb1 /data挂载分区到目录卸载用umount查看空间占用df -hT查看文件系统容量和类型查看目录占用du -sh *排查大文件大目录时必用查看块设备IOiostat -x 2排查磁盘性能瓶颈时看说句实在话我日常排查磁盘问题绝大多数情况下就是lsblk看一眼结构df -h看容量du定位大头iostat看性能走向。很多新人喜欢一上来就fdisk乱敲反而把分区表搞坏这是大忌。先把查看类命令用熟练写操作一定想清楚再做。2. 文件系统不是“格式化”一下那么简单2.1 VFS层为什么Linux能无缝兼容几十种文件系统你有没有想过ext4、xfs、btrfs、vfat、ntfs、nfs这些完全不同的文件系统为什么在Linux里都可以用同一套open、read、write、close接口来操作答案是内核里有一层叫做VFS虚拟文件系统的抽象层。VFS是Linux内核中的一个接口层它把不同文件系统的具体实现细节全部隐藏起来对外暴露一套统一的标准接口。用户在用户态调用open()读文件时VFS会根据文件所在挂载点的文件系统类型把请求转换成具体文件系统的实现。这就像USB接口不管U盘里是闪存芯片还是读卡器电脑只要通过USB协议就能通信设备之间的差异都被协议屏蔽掉了。VFS的存在让Linux在存储方面极其灵活。同一块系统里可以同时挂载ext4、xfs、ntfs、nfs用户在目录树上根本感觉不到差异复制的命令照样用。这也是企业里为什么敢放心大胆地给服务器加各种存储设备——底层兼容性早就被VFS解决掉了。理解VFS还有一个现实意义排查问题时很多“文件操作慢”的故障不是磁盘本身慢而是VFS层或文件系统层的某个环节出了问题。比如用了NFS远程文件系统读写性能瓶颈可能在网络延迟上单看磁盘IO指标看不出来。这时候心里有VFS这张图谱排查思路就不会局限在物理磁盘上。2.2 inode、目录项和文件数据三者的关系一次讲透在传统Unix文件系统设计里一个文件的存储涉及到三个概念inode索引节点、dentry目录项、data block数据块。搞清楚这三个东西文件系统的很多现象就都能解释了。inode是每个文件的“身份证”里面保存了文件元数据权限、属主、大小、时间戳以及指向数据块的指针。它不包含文件名文件名是目录项里的信息。dentry负责把文件名映射到对应的inode上目录在文件系统眼中就是一张“文件名→inode”的映射表。用户访问一个文件路径是“目录逐级查找dentry→拿到inode→通过inode找到数据块”读出来才得到文件内容。这个设计的两个直接后果第一硬链接的本质是多个dentry指向同一个inode所以硬链接的inode号和原文件完全相同删除任何一个链接只要还有一个dentry指向该inode数据就不会消失第二inode和磁盘空间是两个独立指标明明磁盘空间还有剩余但系统提示“No space left on device”很可能就是inode耗尽了——大量小文件把inode占满磁盘块却还有很多空闲。运维实战里一个高发事故就是inode耗尽常见于缓存目录、消息队列目录、Docker容器日志目录。排查用df -i如果IUsed达到100%就要去日志目录或者小文件扎堆的目录里做清理。这个问题我在后面“常见故障”章节还会详细展开。2.3 journal日志与sync机制掉电不丢数据背后的原理很多初学者不理解为什么Linux服务器意外断电重启后文件系统大多数情况还是完整的这里面的功臣一是文件系统日志journal二是sync机制。简单说现代文件系统ext4、xfs、btrfs都支持在真正修改文件系统元数据之前会先把操作记录写到一块专门的日志区域。这就好比你在修改一份重要档案之前先在便签上写清楚“我要改什么、改成什么样”。操作正式执行后日志记录才会被清除。如果系统在修改途中突然断电重启后文件系统会根据日志进行回放把没完成的操作补完或者撤销从而避免元数据不一致导致的整盘损坏。但要注意journal保证的是元数据一致性不保证所有应用数据都写入了磁盘。文件写入流程是用户态write()→内核page cache→后台回写磁盘。write()返回成功只代表数据进入了page cache不代表数据落在磁盘上。这就是为什么数据库这类对数据安全要求极高的应用必须要用fsync主动刷盘让进程等数据真正落盘后才确认事务成功。sync命令的作用就是主动触发一次全量刷盘把内核里所有脏页被修改过的缓存页写回磁盘。日常操作中拔U盘之前执行sync是必须的否则缓存里的数据还没写盘就被拔走轻则丢文件重则损坏文件系统。理解这一层你就明白为什么“等U盘灯灭了再拔”背后是有技术逻辑的。2.4 主流文件系统横向对比按场景选型Linux下可以用的文件系统确实多但真正生产环境常见的就那几个。我的选型经验如下文件系统特点适用场景ext4最成熟稳定、兼容性最好绝大多数发行版默认系统盘、通用数据盘xfs高扩展性、大文件性能强RHEL系默认大数据量、高并发写入的存储btrfs支持快照、压缩、自校验功能丰富需要快照的存储池、个人NASvfat/exfatWindows兼容性好U盘、移动硬盘、跨平台交换很多新手纠结“到底用ext4还是xfs”其实不用太纠结。系统盘用发行版默认就好数据盘如果拿不准就选ext4这是最稳妥的组合。xfs对大文件、高并发写入更友好但要注意一点xfs不支持在线缩容只能扩容想缩小文件系统体积在xfs上是办不到的。btrfs功能虽多但在线校验和压缩会消耗CPU低配机器上不建议盲目上用。选型时还要考虑后续运维动作。比如你预期未来要扩容那就要提前给LVM留好位置或者直接选xfs这种支持在线扩容的文件系统。文件系统一旦创建完成更换成本极高前期想清楚比后期补救省事得多。3. 磁盘体检与文件系统日常维护实操3.1 坏扇区与SMART自检怎么判断一块磁盘该不该换磁盘坏扇区的出现几乎是不可避免的机械盘尤其如此。关键是出现坏道之后怎么办我的经验是先区分物理坏道和逻辑坏道。物理坏道是盘片表面损伤靠软件修复是没用的正确的做法是立即备份数据、更换磁盘。逻辑坏道则多由异常断电、非法关机导致的校验错误用工具重新写入或擦除后可能恢复正常。问题在于普通用户很难在故障现场准确区分这两者所以我的流程一律是“先备份再测试后判断”。诊断工具方面Linux下最常用的组合是smartctl和badblocks。smartctl用来读取磁盘SMART自检数据重点关注Reallocated_Sector_Ct重映射扇区计数、Current_Pending_Sector待映射扇区数、UDMA_CRC_Error_Count接口错误。如果这两个计数一直在涨说明盘片在加速劣化别犹豫换盘。badblocks可以做全盘扫描用badblocks -sv /dev/sdb执行这个命令会遍历磁盘每个块发现坏块就打印出来。彻底检测最好做破坏性写入测试但生产环境千万别这么做数据会没。很多人遇到坏道就想着用工具“修复”我的态度是数据备份永远是第一位磁盘是消耗品不值得为了一块盘冒险。尤其是做了RAID的机器单块盘出现坏道要尽快更换拖久了可能导致重建失败整个阵列数据全丢那才是真正的灾难。3.2 IO调度器与寻道算法磁盘性能调优的底层开关热搜词里有个关键词“linux设置磁盘寻道算法”这对应的就是Linux的IO调度器。老内核时期IO调度器对机械盘性能影响极大因为机械盘寻道是物理运动磁头来回摆动需要时间调度器的职责就是把IO请求重新排序让磁头按就近顺序移动减少无谓的寻道。这跟电梯实现“顺路捎带”而不是“每层都停”是一个思路。现在的内核IO调度器简化成了这么几种mq-deadline、bfq、nonekyber也被并入或淘汰视内核版本而定。高速SSD基本都用none因为SSD没有寻道概念随机和顺序读写延迟几乎一致任何重排序都是多余的开销。机械盘和混合存储环境里bfq在桌面交互场景表现优秀mq-deadline则在服务器场景更稳。查看当前调度器很简单cat /sys/block/sda/queue/scheduler输出就是当前磁盘支持的调度器列表方括号里是当前生效的。切换也很直接echo mq-deadline /sys/block/sda/queue/scheduler但这是临时的重启就没了。要持久化在udev规则或者systemd服务里配置。调优IO调度器要注意这不是一个“改了立竿见影”的参数感知强弱跟业务负载模型强相关。如果机器跑的是高并发随机小IO的数据库调度器影响很小真正的大头是设备本身的IOPS。机械盘换SSD或者上NVMe是性能层面最本质的解决手段调度器只是锦上添花。3.3 根文件系统快满时最高效的排查与清理路径“根文件系统100%”是我见过最多且最紧急的系统告警。系统盘一旦写满很多服务会直接挂掉因为连写日志都失败。处理要分两步先止血扩容再排查源头。紧急情况下我第一件事就是df -h看总体情况确认到底是根分区满还是其他分区满。然后df -i看inode有没有耗尽。如果只是容量满就开始定位大文件。命令是du -h --max-depth1 /逐层往下找从根目录一层层进入用不了几次就能定位到大目录。这个过程中有几个隐藏大头要格外留心/var/log/journal 系统日志journald默认不清理日积月累能占几十GBDocker容器目录 /var/lib/docker尤其是overlay2层和容器日志/tmp 临时文件目录被异常进程塞满core dump文件服务崩溃后留下的核心转储文件可能几个GB大小被删除但还占着空间的文件最后一个情况很反直觉文件已经被rm删除了但du看不到磁盘空间却不释放。原因是还有进程持有该文件的句柄。处理方式是lsof | grep deleted找到占用进程重启或让进程释放文件空间才会回来。这个坑在日志轮转不正常的服务上经常出现。清理日志和临时文件属于治标治本还要看是不是业务数据增长超过了预期、日志轮转配置是否缺失、告警阈值是否合理。日常运维我建议给根分区预留至少20%的冗余空间并给/var/log单独分一个区让日志撑爆独立分区而不是整块系统盘。3.4 用LVM把卷扩容做成“热操作”LVM逻辑卷管理是Linux磁盘管理里非常实用的一套机制。它把物理分区PV组合成卷组VG再在卷组上切割出逻辑卷LV最后挂载使用。这套抽象的代价是多了一层管理复杂度但换来的是极大的灵活性——在线扩容、跨盘聚合、快照备份都变得简单直接这也是热词“lvm扩容磁盘来扩展逻辑卷的容量”背后大家都在做的事。一条经典的LVM在线扩容流程是这样的。假设新加了一块盘/dev/sdb要把它加到已有的卷组vgdata中并扩展挂在/data下的逻辑卷lvdata# 1. 创建PV pvcreate /dev/sdb # 2. 扩展卷组 vgextend vgdata /dev/sdb # 3. 扩展逻辑卷加50GB lvextend -L 50G /dev/vgdata/lvdata # 4. 扩展文件系统这一步必须做 # ext4 resize2fs /dev/vgdata/lvdata # xfs xfs_growfs /data整个过程中最容易被忽略的是第4步。很多新手执行完lvextend就以为扩容完成了结果df一看容量根本没变就是因为文件系统没有感知到逻辑卷变大了。ext4和xfs的扩容命令还不一样xfs是挂载状态下用xfs_growfs指定挂载点ext4则用resize2fs指定设备文件。LVM这套机制在企业里很常用比如虚拟机所在宿主机给了新磁盘空间虚拟机内部通过LVM就能把新增空间在线扩展给业务分区完全不用停机。但要注意逻辑卷层面一旦做了缩容风险极高撑死只能缩未使用部分且缩容操作极容易造成数据损坏。我的原则是LVM只扩不缩宁可分配多一点点也不去冒缩容的风险。4. 远程文件系统与网络存储挂载实战4.1 NFS挂载完整流程与权限设计日常运维中多台服务器之间共享数据最常见的方案就是NFS。热词里“ubuntu nfs文件系统”说明很多人正在搭这块。NFS的作用是一台机器把目录共享出来其他机器通过网络挂载这个目录用起来就像访问本地文件一样。服务端配置很简单。假设要把/data/share目录共享给192.168.1.0/24网段先编辑/etc/exports# /etc/exports /data/share 192.168.1.0/24(rw,sync,no_subtree_check)然后重启NFS服务或者执行exportfs -ra让配置生效。客户端挂载更简单mount -t nfs 192.168.1.10:/data/share /mnt/shareNFS的权限设计是新手最容易踩坑的地方。NFS的权限受两层约束一层是/etc/exports里定义的export选项另一层是目录本身的Unix权限。root_squash是NFS的默认行为服务端会把客户端的root用户映射成匿名用户nobody防止root跨机器拥有过高的权限。如果你遇到“挂载成功但写不进去”的问题优先排查客户端用户是否是nobody/匿名映射服务端目录的真实属主和权限以及exports里的rw选项是否生效。NFS虽然方便但它的强一致性语义对网络延迟很敏感跨地域场景或者高并发随机写入场景不要硬用。生产环境我会同时设置合理的挂载选项比如加上hard、intr、timeo600防止网络抖动时客户端进程被无限卡死。4.2 “如果该文件位于远程文件系统请检查你的网络连接”这类报错的排查思路这个报错信息相信很多人见过。它其实是文件操作出错时系统给出的通用提示问题根源可能在网络也可能在服务端甚至在客户端。我建议按照“链路自下而上”的顺序排查。第一步是基础网络连通性ping目标服务器IP延迟大不大、丢包率高不高网络不通就不用往下查了。第二步是NFS/RPC层用showmount -e 服务器IP看服务端导出了哪些目录用rpcinfo -p 服务器IP确认rpcbind、nfs服务是否正常注册。第三步是看挂载是否还在NFS挂了之后客户端可能处于假死状态用mount -t nfs看挂载点用df -h看是否卡住。第四步是查服务端状态登录服务器看nfs服务状态看系统的/var/log/messages或者journalctl日志。有一个非常反直觉的坑NFS文件夹在客户端访问卡住时df和ls也可能会hang住因为内核在等超时。这时候硬挂载(hard)的请求会反复重试表现为命令无响应。解决方式是把相关的挂载项umount掉可能要加-l强制卸载然后再重新挂载。另外要关注NFS锁机制和idmap。跨机器访问时客户端和服务端对用户的UID/GID映射如果不一致文件显示为“nobody”是常态。如果是Kerberos安全模式的NFS还要检查票据是否过期。总之远程文件系统的报错不要只盯“网络”两个字很多问题出在权限、服务和映射上。4.3 从单机挂载聊到分布式文件系统HDFS提到“分布式文件系统hdfs”它和NFS是不同维度的事物。NFS是一台服务器共享目录HDFS则是把数据分散存储在一个集群的多台机器上对外呈现一个统一的文件系统视图。HDFS的设计目标是海量数据的存储和流式访问典型应用场景是Hadoop生态里的数据仓库和计算框架。HDFS内部有两个核心角色NameNode元数据节点管理文件系统的目录树和文件块映射和DataNode数据节点实际存储数据块。文件写入时被切分成固定大小的块默认128MB每个块复制多份放到不同DataNode上实现冗余容错。用户看HDFS的路径就像看普通目录比如/user/hadoop/data但底层数据分散在多台机器上。对比下来NFS适合中小规模共享存储单台服务器或小集群HDFS适合大数据量、高吞吐、需要横向扩展的场景。如果公司业务数据量到了TB级甚至PB级还在用NFS硬扛查询性能会很难看IO很容易成为瓶颈。反过来业务就几个GB的数据上来就搭HDFS集群运维复杂度反而成为负担。选型时要想清楚要的是共享文件系统还是一个真正的分布式存储它们解决的问题并不一样。5. 高频故障与雷区实录我踩过的坑都替你们记下了5.1 磁盘占用100%但du看不出来可能在这三个地方磁盘IO占满、磁盘空间占满、inode占满这三种“满”经常被混为一谈但处理方式完全不同。我遇到过最典型的情况是df -h显示根分区满了但du -sh /逐层找下去却找不到大文件或者说找到的总容量加起来远小于df显示的已用空间。这种“幽灵空间”一般有三个来源。第一个是被删除但被进程占用的文件。前面提过文件被rm之后如果还有进程持有其句柄内核不会真正释放磁盘块。用lsof L1可以列出这类文件找出PID后重启服务即可。第二个是系统日志或临时文件增长过快比如journald的日志文件默认上限是系统盘容量的10%但如果你曾经手动改过配置或者有容器在疯狂产生日志很容易在短时间内把空间吃光。第三个是文件系统本身的问题比如ext4的保留块机制默认预留5%的空间给root这个比例在根分区上完全可以接受但如果数据盘也留5%而分区又很大浪费的容量就非常可观可以通过tune2fs调整。“system占磁盘过高”这个热搜词的背后往往就是journald或者systemd-coredump组件产生的文件堆积。处理方式是检查/var/log/journal的占用以及用coredumpctl list查看是否有大量核心转储文件积累。5.2 “磁盘必须经过初始化逻辑磁盘管理器才能访问”到底在说什么这个报错在Windows下很常见但在Linux语境下也值得讲透因为本质是同一件事磁盘上没有合法的分区表。Windows的逻辑磁盘管理器LDM读不到分区表时就会弹出这个提示。在Linux下一块完全没有分区表的磁盘lsblk会显示它是个裸设备fdisk -l时它不显示分区信息mount也直接报错。遇到这种情况想要使用这块盘正确的动作是创建分区表并分区。比如把整块盘做成一个分区# 交互式创建 fdisk /dev/sdb # 依次输入n新建分区、p主分区、1分区号、回车默认起始扇区、回车默认结束扇区、w写入 # 然后格式化 mkfs.ext4 /dev/sdb1 # 然后挂载 mount /dev/sdb1 /data这里要特别提醒新手看到“初始化”两个字不要兴奋初始化不等于格式化更不等于挖数据。如果一个磁盘上有你需要的旧数据但系统提示要初始化这通常是分区表损坏或者分区表类型不被识别先做数据恢复或备份不要贸然初始化——初始化会重建分区表原有数据大概率会被当成未分配空间风险极高。在实际操作中我也见过有人把整块盘不经分区直接格式化比如mkfs.ext4 /dev/sdb而不是/dev/sdb1。这样做虽然某些场景能挂载但后续做LVM、做RAID或者维护时都会很别扭不推荐。正规做法永远先分区再格式化。5.3 U盘写保护无法格式化其实有物理开关和底层原因U盘写保护这个问题Windows下提示“这张磁盘有写保护”Linux下则体现为挂载后目录只读。很多人一遇到就认为是U盘坏了其实原因分几种处理方式完全不同。首先是物理写保护开关很多老式U盘和SD卡卡套上有个小拨杆拨到LOCK位置就会整个盘只读。这个最容易排查肉眼看一下就行。其次是文件系统错误比如之前没正常卸载、Windows下强制拔出文件系统进入只读或错误状态。在Linux下先看内核日志dmesg | tail确认是否有I/O错误然后尝试重新挂载为读写mount -o remount,rw /media/usb。如果是文件系统损坏导致的只读需要umount后执行fsck /dev/sdb1修复。还有一种情况是设备本身进入了“只读保护模式”很多量产U盘在检测到Flash芯片写入异常达到一定阈值后主控会把整盘锁死防止进一步损坏。这种是硬件级的状态软件层面改不回来。如果在多台电脑上都只读且fsck、remount都无效基本就是U盘寿命到了备份数据换新盘。从Linux侧看U盘挂载默认的选项也可能导致看起来“写不进去”。比如桌面环境的自动挂载有时会以只读方式挂载手动挂载时加-o rw即可。我的习惯是在Linux下操作U盘之前先看挂载选项里有没有ro标记避免白忙一场。5.4 虚拟机的虚拟磁盘越用越胖清理思路要系统化热词里“win10虚拟机清理磁盘”带出了一个很普遍的问题虚拟机客户机里删了很多文件宿主机上的虚拟磁盘文件体积却不降反增。这个现象对VMware的vmdk和KVM的qcow2都适用因为虚拟磁盘文件是稀疏文件客户机删除文件时并不会自动把对应的块在宿主机文件里“清零”空间只是被标记为未使用物理文件依然是满的。解决思路分两层。第一层是客户机内清理和修剪。Linux客户机执行fstrim -va这个命令会向虚拟磁盘发送TRIM指令告诉宿主机哪些块可以回收Windows客户机则运行“优化驱动器”里的TRIM功能。这个动作必须放在客户机里做。第二层是宿主机压缩。KVM的qcow2执行qemu-img convert -O qcow2 -p重新生成一次镜像体积就会瘦下来。VMware则有专门的收缩工具。但有一个前提被很多人忽视如果客户机里删了文件但没有先TRIM宿主机压缩根本没有效果因为块还标记为已使用。顺序上我推荐一套标准流程客户机内清理临时文件→执行TRIM/碎片整理→关机→宿主机备份原镜像→执行镜像压缩→确认没问题后删除备份。虚拟磁盘瘦身不是不能做是必须按合理顺序做否则省了几GB空间丢了整台虚拟机数据那就亏大了。这套逻辑也能延伸到“linux系统安装”后虚拟机磁盘动态增长的场景如果创建虚拟机时选了动态分配磁盘而不是固定大小客户机写多少数据宿主机文件就长多大即使客户机里删了数据宿主机上的文件也不会自动缩小必须走一遍上述瘦身流程。写在最后给磁盘运维新手的几点经验盘点了这么多内容最后再用我个人经验收个尾。磁盘与文件系统这个方向本质上就三句话概念要成体系工具要用对场景动手前先留后路。概念成体系说的是不要东一榔头西一棒子。看到lsblk要知道它反映的分区表结构看到df -h要联想到文件系统和挂载看到iostat要想到IO调度器和磁盘队列这些知识点是连在一起的。工具用对场景指的是查容量用du/df查性能用iostat/iotop查原生命令不该用的时候别乱敲免得把自己埋进自己挖的坑。最后一条尤其重要任何写操作——分区、格式化、缩容、重建分区表——动手之前都把数据备份和命令执行计划确认一遍。我见过太多人因为手滑把整块数据盘弄丢包括我自己早年也犯过。检查一遍只要一分钟丢数据是几周都补救不回来的。这些经验和坑能让大家少走一些我走过的弯路这篇东西就没白写。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门