主题
文件系统与存储管理
本篇定位
覆盖 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/libdu -sh 加 sort -rh 倒序排,几轮就定位到最大的那个目录,一般是日志暴涨、core dump、或者上传目录没清理。
还有一个高频坑必须单独查:你 du 出来所有文件加起来远没用满,df 却显示满了——这是进程还占着已被删除的大文件。比如日志文件被 rm 删了,但那个写日志的进程没重启,文件句柄还开着,空间没真正释放。查法:
bash
lsof | grep deleted # 列出已删除但仍被进程占用的文件找到对应进程,重启它(或 > 那个已删除句柄),空间立刻释放。这是 SRE 排磁盘满的标志性技能,答出来很加分。