news 2026/9/10 6:49:35

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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分区表是标准组合。老的BIOS+MBR组合在兼容性上有优势,但只有极老旧的机器才需要考虑。

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支持快照、压缩、自校验,功能丰富需要快照的存储池、个人NAS
vfat/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、none(kyber也被并入或淘汰,视内核版本而定)。高速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-depth=1 /逐层往下找,从根目录一层层进入,用不了几次就能定位到大目录。这个过程中有几个隐藏大头要格外留心:

  • /var/log/journal 系统日志,journald默认不清理,日积月累能占几十GB
  • Docker容器目录 /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/share

NFS的权限设计是新手最容易踩坑的地方。NFS的权限受两层约束:一层是/etc/exports里定义的export选项,另一层是目录本身的Unix权限。root_squash是NFS的默认行为,服务端会把客户端的root用户映射成匿名用户nobody,防止root跨机器拥有过高的权限。如果你遇到“挂载成功但写不进去”的问题,优先排查:客户端用户是否是nobody/匿名映射,服务端目录的真实属主和权限,以及exports里的rw选项是否生效。

NFS虽然方便,但它的强一致性语义对网络延迟很敏感,跨地域场景或者高并发随机写入场景不要硬用。生产环境我会同时设置合理的挂载选项,比如加上hard、intr、timeo=600,防止网络抖动时客户端进程被无限卡死。

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,查原生命令不该用的时候别乱敲,免得把自己埋进自己挖的坑。

最后一条尤其重要:任何写操作——分区、格式化、缩容、重建分区表——动手之前都把数据备份和命令执行计划确认一遍。我见过太多人因为手滑把整块数据盘弄丢,包括我自己早年也犯过。检查一遍只要一分钟,丢数据是几周都补救不回来的。这些经验和坑,能让大家少走一些我走过的弯路,这篇东西就没白写。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 6:49:32

共享储能下多微电网优化调度:Stackelberg博弈与Matlab仿真实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 6:48:22

danswer(Onyx)Box 连接器每日集成测试环境搭建与运行指南

danswer(Onyx)Box 连接器每日集成测试环境搭建与运行指南 【免费下载链接】danswer Open Source AI Platform - AI Chat with advanced features that works with every LLM 项目地址: https://gitcode.com/GitHub_Trending/da/danswer 本文以仓库…

作者头像 李华
网站建设 2026/9/10 6:47:11

伴随灵敏度分析在肿瘤生长模型与时空放疗优化中的应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 6:45:30

并网微电网经济调度:粒子群算法的建模、仿真与工程调参

并网微电网的经济调度,表面上是个优化问题,实际上是个“既要又要还要”的复杂决策。很多人一开始觉得,这不就是让成本最低的机组多发电吗?真做起来会发现完全不是这么回事——光伏和风电的出力随风随云飘忽不定,蓄电池…

作者头像 李华
网站建设 2026/9/10 6:37:42

CANN/ge LLM缓存描述API文档

CacheDesc 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端…

作者头像 李华