Skip to content

文件系统与存储管理 ​

本篇定位

覆盖 FHS、文件系统、LVM、RAID、inode 和磁盘排查。

高频面试题 ​

Q1:LVM 原理和好处? ​

我的答案:

LVM 是在磁盘分区和文件系统之间加的一层"弹性管理层",解决的是传统分区写死大小、后期扩容要搬家的痛点。它分三层,从下往上是 PV → VG → LV。

最底层 PV(物理卷):把整块盘或分区 pvcreate /dev/sdb 打造成物理卷。中间 VG(卷组):把多个 PV 拼成一个大池子 vgcreate data_vg /dev/sdb /dev/sdc。最上层 LV(逻辑卷):从池子里切一块出来用 lvcreate -L 100G -n data_lv data_vg,然后 mkfs 格式化、挂载,业务看到的就是这块 LV。

好处有两个核心。第一是在线弹性扩容:业务盘写满了,不用停机迁数据,往 VG 里加新盘再 lvextend 扩 LV、xfs_growfs(或 resize2fs)扩文件系统就行,全程在线。命令链是 vgextend data_vg /dev/sdd && lvextend -L +50G /dev/data_vg/data_lv && xfs_growfs /data。第二是快照:lvcreate -s -n snap -L 1G data_vg/data_lv 做个快照,相当于给文件系统拍个即时还原点,备份或测试时很有用。

反面我也踩过坑:当初装机图省事没做 LVM,盘写满了只能临时软链,所以后来我个人实验室一律先规划 LVM,这是吃了亏换的经验。


Q2:常见 RAID 级别及区别? ​

我的答案:

RAID 是把多块盘组合成一块逻辑盘,换性能或冗余。我用一张对比说清楚常见四个级别。

级别原理可用容量冗余性能典型场景
RAID0条带,数据劈开同时写多盘N 盘全用无,坏一块全丢读写最快临时缓存、不在乎丢的数据
RAID1镜像,两块盘写一模一样只用一半能坏一块读好写一般系统盘、要求高可靠
RAID5分布式奇偶校验,至少 3 块(N-1) 盘能坏一块读好写一般通用文件/数据库常用
RAID10先镜像再条带(1+0),至少 4 块用一半每组镜像能坏一块读写都快高要求数据库

我用自己的话总结选择逻辑:要性能不要安全选 0;要安全不在乎容量选 1;要平衡性价比选 5;又要快又要安全、不差钱选 10。 数据库生产我倾向 RAID10,写性能和冗余都顾得上;普通日志/备份用 RAID5 性价比最高。

补充一句:RAID 不等于备份。RAID 防的是单盘物理损坏,误删、病毒、逻辑损坏它都救不了,所以该备份还得备份。软硬 RAID 区别上,重要业务用硬 RAID 卡(有缓存、不占 CPU),软 RAID(mdadm)便宜但吃主机资源。


Q3:磁盘有空间却提示 No space left? ​

我的答案:

这个坑我实际遇到过——df -h 看明明还有几十 G,写文件却报 No space left on device。第一反应不是看容量,而是看 inode 用完了没有。

原理:Linux 里每个文件不管多小,都要占一个 inode 来存元数据(权限、大小、位置)。df -h 看的是数据块容量,而 df -i 看的是 inode 个数。如果你磁盘上有海量小文件(比如几万个几 KB 的 session、缓存、日志碎文件),数据块还没用多少,inode 却被小文件占光了——这时候新建文件就报 No space left,但大块文件还能写。

排查命令:

bash
df -h /data     # 看容量,可能还有很多
df -i /data     # 看 inode,Use% 100% 就是它了

找到后定位是谁造的小文件:du -sh /data/* | sort -rh 找大目录,或者直接找小文件密集的地方(常见是 /var/spool/clientmqueue、应用缓存目录),清理掉没用的小文件,inode 就释放了。

其他次要原因:磁盘配额(quota)限制了用户用量,或者是挂载点下面藏着已被删除但进程还占着的大文件(这个用 lsof | grep deleted 查,见下一题)。面试答到 inode 这一层,基本就到位了。


Q4:磁盘空间满如何排查? ​

我的答案:

磁盘满我有一套固定排查顺序,从粗到细两步定位。

第一步先看整体谁满了:

bash
df -h            # 看哪个挂载点 Use% 到 100%
df -i            # 同时看 inode 是不是先满了(上一题)

第二步进满了的目录逐层往下钻:

bash
du -sh /* 2>/dev/null          # 先看根下每个目录占多大
du -sh /var/* 2>/dev/null      # 一层层往下,通常在 /var/log 或 /var/lib

du -sh 加 sort -rh 倒序排,几轮就定位到最大的那个目录,一般是日志暴涨、core dump、或者上传目录没清理。

还有一个高频坑必须单独查:你 du 出来所有文件加起来远没用满,df 却显示满了——这是进程还占着已被删除的大文件。比如日志文件被 rm 删了,但那个写日志的进程没重启,文件句柄还开着,空间没真正释放。查法:

bash
lsof | grep deleted     # 列出已删除但仍被进程占用的文件

找到对应进程,重启它(或 > 那个已删除句柄),空间立刻释放。这是 SRE 排磁盘满的标志性技能,答出来很加分。


相关链接 ​