LVM

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page LVM and the translation is 77% complete.
Outdated translations are marked like this.


Не следует путать с LLVM.


LVM (Logical Volume Manager) позволяет администраторам создавать метаустройства, предоставляющие уровень абстракции между файловой системой и нижним уровнем — физическими устройствами хранения. Такие метаустройства (на которых размещены файловые системы) называются логическими томами (logical volumes), они используют память набора устройств хранения — группы томов (volume groups). Группа томов включает один или несколько физических томов (physical volumes), которые, собственно, и хранят данные.

Физические тома могут быть разделами, целыми жесткими дисками SATA, сгруппированными как JBOD (Just a Bunch Of Disks - просто пачка дисков), системы RAID, iSCSI, Fibre Channel, eSATA и др.

Установка

LVM регулируется как драйверами уровня ядра, так и пользовательскими приложениями для управления настройкой LVM.

Ядро

Активируйте следующие параметры ядра:

ЯДРО Включение LVM
'"`UNIQ--pre-00000001-QINU`"'
Заметка
Не требуется включать абсолютно все; некоторые из параметров требуются только для снимков и тонких снимков LVM2, зеркалирования LVM2, RAID0 в LVM2 и шифрования.

USE-флаги

USE flags for sys-fs/lvm2 User-land utilities for LVM2 (device-mapper) software

lvm Build all of LVM2 including daemons and tools like lvchange, not just the device-mapper library (for other packages to use). If your system uses LVM2 for managing disks and partitions, enable this flag.
readline Enable support for libreadline, a GNU line-editing library that almost everyone wants
sanlock Enable lvmlockd with support for sanlock
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur
static !!do not set this during bootstrap!! Causes binaries to be statically linked instead of dynamically
static-libs Build static versions of dynamic libraries as well
systemd Enable use of systemd-specific libraries and features like socket activation or session tracking
thin Support for thin volumes
udev Enable virtual/udev integration (device discovery, power and storage device support, etc)
valgrind Enable annotations for accuracy. May slow down runtime slightly. Safe to use even if not currently using dev-debug/valgrind

Важно
For all instructions requiring the use of the lvm, pv*, vg*, or lv* commands in this article as well as access of LVM volumes, the lvm USE flag is required to be enabled.

Emerge

Make sure to enable the lvm USE flag for sys-fs/lvm2:

ФАЙЛ /etc/portage/package.use
# Enable support for the LVM daemon and related tools
sys-fs/lvm2 lvm

После настройки USE-флагов, попросите Portage установить пакет sys-fs/lvm2:

root #emerge --ask sys-fs/lvm2

Конфигурация

Настройка LVM выполняется на нескольких уровнях:

  1. Управление логическими томами (LV), физическими томами (PV) и группами томов (VG) с помощью утилит управления
  2. Тонкая настройка подсистемы LVM с помощью файла конфигурации
  3. Управление сервисом на уровне дистрибутива
  4. Настройка с помощью initramfs

Управление логическими и физическими томами, наряду с группами томов, рассматривается в главе использование.

Файл конфигурации LVM

LVM обладает обширным файлом конфигурации, располагающимся в /etc/lvm/lvm.conf. Большинству пользователей не требуется изменять настройки в этом файле для того, чтобы начать использовать LVM.

Управление сервисом

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

Этим сервисом можно управлять с помощью системы init.

openrc

Для запуска LVM вручную:

root #/etc/init.d/lvm start

Для запуска LVM во время загрузки:

root #rc-update add lvm boot

systemd

Для запуска lvm вручную:

root #systemctl start lvm2-monitor.service

Для запуска LVM во время загрузки:

root #systemctl enable lvm2-monitor.service

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

Большинство загрузчиков не способны загрузиться непосредственно с LVM. С этим не могут справиться ни GRUB legacy ни LILO. Grub 2 может загрузиться с "линейного" логического тома LVM (linear logical volume), "зеркального" логического тома (mirrored logical volume) и, возможно, некоторых видов логических томов RAID. На данный момент ни один загрузчик не поддерживает "тонкие" логические тома (thin logical volumes).

По этой причине рекомендуется использовать загрузочный раздел без LVM и монтировать корневой раздел LVM из initramfs. Такая initramfs может быть сгенерирована автоматически с помощью genkernel, sys-kernel/genkernel-next и dracut:

  • genkernel может загружаться с разделов любого типа, кроме тонких разделов (так как он не компилирует и не копирует бинарные файла пакета sys-block/thin-provisioning-tools с хоста сборки), и, может быть, RAID10 (поддержка RAID10 требует LVM2 2.02.98, но genkernel собирает версию 2.02.89, однако если существуют статические бинарные файлы, он может их скопировать)
  • dracut должен загружаться с разделов любого типа, но он включает поддержку тонких разделов в initramfs только если корневой раздел хоста является тонким.

Genkernel/Genkernel-next

Установите sys-kernel/genkernel. Можно включить USE-флаг static для пакета sys-fs/lvm2, чтобы genkernel использовал бинарные файлы, найденные на системе (в противном случае он будет собирать свою собственную копию). Следующий пример соберет только initramfs (не все ядро) и добавит поддержку LVM.

