Журнал LinuxFormat - перейти на главную

LXF83:HDD

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

LVM. Заводим виртуальные разделы

Долой тиранию фиксированных разделов диска — Нейл Ботвик покажет, как достичь гибкости при помощи управления логическими томами (Logical Volume Management).

Как управлять разделами? Спросите 10 пользователей Linux о лучшем способе разбиения жесткого диска — итогом будет не меньше 11 разных ответов. Вдобавок все ответы, вероятно, правильные: у каждого метода свои достоинства, все зависит от ваших намерений по использованию системы. Проблемы возникают намного позже, когда реальность расходится с планами и вы замечаете нехватку свободного места в одном разделе и ненужный избыток — в другом.

Размеры разделов можно изменить при помощи утилиты QtParted, но она (и инструменты, ею используемые) ограничивается отодвиганием конца раздела. Вы можете усечь раздел, чтобы высвободить место для нового раздела, или увеличить раздел, включив следующее за ним пустое пространство. Если надо расширить раздел /usr, вклинившийся между разделами root и home, то вам не повезло: придется произвести резервирование данных, удалить и вновь создать разделы, а потом восстановить данные из резервной копии.

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

Работаем со слоями

Требуются права root

Все команды LVM, используемые в данном уроке, требуют запуска с правами суперпользователя (root). Нужно будет открыть терминал и ввести

su -

а затем пароль суперпользователя. С очевидным исключением команд отображения, большинство LVM-команд деструктивны: они удаляют или затирают данные вашего жесткого диска, иногда и тайком. Помните присказку «компьютер делает то, что вы просите, а не то, что вы думаете», и будьте осторожны при запуске представленных здесь команд! Вероятно, хорошей идеей будет экспериментировать где-нибудь на нейтральной территории, например, на отдельном жестком диске. Если у вас такого нет, то для тестов вполне сгодятся приличной емкости USB-брелок или карта памяти в карт-ридере.

Можно также создать LVM на loop-устройстве. Это малоприменимо в реальности, но является хорошим способом экспериментировать, не трогая разделы вашего жесткого диска. Все, что вам нужно – это свободное место для создания loop-файла:

dd if=/dev/zero of=lvmtest bs=1M count=8192
losetup /dev/loop1 lvmtest
pvcreate /dev/loop1
vgcreate etc.

Здесь создается файл размером 8 ГБ, присоединяется к loop-устройству и используется в качестве физического тома для LVM.

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

CONFIG_MD=y
CONFIG_BLK_DEV_DM=y

Их можно найти в инструменте конфигурирования ядра: Device Drivers > Multi-Device Support (RAID и LVM) > Device Mapper Support

Имеется две версии Управления Логическими Томами: изначальная — LVM и последняя — LVM2. LVM2 в основном имеет обратную совместимость с LVM, но когда на этом уроке я говорю о LVM, то подразумеваю LVM2.

LVM предоставляет логические тома трех уровней: физические тома, группы томов и собственно логические тома. В самом низу находятся физические тома — это разделы жесткого диска, на которых хранятся данные (/dev/hda1, /dev/sdb3 и т. п.). Можно также создать физический том, охватывающий весь диск, в этом случае вам не нужно вначале разбивать этот диск на разделы. Один или несколько физических томов объединяются в группы — второй уровень. Вы можете рассматривать группу томов как виртуальный жесткий диск, который может иметь разделы более чем на одном физическом носителе. И, наконец, поверх групп томов создаются логические тома.

Все группы томов разбиваются на один или несколько логических томов, точно так же, как физический жесткий диск разбивается на один или несколько разделов. Основное отличие в том, что все становится более гибким — от размера виртуальных дисков и разделов до соглашений по именованию, которые вы используете. Здорово? Давайте начнем с низшего уровня: создадим несколько физических томов.

На дне

Небольшое предупреждение: начиная с этого момента, все приводимые команды требуют прав суперпользователя (см. врезку Требуются права root вверху). Поехали. Итак, физические тома создаются при помощи pvcreate; man-страница содержит множество опций, но обычно требуется указать только имя используемых раздела(-ов) или диска(-ов). Вот хорошие примеры этой команды:

  • pvcreate /dev/hda5
  • pvcreate /dev/md0
  • pvcreate /dev/sda7 /dev/sdb

Первая из них создает физический том на отдельном разделе; вторая делает то же самое на RAID-разделе. Третий пример создает физические тома в разделе первого диска и на всем втором диске. Если вы хотите создать физический том во весь диск, то последний при этом не должен содержать никаких разделов: если они есть, то pvcreate откажется работать с ним.

Разделы можно удалить при помощи любого инструмента разметки диска, например cfdisk, или командой

dd if=/dev/zero of=/dev/sdb bs=512 count=1

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

Работа с группами

