Расширение LVM раздела для виртуальной машины Hyper-V Gen2

Короткая заметка про одну конкретную задачу. Допустим вы используете систему виртуализации Hyper-V и виртуальную машину второго поколения (UEFI, GPT и SCSI-диски) с операционной системой Linux и диском или дисками, размеченными с использованием LVM. И вот в один не самый прекрасный момент система мониторинга показывает вам, что место на диске заканчивается, удалять нечего и надо расширить диск, разумеется без остановки системы.

В случае с Windows процесс максимально простой и выполняется либо в пару кликов мышки, либо в пару команд PowerShell. При использовании стандартных разделов Linux в ряде случаев вообще не обойтись без перезагрузки, а вот в случае с LVM перезагрузка точно не потребуется, но процесс усложняет необходимость работы с fdisk, который плохо скриптуется и требует интерактивного ввода в собственной консоли.

Если разделить процесс на этапы, то шаги получаются следующие:

  1. Разворачиваем диск средствами Hyper-V.
  2. Обновляем сведения о размере диска внутри ОС.
  3. Удаляем старые метаданные о разделе и создаём их заново.
  4. Расширяем PV.
  5. Расширяем LV.
  6. Расширяем файловую систему.

Ничего сложного, но суеты действительно много. Давайте рассмотрим каждый шаг более подробно на примере Debian 10 и увеличении диска sda со 150 до 300 ГБ. Расширять будем основной LV, который находится на разделе sda3. На разворачивании диска через Hyper-V останавливаться не будем, с этим как раз никаких сложностей обычно не возникает. Далее подключаемся к консоли и с правами администратора выполняем следующие команды

# lsblk
NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                            8:0    0   150G  0 disk
├─sda1                         8:1    0   512M  0 part /boot/efi
├─sda2                         8:2    0   488M  0 part /boot
└─sda3                         8:3    0   149G  0 part
  ├─zabbix1--vg-root   254:0    0 147.1G  0 lvm  /
  └─zabbix1--vg-swap_1 254:1    0   976M  0 lvm  [SWAP]
sr0                           11:0    1  1024M  0 rom

Эта команда показывает нам все диски и разделы. Нам нужно понять, какой диск и раздел предстоит расширить. В данном примере, как я уже писал выше, это sda и sda3. Посмотрим на него программой fdisk:

# fdisk /dev/sda

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk /dev/sda: 150 GiB, 161061273600 bytes, 314572800 sectors
Disk model: Virtual Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 674C885D-A7D2-4AE2-9F3D-1298CD47B821

Device       Start       End   Sectors  Size Type
/dev/sda1     2048   1050623   1048576  512M EFI System
/dev/sda2  1050624   2050047    999424  488M Linux filesystem
/dev/sda3  2050048 314570751 312520704  149G Linux LVM

Command (m for help): q

Если размер диска ещё не обновился, даём команду на принудительное перечтение атрибутов:

echo '1' > /sys/class/scsi_disk/0\\:0\\:0\\:0/device/rescan

Снова проверяем инфу через fdisk:

# fdisk /dev/sda

Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

**GPT PMBR size mismatch (314572799 != 629145599) will be corrected by write.
The backup GPT table is not on the end of the device. This problem will be corrected by write.**

Command (m for help): p

Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 sectors
Disk model: Virtual Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 674C885D-A7D2-4AE2-9F3D-1298CD47B821

Device       Start       End   Sectors  Size Type
/dev/sda1     2048   1050623   1048576  512M EFI System
/dev/sda2  1050624   2050047    999424  488M Linux filesystem
/dev/sda3  2050048 314570751 312520704  149G Linux LVM

Отлично, теперь надо удалить раздел sda3 и создать его заново. Данные при этом останутся нетронутыми, главное не ошибиться и сделать всё правильно. Не выходим из интерпретатора fdisk, продолжаем:

Command (m for help): d
Partition number (1-3, default 3): 3

Partition 3 has been deleted.

Command (m for help): n
Partition number (3-128, default 3): 3
First sector (2050048-629145566, default 2050048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2050048-629145566, default 629145566):

Created a new partition 3 of type 'Linux filesystem' and of size 299 GiB.
Partition #3 contains a LVM2_member signature.

Do you want to remove the signature? [Y]es/[N]o: n

Command (m for help): t
Partition number (1-3, default 3): 3
Partition type (type L to list all types): 8e

Type of partition 3 is unchanged: Linux filesystem.

Command (m for help): w
The partition table has been altered.
Syncing disks.

Расширяем PV:

# pvresize /dev/sda3

Расширяем LV:

# lvdisplay
File descriptor 6 (/dev/pts/2) leaked on lvdisplay invocation. Parent PID 80637: -bash
  --- Logical volume ---
  LV Path                /dev/zabbix1-vg/root
  LV Name                root
  VG Name                zabbix1-vg
  LV UUID                TkvAkW-cH81-iTRJ-DYeL-OpWt-dMff-vJdJD2
  LV Write Access        read/write
  LV Creation host, time zabbix1, 2021-01-26 13:04:49 +0300
  LV Status              available
  # open                 1
  LV Size                <147.07 GiB
  Current LE             37649
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0

  --- Logical volume ---
  LV Path                /dev/zabbix1-vg/swap_1
  LV Name                swap_1
  VG Name                zabbix1-vg
  LV UUID                qo2J5U-mzWW-N0Hu-2Mt7-r9pw-et0A-V3qeI4
  LV Write Access        read/write
  LV Creation host, time zabbix1, 2021-01-26 13:04:49 +0300
  LV Status              available
  # open                 2
  LV Size                976.00 MiB
  Current LE             244
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1
# lvextend -l +100%FREE /dev/zabbix1-vg/root
Size of logical volume zabbix1-vg/root changed from <147.07 GiB (37649 extents) to <298.07 GiB (76305 extents).
  Logical volume zabbix1-vg/root successfully resized.

И в конце расширяем файловую систему:

# resize2fs /dev/zabbix1-vg/root

Проверяем через lsblk или df, что всё получилось:

# lsblk
NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                            8:0    0   300G  0 disk
├─sda1                         8:1    0   512M  0 part /boot/efi
├─sda2                         8:2    0   488M  0 part /boot
└─sda3                         8:3    0   299G  0 part
  ├─zabbix1--vg-root   254:0    0 298.1G  0 lvm  /
  └─zabbix1--vg-swap_1 254:1    0   976M  0 lvm  [SWAP]
sr0                           11:0    1  1024M  0 rom

# df -hT
Filesystem                         Type      Size  Used Avail Use% Mounted on
udev                               devtmpfs  5.9G     0  5.9G   0% /dev
tmpfs                              tmpfs     1.2G   24M  1.2G   2% /run
/dev/mapper/zabbix1--vg-root       ext4      294G   90G  192G  32% /
tmpfs                              tmpfs     5.9G  216K  5.9G   1% /dev/shm
tmpfs                              tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs                              tmpfs     5.9G     0  5.9G   0% /sys/fs/cgroup
/dev/sda2                          ext2      473M   85M  364M  19% /boot
/dev/sda1                          vfat      511M  5.2M  506M   2% /boot/efi
tmpfs                              tmpfs     1.2G     0  1.2G   0% /run/user/1959789722
tmpfs                              tmpfs     1.2G     0  1.2G   0% /run/user/1959790102

Если вы знаете более простой и быстрый способ — делитесь в комментариях, буду благодарен. Удачного расширения и не пропускайте алерты от мониторинга!

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *