Линукс клонированный зашифрованный диск на диск меньшего размера

Я хочу обновить диск моего ноутбука с большей скоростью, поэтому я хочу клонировать мой текущий жесткий диск в 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  

Разве это не лучший способ уменьшить текущие разделы жесткого диска, используя livecd, до точного размера, который может обработать sdd, и затем перезаписать его? Какие команды мне нужно использовать?

1 ответ

Решение

Я собираюсь ответить на вопрос сам, но общее замечание:возможно, быстрее всего начать с нуля, шаги сложны и требуют много времени!

  • Сделайте резервную копию, используя ваш любимый инструмент клонирования дисков / резервного копирования
  • Следуйте статье в Ubuntu Wiki о ResizeEncryptedPartions
  • Убедитесь, что разделы точно соответствуют размеру вашего меньшего диска (чтобы свободное пространство после последнего раздела не было выделено)
  • клонировать ваш диск с помощью dd до точного размера

детализированный

  • /dev/sda - мой текущий диск, который я хочу сжать
  • /dev/sdb - мой новый диск
  • Используйте ваши точные значения для ваших размеров дисков, размеров блоков и т. Д., Мои расчеты лишь немного подсказывают, как я это сделал.
  • будьте осторожны с параметром параметров (например, b иногда означает байты, иногда означает блоки и т. д.). Всегда проверяйте man-страницу в первую очередь.
  • Проверьте связанную статью выше для некоторой дополнительной информации о разумных шагах

Загрузите livecd, загрузите модули, расшифруйте ваш диск, найдите разделы:

sudo modprobe dm-crypt
sudo cryptsetup luksOpen /dev/sda5 crypt1
sudo vgscan --mknodes
sudo vgchange -ay

распечатать текущий макет раздела с размерами в байтах:

ubuntu@ubuntu:~$ lsblk -b

NAME                               MAJ:MIN RM         SIZE RO TYPE  MOUNTPOINT
sda                                  8:0    0 250059350016  0 disk 
├─sda1                               8:1    0    254803968  0 part 
├─sda2                               8:2    0         1024  0 part 
└─sda5                               8:5    0 249802260480  0 part 
  └─crypt1 (dm-0)                  252:0    0 249800163328  0 crypt
    ├─elementary--vg-root (dm-1)   252:1    0 247757537280  0 lvm  
    └─elementary--vg-swap_1 (dm-2) 252:2    0   2038431744  0 lvm  
sdb                                  8:16   0 120034123776  0 disk 
└─sdb1                               8:17   0 120034091520  0 part  /media/ubuntu/ff08402

Нам нужно знать, какой размер должен иметь новый корневой раздел, сделаем некоторые вычисления:

find how much space is used without root:
  250059350016
- 247757537280
=   2301812736

calculate new wished size from the new disk:
  120034123776
-   2301812736
= 117732311040

Since we can specify it only in kibibytes, we divide it by 1024
  117732311040
/         1024
=    114972960

Измените размер вашего раздела, используя resize2fs (у меня ext4):

sudo resize2fs -p /dev/mapper/elementary--vg-root 114972960k

Установите логический том на рассчитанный размер:

sudo lvreduce -L 114972960k /dev/mapper/elementary--vg-root

Напечатайте новую настройку раздела, нам понадобятся некоторые значения оттуда:

ubuntu@ubuntu:~$ lsblk -b
NAME                               MAJ:MIN RM         SIZE RO TYPE  MOUNTPOINT
sda                                  8:0    0 250059350016  0 disk 
├─sda1                               8:1    0    254803968  0 part 
├─sda2                               8:2    0         1024  0 part 
└─sda5                               8:5    0 249802260480  0 part 
  └─crypt1 (dm-0)                  252:0    0 249800163328  0 crypt
    ├─elementary--vg-root (dm-1)   252:1    0 117734113280  0 lvm  
    └─elementary--vg-swap_1 (dm-2) 252:2    0   2038431744  0 lvm  
sdb                                  8:16   0 120034123776  0 disk 
└─sdb1                               8:17   0 120034091520  0 part  /media/ubuntu/ff08402

Нам нужно знать, какой размер должен иметь новый раздел crypt1, сделаем некоторые вычисления:

Calculate difference between logical volume sizes and crypt1 (from before we made any changes):
    2038431744
