我有一个使用 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 superblock
说btrfs rescue super-recover
一切都很好。我什至已经完成了btrfs check
,它也证实了一切都很好。
我正在运行较旧的内核:4.15- 我认为这已经在新版本的 Btrfs(新内核)中得到解决,但对于旧版本 - 只需重新启动即可。
系统将枚举驱动器,并且您的 Btrfs 文件系统挂载应该不会出现问题。
如果不起作用 - 尝试升级内核。