root #genkernel --lvm initramfs

Man-страница genkernel описывает другие опции, использование которых зависит от требований системы.

Initrd требует параметров, которые сообщают ей, как запустить LVM. Их можно передать также, как и остальные параметры ядра. Например:

ФАЙЛ /etc/default/grubДобавьте dolvm как параметр ядра при загрузке
GRUB_CMDLINE_LINUX="dolvm"

Dracut

Пакет sys-kernel/dracut был портирован из проекта RedHat и является похожим инструментом для генерирования initramfs. За более подробной информацией обратитесь к статье Dracut. Обычно следующие команды сгенерируют пригодную для использования initramfs по умолчанию.

root #dracut -a lvm

Initrd требует параметров, которые сообщают, как запустить LVM, и их можно передать также, как и остальные параметры ядра. Например:

ФАЙЛ /etc/default/grubДобавление поддержки LVM как параметр ядра при загрузке
GRUB_CMDLINE_LINUX="rd.lvm.vg=vol00"

Для полного списка опций по LVM в dracut, просмотрите раздел в руководстве по Dracut.

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

LVM организует хранение на трех различных уровнях, описанных ниже:

  • Жесткие диски, разделы, системы RAID, либо другие источники хранения инициализируются как Физические Тома (PV)
  • Физические тома (PV) группируются вместе в Группы Томов (VG)
  • Логические Тома (LV) создаются в Группах Томов (VG)

PV (Физический Том)

Физические тома это действительное железо, либо система хранения, для которой и собран LVM

Разбивка

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

Тип раздела для LVM это 8e (Linux LVM).

Например, чтобы установить тип с помощью fdisk для раздела на /dev/sda:

root #fdisk /dev/sda

В fdisk, создайте разделы, используя клавишу n, а затем измените тип раздела с использованием клавиши t на 8e.

Создание PV

Физические тома можно создать и инициализировать с помощью команды pvcreate.

Например, следующая команда создает физический том на первом главном разделе /dev/sda и /dev/sdb:

root #pvcreate /dev/sd[ab]1

Получение списка PV

С помощью команды pvdisplay можно получить обзор всех активных физических томов на системе.

root #pvdisplay
 --- Physical volume ---
  PV Name               /dev/sda1
  VG Name               volgrp
  PV Size               160.01 GiB / not usable 2.31 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              40962
  Free PE               4098
  Allocated PE          36864
  PV UUID               3WHAz3-dh4r-RJ0E-5o6T-9Dbs-4xLe-inVwcV
  
 --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               volgrp
  PV Size               160.01 GiB / not usable 2.31 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              40962
  Free PE               40962
  Allocated PE          0
  PV UUID               b031x0-6rej-BcBu-bE2C-eCXG-jObu-0Boo0x

Если необходимо отобразить больше физических томов, то pvscan может определить неактивные физические тома и активировать их.

root #pvscan
  PV /dev/sda1  VG volgrp        lvm2 [160.01 GiB / 16.01 GiB free]
  PV /dev/sdb1  VG volgrp        lvm2 [160.01 GiB / 160.01 GiB free]
  Total: 2 [320.02 GB] / in use: 2 [320.02 GiB] / in no VG: 0 [0]

Удаление PV

LVM автоматически распределяет данные на все доступные физические тома (если не указано иное), но линейно. Если запрошенный логический том (внутри группы томов) меньше, чем объем свободного пространства на одном физическом томе, то все пространство для логического тома будет выделено на этом (одном) физическом томе, и оно будет непрерывно. Это сделано из соображений производительности.

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

root #pvmove -v /dev/sda1

Такая операция может занять достаточно долгое время, в зависимости от объема данных, которые необходимо перенести. Как только она будет закончена, на устройстве не останется данных. Проверьте с помощью команды pvdisplay, что физический том больше не используется никаким логическим томом.

Следующий шаг — это удаление физического тома из группы томов с использованием vgreduce, после чего устройство можно "перестать" считать физическим томом, используя pvremove:

root #vgreduce vg0 /dev/sda1 && pvremove /dev/sda1

VG (Группа Томов)

Группа томов (VG) это некоторое число физических томов, которые отображаются как /dev/ИМЯ_VG в файловой системе устройств. Имя группы томов выбирается администратором.

Создание VG

Следующая команда создает группу томов под названием vg0, которой назначены два физических тома /dev/sda1 и /dev/sdb1.

root #vgcreate vg0 /dev/sd[ab]1

Получение списка VG

Чтобы получить список всех активных групп томов, используйте команду vgdisplay:

root #vgdisplay
  --- Volume group ---
  VG Name               vg0
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  8
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                6
  Open LV               6
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               320.02 GiB
  PE Size               4.00 MiB
  Total PE              81924
  Alloc PE / Size       36864 / 144.00 GiB
  Free  PE / Size       45056 /176.01 GiB
  VG UUID               mFPXj3-DdPi-7YJ5-9WKy-KA5Y-Vd4S-Lycxq3

