e2fsck 命令用于检查并修复 ext2、ext3、ext4 文件系统的错误。它是文件系统维护的重要工具,可以在文件系统出现问题时进行修复,恢复数据完整性。
e2fsck 是 fsck 命令的扩展版本,专门用于 ext 系列文件系统。当系统异常关机、磁盘出现坏道或文件系统损坏时,通常需要使用 e2fsck 进行修复。
必须在文件系统未挂载时运行 e2fsck! 如果在已挂载的文件系统上运行,可能导致数据损坏。如果必须检查根文件系统,请使用 Live CD 或在单用户模式下操作。
e2fsck [选项] 设备
e2fsck [选项] -b 超级块 设备
设备可以是磁盘分区(如 /dev/sda1)或文件系统镜像文件。
| 选项 | 说明 |
|---|---|
| -p | 自动修复(不询问),修复所有可安全修复的错误 |
| -n | 只检查不修复,以只读方式打开文件系统 |
| -y | 对所有问题回答"yes",自动修复所有错误 |
| -c | 使用badblocks检查设备上的坏道 |
| -f | 强制检查,即使文件系统看起来是干净的 |
| -v | 详细输出,显示检查的详细信息 |
| -b 超级块 | 使用指定的备用超级块 |
| -B 大小 | 指定块大小(字节) |
| -j 日志文件 | 指定外部日志文件位置 |
| -L 文件 | 将坏道列表添加到指定文件 |
| -C fd | 将进度信息输出到指定文件描述符 |
| -D | 优化目录结构 |
| -h | 显示帮助信息 |
# 卸载分区
sudo umount /dev/sda1
# 运行e2fsck检查
sudo e2fsck /dev/sda1
e2fsck 1.46.5 (30-Dec-2021)
/dev/sda1: clean, 12345/6553600 files, 987654/26214400 blocks
# 自动修复所有可安全修复的错误
sudo umount /dev/sda1
sudo e2fsck -p /dev/sda1
# 强制自动修复所有错误
sudo e2fsck -y /dev/sda1
# 以只读方式检查文件系统
sudo umount /dev/sda1
sudo e2fsck -n /dev/sda1
# 详细输出
sudo e2fsck -nv /dev/sda1
# 检查坏道并标记
sudo umount /dev/sda1
sudo e2fsck -c /dev/sda1
# 使用指定的坏道列表文件
sudo e2fsck -l badblocks.txt /dev/sda1
# 生成坏道列表
sudo e2fsck -l badblocks.txt -L /tmp/new_badblocks.txt /dev/sda1
# 当主超级块损坏时,使用备用超级块
# 首先查找备用超级块位置
sudo mke2fs -n /dev/sda1
# 输出会显示备用超级块位置,例如:32768, 98304, 163840, ...
# 使用第一个备用超级块修复
sudo umount /dev/sda1
sudo e2fsck -b 32768 /dev/sda1
# 即使文件系统标记为干净也强制检查
sudo umount /dev/sda1
sudo e2fsck -f /dev/sda1
# 强制检查并自动修复
sudo e2fsck -fy /dev/sda1
# 强制检查并显示详细信息
sudo e2fsck -fv /dev/sda1
# 方法1:在单用户模式下检查
# 重启系统,在GRUB菜单中选择恢复模式或单用户模式
# 然后运行:
fsck -fy /
# 方法2:使用Live CD/USB启动
# 启动到Live环境,然后:
sudo e2fsck /dev/sda1 # sda1是根分区
# 方法3:在启动时强制检查
# 编辑/etc/fstab,在根分区选项中添加fsck标志
# /dev/sda1 / ext4 defaults,noatime 0 1
# 修改为:
# /dev/sda1 / ext4 defaults,noatime 0 2
#!/bin/bash
# 文件系统检查和维护脚本
DISK="/dev/sda"
PARTITIONS=("${DISK}1" "${DISK}2" "${DISK}3")
LOG_FILE="/var/log/fs_check_$(date +%Y%m%d).log"
ERROR_LOG="/var/log/fs_errors_$(date +%Y%m%d).log"
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
check_partition() {
local partition=$1
log_message "检查分区: $partition"
# 检查分区是否已挂载
if mount | grep -q "^$partition"; then
log_message "警告: $partition 已挂载,跳过检查"
return 1
fi
# 检查文件系统类型
local fstype=$(sudo blkid -s TYPE -o value "$partition" 2>/dev/null)
if [[ "$fstype" != "ext2" && "$fstype" != "ext3" && "$fstype" != "ext4" ]]; then
log_message "跳过非ext文件系统: $partition (类型: $fstype)"
return 1
fi
# 运行e2fsck
log_message "开始e2fsck检查..."
sudo e2fsck -pv "$partition" 2>&1 | tee -a "$LOG_FILE"
local result=$?
case $result in
0)
log_message "$partition: 文件系统正常"
;;
1)
log_message "$partition: 文件系统错误已修复"
;;
2|3)
log_message "$partition: 需要系统重启以完成修复"
echo "$partition: 需要重启" >> "$ERROR_LOG"
;;
4|8)
log_message "$partition: 操作错误"
echo "$partition: 操作错误" >> "$ERROR_LOG"
return 1
;;
*)
log_message "$partition: 未知错误 (退出码: $result)"
echo "$partition: 未知错误 $result" >> "$ERROR_LOG"
return 1
;;
esac
return 0
}
# 主程序
main() {
log_message "开始文件系统检查"
# 备份重要数据(可选)
# log_message "备份重要数据..."
# sudo tar -czf /backup/etc_backup_$(date +%Y%m%d).tar.gz /etc
# 检查每个分区
for partition in "${PARTITIONS[@]}"; do
if [ -b "$partition" ]; then
check_partition "$partition"
else
log_message "分区不存在: $partition"
fi
done
log_message "文件系统检查完成"
# 如果有错误,显示错误信息
if [ -f "$ERROR_LOG" ] && [ -s "$ERROR_LOG" ]; then
echo "发现以下问题需要处理:" | tee -a "$LOG_FILE"
cat "$ERROR_LOG" | tee -a "$LOG_FILE"
fi
echo "检查日志: $LOG_FILE"
if [ -f "$ERROR_LOG" ]; then
echo "错误日志: $ERROR_LOG"
fi
}
main "$@"
| 退出码 | 说明 | 建议操作 |
|---|---|---|
| 0 | 没有错误,文件系统正常 | 无需操作 |
| 1 | 发现并修复了文件系统错误 | 文件系统已修复,可以正常使用 |
| 2 | 文件系统错误需要系统重启才能修复 | 重启系统以完成修复 |
| 4 | 文件系统错误未修复 | 需要手动干预或使用备用超级块 |
| 8 | 操作错误 | 检查命令参数和磁盘状态 |
| 16 | 使用或语法错误 | 检查命令语法 |
| 32 | e2fsck被用户取消 | 操作被中断,需要重新运行 |
| 128 | 共享库错误 | 检查系统库文件 |
错误信息:e2fsck: Cannot continue, aborting.
原因:尝试在已挂载的文件系统上运行 e2fsck。
解决方案:
sudo umount /dev/sda1
sudo e2fsck -n /dev/sda1
错误信息:Bad magic number in super-block while trying to open /dev/sda1
原因:文件系统超级块损坏。
解决方案:使用备用超级块恢复:
# 对于未格式化的分区
sudo mke2fs -n /dev/sda1
# 对于已格式化的分区,尝试:
sudo dumpe2fs /dev/sda1 | grep -i superblock
# 使用第一个备用超级块
sudo e2fsck -b 32768 /dev/sda1
# 如果不行,尝试其他备用超级块
sudo e2fsck -b 98304 /dev/sda1
sudo e2fsck -b 163840 /dev/sda1
现象:e2fsck报告发现孤儿inode(orphaned inode)。
原因:文件系统损坏导致某些inode没有对应的目录条目。
解决方案:
sudo e2fsck -y /dev/sda1
lost+found目录lost+found目录:
# 挂载分区
sudo mount /dev/sda1 /mnt
# 检查lost+found目录
sudo ls -la /mnt/lost+found/
# 尝试识别恢复的文件
sudo file /mnt/lost+found/*
# 根据需要移动文件到合适位置
# sudo mv /mnt/lost+found/#12345 /mnt/recovered_files/
-p自动修复-y选项时,e2fsck会自动修复所有错误,包括可能的数据丢失