Что такое mapper в linux

Обновлено: 05.07.2024

Данное руководство посвящено обзору принципов работы LVM и базовым командам, необходимым в работе.

Архитектура и терминология LVM

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

Что такое диапазоны в LVM

Примеры использования

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

Обозначение физических устройств как физических томов

На выходе будут отображены все доступные блочные устройства, с которыми может работать LVM:

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

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

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

Оба устройства располагаются в столбце PV, обозначающем физические тома (Physical Volume).

Добавление физических томов в группу томов

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

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

Следующая команда позволяет получить краткую информацию о самой группе томов:

Группа томов содержит два физических тома и ни одного логического тома, а ее объем равен суммарному объему входящих в нее устройств.

Создание логических томов из пула группы томов

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

Логические тома создаются командой lvcreate. Опция -n указывает группу томов, в которой мы будем создавать том. Для непосредственного задания размера можно воспользоваться опцией -L. Если вы хотите указать размер в диапазонах, воспользуйтесь опцией -l.

Создадим первые три логических тома с опцией -L:

Логические тома и их связь с группой томов можно просматривать, настроив вывод команды vgs:

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

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

Форматирование и монтирование логических томов

Теперь мы можем пользоваться логическими томами как нормальными блочными устройствами. Логические устройства доступны в директории /dev как любые другие устройства хранения. Их можно найти в двух местах:

Поэтому для их форматирования в файловой системе Ext4 можно выполнить следующие команды:

либо такие команды:

После форматирования можно создать точки монтирования:

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

Для постоянного монтирования добавьте устройства в /etc/fstab как обычные блочные устройства:

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

Добавление физического тома к группе томов

Для расширения группы томов дополнительными физическими томами используется команда vgextend с аргументами названий группы томов и физических томов. Можно указать несколько устройств:

sudo vgextend имя_группы_томов /dev/sdc

Физический том будет добавлен к группе, расширяя объем доступного пространства.

Увеличение размера логического тома

Для корректного задания имени нужно сначала указать группу томов, а затем имя логического тома через слэш:

Размер логического тома test в группе LVMVolGroup и его файловой системы будут увеличены на 5 Гб

Уменьшение размера LVM

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

Для уменьшения логического тома прежде всего требуется выполнить резервное копирование данных. После этого нужно проверить объем используемого пространства, чтобы оценить, до какого размера можно уменьшить логический том. В данном случае используется чуть больше 521 Мб:

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

Теперь нужно проверить файловую систему командой fsck , указав ее тип с опцией -t. Для дополнительной проверки можно воспользоваться опцией -f:

После завершения указанных операций можно изменить размер логического тома до той же величины при помощи команды lvresize с флагом -L:

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

Если все работает корректно, можно снова ее смонтировать обычной командой mount:

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

Удаление тома LVM

Для удаления логического тома используется команда lvremove. Если он смонтирован, то его нужно предварительно размонтировать:

Будет запрошено подтверждение процедуры, если вы уверены, введите Y.

Удаление группы LVM

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

После этого можно удалить всю группу, указав ее имя команде vgremove:

Будет запрошено подтверждение удаления. Если в группе ещё остались логические тома, нужно будет подтвердить удаление каждого из них.

Удаление физического тома из LVM

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

При наличии достаточного объема физических томов для переноса данных перенесите их из удаляемого тома командой pvmove:

В зависимости от размера томов и объема переносимых данных этот процесс может потребовать некоторого времени.

После переноса файлов можно удалить физический том из группы командой vgreduce:

После этого при помощи команды pvremove можно удалить маркер физического тома и использовать устройство для других целей или совсем удалить его из системы:

Заключение

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

Device Mapper служит основой для некоторых технологий высокого уровня и активно используется командами dmraid и dm-multipath .

