LVM - andyceo/documentation GitHub Wiki

LVM: Logical Volume Manager

Устройство LVM и терминология

sda1     sda2     sdb     sdc       <-- PV
 |        |        |       |
 |        |        |       |
 +--------+- VG00 -+-------+        <-- VG
              |
 +-------+-------+---------+
 |       |       |         |
root    usr     home      var       <-- LV
 |       |       |         | 
ext3 reiserfs reiserfs    xfs       <-- Файловые системы
  • PV: Physical volume (физический том) Это могут быть винчестеры, разделы на винчестерах или любые другие блочные устройства. Обычно это раздел на диске или весь диск целиком. В том числе, устройства программного и аппаратного RAID (которые уже могут включать в себя несколько физических дисков). Физические тома могут входить в группы томов (VG, volume group).
    • PE: Physical extent (физический экстент) Каждый физический том делится на порции данных, называющиеся физическими экстентами. Их размеры те же, что и у логических экстентов.
  • VG: Volume group (группа томов) Это самый верхний уровень абстрактной модели, используемой системой LVM. С одной стороны группа томов состоит из физических томов, с другой -- из логических и представляет собой единую административную единицу.
  • LV: Logical volume (логический том) Раздел группы томов, эквивалентен разделу диска в не-LVM системе. Представляет собой блочное устройство и, как следствие, может содержать файловую систему.
    • LE: Logical extent (логический экстент) Каждый логический том делится на порции данных, называющиеся логическими экстентами. Размер логических экстентов не меняется в пределах группы томов.

Команды и работа

Физические тома (Physical Volumes)

  • pvcreate: создание физического тома LVM

    Работа с LVM начинается с создания физических томов с помощью команды pvcreate:

      sudo pvcreate /dev/sda1
    
  • pvs: вывести список всех доступных физических томов

  • pvremove: убирает том из списка физичиских томов LVM: pvremove /dev/sda

    • Если физический том /dev/sda уже принадлежит какой-либо группе томов vg, сначала нужно убрать винчестер /dev/sda из группы томов vg:

        pvmove /dev/sda
        vgreduce vg /dev/sda
        pvremove /dev/sda
      
  • pvmove: переносит все используемые физические блоки с указанного физического тома на другие физические тома, имеющие достаточное количество свободных блоков. Также можно указать логический том, которому принадлежат перемещаемые блоки, и задать конкретный физический том-приемник блоков (может использоваться для последующей команды vgsplit)

      # перенесет все блоки, расположенные на /dev/sda, на другие физические тома в той же группе,
      # самостоятельно определив тома-приемники
      pvmove /dev/sda
    
      # нижеследующая команда - корректный способ остановить pvmove (по умолчанию процесс остается в фоне,
      # а повторный запуск просто лишь показывает прогресс)
      # ОСТОРОЖНО! Прогресс не сохраняется!
      pvmove --abort
    
      # перенести все блоки с физического тома /dev/sdc1, принадлежащие логическому тому vg/lv,
      # на физический том /dev/sda4
      sudo pvmove /dev/sdc1 -n vg/lv /dev/sda4
    

Группы томов (Volume Groups)

Существует соглашение (конвенция) о том, как называть группы томов. Вкратце, называть группы томов стоит так:

