📁 文件系统
inode · 硬软链接 · 磁盘 IO · 文件系统类型
1. 什么是 inode?文件是如何存储的?
- inode(索引节点):文件的"身份证"——存元数据:大小、权限、所有者、时间戳、数据块指针。文件名 → 目录项(dentry)→ inode 号 → 数据块
- 文件 = inode + 数据块;目录也是一个文件(内容是"文件名 → inode 号"的映射表)
- 磁盘满的两种可能:块满了(df -h 100%)或 inode 满了(df -i 100%——小文件太多)
- inode 表在格式化时分配固定数量(mkfs 参数可调)
🎯 面试要点
- 经典排障:`No space left on device` 但 df -h 还有空间 → 查 df -i(inode 耗尽)
- ls -i 看 inode 号;stat 看文件完整信息
2. 硬链接和软链接的区别?
- 硬链接:多个目录项指向同一个 inode(link count +1)。删除一个链接,只要 count > 0 数据还在。不能跨文件系统、不能链接目录
- 软链接(符号链接):一个特殊文件存"目标路径",像快捷方式。目标删除则链接失效(悬空)。可跨文件系统、可链接目录
命令对比
ln a.txt b.txt # 硬链接:ls -i 看 inode 相同
ln -s a.txt c.txt # 软链接:c.txt 是独立文件指向 a.txt
rm a.txt # 硬链接 b.txt 仍可读(count 减 1)
# 软链接 c.txt 变成红链(悬空)
# 应用:Linux 下 Java 版本管理(java -> jdk17)
🎯 面试要点
- 判断:ls -l 首字符 l 是软链接;stat 看 Links 字段
- 软链接的路径陷阱:相对路径以"链接所在目录"为基准
3. 磁盘 IO 与文件系统基础?
- 顺序 IO vs 随机 IO:机械盘顺序 ~100MB/s、随机 ~1MB/s(寻道);SSD 随机也快但顺序仍更优——数据库/日志设计都追求顺序写
- 文件系统类型:ext4(通用默认)、xfs(大文件/高并发,RHEL 默认)、btrfs、zfs;日志文件系统(journal)保证崩溃一致性
- PageCache 回写:写文件先进页缓存(write 立即返回),后台异步刷盘(每设备回写线程 bdi writeback;pdflush 在 Linux 2.6.32 已被移除)——断电可能丢数据(要 fsync 才落盘)
- Java 侧:RandomAccessFile 随机读写;FileChannel 同样支持定位读写(
position()、read(buf, pos))与内存映射(MappedByteBuffer)
🎯 面试要点
- fsync 语义:数据库 redo log、Kafka 消息落盘都依赖"强制刷盘"保证持久性
- iostat 看磁盘:%util、await、iops——磁盘饱和排查