我有一台 Raspberry Pi 2B,上面连接了 4 个新购买的 256GB USB 闪存驱动器。我将这 4 个驱动器设置为 RAID10(数据和元数据)btrfs 卷。我一直试图通过 rsync 将一个非常大(~35GB)的文件从另一台计算机复制到此卷。我第一次这样做时,花了 2 个小时进行复制,rsync 进度信息显示 100%,但随后由于“只读文件系统”而失败。
经过一番搜索,发现 dmesg 给出错误,称该卷被强制为只读,原因是errno -5
:
[58463.350227] BTRFS: error (device sdd) in btrfs_commit_transaction:2071: errno=-5 IO failure (Error while writing out transaction)
[58463.352106] BTRFS info (device sdd): forced readonly
[58463.352120] BTRFS warning (device sdd): Skipping commit of aborted transaction.
所以我想知道这是否是一次性的事情:
# btrfs device stats /dev/sda
[/dev/sda].write_io_errs 3339
[/dev/sda].read_io_errs 0
[/dev/sda].flush_io_errs 0
[/dev/sda].corruption_errs 0
[/dev/sda].generation_errs 0
# btrfs device stats /dev/sdb
[/dev/sdb].write_io_errs 3469
[/dev/sdb].read_io_errs 0
[/dev/sdb].flush_io_errs 0
[/dev/sdb].corruption_errs 0
[/dev/sdb].generation_errs 0
# btrfs device stats /dev/sdc
[/dev/sdc].write_io_errs 3601
[/dev/sdc].read_io_errs 2
[/dev/sdc].flush_io_errs 0
[/dev/sdc].corruption_errs 0
[/dev/sdc].generation_errs 0
# btrfs device stats /dev/sdd
[/dev/sdd].write_io_errs 4335
[/dev/sdd].read_io_errs 3
[/dev/sdd].flush_io_errs 0
[/dev/sdd].corruption_errs 0
[/dev/sdd].generation_errs 0
这似乎有很多 IO 错误,但所有 4 个驱动器的数字都是一致的。这正是我对 USB 闪存驱动器的期望吗?每次我复制此文件时,它都会迅速强制我的 BTRfs 卷为只读,我不知道如何修复它。
答案1
这很可能是因为它是一个 USB 驱动器。众所周知,USB 在 Linux 上对于任何类型的长期使用来说都不可靠,而 Pi 上的集成集线器和 USB 控制器也不是特别好,这只会让情况变得更糟。高写入错误计数证实了这一结论,设备会因某种原因断开 USB 总线,但 BTRFS 从未看到这种情况发生(因为块层没有正确传递该信息),所以它只是继续尝试写入文件并返回写入错误。
值得注意的是,这可能(并且最终将)导致无法恢复的文件系统损坏。
至于如何修复它,首先卸载 BTRFS 卷(如果有必要,可以强制卸载),然后依次断开并重新连接每个闪存驱动器。执行此操作后,文件系统应该可以正常安装和运行(直到不可避免地再次发生相同的问题)。