vg-`hostname -s`-name
# например, 'vg-rapira-home' для группы томов 'home' на хосте 'rapira'

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

  • vgcreate: создать группу томов

      vgcreate -s 32M vg /dev/sda /dev/sdb
    

    Опция -s задаёт размер физического блока. По умолчанию он равен 4 MiB, но нет смысла дробить дисковое пространство так мелко.

  • vgchange: активация группы томов. После перезагрузки системы или выполнения команды vgchange -an, ваши группы томов и логические тома находятся в неактивном состоянии. Для их активации необходимо выполнить команду

      vgchange -a y vg
    
  • vgextend: добавить новый винчестер /dev/sdc в группу томов vg (расширить группу)

      pvcreate /dev/sdc
      vgextend vg /dev/sdc
    
  • vgreduce: удалить физический том (винчестер) /dev/sdb из группы томов vg

      vgreduce vg /dev/sdb
    
  • vgrename: переименовать группу томов vg02 в my_volume_group

      vgrename vg02 my_volume_group
    
      # or
    
      vgrename /dev/vg02 /dev/my_volume_group
    

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

  • vgsplit: разбить группу томов на две

      # создать группу томов vg-destination, выделив ее из группы vg-source 
      # вместе с логическим томом vg-source/lv
      # LVM сам решит, какие физические тома передать новой группе
      sudo vgsplit -n vg-source/lv vg-source vg-destination
    

Логические тома (Logical Volumes)

  • lvcreate: создать логические тома. Теперь можно создать логические тома

      lvcreate -n first -L 20G vg
      lvcreate -n second -L 30G vg
    

    Эти команды создадут устройства /dev/vg/first и /dev/vg/second размером 20 GiB и 30 GiB соответственно. Список всех логических томов можно увидеть с помощью команды lvs.

  • lvs: список всех логических томов

  • lvrename: переименовывает имеющийся логический том

    Любая из нижеследующих команд переименовывает том lvold (находящийся в группе томов vg02) в lvnew:

      lvrename /dev/vg02/lvold /dev/vg02/lvnew
    

    или

      lvrename vg02 lvold lvnew
    

Внимание! При переименовании группы, содержащей том с корневой файловой системой, нужно выполнить инструкцию в разделе Переименование группы томов или логического тома, на которых расположена корневая файловая система!

  • lvremove: удалить логический том

      lvremove vg/first
    

    Удалить можно только не использующийся том. Если том содержит файловую систему, то сначала её нужно отмонтировать.

  • lvresize: изменить размер логического тома

    Уменьшим логический том vg/second, содержащий ReiserFS, до 20 GiB:

      resize_reiserfs -s 19G /dev/vg/second
      lvresize -L 20G vg/second
      resize_reiserfs /dev/vg/second
    

    Теперь увеличим тот же том до 40 GiB:

      lvresize -L 40G vg/second
      resize_reiserfs /dev/vg/second
    

    Для файловых систем ext4 и btrfs нужно сначала просто сделать изменение размера логического тома, который ее содержит:

      lvresize -L 40G vg/second
    

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

    Для btrfs:

      sudo btrfs filesystem resize max /
    

    max говорит что нужно использовать все свободное на логическом диске место, / - это путь до mount-точки этой файловой системы (см. /etc/fstab). Убедиться в том, что файловая система изменила размер, можно запустив команду btrfs filesystem show /.

    Для ext4:

      sudo fsadm resize /dev/vg/lv
    

    где vg - имя логической группы, lv - имя логического тома. Без переданного параметра размера - задаст максимальный размер. Иногда эта команда возвращает ошибку fsadm: Cannot get readlink "/media/data", тогда можно попробовать другую:

      sudo resize2fs /dev/vg/lv
    

    Также, можно перед изменением размера, отмонтировать файловую систему, и проверить ее на ошибки:

      sudo umount /dev/vg/lv
      sudo fsck -f /dev/vg/lv
    

    Создать файловую систему ext4 без резервных блоков (по умолчанию используется 5% блоков для устранения фрагментации и резерва места для root) можно командой:

      sudo mkfs.ext4 -m 0 /dev/vg/lv
    
  • lvextend: почти то же самое, что lvresize, но предназначена в основном для расширения логического тома. Вот как можно расширить том на все доступное в группе этого тома пространство:

      sudo lvextend -l +100%FREE /dev/vg/lv
    

    В данной команде идет добавление (+) к тому /dev/vg/lv всех 100% свободных экстентов, таким образом диск расширяется.

  • lvchange: сделать логический том активным/неактивным

      # сделать том vg/lv неактивным
      lvchange -a n /dev/vg/lv
    
      # активировать том vg/lv
      lvchange -a y /dev/vg/lv
    

