🔧 第06课:文件系统维护

阶段一:文件系统 第6/6课

📚 课程目标

一、文件系统检查 — fsck

1.1 fsck工作原理

fsck (File System Consistency Check) 检查并修复文件系统不一致。它检查以下内容:

对已挂载的文件系统运行fsck可能导致数据损坏!务必先卸载或在单用户模式下运行。

1.2 fsck使用

# 检查文件系统(交互式,逐个确认修复)
sudo fsck /dev/sdb1

# 自动修复(不询问,推荐)
sudo fsck -y /dev/sdb1

# 仅检查不修复
sudo fsck -n /dev/sdb1

# 强制检查(即使标记为clean)
sudo fsck -f /dev/sdb1

# 检查所有fstab中的文件系统
sudo fsck -A

# 指定文件系统类型
sudo fsck -t ext4 /dev/sdb1
sudo fsck.ext4 /dev/sdb1    # 等效
$ which fsck
${OUT_FSCK}

1.3 超级块备份与恢复

ext4文件系统在创建时会在磁盘上保存多个超级块备份。如果主超级块损坏,可以用备份恢复。

# 查看备份超级块位置
sudo mke2fs -n /dev/sdb1    # 注意-n参数,不会真正格式化!

# 使用备份超级块恢复
sudo fsck -b 32768 /dev/sdb1     # 使用第一个备份超级块

# 如果还是不行,尝试其他备份
sudo fsck -b 98304 /dev/sdb1

二、文件系统调优

2.1 ext4调优 — tune2fs

# 查看ext4文件系统参数
sudo tune2fs -l /dev/sda1
${OUT_TUNE2FS}
# 调整保留块比例(默认5%,大磁盘可降低)
sudo tune2fs -m 1 /dev/sdb1    # 1%预留

# 设置文件系统标签
sudo tune2fs -L "data" /dev/sdb1

# 调整fsck检查间隔(0=禁用定期检查)
sudo tune2fs -i 0 /dev/sdb1    # 禁用基于时间的检查
sudo tune2fs -c 0 /dev/sdb1    # 禁用基于挂载次数的检查

# 启用日志(ext3/ext4)
sudo tune2fs -O has_journal /dev/sdb1

# 修改日志模式
sudo tune2fs -o journal_data_writeback /dev/sdb1

2.2 xfs调优

# 查看xfs文件系统信息
xfs_info /
${OUT_XFS_INFO}
# xfs修复
sudo xfs_repair /dev/sdb1      # 必须卸载后执行

# xfs元数据转储
sudo xfs_metadump /dev/sdb1 /tmp/xfs-meta.dump

# xfs冻结(用于快照一致性)
sudo xfs_freeze -f /mnt/data    # 冻结
sudo xfs_freeze -u /mnt/data    # 解冻

三、文件系统扩展

$ which resize2fs
${OUT_RESIZE}
# ext4在线扩展(无需卸载)
sudo resize2fs /dev/vg0/data     # 扩展到LV全部大小
sudo resize2fs /dev/vg0/data 50G # 扩展到指定大小

# xfs在线扩展(必须挂载状态)
sudo xfs_growfs /mnt/data        # 扩展到最大
sudo xfs_growfs -D 50G /mnt/data # 扩展到指定大小

四、磁盘配额(Quota)

4.1 配额类型

类型限制对象说明
用户配额单个用户限制用户的磁盘使用
组配额单个组限制组的磁盘使用
inode配额文件数量限制文件数量
block配额空间大小限制磁盘空间

4.2 配额设置流程

# 步骤1:在fstab中启用配额
# 添加usrquota,grpquota选项
/dev/vg0/data /mnt/data ext4 defaults,usrquota,grpquota 0 0

# 步骤2:重新挂载
sudo mount -o remount /mnt/data

# 步骤3:创建配额数据库文件
sudo quotacheck -cugm /mnt/data

# 步骤4:启用配额
sudo quotaon /mnt/data

# 步骤5:设置用户配额
sudo edquota -u username
# 在编辑器中设置soft/hard限制

# 查看配额
sudo repquota /mnt/data
sudo quota -u username

📋 soft vs hard限制

五、文件系统损坏与恢复

5.1 常见损坏场景

场景1:突然断电

有日志的文件系统(ext4/xfs)在重启后通过日志回放恢复一致性。无日志文件系统(ext2)需要完整fsck。

场景2:超级块损坏

# 症状:mount报"invalid super block"
# 恢复:使用备份超级块
sudo mke2fs -n /dev/sdb1        # 查看备份位置
sudo fsck -b 32768 /dev/sdb1    # 使用备份恢复

场景3:误删文件恢复

# ext4误删恢复(extundelete)
sudo apt install extundelete
sudo extundelete /dev/sdb1 --restore-file path/to/file
sudo extundelete /dev/sdb1 --restore-directory path/to/dir

# 通用恢复(testdisk/photorec)
sudo apt install testdisk
sudo photorec /dev/sdb1

5.2 /lost+found目录

$ ls -la /lost+found 2>/dev/null
${OUT_LOST}

