Расширение LVM раздела для виртуальной машины Hyper-V Gen2
Короткая заметка про одну конкретную задачу. Допустим вы используете систему виртуализации Hyper-V и виртуальную машину второго поколения (UEFI, GPT и SCSI-диски) с операционной системой Linux и диском или дисками, размеченными с использованием LVM. И вот в один не самый прекрасный момент система мониторинга показывает вам, что место на диске заканчивается, удалять нечего и надо расширить диск, разумеется без остановки системы.
В случае с Windows процесс максимально простой и выполняется либо в пару кликов мышки, либо в пару команд PowerShell. При использовании стандартных разделов Linux в ряде случаев вообще не обойтись без перезагрузки, а вот в случае с LVM перезагрузка точно не потребуется, но процесс усложняет необходимость работы с fdisk, который плохо скриптуется и требует интерактивного ввода в собственной консоли.
Если разделить процесс на этапы, то шаги получаются следующие:
- Разворачиваем диск средствами Hyper-V.
- Обновляем сведения о размере диска внутри ОС.
- Удаляем старые метаданные о разделе и создаём их заново.
- Расширяем PV.
- Расширяем LV.
- Расширяем файловую систему.
Ничего сложного, но суеты действительно много. Давайте рассмотрим каждый шаг более подробно на примере 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
Если вы знаете более простой и быстрый способ — делитесь в комментариях, буду благодарен. Удачного расширения и не пропускайте алерты от мониторинга!