LVM

Материал из ALT Linux Wiki

LVM - (Logical Volume Manager - менеджер логических дисков) средство гибкого управления дисковым пространством. Позволяет динамически менять размер логических разделов на лету, создавать снимки (снапшоты) и т.д.

Дисклеймер/отмазка

LVM это ОЧЕНЬ(!!!) мощный инструмент, который требует аккуратного с собой обращения. Любая самодеятельность с ним может обернуться потерей всей(!!!) информации на диске. Поэтому прежде, чем использовать LVM на рабочих машинах (и уж тем более на «боевых» серверах), следует потренироваться на кошках. Лучше всего это делать на виртуальных машинах. Начинать использовать LVM следует ТОЛЬКО (и только!!!) тогда, как почувствуете уверенность и понимание принципов его работы.

Зачем нужен LVM

Установка системы прямо на разделы диска зачастую приводит к следующей проблеме. Нужно каким-то образом «правильно» разбить жесткий диск. Слово «правильно» стоит в кавычках, потому что «правильного» разбиения диска для всех возможных ситуаций и применений не существует. В сети есть много советов по данному поводу, но они не учитывают потребностей конкретного пользователя (в случае настольной системы) или конкретного администратора (в случае сервера). Обычно рекомендуют разделы /home, /var, /usr, какие-то еще выносить на отдельные разделы диска. Но если разбивающий ошибется в размерах этих разделов, возникает очень нехорошая ситуация - на одних разделах место подходит к концу, в то время как на остальных места еще много. Приехали! Дисковое пространство нужно переразмечать. Для этого есть много способов:

1. Тотальный backup, затем переустановка системы с переразбиением диска. 2. Переразметка с помощью parted с риском потерять данные. 3. Изначальная установка системы на LVM, который позволяет изменять размеры своих разделов прямо на работающей системе.

Терминология

LVM предусматривает три логических уровня работы с дисковым пространством:

1. Самый нижний - физические тома (physical volumes). Это собственно физические диски. Это могут быть диски целиком (/dev/sda, /dev/sdb и т.д.) или отдельные разделы (/dev/sda1, /dev/sdb5 и т.п.).

2. Группы томов - volume groups. В группы томов объединяются физические тома. Таким образом группы томов представляют собой пул дискового пространства, необходимый для следующего уровня. Группы томов могут иметь человеческие названия, говорящие администратору системы об их предназначении: system, sales, database и т.д.

3. Логические тома (logical volumes) - это аналог разделов физического диска и то, ради чего вообще существуют диски - именно на них хранятся данные. Пользователи (и процессы) системы работают только с логическими томами. Таким образом LVM создает для них всех слой абстракции, скрывая, с какими именно физическими дисками они в данный момент работают. Администратор системы может добавлять физические тома в LVM и удалять их из него (см. ниже), но процессы (и пользователи) об этом знать не будут.


Примечание по названиям утилит LVM

Следует запомнить сразу - названия утилит для работы с разными уровнями LVM совпадают. Различие только в первых двух буквах этого названия. Это:

  • pv* - для работы с физическими томами;
  • vg* - для работы с группами томов;
  • lv* - для работы с логическими томами.

Не стоит также пытаться зазубрить названия этих утилит и их ключи. Действовать стоит так:

1. Думаете, с каким уровнем LVM надо работать - физические тома, группы томов или логические тома.

2. Выбираете в зависимости от этого первые буквы названия: pv, vg или lv, соответственно.

3. Набираете их в консоли и нажимаете два раза TAB. Срабатывает автодополнение, которое показывает команды, начинающиеся с указанных букв.

4. Выбираете команду по ее названию, например, pvcreate для создания физических томов. Если вы ее запустите с ключом --help , она вам покажет все возможные ключи. За более подробной информацией стоит залезть в man конкретной команды.

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

Создание

Я буду рассматривать создание LVM на уже установленной системе. Знание терминологии и принципов работы с ним в дальнейшем позволит найти в инсталляторе нужные пункты для создания логических томов на этапе установки системы.

Первый этап - это создание правильных разделов. Это такие разделы, которые LVM признает за свои и сможет при загрузке их корректно инициализировать. В случае таблицы разделов MBR «родной» тип разделов для LVM - 8E «Linux LVM». В случае LVM версии 1 все, что будет дальше, не будет работать, если при создании разделов не указать приведенный корректный тип. Если используете таблицу разделов GPT, в parted задайте разделу флаг «lvm».

Вообще говоря, можно использовать в качестве физического тома неразмеченный диск. LVM2 распознаёт физические тома LVM по сигнатуре. Это сэкономит мегабайт на диске. Но всё же имеет смысл создать таблицу разделов и в ней раздел с типом или флагом lvm, чтобы не ошибиться самому в дальнейшем: диск, целиком испоьлзованный для физического тома LVM, можно случайно принять за пустой. (Но всегда можно проверить это командой file -s /dev/sd? или pvscan.) Кроме того, если LVM используется в виртуальной машине, диск, полностью занятый PV LVM, будет виден программам LVM в хост-системе, что не всегда приемлимо.

Итак, создаем несколько разделов типа 8E с помощью любимого средства разбиения диска:

[root@localhost ~]# fdisk -l /dev/sdb
 Disk /dev/sdb: 2147 MB, 2147483648 bytes
 255 heads, 63 sectors/track, 261 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0x00000000
 Device Boot Start End Blocks Id System
 /dev/sdb1 1 61 489951 8e Linux LVM
 /dev/sdb2 62 261 1606500 5 Extended
 /dev/sdb5 62 122 489951 8e Linux LVM
 /dev/sdb6 123 261 1116486 8e Linux LVM

Еще раз. Пример я привожу с виртуальной машины, чего и вам советую на этапе обучения.

Я создал три раздела для работы с LVM. Сколько их создавать и какого размера решает сам администратор. Например, никто не мешает отдать целиком весь диск (/dev/sdb в данном случае) под власть LVM. В том, как это сейчас сделал я, смысла искать не стоит :). Мой пример преследует только цели демонстрации работы с LVM.

ВНИМАНИЕ! Форматировать созданные разделы НЕ надо!

Следующее, что мы должны сделать - это инициализировать созданные разделы как физические тома:

[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
[root@localhost ~]# pvcreate /dev/sdb5
Physical volume "/dev/sdb5" successfully created
[root@localhost ~]# pvcreate /dev/sdb6
Physical volume "/dev/sdb6" successfully created

Если нет сообщений об ошибках, можно смело шагать вперед.

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

[root@localhost ~]# vgcreate fileserver /dev/sdb1 /dev/sdb5
 Volume group "fileserver" successfully created

Аргументы vgcreate это название группы томов (fileserver) и те физические тома, которые мы включаем в эту группу. В данном случае я включил в нее только /dev/sdb1 и /dev/sdb5, что нам и покажет утилита pvscan:

[root@localhost ~]# pvscan
PV /dev/sdb1 VG fileserver lvm2 [476.00 MiB / 476.00 MiB free]
PV /dev/sdb5 VG fileserver lvm2 [476.00 MiB / 476.00 MiB free]
PV /dev/sdb6               lvm2 [1.06 GiB]

Здесь мы видим созданные нами физические тома, их размер и к какой группе томов они относятся. Последний физический том (/dev/sdb6) у нас пока сам по себе. Для обнаружения наличия групп томов LVM (это нужно, например, если вы загрузились с Live CD, который не активирует LVM по умолчанию) есть аналогичная команда - vgscan:

[root@localhost ~]# vgscan
 Reading all physical volumes. This may take a while...
 Found volume group "fileserver" using metadata type lvm2

Активировать неработающий LVM можно командой vgchange -ay:

[root@localhost ~]# vgchange -ay
 0 logical volume(s) in volume group "fileserver" now active

Это все для того же примера с LiveCD. Сейчас это делать было не обязательно. Вывод приведенной команды показывает наличие отсутствия логических томов, значит сейчас самое время создать их :). Для создания логических томов используется команда lvcreate:

[root@localhost ~]# lvcreate -L 300M -n samba fileserver
 Logical volume "samba" created

Вуаля! Вы только что создали свой первый логический том. Синтаксис команды прост до безобразия:

  • ключ -L указывает размер создаваемого тома. Поддерживаются суффиксы K (килобайты), M (мегабайты), G (гигабайты).
  • ключ -n указывает название для тома (samba в данном случае)
  • последний аргумент fileserver указывает группу томов, в которой мы создаем логический том (теоретически, групп может быть несколько).

Что важно - логические тома именуются системой следующим образом: /dev/имя_группы_томов/имя_тома. В действительности это симлинк, удобный для адресации устройства - он ссылается на что-то вроде /dev/dm-11, номер в котором может отличаться после перезагрузки. Очевидно, что /dev/группа/том гораздо нагляднее и предупреждает ошибки.

В нашем примере это:

[root@localhost ~]# lvscan
 ACTIVE '/dev/fileserver/samba' [300.00 MiB] inherit

Одно только это - хороший аргумент для использования LVM. Ведь не надо помнить что находится на /dev/sda3, /dev/sdb5 и т. п. Имена логических томов имеют вполне человеческое название (если их правильно назвать).

Еще несколько замечаний. В группе томов можно создать столько томов, сколько будет нужно. Но не больше, чем есть дискового пространства в этой группе томов. Посмотреть, сколько его у нас есть (и самое главное сколько его еще осталось) можно командой vgdisplay:

[root@localhost ~]# vgdisplay fileserver
 --- Volume group ---
 VG Name fileserver
 System ID
 Format lvm2
 Metadata Areas 2
 Metadata Sequence No 2
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 1
 Open LV 0
 Max PV 0
 Cur PV 2
 Act PV 2
 VG Size 952.00 MB
 PE Size 4.00 MB
 Total PE 238
 Alloc PE / Size 75 / 300.00 MB
 Free PE / Size 163 / 652.00 MB
 VG UUID SZLgLK-b9V8-RiZV-gH5i-N0pA-2ppf-axLqfO

Сейчас для нас тут самое ценное - это VG Size 952.00 MB (общий размер дискового пространства группы томов), Alloc PE / Size 75 / 300.00 MB (уже выделенное для создания логических томов дисковое пространство), Free PE / Size 163/652.00 MB (свободное и еще не распределенное дисковое пространство - наш резерв).

PE тут - это физические экстенты. Они представляют собой нечто вроде кусков дискового пространства, на которые LVM «нарезает» физические тома. Все размеры логических томов всегда содержат целое число этих физических экстентов и всегда кратны их размеру (как видно из приведенных цифр размер экстента - 4Мб).

Теперь созданный том можно отформатировать и примонтировать:

[root@localhost ~]# mkdir /mnt/data
[root@localhost ~]# mkfs.ext4 /dev/fileserver/samba
[root@localhost ~]# mount /dev/fileserver/samba /mnt/data/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/fileserver-samba
            291M 11M 266M 4% /mnt/data

Как мы видим, наш логический том готов к использованию!

Увеличение логических томов

Самая мощная возможность LVM - это то, что размеры логических томов можно менять на лету. Правда, чтобы их уменьшить, «полет» придется прервать (об этом ниже), а вот увеличение размеров томов - это практически безопасная операция.

Предположим, что нам перестало хватать места на нашем физическом томе /dev/fileserver/samba.

Последовательность действий такая:

1. Сначала нужно убедиться в наличии необходимого нам дискового пространства в группе томов. Делается это командой vgdisplay. Допустим, мы хотим добавить к нашему логическому тому еще 300 Мб. Как мы видим (см. вывод команды vgdisplay выше), у нас еще достаточно свободного места в группе.

2. Увеличиваем логический том командой lvextend:

[root@localhost ~]# lvextend -L +200M /dev/fileserver/samba
 Extending logical volume samba to 500.00 MB
 Logical volume samba successfully resized

Новый размер тома (ключ -L) можно указывать и в относительных единицах (как в примере), и в абсолютных.

3. Если мы теперь посмотрим на вывод команды df -h мы увидим, что пока ничего не изменилось:

 [root@localhost ~]# df -h
 Filesystem Size Used Avail Use% Mounted on
 /dev/mapper/fileserver-samba
           291M 11M 266M 4% /mnt/data

несмотря на то, что lvscan показывает верный размер:

 [root@localhost ~]# lvscan
 ACTIVE '/dev/fileserver/samba' [500.00 MB] inherit

Это произошло потому, что мы увеличили размер логического тома, но пока «забыли» сказать об этом файловой системе, расположенной «этажом выше». Давайте же изменим размер файловой системы. Делается это командной resize2fs (для ext2/ext3/ext4) или resize_reiserfs для одноименной файловой системы:

 [root@localhost ~]# resize2fs /dev/fileserver/samba
  resize2fs 1.41.5 (23-Apr-2009)
  Filesystem at /dev/fileserver/samba is mounted on /mnt/data; on-line resizing required
  old desc_blocks = 2, new_desc_blocks = 2
  Performing an on-line resize of /dev/fileserver/samba to 512000 (1k) blocks.
  The filesystem on /dev/fileserver/samba is now 512000 blocks long.

