Приветствую, меня зовут Иван, я системный администратор. Решил попробовать писать такие вот заметки на задачи, которые делаю редко, чтобы потом вспомнить, если понадобится. Надеюсь и ещё кому-то пригодится.

Все пути и имена разделов мои, меняйте соответственно на своё. Все действия на свой страх и риск, делайте бэкапы.

Задача следующая. Есть виртуалка, к ней подключен виртуальный диск, на нём система Debian 10, разметка сделана автоматически с LVM, отдельные разделы /var, /tmp, /home и т.д. Требуется расширить существующий раздел /root не добавляя дополнительный том в LVM

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

root@ElasticLog:~# lvs
  LV     VG            Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home   ElasticLog-vg -wi-ao---- <165,45g
  root   ElasticLog-vg -wi-ao----    4,03g
  swap_1 ElasticLog-vg -wi-ao----  976,00m
  tmp    ElasticLog-vg -wi-ao----  364,00m
  var    ElasticLog-vg -wi-ao----   15,00g

Пункт 1. Увеличение размера диска средствами VM

Этот пункт зависит от используемой вами VM и типа виртуального диска, так что я опишу только свой пример.

Для начала отключаем виртуалку и увеличиваем размер виртуального диска. У меня она на VirtualBox, диск динамический .vhd. Так же, насколько помню, без проблем изменяется динамический .vdi, с другими не подскажу.

Для примера увеличим с 200 до 250 Гб.
Для примера увеличим с 200 до 250 Гб.

Пункт 2. Увеличение раздела средствами системы

После этого мы видим, что в системе "физический" том sda увеличился

Наш раздел LVM - sda5, но есть нюансы, о них ниже

root@ElasticLog:~# lsblk -l
NAME                  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                     8:0    0   250G  0 disk
sda1                    8:1    0   487M  0 part /boot
sda2                    8:2    0     1K  0 part
sda5                    8:5    0 185,8G  0 part
sr0                    11:0    1  1024M  0 rom
ElasticLog--vg-root   254:0    0     4G  0 lvm  /
ElasticLog--vg-swap_1 254:1    0   976M  0 lvm  [SWAP]
ElasticLog--vg-var    254:2    0    15G  0 lvm  /var
ElasticLog--vg-tmp    254:3    0   364M  0 lvm  /tmp
ElasticLog--vg-home   254:4    0 165,5G  0 lvm  /home

Я использовал утилиту parted, так как она меняет размер без размонтирования, соответственно корневой раздел меняется без лишних заморочек.

Gparted тоже весьма удобно, но только если у вас есть графическая оболочка, либо если вы загрузились с соответствующего LiveCD. (описывать изменение раздела в gparted я не буду, там всё просто, разберётесь.)

Если у вас таблица разделов MBR - разметка будет похожа на мою, и раздел lvm sda5 будет находиться внутри расширенного раздела sda2, поэтому чтобы нам увеличить sda5 нужно будет сначала увеличить sda2

Ести таблица у вас GPT - расширенного раздела скорее всего не будет, так что просто увеличиваем раздел с флагом LVM.

Команда p показывает нам текущий список разделов.

Размер меняется командой

resizepart [номер раздела]

Указать можно как итоговый желаемый раздел диска (250gb например) так и размер в процентах (100%) - то есть использовать всё свободное пространство. Для примера ниже я показал оба варианта.

Выходим из parted командой q

root@ElasticLog:~# parted /dev/sda
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 268GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number  Start   End    Size   Type      File system  Flags
1      1049kB  512MB  511MB  primary   ext2         boot
2      513MB   200GB  199GB  extended
5      513MB   200GB  199GB  logical                lvm
(parted) resizepart 2
End?  [200GB]? 250gb
(parted) resizepart 5
End?  [200GB]? 100%
(parted) q
Information: You may need to update /etc/fstab.

Пункт 3. Увеличение LVM разделов

LVM ещё не знает, что размер её "физического" раздела увеличился. Подсказать можно командой:

pvresize [путь к устройству]

После этого можно посмотреть через утилиту pvs, что появилось свободное место в колонке PFree (там было ноль)

root@ElasticLog:~# pvresize /dev/sda5
Physical volume "/dev/sda5" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
root@ElasticLog:~# pvs
PV         VG            Fmt  Attr PSize   PFree
/dev/sda5  ElasticLog-vg lvm2 a--  232,35g <46,57g

Путь к разделу состоит из /dev/[имя группы разделов]/[имя раздела]. Где LV - имя раздела, VG - имя группы разделов. Посмотреть можно командой lvs

Затем увеличиваем размер интересующего нас логического раздела командой.

lvresize --resizefs --size 15g /dev/ElasticLog-vg/root

можно изменять размер не обязательно на конкретное значение, а допустим +15g или -15g

root@ElasticLog:~# lvresize --resizefs --size 15g /dev/ElasticLog-vg/root
Size of logical volume ElasticLog-vg/root changed from 4,03 GiB (1032 extents) to 15,00 GiB (3840 extents).
Logical volume ElasticLog-vg/root successfully resized.
resize2fs 1.44.5 (15-Dec-2018)
Filesystem at /dev/mapper/ElasticLog--vg-root is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/mapper/ElasticLog--vg-root is now 3932160 (4k) blocks long.

Через lvs мы видим тут, что раздел root увеличился до 15 ГБ.

root@ElasticLog:~# lvs
LV     VG            Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
home   ElasticLog-vg -wi-ao---- <165,45g
root   ElasticLog-vg -wi-ao----   15,00g
swap_1 ElasticLog-vg -wi-ao----  976,00m
tmp    ElasticLog-vg -wi-ao----  364,00m
var    ElasticLog-vg -wi-ao----   15,00g

В целом на этом всё. Если я что-то упустил, либо вы знаете способы лучше - с радостью поправлю статью.

Комментарии (11)


  1. evros
    04.02.2022 15:54

    Увеличить не проблема. А вот шринкануть и сжать - боль, печать. Особенно lvm с zfs...


    1. hvostpingvina Автор
      04.02.2022 16:42

      а подскажите пожалуйста зачем lvm под zfs? А по поводу сжатия соглашусь. Больно, что на той же винде это делается в 2 клика без всяких размонтирований, а на линуксе до сих пор проблема.


      1. evros
        06.02.2022 19:28

        Как пример Битрикс24 готовая виртуальная машина. Centos 6


  1. gyzess
    04.02.2022 16:13

    В большинстве случаев можно просто воспользоваться утилитой https://github.com/rekby/fsextender, которая сделает всё тоже самое сама


    1. hvostpingvina Автор
      04.02.2022 16:33

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

      ну в итоге я добавил его в группу вручную, в принципе всё нормально, но смысл?


  1. Stillgray
    05.02.2022 04:32

    либо вы знаете способы лучше

    Не использовать LVM в виртуальной среде.
    Пока не встретил ни одного случая, когда использование LVM в виртуальной среде было бы оправданным.


    1. hvostpingvina Автор
      05.02.2022 12:06

      Разумно, я подумываю вообще его стараться не использовать, zfs есть в конце концов, но бывают случаи когда это было сделано когда то непонятно кем :)


  1. vmikhalskyi
    05.02.2022 12:01

    Я правильно понимаю что после всего сделанного нужно так же увеличить раздел файловой системы (resize2fs, xfs_growfs), чтобы в df -h все корректно отображалось?


    1. hvostpingvina Автор
      05.02.2022 12:03

      Ну с ext4 команда lvresize --resizefs это делает сама, не знаю со всеми ли файловыми системами это так работает, надо кстати будет протестить


  1. mrbald
    05.02.2022 14:50

    Своп не забыли отключить/перенести/включить? Он там в конце обычно.


    1. hvostpingvina Автор
      07.02.2022 08:51

      Своп на одном из разделов внутри lvm, так что не вижу необходимости его трогать, или я что то не знаю?