LVM: изменение размера, снапшоты, миграция

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

Перво-наперво

У нас должно быть свободное место в Volume Group.  Нет смысла без особой необходимости забивать все свободное место логическими томами, когда их свободное место будет использовано не до конца. Если у нас один хард на 500 гиг, мы делаем группу на весь этот объем, а дальше, например, делаем один том в 1G под swap, другой — в 9G под /, и, например, третий — на 50G под /home. У нас остается  440G свободного места, которое мы в любой момент можем докинуть в любой раздел, а также использовать под снапшоты. Соу…

 

Как добавить места на Logical Volume

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

Допустим, у нас есть LVM-том с линуксовым корнем /dev/mypc/root, содержащий на себе линуксовый корень. Докинуть 100 мегабайт можно командой:

 
 
  1. lvextend -L +100m /dev/mypc/root
  2. resize2fs /dev/mypc/root

 

Первая команда увеличит том, вторая — распространит на него файловую систему.

 

 

 

Как сделать и откатить снапшот

Допустим, у нас все еще есть LVM-том /dev/mypc/root, содержащий на себе линуксовый корень. Если нам нужно, например, накатить новые дрова для видюхи и мы боимся все сломать, делаем снапшот:

 
 
  1. lvcreate -L2G -s -n rootsnapshot /dev/mypc/root

 

Эта команда сделает снапшот /dev/mypc/rootsnapshot, который будет содержать состояние на момент создания снапшота. При этом есть ограничение в 2 гига на изменения в нашем корне, если превысим — снапшот перестанет быть валидным и его можно будет только удалить:

 
 
  1. lvremove /dev/mypc/rootsnapshot

 

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

 

Автоматическое увеличение размера снапшота LVM

Тут все просто, но не так просто, как часто пишут в интернетах. Нужно:

  1. Изменить файлик /etc/lvm/lvm.conf:
    snapshot_autoextend_threshold = 80
    snapshot_autoextend_percent = 20
    monitoring = 1

    Эти опции включают мониторинг, а так же увеличивают размер снапшота на 20% (от текущего размера) каждый раз, когда он оказывается занят изменениями на 80%.

  2. Установить dmeventd, который может не стоять, но который нужен чтобы все работало!

Теперь, когда наш снапшот умеет расти в размере и ему почти ничего не страшно, можно поиздеваться над корнем и откатить все изменения командой:

 
 
  1. lvconvert --merge  /dev/mypc/rootsnapshot

 

Вообще эта команда должна производиться при отмонтированном разделе, но так как в нашем случае это корень, то отмонтировать его не получится, и lvconvert скажет, что сделает все в лучшем виде при следующей активации тома — то есть при перезагрузке.

 

Как смигрировать на другой физический диск

Очень вкусная возможность лайв-миграции позволяет перетащить свои разделы с одного диска на второй, не отрываясь от работы.

Допустим у нас есть диск /dev/sda. На его разделе /dev/sda1 у нас покоится Volume Group «mypc» с нашими логическими томами:

  1. root — с корнем линукса (/),
  2. home — с домашними  каталогами (/home),
  3. swap — с разделом подкачки.

И нам нужно все это добро перенести на новый хард — /dev/sdb, который гол как сокол и ничего ж там нет.

Готовим новый диск

 
 
  1. # Создаем раздел на новом диске:
  2. parted -a opt /dev/sdb mkpart primary 0% 100%
  3. # Создаем физический том LVM:
  4. pvcreate /dev/sdb1
  5. # Расширяем Volume Group на новый физический том:
  6. vgextend mypc /dev/sdb1

 

Сдвигаем наши три логических тома со старого физического тома на новый:

 
 
  1. pvmove -n /dev/mypc/root /dev/sda1 /dev/sdb1
  2. pvmove -n /dev/mypc/home /dev/sda1 /dev/sdb1
  3. pvmove -n /dev/mypc/swap /dev/sda1 /dev/sdb1

 

Избавляемся от старого харда

 
 
  1. # Удаляем физический том LVM из группы "mypc":
  2. vgreduce mypc /dev/sda1
  3. # Удаляем физический том LVM:
  4. pvremove /dev/sda1

 

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

 
 
  1. grub-install /dev/sdb
  2. update-grub

 

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

Мой первый большой и серьезный кусок кода

Сегодня у меня появился небольшой повод для гордости. Я, конечно, не программист, но админ-  периодически небольшие скрипты писать приходится. Но сегодня я дописал (до юзабельного состояния, не идеального, не суперкрасивого, но юзабельного) свой первый большой скрипт-гуй для бэкапа LVM-разделов и, собственно, восстановления из бэкапа. Процентов на 70 это была тренировка питона, ибо написано все на нем, и процентов на 30 — решение своей хотелки управления бэкапами более-менее наглядно и без переписывания неинтерактивных скриптов по каждому чиху.

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

Стартовый экран выглядит вот так:

При первом запуске он запоминает текущую директорию, в которой был запущен, и делает ее рабочей при последующих запусках. Если потом его запустить в другой дире (как на текущем скрине) — будет предлагать сохранить ее как рабочую.
Тут же, не отходя от кассы можно набить список исключений.

Допустим мы хотим забэкапиться, выбираем бэкап!

Скрипт сам находит все смонтированные LVM-разделы и позволяет пометить те, которые хочется забэкапить. В результате бэкапа образуются файлы — первый всегда полный бэкап, последующие автоматом инкрементируются.

Если инкрементов накопилось дофига и больше, и какие-то промежуточные хочется убить — это можно сделать опцией мерджинга. Выделенный файл бэкапа поглотит тот, что перед ним (таким образом можно слить два файла разных разделов — я пока не понял это скорее баг или фича ))).

Ну и наконец — восстановление.
Выбираем файл, который хотим восстановить:

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

В общем вышла такая себе управлялка бэкапами, для наглядного процесса копирования и восстановления.

Код на гитхабе: https://github.com/qiwichupa/lvmdarbackuper/blob/master/lvmdarbackuper.py