Если группы томов отсутствуют, используйте команду vgscan, чтобы найти группы томов:

root #vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg0" using metadata type lvm2

Расширение VG

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

В следующем примере мы расширим группу томов vg0 у которой физическим том на /dev/sdc1:

root #vgextend vg0 /dev/sdc1

Помните, что сначала физический том должен быть инициализирован как таковой!

Уменьшение VG

Если физические тома нужно удалить из группы томов, то данные, которые все еще используются на физическом томе нужно перенести на другие физические тома в той же группе томов. Как мы видели выше, это делается с помощью команды pvmove, после чего физический том можно удалить из группы томов, используя vgreduce:

root #pvmove -v /dev/sdc1
root #vgreduce vg0 /dev/sdc1

Удаление VG

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

root #vgremove vg0

LV (Логический Том)

Логические тома это финальные мета-устройства, которые обычно используются системой для создания файловых систем. Они создаются и с ними можно работать только внутри групп томов, и они называются /dev/ИМЯ_VG/ИМЯ_LV. Как и в случае с группами томов, имя для логического тома придумывает администратор.

Создание LV

Чтобы создать логический том, используется команда lvcreate. Параметрами к данной команде нужно указать необходимый размер логического тома (который не может быть больше объема свободного места в группе томов), группу томов, в которой нужно выделить пространство, и имя логического тома для создания.

В следующем примере создается логический том с названием lvol1 в группе томов с названием vg0 с размером 150 Мб:

root #lvcreate -L 150M -n lvol1 vg0

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

root #lvcreate -l 100%FREE -n lvol1 vg0

Кроме FREE может использоваться ключ VG, который означает весь размер группы томов.

Получение списка LV

Чтобы получить список всех логических томов, используйте команду lvdisplay:

root #lvdisplay

Если логические тома отсутствуют, то можно использовать команду lvscan для поиска логических томов на всех доступных группах томов.

root #lvscan

Расширение LV

Когда логический том нужно расширить, можно использовать команду lvextend для увеличения выделенного места для логического тома.

Например, чтобы расширить логический том lvol1 до 500 Мб:

root #lvextend -L500M /dev/vg0/lvol1

Также можно указать размер, который нужно прибавить, а не конечный размер:

root #lvextend -L+350MB /dev/vg0/lvol1

Расширение группы томов не дает мгновенного увеличения пространства для конечных пользователей. Для этого необходимо также увеличить объем файловой системы, созданной в данной группе томов. Не все файловые системы поддерживают увеличение пространства без размонтирования, поэтому проверьте документацию по используемой файловой системе для более детальной информации.

Например, чтобы изменить размер файловой системы ext4, чтобы она стала размером 500 Мб:

root #resize2fs /dev/vg0/lvol1 500M

Для основных файловых систем lvresize расширит логический том, а также и файловую систему. Например, чтобы расширить логический том lvol1 и ext4 файловую систему:

root #lvresize --resizefs --size +350GB /dev/vg0/lvol1

Уменьшение LV

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

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

root #umount /mnt/data
root #e2fsck -f /dev/vg0/lvol1
root #resize2fs /dev/vg0/lvol1 150M

После уменьшения файловой системы, теперь можно уменьшить и логический том:

root #lvreduce -L150M /dev/vg0/lvol1

Разрешения на LV

LVM поддерживает права доступа на логические тома.

Например, логический том можно установить в состояние только для чтения используя команду lvchange:

root #lvchange -p r /dev/vg0/lvol1
root #mount -o remount /dev/vg0/lvol1

Требуется перемонтирование, так как данное изменение не применяется мгновенно.

Чтобы пометить логический том как снова доступный для записи, используйте бит прав доступа rw:

root #lvchange -p rw /dev/vg0/lvol1 && mount -o remount /dev/vg0/lvol1

Удаление LV

Перед удалением логического тома, удостоверьтесь, что он больше не смонтирован:

root #umount /dev/vg0/lvol1

Деактивируйте логический том, чтобы больше не происходило никаких операций записи:

root #lvchange -a n /dev/vg0/lvol1

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

root #lvremove /dev/vg0/lvol1

Возможности

LVM имеет несколько интересных возможностей для администраторов по данным, включая (но не только)

  • тонкие тома (перебор места)
  • поддержка снимков
  • типы томов с различными методами выделения пространства

Тонкие тома

Make sure to enable the thin USE flag for sys-fs/lvm2:

ФАЙЛ /etc/portage/package.use
# Enable support for the LVM daemon and related tools
sys-fs/lvm2 lvm
# Enable thin support
sys-fs/lvm2 thin

Новые версии LVM2 (2.02.89) поддерживают тонкие тома. Тонкие тома для блочных устройств это то же самое, что разрежённые файлы для файловых систем. Поэтому тонкий логический том внутри пула может быть перегружен: его размер может быть больше чем выделенный размер - он может быть даже больше чем весь пул. Как и с разреженными файлами, экстенты выделяются тогда, когда блочное устройство заполняется данными. Если файловая система поддерживает функцию discard, то экстенты будут освобождаться при удалении файлов, что приведет к уменьшению занимаемого пулом места.