Device Mapper используется для активации логических томов. Логический том преобразуется в проецируемое устройство, а каждому сегменту будет соответствовать строка с таблице соответствий. Device Mapper поддерживает прямое проецирование, проецирование с чередованием или проецирование с учетом ошибок. Так, два диска могут быть объединены в один логический том с двумя линейными соответствиями — по одному на диск. При создании тома LVM будет также создана проекция, для обращения к которой используется dmsetup . Раздел A.1, «Таблица соответствий» содержит описание форматов устройств в таблице соответствий, а Раздел A.2, «dmsetup» предоставляет информацию об dmsetup .

A.1. Таблица соответствий

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

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

Размеры указываются в секторах (размер сектора — 512 байт).

Если в параметрах проецирования указано устройство, в файловой системе к нему можно обращаться и по имени (например, /dev/hda ), и по номеру в формате основной : вспомогательный .

Пример таблицы соответствий, в которой определены 4 линейные составляющие:

Первые два параметра обозначают начальный блок и длину сегмента. Следующий параметр определяет тип проецирования ( linear ).

A.1.1. Тип linear

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

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

В следующем примере будет создана линейная проекция общей длиной 1638400. При этом основной и вспомогательный номера — 8:2, а смещение устройства — 41146992.

A.1.2. Тип striped

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

Каждому сегменту чередования соответствует одна пара значений устройство и смещение .

число чередующихся сегментов для организации виртуального устройства

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

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

Следующий пример демонстрирует чередование на трех устройствах. При этом размер сегмента равен 128 блокам:

чередование на трех устройствах с размером сегмента равным 128 блокам

основной и вспомогательный номера первого устройства

основной и вспомогательный номера второго устройства

основной и вспомогательный номера третьего устройства

В следующем примере будет организовано чередование на двух устройствах; при этом размер сегмента будет равен 256 КиБ, а устройства будут заданы с помощью имен.

A.1.3. Тип mirror

Тип mirror поддерживает проецирование зеркальных логических устройств. Формат:

Журнал локального зеркала хранится в основной памяти. Этот тип принимает от одного до трех аргументов:

Журнал зеркала хранится на локальном диске. Этот тип принимает от двух до четырех аргументов:

устройство размер_сегмента [[ no ] sync ] [ block_on_error ]

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

Журнал кластерного зеркала хранится на диске. Этот тип принимает от трех до пяти аргументов:

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

В кластерном окружении UUID определяет уникальный идентификатор устройства, где расположен журнал.

Аргумент [no]sync не является обязательным; его целью является определение состояния зеркала как "in-sync" или "out-of-sync". Аргумент block_on_error заставит зеркало отвечать на ошибки, а не игнорировать их.

число составляющих зеркала. Для каждого элемента задается устройство и смещение.

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

исходное смещение. Блочное устройство и смещение задаются для каждого элемента зеркала.

Следующий пример демонстрирует проецирование для кластерного зеркала с поддержкой журнала на диске.

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

размер региона, где будет регистрироваться информация о синхронизации

A.1.4. Тип snapshot и snapshot-origin

При создании первого снимка тома используются четыре устройства Device Mapper:

Устройство с линейным проецированием ( linear ), содержащее изначальную таблицу соответствий для исходного тома.

Устройство с линейным проецированием, используемое в качестве устройства CoW (copy-on-write) для исходного тома. При каждой операции записи данные сохраняются и на COW-устройство, тем самым синхронизируя содержимое (до тех пор пока COW-устройство не заполнится).

Устройство с проецированием snapshot , совмещающим типы 1 и 2, которое представляет собой видимый снимок тома.

Исходный том. Таблица этого тома заменяется соответствием "snapshot-origin" из первого устройства.

При создании этих устройств используется фиксированная схема присвоения имен. Например, команды создания тома base и его снимка snap будут выглядеть так:

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

Устройство, где будут сохраняться измененные секции данных

P (Persistent) или N (Not persistent) определяют, будет ли сохраняться снимок после перезагрузки. Значение P сохраняет снимок, а N — не сохраняет, в случае чего метаданные будут храниться в памяти.

