Использование LVM

8 Апр
2008

Старая статья из журнала Системный Администратор

Рано или поздно но это произойдет. В один прекрасный солнечный день когда хочется поваляться на пляже, введя команду df, обнаруживаешь, что места на сервере осталось совсем ничего. Причем как ни стараешься правильно разбить диск при установке системы, но предугадать какой из разделов потребует больше места, а какой меньше удается очень редко. Если корневой раздел, /usr и /opt в большинстве своем сюрпризов не приносят т.к. устанавливаемый софт контролируется самим сисадмином и обычно здесь применяется стандартный набор приложений. Каталог /tmp сейчас обычно отдают на откуп tmpfs – файловую систему в оперативной памяти. То с /var и /home обычно возни больше. Выходов в этой ситуации может быть несколько.


Первый. Простой.
Плюнуть на все требования и поступить еще при установке просто.
# parted /dev/hda mkpartfs primary linux-swap 0 256 && parted /dev/hda mkpartfs primary ext2 256 ###
т.е. использовать всего два раздела swap и все оставшееся место отвести под корневой. Что тут сказать, пока диск не заполниться полностью, можно будет совсем не думать о наличии свободного/занятого места в разделах. Но это положительная сторона. А с другой. Производительность диска в таком случае будет не на высоте, особенно при большом заполнении. Плюс обязательно найдется кто-то у кого дома много фильмов на дисках и в один день он решит все их принести на работу для демонстрации. Или кто-то “добрый” запишет большой файл в /tmp. После этого остановится все что требует места, например почтовый сервер или syslog, которым просто некуда будет писать на диске данные.

Второй. Фашистский.
Здесь просто. Если места мало его нужно расчистить.
# find /home ( -atime +365 -o -name ‘*.avi’) -exec rm {}\;
т.е. если пользователь не удосужился заглянуть в файл в течении года, то он явно лишний (будет кричать, то всегда найдется в бэкапе), плюс туда улетают и фильмы, работать надо на работе (здесь начальство даже похвалить может).
# find /home -size 200 > trash ; cat trash | less
Или просто посмотреть на те файлы которые занимают много места.
Третий. Радикальный.
Все данные резервируются и диск переразбивается заново с учетом новых обстоятельств, до возникновения новых должно помочь.
Четвертый. Софтварный.
При помощи утилиты parted, гарантирующей сохранение данных, размеры разделов изменяются. Но к великому сожалению parted не работает с файловыми системами и XFS и UFS, а ReiserFS работает с некоторыми оговорками .
Пятый. Естественно хардварный.
Идем к шефу и говорим, что свободного места нет и требуем новый жесткий диск для сервера и повышение зарплаты для себя :) (чтобы два раза не бегать). Далее вставляем его в корпус, форматируем и монтируем например в /home/newhome и часть данных переносим на новый диск. Чтобы при этом некоторые старые файлы были доступны из нового месторасположения необходимо воспользоваться символическими ссылками. К слову в таком случае очень не плохо бы и на втором диске создать swap-раздел, а в файле /etc/fstab сделать запись о равенстве их приоритетов.
/dev/hda1 swap swap defaults,pri=1 0 0
/dev/hdc1 swap swap defaults,pri=1 0 0

Теперь все пользовательское пространство будет состоять из двух файловых систем и прийдется все время помнить о том на каком диске находятся данные и следить за их наполнением, но дополнительно ко всему отпадает возможность создания жестких ссылок на данные расположенные в другой файловой системе. Согласитесь это несколько неудобно, гораздо лучше чтобы оно выглядело как единое целое пусть даже и неявляется таковым. И поэтому…
Вариант шестой – предусмотреть возможное несоответсвие размеров и возможное перепланирование рабочего пространтсва в будущем, еще на стадии разбиения диска или если уж произошло такое, то воспользоваться удобными современными технологиями. Для решения этой задачи в самый раз прийдется популярная технология LVM (Logical Volume Manager) или менеджер логических томов, которая полностью поддерживается ядром начиная с версии 2.4.

По понятиям

