冷重启后无法安装 BTRFS(total_rw_bytes 是原来的两倍)

冷重启后无法安装 BTRFS(total_rw_bytes 是原来的两倍)

我研究环境中的一位用户在安装了 52TB btrfs 分区的服务器上调用了内存不足。我不得不关闭服务器电源。重启后,我的 btrfs 分区无法以读写模式挂载。

挂载 /mnt/storage/
mount: /mnt/storage:错误的 fs 类型、错误的选项、/dev/mapper/fc_trunk-part3 上的错误超级块、缺少代码页或辅助程序,或者其他错误。

内核日志显示设备大小存在问题:

3 月 19 日 15:10:52 mamut 内核:BTRFS 错误(设备 dm-5):open_ctree 失败
3 月 19 日 15:10:52 mamut 内核:BTRFS 信息(设备 dm-5):使用 lzo 压缩,级别 0
3 月 19 日 15:10:52 mamut 内核:BTRFS 信息(设备 dm-5):磁盘空间缓存已启用
3 月 19 日 15:10:52 mamut 内核:BTRFS 信息(设备 dm-5):有细小范围
3 月 19 日 15:10:52 mamut systemd[1]: mnt-storage.mount: 挂载进程已退出,代码=killed,状态=15/TERM
3 月 19 日 15:10:52 mamut systemd[1]: mnt-storage.mount: 失败,结果为“超时”。
3 月 19 日 15:10:52 mamut systemd[1]: 无法挂载 /mnt/storage。
3 月 19 日 15:10:52 mamut 内核:BTRFS 错误(设备 dm-5):super_total_bytes 52798547820544 与 fs_devices total_rw_bytes 105597095641088 不匹配
3 月 19 日 15:10:52 mamut 内核:BTRFS 错误(设备 dm-5):无法读取区块树:-22
3 月 19 日 15:10:52 mamut 内核:BTRFS 错误(设备 dm-5):open_ctree 失败
[...]
3 月 19 日 15:15:52 mamut systemd-helper[9798]: IO 错误(子卷不是 btrfs 子卷)。
3 月 19 日 15:15:52 mamut systemd-helper[9798]: '存储' 号码清理失败。
3 月 19 日 15:15:52 mamut systemd-helper[9798]: 正在运行“存储”的时间线清理。
3 月 19 日 15:15:52 mamut systemd-helper[9798]: IO 错误(子卷不是 btrfs 子卷)。
3 月 19 日 15:15:52 mamut systemd-helper[9798]: '存储' 时间线清理失败。
3 月 19 日 15:15:52 mamut systemd-helper[9798]: 正在运行“存储”的空前后清理。
3 月 19 日 15:15:52 mamut systemd-helper[9798]: IO 错误(子卷不是 btrfs 子卷)。
3 月 19 日 15:15:52 mamut systemd-helper[9798]: 存储的空-前后清理失败。
3 月 19 日 15:15:52 mamut systemd[1]: snapper-cleanup.service: 主进程已退出,代码=已退出,状态=1/失败
3 月 19 日 15:15:52 mamut systemd[1]: snapper-cleanup.service: 失败,结果为“退出代码”。

super_total_bytes=52798547820544 是 fdisk 报告的分区的正确大小(以字节为单位)。fs_devices total_rw_bytes=105597095641088 正好是该大小的两倍。

我尝试运行 btrfs check 但出现此错误:

btrfs 检查 /dev/mapper/fc_trunk-part3
打开文件系统进行检查...
检查 /dev/mapper/fc_trunk-part3 上的文件系统
UUID:40a2e65b-f34a-4d33-946d-055d93fe7ffa
[1/7] 检查根项目
错误:无法修复根项目:输入/输出错误

现在,我知道了btrfs rescue fix-device-size,但我以前从未运行过它。手册页说:

固定设备尺寸
           修复设备大小和超级块总字节值
           不匹配

           内核 4.11 开始更严格地检查设备大小,并且
           这可能与存储的总字节数值不匹配。请参阅
           确切的错误信息如下。较新的内核将拒绝挂载
           文件系统中的值不匹配。此错误并不严重
           并且可以修复。此命令将修复设备尺寸值,如果
           可能的。

               BTRFS 错误(设备 sdb):super_total_bytes 92017859088384 与 fs_devices total_rw_bytes 92017859094528 不匹配

           不匹配也可能表现为内核警告:

               警告:CPU:3 PID:439 位于 fs/btrfs/ctree.h:1559 btrfs_update_device+0x1c5/0x1d0 [btrfs]

重启后内核版本确实发生了变化,但两个版本都 > 4.11,并且之前我安装此分区时没有任何问题。

分区:

  • 很大,需要花费大量时间进行备份,而且我没有那么多空间
  • 对我的研究有重要意义的数据
  • 有快照
  • 可以使用 -o rescue,ro 安装它

打电话安全吗 btrfs rescue fix-device-size

我可以用其他安全的方法修复它吗?

答案1

“拨打 安全吗btrfs rescue fix-device-size?”

它可能是安全的,而且这很可能是解决方案。它“不应该”占用你的整个卷和几只猫。如果这个 BTRFS 文件系统有多个磁盘(例如,在 BTRFS RAID 中),我突然对这个断言不那么有信心了。

如果您在 BTRFS 下有基于块的快照机制(看起来您可能有 - 那是 LVM 卷支持它吗?),那么在执行此操作之前先拍摄快照。您可能需要向该卷组添加更多物理卷以容纳快照本身,具体取决于此卷组(如果是的话)的分配方式。LVM 快照的大小会随着数据的修改而增大,与修改的数据量成比例。LVM 快照在活动时也会导致 2 倍的写入性能下降,因此完成后不要保留它。这只是为了在情况变得非常糟糕时可以回滚。

如果它是真的重要数据,在执行任何操作之前,请先将基于块的备份复制到另一个完全不相关的卷 - 特别是如果您不熟悉 LVM 快照,或者这不是在 LVM 上。dd是一个很好的命令。

dd if=/dev/disk/with-btrfs of=/large/enough/volume/backup.img bs=4M

答案2

我遇到了类似的问题,即 super_total_bytes 和 fs_devices total_rw_bytes 的大小不匹配,并且 md 设备上有一个较大的 btrfs 卷。尝试在启动时挂载时,我收到了消息BTRFS error super_total_bytes XXX mismatch with fs_devices total_rw_bytes XXXXXX以下是描述运行 btrfs 扫描设备的问题和修复方法的网站链接

就我而言,我很幸运,它在第一次启动时会失败,但如果我手动运行 mount 命令,它就会成功挂载。我猜想在 mdadm 重新组装 /dev/md127 设备和 kernel/systemd 识别到有 btrfs 卷需要挂载之间会存在竞争条件。内核看到有两个驱动器属于该卷,因为 /dev/md127 和 /dev/sdb 都具有相同的 UUID,因为 /dev/sdb 是 /dev/md127 的主要组件,包含 btrfs 卷的开头。

我通过创建一个新的 systemd 单元btrfs-scan-device.service(它只运行)解决了这个问题btrfs scan device,并使其成为/etc/fstabmd 设备的挂载选项中的依赖项。这会探测 /dev 下的 btrfs 卷设备。

/etc/systemd/system/btrfs-device-scan.service:

[Unit]
Description=run btrfs device scan before mounting so that mdadm devices are not misdetetected
Requires=local-fs.target
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/btrfs device scan
StandardOutput=journal

[Install]
WantedBy=multi-user.target

/etc/fstab 条目:

/dev/md127  /md127  btrfs  noatime,nofail,x-systemd.mount-timeout=1000,x-systemd.requires=btrfs-device-scan.service,x-systemd.after=btrfs-device-scan.service       0       0

然后systemctl daemon-reload重新systemctl enable btrfs-device-scan启动。

经过这些更改,我不再遇到大小不匹配错误。我没有遇到您看到的 IO 错误。

相关内容