我研究环境中的一位用户在安装了 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/fstab
md 设备的挂载选项中的依赖项。这会探测 /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 错误。