con*_*tti 6 linux ssd hard-drive clone luks
所以最近我的旧 SSD(包含我的系统的 /root + /home 分区)坏了(这个问题的细节),我去买一个新的。现在我想克隆它,但遇到了以下问题:
$ pv /dev/sdd > /dev/sda
4.24GiB 0:00:18 [ 234MiB/s] [==> ] 7% ETA 0:03:55
pv: /dev/sdd: read failed: Input/output error
$ dd if=/dev/sdd of=/dev/sda bs=1M status=progress
dd: error reading '/dev/sdd': Input/output error
4397+1 records in
4397+1 records out
4611493888 bytes (4.6 GB, 4.3 GiB) copied, 22.0249 s, 209 MB/s
Run Code Online (Sandbox Code Playgroud)
旧的 SSD 仍然可以工作。由于它被损坏,有很多系统冻结,但我仍然可以很好地解锁,安装和使用它。我可以访问所有数据 (AFAIK) 并使用tar运行良好的完整备份。
我更喜欢直接克隆而不是逐个文件(或tar)复制的原因是:
该网站建议使用conv=noerrorwith dd,但我不确定这是否安全。我对dd_rescue和 clonezilla 的-rescue.
问题:如何安全地将旧 SSD 克隆到新 SSD 上,然后进行md5sum检查以确保克隆 100% 成功?
我上面链接的网站建议使用 gparted 检查克隆是否成功,但 AFAIK gparted 不适用于 LUKS 加密分区。(让事情变得更复杂:LUKS 标头已分离。)
额外问题:我的驱动器的解密是在启动时完成的,使用 grub 和分区的 ID(不是 UUID)。更新我的 crypttab 和 grub 配置中的 ID 是否足够,或者我需要做更多吗?
编辑:我刚刚意识到md5sum很可能无法读取驱动器。有没有其他方法可以安全地判断克隆是否成功?
更新:所以我尝试了带有-rescue选项的clonezilla 。它似乎有效,我可以解锁 LUKS 容器以显示 LVM,但是当我尝试挂载根分区时,我得到以下信息:
$ sudo mount /dev/mapper/vvg-root /mnt/sda
mount: wrong fs type, bad option, bad superblock on /dev/mapper/vvg-root,
missing codepage or helper program, or other error
Run Code Online (Sandbox Code Playgroud)
相关资料来自dmesg:
[ 4686.401702] JBD2: no valid journal superblock found
[ 4686.401707] EXT4-fs (dm-3): error loading journal
Run Code Online (Sandbox Code Playgroud)
所以我想这没有按计划进行。请问有人有更好的主意吗?
UPDATE2:我fsck.ext4 -yv在新驱动器的分区上运行了一个。我被错误淹没了。在数百万。现在我可以挂载它了,但是我的几乎所有文件都丢失了。/home 目录以及其他许多目录完全消失了。上面应该有大约 30-35GB 的数据。现在是 53MB。
我唯一的选择真的是回滚tar我拥有的备份吗?我想也许一对一的 rsync 副本更好,因为这会报告特定文件是否损坏/不可读,对吗?我--verify在制作tar存档时使用了它,但它没有报告任何错误。
在完成我在问题中所述的操作后,我最终执行了以下操作:
1)在 CloneZilla 副本失败后删除新 SSD 上的 LVM。
2)我保持外部 dm-crypt 不变,因为它运行良好。
3) 我重新创建了一个新的 LVM 并调整了所有内容的大小以适应新的(更大的)SSD。
(这仅与我的情况相关,因此字体较小,请参阅问题更新)
1) 解锁后,我在实时系统中正常安装了两个 SSD 的根分区:
# unlock the LUKS containers with cryptsetup first
mount /dev/mapper/ovvg-root /mnt/oldssd
mount /dev/mapper/vvg-root /mnt/newssd
Run Code Online (Sandbox Code Playgroud)
2)我使用rsync来克隆文件:
rsync -ahv --progress /mnt/oldssd /mnt/newssd
Run Code Online (Sandbox Code Playgroud)
3)确认所有文件夹的大小匹配:
du -cs /mnt/oldsdd/* && echo " " && du -cs /mnt/newssd/*
Run Code Online (Sandbox Code Playgroud)
4)确认所有文件都在那里,仔细检查:
find /mnt/oldssd | cut -d "/" - f 4- | sort > oldssd.txt
find /mnt/newssd | cut -d "/" - f 4- | sort > newssd.txt
diff oldssd.txt newssd.txt
Run Code Online (Sandbox Code Playgroud)
八个文件不存在,newssd.txt所以我认为这些文件有读取错误。我最终留下了这些文件,因为我有备份,稍后我将手动复制它们。
5)通过检查校验和进一步满足我的偏执:
cd /mnt/oldssd && find . -type f -exec md5sum {} \; | sort > /root/oldssd_md5.txt
cd /mnt/newssd && find . -type f -exec md5sum {} \; | sort > /root/newssd_md5.txt
cd /root && diff oldssd_md5.txt newssd_md5.txt
Run Code Online (Sandbox Code Playgroud)
根本没有输出 - 意味着每个文件都是相同的!
至于奖金问题:
/etc/fstab
1)在2)中更改设备路径(使用 UUID)by-id3 /etc/default/grub
)由于我现在无法 chroot 到我的系统中,所以我grub.cfg直接修改了以反映磁盘的更改by-id- 但是更好的做法是不要这样做,而是 chroot 进入根系统并重新配置 GRUB 引导加载程序。从新的 SSD 启动到系统后,我立即执行了此操作。
比我希望的更复杂,但至少它安全有效。