Давайте сначала немного разберемся в терминологиях и что собственно происходит. Недавний ремонт вызывает пока у меня только строительные ассоциации, поэтому давайте представим жесткий диск в виде стены. Но стена не однородная, она состоит из отдельных кирпичиков т.е. физических разделов жесткого диска (physical media), все равно каких первичных или логических разделов на расширенном. В терминологии LVM каждый кирпичик будет называться физический том PV (Physical Volume). Этому разделу при образовании присваивается определенный идентификатор типа файловой системы – 8e (например программой fdisk). Сам Physical Volume образовывается из неких элементарных единиц называемых PE (physical extents). Будем считать это тот песок из которого состоят кирпичи. Это минимальный размер с которым умеет обращаться VG и по умолчанию равен 4 Mb. Далее чтобы на голый кирпич прицепить что-то более привлекательное для глаза, его сначала заштукатуривают и теперь наша стена выглядит как одно большое целое. В терминологии LVM это называется группа томов VG (volume group), это главная часть, представляющая собой логическую надстройку на физическими разделами, некий банк дисковых ресурсов. Операционная система видит VG как единое целое, хотя фактически она состоит из нескольких реальных разделов жесткого диска. Это можно представить (но только представить) как создание расширеного раздела при обычном разбиении. И теперь ложим плитку т.е. нарезаем в получившемся VG разделы требуемых размеров (или не нарезаем если в этом нет необходимости т.е. сплошная стена вас вполне устраивает). Эти разделы называются логическими томами LV (logical volume). Такой раздел затем форматируется обычным образом под выбранную файловую систему и драйвер ФС работает именно на этом уровне. Также, именно эти разделы монтирует пользователь и прописывает данные в /etc/fstab. В LVM (HOWTO) которое находится по адресу http://tldp.org/HOWTO/LVM-HOWTO/, все это схематически отображено так.
hda1 hdc1 (PV:s on partitions or whole disks)
\ /
\ /
diskvg (VG)
/ | \
/ | \
usrlv rootlv varlv (LV:s)
| | |
ext2 reiserfs xfs (filesystems)
Сам логический том, также состоит из песчинок называемых LE (logical extent), которые сопоставляются реальным физическим physical extents. Если в дальнейшем понадобится изменить размер logical volume, то это можно будет проделать как раз на величину кратную physical extents. Такая взаимосвязь физических и логических extent’ов обозначается термином mapping. И еще, так как фактически нет разницы какому PE противопоставить LE, то это можно сделать двумя вариантами – линейный (linear mapping) и чередующийся (striped mapping). В первом случае все просто, непрерывной последовательности физических extent’ов ставится в соответствие столь же непрерывная последовательность логических extent’ов. Во втором, непрерывная последовательность логических extent’ов связывается с чередующимися между различными физическими носителями extent’ами. Эта схема напоминает нулевой (полосатый) RAID-массив. При этом если разместить два диска на различных IDE-каналах можно добиться некоторого повышения производительности дисковых операций. Но надежность в таком случае ниже т.к. в случае вылета одного диска можно потерять все. Поэтому бекап в последнем случае играет не последнюю роль. И еще не стоит смешивать в одной VG оба метода, если есть в этом необходимость то для striped mapping создайте отдельную volume group. Как говорил один из моих преподавателей «Природу не обманешь, за все надо платить». Естественно за удобства приходится расплачиваться, в нашем случае это 10-15% процессорной мощности. При чем перенос файловых систем с физического на логический уровень на скорости дисковых операций не отразился в linear случае.

От теории к практике

