воскресенье, 25 ноября 2018 г.

Перенос системы с HDD на SSD меньшего размера

Очередной апгрейд железа в виде замены HDD на SSD в ноутбуке. Просто скопировать разделы со старого диска на новый не получится, т.к. размер разделов на HDD превышает объем SSD. Ситуацию осложняет наличие томов lvm2 поверх dm-crypt и просто так данные перенести не выйдет. Но благодаря интернету нашлось решение.

Размер диска SSD 240G (223G если быть точным)

root@0:~# fdisk -l /dev/sda
Disk /dev/sda: 223.6 GiB, 240057409536 bytes, 468862128 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

а размер HDD 500G, но используется примерно 233G, что на 10G больше емкости SSD диска

 
root@0:~# fdisk -l /dev/sdb
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 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: 0x0003bb0b

Device     Boot  Start       End   Sectors   Size Id Type
/dev/sdb1  *      2048    487423    485376   237M 83 Linux
/dev/sdb2       487424 488396799 487909376 232.7G 83 Linux

На HDD используется LVM поверх LUKS и просто изменить размер второго раздела не получится. Сниму образ диска, чтобы уже в нем безопасно изменить размер разделов. Если что-то пойдет не так, то достаточно поставить HDD обратно и продолжить работу.

root@0:~# mount -t cifs //192.168.1.1/share /mnt -o guest
root@tty1:~# pv -s 240g -S < /dev/sdb > /mnt/hdd_backup.bin bs=1M count=240000
 101GiB 0:44:14 [38.1MiB/s] [==============>                 ] 43% ETA 0:59:07

Для изменения размера разделов буду использовать инструкцию Resizing LVM-on-LUKS из wiki ArchLinux. Уменьшать размер разделов нужно в определенном порядке (файловая система -> логический том LVM -> физический том LVM -> размер данных LUKS -> раздел LUKS). Если изменить порядок или что-то пропустить, то можно превратить данные в кашу.

Устанавливаю в ноутбук SSD, а старый HDD подключаю через USB-SATA адаптер (/dev/sdb). Загружаюсь с LiveCD (Finnix), монтирую по сети домашнюю файлопомойку и делаю образ HDD диска (только размер данных с небольшим запасом)

root@0:~# mount -t cifs //192.168.1.50/share /mnt -o guest
root@0:~# pv -s 250G -S < /dev/sdb > /mnt/hdd_backup.bin

Теперь старый HDD можно отключить и убрать на полку.

root@0:~# eject /dev/sdb

Подключаю файл с образом диска и создаю устройства для каждого раздела

root@0:~# losetup --find --show /mnt/hdd_backup.bin
/dev/loop1

root@0:~# kpartx -a /dev/loop1

Открываю LUKS раздел и проверяю его статус

root@0:~# cryptsetup luksOpen /dev/mapper/loop1p2 loop1_crypt
Enter passphrase for /dev/mapper/loop1p2:

root@0:~# cryptsetup status loop1_crypt
/dev/mapper/loop1_crypt is active.
  type:    LUKS1
  cipher:  aes-xts-plain64
  keysize: 512 bits
  device:  /dev/mapper/loop1p2
  offset:  4096 sectors
  size:    487905280 sectors
  mode:    read/write

Теперь сканирую доступность групп томов LVM

root@0:~# vgscan 
  Reading all physical volumes.  This may take a while...
  Found volume group "steshan" using metadata type lvm2

Искомая группа 'steshan' нашлась - активируем ее

root@0:~# vgchange -ay
  3 logical volume(s) in volume group "steshan" now active

Теперь блочные устройства выглядят правильно и можно приступать к изменению размера

root@0:~# lsblk /dev/loop1 
NAME                 MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
loop1                  7:1    0   240G  0 loop  
├─loop1p1            254:0    0   237M  0 part  
└─loop1p2            254:1    0 232.7G  0 part  
  └─loop1_crypt      254:2    0 232.7G  0 crypt 
    ├─steshan-rootfs 254:3    0    14G  0 lvm   
    ├─steshan-swap   254:4    0     6G  0 lvm   
    └─steshan-home   254:5    0 186.3G  0 lvm

Но сначала нужно проверить файловые системы на наличие ошибок

root@0:~# fsck -Cf /dev/steshan/rootfs 
fsck from util-linux 2.26.2
e2fsck 1.42.13 (17-May-2015)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure                                           
Pass 3: Checking directory connectivity                                        
Pass 4: Checking reference counts
Pass 5: Checking group summary information                                     
/dev/mapper/steshan-rootfs: 212139/915712 files (0.5% non-contiguous), 1989447/3661824 blocks

