В набравшей наибольшую популярность архитектуре персональных компьютеров (x86, PC) для разделения физических дисков на разделы до сих пор используется система, разработанная еще в незапамятные времена. Многие считают ее единственной возможной, и даже привыкли мириться с ее недостатками, принимая их как данность. Однако существуют значительно более удобные решения, в частности LVM, о котором и пойдет речь.
Введение
LVM представляет собой прослойку между низкоуровневыми разделами (или любыми другими блочными устройствами — непосредственно дисками, [софт]рейд массивами, и вообще чем угодно) и — на выходе — разделами диска. Эта технология доступна в linux, очень удобна в эксплуатации, довольно проста и открывает большое пространство для творчества.
Основное предназначение — абстрагирование «разделов» от физических устройств хранения. Сразу хочу оговориться, что в основном эта технология применима к стационарным устройствам: на сменных и сетевых носителях она неудобна и бессмысленна.
Предоставляемые возможности:
- Распределения одного раздела по нескольким физическим дискам: пропадает проблема «у меня два винчестера, надо записать N гигабайт данных, суммарное свободное место это позволяет, но ни на одном из носителей столько нет».
- Разделы отвязаны и от файловых систем: с точки зрения ОС они не отличаются от старых добрых разделов диска. ФС накладываются уже поверх, и соответственно можно использовать любые ФС.
- Создание и удаление разделов просто, быстро, и допустимо непосредственно во время работы системы.
- Изменение размеров разделов в произвольное время и в произвольную сторону. Т.к. разделы не обязаны распологаться единым блоком, то перемещения разделов для изменения размера не нужно. И, опять же, это допустимо во время работы ОС. С учетом того, что многие файловые системы тоже позволяют изменять свой размер (ext*, reiserfs, xfs и другие) во время работы, открываются весьма удобные возможности.
- Снапшоты разделов: очень удобная фича, позволяющая моментально создавать как read-only, так и read-write копию раздела, изменения в которой не связаны с изменениями раздела-источника. Позволяет делать резервные копии изменяющихся систем, гарантируя атомарную копию (т.е. моментальную, в которой не окажется что часть файлов изменилась до начала бекапа, а часть после, обеспечивая целостность бекапа) всего раздела.
- Миграция разделов с одних физических дисков на другие: хот-своп во всей красе. Если винчестер необходимо заменить, то прямо во время работы, без ведома программ, данные переезжают с него на другой. При аппаратной поддержке хот-свопа позволяет менять накопители во время работы.
- Имена разделов не зависят от того, на каких дисках они размещены. Что довольно удобно при загрузке системы: корневая ФС всегда будет на одном и том же устройстве.
- Появляется совершенно другая стратегия разбиения дисков. Вместо «надо хорошо подумать как я в будущем буду использовать, на какие разделы бить и т.п., ведь потом изменить что-либо будет крайне сложно или вообще невозможно» лучше использовать «я разобью диск так, как мне удобно. Выделю разделам столько места, сколько им нужно, а то что останется — пускай остается не разбитым. Когда понадобится еще место, я воспользуюсь им так, как будет нужно, ведь это не потребует даже перезагрузок»
Что LVM не предоставляет:
- Обеспечение отказоустойчивости: это задача рейдов, бекапов и т.п.
- Шифрования данных: опять же, это задача решается другими системами: dm-crypt, LUKS и т.п. Однако LVM позволяет использовать зашифрованные носители как основу для себя, так и размещать поверх создаваемых разделов зашифрованные системы.
Используемые понятия:
- Физический раздел (physical volume) — некоторое устройство хранения данных. Диск полностью, раздел диска, или любое другое блочное устройство.
- Группа томов (volume group) — набор физических разделов, используемых как единое целое.
- Логический раздел (logical volume) — находящийся в группе томов раздел, представляет собой блочное устройство.
В одну группу томов может входить сколько угодно физических разделов, и одна группа томов может предоставлять сколько угодно разделов логических. Распределение логических разделов по физическим может быть каким угодно, и обычно этим занимается сама система LVM. Однако влиять на это можно и вручную.
Настройка LVM
Все сведения можно подчерпнуть из LVM HOWTO, я же лишь вкратце опишу основные этапы:
- Удостоверяемся что установлены необходимые программы: «aptitude install lvm2»
- Удостоверяемся что загружены необходимые модули: »modprobe dm_mod»
- Отмечаем выделяемые для LVM диски/разделы как physical volume: «pvcreate /dev/раздел». Внимание: информация на этих дисках/разделах будет потеряна.
- Создаем группу томов: «vgcreate имя_группы /dev/раздел1 /dev/раздел2»
- Создаем логические разделы в группе: «lvcreate -L размер -n имя_раздела имя_группы»
- Создаем файловые системы на логических разделах: «mke2fs -j /dev/имя_группы/имя_раздела»
- Монтирование как обычно, имя устройства /dev/имя_группы/имя_раздела или /dev/mapper/имя_группы-имя_раздела (первое — символическая ссылка на второе)
Все, этого достаточно.
Загрузка с LVM
К сожалению на этапе загрузки компьютера столь сложные системы еще недоступны, поэтому непосредственно с LVM грузиться нельзя. Однако есть простое и гибкое решение: создается отдельный загрузочный раздел, /boot, на котором размещается загрузчик, ядро и initrd образ.
В дебиане система генерации initrd автоматически включит все необходимое для загрузки с LVM. В параметры ядра для загрузки достаточно включить «root=/dev/mapper/system-root» (имя раздела естественно указывайте свое).
Типичные операции с LVM
Добавление нового устройства хранения в систему
- Я рекомендую добавлять не диски целиком, а создавать раздел на весь диск и добавлять уже его: в таком случае в системах без LVM диск будет виден как занятый, а не как пустой. Это более устойчиво к ошибкам (внимание, последующие операции приведут к утере данных на диске! Жирным выделен пользовательский ввод. Конкретные цифры и имена будут отличаться):
# parted /dev/disk
GNU Parted 1.8.8.git-dirty
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) print free
Error: /dev/disk: unrecognised disk label
(parted) mklabel msdos
Disk /dev/disk: 2048s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
63s 2047s 1985s Free Space
(parted) mkpart primary 63s 1985s
(parted) print free
Disk /dev/disk: 2048s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 2047s 1985s primary
(parted) toggle 1 lvm
(parted) print
Disk /dev/disk: 2048s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 63s 2047s 1985s primary lvm
(parted) quit
Information: You may need to update /etc/fstab.
#
- Отмечаем раздел как физический том LVM: «pvcreate физический_раздел»
- Добавляем физический том в нужную группу: «vgextend группа_томов физический_раздел»
Удаление устройства хранения из системы
- Высвобождаем раздел устройства от данных: «pvmove физический_раздел»
- Убираем раздел устройства из группы томов: «vgreduce группа_томов физический_раздел»
- Снимаем с раздела возможность участвовать в LVM: «pvremove физический_раздел»
- Повторяем шаги 1-3 для всех разделов устройства.
- Удостоверяемся что все физические разделы устройства в LVM отсутствуют: «pvdisplay».
- Все, устройство из системы можно извлекать.
Миграция с одних носителей на другие
Заключается в добавлении новых с последующим удалением старых.
Увеличение размера ФС
- Увеличиваем размер логического тома: «lvextend -L +10G группа_томов/имя_раздела»
- Изменяем размер ФС: «resize2fs /dev/mapper/группа_томов-имя_раздела» (для ext*)
Уменьшение размера ФС
Внимание: эта операция потенциально опасна. Также для уменьшения обычно требуется отмонтировать раздел. По мере возможности этой операцией лучше не пользоваться. Следует выделять место для разделов по мере надобности, чтобы не приходилось прибегать к уменьшению разделов.
- Отмонтируем раздел: «umount /dev/mapper/группа_томов-имя_раздела»
- Проверяем ФС раздела: «fsck -f -C0 /dev/mapper/группа_томов-имя_раздела»
- Изменяем размер ФС: «resize2fs -p /dev/mapper/группа_томов-имя_раздела новый_размер»
- Изменяем размер логического тома: «lvresize -v -L новый_размер группа_томов/имя_раздела»
- Проверяем ФС еще разок: «fsck -f -C0 /dev/mapper/группа_томов-имя_раздела»
Еще раз: с размерами необходимо быть крайне внимательным, чтобы не оказалось что размер тома меньше чем размер ФС. Это может вызвать необратимые повреждения данных. Для защиты от ошибок могу предложить уменьшать ФС до мéньшей величины чем раздел, потом уменьшать раздел, а потом увеличить размер ФС под раздел: «resize2fs /dev/mapper/группа_томов-имя_раздела».
У относительно свежей утилиты lvresize есть флаг -r, который позволяет автоматически изменять размер ФС раздела. Его использование позволяет значительно уменьшить риск накосячить. Также перед уменьшением раздела рекомендую запустить команду уменьшения с флагами -t -v и внимательно посмотреть, что LVM планирует сделать.