+ 247757537280
= 249795969024

  249800163328
- 249795969024
=      4194304

calculate the new crypt1 size (with the new changes):
    2038431744
+ 117734113280
+      4194304
= 119776739328

later we need the crypt1 size in blocks:
  119776739328
/          512
=    233938944

Прежде чем мы сможем уменьшить объем склепа, проверьте, в порядке ли объемы:

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

Нет, это не так, поэтому мне нужно было перенести своп в лучшее свободное место (на самом деле это значит заблокировать 28070):

sudo pvmove --alloc anywhere /dev/mapper/crypt1:59070-59555

И еще раз проверьте ваше распределение, чтобы освободить место в конце:

sudo pvs -v --segments /dev/mapper/crypt1

установить новый размер тома для crypt1

sudo pvresize --setphysicalvolumesize 119776739328b /dev/mapper/crypt1
sudo cryptsetup -b 233938944 resize crypt1

Продолжите с таблицей разделов, для этого выгрузите зашифрованный раздел:

sudo vgchange -an
sudo cryptsetup luksClose crypt1

Распечатайте и запишите где-нибудь свой текущий формат таблицы разделов:

ubuntu@ubuntu:~$ sudo fdisk -l

Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 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
Disk identifier: 0x00082d72

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          501758   488396799   243947521    5  Extended
/dev/sda5          501760   488396799   243947520   83  Linux

Нам нужно знать, какой размер должна иметь новая таблица разделов, мы снова проведем некоторые вычисления:

reverse engineering blocks setup from current /dev/sda:
     243947521
*         1024
-         1024
= 249802260480

size of other uses:
  250059350016
- 249802260480
=    257089536

size for the new disk:
  120034123776
-    257089536
= 119777034240

blocks for new disk:
  119777034240
+         1024
/         1024
=    116969761

calculating end sector with new size:
     488396799
+            1
-       501758
/            2
=    243947521

     116969761
*            2
+       501758
-            1
=    234441279

Теперь мы можем переопределить таблицу разделов новыми размерами:

ubuntu@ubuntu:~$ sudo fdisk /dev/sda

Command (m for help): d
Partition number (1-5): 5

Command (m for help): d
Partition number (1-5): 2

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e
Partition number (1-4, default 2):
Using default value 2
First sector (499712-488397167, default 499712):
Using default value 499712
Last sector, +sectors or +size{K,M,G} (499712-488397167, default 488397167): 234441279

Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (501760-234441279, default 501760):
Using default value 501760
Last sector, +sectors or +size{K,M,G} (501760-234441279, default 234441279):
Using default value 234441279

Command (m for help): p

Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 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
Disk identifier: 0x00082d72

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          499712   234441279   116970784    5  Extended
/dev/sda5          501760   234441279   116969760   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Небольшой тест: попробуйте загрузить новый зашифрованный том (или перезагрузиться без livecd) и проверить, можете ли вы получить доступ к данным (если вы не можете, вы где-то допустили ошибку и вам нужно перезапустить ее, используя резервную копию):

sudo cryptsetup luksOpen /dev/sda5 crypt1
sudo vgscan --mknodes
sudo vgchange -ay

Проверьте правильность своих расчетов, сравнив конечный блок с размером блока вашего меньшего диска:

ubuntu@ubuntu:~$ sudo fdisk /dev/sda

Command (m for help): p

Disk /dev/sda: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 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
Disk identifier: 0x00082d72

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          499712   234441279   116970784    5  Extended
/dev/sda5          501760   234441279   116969760   83  Linux


ubuntu@ubuntu:~$ sudo fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders, total 234441648 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
Disk identifier: 0x000f335e

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1              63   234441647   117220792+  83  Linux

перепроверьте свои расчеты с новой таблицей разделов:

/dev/sda total - sda5 end-block (in the beginning):
  488397168
- 488396799
=       369

/dev/sdb total - sda5 end-block (after shrink):
  234441648
- 234441279
=       369

было хорошо идти, именно тот размер, который мы хотим. поэтому следующим шагом будет дд от 0 до 234441648 (= общий размер /dev/sdb)

sudo dd if=/dev/sda of=/dev/sdb bs=1b count=234441648

И ты готов, сожми полный. Эта команда дд займет некоторое время, и вы не увидите никакого вывода. В моем случае это длилось около 6 часов.

Другие вопросы по тегам