Теперь попробуем создать logical volume и подключить его как обычную файловую систему. Для начала давайте определимся, что не надо ложить в LV. Так нет особого смысла помещать туда каталог /boot в котором содержится ядро и Grub. Его стоит вынести в отдельный раздел рамером 50 Мб (с запасом) и в файле /etc/fstab прописать такие строки чтобы он не автоматически монтировался при загрузке.
/dev/hda1 /boot ext2 noauto 1 2
Применять журналируемые файловые системы в этом случае смысла особого нет, а при смене ядра (довольно редкое занятие) данный каталог всегда можно примонтировать вручную. Также наверное не стоит помещать туда и следующие каталоги /etc, /proc, /lib, /mnt, /bin, /sbin, /dev, /root, swap и /tmp (хотя это все относительно). Обычно состав их более менее статичен и много места не занимает, так корневой раздел в CRUX такого состава получился у меня всего навсего 300 Мб, остальное находится в /usr, /var и /home. При большом количестве внесистемного софта также следует вынести в отдельный каталог и /usr/local с /opt (я обычно делаю символическую ссылку ln -s /usr/local /opt, чтобы голову меньше ломать). Дополнительно ко всему у вас всегда будет возможность зайти в систему из под root’a в случае аварийных обстоятельств. LVM можно использовать при наличие в системе и одного жесткого диска, но наибольшую гибкость данная технология дает при использовании двух и более дисков в системе. Для эксперимента возьмем два раздела /dev/hda4 и /dev/hdс2. Общее распределение разделов на дисках будет таким.
/dev/hda1 — /boot
/dev/hda2 – swap (содержит и /tmp)
/dev/hda3 – корневой (/etc, /proc, /lib, /mnt, /bin, /sbin, /dev, /root)
/dev/hda4 — Будет использован с LVM
/dev/hdс1 – swap
/dev/hdс2 — Будет использован с LVM

 

Нобходимый софт

В большинтсве современных дистрибутивов, за исключением разве ориентированных на power user все необходимое для работы уже имеется. Некоторые программы установки (Fedora/Red Hat) позволяют создать LVM (и софт-RAID) в графическом режиме, но если честно мне они не кажутся интуитивными. Для поддержки технологии ядром при компиляции должны быть включены следующие опции. В секции Multi-device support (RAID and LVM) нужно включить, поддержку самих Multiple devices, и далее собственно менеджера логических томов (Logical volume manager (LVM) support).
В файле /usr/src/linux/.config нужно искать секцию:

#
# Multi-device support (RAID and LVM)
#
CONFIG_MD=y
# CONFIG_BLK_DEV_MD is not set
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
# CONFIG_MD_RAID1 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_MD_MULTIPATH is not set
CONFIG_BLK_DEV_LVM=y

Следующим шагом необходимо установить софт для работы с LVM (если его нет конечно). В Ubuntu достаточно ввести:

$ sudo apt-get install lvm2

В результате получите три группы утилит предназначенные для работы на «своем» уровне: pv* – работает с физическими томами, lg* с логическими группами и lv* с логическими томами. Все их можно найти при помощи табуляции. Так команды вида *create создает том или группу в зависимости от первых двух букв, *display выводит полную информацию и т.д.
Для начала создаем физические разделы с интдентификатором 8е. Для примера взят второй диск.
$ sudo /sbin/fdisk /dev/hdс

Command (m for help): p

Disk /dev/hdс: 3243 MB, 3243663360 bytes
128 heads, 63 sectors/track, 785 cylinders
Units = cylinders of 8064 * 512 = 4128768 bytes

Device Boot Start End Blocks Id System
/dev/hdb1 1 20 168682+ 82 Linux swap
/dev/hdb2 21 785 3165088+ b Win95 FAT32

Command (m for help): t
Selected partition 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)
Command (m for help): p

Disk /dev/hdс: 3243 MB, 3243663360 bytes
128 heads, 63 sectors/track, 785 cylinders
Units = cylinders of 8064 * 512 = 4128768 bytes

Device Boot Start End Blocks Id System
/dev/hdb1 1 20 168682+ 82 Linux swap
/dev/hdb2 21 785 3165088+ 8e Linux LVM


Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.

Теперь дисковые разделы превращаем в физический том, это своего рода форматирование, чтобы программы высшего уровня могли работать с ними. Причем если используется файловая система устройств devfs то необходимо задавать полное имя в соотсветвии с принятым обозначением т.е. что-то типа /dev/ide/host0/bus0/target0/lun0/part4, программы не распознают символических ссылок.
$ sudo /sbin/pvcreate /dev/hda4
pvcreate — physical volume «/dev/hda4″ successfully created
$ sudo /sbin/pvcreate /dev/hdb2
pvcreate — physical volume «/dev/hdb2″ successfully created
Теперь запускаем программу vgscan которая отыщет все разделы с индентификатором и создаст конфигурационные файлы /etc/lvmtab и /etc/lvmtab.d.
$ sudo /sbin/vgscan
vgscan — reading all physical volumes (this may take a while…)
vgscan — «/etc/lvmtab» and «/etc/lvmtab.d» successfully created
vgscan — WARNING: This program does not do a VGDA backup of your volume group

