![btrfs 无法从只读文件系统发送](https://linux22.com/image/206736/btrfs%20%E6%97%A0%E6%B3%95%E4%BB%8E%E5%8F%AA%E8%AF%BB%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%8F%91%E9%80%81.png)
因此,我稍微损坏了我的 btrfs 根文件系统。现在,当我启动时,挂载根读写失败,并且文件系统以只读方式挂载。我尝试读取的每个文件似乎都正常,因此我认为损坏相当有限。
我有一堆本地快照。我希望腐败不会影响到他们所有人;在采取更彻底的措施来尝试修复问题之前,我想将尽可能多的文件复制到我的外部备份磁盘上。但btrfs send
失败了-30 (Read-only file system)
。
- 如果
btrfs send
发送文件系统是否以只读方式安装?这会让我感到惊讶,因为它似乎不需要在那里写任何东西。 - 如果是这样,这是因为
btrfs send
实际上确实写入了发送文件系统,还是有其他原因进行此检查? - 有什么解决方法吗?目前我计划只重新同步快照,但这当然要慢得多。
(如果解决其他要点似乎太困难,我将投票赞成仅解决上述要点之一的答案)。
答案1
我刚刚在我的ztest
VM 上测试了这个(我用它来测试/练习 zfs、btrfs、mdadm、lvm 和类似的东西 - VM 附加了 15 x 100MB 虚拟驱动器,从 /dev/vda 到 /dev/vdo。它们对于我在其上运行的测试类型来说不需要很大)。
无论如何,我能够将子卷从只读 btrfs 挂载发送到另一个 fs 上的文件(/tank1,即 ZFS)。例如
# df -Th /b1
Filesystem Type Size Used Avail Use% Mounted on
/dev/vdb1 btrfs 190M 7.3M 148M 5% /b1
# btrfs filesystem show /b1
Label: none uuid: a5217930-73a9-4481-a14a-2c1974b3f2db
Total devices 2 FS bytes used 4.00MiB
devid 1 size 190.00MiB used 104.00MiB path /dev/vdb1
devid 2 size 190.00MiB used 104.00MiB path /dev/vdc1
# mount -o ro,remount /b1
# mount | grep /b1
/dev/vdb1 on /b1 type btrfs (ro,relatime,space_cache,subvolid=5,subvol=/)
# btrfs send /b1/sv1_20160506 -f /tank1/b1.send
At subvol /b1/sv1_20160506
# ls -l /tank1/b1.send
-rw-rw-r-- 1 root root 2177404 Jun 7 01:24 /tank1/b1.send
我可以想到为什么它不能在您的系统上运行的两种可能性(但可能还有其他可能性,并且这些都不一定正确):
btrfs 可能需要写入写入
/tmp
并且/tmp
是一个子目录或者/
- 我认为这不太可能,但可能值得尝试在 上挂载 tmpfs ramdisk/tmp
。btrfs 行为异常,因为您的 btrfs
/
fs 已损坏。
对于这两种可能性,一种可能的解决方法可能是从救援 CD/DVD/USB/等启动有 btrfs 支持(gparted和克隆齐拉是不错的选择)并尝试btrfs send
从那里获取快照(手动将外部备份磁盘安装为 RW 后)。