Теперь все правильно:

 [root@localhost ~]# df -h
  Filesystem Size Used Avail Use% Mounted on
  /dev/mapper/fileserver-samba
             485M 11M 450M 3% /mnt/data

Обратите внимание, что все показанное производилось на смонтированной файловой системе. То есть, все операции не требуют остановки серверов, приостановки работы пользователей и т.п.

Уменьшение логических томов

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


ВНИМАНИЕ! Шаги 2 и 3 очень часто путают местами, что приводит к потере данных, хранящихся на логическом томе.


Делается это все так:

1. Размонтируем файловую систему: umount /dev/fileserver/samba

2. Уменьшаем размер файловой системы. Для этого сначала сделаем проверку самой файловой системы. Утилита resize2fs не даст изменить размер до выполнения проверки. Конечно, у нее есть ключ -f, который заставит ее это сделать, но лучше перестраховаться и все-таки выполнить проверку:

[root@localhost ~]# fsck.ext4 -f /dev/fileserver/samba
 e2fsck 1.41.5 (23-Apr-2009)
 Pass 1: Checking inodes, blocks, and sizes
 Pass 2: Checking directory structure
 Pass 3: Checking directory connectivity
 Pass 4: Checking reference counts
 Pass 5: Checking group summary information
 /dev/fileserver/samba: 11/127512 files (0.0% non-contiguous), 26603/512000 blocks
 [root@localhost ~]# resize2fs /dev/fileserver/samba 300M
 resize2fs 1.41.5 (23-Apr-2009)
 Resizing the filesystem on /dev/fileserver/samba to 307200 (1k) blocks.
 The filesystem on /dev/fileserver/samba is now 307200 blocks long

3. ТОЛЬКО после корректного выполнения двух предыдущих шагов уменьшаем размер логического тома:

 [root@localhost ~]# lvreduce -L 300M /dev/fileserver/samba
  WARNING: Reducing active logical volume to 300.00 MB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
  Do you really want to reduce samba? [y/n]: y
  Reducing logical volume samba to 300.00 MB
  Logical volume samba successfully resized

В качестве размера тома (ключ -L), как и в случае с lvextend можно указывать и абсолютные и относительные единицы. Здесь мы также видим страшное предупреждение о потере данных. Несмотря на это (если вы не используете тестовые версии программ), ваши данные будут в целости и сохранности (скорее всего :) , 100% гарантии вам все равно никто не даст).

После этого монтируем файловую систему и смотрим что поменялось:

[root@localhost ~]# mount /dev/fileserver/samba /mnt/data/
[root@localhost ~]# df -h
 Filesystem Size Used Avail Use% Mounted on
 /dev/mapper/fileserver-samba
            291M 11M 266M 4% /mnt/data

Итак, если вы все делаете в указанной последовательности, вашим данным скорее всего ничего не грозит. Но лучше перед уменьшением тома все-таки сделать его резервную копию. Я сам многократно уменьшал физические тома без каких-либо потерь данных, но наличие резервной копии - это наличие резервной копии :).

Увеличение и уменьшение группы томов

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

Давайте вернемся к нашему примеру. Допустим нам перестало хватать места в нашей группе томов и мы ее хотим дополнить новыми физическими томами. Делается это командой vgextend:

 [root@localhost ~]# vgextend fileserver /dev/sdb6
  Volume group "fileserver" successfully extended
 [root@localhost ~]# vgdisplay fileserver
  --- Volume group ---
  VG Name fileserver
  System ID
  Format lvm2
  Metadata Areas 3
  Metadata Sequence No 5
  VG Access read/write
  VG Status resizable
  MAX LV 0
  Cur LV 1
  Open LV 1
  Max PV 0
  Cur PV 3
  Act PV 3
  VG Size 1.99 GB
  PE Size 4.00 MB
  Total PE 510
  Alloc PE / Size 75 / 300.00 MB
  Free PE / Size 435 / 1.70 GB
  VG UUID SZLgLK-b9V8-RiZV-gH5i-N0pA-2ppf-axLqfO

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