Вообще-то наш друг pvcreate только подготавливает устройство для использования LVM — теперь вам необходимо создать одну или несколько групп томов. Для стандартного настольного ПК обычно вполне достаточно одной группы. Для масштабных или специализированных применений, например, серверов с интенсивной нагрузкой, может понадобиться больше. Но сам процесс одинаков, вне зависимости от количества созданных вами групп:

vgcreate myvg /dev/hda5 /dev/sdb

Здесь создается отдельная группа томов с именем myvg, состоящая из раздела на hda и целого sdb (в предположении, что они были подготовлены pvcreate). Кстати, вы можете спокойно проигнорировать любые ошибки, связанные с CD или DVD-приводами: это LVM сканирует ваши диски и выдает ошибку для любого устройства, содержащего диски только для чтения или без дисков.

Хотя общепринято давать группам томов нумерованные имена (vg00, vg01…), вы можете называть их по-своему. Например, если раздел вашей операционной системы размещается в одной группе, а сами вы работаете с другой, вы можете назвать их System и Work соответственно. Другая причина для использования своих собственных имен — избежание конфликтов: вдруг вам потребуется подсоединить другое устройство с группой томов под именем vg00, чтобы извлечь данные — возникнет путаница.

Чтобы проверить, создана ли группа томов, выполните

vgdisplay myvg

Выведется информация о вашей группе томов. Запустите ее без аргументов, чтобы увидеть параметры всех групп.

Наконец-то логические тома

Как увидеть тома и группы

Вы увидите, что можно создать несколько физических томов, групп томов и логических томов. Приятно, что есть команды, помогающие отследить, что происходит: pvdisplay, vgdisplay и lvdisplay показывают параметры ваших физических томов, групп томов и логических томов соответственно. При запуске команды без аргументов выводится список всех объектов данного типа. Вы можете ограничиться конкретными томами и/или группами, указав их в команде – например, так:

 vgdisplay myvg # информация об одной группе
 lvdisplay myvg # информация обо всех логических томах в группе
 lvdisplay /dev/myvg/myvol system/usr # информация об указанных логических томах

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

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

lvcreate --name myvol --size 5G myvg

Опция --name, как пояснил бы вам Шерлок Холмс, дает имя тому. Она не обязательна, но если ее опустить, том получит имя вида «volNN» — значимое имя, безусловно, лучше. Аргумент --size задает размер тома (ну, это же элементарно) и указывается он в мегабайтах, или по вашему выбору K, M, G или T (килобайты, мегабайты, гигабайты или терабайты, дорогой мой Ватсон). Вы должны указать или --size, или --extents. Extent (непрерывная область на диске) — это наименьшая единица данных в группе, аналогичная блоку физического диска. Размер по умолчанию — 4 МБ.

Ваш новый том находится в /dev/volumegroup/volumename, и команда

mke2fs -j /dev/myvg/myvol

создаст на новом томе файловую систему ext3.

Графическое администрирование

Я сосредоточился на командной строке потому, что это обычный способ администрирования LVM. Если исключить инструменты, специфичные для дистрибутивов, лучшим GUI-инструментом администрирования LVM является вездесущий Webmin. Он содержится в репозитариях большинства дистрибутивов и, возможно, уже установлен на вашем компьютере. Вы можете найти LVM-модули в разделе Оборудование (Hardware) пакета Webmin.

(thumbnail)
LVM-модуль для Webmin обеспечивает графический интерфейс управления томами и группами.

Повтором команды lvcreate вы можете добавлять логические тома, пока хватает свободного места на диске, но при этом следует помнить несколько моментов. Как вы скоро увидите, LVM чрезвычайно упрощает изменение размера логических томов, а вот изменение размера раздела проходит гладко только при его увеличении. Уменьшение размера раздела в лучшем случае рискованно, а для некоторых файловых систем невозможно (это зависит от распознания вашей файловой системы программой разметки — если у вас очень экзотическая файловая система или старая версия GParted, вряд ли это сработает).

Поэтому задавайте размер ваших логических томов в точности таким, как надо -завышать его, исходя из соображений «а вдруг потом потребуется больше», бессмысленно. По тем же причинам, хотя под группу томов и можно грохнуть все свободное место, крайности в этом нет — разве что при подлинной необходимости. Неиспользованное пространство можно приписать к любому логическому тому в любой момент. Однако не увлекайтесь таким подходом: большинство файловых систем при заполнении «под завязку» вынуждены фрагментировать файлы. Наилучшая производительность достигается при заполнении на 75-80 %. Рассчитайте размер каждого тома и добавьте к нему еще 30 %, чтобы дать файловой системе некоторое пространство для толкотни.

Добавляем пространства

Пока мы создавали одни логические тома, которые, похоже, не имеют особых преимуществ по сравнению с традиционными физическими. Но это только начало. Если вы решите, что вам нужно побольше места на myvol, нужно сделать всего лишь