Дополнительно можно поверить, что думает о созданных физических томах система.
$ sudo /sbin/pvscan
pvscan — reading all physical volumes (this may take a while…)
pvscan — inactive PV «/dev/hda4″ is in no VG [1.27 GB]
pvscan — inactive PV «/dev/hdb2″ is in no VG [3.02 GB]
pvscan — total: 2 [4.29 GB] / in use: 0 [0] / in no VG: 2 [4.29 GB]

И теперь объединяем все в группу томов. Для этого вызывается команда vgcreate в качестве аргументов принимающая, условное имя будущей группы, которое может быть любым (кроме lvm) и разделы которые будут включены в эту группу. Дополнительно при помощи опции -s ##m можно задать размер physical extent (в большинтсве рекомендуют 32 Мб). По умолчанию создается линейный режим чередования. Если есть необходимость в полосатом режиме используйте опцию -i, a -l # при этом задаст размер чередующихся блоков.
$ sudo /sbin/vgcreate -s 32 test /dev/hda4 /dev/hdb2
vgcreate — INFO: maximum logical volume size is 2 Terabyte
vgcreate — doing automatic backup of volume group «test»
vgcreate — volume group «my» successfully created and activated

Обратите внимание на максимальный размер volume group, который в нашем случае равен 2Т, в умолчальном варианте его значение равнялось бы 256 Гб.
Теперь pvscan сообщит, что тома активированы.
$ sudo /sbin/pvscan
pvscan — reading all physical volumes (this may take a while…)
pvscan — ACTIVE PV «/dev/hda4″ of VG «test» [1.22 GB / 1.22 GB free]
pvscan — ACTIVE PV «/dev/hdb2″ of VG «test» [2.97 GB / 2.97 GB free]
pvscan — total: 2 [4.29 GB] / in use: 2 [4.29 GB] / in no VG: 0 [0]

И теперь нарезаем большую VG на логические томы требуемых размеров. При этом нужно учитывать, что урезание файловой системы и затем логического тома (вот именно в два этапа), немного более трудоемкий процесс, чем увеличение. Лучше создать минимально требуемый размер логического тома (с запасом), а затем при необходимости его просто увеличить до нужного. Создаем. При этом при помощи -L указывается нужный размер, а при помощи -n имя и в конце слудует имя VG. Если значение в килобайтах после него ставится K, в мегабайтах M и в гигабайтах G.
$ sudo /sbin/lvcreate -L 1G -n lvm_usr test && /sbin/lvcreate -L 1G -n lvm_home test
lvcreate — doing automatic backup of «test»
lvcreate — logical volume «/dev/test/lvm_usr» successfully created

lvcreate — doing automatic backup of «test»
lvcreate — logical volume «/dev/test/lvm_home» successfully created

Или для полосатости.
$ sudo lvcreate -n stripedlv -i 2 -I 64 mygroup -L 20M
Проверяем.
$ sudo /sbin/lvscan
lvscan — ACTIVE «/dev/test/lvm_usr» [1 GB]
lvscan — ACTIVE «/dev/test/lvm_home» [1 GB]
lvscan — 2 logical volumes with 2 GB total in 1 volume group
lvscan — 2 active logical volumes

Команда lvdisplay выдаст более подробную информацию. Обратите внимание на новое месторасположение вроде /dev/test/lvm_usr именно с ними прийдется работать в дальнейшем.
Следующим шагом будет создание файловых систем на логических томах. Это делается обычным образом как и для обычного дискового раздела, при этом может быть выбрана любая из поддерживаемых современным ядром файловых систем. Например создадим ReiserFS.
$ sudo /sbin/mkfs.reiserfs /dev/test/lvm_home
И монтируем в выбранное место.
$ sudo mkdir /home/test
$ sudo mount -t reiserfs /dev/test/lvm_home /home/test

$ df
/dev/hda3 4032124 2789108 1038188 73% /

