克隆加密的固态硬盘到更大的固态硬盘

我目前有一块128GB的固态硬盘,它使用的是Ubuntu自带的加密功能。
现在我想将其克隆到一块更大的固态硬盘,并扩展分区以适应这个新的更大容量的固态硬盘。请问最好的方法是什么?
我可以直接像复制硬盘那样进行克隆,然后使用类似Gparted的工具来扩展分区吗?还是说加密会影响这个过程?
非常感谢您的帮助。

在这里回答了https://unix.stackexchange.com/questions/379357/best-way-to-move-lvm-on-luks-to-a-new-hdd - Denis Trofimov
2个回答

假设:

因为我无法对您的帖子进行评论,所以我不得不做一些假设:

  1. 您的SSD挂载点位于/dev/sdX
  2. 您的较大的SSD挂载点位于/dev/sdY
  3. 您正在使用LUKS全盘加密
  4. 您的加密分区是/dev/sdX1
  5. 您的未加密挂载点,即文件系统所在位置是/dev/mapper/sdX1_crypt,并且它使用了一个ext4文件系统

更简单的方法:

最简单但速度较慢的方法是使用dd

sudo dd  if=/dev/sdX of=/dev/sdY bs=64k  

将较小的SSD上的每个字节复制到较大的SSD上。这将为您提供一个完全可引导的系统,但您必须断开较小的SSD才能引导,因为两个SSD共享相同的UUID,系统使用该UUID来识别各个磁盘。在引导之前,您需要使用fdisk来扩展物理分区。
sudo fdisk /dev/sdY

fdisk是一个交互式工具,你首先要删除LUKS所在的分区(因为其结束地址比新的更大的SSD短),然后创建一个新的分区(fdisk使用的默认设置会填充所有未使用的空间),保存(这样软件就可以“扩展”分区)。接下来,你需要使用cryptsetup来扩展LUKS容器。
sudo cryptsetup luksOpen /dev/sdY1 sdY1_crypt
sudo cryptsetup resize /dev/sdY1_crypt

最后,您将使用resize2fs来扩展文件系统。
sudo resize2fs /dev/mapper/sdY1_crypt

更快的方法:
一个更快、更复杂的方法是在较大的SSD上使用fdisk创建一个名为sdY1的新分区,然后使用LUKS创建一个新的加密卷。
sudo cryptsetup luksFormat [OPTIONS] /dev/sdY1

将其安装在sdY1_crypt上。
sudo cryptsetup luksOpen /dev/sdY1 sdY1_crypt

然后使用dd命令将未加密的文件系统从一个加密卷复制到另一个卷。
sudo dd if=/dev/mapper/sdX1_crypt of=/dev/mapper/sdY1_crypt bs=64k

然后使用resize2fs扩展文件系统

sudo resize2fs /dev/mapper/sdY1_crypt

为了能够从新的更大的SSD启动,您需要在SSD的MBR中安装grub。
grub-install [OPTIONS] /dev/sdY

注意:
所有使用的命令都是高度可配置的,你会想要使用其中一些选项,因为你比我更了解你的系统,请使用“man ”或“ --help”来了解它们能做什么。

1第一种方法存在一些问题。sudo cryptsetup resize /dev/sdb1会出现“找不到设备sdb1”的错误。必须先执行sudo cryptsetup luksOpen /dev/sdb1 sdb1_crypt,然后再使用sudo cryptsetup resize sdb1_crypt。此外,在此之后执行resize2fs时会出现“尝试打开超级块时出现错误的魔数”。我不确定原因是什么,但可能是因为原始驱动器当前已挂载(我们正在从该系统进行dd操作),并且与新克隆的驱动器具有相同的UUID。 - cyphunk
如果有人使用那个方法,他们可以尝试使用第二个设备或可启动的光盘来进行调整大小的步骤。 - cyphunk
3好的,最后一次跟进。我已经成功使用第一种方法。我使用了gparted,所以在继续之前,请在您的系统上安装gparted。然后,在执行“dd”命令将根驱动器复制到新的外部驱动器之后,关闭计算机,取出原始驱动器并放入新驱动器。启动新驱动器。使用gparted调整根分区大小。然后:sudo cryptsetup resize <name> sudo pvresize /dev/mapper/<name> sudo lvresize -l +100%FREE /dev/mapper/<name> sudo resize2fs -p /dev/mapper/<name>(在我的情况下,<name>是vg0-root)。 - cyphunk
@cyphunk 感谢你指出LVM。虽然我在我的假设中没有包括它,但我应该知道,因为OP提到了“使用Ubuntu附带的加密”。 - Cybernaut
指南仍然适用于使用 Ubuntu 18.04 的 GPT 磁盘,只需进行一些调整。 - sergtech
建议您更新您的答案,加上sdX和sdY,这样即使有人复制粘贴失败也不会损坏他们的系统。 - Kevin

我想在这个讨论串中添加一些信息,可以帮助其他人。
截至今天的日期(2019年10月27日),我可以断言,对于其他想要克隆完整磁盘加密系统(LVM on LUKS)的人来说,最简单的方法将是结合使用Clonezilla和GParted。
使用一个Clonezilla的live USB,在第一次启动时进入shell,使用“cryptsetup -v luksOpen /dev/sdX unique-name”为每个磁盘解密两个磁盘。
通过退出shell提示符(Ctrl-D或只是exit)重新进入Clonezilla菜单。
然后开始进行磁盘到磁盘的传输,对于我的两个SSD(一个通过USB外部盒连接)的500GB和1TB,大约需要3小时。
重新启动到新克隆的磁盘以检查其功能,然后从GParted live CD / USB启动。从GParted 0.28版本开始,它现在支持调整luks分区的大小,解密后扩展分区,完成!
它就是这么简单,完美运作!

你的更新建议使用Clonezilla的实时USB,并在首次启动时进入shell,使用cryptsetup -v luksOpen /dev/sdX unique-name为每个磁盘进行解密。我已经查看了cryptsetup的man页面,但仍然不理解在这个上下文中for each diskunique name是什么意思。我猜想这是在映射器中显示的名称?能否请你编辑你的更新以包含解释。这将对我有所帮助。我有lsblk --fs的输出,但这里没有空间放置它。这些内容对于此上下文是否有用? - Jörn Guy Süß