lvresize --size +2G /dev/myvg/myvol

Это увеличит размер логического тома на 2 ГБ. Начало /dev/ не обязательно, но означает, что вы можете использовать завершение по клавише TAB в командной оболочке, чтобы убедиться, что имя верное.

Должен отметить, что эта команда изменяет размер только тома, а не его файловой системы. Увеличение размера тома, содержащего смонтированную файловую систему, вполне безопасно, но если вы хотите уменьшить размер тома, то прежде уменьшите размер файловой системы по крайней мере на ту же величину. При увеличении размера сначала увеличиваем размер тома, а затем файловой системы. Некоторые файловые системы позволяют увеличить их без размонтирования (а вот XFS разрешает изменение размера только в смонтированном состоянии). Попробуйте специализированные инструменты изменения размера файловых систем (например, resize2fs, resize_reiserfs, xfs_growfs etc) или графический инструмент вроде QtParted.

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

pvcreate /dev/hdb
vgextend myvg /dev/hdb

добавит весь /dev/hdb к существующей группе томов myvg (столь же просто вы можете создать раздел на диске и добавить его в группу томов). Мы можем использовать это пространство для создания дополнительных логических томов или для увеличения размера существующих. Использование LVM означает, что одну файловую систему можно разместить на сколь угодно большом количестве физических разделов и дисков, обеспечивающих требуемую память.

Уменьшение разделов

А как насчет перемещения и удаления элементов LVM? Для начала, логические тома могут быть удалены командой

lvremove myvg/myvol

Перед этим вы должны размонтировать раздел, иначе lvremove откажется выполнить ваш запрос. Удаленное пространство возвращается в группу томов.

Фильтрация неподходящих устройств

Хотя сообщения о якобы ошибках на /dev/cdrom или другом читающем устройстве безвредны, они изрядно раздражают. Чтобы LVM не обращался к /dev/cdrom, добавьте следующую строку в /etc/lvm/ lvm.conf:

filter = [ "r|/dev/cdrom|" ]

r означает reject (ignore) (отказать, игнорировать), а за ним следует регулярное выражение, обозначающее игнорируемые устройства. Эта строка, возможно, в файле уже есть, но в виде комментария – так раскомментируйте ее!

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

filter = [ "a/.*/" ]

разрешающая все. Поместите фильтры для конкретных устройств выше нее, и она станет актуальна только для неуказанных девайсов.

Другой вариант – ограничиться только отдельными устройствами, проигнорировав остальные. Попробуйте, например:

filter = [ "a|/dev/sd|", "a|/dev/md|", "r|.*|" ]

Тут содержатся сразу 3 фильтра. Первый разрешает SCSI- и SATA-устройства (если у вас SATA-диски и PATA DVD-привод), второй – программные RAID-девайсы, а третий запрещает все остальное. Исправив lvm.conf, запустите vgscan для обновления кэша, где LVM хранит результаты сканирования устройств.


Аналогично, vgremove удаляет группу томов целиком, но только после удаления всех ее логических томов командой lvremove.

Из группы томов можно также удалять отдельные физические тома. Это требует некоторой осторожности, так как перед удалением нужно убедиться, что на этом томе или диске не содержится данных из принадлежащих группе томов. Но это также означает, что вы в основном можете перенести систему на диск большего размера практически без простоя, кроме вызванного физическим переподключением дисков (или даже и без этого, если вы используете диски с «горячим» подключением). Я добавил «в основном», потому что любым не-LVM разделом потребуется заниматься отдельно. Дистрибутивы вроде Fedora Core размещают /boot на отдельном разделе, а все остальное на LVM. Поскольку в процессе работы системы /boot не требуется, то скопировать его достаточно легко.

Чтобы скопировать остатки системы, скажем с hda5 на hdb5, создайте физический том и добавьте его в группу томов, как описано выше. Теперь вам нужно убедиться, что все данные этой группы томов размещены на новом диске. Во-первых, удостоверьтесь, что места достаточно:

pvdisplay /dev/hda5 /dev/hdb5

Убедитесь, что свободный физический размер (Free PE) нового диска больше, чем занимаемый физический размер старого (Allocated PE). Если это так, то перенесите данные командой

pvmove /dev/hda5 /dev/hdb5

заменив, естественно, имена устройств в соответствии с вашей системой.

pvmove может перетаскивать данные довольно долго, но не пугайтесь: его действия не помешают вам работать за компьютером. Если событие вроде отключения питания или краха системы прервет процесс, запустите потом pvmove без параметров, и процесс продолжится с момента остановки. Используя pvdisplay, проверьте, что на старом диске нет занятого места, после чего удалите его из группы:

vgreduce myvg /dev/hda5
pvremove /dev/hda5