Зеркалирование данных

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

lvcreate -n data -m 1 -l 10 vg

При этом должно быть достаточное количество физических блоков на трёх физических томах: 10 для самого логического тома, 10 для зеркала и 1 для журнала. С помощью команды lvconvert можно добавлять или удалять зеркала и журнал, связанные с уже имеющимся логическим томом.

Восстановление после сбоя

Если один из физических томов недоступен, то инициализировать группу томов с помощью команды vgchange невозможно. В этом случае можно поступить так:

vgreduce --removemissing vg
vgchange -a y vg

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

При наличии достаточного количества свободных физических блоков и томов конфигурацию зеркалированного логического тома можно сразу же вернуть в прежнее состояние с помощью команды lvconvert.

Установка Linux на LVM

Большинство современных дистрибутивов Linux дают возможность на этапе установки настроить LVM. Но обычно существует ряд серьёзных ограничений:

  • физические тома можно создавать только на разделах винчестеров, а не на целом винчестере;
  • можно создавать только простые (linear) логические тома;
  • нельзя размещать каталог /boot внутри LVM.

Работа с файловыми системами и томами на LVM (кейсы)

В этом разделе - несколько сценариев использования LVM при работе с файловыми системами на томах LVM.

Переименование группы томов или логического тома, на которых расположена корневая файловая система

При изменении имени группы томов и/или логического тома, содержащих корневую файловую систему (это та, которая монтируется в /), особенностью является то, что том с корневой файловой системой, указывается ядру через его именной путь (например, /dev/mapper/vg--host--system/root), а при переименовании логического тома, ядро все еще считает, что находится на диске со старым именем, поэтому sudo update-grub работать не будет (будет ошибка, что не найден диск со старым именем). Поэтому, при переименовании группы и тома с корневой файловой системой в системах, где файл /boot/grub/grub.cfg генерируется автоматически с помощью, например, sudo update-grub (это Ubuntu, Debian и другие), порядок действий будет такой:

  1. переименовать группу и/или том (vgrename, lvrename)
  2. в файле /boot/grub/grub.cfg поменять путь подключения корневой файловой системы в соответствии с новым именем
  3. перезагрузиться, и после успешной перезагрузки выполнить sudo update-grub и убедиться что эта команда проходит без ошибок

Создание логического тома, файловой системы на нем и подключение файловой системы на лету с помощью LVM

  • Создать группу томов (должен быть свободный физический том, PV):

      sudo vgcreate vg-yourhostname-vgname /dev/sdaX
    
  • Создать логический том в группе vg-yourhostname-vgname, взяв все свободное место:

      sudo lvcreate -l 100%FREE -n vg-yourhostname-vgname/lvname
    
  • Создать ФС ext4 на получившемся томе без выделения резервных блоков (по умолчанию резервируется 5%, для резерва, уберите опцию -m 0 или пропишите вместо нуля нужный процент):

      sudo mkfs.ext4 -m 0 /dev/vg-yourhostname-vgname/lvname
    

    Создать ФС btrfs можно похожей командой:

      sudo mkfs.btrfs /dev/vg-yourhostname-vgname/lvname
    
  • Создать папку в том месте куда хотите монтировать файловую систему:

      sudo mkdir /mountpoint
    
  • Если нужно чтобы файловая система монтировалась при старте системы, поправьте /etc/fstab, обычно строчка для файловой системы выглядит так:

      # manually added: example directory (created at 2018-03-12 14:36)
      UUID=a7426a75-2266-4d03-99e1-619f9d08049a /mountpoint ext4 defaults 0 2
    

    UUID файловой системы можно узнать так:

      sudo tune2fs -l /dev/vg-yourhostname-vgname/lvname | grep -i uuid
    
  • Если вы прописали подключение файловой системы в /etc/fstab, используйте sudo mount -a чтобы примонтировать ее, или примонтируйте вручную.