/dev/test/lvm_home 1048540 32840 1015700 4% /home/test

Для автоматического монтирования раздела при загрузке системы в /etc/fstab добавляем следующие строки.
/dev/test/lvm_home /home/test reiserfs defaults 0 0
Чтобы система при загрузке могла обнаружить LVM необходимо чтобы в стартовых скриптах присутсвовали две команды (для различных дистрибутивов примеры смотрите в HOWTO).
/sbin/vgscan
/sbin/vgchange -ay

В RedHat 9 в /etc/rc.d/rc.sysinit все это было прописано такими строками.
# LVM initialization
if [ -f /etc/lvmtab -a ! -e /proc/lvm ] ; then
modprobe lvm-mod >/dev/null 2>&1
fi
if [ -e /proc/lvm -a -x /sbin/vgchange -a -f /etc/lvmtab ]; then
action $»Setting up Logical Volume Management:» /sbin/vgscan && /sbin/vgchange -ay
fi

В Ubuntu за LVM «отвечает» скрипт/etc/init.d/lvm.

И для размонтировани при остановке системы должна выполниться.
/sbin/vgchange -an

 

Изменение размеров раздела

Теперь давайте попробуем изменить размер раздела. ReiserFS можно при этом не размонтировать. Для изменения размера логического тома используется команда lvextend, в качестве параметров принимающая новый размер или число (положительное или отрицательное) на которое необходимо изменить раздел.
$ sudo /sbin/lvextend -L +1G /dev/test/lvm_home
lvextend — extending logical volume «/dev/test/lvm_home» to 2 GB
lvextend — doing automatic backup of volume group «test»
lvextend — logical volume «/dev/test/lvm_home» successfully extended

Теперь при помощи resize_reiserfs изменяем раздел самой файловой системы.
$ sudo /sbin/resize_reiserfs -f /dev/test/lvm_home
Проверяем.
$ df
dev/hda3 4032124 2789108 1038188 73% /

/dev/test/lvm_home 2097084 32840 2064244 2% /home/test

Как видите размер получился в два раза больший.
Уменьшение раздела производится в таком порядке:
- размонтируем файловую систему
- уменьшаем файловую систему с запасом
- уменьшаем размер логического тома при помощи lvreduce
расширяем файловую систему до заполнения всего тома
В командах это выглядит так.
$ sudo umount /dev/test/lvm_home
$ sudo resize_reiserfs -s -1.5G /dev/test/lvm_home
$ sudo lvreduce -L -1G /dev/test/lvm_home
$ sudo resize_reiserfs -f /dev/test/lvm_home

При работе с ext2 используется – resize2fs, XFS – xfs_growfs (но пока она урезаться не может).
И хотелось бы сказать еще об одной возможности LVM названное snapshots. Которое позволяет администратору создавать новое блочное устройство в который копируется логический том в «замороженном» на этот момент состоянии. Этот режим позволяет производить резервное копирование без закрытия приложений. Фактически теперь можно производить резарвное копирование при любой нагрузке. По окончанию процесса копирования администратор дожен удалить snapshots.
Создается snapshots командой lvcreate с ключом -s и с указанием размера, имени и логического тома состояние которого необходимо заморозить.
$ sudo lvcreate -L592M -s -n home_backup /dev/test/lvm_home
lvcreate — WARNING: the snapshot must be disabled if it gets full
lvcreate — INFO: using default snapshot chunk size of 64 KB for «/dev/test/home_backup »
lvcreate — doing automatic backup of «test »
lvcreate — logical volume «/dev/test/home_backup» successfully created

В результате образуется еще один логический том с именем /dev/test/home_backup.
Его можно смонтировать и посмотреть что там есть.
$ mkdir /mnt/snapshots
$ sudo mount /dev/test/home_backup /mnt/snapshots

mount: block device /dev/ops/dbbackup is write-protected, mounting read-only
Все теперь архивируем данные и удаляем snapshots.
$ sudo umount /dev/test/home_backup
$ sudo lvremove /dev/test/home_backup

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

1 Комментарий к Использование LVM

Аватар

Станислав

Апрель 8th, 2008 | 18:44

О! Спасибо! Интересная статья.

Комментировать

Наверх