我目前正在尝试将作为 RAID 1 设置一部分的启动驱动器克隆到单个 SSD(sdc
如图所示),以便我可以从另一台计算机上的非 RAID SSD 设置启动。这可能吗?我尝试使用Clonezilla 官方指南为了这。
我最初尝试使用 Clonezilla 进行克隆sda
,sdc
但当我达到部分克隆错误。
接下来,我尝试克隆md0
到sdc
。虽然 Clonezilla 允许我克隆它,但最终它让我sdc
没有分区。
非常感谢您的帮助。
答案1
好的,据我了解,从您的设置来看,您在 md0 上有一个 899.4G 的 ext4 文件系统,它由 RAID-1 中的 sda1 和 sdb1 组成。您希望从 md0 中提取该 ext4 文件系统并将其放在 sdc 上,然后将其放在另一台机器上并尝试从该机器启动。
您不能只拍摄 /dev/sda1 或 /dev/md0 的图像的原因是这两个设备中都含有元数据,导致它们无法被识别为裸 ext4 文件系统。
老实说,为了简单起见,我可能只会在运行时从 / 的内容执行文件系统级别的 tar-to-tar,将其复制到 sdc 上的分区。像这样:
$ sudo fdisk /dev/sdc
$ sudo mkfs.ext4 /dev/sdc1
$ sudo mount /dev/sdc1 /mnt
$ sudo tar -C / --one-file-system --xattrs --xattrs-include='*' -Spcf - | \
sudo tar -C /mnt --numeric-owner --xattrs --xattrs-include='*.*' -pxvf -
它处理稀疏文件、硬链接和特殊 POSIX 属性(--xattrs-include='*'
需要获取所有这些属性)。它不处理 SELinux 标签;也许有办法做到这一点tar
,但你使用的是 Ubuntu,所以可能不会使用 SELinux。然后你需要在 sdc 上安装引导加载程序。
我从来没有遇到过复制这样的根文件系统的问题,即使它正在使用中,只要我没有想到还要克隆应用程序数据等正在我之下发生变化的数据。
但是,如果您真的想提取文件系统的映像,我将使用我自己的系统作为示例向您展示如何执行此操作。我将只关注我的 /boot 文件系统,它是 md0 上的 2G ext4,即 sda1 和 sdb1。这对于一个小例子来说已经足够了。
首先,您需要启动某种形式的实时 CD,因为您将从 md0 复制数据,而您不应该在 md0 正在使用时执行此操作。因此,启动您选择的实时系统;无需激活 md0,因为我们不会使用它。不过,实时系统是否激活它并不重要。
在 sda1(或 sdb1)开始附近的某个位置,会有一个神奇的数字 0x53ef,这是一个 ext4 超级块。以下是找到它的方法:
$ sudo xxd -l $((4*1024*1024)) -a /dev/sda1 | grep 53ef 00100430:e9ac 0060 6a00 ffff53ef0100 0100 0000 ...`j...S.......
这会搜索块设备的前 4MiB 以查找 0x53ef 字节序列。这很可能是我的 ext4 文件系统的超级块。
现在,魔术数字是 56 个字节(十六进制 0x38),位于 ext4 磁盘格式的开头,然后在此之前有 1024 个字节(十六进制 0x400)的填充。因此,上面的魔术数字位于字节位置 0x100438(每组四个为 2 个字节,因此为 0x100430+8)。要找到可能的文件系统的开头:
$ echo $((0x100438-0x38-0x400))
1048576
这是以字节为单位的十进制答案,表示 sda1 中 ext4 文件系统的可能偏移量。
我将把它提取到一个文件中,因为对我来说它只有~2G 大小:
$ sudo dd if=/dev/sda1 iflag=skip_bytes skip=1048576 bs=32768 > /var/tmp/boot.img
60960+0 records in
60960+0 records out
1997537280 bytes (2.0 GB, 1.9 GiB) copied, 0.89818 s, 2.2 GB/s
表示iflag=skip_bytes
是skip=1048576
单字节的,这使我们能够跳到我们需要的位置,但出于性能原因仍然以 32KiB 块的形式读取它(bs=32768
)。
现在,我这样做只是为了证明这一点,但你想对你的 sdc 磁盘这样做。不过,我会对该磁盘进行分区,无论是通过 MBR 还是 GPT,因为你需要在开始时留出空间来安装引导加载程序。所以我假设你已经这样做了,并且 sdc1 分区现在存在。进入dd
该分区:
$ sudo dd if=/dev/sda1 iflag=skip_bytes skip=1048576 bs=32768 status=progress of=/dev/sdc1
由于这将是一个非常漫长的操作,因此在那里添加了一个进度条。
只是为了证明它对我有用:
$ file /var/tmp/boot.img
/var/tmp/boot.img: Linux rev 1.0 ext4 filesystem data, UUID=4279ede6-332e-4b24-96e4-e575d34fa7dc, volume name "boot" (needs journal recovery) (extents) (64bit) (large files) (huge files)
$ sudo mount -v -t ext4 /var/tmp/boot.img /mnt
mount: /dev/loop17 mounted on /mnt.
$ ls -la /mnt
total 330756
drwxr-xr-x 4 root root 4096 Jan 21 05:23 .
drwxr-xr-x 23 root root 4096 Jan 21 05:21 ..
-rw-r--r-- 1 root root 217458 Jan 15 10:30 config-4.15.0-134-generic
drwxr-xr-x 5 root root 4096 Jan 21 05:23 grub
-rw-r--r-- 1 root root 75199113 Jan 21 05:23 initrd.img-4.15.0-134-generic
…etc…
此时,您应该能够重新引导至正常操作系统并挂载 sdc1 并在其中进行探索以验证其是否正确,但您还有一件事要做:在 sdc 上安装引导加载程序。否则,当您将驱动器放入另一台机器时,它将无法启动。
$ sudo grub-install /dev/sdc
应该可以。现在尝试将 sdc 驱动器放入另一台机器并启动它。
所有这些操作(甚至是 tar-to-tar)都非常可怕,一个错误可能会毁掉你的所有数据,所以我希望你在尝试任何这些操作之前先备份。