我有一个带有 btrfs 的 3TB 磁盘,该磁盘从磁盘开头开始(即 /dev/sdx 而不是 /dev/sdx1)。同时,我决定要完全加密磁盘(使用 luks),但我没有备用磁盘来获取数据。幸运的是,这个磁盘仅填充了约 1TB,而且我已经缩小了文件系统。我知道可以在字节偏移处挂载文件系统,但是有没有办法在字节偏移处创建文件系统?
为了解决我的问题,我想创建一个 1.5TB 的文件系统,将数据移动到那里,在磁盘开头的 luks 文件系统上创建 1TB btrfs,将数据移回,扩展 btrfs。是否有另一种不需要额外磁盘/空间的解决方案?这个解决方案适用于 SSD 吗? (最后一个问题只是出于好奇,我有一个硬盘)
注意:我会使用dd
cp btrfs 到磁盘的其他部分,但我听说 btrfs 由于相同的 uid 或其他原因而不能很好地处理这个问题。
答案1
访问磁盘上某个偏移量处的文件系统的正常方法是使用分区。但是,由于磁盘开头没有空间用于分区表,因此您必须采用更复杂的方法。
您可以使用循环装置。循环设备主要用于使文件显示为块设备,但是您可以使块设备以偏移量开始(也以偏移量结束),并且底层文件本身可以是块设备,因此您得到与另一个块设备的段相对应的块设备。操作循环设备的命令是losetup
。
losetup -o 1600g /dev/loop0 /dev/sda
确保您的文件系统确实在循环设备开始之前结束。然后你就可以批量复制它。我不明白为什么你需要创建一个不同的文件系统:你不应该复制同一台机器上的 btrfs 文件系统,但是移动一个(即你永远不会同时访问两者)就可以了。
head -c 1100g /dev/sda >/dev/loop0
mount -r /dev/loop0 /mnt
# Check that the filesystem looks fine
umount /mnt
losetup -d /dev/loop0
您也可以通过适当调用 来做到这一点dd
,但这很容易出错。如果您首先设置块设备,然后重新整理数据,那么在销毁数据之前逐步进行操作并验证大小会更容易。
现在您已经移动了文件系统,请创建分区,这样您就不会再次遇到此问题。
fdisk /dev/sda
…
创建一个分区,该分区从您传递给上面的相同偏移量开始losetup
。写入更改并验证您是否可以挂载该分区。
现在为 LUKS 卷创建一个分区,创建 LUKS 卷 ( cryptsetup luksFormat
),然后再次将 btrfs 文件系统移动到 LUKS 卷上。验证文件系统是否仍然正常。删除磁盘末尾的分区并扩展磁盘开头的分区。扩展 LUKS 卷 ( cryptsetup resize
),然后扩展文件系统。
¹这样做很简单 - mkfs.btrfs /dev/loop0
但这并不是解决您问题的最佳方法。