我想知道什么是克隆硬盘的最佳方法,以便我可以简单地将克隆的驱动器插入我的电脑并无缝地从它启动,就像我目前对现有驱动器所做的那样。
我有一个运行 Debian 的硬盘,根据其 SMART 数据,它似乎出现故障。我确实有备份,我也可以在新驱动器上重新安装操作系统;但是,我目前的首选是克隆驱动器,目前我除了使用可启动 CD 中的 System Rescue CD 5.0.3 之外别无选择。
驱动器上没有太多内容 - 可能已使用的空间不到 10 GB,数据很少,因此我不太担心时间,因为我并不认为这会花费太多时间。
如果我没记错的话,我在安装 Debian 时选择将其设置为加密驱动器,所以我相信 /dev/sda 显示为未加密的启动分区,其余部分是加密的,然后在那个“其余”中,我在加密区域内有一个 10 GB 的小根分区,其余部分目前未使用。
我还在处理较旧的 PATA 驱动器 - 没有可用的 SATA 驱动器 - 并且计算机主板上有一个 PATA 连接器,其中 PATA 带状电缆与用于启动的 CD-ROM 驱动器和几乎故障的硬盘驱动器连接在一起,因此没有空间连接任何第二个 PATA 驱动器进行本地传输。
为了解决这个问题,我配备了第二台计算机,其主板上有相同的单个 PATA 连接器,我在其中连接了另一个用于启动的 CD-ROM 驱动器和目标硬盘驱动器。
我已经通过 CD-ROM 驱动器启动了两台计算机,以调出系统救援 CD 5.0.3,并且我正在考虑我的选项以尽可能好地克隆故障驱动器。
这些计算机可通过 LAN 访问,我通过没有图形界面的终端通过 SSH 远程连接到它们。
我不太清楚源驱动器和目标驱动器的大小。源驱动器的容量可能比目标驱动器大,所以理想情况下,我只想传输已用空间,而不是传输整个空驱动器。
我正在考虑使用 ddrescue 描述这里;但它只描述了本地传输数据。
更新:我正在查看 Debian 安装程序如何设置源驱动器。看来我有三个分区,只有最后一个分区是加密的:
src # fdisk -l /dev/sda
Disk /dev/sda: 37.3 GiB, 40027029504 bytes, 78177792 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x332e4146
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 247807 245760 120M 83 Linux
/dev/sda2 247808 8060927 7813120 3.7G 82 Linux swap / Solaris
/dev/sda3 8060928 78176255 70115328 33.4G 83 Linux
src# cryptsetup --verbose isLuks /dev/sda1
Device /dev/sda1 is not a valid LUKS device.
Command failed with code 22: Invalid argument
src# cryptsetup --verbose isLuks /dev/sda2
Device /dev/sda2 is not a valid LUKS device.
Command failed with code 22: Invalid argument
src# cryptsetup --verbose isLuks /dev/sda3
Command successful.
我相信我也试图在类似容量的驱动器之间进行传输:一个 40 GB 的 PATA 驱动器到另一个 40 GB 的 PATA 驱动器。
目的地如下:
dest# fdisk -l /dev/sda
Disk /dev/sda: 37.3 GiB, 40027029504 bytes, 78177792 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
更新:我正在考虑使用 NBD 通过 LAN 公开源驱动器的分区,以便从目标使用 ddrescue。
以下是我迄今为止尝试公开源驱动器的方法...
src# nbd-server -d 8000 /dev/sda
...并在目标计算机上本地安装:
dest# nbd-client src 8000 /mnt/nbd-sda
不幸的是,我在尝试此操作时收到错误;我甚至无法安装远程设备:
Warning: the oldstyle protocol is no longer supported.
This method now uses the newstyle protocol with a default export
Error: Cannot open NBD: No such file or directory
Please ensure the 'nbd' module is loaded.
Exiting.
更新:我接下来要尝试的是手动重新创建目标驱动器上的分区。
我首先复制了 MBR:
src# dd if=/dev/sda of=/tmp/sda-mbr.dat bs=512 count=1
dest# scp root@src:/tmp/sda-mbr.dat /tmp
dest# dd if=/tmp/sda-mbr.dat of=/dev/sda
dest# sync
在继续之前,我认为这次至少创建一个恢复分区会有所帮助。
dest# fdisk /dev/sda
我正在删除最后一个分区,并为最终分区留出大约 15 GB 的空间。
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x332e4146
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 247807 245760 120M 83 Linux
/dev/sda2 247808 8060927 7813120 3.7G 82 Linux swap / Solaris
/dev/sda3 8060928 45809663 37748736 18G 83 Linux
/dev/sda4 45809664 78177791 32368128 15.4G 83 Linux
我需要在目标上创建与源上的 /dev/sda3 相同的加密分区;我也应该对这个恢复分区执行相同的操作:
dest# cryptsetup luksFormat /dev/sda3 --verify-passphrase
dest# cryptsetup luksFormat /dev/sda4 --verify-passphrase
接下来,打开加密的恢复分区:
dest# cryptsetup open /dev/sda4 sda4-opened
dest# mkdir /mnt/sda4-open
dest# mke2fs -j /dev/mapper/sda4-opened
dest# mount /dev/mapper/sda4-opened /mnt/sda4-open
至少现在我可以远程安装这个恢复分区并将数据传输到更好的驱动器。
首先,我打开了源驱动器上的加密分区:
src# cryptsetup open /dev/sda3 sda3-opened
src# mkdir /mnt/sda3-open
src# mount /dev/mapper/sda3-opened /mnt/sda3-open
现在使用 df,我可以看到我这里只使用了 12 GB 的磁盘空间。
让我们卸载但保持其映射:
src# umount /mnt/sda3-open
src# rmdir /mnt/sda3-open
现在我想在源驱动器上安装恢复分区:
src# mkdir /mnt/dest-sda4
src# sshfs root@dest:/mnt/sda4-open /mnt/dest-sda4
安装完成后,我现在可以运行 ddrescue:
src# ddrescue -f -n /dev/sda1 /mnt/dest-sda4/sda1.ddrescue.img /mnt/dest-sda4/sda1.ddrescue.log
这会产生一个与原始分区大小相同的图像,因此看起来这并没有排除未使用的空间。
我想档案归档现在改为:
src# fsarchiver savefs /mnt/dest-sda4/sda1.fsarchiver.img.fsa /dev/sda1
Statistics for filesystem 0
* files successfully processed:....regfiles=314, directories=6, symlinks=0, hardlinks=0, specials=0
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
挂载 /dev/sda1 并运行 df 显示它只使用了 33 MB,而 .fsa 文件只有 24 MB,所以它可能被压缩了。这比原来的 120 MB 要好。
现在让我们尝试使用根分区 sda3 来看看情况如何:
src# fsarchiver savefs /mnt/dest-sda4/sda3.fsarchiver.img.fsa /dev/mapper/sda3-opened
这可能需要一段时间,所以我暂时保存此更新。
更新:这比我预期的要快。以下是我最终得到的结果:
dest# ls -lh
total 7.7G
drwx------ 2 root root 16K Apr 8 01:49 lost+found
-rw-r--r-- 1 root root 24M Apr 8 02:04 sda1.fsarchiver.img.fsa
-rw-r--r-- 1 root root 7.7G Apr 8 02:43 sda3.fsarchiver.img.fsa
以下是查看上述命令的输出更有趣的部分:
src# fsarchiver savefs /mnt/dest-sda4/sda3.fsarchiver.img.fsa /dev/mapper/sda3-opened
Statistics for filesystem 0
* files successfully processed:....regfiles=149025, directories=84796, symlinks=20559, hardlinks=127551, specials=1269
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
如果我理解正确的话,这是令人鼓舞的,因为从源驱动器读取数据没有任何困难。
让我们清理一些:
src# umount /mnt/dest-sda4
src# rmdir /mnt/dest-sda4
接下来,我将把存档的文件恢复到目标的 /dev/sda1 和 /dev/sda3 上,但首先让我们看一下目标驱动器上有什么,因为我忘记了上次设置的位置。
首先,/dev/sda1 上有任何文件系统吗?
dest# mkdir /mnt/sda1
dest# mount /dev/sda1 /mnt/sda1
NTFS signature is missing.
Failed to mount '/dev/sda1': Invalid argument
The device '/dev/sda1' doesn't seem to have a valid NTFS.
Maybe the wrong device is used? Or the whole disk instead of a
partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?
好的。我以为没有文件系统,但我没想到会有 NTFS 消息。所以那里什么都没有。
让我们恢复第一个分区映像:
dest# fsarchiver restfs /mnt/sda4-open/sda1.fsarchiver.img.fsa id=0,dest=/dev/sda1
Statistics for filesystem 0
* files successfully processed:....regfiles=314, directories=6, symlinks=0, hardlinks=0, specials=0
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
现在开始安装:
dest# mount /dev/sda1 /mnt/sda1
dest# ls -l /mnt/sda1
...
dest$ df -h | grep sda1
...
到目前为止情况看起来不错。
现在让我们进行根分区。
dest# cryptsetup open /dev/sda3 sda3-opened
dest# mkdir /mnt/sda3-open
dest# mount /dev/mapper/sda3-opened /mnt/sda3-open
NTFS signature is missing.
Failed to mount '/dev/mapper/sda3-opened': Invalid argument
The device '/dev/mapper/sda3-opened' doesn't seem to have a valid NTFS.
Maybe the wrong device is used? Or the whole disk instead of a
partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?
与以前一样——那里什么都没有。
让我们恢复分区映像:
dest# fsarchiver restfs /mnt/sda4-open/sda3.fsarchiver.img.fsa id=0,dest=/dev/mapper/sda3-opened
Statistics for filesystem 0
* files successfully processed:....regfiles=149025, directories=84796, symlinks=20559, hardlinks=127551, specials=1269
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
现在开始安装:
dest# mount /dev/mapper/sda3-opened /mnt/sda3-open
dest# ls -l /mnt/sda3
...
dest$ df -h | grep sda3
...
到目前为止情况看起来不错。
我也在两者上运行了以下命令:
# fsarchiver probe simple
事情看起来正如预期的那样。
我认为我仍然忽略的一件事是,我认为这会搞乱 Grub。我似乎记得第一阶段从 MBR 启动得很好,但上次我尝试做类似的事情时,它无法在 /boot 分区上找到第二阶段。
dest# mount -o bind /proc /mnt/sda3-open/proc
dest# mount -o bind /dev /mnt/sda3-open/dev
dest# mount -o bind /sys /mnt/sda3-open/sys
dest# chroot /mnt/sda3-open /bin/bash
(dest) chroot# mount /dev/sda1 /boot/
(dest) chroot# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
(dest) chroot# umount /boot
(dest) chroot# exit
dest# umount /mnt/sda3-open/{sys,dev,proc}
当我重新启动时,这应该可以工作并且驱动器应该可以正常启动;但是,现在已经很晚了,我还不想开始做这件事。
此外,我还不确定这会有一个圆满的结局。上面的 grub-install 命令表明它是为 i386 安装的,但我相信我想要 64 位。
我可能需要通过 rescue64 重新启动系统救援 CD 来重做这部分。我不确定默认启动是否启动了 32 位。
再说了,我打算明天处理剩下的事情。
更新:好消息是,系统救援 CD 的默认启动是 rescue64,所以不会有任何问题。
事实证明我完全忘记了 LVM,并且驱动器的 UUID 显然不匹配。
...
cryptsetup: lvm is not available
cryptsetup: lvm is not available
cryptsetup: lvm is not available
cryptsetup: lvm is not available
ALERT! /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx does not exist.
Check cryptopts=source= bootarg: cat /proc/cmdline
or missing modules, devices: cat /proc/modules; ls /dev
-r Dropping to a shell. Will skip /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxx
xxxxxxxx if you can't fix.
modprobe: module ehci-orion not found in modules.dep
BusyBox vx.xx.x (Debian x:x.xx.x-x+xxxxxx) built-in shell (ash)
Enter 'help for a list of built-in commands.
/bin/sh: can't access tty: job control turned off
(initramfs)
我想我可以与这些作斗争,但我不会费心。相反,我将尝试 dirkt 建议的方法并克隆完整的 /dev/sda(UUID 和所有内容),因为 40 GB 只是 10 GB 的四倍,我昨晚通过 LAN 传输了它,并没有花太长时间。
昨晚我没能做到这一点,因为我无法让 NBD 工作,所以我只能保存到映像文件。如果我要进行完整的磁盘克隆,我就无法做到这一点,所以让我们看看管道或命名管道是否能更好地工作。
回到开始,两台计算机现在都已从 System Rescue CD 可启动 CD 启动,都可以通过各自 DHCP 分配的 IP 地址在网络上访问,并且都已通过命令设置了 root 密码passwd
。
在使用真正的驱动器执行此操作之前,我想先用一个小小的假驱动器练习一下,因此我将首先对其进行设置。
src# dd if=/dev/zero of=/root/tempsrc.dat bs=1M count=128
...
src# fdisk -l /root/tempsrc.dat
Disk /root/tempsrc.dat: 128 MiB, 134217728 bytes, 262144 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8b8647e7
Device Boot Start End Sectors Size Id Type
/root/tempsrc.dat1 * 2048 34815 32768 16M 83 Linux
/root/tempsrc.dat2 34816 100351 65536 32M 82 Linux swap / Solaris
/root/tempsrc.dat3 100352 262143 161792 79M 83 Linux
src# mkdir /mnt/tempsrc
src# mkdir /mnt/tempsrc-mounted
src# losetup /dev/loop1 /root/tempsrc.dat -o $(expr 2048 \* 512)
src# mke2fs /dev/loop1
src# mount /dev/loop1 /mnt/tempsrc-mounted
src# echo 'This is partition 1' > /mnt/tempsrc-mounted/note1.txt
src# umount /mnt/tempsrc-mounted
src# losetup -d /dev/loop1
src# losetup /dev/loop1 /root/tempsrc.dat -o $(expr 100352 \* 512)
src# cryptsetup luksFormat /dev/loop1 --verify-passphrase
src# cryptsetup open /dev/loop1 loop1-opened
src# mke2fs -j /dev/mapper/loop1-opened
src# mount /dev/mapper/loop1-opened /mnt/tempsrc-mounted
src# echo 'This is partition 3' > /mnt/tempsrc-mounted/note3.txt
src# umount /mnt/tempsrc-mounted
src# cryptsetup close loop1-opened
src# losetup -d /dev/loop1
src# rmdir /mnt/tempsrc-mounted
src# rmdir /mnt/tempsrc
我知道。我没有再处理 LVM。算了。
我现在有一个 /root/tempsrc.dat,其中包含一个磁盘映像,例如我想传输到远程目标的 SD 卡映像。第一个分区上有一个名为的文件note1.txt
,第三个分区已加密,并具有包含不同内容的。我想确保在运行并传输note3.txt
后可以访问所有这些内容。fsarchiver
让我们在目的地做好一些准备:
dest# dd if=/dev/zero of=/root/tempdest.dat bs=1M count=128
dest# fdisk -l /root/tempdest.dat
Disk /root/tempdest.dat: 128 MiB, 134217728 bytes, 262144 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
我们还为这些创建环回设备:
src# losetup /dev/loop1 /root/tempsrc.dat
dest# losetup /dev/loop2 /root/tempdest.dat
现在,当我准备进行传输时,我发现 fsarchiver 无法处理它这里和这里。
我希望做如下的事情:
src# fsarchiver savefs /tmp/fifo1 /dev/loop1
dest# fsarchiver restfs /tmp/fifo2 id=0,dest=/dev/loop2
更新:我用临时的第三个驱动器替换了目标 40 GB 驱动器,并打开了目标 PC。
让我们首先设置这个新驱动器:
dest# mkdir /mnt/sda-open
dest# mount /dev/sda1 /mnt/sda-open
尝试再次传输,但这次要同时对整个 /dev/sda 进行操作:
src# mkdir /mnt/dest-sda
src# sshfs root@dest:/mnt/sda-open /mnt/dest-sda
src# fsarchiver savefs /mnt/dest-sda/src-sda.fsarchiver.img.fsa /dev/sda
filesys.c#317,generic_mount(): partition [/dev/sda] cannot be mounted on [/tmp/fsa/20180408-222928-xxxxxxxx-00] as [vfat] with options []
oper_save.c#1032,filesystem_mount_partition(): cannot mount partition [/dev/sda]: filesystem may not be supported by either fsarchiver or the kernel.
removed /mnt/dest-sda/src-sda.fsarchiver.img.fsa
好吧,这个想法就到此为止。我想他们称其为“FS”存档器是有原因的。让我们尝试一下 partimage。
src# partimage --compress=1 save /dev/sda /mnt/dest-sda/src-sda.partimg.bz2
这也不起作用;显然这涉及文件系统而不是整个磁盘。
由于我们对整个磁盘进行操作,让我们看看 ddrescue 现在是否可以工作。
src# ddrescue --no-scrape /dev/sda /mnt/dest-sda/src-sda.ddrescue.img /mnt/dest-sda/src-sda.ddrescue.img.log
GNU ddrescue 1.21
Press Ctrl-C to interrupt
ipos: 785580 kB, non-trimmed: 0 B, current rate: 12320 kB/s
opos: 785580 kB, non-scraped: 0 B, average rate: 10615 kB/s
non-tried: 39241 MB, errsize: 0 B, run time: 1m 14s
rescued: 785580 kB, errors: 0, remaining time: 1h
percent rescued: 1.96% time since last successful read: 0s
Copying non-tried blocks... Pass 1 (forwards)
我于下午 5:41 开始执行此操作,我想是在 100 Mbps 的 LAN 上执行 40 GB 的驱动器。目前,输出显示它将在大约一小时内完成。
答案1
好吧,看来我的中间驱动方法是正确的。这不是我最初打算做的,但它确实帮助我解决了问题。
现在,新的驱动器是原始驱动器的克隆,并且运行良好。
为了在存在限制的情况下克隆我的原始驱动器 - 特别是需要使用没有 Clonezilla 的系统救援 CD 通过 LAN 进行克隆 - 我可以按如下方式完成此操作。
首先,我将临时的 160 GB 硬盘插入备用 PC,如上所述,然后使用可启动的系统救援 CD 光盘启动了两台计算机。
在我的PC 上,我使用本地方式src
将 160 GB 硬盘安装在 PC 上,然后按照上述方法将故障硬盘作为映像文件镜像到 160 GB 硬盘上。这个 40 GB 的硬盘被镜像到 40 GB 的映像文件中,在我的 100 Mbps LAN 上大约花了一个小时完成。dest
sshfs
ddrescue
我将保留此图像,这样就不必再这样做了;从现在开始,在捕获此初始图像后,数据的增量备份应该足以进行恢复。
一旦此阶段完成,我就可以将故障的 40 GB 驱动器更换为主机中恰好具有相同 40 GB 容量的替换驱动器,而src
无需触摸甚至关闭电源dest
。
然后,我src
再次启动系统救援 CD,再次dest
通过以下方式挂载目录sshfs
,这次从我的映像中恢复:
dest# ddrescue --force --no-scrape /mnt/dest-sda/src-sda.ddrescue.img /dev/sda /mnt/dest-sda/src-restore-sda.ddresue.img_2018-04-08.log
这又花了一个小时才完成。
因为这是一个完整驱动器(而不是分区)的图像,所以我能够简单地弹出 CD 并重新启动src
,一切恢复原样。