Внутри LVM такой тонкий пул - это специальный логический том, который также может содержать в себе логические тома.

Создание тонкого пула

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

У каждого тонкого пула есть связанные с ним метаданные, которые добавляются к размеру тонкого пула. LVM подсчитывает размер метаданных на основании размера тонкого пула как минимальное из значений число_чанков_пула * 64 байта или 2Миб, смотря что больше. Администратор может выбрать и другой размер метаданных.

Чтобы создать тонкий пул, добавьте параметры --type thin-pool --thinpool thin_pool к lvcreate:

root #lvcreate -L 150M --type thin-pool --thinpool thin_pool vg0

Пример выше создает тонкий пул с названием thin_pool общим размером 150 Мб. Это действительный размер, выделяемый для тонкого пула (а, следовательно, общий объем пространства хранения, который может быть использован).

Чтобы явно указать конкретный размер метаданных, используйте параметр --metadatasize.

root #lvcreate -L 150M --poolmetadatasize 2M --type thin-pool --thinpool thin_pool vg0

Из-за метаданных, добавляемых к тонкому пулу, интуитивно-понятный способ использования всего оставшегося в группе томов места для логического тома больше не будет работать (смотри ошибку LVM 812726):

root #lvcreate -l 100%FREE --type thin-pool --thinpool thin_pool vg0
Insufficient suitable allocatable extents for logical volume thin_pool: 549 more required

Заметьте, что с тонким пулом не связана какая-либо нода устройств, как с другими логическими томами.

Создание тонкого логического тома

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

root #lvcreate -T vg0/thin_pool -V 300M -n lvol1

В данном примере (тонкий) логический том lvol1 будет виден как устройство размером в 300 Мб, несмотря на то, что нижележащий пул имеет только 150 Мб выделенного пространства.

Также возможно создать как тонкий пул, так и логический том внутри тонкого пула одной командой:

root #lvcreate -T vg0/thin_pool -V 300M -L150M -n lvol1

Получение списка тонких пулов и тонких логических томов

Тонкие пулы и тонкие логические тома это специальные типы логических томов, и поэтому они отображаются командой lvdisplay. Команда lvscan также обнаруживает эти логические тома.

Расширение тонкого пула

Предупреждение
По состоянию на версию LVM2 2.02.89, размер метаданных тонкого пула не может быть увеличен, его размер фиксируется при создании

Тонкий пул расширяется как и не тонкий логический том, с использованием lvextend. Например:

root #lvextend -L500M vg0/thin_pool

Расширение тонкого логического тома

Тонкий логический том расширяется как и обычный:

root #lvextend -L1G vg0/lvol1

Заметьте, что команда lvextend использует опцию -L (или -l если используется число экстентов), а не "виртуальный размер", который использовался при создании.

Уменьшение тонкого пула

На текущий момент LVM не может уменьшать размер тонкого пула. Смотри ошибку LVM 812731.

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

Тонкие логические тома уменьшаются точно так же, как и обычные логические тома.

Например:

root #lvreduce -L300M vg0/lvol1l

Заметьте, что команда lvreduce использует опцию -L (или -l если используется число экстентов), а не "виртуальный размер", который использовался при создании.

Удаление тонких пулов

Тонкие пулы не могут быть удалены, пока все тонкие логические тома внутри них не удалены.

Когда тонкий пул больше не предоставляет ни одного тонкого логического тома, его можно удалить командой lvremove:

root #lvremove vg0/thin_pool

Снимки LVM2 и тонкие снимки

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

Предупреждение
Так как логический том снимка получает ту же метку (LABEL) и UUID, удостоверьтесь, что файл /etc/fstab и initramfs не содержат записей для данных файловых систем с использованием меток (LABEL=) или с UUID=-синтаксисом. В противном случае вы можете примонтировать снимок вместо исходного логического тома (который вы, скорее всего, и хотели примонтировать)

Создание логического тома - снимка

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

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

root #lvcreate -l 10%VG -s -n 20140412_lvol1 /dev/vg0/lvol1

Пример выше создает снимок логического диска с именем "20140412_lvol1" на основе логического тома "lvol1" из группы томов "vg0". Он использует 10% пространства, выделенного для группы томов.

Доступ к снимку логического тома

Снимок логического тома может быть смонтирован как обычный логический том. Он не ограничивается только операциями для чтения - его можно изменить. Это может использоваться для тестирования изменений, прежде чем делать эти изменения на "работающей" файловой системе.

Пока существует снимок логического тома постоянный/оригинальный логический том не может быть удален или уменьшен в размере.

LVM тонкие снимки

Заметка
A thin snapshot can only be taken on a thin pool for a thin logical volume. The thin device mapper target supports thin snapshots of read-only non-thin logical volumes, but the LVM2 tooling does not support this. However, it is possible to create a regular (non-thin) snapshot logical volume of a thin logical volume.