Следующая операция, которую тоже можно делать с LVM - это уменьшение группы томов. Прежде чем вывести физический том из группы - его необходимо освободить от данных. Первое, что тут следует сделать в данном случае - это убедиться, что дискового пространства, которое останется в группе, хватит для размещения этих данных. Разработчики LVM пока не владеют методами размещения данных в астральном пространстве, но работа над этим ведется :). Итак, посмотреть это можно командой pvscan:

 [root@localhost ~]# pvscan
 PV /dev/sdb1 VG fileserver lvm2 [476.00 MB / 176.00 MB free]
 PV /dev/sdb5 VG fileserver lvm2 [476.00 MB / 476.00 MB free]
 PV /dev/sdb6 VG fileserver lvm2 [1.06 GB / 1.06 GB free]

Здесь мы видим, что реально сейчас используется только первый физический том - /dev/sdb1. И еще мы тут видим один интересный аспект работы LVM: если какой-то логический том можно разместить на отдельном физическом целиком - LVM выберет именно этот путь. Кстати, под словом free команда pvscan подразумевает не свободное от данных пространство, а пространство не выделенное в логические тома. Итак, для освобождения физических томов от данных и размещения их на других физических томах той же группы есть команда pvmove:

 [root@localhost ~]# pvmove /dev/sdb1
 /dev/sdb1: Moved: 100.0%

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

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

Вывод команды pvscan теперь выглядит вот так:

 [root@localhost ~]# pvscan
  PV /dev/sdb1 VG fileserver lvm2 [476.00 MB / 476.00 MB free]
  PV /dev/sdb5 VG fileserver lvm2 [476.00 MB / 476.00 MB free]
  PV /dev/sdb6 VG fileserver lvm2 [1.06 GB / 788.00 MB free]

Как мы видим, теперь наш логический том «уехал» на другой раздел диска. Причем этот том смонтирован и с ним в этот момент могут работать пользователи.

Убрать освобожденный том из группы можно командой vgreduce:

[root@localhost ~]# vgreduce fileserver /dev/sdb1
 Removed "/dev/sdb1" from volume group "fileserver"
[root@localhost ~]# pvscan
 PV /dev/sdb5 VG fileserver lvm2 [476.00 MB / 476.00 MB free]
 PV /dev/sdb6 VG fileserver lvm2 [1.06 GB / 788.00 MB free]
 PV /dev/sdb1               lvm2 [478.47 MB]

Теперь мы видим, что наш физический том /dev/sdb1 «осиротел» и больше не принадлежит ни одной группе.

Снапшоты/Снимки

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

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

Самая интересная особенность LVM при работе со снимками - это то, что снимок может занимать меньше дискового пространства, чем оригинал. Для этого используется режим Copy-on-Write, при котором реальное использование дискового пространства начинается только при изменении данных на томе-оригинале. То есть при попытке модификации файла на томе-оригинале неизмененный файл сначала сохраняется на томе-снимке, а уж затем модифицируется.

ВНИМАНИЕ! При заполнении тома-снимка до конца, происходит его уничтожение. То есть том продолжает существовать, но ни смонтировать его, ни просмотреть его содержимое (если он был смонтирован до этого) уже не получится. Эту особенность следует обязательно учитывать при задании размера тома-снимка в момент его создания.

Создание снимка делается хорошо известной командой lvcreate:

[root@localhost ~]# lvcreate -s -L 100M -n backup /dev/fileserver/samba
 Logical volume "backup" created

Ключ -s указывает, что создаем мы именно снапшот, -n указывает имя создаваемого тома, а /dev/fileserver/samba показывает с какого именно тома мы делаем снимок.

Команда lvscan покажет нам, что мы создали снапшот:

 [root@localhost ~]# lvscan
 ACTIVE Original '/dev/fileserver/samba' [300.00 MB] inherit
 ACTIVE Snapshot '/dev/fileserver/backup' [100.00 MB] inherit

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

Полезные советы для работы с LVM

  • В руководстве по администрированию RHEL встретился один замечательный совет. При использовании LVM не следует стараться распределить все имеющееся дисковое пространство в логические тома. Гораздо лучше другой путь. При распределении дискового пространства следует сделать это по своему опыту, ориентируясь на минимально необходимые потребности пользователей системы или работающих сервисов. Оставшееся в группе пространство будет «горячим» резервом, который администратор сможет добавить при нехватке места. Как было видно выше - добавление дискового простраства (увеличение логических томов) операция легкая и быстрая, в отличие от уменьшения.

Полезные источники:

  1. Сайт Xgu.ru
  2. RHEL6 Logical_Volume_Manager_Administration