root@0:~# fsck -Cf /dev/steshan/home 
fsck from util-linux 2.26.2
e2fsck 1.42.13 (17-May-2015)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure                                           
Pass 3: Checking directory connectivity                                        
Pass 4: Checking reference counts
Pass 5: Checking group summary information                                     
/dev/mapper/steshan-home: 106361/12214272 files (2.2% non-contiguous), 24456249/48827392 blocks

Ошибок нет, уменьшаю размер файловой системы /home до 140G

root@0:~# resize2fs -p /dev/steshan/home 140G
resize2fs 1.42.13 (17-May-2015)
Resizing the filesystem on /dev/steshan/home to 36700160 (4k) blocks.
Begin pass 2 (max = 5761427)
Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 1491)
Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 8200)
Updating inode references     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/steshan/home is now 36700160 (4k) blocks long.

На всякий случай проверю целостность еще раз

root@0:~# fsck -Cf /dev/steshan/home 
fsck from util-linux 2.26.2
e2fsck 1.42.13 (17-May-2015)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure                                           
Pass 3: Checking directory connectivity                                        
Pass 4: Checking reference counts
Pass 5: Checking group summary information                                     
/dev/mapper/steshan-home: 106361/9175040 files (2.3% non-contiguous), 24265588/36700160 blocks

Деактивирую логический том на котором расположена файловая система /home и уменьшаю его размер до 141G (на 1G больше размера файловой системы)

root@0:~# lvchange -an /dev/steshan/home

root@0:~# lvresize -L 141G /dev/steshan/home 
  Size of logical volume steshan/home changed from 186.26 GiB (47683 extents) to 141.00 GiB (36096 extents).
  Logical volume home successfully resized

Теперь можно уменьшить размер физического тома до 162G (с большим запасом)

root@0:~# pvs
  PV                      VG      Fmt  Attr PSize   PFree 
  /dev/mapper/loop1_crypt steshan lvm2 a--  232.65g 71.68g

root@0:~# pvresize --setphysicalvolumesize 162G /dev/mapper/loop1_crypt 
  /dev/mapper/loop1_crypt: cannot resize to 42239 extents as later ones are allocated.
  0 physical volume(s) resized / 1 physical volume(s) not resized

Упс, произошла ошибка т.к. часть данных логического тома расположена за границей нового размера физического тома. Сначала нужно переместить эти данные в другое место

root@0:~# pvmove --alloc anywhere /dev/mapper/loop1_crypt:41472-59557
  /dev/mapper/loop1_crypt: Moved: 16.0%
  /dev/mapper/loop1_crypt: Moved: 48.4%
  /dev/mapper/loop1_crypt: Moved: 75.6%
  /dev/mapper/loop1_crypt: Moved: 100.0%

Прошло без ошибок и теперь можно попробовать уменьшить размер физического тома снова.

root@0:~# pvresize --setphysicalvolumesize 162G /dev/mapper/loop1_crypt
  Physical volume "/dev/mapper/loop1_crypt" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized

Физический том уменьшил, а теперь пора изменить размер области, которую использует cryptsetup (163 * 1024 * 1024 * 1024 / 512 = 341835776). Ее итоговый размер должен быть 341835776 сектор.

root@0:~# cryptsetup -b 341835776 resize loop1_crypt

В последнюю очередь уменьшаем размер раздела

root@0:~# parted /dev/loop1
GNU Parted 3.2
Using /dev/loop1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)

(parted) unit s

(parted) resizepart 2                                                     
End?  [318359375s]? 341835776s                                            
(parted) print                                                            
Model: Loopback device (loopback)
Disk /dev/loop1: 503316480s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start    End         Size        Type     File system  Flags
 1      2048s    487423s     485376s     primary  ext4         boot
 2      487424s  341835776s  341348353s  primary

(parted)

Изменение размера завершено, теперь можно отключить LVM и закрыть LUKS. Заключительным этапом станет копирование данных из образа на SSD диск.

root@0:~# vgchange -an
  0 logical volume(s) in volume group "steshan" now active

root@0:~# cryptsetup luksClose loop1_crypt

root@0:~# kpartx -d /dev/loop1

root@0:~# pv -s 180g -S < /dev/loop1 > /dev/sda

Загрузка с SSD прошла без ошибок. Аналогично делается изменение в большую сторону чтобы максимально использовать емкость SSD. Но порядок будет обратный.

Комментариев нет:

Отправить комментарий