我用 btrfs 和 dd 克隆了一个硬盘。现在我想安装克隆的驱动器,同时仍然安装“原始”驱动器:
mount /dev/sdc /mnt/tmp
mount: /mnt/tmp: mount(2) system call failed: File exists.
Abtrfsck /dev/sdc
没有显示任何错误。我怎样才能挂载该磁盘?
答案1
btrfs 是一个多设备(支持)文件系统,因此它需要某种方法来跟踪哪些设备属于给定文件系统。事实上,如果您有多个设备,只需挂载其中一个,btrfs 就会自行查找其他设备。
它通过文件系统的 UUID 来完成此操作,当然,它现在在您的副本上是相同的。 btrfs 多次存储该 UUID;btrfstune -u /dev/sdc
应该更改所有这些(但可能需要一点时间,因为它必须重写一堆元数据)。在相对较新的内核上(2018 年 12 月补丁),btrfstune -m /dev/sdc
应该也可以工作,而不必重写所有元数据。请注意,有些人报告了这些选项的损坏,但您已经在处理副本。
重要警告!
请阅读btrfs 陷阱,特别是关于块级副本的警告。拥有其中一个文件系统块设备的两个副本会导致内核使用错误的副本(因为它们具有相同的文件系统 UUID,据其所知,是同一设备),如果发生这种情况,将会可能破坏 两个都其中。包括你原来的。(想象一下,如果您有一个双设备文件系统,设备为 A1 和 B1,会发生什么情况。您将 A1 复制为 A2。现在,当内核挂载文件系统时,它可能会按预期使用 A1 和 B1。或者可能会使用A2 和 B1 可能会在每次挂载时切换,这意味着一半的文件系统可能会“丢失”自上次挂载以来的所有写入)。
值得庆幸的是,内核注意到您尝试挂载克隆并阻止了您。
该怎么办
任何:
- 将图像复制到文件(并且不要为其设置环回设备)。在另一台计算机(带有环回设备)或虚拟机中处理副本。在确定文件系统 UUID 已更改之前,不要让一个内核看到两个副本。
- 使用
tar
、btrfs-send
等创建到新文件系统的副本,并使用不同的文件系统 UUID。