只需重新启动

只需重新启动

我有一个使用 BTRFS 格式化的外部驱动器,但似乎拒绝安装:

$ sudo mount -vs -t btrfs  -o ro,recovery,errors=continue /dev/sdb2 /media/user/dir
mount: /dev/sdb2: can't read superblock

然而,当 BTRFS 认为所有超级块都没有问题时:

$ sudo btrfs rescue super-recover -v /dev/sdb2                 
All Devices:
        Device: id = 1, name = /dev/sdb2

Before Recovering:
        [All good supers]:
                device name = /dev/sdb2
                superblock bytenr = 65536

                device name = /dev/sdb2
                superblock bytenr = 67108864

                device name = /dev/sdb2
                superblock bytenr = 274877906944

        [All bad supers]:

All supers are valid, no need to recover

如果我尝试指定sb=$((67108864/4))mount使用 1k 单位,因此您必须在具有 4k 块的系统上除以 4)以使用替代超级块之一,我会得到相同的错误。btrfs restore从驱动器读取数据似乎也没有问题,并且btrfs check只抱怨无效的缓存条目(并且clear_cache在安装时没有帮助)。这种情况以前在另一个驱动器上发生过一次,但btrfs check --repair也不起作用。[1]由于该驱动器上有大量数据,我有点不愿意将所有内容复制到其他地方btrfs restore(这也意味着在其他地方寻找空间),重新格式化,然后将所有内容复制回来。

有办法解决这个问题吗?有没有办法btrfs直接调用,以便它执行挂载而不是依赖mount?我找不到一个mount.btrfs.

[1] 我有点不愿意使用,btrfs check --repair因为它带有很多关于作为最后手段的警告,特别是在它之前不起作用之后。

答案1

我将 Btrfs 作为 rootfs,并在系统冻结后在 Ubuntu 18.04 上遇到了类似的问题。 Btrfs 在下次启动时无法安装。我使用 Ubuntu LiveUSB 启动并btrfs rescue zero-log解决了这个问题。

细节:

$ sudo mount -o ro /dev/nvme0n1p2 /2
mount: /2: can't read superblock on /dev/nvme0n1p2.

(首先,我使用 dd 将分区备份到外部存储设备。)

btrfs check --check-data-csum表明一切都很好。btrfs inspect-internal dump-super说超级块没问题,并btrfs rescue super-recover表示没有什么需要修复的。

但我在尝试挂​​载后注意到以下内核消息

BTRFS info (device nvme0n1p2): start tree-log replay
BTRFS critical (device nvme0n1p2): corrupt leaf: root=18446744073709551610 block=1252150951936 slot=129 ino=7029 file_offset=164888576, file extent end range (169345024) goes beyond start offset (168624128) of the next file extent
BTRFS error (device nvme0n1p2): block=1252150951936 read time tree block corruption detected
BTRFS: error (device nvme0n1p2) in btrfs_replay_log:2281: errno=-5 IO failure (Failed to recover log tree)
BTRFS info (device nvme0n1p2): delayed_refs has NO entry
BTRFS error (device nvme0n1p2): open_ctree failed

树日志似乎已损坏。我发现btrfs rescue --help

btrfs rescue zero-log <device>
    Clear the tree log. Usable if it's corrupted and prevents mount.

btrfs rescue zero-log解决了这个问题。

$ sudo btrfs rescue zero-log /dev/nvme0n1p2
Clearing log on /dev/nvme0n1p2, previous log_root 1252152229888, level 0

答案2

只需重新启动

看起来 Btrfs 在更改块设备文件名(如 /dev/sda)方面存在问题。我也遇到过同样的问题:

创建了一个 Btrfs 文件系统,写入了一些数据,卸载了,从我的系统中删除了磁盘(它是一个 2.5 英寸 SATA 驱动器)。一周后,我用热插拔重新连接了驱动器,但无法安装它。.Can't read superblockbtrfs rescue super-recover一切都很好。我什至已经完成了btrfs check,它也证实了一切都很好。

我正在运行较旧的内核:4.15- 我认为这已经在新版本的 Btrfs(新内核)中得到解决,但对于旧版本 - 只需重新启动即可。

系统将枚举驱动器,并且您的 Btrfs 文件系统挂载应该不会出现问题。

如果不起作用 - 尝试升级内核。

相关内容