Для того чтобы сделать тонкий снимок используется команда lvcreate с опцией -s. Размер снимка не указывается:

root #lvcreate -s -n 20140413_lvol1 /dev/vg0/lvol1

Тонкий снимок логического диска имеет тот же размер, что и его оригинальный логический том, и использует физическое размещение 0, как и все другие тонкие логические тома.

Важно
Если указан -l или -L, снимок будет создан, но получившийся снимок будет обычным, не тонким снимком.

Также можно создать снимок снимка.

root #lvcreate -s -n 1_20140413_lvol1 /dev/vg0/20140413_lvol1

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

Откат к состоянию снимка

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

root #lvconvert --merge /dev/vg0/20140413_lvol1

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

Важно
Снимок исчезнет и это изменение необратимое

Откат к состоянию тонкого снимка

Для таких томов lvconvert --merge не работает. Вместо этого удалите оригинальный логический том и переименуйте снимок.

root #umount /dev/vg0/lvol1
root #lvremove /dev/vg0/lvol1
root #lvrename vg0/20140413_lvol1 lvol1

Различные способы распределения хранилища

LVM поддерживает различные способы распределения хранилища:

  • Линейные тома (по умолчанию);
  • Зеркальные тома (различные настройки);
  • Чередование (RAID0);
  • Зеркальные тома (RAID1);
  • Чередование с четностью (RAID4 и RAID5);
  • Чередование с двойной четностью (RAID6);
  • Чередование и зеркалирование (RAID10);

Линейные тома

Линейные тома наиболее распространенный вид томов LVM. LVM пытается выделять логические тома так, чтобы они были по возможности физически смежными. Если физический том достаточно большой, чтобы вместить весь логический том, то LVM выделит его там, в противном случае логический том будет разбит на несколько частей.

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

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

Зеркальные тома

LVM поддерживает "зеркальные" тома, которые обеспечивают большую отказоустойчивость в случае выхода из строя диска. В отличие от RAID1, это не дает выигрыша в производительности – все операции чтения и записи производятся с одной стороной зеркала.

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

  1. Disk это тип журнала по умолчанию. Все сделанные изменения записываются в дополнительных экстентах метеданых, которыми управляет LVM. Если устройство недоступно, то изменения сохраняются в журнале до тех пор, пока зеркало не может быть снова восстановлено.
  2. Mirror журналы типа disk, которые зеркалируют сами себя.
  3. Core журналы записывают состояние зеркала только в память. LVM пересобирает зеркало каждый раз при активации. Этот тип полезен для временных зеркал.

Для создания логического тома с одним зеркалом передайте аргумент "-m 1"(для выбора стандартного зеркалирования) с опциональным --mirrorlog для спецификации типа журнала:

root #lvcreate -m 1 --mirrorlog mirror -l 40%VG --nosync -n lvol1 vg0

Опция -m 1 сообщает LVM о необходимости создания одного (дополнительного) зеркала и, таким образом, требуют 2 физических томов. Опция --nosync – оптимизация – без неё LVM будет синхронизировать зеркало, копируя пустые сектора с одного логического тома на другой.

Также возможно создание зеркала существующего логического тома:

root #lvconvert -m 1 -b vg0/lvol1

Опция -b осуществляет преобразование в фоновом режиме, поскольку оно может продлиться довольно долго.

Чтобы удалить зеркало, установите количество зеркал (обратно) равным 0:

root #lvconvert -m0 vg0/lvol1

Если часть зеркала недоступна (обычно по причине повреждения диска, содержащего физический том), группу томов нужно будет подключить в пониженном режиме:

root #vgchange -ay --partial vg0

On the first write, LVM will notice the mirror is broken. The default policy ("remove") is to automatically reduce/break the mirror according to the number of pieces available. A 3-way mirror with a missing physical volume will be reduced to 2-way mirror; a 2-way mirror will be reduced to a regular linear volume. If the failure is only transient, and the missing physical volume returns after LVM has broken the mirror, the mirrored logical volume will need to be recreated on it.

To recover the mirror, the failed physical volume needs to be removed from the volume group, and a replacement physical volume needs to be added (or if the volume group has a free physical volume, it can be created on that one). Then the mirror can be recreated with lvconvert at which point the old physical volume can be removed from the volume group:

root #vgextend vg0 /dev/sdc1
root #lvconvert -b -m 1 --mirrorlog disk vg0/lvol1
root #vgreduce --removemissing vg0

It is possible to have LVM recreate the mirror with free extents on a different physical volume if one side fails. To accomplish that, set mirror_image_fault_policy to allocate in lvm.conf.

Тонкие зеркала

It is not (yet) possible to create a mirrored thin pool or thin volume. It is possible to create a mirrored thin pool by creating a normal mirrored logical volume and then converting the logical volume to a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

Предупреждение
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the volume group. Also, conversion of a mirror into a thin pool destroys all existing data in the mirror!
root #lvcreate -m 1 --mirrorlog mirrored -l40%VG -n thin_pool vg0
root #lvcreate -m 1 --mirrorlog mirrored -L4MB -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg0/thin_meta

