# 文件系统检查与修复

URL: https://caijiao.org/rockylinux/filesystem-check
Source: docs/rockylinux/filesystem-check.md
Description: 详细介绍 Rocky Linux 中文件系统检查与修复的方法，包括 fsck、xfs_repair 等工具的使用

在 Linux 系统中，文件系统可能会因为意外断电、硬件故障或软件错误而损坏。定期检查和修复文件系统对于确保数据完整性和系统稳定性至关重要。本教程将详细介绍 Rocky Linux 中用于文件系统检查和修复的工具和方法。

## 文件系统检查基础

### 为什么需要检查文件系统？

文件系统检查是维护 Linux 系统健康的重要步骤，原因包括：

- 检测并修复因系统崩溃、断电或硬件问题导致的文件系统不一致
- 识别损坏的文件和目录结构
- 恢复丢失的 inode 或块
- 确保文件系统的完整性和可靠性
- 预防数据丢失和系统问题

### 何时进行文件系统检查？

建议在以下情况进行文件系统检查：

- 系统意外崩溃或断电后
- 磁盘空间使用异常
- 系统启动时出现文件系统错误
- 定期维护计划（如每月或每季度）
- 发现文件损坏或无法访问的情况
- 更换或升级存储设备前

### 文件系统类型与检查工具

不同的文件系统类型使用不同的检查工具：

| 文件系统类型   | 检查工具                      | 描述                         |
| -------------- | ----------------------------- | ---------------------------- |
| ext2/ext3/ext4 | fsck.ext2/fsck.ext3/fsck.ext4 | 检查和修复 ext 系列文件系统  |
| XFS            | xfs_repair                    | 检查和修复 XFS 文件系统      |
| Btrfs          | btrfs check                   | 检查和修复 Btrfs 文件系统    |
| FAT/NTFS       | fsck.vfat/ntfsfix             | 检查和修复 FAT/NTFS 文件系统 |

在 Rocky Linux 中，默认的文件系统是 XFS。

## 使用 fsck 工具

### fsck 简介

`fsck`（file system check）是一个通用命令，用于检查和修复 Linux 文件系统。它实际上是多个特定文件系统检查工具的前端。

### 基本语法

```bash
fsck [选项] [文件系统]
```

常用选项：

- `-a`：自动修复文件系统，不询问用户
- `-r`：交互式修复，询问是否修复每个问题
- `-y`：对所有修复问题自动回答 yes
- `-f`：强制检查，即使文件系统标记为 clean
- `-n`：仅检查，不进行修复

### 查看挂载的文件系统

在进行文件系统检查前，必须确保文件系统未被挂载（除了只读挂载）。首先查看当前挂载的文件系统：

```bash
# 查看已挂载的文件系统
mount

# 或使用 df 命令
df -h
```

### 检查未挂载的文件系统

```bash
# 检查特定分区（确保未挂载）
sudo umount /dev/sda1  # 首先卸载

# 检查并交互式修复
sudo fsck /dev/sda1

# 自动修复不询问
sudo fsck -a /dev/sda1

# 强制检查并自动修复
sudo fsck -f -y /dev/sda1
```

### 指定文件系统类型检查

```bash
# 检查 ext4 文件系统
sudo fsck.ext4 /dev/sda1

# 检查 FAT 文件系统
sudo fsck.vfat /dev/sdb1
```

### 系统启动时的文件系统检查

Linux 系统会在特定条件下自动进行文件系统检查：

1. 根据 `/etc/fstab` 中的 fs_passno 值
2. 如果文件系统被标记为不干净（非正常卸载）
3. 根据挂载次数或时间间隔

修改检查频率：

```bash
# 修改 ext 文件系统的检查参数
tune2fs -c 30 -i 180d /dev/sda1
# -c 30: 每挂载 30 次检查一次
# -i 180d: 每 180 天检查一次
```

## 使用 xfs_repair 工具

### xfs_repair 简介

`xfs_repair` 是专门用于检查和修复 XFS 文件系统的工具。由于 XFS 是 Rocky Linux 的默认文件系统，掌握此工具非常重要。

### 基本语法

```bash
xfs_repair [选项] 设备
```

常用选项：

- `-n`：仅检查，不修复
- `-f`：指定设备为文件（如磁盘镜像）
- `-L`：清空日志（危险操作，可能导致数据丢失）
- `-m`：指定内存使用限制
- `-P`：修复时并行化操作

### 检查 XFS 文件系统

```bash
# 首先卸载文件系统
sudo umount /dev/sda1

# 仅检查，不修复
sudo xfs_repair -n /dev/sda1

# 修复文件系统
sudo xfs_repair /dev/sda1
```

### 修复无法卸载的 XFS 文件系统

对于根文件系统等无法卸载的文件系统，可以使用以下方法：

