Изменение размера шифрованного LUKS раздела на LVM

Предупреждение!Перед проведением такой операции всегда необходимо сделать резервную копию данных.
Для проверки работоспособности механизма я создал зашифрованный раздел на машине скопировал туда два больших файла, которые заняли всесь свободный объём раздела, вычислил их контрольную сумму растянул раздел и сверил контрольную сумму.

Схема такова:

  • отмонтировать зашифрованный раздел;
  • закрыть шифрующее LUKS устройство;
  • растянуть раздел;
  • открыть шифрующее LUKS устройство;
  • растянуть шифрующее LUKS устройство;
  • проверить файловую систему
  • примонтировать зашифрованный раздел обратно

Я провожу увеличение раздела. При уменьшении раздела меняется порядок, что уменьшать в первую и во вторую очередь. Так при увеличении сначала нужно растянуть слой логического тома, затем слой устройства шифрования и только потом слой файловой системы. А при уменьшении, прежде всего необходимо уменьшить размер слоя файловой системы, затем слой шифрования, и только в конце слой логического тома.

Создание тестового раздела

Создаём LV размером 10G с именем test в группе томов VG_B01_DATA

[root@b01 ~]# lvcreate -L 10g -n test VG_B01_DATA
  Logical volume "test" created
[root@b01 ~]# lvs --unit g
  LV        VG          Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  test      VG_B01_DATA -wi-a-  10.00g                                      

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

[root@b01 ~]# cryptsetup luksFormat /dev/VG_B01_DATA/test 

WARNING!
========
This will overwrite data on /dev/VG_B01_DATA/test irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: 
Verify passphrase: 

Посмотрим что у нас получилось в дампе информации раздела.

[root@b01 ~]# cryptsetup luksDump /dev/VG_B01_DATA/test 
LUKS header information for /dev/VG_B01_DATA/test

Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 4096
MK bits:        256
MK digest:      e7 a1 2e ac d8 e4 54 a8 b3 94 45 7e 2c 44 8f 59 92 b6 e3 16 
MK salt:        9a c1 46 07 81 63 c7 f5 76 96 6a 04 5e 46 76 47 
                03 0a 43 e3 63 1c 1b ad 20 15 be a6 c1 ae c1 e7 
MK iterations:  42375
UUID:           9fdde297-58bd-497e-beee-84a036e69c57

Key Slot 0: ENABLED
        Iterations:             169843
        Salt:                   c2 b9 07 c5 39 34 52 91 9c 53 cd 1b c7 7e 8d cf 
                                6f 06 48 28 bb 8f d9 a5 80 56 06 69 7e 17 05 0f 
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Узнаем идентификатор UUID

[root@b01 ~]# cryptsetup luksUUID /dev/VG_B01_DATA/test 
9fdde297-58bd-497e-beee-84a036e69c57

И теперь откроем шифрующее LUKS устройство

[root@b01 ~]# cryptsetup luksOpen /dev/VG_B01_DATA/test 9fdde297-58bd-497e-beee-84a036e69c57
Enter passphrase for /dev/VG_B01_DATA/test: 

Посмотрим что оно активно и узнаем имя

[root@b01 ~]# dmsetup info 9fdde297-58bd-497e-beee-84a036e69c57
Name:              9fdde297-58bd-497e-beee-84a036e69c57
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      253, 8
Number of targets: 1
UUID: CRYPT-LUKS1-9fdde29758bd497ebeee84a036e69c57-9fdde297-58bd-497e-beee-84a036e69c57

Теперь создадим файловую систему ext4.

[root@b01 ~]# mkfs.ext4 /dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2620928 blocks
131046 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Отключим автопроверку файловой системы. Я всегда проверку делаю руками.

[root@b01 ~]# tune2fs -i 0 -c 0 /dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds

И примонтируем наше криптоустройство к дереву файловой системы

[root@b01 mnt]# mount /dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57 /mnt/test 

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

[root@b01 test]# cd /mnt/test
[root@b01 test]# cp /mnt/data/VG_S01_0-ROOT-2014-01-30-09-02-02.gz ./
[root@b01 test]# cp /mnt/data/VG_S01_0-ROOT-2014-11-01-10-27-41.gz ./
[root@b01 test]# md5sum * > test.md5