Чередование (RAID0)

Instead of a linear volume, where multiple contiguous physical volumes are appended, it possible to create a striped or RAID0 volume for better performance. This will alternate storage allocations across the available physical volumes.

To create a striped volume over three physical volumes:

root #lvcreate -i 3 -l 20%VG -n lvol1_stripe vg0
Using default stripesize 64.00 KiB

The -i option indicates over how many physical volumes the striping should be done.

It is possible to mirror a stripe set. The -i and -m options can be combined to create a striped mirror:

root #lvcreate -i 2 -m 1 -l 10%VG vg0

This creates a 2 physical volume stripe set and mirrors it on 2 different physical volumes, for a total of 4 physical volumes. An existing stripe set can be mirrored with lvconvert.

A thin pool can be striped like any other logical volume. All the thin volumes created from the pool inherit that settings - do not specify it manually when creating a thin volume.

It is not possible to stripe an existing volume, nor reshape the stripes across more/less physical volumes, nor to convert to a different RAID level/linear volume. A stripe set can be mirrored. It is possible to extend a stripe set across additional physical volumes, but they must be added in multiples of the original stripe set (which will effectively linearly append a new stripe set).

Зеркалирование (RAID1)

Unlike RAID0, which is striping, RAID1 is mirroring, but implemented differently than the original LVM mirror. Under RAID1, reads are spread out across physical volumes, improving performance. RAID1 mirror failures do not cause I/O to block because LVM does not need to break it on write.

Any place where an LVM mirror could be used, a RAID1 mirror can be used in its place. It is possible to have LVM create RAID1 mirrors instead of regular mirrors implicitly by setting mirror_segtype_default to raid1 in lvm.conf.

Предупреждение
LVM RAID1 mirroring is not supported by GRUB before version 2.02. Ensure the latest version is installed with grub-install or the system may become unbootable if the grub files are contained in the LVM RAID1.

Чтобы создать логический том с одним зеркалом:

root #lvcreate -m 1 --type raid1 -l 40%VG --nosync -n lvm_raid1 vg0

Note the difference for creating a mirror: There is no mirrorlog specified, because RAID1 logical volumes do not have an explicit mirror log - it built-in to the logical volume.

Можно сконвертировать существующий логический том в RAID1:

root #lvconvert -m 1 --type raid1 -b vg0/lvol1

Установите количество зеркал в 0, чтобы удалить зеркало RAID1:

root #lvconvert -m0 vg0/lvm_raid1

If part of the RAID1 is unavailable (usually because the disk containing the physical volume has failed), the volume group will need to be brought up in degraded mode:

root #vgchange -ay --partial vg0

Unlike an LVM mirror, writing does NOT break the mirroring. If the failure is only transient, and the missing physical volume returns, LVM will resync the mirror by copying cover the out-of-date segments instead of the entire logical volume. If the failure is permanent, then the failed physical volume needs to be removed from the volume group, and a replacement physical volume needs to be added (or if the volume group has a free physical volume, it can be created on a different PV). The mirror can then be repaired with lvconvert, and the old physical volume can be removed from the volume group:

root #vgextend vg0 /dev/sdc1
root #lvconvert --repair -b vg0/lvm_raid1
root #vgreduce --removemissing vg0

Тонкий RAID1

It is not (yet) possible to create a RAID1 thin pool or thin volume. It is possible to create a RAID1 thin pool by creating a normal mirrored logical volume and then converting the logical volume to a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will then merge them into a single logical volume.

Предупреждение
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the VG. Also, conversion of a RAID1 into a thin pool destroys all existing data in the mirror!
root #lvcreate -m 1 --type raid1 -l40%VG -n thin_pool vg0
root #lvcreate -m 1 --type raid1 -L4MB -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg00/thin_meta

Чередование с четностью (RAID4 и RAID5)

Заметка
Striping with parity requires at least 3 physical volumes.

RAID0 is not fault-tolerant - if any of the physical volumes fail then the logical volume is unusable. By adding a parity stripe to RAID0 the logical volume can still function if a physical volume is missing. A new physical volume can then be added to restore fault tolerance.

Stripsets with parity come in 2 flavors: RAID4 and RAID5. Under RAID4, all the parity stripes are stored on the same physical volume. This can become a bottleneck because all writes hit that physical volume, and it gets worse the more physical volumes are in the array. With RAID5, the parity data is distributed evenly across the physical volumes so none of them become a bottleneck. For that reason, RAID4 is rare and is considered obsolete/historical. In practice, all stripesets with parity are RAID5.

root #lvcreate --type raid5 -l 20%VG -i 2 -n lvm_raid5 vg0

Only the data physical volumes are specified with -i, LVM adds one to it automatically for the parity. So for a 3 physical volume RAID5, -i 2 is passed on and not -i 3.

When a physical volume fails, then the volume group will need to be brought up in degraded mode:

root #vgchange -ay --partial vg0