1. **从救援模式启动**：

   - 使用 Rocky Linux 安装媒体启动
   - 选择 "Troubleshooting" > "Rescue a Rocky Linux System"
   - 在救援模式下运行 xfs_repair

2. **使用 Live CD**：

   - 使用 Live CD 启动系统
   - 运行 xfs_repair 检查和修复目标文件系统

3. **强制修复**（谨慎使用）：

```bash
# 危险操作！可能导致数据丢失
sudo xfs_repair -L /dev/sda1
```

## 修复常见文件系统问题

### 修复 ext 系列文件系统

#### 修复超级块损坏

```bash
# 查看备用超级块位置
sudo dumpe2fs /dev/sda1 | grep superblock

# 使用备用超级块修复
sudo fsck.ext4 -b 32768 /dev/sda1
```

#### 修复 inode 问题

```bash
# 扫描并修复 inode 问题
sudo fsck.ext4 -f -y -c -c /dev/sda1
# -c -c: 进行坏块扫描
```

### 修复 XFS 文件系统特殊问题

#### 修复日志损坏

```bash
# 尝试修复日志
sudo xfs_repair /dev/sda1

# 如果失败，清空日志（危险）
sudo xfs_repair -L /dev/sda1
```

#### 恢复丢失的 XFS 分区

如果分区表损坏，可以尝试使用 testdisk 工具恢复：

```bash
# 安装 testdisk
sudo dnf install testdisk -y

# 运行 testdisk
sudo testdisk
```

按照交互式界面的提示操作，扫描和恢复丢失的分区。

### 修复 Btrfs 文件系统

```bash
# 安装 btrfs-progs
sudo dnf install btrfs-progs -y

# 检查 Btrfs 文件系统
sudo btrfs check /dev/sda1

# 修复 Btrfs 文件系统
sudo btrfs check --repair /dev/sda1
```

## 文件系统维护计划

### 定期检查计划

为确保系统健康，建议制定定期文件系统检查计划：

1. **建立检查频率**：

   - 关键生产系统：每月一次
   - 普通服务器：每季度一次
   - 个人工作站：每半年一次

2. **检查前的准备工作**：

   - 备份重要数据
   - 安排在低负载时段
   - 通知相关用户系统将不可用
   - 准备回滚计划

3. **执行检查**：

   - 卸载文件系统（或使用只读模式）
   - 运行适当的检查工具
   - 记录检查结果

4. **检查后的验证**：
   - 验证文件系统是否正常挂载
   - 检查关键数据的完整性
   - 监控系统性能

### 自动化检查脚本

以下是一个简单的文件系统检查脚本示例：

```bash
#!/bin/bash
# 文件系统检查脚本

LOG_FILE="/var/log/fscheck_$(date +%Y%m%d).log"
FILESYSTEMS=("/dev/sda1" "/dev/sda2")

# 记录日志
echo "开始文件系统检查：$(date)" > $LOG_FILE

for fs in "${FILESYSTEMS[@]}"; do
    echo "检查文件系统: $fs" >> $LOG_FILE

    # 检查文件系统类型
    fs_type=$(blkid -o value -s TYPE $fs)
    echo "文件系统类型: $fs_type" >> $LOG_FILE

    # 根据类型执行检查
    if [ "$fs_type" == "xfs" ]; then
        echo "执行 xfs_repair -n $fs" >> $LOG_FILE
        xfs_repair -n $fs >> $LOG_FILE 2>&1
    else
        echo "执行 fsck -n $fs" >> $LOG_FILE
        fsck -n $fs >> $LOG_FILE 2>&1
    fi
done

echo "文件系统检查完成：$(date)" >> $LOG_FILE
```

将此脚本保存为 `/usr/local/bin/fscheck.sh`，然后添加到 cron 任务中定期执行。

## 文件系统数据恢复

### 使用 extundelete 恢复 ext 文件系统数据

```bash
# 安装 extundelete
sudo dnf install extundelete -y

# 恢复特定文件
sudo extundelete /dev/sda1 --restore-file /home/user/important.txt

# 恢复整个目录
sudo extundelete /dev/sda1 --restore-directory /home/user/documents

# 恢复所有文件
sudo extundelete /dev/sda1 --restore-all
```

### 使用 xfsdump/xfsrestore 备份和恢复 XFS

```bash
# 安装 xfsdump
sudo dnf install xfsdump -y

# 备份 XFS 文件系统
sudo xfsdump -f /backup/root_fs.dump /dev/sda1

# 恢复 XFS 文件系统
sudo xfsrestore -f /backup/root_fs.dump /mnt/recovery
```

### 使用 TestDisk 和 PhotoRec 恢复数据