Первая команды удаляет раздел из группы томов (вы можете в этом убедиться при помощи vgdisplay). Вторая просто удаляет у раздела метку LVM.

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

pvmove --name myvg/myvol /dev/hda5 /dev/hdb5

Имя тома-назначения не обязательно; если вы его опустите, pvmove перенесет данные в свободные физические области текущей группы томов. Это весьма полезно, если у вас несколько физических томов, а удалить надо только один.

Команда pvmove /dev/hdaN очистит раздел N, переместив данные в свободные области группы, которой он принадлежит.

Прекрасные снимки

Загрузка с LVM

100% LVM-систему создать нельзя. Как минимум /boot обязан находиться на стандартном физическом разделе, чтобы загружать ядро с поддержкой LVM, да еще необходимы кое-какие программы для инициализации LVM-томов. Следовательно, нужно либо разместить root-раздел на физическом томе, либо записать соответствующие команды на начальный RAM-диск в /boot. Fedora Core использует последний подход, то есть все разделы, кроме одного небольшого, могут управляться LVM. В LVM можно поместить и раздел подкачки (swap), но веских причин для этого нет. Если вам понадобится временно увеличить его размер, можете создать логический том и добавить его к существующему разделу:

lvcreate --size 4G --name swap myvg
mkswap /dev/myvg/swap
swapon /dev/myvg/swap

Создание резервной копии работающей файловой системы не обходится без проблем. Резервирование — процесс не мгновенный, поэтому всегда существует вероятность, что файловая система за это время изменится. Особенно это касается резервирования /var, где файлы в каталогах типа /var/log или /var/lib могут изменяться ежеминутно (зачастую так и происходит). К счастью, LVM предоставляет измученным сисадминам опцию моментальных снимков логических томов. Взгляните сюда:

lvcreate --size 1G --snapshot --name mybackup myvg/myvol

Этот код создает новый логический том с именем mybackup, который является снимком нашего тома myvol. Содержимое /dev/myvg/myvol в момент выполнения команды lvcreate теперь располагается в /dev/myvg/mybackup. Оба тома находятся в одной группе томов, поэтому перед созданием резервной копии в группе должно быть обеспечено свободное место. Вам не потребуется полный размер исходного тома, поскольку в снимке хранятся только изменения, сделанные с момента его выполнения. Мы обошлись 1 ГБ, хотя размер myvg/myvol — 7 ГБ. В документации LVM рекомендован размер 15-20 % от исходного, но он зависит от того, насколько быстро меняются данные и как долго вам нужно хранить снимок. Если снимку не хватит места, он будет испорчен, так что отведите ему побольше.

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

lvcreate --size 500M --snapshot --name var-backup /dev/ myvg/var
mount /dev/myvg/var-backup /mnt/tmp
tar c /mnt/tmp >/dev/tape
umount /mnt/tmp
lvremove /dev/myvg/var-backup

Ваша собственная процедура резервирования, надеюсь, будет более элегантна, но эта наглядно иллюстрирует идею: снимок создается, используется для резервирования вместо работающей файловой системы, затем удаляется, а пространство возвращается группе томов. Что бы ни вносилось в var/log или var/lib/mysql, пока tar-архив пишется на ленту, оно будет проигнорировано — будут резервированы только файлы, имеющиеся в момент выполнения lvcreate.

Когда имена конфликтуют

Советы
  • Не экспериментируйте с тем, что не хотите потерять! Используйте вместо этого переносные или loop-устройства.
  • Не создавайте логические тома большего размера, чем нужно – при необходимости их легко увеличить.
  • Используете осмысленные имена для томов и групп.
  • Добавьте строку фильтрации в lvm.conf для отключения сканирования ненужных устройств и снижения времени загрузки.
  • Для быстрого просмотра ваших томов используйте Webmin.

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

vgscan
vgchange -a y

запускают сканирование групп томов и делают все найденные логические тома доступными.

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

vgrename oldvolgroup newvolgroup

Это довольно неудобно, поскольку дополнительный диск переименовать нельзя — конфликт имен с ходу прекратит распознавание. Нельзя также переименовать группу томов на вашем главном диске(-ах) при наличии смонтированной файловой системы. В любом случае, перед изменением потребуется отредактировать /etc/fstab, чтобы суметь после переименования заново смонтировать логические тома. Обычно наилегчайший способ -использовать для изменения имен LiveCD, в котором ничего не смонтировано. Если вы дали группам томов осмысленные имена вместо vgXX, то шансы конфликтов значительно снижаются, спасая вас от возможных огорчений в будущем.

После присоединения нового диска и выполнения vgscan/vgchange, вы сможете просмотреть логические тома при помощи lvdisplay и смонтировать как любую другую файловую систему.

Более мощные опции

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

Персональные инструменты
купить
подписаться
Яндекс.Метрика