The volume will work normally at this point, however this degrades the array to RAID0 until a replacement physical volume is added. Performance is unlikely to be affected while the array is degraded - although it does need to recompute its missing data via parity, it only requires simple XOR for the parity block with the remaining data. The overhead is negligible compared to the disk I/O.

Чтобы починить RAID5:

root #lvconvert --repair vg0/lvm_raid5
root #vgreduce --removemissing vg0

It is possible to replace a still working physical volume in RAID5 as well:

root #lvconvert --replace /dev/sdb1 vg0/lvm_raid5
root #vgreduce vg0 /dev/sdb1

The same restrictions of stripe sets apply to stripe sets with parity as well: it is not possible to enable striping with parity on an existing volume, nor reshape the stripes with parity across more/less physical volumes, nor to convert to a different RAID level/linear volume. A stripe set with parity can be mirrored. It is possible to extend a stripe set with parity across additional physical volumes, but they must be added in multiples of the original stripe set with parity (which will effectively linearly append a new stripe set with parity).

Тонкие RAID5 логические тома

It is not (yet) possible to create stripe set with parity (RAID5) thin pools or thin logical volumes. It is possible to create a RAID5 thin pool by creating a normal RAID5 logical volume and then converting the logical volume into a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

Предупреждение
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the VG. Also, coversion of a RAID5 LV into a thin pool destroys all existing data in the LV!
root #lvcreate --type raid5 -i 2 -l20%VG -n thin_pool vg0
root #lvcreate --type raid5 -i 2 -L4MB -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg00/thin_meta

Чередование с двойной четностью (RAID6)

Заметка
Для RAID6 требуется как минимум 5 физических томов.

RAID6 is similar to RAID5, however RAID6 can survive up to two physical volume failures, thus offering more fault tolerance than RAID5 at the expense of extra physical volumes.

root #lvcreate --type raid6 -l 20%VG -i 3 -n lvm_raid6 vg00

Like RAID5, the -i option is used to specify the number of physical volumes to stripe, excluding the 2 physical volumes for parity. So for a 5 physical volume RAID6, pass on -i 3 and not -i 5.

Recovery for RAID6 is the same as RAID5.