Отключение (удаление) ненужной файловой системы, и освобождение ресурсов, занимаемых ней, в LVM

  1. Посмотрим информацию о файловой системе, для этого надо указать в качестве устройства логический диск, в данном случае /dev/vg-newhope-data/junk.

     sudo tune2fs -l /dev/vg-newhope-data/junk
    
  2. Удалим/переместим все файлы, которые хранятся на этой файловой системе, на другую ФС.

  3. Отмонтируем файловую систему (надо указать либо точку монтирования, либо устройство, в данном примере указана точка монтирования /junk):

     sudo umount /junk
    
  4. Удалим ставшую ненужной директорию /junk:

     sudo rm -r /junk
    
  5. Если наша файловая система монтировалась автоматически при загрузке, исправим это, поправив файл /etc/fstab.

  6. Теперь можно удалить логический том LVM, который хранил файловую систему:

     sudo lvremove vg-newhope-data/junk
    
  7. Теперь можно использовать оставшееся место по своему усмотрению.

Увеличение логического тома и файловой системы до максимального размера на лету, без отмонтирования ФС

Это всего две команды:

sudo lvextend -l +100%FREE /dev/vg_blah/lv_blah
sudo resize2fs -p /dev/vg_blah/lv_blah

Можно объединить в одну (рекомендуемый способ):

sudo lvextend -r -l +100%FREE /dev/vg_blah/lv_blah

Ничего отмонтировать не нужно, все делается на лету. Ключ -r отвечает за то, чтобы LVM сам вызвал утилиту fsadm для изменения размера нижележащей ФС.

Уменьшение файловой системы и содержащего ее логического тома (LV) и удаление освободившегося физического тома (PV)

Увеличение размера файловой системы можно проводить без ее отмонтирования, но при уменьшении - нужно отмонтировать:

umount /dev/vg_blah/lv_blah

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

e2fsck -f /dev/vg_blah/lv_blah

Примечание: запуск fsck вместо e2fsck не поможет, resize2fs откажется запускаться и попросит сначала запустить e2fsck.

Уменьшим файловую систему:

resize2fs -p /dev/vg_blah/lv_blah 9G

Потом уменьшим размер логического тома до 9G (чтобы уменьшить на 9G, надо прописывать минус в начале, -L -9G):

lvreduce -L 9G /dev/vg_blah/lv_blah

Внимание! Уделите особое внимание тому, чтобы том не был меньше файловой системы, иначе данные будут повреждены!

Внимание! resize2fs считает гигабайтом степени двойки (1 Гб = 1024 Мб и т.п.), тогда как lvreduce - степени десятки (1 Гб = 1000 Мб и т.п.)

Можно также объединить два предыдущих шага и сделать все одной командой (рекомендуемый способ):

lvreduce -r -L 9G /dev/vg_blah/lv_blah

Теперь перенесем экстенты удаляемого с удаляемого физического тома на другие физические тома группы:

pvmove /dev/sdX

После этого вы можете уменьшить и группу томов:

vgreduce vg_blah /dev/sdxy

Внимание: Решающее значение имеет одинаковый размер. Если вы уменьшите том больше чем файловую систему, вы обрежете логический том и рискуете потерять данные!

Если команда уменьшения размера файловой системы и/или уменьшения логического тома не проходят по причине того, что физический том не может записать данные (но при этом может их считать), то вместо уменьшения размера ФС и логического тома (операции, которые возможно потребуют записи на сбойный физический том), можно добавить другой работающий физический том в группу, и выполнить pvmove /dev/sdX для сбойного, тем самым перенеся данные со сбойного тома на работающий, и затем удалить сбойный физический том из группы с помощью vgreduce. После этого можно уменьшить размер ФС и логического тома.

Ссылки

⚠️ **GitHub.com Fallback** ⚠️