Linux 将加密驱动器克隆到较小的驱动器

Dio*_*ius 6 encryption ssd resize

我想以更快的速度升级笔记本电脑的驱动器,因此我想将当前的硬盘克隆到 SSD。不幸的是它们的大小不一样。

我已经找到了这个问题,但到目前为止我对答案不满意。

这是我所拥有的(sda = HDD,sdb = SSD):

NAME                               MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                                  8:0    0 232.9G  0 disk  
|-sda1                               8:1    0   243M  0 part  /boot
|-sda2                               8:2    0     1K  0 part  
`-sda5                               8:5    0 232.7G  0 part  
  `-sda5_crypt (dm-0)              252:0    0 232.7G  0 crypt 
    |-elementary--vg-root (dm-1)   252:1    0 230.8G  0 lvm   /
    `-elementary--vg-swap_1 (dm-2) 252:2    0   1.9G  0 lvm   [SWAP]
sdb                                  8:16   0 111.8G  0 disk  
`-sdb1                               8:17   0 111.8G  0 part  
Run Code Online (Sandbox Code Playgroud)

dd使用 Live CD 将当前 HDD 分区缩小到 SSD 可以处理的确切大小,然后再结束,这不是最好的方法吗?我必须使用哪些命令?

Dio*_*ius 4

我将自己回答这个问题,但一般性说明:\n也许从头开始最快,步骤复杂且耗时!

\n\n
    \n
  • 使用您最喜欢的磁盘克隆/备份工具进行备份
  • \n
  • 关注有关ResizeEncryptedPartions的 Ubuntu Wiki 文章
  • \n
  • 确保分区与较小磁盘的大小完全匹配(因此最后一个分区之后的可用空间未分配)
  • \n
  • 使用 dd 克隆磁盘直到达到确切的大小
  • \n
\n\n

详细的

\n\n
    \n
  • /dev/sda 是我当前想要缩小的磁盘
  • \n
  • /dev/sdb 是我的新磁盘
  • \n
  • 使用您的磁盘大小、块大小等的确切值,我的计算只是我如何做到这一点的一点线索。
  • \n
  • 请小心选项参数(例如,b 有时表示字节,有时表示块等)。始终首先检查手册页。
  • \n
  • 查看上面的链接文章,了解有关明智步骤的一些其他信息
  • \n
\n\n

启动 livecd,加载模块,解密磁盘,发现分区:

\n\n
sudo modprobe dm-crypt\nsudo cryptsetup luksOpen /dev/sda5 crypt1\nsudo vgscan --mknodes\nsudo vgchange -ay\n
Run Code Online (Sandbox Code Playgroud)\n\n

打印出当前分区布局,大小以字节为单位:

\n\n
ubuntu@ubuntu:~$ lsblk -b\n\nNAME                               MAJ:MIN RM         SIZE RO TYPE  MOUNTPOINT\nsda                                  8:0    0 250059350016  0 disk \n\xe2\x94\x9c\xe2\x94\x80sda1                               8:1    0    254803968  0 part \n\xe2\x94\x9c\xe2\x94\x80sda2                               8:2    0         1024  0 part \n\xe2\x94\x94\xe2\x94\x80sda5                               8:5    0 249802260480  0 part \n  \xe2\x94\x94\xe2\x94\x80crypt1 (dm-0)                  252:0    0 249800163328  0 crypt\n    \xe2\x94\x9c\xe2\x94\x80elementary--vg-root (dm-1)   252:1    0 247757537280  0 lvm  \n    \xe2\x94\x94\xe2\x94\x80elementary--vg-swap_1 (dm-2) 252:2    0   2038431744  0 lvm  \nsdb                                  8:16   0 120034123776  0 disk \n\xe2\x94\x94\xe2\x94\x80sdb1                               8:17   0 120034091520  0 part  /media/ubuntu/ff08402\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们需要知道,新的根分区应该有多大,我们做一些计算:

\n\n
find how much space is used without root:\n  250059350016\n- 247757537280\n=   2301812736\n\ncalculate new wished size from the new disk:\n  120034123776\n-   2301812736\n= 117732311040\n\nSince we can specify it only in kibibytes, we divide it by 1024\n  117732311040\n/         1024\n=    114972960\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用 resize2fs 调整分区大小(我有 ext4):

\n\n
sudo resize2fs -p /dev/mapper/elementary--vg-root 114972960k\n
Run Code Online (Sandbox Code Playgroud)\n\n