Заметка
Unlike RAID5 where parity block is cheap to recompute vs disk I/O, this is only half true in RAID6. RAID6 uses 2 parity stripes: One stripe is computed the same way as RAID5 (simple XOR). The second parity stripe is much harder to compute - see [https://www.kernel.org/pub/linux/kernel/people/hpa/raid6.pdf

Тонкие RAID6 логические тома

It is not (yet) possible to create a RAID6 thin pool or thin volumes. It is possible to create a RAID6 thin pool by creating a normal RAID6 logical volume and then converting the logical volume into a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

Предупреждение
LVM 2.02.98 or above is required for this to work properly. Prior versions are either not capable or will segfault and corrupt the VG. Also, conversion of a RAID6 LV into a thin pool destroys all existing data in the LV!
root #lvcreate --type raid6 -i 2 -l20%VG -n thin_pool vg0
root #lvcreate --type raid6 -i 2 -L4MB -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg0/thin_meta

LVM RAID10

Заметка
RAID10 requires at least 4 physical volumes. Also LVM syntax requires the number of physical volumes be multiple of the numbers stripes and mirror, even though RAID10 format does not

RAID10 is a combination of RAID0 and RAID1. It is more powerful than RAID0+RAID1 as the mirroring is done at the stripe level instead of the logical volume level, and therefore the layout doesn't need to be symmetric. A RAID10 volume can tolerate at least a single missing physical volume, and possibly more.

Заметка
LVM currently limits RAID10 to a single mirror.
root #lvcreate --type raid10 -l 1020 -i 2 -m 1 --nosync -n lvm_raid10 vg0

Both the -i and -m options are specified: -i is the number of stripes and -m is the number of mirrors. Two stripes and 1 mirror requires 4 physical volumes.

Тонкий RAID10

It is not (yet) possible to create a RAID10 thin pool or thin volumes. It is possible to create a RAID10 thin pool by creating a normal RAID10 logical volume and then converting the logical volume into a thin pool with lvconvert. 2 logical volumes are required: one for the thin pool and one for the thin metadata; the conversion process will merge them into a single logical volume.

Предупреждение
Conversion of a RAID10 logical volume into a thin pool destroys all existing data in the logical volume!
root #lvcreate -i 2 -m 1 --type raid10 -l 1012 -n thin_pool vg0
root #lvcreate -i 2 -m 1 --type raid10 -l 6 -n thin_meta vg0
root #lvconvert --thinpool vg0/thin_pool --poolmetadata vg0/thin_meta

Эксперименты с LVM

It is possible to experiment with LVM without using real storage devices. To accomplish this, loopback devices are created.

Сперва убедитесь, что модуль loopback загружен.

root #modprobe -r loop && modprobe loop max_part=63
Заметка
Если поддержка loopback собрана в ядре, используйте loop.max_part=63 как параметр загрузки.

Next configure LVM to not use udev to scan for devices:

ФАЙЛ /etc/lvm/lvm.confОтключаем udev в конфигурации LVM
obtain_device_list_from_udev = 0
Важно
This is for testing only, make sure to change the setting back when dealing with real devices since it is much faster to use udev!

Create some image files which will become the storage devices. The next example uses five files for a total of about ~10GB of real hard drive space:

root #mkdir /var/lib/lvm_img
root #dd if=/dev/null of=/var/lib/lvm_img/lvm0.img bs=1024 seek=2097152
root #dd if=/dev/null of=/var/lib/lvm_img/lvm1.img bs=1024 seek=2097152
root #dd if=/dev/null of=/var/lib/lvm_img/lvm2.img bs=1024 seek=2097152
root #dd if=/dev/null of=/var/lib/lvm_img/lvm3.img bs=1024 seek=2097152
root #dd if=/dev/null of=/var/lib/lvm_img/lvm4.img bs=1024 seek=2097152

Проверьте какие устройства обратной петли (loopback) доступны:

root #losetup -a

Assuming all loopback devices are available, next create the devices:

root #losetup /dev/loop0 /var/lib/lvm_img/lvm0.img
root #losetup /dev/loop1 /var/lib/lvm_img/lvm1.img
root #losetup /dev/loop2 /var/lib/lvm_img/lvm2.img
root #losetup /dev/loop3 /var/lib/lvm_img/lvm3.img
root #losetup /dev/loop4 /var/lib/lvm_img/lvm4.img

The /dev/loop[0-4] devices are now available to use as any other hard drive in the system (and thus be perfect for physical volumes).

Заметка
On the next reboot, all the loopback devices will be released and the folder /var/lib/lvm_img can be deleted.

Устранение проблем

LVM has a few features that already provide some level of redundancy. However, there are situations where it is possible to restore lost physical volumes or logical volumes.

Утилита vgcfgrestore

By default, on any change to a LVM physical volume, volume group, or logical volume, LVM2 create a backup file of the metadata in /etc/lvm/archive. These files can be used to recover from an accidental change (like deleting the wrong logical volume). LVM also keeps a backup copy of the most recent metadata in /etc/lvm/backup. These can be used to restore metadata to a replacement disk, or repair corrupted metadata.

To see what states of the volume group are available to be restored (partial output to improve readability):

root #vgcfgrestore --list vg00
  File:		/etc/lvm/archive/vg0_00042-302371184.vg
  VG name:    	vg0
  Description:	Создан *до* выполнения 'lvremove vg0/lvm_raid1'
  Backup Time:	Sat Jul 13 01:41:32 201

Восстановление нечаянно удаленных логических томов

Assuming the logical volume lvm_raid1 was accidentally removed from volume group vg0, it is possible to recover it as follows:

root #vgcfgrestore -f /etc/lvm/archive/vg0_00042-302371184.vg vg0
Важно
vgcfgrestore only restores LVM metadata, not the data inside the logical volume. However pvremove, vgremove, and lvremove only wipe metadata, leaving any data intact. If issue_discards is set in /etc/lvm/lvm.conf though, then these command are destructive to data.

Замена отказавших физических томов

It possible to do a true "replace" and recreate the metadata on the new physical volume to be the same as the old physical volume:

root #vgdisplay --partial --verbose
  --- Physical volumes ---
  PV Name               /dev/loop0     
  PV UUID               iLdp2U-GX3X-W2PY-aSlX-AVE9-7zVC-Cjr5VU
  PV Status             allocatable
  Total PE / Free PE    511 / 102
  
  PV Name               unknown device     
  PV UUID               T7bUjc-PYoO-bMqI-53vh-uxOV-xHYv-0VejBY
  PV Status             allocatable
  Total PE / Free PE    511 / 102

The important line here is the UUID "unknown device".

root #pvcreate --uuid T7bUjc-PYoO-bMqI-53vh-uxOV-xHYv-0VejBY --restorefile /etc/lvm/backup/vg0 /dev/loop1
  Couldn't find device with uuid T7bUjc-PYoO-bMqI-53vh-uxOV-xHYv-0VejBY.
  Physical volume "/dev/loop1" successfully created

This recreates the physical volume metadata, but not the missing logical volume or volume group data on the physical volume.

root #vgcfgrestore -f /etc/lvm/backup/vg0 vg0
  Restored volume group vg0

This now reconstructs all the missing metadata on the physical volume, including the logical volume and volume group data. However it doesn't restore the data, so the mirror is out of sync.

root #vgchange -ay vg0
  device-mapper: reload ioctl on  failed: Invalid argument
  1 logical volume(s) in volume group "vg0" now active
root #lvchange --resync vg0/lvm_raid1
Do you really want to deactivate logical volume lvm_raid1 to resync it? [y/n]: y

This will resync the mirror. This works with RAID 4,5 and 6 as well.

Деактивация логического тома

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

root #umount /dev/vg0/lvol1
root #lvchange -a n /dev/vg0/lvol1

Нельзя смонтировать где-либо логический том, пока он не будет реактивирован:

root #lvchange -a y /dev/vg0/lvol1

Смотрите также

Ссылки