我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Linux存储体系详解:磁盘、分区、文件系统、挂载点与目录的关系

Linux存储体系详解:磁盘、分区、文件系统、挂载点与目录的关系 去年帮一个朋友整理一台旧服务器他盯着终端里的lsblk输出问了我一句这几块盘到底哪个是 C 盘我说 Linux 里没有 C 盘只有一个/。他又问那/到底在哪块盘上这个问题一下把我问住了。不是答不上来而是意识到很多人敲过fdisk、mkfs、mount却始终没把这五个概念之间的关系理顺。磁盘、磁盘分区、文件系统、挂载点、目录这五个词单独拎出来都能说出点东西放一起就容易乱。尤其对从 Windows 转过来的朋友Windows 下一切都有盘符接得很自然到了 Linux 突然要靠“挂载”这种抽象操作搞不清sda1、ext4、/data到底谁是谁。这篇文章就把这条存储链路从物理介质到最终能访问的路径完整拆一遍讲清楚每个环节解决什么问题、为什么 Linux 要这样设计、实际排查问题时怎么按层定位。写的时候尽量用大白话把底层机制说透适合刚入门的运维新人也适合一直对挂载点概念模糊、想彻底搞懂 Linux 存储体系的朋友。1. 磁盘整个存储体系的物理地基1.1 磁盘到底是什么它只干一件事磁盘是整个存储体系里最“硬件”的一层。传统机械硬盘内部有一张或几张高速旋转的盘片盘片表面涂着磁性材料磁头悬浮在盘片上方通过改变磁性粒子的极性来写入数据通过感应磁场变化来读出数据。盘片被一圈一圈地划分成磁道磁道又被切成一段一段的扇区每个扇区传统上是 512 字节现在大容量盘很多是 4096 字节。这个物理结构决定了机械硬盘的很多特性寻道需要磁头在盘片径向移动所以随机读写慢、顺序读写快转速越快延迟越低但功耗和噪音也越大。你可以把盘片想象成一个巨大的停车场数据是车扇区是车位磁头是取车机器人取车机器人要开到对应的车位上才能读写。现代人嘴里的“磁盘”早就不一定是机械盘了固态硬盘没有盘片也没有磁头靠闪存颗粒存数据读写原理完全不同。但操作系统不关心这些不管是 SATA 机械盘、NVMe 固态盘还是 U 盘在系统眼里都统一抽象成“块设备”按固定大小的数据块读写。这也是“磁盘”这个词一直沿用到现在没被淘汰的原因——大家默认指的是底层那块物理存储介质。1.2 Linux 里磁盘叫什么Linux 里每检测到一块磁盘内核就会在/dev下创建一个设备文件。老一点的 SATA/SCSI 盘命名通常是/dev/sda、/dev/sdbsd其实来自 “SCSI Disk” 的历史习惯并不是 SATA 的意思。NVMe 固态盘的命名更直白像/dev/nvme0n1意思是第一个 NVMe 控制器上的第一块命名空间。设备名是按内核检测到硬件的顺序分配的不一定永远固定。你开机时硬盘顺序变了sda可能变成sdb这就是为什么生产环境里不能用sda1这种名字去做开机自动挂载后面会讲到怎么解决。磁盘这层只负责一件事提供一块可以按地址读写的数据空间。它不管数据是什么格式、文件叫什么名字那些都是上面几层的职责。2. 磁盘分区在一整块介质上画格子2.1 为什么要分区而不是整块直接用一块磁盘刚买回来什么内容都没有。你可以选择整块盘不分区直接格式化很多 U 盘就是这么干的系统也能用。但服务器场景下几乎没人这么做原因很实际分区可以把物理上的一块盘划分成几个逻辑上互相独立的区域。系统盘和数据盘分开万一系统坏了重装系统数据分区不动日志分区写满不会影响其他分区备份、快照、配额都能按分区来管理。多个操作系统共存在一块盘上也需要分区比如一台机器同时装 Windows 和 Linux 双系统。大分区还有个隐藏问题文件系统检查和修复的时间和分区大小直接相关一个 10TB 的分区出问题要跑很久。机器上挂了很多逻辑卷组的话磁盘碎片整理、迁移、扩容这种操作也会更灵活。简单来说分区就是给操作系统画格子让不同用途的数据住在不同房间里降低互相干扰的风险。2.2 分区表MBR 与 GPT分区怎么画、画在哪里、从哪里到哪里这些信息要有一个“账本”记下来这个账本就是分区表。分区表不是存在某个分区的数据区里而是存在磁盘最开始的位置这个位置独立于任何分区之外。最经典的分区表规范是 MBR全称 Master Boot Record主引导记录。它诞生于上世纪 80 年代设计中只留了 64 字节存分区信息每 16 字节描述一个分区所以最多支持 4 个主分区。想用更多分区就得把其中一个主分区改成“扩展分区”在扩展分区里再切逻辑分区。MBR 用 32 位 LBA 地址导致单块磁盘最大只能寻址 2TiB 左右超过 2T 的盘用 MBR 就浪费容量了。现在的替代方案是 GPTGUID Partition Table。它在磁盘头部存主分区表磁盘尾部还会存一份备份分区表一份损坏了另一份还能兜底这个容错设计明显比 MBR 扎实。GPT 每个分区用一个全局唯一标识符来区分分区数量默认支持 128 个容量上限到了 ZB 级别这几年新买的电脑出厂都是 GPT。UEFI 引导必须用 GPT传统 BIOS 用 MBR这是选型时最直接的判断标准。对比项MBRGPT单盘容量上限约 2TiB理论支持 ZB 级主分区数量4 个可扩展逻辑分区默认 128 个分区表备份无磁盘尾部有备份引导方式BIOS/传统启动UEFI数据结构偏移量记录GUID 标识容错更强选分区表时记住一个原则UEFI 启动的机器、超过 2TB 的盘、想省心点的一律用 GPT老机器 BIOS 启动才考虑 MBR。Windows 系统对 MBR 和 GPT 的支持历史上折腾过不少版本现在 Win10/11 基本都是 GPT 起步所以也不要看到 GPT 觉得是什么新东西不敢用。2.3 分区对齐这个容易被忽略的细节分区操作里藏着一个小细节叫分区对齐。机械硬盘往 SSD 过渡的时候物理扇区常见是 4096 字节一次原子写入而操作系统逻辑块可能还是 512 字节。如果分区起始位置没有对齐到物理扇区边界一个逻辑写操作可能横跨两个物理扇区读写速度会莫名掉一截SSD 上还会增加额外的写放大。早年的老工具需要手动算柱面对齐现在fdisk默认就按 1MiB 起始对齐一般不用管。但如果你用一些很老的分区工具或者在 Windows 上用第三方软件分区还是要留个心眼看看分区起始扇区是不是 2048 的整数倍。排查问题慢的时候这种不起眼的配置项能省很多折腾。3. 文件系统让磁盘上的 0 和 1 变成文件和文件夹3.1 文件系统解决的是一个归档问题分区画好了但你直接把数据往分区里写写出来是乱七八糟的二进制块没有任何层次结构。文件系统就是来干这个的它在分区的原始块地址之上建立一套名字、目录、权限、时间戳、属性、数据的组织规则。通俗说分区是毛坯房文件系统是内部装修方案——水电怎么走、房间门牌怎么标、家具摆在哪全按这套方案来。格式化本质就是把文件系统写入到分区上。在这个操作之前分区上是一堆空扇区格式化之后分区头部出现了超级块、索引节点表、数据块描述等信息结构操作系统才能在这个分区上创建目录、写文件名、记录每个文件占用了哪些块。3.2 常见文件系统怎么选Linux 环境最常用的原生文件系统是 ext4 和 XFS。ext4 是老牌选手兼容性最好数据恢复工具最成熟系统盘选它基本不会错。XFS 擅长处理大文件和高并发写入很多数据库服务器和文件服务器都用它也是 RHEL 系现在的默认文件系统。Btrfs 功能很激进自带快照、压缩、校验和但成熟度更适合实验环境和部分容器场景生产环境需要评估团队熟悉度再上。Windows 用的 NTFS 支持权限、加密、日志是最完整的 Windows 原生方案。跨 Windows 和 macOS 之间移动大文件exFAT 是最省心的选择没有单文件 4GB 限制又不像 NTFS 那样在 macOS 上只能读不能写。FAT32 已经过时除了个别嵌入式设备、老相机和特殊引导分区不要给正常业务数据用。NFS 不算本地文件系统它是通过网络的远程文件系统客户端把服务端导出的目录当成本地盘用常见于无盘工作站和集群共享场景。文件系统适用场景单文件上限日志快照ext4Linux 通用系统盘/数据盘16TiB有否XFS大文件、高并发写入、数据库8EiB有否依赖 LVMNTFSWindows 系统盘/数据盘16EiB有有exFATU 盘/移动硬盘跨平台16EiB无否FAT32老设备/兼容性兜底4GiB无否NFS局域网共享、集群文件系统取决于服务端无网络取决于服务端3.3 格式化不只是“清空数据”很多人以为格式化等于清空数据其实只对了一半。格式化是在分区上重建一套文件系统管理结构包括超级块、inode 表、块组描述符等。这些结构决定了这个分区之后怎么分配空间、怎么记录文件。数据本身在格式化后并没有立即被擦除只是文件系统的索引变了原文件占用的块被标记为“空闲可用”所以格式化后的数据还能被专业工具找回。真要彻底清掉数据得用随机数据覆盖写一遍。inode 这个概念值得多说一句。每个文件在文件系统里对应一个 inode里面存权限、所有者、文件大小、时间戳、数据块指针一类元数据。文件名在哪文件名其实是存在目录项里的目录项把“文件名”和“inode 编号”关联起来。这个设计让我们可以通过多个硬链接指向同一个 inode也就是同一个文件可以在不同目录有不同的名字。你ls -l看到的文件信息其实是从 inode 里读出来的。3.4 VFS、sync、根文件系统几个绕不开的机制Linux 下应用读写文件不管底层文件系统是 ext4、XFS 还是 NFS走的都是同一组系统调用open()、read()、write()。能这样统一是因为内核里有一层虚拟文件系统 VFS它定义了一套统一接口具体文件系统只需要实现这些接口就行。你可以把 VFS 理解成标准插座ext4、XFS 是不同厂商的插头只要插头做得符合标准插座规范你就不用关心后台是哪个文件系统在干活。再说sync。现代操作系统为了性能写文件时是先把数据放进内存页缓存由内核在合适的时机批量落盘。这种写法的好处是快坏处是断电或系统崩溃时内存里还没落盘的数据会丢。sync命令的作用就是强制把页缓存里的脏数据刷回磁盘。所以拔 U 盘之前执行一下 sync等命令返回再拔就是给数据落盘留出时间。很多新手觉得没必要真遇上一次数据损坏就记住了。根文件系统这里要先点一句它是系统启动时必须挂载的一个文件系统承载着/bin、/etc、/lib这些系统运行的基础目录。后面讲挂载点时会展开这里先记住根文件系统不是“根目录”根目录是目录树的最顶端/根文件系统是挂载在/位置上的那份文件系统。4. 挂载点把文件系统“接”到目录树上的那个孔4.1 Windows 盘符与 Linux 挂载点的本质区别Windows 用户熟悉的存储访问方式是盘符C 盘是系统盘D 盘是数据盘插个 U 盘出来 E 盘。Windows 这么做的好处是直观坏处是盘符是固定的、有限的而且是“一盘一位”一个分区只能对应一个盘符想同时用两个路径访问同一块盘就比较别扭。Linux 从一开始就换了一套思路。整个系统只有一个根目录/它像一棵树的根部下面挂着一堆目录。任何一块磁盘分区要能被访问就得先挂载到这棵树的某个目录节点上那个目录就是挂载点。挂载这个过程等同于把一份文件系统接进目录树。这个设计的精髓在于灵活。一个分区可以挂载到任意一个空目录你想让数据出现在用户的主目录下还是出现在某个服务目录下都随你。多个分区可以挂载到不同的目录节点共同组成一棵目录树甚至同一个分区可以挂载到两个目录同时访问。Windows 的盘符方案是“每个卷一个独立入口”Linux 的方案是“所有文件系统拼成一棵树入口只有一个”。理解了这点挂载点的概念就算打通了一半。4.2 挂载操作的本质把设备和目录连接起来看一个最简单的挂载命令mount /dev/sdb1 /data这条命令做了三件事确认/dev/sdb1上有可识别的文件系统、确认/data这个目录存在、然后把/dev/sdb1文件系统接到/data目录上。执行之后你访问/data里的任何路径实际落到的都是/dev/sdb1那块分区的空间。挂载点必须是一个已经存在的目录。如果/data不存在直接mount会报错最常见的处理方式就是先mkdir再挂载。这里埋了一个坑如果把文件系统挂载到了一个非空目录比如/data下原本有文件挂载后这些文件会被“遮住”你看不见它们但它们还在磁盘上只是被暂时挡住了卸载后就会重新出现。不是数据丢了是挂载点把原目录内容挡住了。这个设计在系统启动时有意义它让系统目录永远存在、可挂载但同时导致很多人误删数据。卸载用umount注意是umount不是unmount少一个 n新手第一次敲基本都会敲错。卸载常见的报错是target is busy说明还有进程在使用这个挂载点下面的文件。解决方式是先用lsof D /data或fuser -mv /data找到占用进程处理完再卸载。如果实在找不出来可以mount -l /data做 lazy 卸载让系统等访问结束再真正断开。4.3 根文件系统和开机自动挂载根文件系统是 Linux 启动过程中第一个被挂载的文件系统挂在/上。它不能卸载因为整个目录树的根在这里所有路径都是从它延伸出去的。启动后其他文件系统要不要挂、挂到哪里由/etc/fstab这个配置文件统一管理。/etc/fstab每一行代表一条挂载规则格式固定冒号分隔共六个字段设备标识 挂载点 文件系统类型 挂载选项 dump 标记 自检顺序第六列是fsck检查顺序根文件系统一般是 1其他一般是 2不想检查就写 0。第一列推荐用 UUID 而不是/dev/sdb1因为设备名会随硬件检测顺序变化UUID 是文件系统创建时生成的全球唯一标识基本不会重复。# 通过 blkid 查看分区 UUID blkid /dev/sdb1拿到 UUID 后在/etc/fstab里追加一行比如UUID0f8e6dca-4b8f-4d2a-aa2a-9a6c7d8e9f10 /data ext4 defaults 0 2改完先执行mount -a测试一下这次配置有没有问题能正常挂载再重启。这里必须反复强调/etc/fstab写错系统开机时会进入救援模式连系统都起不来这是运维新手最容易翻车的场景之一。所以每次改完 fstab 一定要先在当前系统里验证再考虑重启。4.4 目录里常出现的挂载点都有谁Linux 发行版安装后df -h会看到一串文件系统每个都挂载在不同目录上。/boot 是引导分区里面放内核和引导程序/home 是用户主目录拆出来方便重装系统保留用户数据/var 放日志和缓存拆出来防止日志写满系统盘。/mnt 和 /media 是约定俗成的临时挂载位置系统管理员手动挂 U 盘、光驱、临时硬盘一般用 /mnt桌面环境自动挂载可移动设备用 /media。不同发行版对这些挂载点的拆分习惯不同生产服务器为了可维护性通常会把 /home 和 /var 拆出去数据量大的还会把 /opt 或自定义目录单独挂载。拆成多个挂载点本质是控制故障域——某个分区空间满了不会立刻拖垮整个系统。5. 目录挂载点之上的一张“树状地图”5.1 目录其实也是“文件”在文件系统层面目录不是容纳文件的抽象盒子它本身也是一个文件只不过内容是“子项的名字到 inode 的映射表”。你创建一个目录系统就是在文件系统里分配一个 inode然后在里面记录子项信息。这也是为什么同一文件系统里mv操作超快因为只是改个名字跨文件系统mv就变慢因为本质变成了“复制到新位置再删除原来的”。目录树的底部结构是这样的磁盘分区 —— 文件系统 —— 目录树中的某个挂载点。几个文件系统通过各自的挂载点都“粘”在同一个根目录树的不同位置。用户访问目录树时感知不到文件系统边界路径一路走到底就行。这也是“目录”和“文件系统”容易混淆的根源——目录是树上的节点文件系统是被挂接到节点的那个存储空间。5.2 FHS 目录规范Linux 目录结构的行业默契Linux 各发行版能让人换系统后还能找到配置文件在哪靠的是一套叫 FHS 的目录标准Filesystem Hierarchy Standard。它规定了根目录下每个一级目录的用途目录用途/bin/sbin系统基础命令和系统管理命令/etc系统和应用配置文件/home普通用户主目录/root管理员主目录/var日志、缓存、队列等会快速变化的数据/usr系统软件和库文件相当于“系统应用区”/tmp临时文件重启可能被清/opt第三方大型软件安装目录/boot内核和引导文件/dev/proc/sys设备文件、内核参数、系统状态接口比较特殊了解这份规范对排查问题特别有用。日志去哪找/var/log。配置文件改哪/etc。自己装的应用放哪/opt或/usr/local。有了这个地图你在一台陌生的 Linux 机器上也能快速定位问题不用到处翻。5.3 目录、挂载点、文件系统的三角关系把这三个概念放在一张图里看就更清楚了挂载点本身是一个目录但这个目录已经被标记为某文件系统的接入位置。它有两重身份在目录树里它只是一个节点在存储体系里它是一份文件系统的门牌号。实际操作中遇到疑难问题第一件事就是要分清你正在操作的路径属于哪个文件系统。df -h一下就知道了它有个很实用的功能能显示指定路径所在文件系统的挂载点和可用空间。这个命令是排查“磁盘满了但目录找不出大文件”这种问题最有力的起点——因为挂载点可能把不同分区的空间拼在同一棵目录树里你在某个目录下看半天文件其实在别的分区上。还有一个常见坑在挂载点目录下执行rm -rf。如果操作目标恰好是挂载点本身rm -rf /data删掉的只是这个挂载点目录不会删除分区里已经挂载的数据。这个行为既是保护也是迷惑很多人以为删了其实数据还在原分区上只是脱离开了目录树。下次再挂载同一个分区数据又出现了。搞清楚这个逻辑很多“删不掉”和“删了又冒出来”的问题就能理解了。6. 实操示例从一块新磁盘到正常使用6.1 场景设定假设我给一台 Linux 服务器加了一块 20GB 的虚拟磁盘目标是把这块盘全部划成一个分区格式化成 ext4挂载到/data目录并且配置成开机自动挂载。整个过程就是前面所有概念的实战串联完整走一遍基本能覆盖日常 80% 的磁盘管理操作。6.2 查看磁盘并分区先确认新磁盘有没有被系统识别到lsblk输出里如果多出/dev/sdb大小为 20G没有任何分区就是它了。此时可以用fdisk开始分区fdisk /dev/sdb进入交互界面后依次输入n 创建新分区 p 主分区 1 分区编号 回车 起始扇区默认 回车 结束扇区默认整块盘作为一个分区 w 写盘并退出注意fdisk的操作目标是整个磁盘/dev/sdb不是分区/dev/sdb1。新手容易在这个地方搞错冲着分区去执行分区命令。执行完成后用lsblk能看到/dev/sdb1出现了这表示一块裸盘变成了一个带分区表的分区。如果磁盘超过 2TB或者想在 UEFI 环境下做得更标准可以改用 GPT 分区工具gdisk或parted。目前 2TB 以下用fdisk就行现代fdisk默认创建 GPT 分区表也不是问题但它自动选 GPT 的模式要看实际环境生产环境如果混合引导模式建议明确指定。6.3 格式化创建文件系统分区创建好之后在/dev/sdb1上创建 ext4 文件系统mkfs.ext4 /dev/sdb1命令跑完会输出超级块和文件系统参数信息。这一步就是“格式化”执行之后/dev/sdb1才有能力存储文件。格式化是一次性操作同一分区反复格式化会清掉里面所有数据执行前务必确认设备名没写错。我见过不止一次有人把mkfs的目标从/dev/sdb1打成/dev/sda直接把系统盘抹了。验证设备名多用lsblk和df -h对照着看能避免绝大多数悲剧。6.4 创建挂载点并挂载格式化的分区需要有个目录接入目录树。我习惯先查一下/data是否存在避免挂载到有内容的目录mkdir /data mount /dev/sdb1 /data df -hdf -h输出里出现/dev/sdb1挂载在 /data说明挂载成功。此时在/data下写文件数据就落到/dev/sdb1上了。挂载点的选择其实很讲究除了根目录和标准挂载点业务数据建议用/{业务名}这种有辨识度的目录。6.5 配置开机自动挂载光挂载还不行重启后系统不会自动把这块盘挂回来得写进/etc/fstab。先拿到分区的 UUIDblkid /dev/sdb1拿到输出里的 UUID编辑/etc/fstab追加一行UUID0f8e6dca-4b8f-4d2a-aa2a-9a6c7d8e9f10 /data ext4 defaults 0 2写完先别急着重启执行mount -amount -a会按照 fstab 去挂载所有尚未挂载的文件系统没有任何报错说明配置没问题。再df -h确认一次这次配置就基本稳了。/etc/fstab最好备份一下改动前cp /etc/fstab /etc/fstab.bak改坏了能直接回滚这是我在生产环境留下的习惯。6.6 LVM 场景的扩展思路如果业务增速不确定建议在分区后先把整块盘加入 LVM创建逻辑卷再格式化。LVM 的核心理念是把多块物理磁盘聚合成一个卷组再从卷组里划分逻辑卷给用户使用。好处是可以随时在线扩容不用停机不用去动数据。上面这个 20GB 的盘如果走 LVM流程会变成pvcreate /dev/sdb1 vgcreate vgdata /dev/sdb1 lvcreate -L 19G -n lvdata vgdata mkfs.ext4 /dev/vgdata/lvdata mount /dev/vgdata/lvdata /dataLVM 对系统盘尤其有意义根文件系统空间不够时加一块盘进卷组把空间扩展到根逻辑卷不用重装系统。对初学者来说先在普通分区上把概念摸熟再接触 LVM会顺畅很多。7. 常见问题的排查思路7.1 Windows 新硬盘提示“磁盘必须经过初始化”Windows 里插一块没使用过的硬盘磁盘管理工具会弹提示“磁盘必须经过初始化逻辑磁盘管理器才能访问”。这是新盘没有建立分区表的表现。解决办法很简单在磁盘管理里右键左侧的磁盘编号选择“初始化磁盘”选 GPT 分区表确定后就完成了建账本的动作。初始化之后才能新建简单卷、分配盘符、格式化。这个提示本身不算故障是 Windows 在问你要用哪种分区表。7.2 磁盘使用率 100% 但不知道是谁在消耗Linux 里磁盘满有两种完全不同的满法空间满和 inode 满。空间满用df -h看当Avail显示为 0 就算满inode 满用df -i看即使还有剩余空间也建不了新文件。小文件特别多的目录比如邮件队列、临时文件目录最容易触发 inode 满。排除空间问题后如果系统整体很卡、top里的wa值很高说明磁盘 I/O 繁忙。用iostat -x 1看%util和await%util接近 100% 表示磁盘几乎一直在忙iostat看设备级别只能定位到盘要落到进程就用iotop。常见元凶是日志没轮转、数据库锁等待、或者某些进程在疯狂读写临时文件。配合lsof L1能看到已被删除但仍被进程占用的文件这种文件不会出现在目录里却一直占着磁盘空间很隐蔽。7.3 U 盘提示写保护、无法格式化U 盘出现写保护提示先从最物理的开始排查U 盘外壳上有没有一个可以拨动的小开关那是最常见的硬件写锁。确认没有开关后在 Linux 下用dmesg | tail查看内核日志经常能看到remount read-only之类的信息这表示 U 盘介质侧已经切到只读状态。U 盘明明没写开关却变成只读大概率是闪存寿命耗尽、驱动识别异常或文件系统损坏。Windows 下先看磁盘属性里的“只读”勾选项没有的话可以试试用diskpart清属性命令是diskpart list disk select disk X attributes disk clear readonly提醒一句diskpart的clean命令可以强制抹掉分区表能绕过一些因分区表损坏导致的写保护假象但会把整个 U 盘数据清空执行前必须确认盘符没选错。7.4 U 盘或移动硬盘插入后显示容量为 0插上内存卡或 U 盘系统识别到了设备但容量显示 0还提示“插入磁盘”。这多半是分区表损坏操作系统读不到有效结构。Linux 下先lsblk看设备还在不在然后用fdisk或gparted重建分区表。数据不重要的话直接删掉所有分区新建一个重新格式化就能用。数据重要就先用ddrescue做整盘镜像再从镜像里尝试恢复别直接在原盘上折腾。系统中还常见一种情况是文件系统损坏导致挂载不上。此时不要盲目fsck先卸载设备或确保没有进程占用再用fsck -f /dev/sdb1修复。fsck只能修文件系统逻辑层的问题物理坏道它管不了检测到大量坏扇区时先考虑换盘更现实。7.5 远程文件系统文件访问卡死NFS 这类网络文件系统如果出问题表现非常折磨人目录可以正常打开一部分个别文件一操作就卡住然后弹“如果该文件位于远程文件系统那么请检查你的网络连接”。这个提示本身没什么技术含量真正的原因通常是 NFS 服务端没响应、网络中断、或者客户端和服务端的 NFS 版本不一致。排查顺序先看客户端能不能连通服务端ping只能证明网络通最好用showmount -e 服务端IP确认服务端导出是否正常。如果客户端已经挂载的目录卡死umount也会卡住这时候要加-f强制卸载或者umount -l。网络文件系统的最大特点就是本地文件系统不会犯的错误它都会犯——网络一抖连ls都能卡住这是分布式系统不可避免的取舍排查时心态要放平。7.6 目录无法删除提示“设备或资源忙”rm -rf删不掉目录还提示“Device or resource busy”或者“无法删除目录”绝大部分情况是有进程正在使用这个目录里的文件。先用lsof D 目录路径找到占用进程处理掉进程再删。如果是挂载点目录先卸载再删直接删挂载点虽然有时候能删掉目录本身但挂载关系还在容易留下混乱状态。还有一种常见情况是目录属于 FUSE 挂载文件系统比如网盘客户端、容器卷、对象存储挂载点。这种目录在普通文件系统操作界面里能看到内容但底层不是普通磁盘分区不能直接rm -rf删除挂载点目录应该先卸载对应的 FUSE 挂载。我自己就曾经为了删一个网盘目录折腾了半天最后发现那根本不是真目录只是一个挂载接口。7.7 存储层的问题怎么快速定位把前面所有概念压缩成一句经验遇到存储问题先分清楚是哪个层级出了问题。设备层用lsblk看硬盘和分区是否存在、大小是否正常文件系统层用blkid和df -T看文件系统类型和挂载状态挂载层用mount和/etc/fstab确认挂载关系目录层用常规的ls、find、du定位哪一个目录在异常消耗。四层按顺序排查大多数问题都能在几分钟内定位到根因而不是在错误的方向上瞎折腾。我自己在实际操作中还有个习惯凡是动分区表、格式化、改 fstab 这类高危操作一定要先截图当前lsblk和df -h的状态确认设备名、分区号、UUID再动手。很多事故不是技术不会是手比脑子快。这套链路理解透了不管是加盘、扩容、迁移还是故障恢复都有了清晰的地图至少不会再把“磁盘”“分区”“文件系统”“挂载点”“目录”这五个词混为一谈了。
返回列表