fsck (File System Consistency Check) 检查并修复文件系统不一致。它检查以下内容:
# 检查文件系统(交互式,逐个确认修复)
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}
ext4文件系统在创建时会在磁盘上保存多个超级块备份。如果主超级块损坏,可以用备份恢复。
# 查看备份超级块位置
sudo mke2fs -n /dev/sdb1 # 注意-n参数,不会真正格式化!
# 使用备份超级块恢复
sudo fsck -b 32768 /dev/sdb1 # 使用第一个备份超级块
# 如果还是不行,尝试其他备份
sudo fsck -b 98304 /dev/sdb1
# 查看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
# 查看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 # 扩展到指定大小
| 类型 | 限制对象 | 说明 |
|---|---|---|
| 用户配额 | 单个用户 | 限制用户的磁盘使用 |
| 组配额 | 单个组 | 限制组的磁盘使用 |
| inode配额 | 文件数量 | 限制文件数量 |
| block配额 | 空间大小 | 限制磁盘空间 |
# 步骤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
sudo edquota -t有日志的文件系统(ext4/xfs)在重启后通过日志回放恢复一致性。无日志文件系统(ext2)需要完整fsck。
# 症状:mount报"invalid super block"
# 恢复:使用备份超级块
sudo mke2fs -n /dev/sdb1 # 查看备份位置
sudo fsck -b 32768 /dev/sdb1 # 使用备份恢复
# 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
$ ls -la /lost+found 2>/dev/null
${OUT_LOST}
每个ext文件系统根目录都有lost+found目录。fsck修复时发现的"孤儿"文件(有数据块但无目录项的文件)会放入此目录。
| 模式 | 安全性 | 性能 | 说明 |
|---|---|---|---|
| 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 # 找出已删除但进程仍打开的文件
原因:已删除文件被进程占用,空间未释放
# 查找已删除但仍占空间的文件
sudo lsof +L1 | grep deleted
# 重启占用进程释放空间
sudo systemctl restart nginx # 示例
# 或使用truncate清空
sudo truncate -s 0 /proc/PID/fd/FD
症状: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. 查看所有文件系统类型和使用率
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
# 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
网络文件系统允许跨主机共享存储,企业环境中广泛使用。
| 协议 | 特点 | 适用场景 |
|---|---|---|
| NFSv4 | 有状态、防火墙友好 | Linux间共享 |
| SMB/CIFS | Windows兼容 | 跨平台共享 |
| 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: 允许中断硬挂载的操作