Размер изменяемых секций на COW-устройстве (в секторах).

Следующий пример демонстрирует snapshot-origin для устройства с номером 254:11.

В следующем примере исходное устройство — 254:11, COW-устройство — 254:12. Снимок будет сохраняться между перезагрузками, а размер секций данных, сохраняемых в COW-устройстве, равен 16 секторам.

A.1.5. Тип error

Тип «error» завершает неудачей любые запросы ввода и вывода к заданному сектору.

«error» обычно используется для тестирования. Скажем, надо проверить поведение устройства в случае сбоя. Для этого просто создается соответствие с поврежденным сектором где-нибудь посередине или работающий компонент зеркала специально заменяется поврежденным.

Проекция «error» может использоваться вместо поврежденного устройства во избежание задержек обращения или при реорганизации метаданных LVM в случае сбоя.

error требует указания только двух параметров — начало и конец.

A.1.6. Тип zero

Для подстановки соответствия zero используется блочное устройство /dev/zero . Запросы чтения будут возвращать блоки нулей, а запись хоть и будет завершена успешно, но записываемые данные не будут сохранены. zero принимает два параметра — начало и длина.

Пример создания соответствия zero для устройства размером 16 ТБ:

A.1.7. Тип multipath

Тип «multipath» обеспечивает сопоставление для многопутевых устройств. Формат:

Каждой группе путей соответствует один набор аргументы_группы .

К примеру, если параметр no_path_retry в файле multipath.conf ставит операции ввода и вывода в очередь до тех пор, пока все пути не будут отмечены как сбойные после заданного числа попыток, соответствие будет выглядеть так:

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

Число аргументов аппаратного обработчика с последующим списком аргументов. Обработчик определяет модуль для выполнения операций, связанных с оборудованием, при изменении групп путей или при обработке ошибок ввода-вывода. Если значение равно нулю, дальше сразу будет следовать число_групп .

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

Каждому маршруту соответствует один набор аргументов.

Алгоритм выбора пути для обработки следующего запроса ввода-вывода.

Число аргументов для каждого маршрута. По умолчанию равно 1 (единственный аргумент ioreqs ).

Номер устройства маршрута в формате основной : вспомогательный .

Число запросов ввода и вывода, которые будут переданы этому маршруту, прежде чем будет выбран следующий путь.

Соответствие multipath

Рисунок A.1. Соответствие multipath

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

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

Документ DM-Multipath содержит дальнейшую информацию.

A.1.8. Тип crypt

crypt обеспечит шифрование передаваемых через заданное устройство данных. При этом используется API Crypto.

Список кодов можно найти в файле /proc/crypto (например, aes ).

Надо указать cbc , а не ebc , так как ebc не использует исходный вектор (IV).

IV — вектор инициализации, позволяющий изменить метод шифрования. Режим IV может принимать значения plain или essiv:hash . Метод plain использует номер сектора (плюс смещение IV) в качестве IV, в то время как -essiv представляет собой расширение для усиления защиты от атак Watermarking.

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

Собственно, хочется просто и доступно рассказать про такую замечательную вещь как Logical Volume Management или Управление Логическими Томами.
Поскольку уже давно пользуюсь LVM-ом, расскажу что он значит именно для меня, не подглядывая в мануалы и не выдёргивая цитаты из wiki, своими словами, чтобы было понятно именно тем кто ничего о нем не знает. Постараюсь сразу не рассказывать о всяческих «продвинутых» функциях типа страйпов, снапшотов и т.п.

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

допустим у нас в компе есть жёсткий диск на 40Гб и нам удалось наскрести немного денег и наконец-то купить себе ТЕРАБАЙТНИК! :))) Система уже стоит и работает, и первый диск разбит одним разделом (/dev/sda1 как / ), второй — самый большой, который мы только подключили — вообще не разбит /dev/sdb…
Предлагаю немножко разгрузить корневой диск, а заодно ускорить (новый диск работает быстрее старого) и «обезопасить» систему с помощью lvm.
Можно делать на втором диске разделы и добавлять их в группы томов (если нам нужно несколько групп томов),
а можно вообще не делать на диске разделы и всё устройство сделать физическим разделом (PV)