```bash
# 安装 TestDisk 和 PhotoRec
sudo dnf install testdisk -y

# 运行 TestDisk（分区恢复）
sudo testdisk

# 运行 PhotoRec（文件恢复）
sudo photorec
```

## 预防文件系统损坏

### 最佳实践

1. **正确关机**：始终使用 `shutdown` 或 `poweroff` 命令关闭系统

2. **使用 UPS**：不间断电源可以防止意外断电导致的文件系统损坏

3. **定期备份**：无论采取何种预防措施，定期备份数据仍然是最重要的

4. **监控磁盘健康**：使用 SMART 工具监控硬盘健康状态

```bash
# 安装 smartmontools
sudo dnf install smartmontools -y

# 检查磁盘健康状态
sudo smartctl -a /dev/sda
```

5. **定期碎片整理**：虽然现代文件系统（如 XFS）不需要频繁碎片整理，但对于特定工作负载仍有帮助

6. **使用日志文件系统**：选择支持日志的文件系统（如 XFS、ext4），它们在崩溃后更容易恢复

### 监控文件系统状态

```bash
# 检查磁盘使用率
df -h

# 检查 inode 使用情况
df -i

# 监控文件系统 I/O
iostat -xz 1

# 查看文件系统错误
dmesg | grep -i error
```

## 高级文件系统修复技术

### 使用 Live CD 修复系统

当系统无法启动时，可以使用 Live CD 进行修复：

1. **从 Live CD 启动**：

   - 使用 Rocky Linux 安装媒体或 Live CD 启动
   - 选择 "Try Rocky Linux"

2. **挂载分区**：

```bash
# 创建挂载点
sudo mkdir /mnt/rescue

# 挂载根分区
sudo mount /dev/sda1 /mnt/rescue

# 如果使用 LVM
sudo vgchange -a y
sudo mount /dev/mapper/vg-root /mnt/rescue
```

3. **检查并修复**：

```bash
# 卸载分区进行检查
sudo umount /mnt/rescue

# 检查文件系统
sudo xfs_repair /dev/sda1  # 对于 XFS
sudo fsck.ext4 /dev/sda1  # 对于 ext4
```

### 修复根文件系统

修复根文件系统需要在系统不运行时进行，可以通过以下方法：

1. **单用户模式**：

```bash
# 启动时按住 Shift 进入 GRUB 菜单
# 选择要启动的内核，按 e 编辑
# 在 linux/linux16 行末尾添加 init=/bin/bash
# 按 Ctrl+X 启动

# 以只读方式挂载根文件系统
mount -o remount,rw /

# 检查并修复其他分区
fsck /dev/sda2
```

2. **救援模式**：使用 Rocky Linux 安装媒体的救援模式

## 常见问题与解决方案

### 无法卸载文件系统

**问题**：尝试卸载文件系统时出现 "device is busy" 错误

**解决方案**：

```bash
# 找出使用该文件系统的进程
fuser -m /dev/sda1
lsof +D /mount/point

# 终止占用进程
kill -9 PID

# 或使用懒惰卸载
sudo umount -l /mount/point
```

### 文件系统检查卡在特定步骤

**问题**：fsck 或 xfs_repair 检查过程卡住

**解决方案**：

- 耐心等待，大型文件系统检查可能需要很长时间
- 检查系统资源（CPU、内存、I/O）
- 如果确定卡住，可以安全中断并尝试使用其他选项
- 对于 XFS，可以尝试 `-L` 选项（谨慎使用）

### 超级块损坏

**问题**：无法挂载文件系统，提示超级块损坏

**解决方案**：

```bash
# 对于 ext 文件系统
sudo dumpe2fs /dev/sda1 | grep superblock
sudo fsck.ext4 -b 32768 /dev/sda1

# 对于 XFS
sudo xfs_repair /dev/sda1
# 如果失败，尝试
sudo xfs_repair -L /dev/sda1
```

### 系统无法启动，提示文件系统错误

**解决方案**：

1. 使用救援模式启动
2. 检查并修复根文件系统
3. 检查 /etc/fstab 中的挂载配置
4. 修复 GRUB 引导加载程序（如果需要）

## 总结

文件系统检查和修复是维护 Rocky Linux 系统健康的关键任务。本教程详细介绍了使用 fsck 和 xfs_repair 等工具检查和修复不同类型的文件系统，以及如何处理常见的文件系统问题。

定期检查文件系统、正确关机、使用 UPS 和实施良好的备份策略，可以有效预防文件系统损坏。当文件系统确实出现问题时，及时使用适当的工具进行检查和修复，可以最大限度地减少数据丢失和系统停机时间。

记住，在进行任何文件系统修复操作前，始终备份重要数据。对于关键系统，建议在维护窗口内执行文件系统检查，并准备详细的恢复计划，以应对可能出现的问题。