每个ext文件系统根目录都有lost+found目录。fsck修复时发现的"孤儿"文件(有数据块但无目录项的文件)会放入此目录。

六、日志系统

6.1 ext4日志模式

模式安全性性能说明
journal最高最低数据和元数据都写入日志
ordered仅元数据写日志,数据先写(默认)
writeback最高仅元数据写日志,不保证数据先写

七、日常维护任务

# 1. 查看磁盘使用率
df -hT
${OUT_DF}
# 2. 查看inode使用率
df -i

# 3. 查看大目录
du -sh /var/log
${OUT_DU_VAR}
# 4. 查看日志磁盘占用
journalctl --disk-usage
${OUT_JOURNAL}
# 5. 清理旧日志
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=500M

# 6. 查找大文件
find / -type f -size +100M 2>/dev/null -exec ls -lh {} \;

# 7. 查找已删除但未释放空间的文件
sudo lsof +L1    # 找出已删除但进程仍打开的文件

八、故障排查

❌ 问题:磁盘空间满但du显示有剩余

原因:已删除文件被进程占用,空间未释放

# 查找已删除但仍占空间的文件
sudo lsof +L1 | grep deleted

# 重启占用进程释放空间
sudo systemctl restart nginx   # 示例

# 或使用truncate清空
sudo truncate -s 0 /proc/PID/fd/FD

❌ 问题:inode耗尽

症状:df -h显示有空间但无法创建文件,df -i显示100%

# 查看inode使用
df -i

# 找出大量小文件的目录
find / -xdev -type d -size +100k 2>/dev/null

# 清理(如session文件、临时文件)
find /var/lib/php/sessions -type f -mtime +7 -delete
find /tmp -type f -atime +7 -delete

九、练习

📝 练习1:文件系统健康检查

# 执行完整的文件系统健康检查
# 1. 查看所有文件系统类型和使用率
df -hT

# 2. 查看inode使用率
df -i

# 3. 检查已挂载文件系统是否有错误
dmesg | grep -i "ext4\|xfs\|error\|corrupt"

# 4. 查看文件系统参数
sudo tune2fs -l /dev/你的根分区 2>/dev/null | head -20

# 5. 检查日志大小
journalctl --disk-usage

📝 练习2:磁盘空间分析与清理

# 1. 找出最大的10个文件
find / -type f -exec du -h {} + 2>/dev/null | sort -rh | head -10

# 2. 清理APT缓存
sudo apt clean

# 3. 清理旧内核
sudo apt autoremove --purge

# 4. 清理journal日志
sudo journalctl --vacuum-time=3d
🏆

成就解锁:文件系统守护者

✅ 掌握fsck检查与修复

✅ 理解ext4/xfs调优参数

✅ 学会文件系统在线扩展

✅ 了解磁盘配额管理

✅ 掌握文件系统损坏恢复

🎉 阶段一(文件系统)完成!下一阶段:用户与进程

十、文件系统监控自动化

#!/bin/bash
# fs-monitor.sh - 文件系统监控脚本
# 检查磁盘空间、inode、文件系统错误

WARN_THRESHOLD=80
CRIT_THRESHOLD=95

echo "===== 文件系统健康报告 ====="
echo "日期: $(date)"
echo

# 磁盘空间检查
echo "--- 磁盘空间 ---"
df -h | awk -v warn=$WARN_THRESHOLD 'NR>1 {
    usage=$5; gsub(/%/,"",usage)
    if (usage+0 >= warn) print "⚠️  "$1" "$6" 已用"usage"%"
    else print "✅ "$1" "$6" 已用"usage"%"
}'
echo

# inode检查
echo "--- inode使用 ---"
df -i | awk -v warn=$WARN_THRESHOLD 'NR>1 {
    usage=$5; gsub(/%/,"",usage)
    if (usage+0 >= warn) print "⚠️  "$1" inode已用"usage"%"
}'
echo

# 只读文件系统检查
echo "--- 只读检查 ---"
mount | grep ' ro,' | while read line; do
    echo "❌ $line"
done
if [ -z "$(mount | grep ' ro,')" ]; then
    echo "✅ 无只读文件系统"
fi

# 大文件检查
echo "\n--- 超大文件(>100MB) ---"
find / -xdev -type f -size +100M 2>/dev/null | head -10

十一、NFS与网络文件系统

网络文件系统允许跨主机共享存储,企业环境中广泛使用。

协议特点适用场景
NFSv4有状态、防火墙友好Linux间共享
SMB/CIFSWindows兼容跨平台共享
iSCSI块级共享SAN存储
GlusterFS分布式、可扩展集群存储
CephFS分布式、对象/块/文件云存储
# NFS客户端挂载
sudo mount -t nfs4 server:/export/data /mnt/nfs

# NFS挂载选项
sudo mount -t nfs4 -o rw,hard,intr server:/export/data /mnt/nfs
# hard: 操作失败时重试(默认)
# soft: 操作失败时返回错误
# intr: 允许中断硬挂载的操作