- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF112:LVM
Материал из Linuxformat.
Содержание |
LVM: Виртуальные разделы
- Сражаетесь с созданием разделов при установке? Хотели бы файловую систему с гибко изменяемым размером или более чем на один диск? Спросите Роба Добози.
Представьте, что у вас есть волшебный нож, которым можно нарезать хлеб на ломтики и намазать их маслом. Вроде ничего магического, а? Теперь представьте, что этот нож позволяет снова слепить ломтики воедино или сделать их тоньше, не затрагивая масло на них. Примерно это и умеет делать технология LVM (Logical Volume Manager, Менеджер логических томов). Буханка хлеба – это ваш диск, ломтики – разделы на нем, масло – файловые системы с их содержимым, а LVM – тот самый волшебный нож.
LVM добавляет логический слой между физическим диском (им может быть реальный винчестер, RAID-массив или что-нибудь другое) и файловой системой. Этот логический слой (или том) затем может динамически изменять свой размер (если это поддерживается файловой системой), прозрачно перемещать файловую систему в другое физическое место, создавать снимки файловой системы, доступные для чтения-записи, или размазывать ваши данные между несколькими физическими накопителями.
Я работал в виртуальной машине, но вы можете взять реальную систему с несколькими неиспользуемыми разделами (не менее 100 МБ). Эквивалент дискового раздела LVM зовется логическим томом (volume), и файловая система обычно создается на нем. Логические тома объединяются в логические группы (volume group). Для создания группы тома нужен физический том (обычно созданный на дисковом разделе). Итак, это была теория, а теперь давайте взглянем, как создавать и использовать тома.
Часть 1 Базовые операции
Сперва надо идентифицировать и настроить существующие разделы. Важно, чтобы тип раздела был установлен в 8E (LVM). Будьте осторожны при экспериментах с разделами и томами, не то можно уничтожить ваши данные (все команды даются от имени суперпользователя-root).
#fdisk /dev/sdb [… куча ненужных нам строк ...] Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-65270, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-65270, default 65270): Using default value 65270 Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Давайте создадим физический том LVM:
#pvcreate /dev/sdb1
Physical volume “/dev/sdb1” successfully created
Теперь можно создать группу томов и назначить ей физический том. Вы можете дать группе томов любое содержательное имя, но хорошим решением будет использовать окончание ‘vg’. Это поможет легко идентифицировать файловые системы, находящиеся в ведении LVM.
#vgcreate testvg /dev/sdb1
Volume group “testvg” successfully created
Чтобы иметь возможность создавать файловые системы, сперва нужно создать логический том. Снова, вы можете использовать любое имя, но я рекомендую добавить ‘lv’ в его конец.
#lvcreate -L 20M -n testlv testvg
Logical volume “testlv” created
Теперь у вас есть логический том с именем testlv, занимающий 20 МБ (параметр -L). Он доступен через /dev/testvg/testlv (поняли, зачем нужно было ‘vg’ в конце имени группы томов?). Наконец, создадим файловую систему – допускается любой ее тип, но, пожалуйста, помните, что не все файловые системы поддерживают расширение или уменьшение, поэтому мы выберем ext3.
#mkfs.ext3 /dev/testvg/testlv [... куча удаленного ненужного текста …]
Чтобы пользоваться файловой системой, смонтируем ее где-нибудь: например, в точке монтирования /mnt/test.
#mkdir /mnt/test #mount /dev/testvg/testlv /mnt/test
Так файловая система смонтирована временно. После перезагрузки она исчезнет, и вам придется монтировать ее снова. Если вы хотите всегда иметь ее под рукой всегда, добавьте соответствующую строку в /etc/fstab.
Ищем информацию
Перед тем как тестировать, что мы понаделали, припомним и опробуем пару команд, которые могут предоставить информацию об всех компонентах LVM. Сперва мы создавали разделы и физические тома; о них расскажет pvdisplay. Как и все команды LVM, вызванная без параметров, она выведет сведения обо всех физических томах системы. Второй шла группа томов – vgdisplay позволит увидеть атрибуты указанных групп томов (или всех групп, при запуске без параметров). Обычно самой интересной частью информации, выдаваемой vgdisplay, является размер группы томов, PE size (размер физического экстента [диапазоны (обычно несколько мегабайт) физического диска, подобные кластерам, – прим. пер.]), полное, занятое и свободное число экстентов или МБ (Total PE, Alloc PE и Free PE). Последним объектом LVM является логический том. Команда, выводящая данные о нем, называется lvdisplay. Также интереснейшей информацией может быть размер логического тома (LV size): его значение отражает размер файловой системы. Можете попробовать эти команды друг за другом:
#pvdisplay /dev/sdb1 #vgdisplay testvg #lvdisplay /dev/testvg/testlv
А что у нас с файловой системой?
#df -h /mnt/test Filesystem Size Used Avail Use% Mounted on /dev/mapper/testvg-testlv 20M 1.2M 18M 7% /mnt/test
Вы заметили, что тут неверно? Мы создали и смонтировали файловую систему с /dev/testvg/testlv, а обнаружили, что она смонтирована с /dev/mapper/testvg-testlv. Все так и должно быть. Это нормально для LVM2, так как для обращения к ядру он использует device-mapper. Это второй способ узнать, что интересующее вас устройство, на самом деле, том LVM (первый способ заключается в соглашении об именовании, использованном при создании группы томов и самих томов).
Тестируем и изменяем размер
Ну вот, все создано; давайте проверим, работают ли тома, скопировав что-нибудь в файловую систему.
#cp /usr/bin/* /mnt/test/
Ой-ей!!! Если вы следуете этому учебнику слово в слово, вы должны увидеть следующее:
cp: cannot create regular file `/mnt/test/zjsdecode’: No space left on device cp: cannot create regular file `/mnt/test/zsoelim’: No space left on device
Что же произошло? Проверим-ка свободное место в файловой системе:
#df -h /mnt/test Filesystem Size Used Avail Use% Mounted on /dev/mapper/testvg-testlv 20M 20M 0 100% /mnt/test
Как видите, мы использовали все свободное пространство. Если бы эта файловая система была создана на дисковом разделе, единственным способом все исправить было бы удаление каких-нибудь данных или переразбиение диска, но LVM способен расширить логический том и файловую систему. Начнем с логического тома:
#lvdisplay /dev/testvg/testlv | grep Size LV Size 20.00 MB #lvextend -L100M /dev/testvg/testlv Extending logical volume testlv to 100.00 MB Logical volume testlv successfully resized #lvdisplay /dev/testvg/testlv | grep Size LV Size 100.00 MB
Файловую систему ext3 вы можете расширить «на лету», без останова.
#resize2fs /dev/testvg/testlv resize2fs 1.40.8 (13-Mar-2008) Filesystem at /dev/testvg/testlv is mounted on /mnt/test; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/testvg/testlv to 102400 (1k) blocks. The filesystem on /dev/testvg/testlv is now 102400 blocks long. #df -h /mnt/test Filesystem Size Used Avail Use% Mounted on /dev/mapper/testvg-testlv 98M 20M 74M 22% /mnt/test
Глядя на вывод df выше, я счел, что файловая система великовата, и решил ее чуть-чуть уменьшить. При этом следует знать, что LVM распределяет место в «экстентах»; размер экстента показывается в выводе vgdisplay как поле ‘PE size’, и по умолчанию он равен 4 МБ. Размер логического тома уменьшается кратно экстенту. Первый шаг – уменьшение размера файловой системы. Увы, в реальном времени ext3 такого не умеет, поэтому придется сперва отмонтировать файловую систему и запустить проверку (fsck).
#umount /mnt/test #e2fsck -f /dev/testvg/testlv [... удаленные всякие ненужные строки ...] /dev/testvg/testlv: 426/22256 files (1.2% non-contiguous), 22964/102400 blocks
Проверка убеждает, что файловая система в порядке, и дает возможность ее уменьшения с минимальным риском.
#resize2fs /dev/testvg/testlv 50M resize2fs 1.40.8 (13-Mar-2008) Resizing the filesystem on /dev/testvg/testlv to 51200 (1k) blocks. The filesystem on /dev/testvg/testlv is now 51200 blocks long.
Немного математики. Пятьдесят не делится на четыре без остатка. Если мы попытаемся уменьшить размер логического тома до 50 МБ, он станет 48 МБ или 52 МБ. К счастью, lvreduce хватает ума выбрать большее значение.
#lvreduce -L 50M /dev/testvg/testlv Rounding up size to full physical extent 52.00 MB WARNING: Reducing active logical volume to 52.00 MB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce testlv? [y/n]: y Reducing logical volume testlv to 52.00 MB Logical volume testlv successfully resized
Последним шагом будет еще одно изменение размера файловой системы, для использования всего доступного пространства.
#resize2fs /dev/testvg/testlv resize2fs 1.40.8 (13-Mar-2008) Resizing the filesystem on /dev/testvg/testlv to 53248 (1k) blocks. The filesystem on /dev/testvg/testlv is now 53248 blocks long.
Теперь можно заново смонтировать файловую систему и проверить, что она имеет корректный размер.
#mount /dev/testvg/testlv /mnt/test/ #df -h /mnt/test Filesystem Size Used Avail Use% Mounted on /dev/mapper/testvg-testlv 51M 20M 30M 40% /mnt/test
Пожалуйста, помните про размер экстента при изменении размера логических томов и проверяйте, что размер нового тома такой же или больше, чем размер файловой системы.
Подходящими инструментами, размер большинства современных файловых систем можно менять – у некоторых даже «на лету». Здесь важно знать ограничения: например, некоторые файловые системы нельзя уменьшать: они только расширяются, да и то когда отмонтированы. Прочитайте соответствующую man-страницу и протестируйте команду, прежде чем применять ее на реальных данных.
ext2/3 | resize2fs |
---|---|
jfs | mount -o remount,resize /filesystem |
reiserfs | resize_reiserfs |
xfs | xfs_growfs |
Часть 2 Операции посложнее
LVM позволяет создать копию логического тома для определенного момента времени (ее называют снимком). Так и слышу ваш стон: «А это еще зачем?» Хорошо, представим, что у вас есть база данных (или другое приложение), и вы хотите сделать полноценную резервную копию. Для этого придется завершить работу или, как минимум, приостановить ее. Однако создание резервной копии требует времени – и система долго будет недоступна. А вот с LVM можно остановить вашу базу данных, сделать снимок ее файловой системы и запустить ее снова, что займет пару секунд. К состоянию, зафиксированному снимком, можно вернуться.
Другой пример касается виртуализации. Пусть вы хотите протестировать нечто на вашей виртуальной машине, но боитесь, что она от этого сломается. Решение очень простое: создайте снимок файловой системы, на которой расположен образ диска вашей виртуальной машины. Теперь можете запустить виртуальную машину из этого снимка, выполнить ваш тест, и если что-то пойдет не так, просто удалить снимок. Данные на момент создания снимка в вашей исходной файловой системе уцелеют. Хитро! [даже слишком: возможность делать снимки состояния гостевой ОС есть в большинстве виртуальных машин, например, VirtualBox, – прим. ред.] Итак, что надо сделать? Сперва убедимся, что в группе томов достаточно места (см. vgdisplay ранее). Если да, то просто создадим новый логический том с параметром -s (снимок) и смонтируем его, как если бы он был обычной файловой системой.
#lvcreate -s -L50M -n testlvsnap /dev/testvg/testlv Rounding up size to full physical extent 52.00 MB Logical volume “testlvsnap” created #mkdir /mnt/snap #mount /dev/testvg/testlvsnap /mnt/snap #df -h /mnt/test /mnt/snap Filesystem Size Used Avail Use% Mounted on /dev/mapper/testvg-testlv 51M 20M 30M 40% /mnt/test /dev/mapper/testvg-testlvsnap 51M 20M 30M 40% /mnt/snap
Они оба выглядят одинаково. Вы можете перепроверить это, запустив следующие команды (их вывод мы удалили, так как он слишком длинный):
#diff /mnt/test /mnt/snap/ #ls -l /mnt/test #ls -l /mnt/snap
Теперь можно убедиться, что LVM и вправду умеет удалять и создавать любые файлы в нашем снимке.
#rm -rf /mnt/snap/* (БУДЬТЕ ОСТОРОЖНЫ С ЭТОЙ КОМАНДОЙ!) #touch /mnt/snap/SNAP_TEST #touch /mnt/test/ORIG_TEST #ls -l /mnt/test #ls -l /mnt/snap
Если снимок больше не нужен, его можно удалить тем же способом, что и логический раздел.
#umount /mnt/snap #lvremove /dev/testvg/testlvsnap Do you really want to remove active logical volume “testlvsnap”? [y/n]: y Logical volume “testlvsnap” successfully removed
Одним махом
Если вы интересуетесь, как работает механизм снимков, то все несложно. При создании снимка LVM ничего не копирует: в группе томов просто отводится требуемое место и затем начинается отслеживание изменений. И оригинал, и снимок вначале указывают на те же блоки данных. Если какие-то из них модифицируются, LVM создаст копию измененных данных и сохранит их отдельно. Эта техника называется копированием-при-записи, так что снимки создаются моментально, вне зависимости от размера файловой системы.
Другая дополнительная возможность LVM – прозрачный перенос данных между физическими томами. Он экономит время при замене жесткого диска. Без LVM пришлось бы загружаться с CD и использовать его для копирования файловых систем – а с LVM можно просто добавить новый диск (или его раздел) в имеющуюся группу томов и велеть LVM переместить все на него. Чтобы проделать следующее упражнение, вы должны иметь доступ к другому разделу (неважно, на другом он диске или на том же самом). Создайте раздел и установите его тип в 8E, как мы делали ранее.
#pvcreate /dev/sdc1 Physical volume “/dev/sdc1” successfully created #vgextend testvg /dev/sdc1 Volume group “testvg” successfully extended
Нашей группе томов теперь отведено два физических тома (sdb1 и sdc1). Так вы можете расширить существующую группу томов (и ее тома). Это также и способ создания файловых систем, превышающих размер одного диска. Далее нам нужно переместить данные на новый том и удалить старый диск:
#pvmove /dev/sdb1 /dev/sdc1 /dev/sdb1: Moved: 100.0% #vgreduce testvg /dev/sdb1 Removed “/dev/sdb1” from volume group “testvg”
Pvmove физически перемещает все данные с одного тома на другой. На нашей крошечной файловой системе это займет несколько секунд, но на большой системе (особенно если она постоянно используется) может потребоваться несколько часов.
Часть 3 Установка или конвертирование в LVM
GParted – отличный инструмент, но он не поддерживает изменение размера томов LVM. Для этого следует пользоваться средствами командной строки или специализированными инструментами с графическим интерфейсом.
Однако GParted умеет изменять размер файловой системы, расположенной на томе LVM.
Ну что, убедились, что, после нарезания хлеба, LVM – самая отличная штука? Захотелось перевести свою систему на управляемые тома LVM? Не бойтесь, это довольно просто. Fedora и CentOS практически идентичны, и обе будут использовать LVM, если вы выберете стандартную установку. OpenSUSE позволит выбрать между установкой на обычный раздел и установкой на основе LVM, Ubuntu Server также имеет снабженную описанием установку с использованием LVM. Единственным дистрибутивом, из мной протестированных, который не поддерживает установку на LVM, является Ubuntu Desktop. К счастью, есть обходной путь. Подробности ищите здесь: http://www.debuntu.org/how-to-install-ubuntu-over-lvm-filesystem.
А что делать, если вы желаете использовать LVM на существующих файловых системах, но не хотите переустанавливать систему? К сожалению, нет магического инструмента, умеющего преобразовывать разделы в логические тома. Вы можете сделать это, но файловая система должна иметь по крайней мере 50% свободного места. (Альтернатива – использовать запасной диск или другой раздел, где места достаточно.) Прежде чем менять разделы и файловые системы, пожалуйста, позаботьтесь о резервных копиях ваших ценных данных.
Во-первых, создайте новый раздел, используя свободное место на диске. Наилучший инструмент для этого – GParted. Теперь установите тип раздела в LVM (с помощью fdisk или cfdisk), создайте физический том, группу томов и логический том, а затем и файловую систему. Используйте что-нибудь подходящее, типа dd, cpio, dump/restore или tar, для копирования данных в новую файловую систему. Сделав это, измените тип исходного раздела на LVM, создайте на нем физический том и добавьте его в группу томов. Теперь можете расширить логический том до требуемого размера.
Если вы намерены конвертировать в LVM вашу корневую файловую систему, загрузитесь с любого LiveCD/DVD и выполните все действия оттуда. Следует также знать, что на логическом томе нельзя размещать /boot, иначе вы вообще не сможете загрузить вашу систему. Причина здесь в том, что загрузчики (в частности, Grub) не понимают LVM и не могут найти ядро для загрузки.
И более того
Мы рассмотрели часть основных и чуть-чуть расширенных возможностей менеджера логических томов. LVM, однако, умеет больше, особенно если у вас не один диск. Например, если назначить два физических тома на группу томов, LVM употребит все доступное пространство на первом томе, а затем перейдет на второй. Хотя, возможно, было бы быстрее читать и писать на два диска параллельно – поэтому можно велеть LVM размещать порции данных на нескольких физических томов по принципу RAID0. LVM не предусматривает избыточности данных, как RAID1 или 5, но физические тома можно организовать на основе устройств Linux Software RAID (md): создать несколько md-устройств, а затем объединить их в один или более логических томов.
Я также обошел вниманием некоторые функции, типа поддержки кластеризации, и команды, такие как vgscan, vgchange и vgs. Если вы хотите узнать о них больше, взгляните на документ LVM HOWTO на http://www.tldp.org/HOWTO/LVM-HOWTO. Местами он немного устарел, но все еще является прекрасным источником информации.