将逻辑卷设置为计算的大小:

\n\n
sudo lvreduce -L 114972960k /dev/mapper/elementary--vg-root\n
Run Code Online (Sandbox Code Playgroud)\n\n

打印新的分区设置,我们需要其中的一些值:

\n\n
ubuntu@ubuntu:~$ lsblk -b\nNAME                               MAJ:MIN RM         SIZE RO TYPE  MOUNTPOINT\nsda                                  8:0    0 250059350016  0 disk \n\xe2\x94\x9c\xe2\x94\x80sda1                               8:1    0    254803968  0 part \n\xe2\x94\x9c\xe2\x94\x80sda2                               8:2    0         1024  0 part \n\xe2\x94\x94\xe2\x94\x80sda5                               8:5    0 249802260480  0 part \n  \xe2\x94\x94\xe2\x94\x80crypt1 (dm-0)                  252:0    0 249800163328  0 crypt\n    \xe2\x94\x9c\xe2\x94\x80elementary--vg-root (dm-1)   252:1    0 117734113280  0 lvm  \n    \xe2\x94\x94\xe2\x94\x80elementary--vg-swap_1 (dm-2) 252:2    0   2038431744  0 lvm  \nsdb                                  8:16   0 120034123776  0 disk \n\xe2\x94\x94\xe2\x94\x80sdb1                               8:17   0 120034091520  0 part  /media/ubuntu/ff08402\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们需要知道新的 crypt1 分区应该有多大,我们做一些计算:

\n\n
Calculate difference between logical volume sizes and crypt1 (from before we made any changes):\n    2038431744\n+ 247757537280\n= 249795969024\n\n  249800163328\n- 249795969024\n=      4194304\n\ncalculate the new crypt1 size (with the new changes):\n    2038431744\n+ 117734113280\n+      4194304\n= 119776739328\n\nlater we need the crypt1 size in blocks:\n  119776739328\n/          512\n=    233938944\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我们减少 crypt 卷之前,请检查卷是否有序:

\n\n
ubuntu@ubuntu:~$ sudo pvs -v --segments /dev/mapper/crypt1\n    Using physical volume(s) on command line\n  PV                 VG            Fmt  Attr PSize   PFree   Start SSize LV     Start Type   PE Ranges                    \n  /dev/mapper/crypt1 elementary-vg lvm2 a--  232.64g 121.09g     0 28070 root       0 linear /dev/mapper/crypt1:0-28069   \n  /dev/mapper/crypt1 elementary-vg lvm2 a--  232.64g 121.09g 28070 31000            0 free                                \n  /dev/mapper/crypt1 elementary-vg lvm2 a--  232.64g 121.09g 59070   486 swap_1     0 linear /dev/mapper/crypt1:59070-59555\n
Run Code Online (Sandbox Code Playgroud)\n\n

不,它们不是,所以我需要将交换移动到最佳可用空间(实际上意味着阻止 28070):

\n\n
sudo pvmove --alloc anywhere /dev/mapper/crypt1:59070-59555\n
Run Code Online (Sandbox Code Playgroud)\n\n

并重新检查您的分配,以便最后有可用空间:

\n\n
sudo pvs -v --segments /dev/mapper/crypt1\n
Run Code Online (Sandbox Code Playgroud)\n\n

设置 crypt1 的新卷大小

\n\n
sudo pvresize --setphysicalvolumesize 119776739328b /dev/mapper/crypt1\nsudo cryptsetup -b 233938944 resize crypt1\n
Run Code Online (Sandbox Code Playgroud)\n\n

继续处理分区表,卸载加密分区:

\n\n
sudo vgchange -an\nsudo cryptsetup luksClose crypt1\n
Run Code Online (Sandbox Code Playgroud)\n\n

打印并记下当前分区表布局:

\n\n
ubuntu@ubuntu:~$ sudo fdisk -l\n\nDisk /dev/sda: 250.1 GB, 250059350016 bytes\n255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors\nUnits = sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisk identifier: 0x00082d72\n\n   Device Boot      Start         End      Blocks   Id  System\n/dev/sda1   *        2048      499711      248832   83  Linux\n/dev/sda2          501758   488396799   243947521    5  Extended\n/dev/sda5          501760   488396799   243947520   83  Linux\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们需要知道,新的分区表应该有多大,我们再做一些计算:

\n\n
reverse engineering blocks setup from current /dev/sda:\n     243947521\n*         1024\n-         1024\n= 249802260480\n\nsize of other uses:\n  250059350016\n- 249802260480\n=    257089536\n\nsize for the new disk:\n  120034123776\n-    257089536\n= 119777034240\n\nblocks for new disk:\n  119777034240\n+         1024\n/         1024\n=    116969761\n\ncalculating end sector with new size:\n     488396799\n+            1\n-       501758\n/            2\n=    243947521\n\n     116969761\n*            2\n+       501758\n-            1\n=    234441279\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我们可以用新的大小重新定义分区表:

\n\n
ubuntu@ubuntu:~$ sudo fdisk /dev/sda\n\nCommand (m for help): d\nPartition number (1-5): 5\n\nCommand (m for help): d\nPartition number (1-5): 2\n\nCommand (m for help): n\nPartition type:\n   p   primary (1 primary, 0 extended, 3 free)\n   e   extended\nSelect (default p): e\nPartition number (1-4, default 2):\nUsing default value 2\nFirst sector (499712-488397167, default 499712):\nUsing default value 499712\nLast sector, +sectors or +size{K,M,G} (499712-488397167, default 488397167): 234441279\n\nCommand (m for help): n\nPartition type:\n   p   primary (1 primary, 1 extended, 2 free)\n   l   logical (numbered from 5)\nSelect (default p): l\nAdding logical partition 5\nFirst sector (501760-234441279, default 501760):\nUsing default value 501760\nLast sector, +sectors or +size{K,M,G} (501760-234441279, default 234441279):\nUsing default value 234441279\n\nCommand (m for help): p\n\nDisk /dev/sda: 250.1 GB, 250059350016 bytes\n255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors\nUnits = sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisk identifier: 0x00082d72\n\n   Device Boot      Start         End      Blocks   Id  System\n/dev/sda1   *        2048      499711      248832   83  Linux\n/dev/sda2          499712   234441279   116970784    5  Extended\n/dev/sda5          501760   234441279   116969760   83  Linux\n\nCommand (m for help): w\nThe partition table has been altered!\n\nCalling ioctl() to re-read partition table.\nSyncing disks.\n
Run Code Online (Sandbox Code Playgroud)\n\n

小测试:尝试加载新的加密卷(或在没有 livecd 的情况下重新启动)并检查是否可以访问数据(如果不能,则说明您在某个地方犯了错误,需要使用备份重新启动):

\n\n
sudo cryptsetup luksOpen /dev/sda5 crypt1\nsudo vgscan --mknodes\nsudo vgchange -ay\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过将结束块与较小磁盘的块大小进行比较来检查您的计算是否正确:

\n\n
ubuntu@ubuntu:~$ sudo fdisk /dev/sda\n\nCommand (m for help): p\n\nDisk /dev/sda: 250.1 GB, 250059350016 bytes\n255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors\nUnits = sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisk identifier: 0x00082d72\n\n   Device Boot      Start         End      Blocks   Id  System\n/dev/sda1   *        2048      499711      248832   83  Linux\n/dev/sda2          499712   234441279   116970784    5  Extended\n/dev/sda5          501760   234441279   116969760   83  Linux\n\n\nubuntu@ubuntu:~$ sudo fdisk /dev/sdb\n\nCommand (m for help): p\n\nDisk /dev/sdb: 120.0 GB, 120034123776 bytes\n255 heads, 63 sectors/track, 14593 cylinders, total 234441648 sectors\nUnits = sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisk identifier: 0x000f335e\n\n   Device Boot      Start         End      Blocks   Id  System\n/dev/sdb1              63   234441647   117220792+  83  Linux\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用新的分区表重新检查您的计算:

\n\n
/dev/sda total - sda5 end-block (in the beginning):\n  488397168\n- 488396799\n=       369\n\n/dev/sdb total - sda5 end-block (after shrink):\n  234441648\n- 234441279\n=       369\n
Run Code Online (Sandbox Code Playgroud)\n\n

很高兴可以出发,正是我们想要的尺寸。所以下一步是将 dd 从 0 增加到 234441648 (= /dev/sdb 的总大小)

\n\n
sudo dd if=/dev/sda of=/dev/sdb bs=1b count=234441648\n
Run Code Online (Sandbox Code Playgroud)\n\n

你已经准备好了,收缩完成。此 dd 命令将花费一些时间,并且您看不到任何输出。就我而言,它运行了大约 6 个小时。

\n