На этом подготовка экспериментального раздела завершена.

Увеличение размера

Отмонтируем раздел

[root@b01 mnt]# umount /mnt/test 

Глянем что шифрующее устройство активно

[root@b01 mnt]# dmsetup info 9fdde297-58bd-497e-beee-84a036e69c57
Name:              9fdde297-58bd-497e-beee-84a036e69c57
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      253, 8
Number of targets: 1
UUID: CRYPT-LUKS1-9fdde29758bd497ebeee84a036e69c57-9fdde297-58bd-497e-beee-84a036e69c57

Посмотрим размер в секторах и устройство которое будем растягивать.

[root@b01 mnt]# cryptsetup status 9fdde297-58bd-497e-beee-84a036e69c57
/dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57 is active.
  type:  LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/mapper/VG_B01_DATA-test
  offset:  4096 sectors
  size:    20967424 sectors
  mode:    read/write

До увеличения имеем размер 20967424 сектора.
А устройство лежащее ниже это /dev/mapper/VG_B01_DATA-test
Отключим шифрующее LUKS устройство и проверим что отключилось

[root@b01 mnt]# cryptsetup luksClose 9fdde297-58bd-497e-beee-84a036e69c57
[root@b01 mnt]# cryptsetup status 9fdde297-58bd-497e-beee-84a036e69c57
/dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57 is inactive.

Растягиваем на +10g раздел /dev/mapper/VG_B01_DATA-test он же /dev/VG_B01_DATA/test

[root@b01 mnt]# lvextend -L +10g /dev/VG_B01_DATA/test 
  Extending logical volume test to 20.00 GiB
  Logical volume test successfully resized

Смотрим размер

[root@b01 mnt]# lvs --unit g
  LV        VG          Attr   LSize    Origin Snap%  Move Log Copy%  Convert
  test      VG_B01_DATA -wi-a-   20.00g                                      

Было 10g стало 20g.
Открываем LUKS устройство

[root@b01 ~]# cryptsetup luksOpen /dev/VG_B01_DATA/test 9fdde297-58bd-497e-beee-84a036e69c57
Enter passphrase for /dev/VG_B01_DATA/test: 

И растягиваем его на весь физический размер лежащего ниже логического тома

[root@b01 ~]# cryptsetup --verbose resize 9fdde297-58bd-497e-beee-84a036e69c57
Command successful.

Смотрим сколько секторов получилось

[root@b01 ~]# cryptsetup status 9fdde297-58bd-497e-beee-84a036e69c57
/dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57 is active.
  type:  LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/mapper/VG_B01_DATA-test
  offset:  4096 sectors
  size:    41938944 sectors
  mode:    read/write

Было 20967424 сектора стало 41938944
Проверим что он монтируется без ошибки. И сразу отмонтируем.

[root@b01 ~]# mount /dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57 /mnt/test
[root@b01 ~]# umount /mnt/test

Проверим файловую систему

[root@b01 ~]# e2fsck -f /dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57
e2fsck 1.41.12 (17-May-2010)
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/9fdde297-58bd-497e-beee-84a036e69c57: 13/655360 files (0.0% non-contiguous), 1028187/2620928 blocks

Увеличим размер файловой системы до размера лежащего на уровень ниже устройства.

[root@b01 ~]# resize2fs /dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57 to 5242368 (4k) blocks.
The filesystem on /dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57 is now 5242368 blocks long.

Примонтируем и посмотрим размер полный, занятый и свободный

[root@b01 ~]# mount /dev/mapper/9fdde297-58bd-497e-beee-84a036e69c57 /mnt/test
[root@b01 ~]# df -h
Filesystem                          Size  Used Avail Use% Mounted on
/dev/dm-8                            20G  3.8G   15G  21% /mnt/test

Проверим контрольные суммы файлов.

[root@b01 test]# cd /mnt/test
[root@b01 test]# md5sum -c /mnt/test.md5 
VG_S01_0-ROOT-2014-01-30-09-02-02.gz: OK
VG_S01_0-ROOT-2014-11-01-10-27-41.gz: OK

Готово.

Leave a Reply