Создаём группу томов с говорящим названием, например по имени машины «ws», чтобы когда мы перетащим данный диск на другую машину небыло конфликтов с именами групп томов:

желательно внести с корневого раздела такие папки как /usr /var /tmp /home, чтобы не дефрагментировать лишний раз корневой раздел и ни в коем случае его не переполнить, поэтому создаём разделы:

дальше lvm уже почти кончается… форматируем наши разделы в любимые файловые системы:
root@ws:

кстати, не плохо было бы сделать раздел подкачки:
root@ws:

создаём папку и подключая по очереди новообразовавшиеся тома, копируем в них нужное содержимое:
root@ws:

На вкусное, хочу предложить более продвинутую штуку:
допустим у нас есть система с разделом на LVM, а жёсткий диск начал сбоить, тогда мы можем без перезагрузки переместить всю систему на другой жёсткий диск/раздел:

Итого:
Я создал логический раздел, отформатировал его, примонтировал и заполнил нужными данными, затем переместил его с одного устройства на другое, при этом раздел остался примонтирован и данные всё время оставались доступны!
Подобным образом мне удавалось без перезагрузки перенести всю систему с умирающего диска на рэид-массив. :)

Собственно, хочется просто и доступно рассказать про такую замечательную вещь как Logical Volume Management или Управление Логическими Томами.
Поскольку уже давно пользуюсь LVM-ом, расскажу что он значит именно для меня, не подглядывая в мануалы и не выдёргивая цитаты из wiki, своими словами, чтобы было понятно именно тем кто ничего о нем не знает. Постараюсь сразу не рассказывать о всяческих «продвинутых» функциях типа страйпов, снапшотов и т.п.

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

допустим у нас в компе есть жёсткий диск на 40Гб и нам удалось наскрести немного денег и наконец-то купить себе ТЕРАБАЙТНИК! :))) Система уже стоит и работает, и первый диск разбит одним разделом (/dev/sda1 как / ), второй — самый большой, который мы только подключили — вообще не разбит /dev/sdb…
Предлагаю немножко разгрузить корневой диск, а заодно ускорить (новый диск работает быстрее старого) и «обезопасить» систему с помощью lvm.
Можно делать на втором диске разделы и добавлять их в группы томов (если нам нужно несколько групп томов),
а можно вообще не делать на диске разделы и всё устройство сделать физическим разделом (PV)

Создаём группу томов с говорящим названием, например по имени машины «ws», чтобы когда мы перетащим данный диск на другую машину небыло конфликтов с именами групп томов:

желательно внести с корневого раздела такие папки как /usr /var /tmp /home, чтобы не дефрагментировать лишний раз корневой раздел и ни в коем случае его не переполнить, поэтому создаём разделы:

дальше lvm уже почти кончается… форматируем наши разделы в любимые файловые системы:
root@ws:

кстати, не плохо было бы сделать раздел подкачки:
root@ws:

создаём папку и подключая по очереди новообразовавшиеся тома, копируем в них нужное содержимое:
root@ws:

На вкусное, хочу предложить более продвинутую штуку:
допустим у нас есть система с разделом на LVM, а жёсткий диск начал сбоить, тогда мы можем без перезагрузки переместить всю систему на другой жёсткий диск/раздел:

Итого:
Я создал логический раздел, отформатировал его, примонтировал и заполнил нужными данными, затем переместил его с одного устройства на другое, при этом раздел остался примонтирован и данные всё время оставались доступны!
Подобным образом мне удавалось без перезагрузки перенести всю систему с умирающего диска на рэид-массив. :)

Читайте также: