Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
Приложение A. Device Mapper
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 линейные составляющие:
0 35258368 linear 8:48 65920 35258368 35258368 linear 8:32 65920 70516736 17694720 linear 8:16 17694976 88211456 17694720 linear 8:16 256
Первые два параметра обозначают начальный блок и длину сегмента. Следующий параметр определяет тип проецирования (
linear
).
Тип может принимать следующие значения:
- linear;
- striped;
- mirror;
- snapshot и snapshot-origin;
- error;
- zero;
- multipath;
- crypt.
A.1.1. Тип linear
Создает линейное соответствие между непрерывным диапазоном блоков и другим блочным устройством.
начало длина
linearустройство смещение
начало
- первый блок виртуального устройства
длина
- длина сегмента
устройство
- блочное устройство, которое можно указать по имени или по номеру в формате
основной
:вспомогательный
смещение
- смещение проекции
В следующем примере будет создана линейная проекция общей длиной 1638400. При этом основной и вспомогательный номера — 8:2, а смещение устройства — 41146992.
0 16384000 linear 8:2 41156992
Линейное соответствие для устройства
/dev/hda
:
0 20971520 linear /dev/hda 384
A.1.2. Тип striped
Тип striped обеспечивает чередование между несколькими физическими устройствами и в качестве аргументов принимает число устройств и размер чередующихся сегментов, за которым следуют пары имен устройств и секторов. Формат:
начало длина
striped#число размер_сегмента устройство1 смещение1 ... устройствоN смещениеN
Каждому сегменту чередования соответствует одна пара значений
устройство
и смещение
.
начало
- первый блок виртуального устройства
длина
- длина сегмента
число
- число чередующихся сегментов для организации виртуального устройства
размер_сегмента
- число секторов, которые будут записаны на одном устройстве, прежде чем будет выполнен переход к следующему. Должно быть кратно 2, а общий размер должен быть не меньше размера страницы ядра.
устройство
- блочное устройство, заданное с помощью имени или пары
основной
:вспомогательный
. смещение
- смещение проекции
Следующий пример демонстрирует чередование на трех устройствах. При этом размер сегмента равен 128 блокам:
0 73728 striped 3 128 8:9 384 8:8 384 8:7 9789824
- 0
- первый блок виртуального устройства
- 73728
- длина сегмента
- striped 3 128
- чередование на трех устройствах с размером сегмента равным 128 блокам
- 8:9
- основной и вспомогательный номера первого устройства
- 384
- смещение на первом устройстве
- 8:8
- основной и вспомогательный номера второго устройства
- 384
- смещение на втором устройстве
- 8:7
- основной и вспомогательный номера третьего устройства
- 9789824
- смещение на третьем устройстве
В следующем примере будет организовано чередование на двух устройствах; при этом размер сегмента будет равен 256 КиБ, а устройства будут заданы с помощью имен.
0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0
A.1.3. Тип mirror
Тип mirror поддерживает проецирование зеркальных логических устройств. Формат:
начало длина
mirrorтип_журнала #число_аргументов аргумент1 ... аргументN #число_устройств устройство1 смещение1 ... устройствоN смещениеN
начало
- первый блок виртуального устройства
длина
- длина сегмента
тип_журнала
- Возможные значения:
core
- Журнал локального зеркала хранится в основной памяти. Этот тип принимает от одного до трех аргументов:размер_сектора [[
no
]sync
] [block_on_error
] disk
- Журнал зеркала хранится на локальном диске. Этот тип принимает от двух до четырех аргументов:устройство размер_сегмента [[
no
]sync
] [block_on_error
] clustered_core
- Журнал кластерного зеркала хранится в основной памяти. Этот тип принимает от двух до четырех аргументов:размер_секции UUID [[
no
]sync
] [block_on_error
] clustered_disk
- Журнал кластерного зеркала хранится на диске. Этот тип принимает от трех до пяти аргументов:устройство размер UUID [[
no
]sync
] [block_on_error
]
LVM поддерживает небольшой журнал, где регистрируется информация о синхронизации регионов с зеркалом. Размер определяет размер регионов.В кластерном окружении UUID определяет уникальный идентификатор устройства, где расположен журнал.Аргумент[no]sync
не является обязательным; его целью является определение состояния зеркала как "in-sync" или "out-of-sync". Аргументblock_on_error
заставит зеркало отвечать на ошибки, а не игнорировать их. #число_аргументов
- общее число аргументов журнала
аргумент1...аргументN
- аргументы журнала зеркала. Число аргументов определяется параметром
#число_аргументов
, а допустимые аргументы определяются параметромтип_журнала
. #число_устройств
- число составляющих зеркала. Для каждого элемента задается устройство и смещение.
устройство
- блочное устройство в основе звена зеркала. Задается с помощью имени устройства или пары номеров
основной
:вспомогательный
. смещение
- исходное смещение. Блочное устройство и смещение задаются для каждого элемента зеркала.
Следующий пример демонстрирует проецирование для кластерного зеркала с поддержкой журнала на диске.
0 52428800 mirror clustered_disk 4 253:2 1024 UUID block_on_error 3 253:3 0 253:4 0 253:5 0
- 0
- первый блок виртуального устройства
- 52428800
- длина сегмента
- mirror clustered_disk
- зеркало и тип журнала, который в данном случае подразумевает, что он хранится на диске.
- 4
- далее следуют четыре аргумента
- 253:2
- основной и вспомогательный номера
- 1024
- размер региона, где будет регистрироваться информация о синхронизации
UUID
- UUID устройства с журналами кластера
block_on_error
- зеркало должно реагировать на ошибки
- 3
- число составляющих элементов зеркала
- 253:3 0 253:4 0 253:5 0
- основной и вспомогательный номера и смещение
A.1.4. Тип snapshot и snapshot-origin
При создании первого снимка тома используются четыре устройства Device Mapper:
- Устройство с линейным проецированием (
linear
), содержащее изначальную таблицу соответствий для исходного тома. - Устройство с линейным проецированием, используемое в качестве устройства CoW (copy-on-write) для исходного тома. При каждой операции записи данные сохраняются и на COW-устройство, тем самым синхронизируя содержимое (до тех пор пока COW-устройство не заполнится).
- Устройство с проецированием
snapshot
, совмещающим типы 1 и 2, которое представляет собой видимый снимок тома. - Исходный том. Таблица этого тома заменяется соответствием "snapshot-origin" из первого устройства.
При создании этих устройств используется фиксированная схема присвоения имен. Например, команды создания тома
base
и его снимка snap
будут выглядеть так:
#lvcreate -L 1G -n base volumeGroup
#lvcreate -L 100M --snapshot -n snap volumeGroup/base
В результате будет получено 4 устройства:
#dmsetup table|grep volumeGroup
volumeGroup-base-real: 0 2097152 linear 8:19 384 volumeGroup-snap-cow: 0 204800 linear 8:19 2097536 volumeGroup-snap: 0 2097152 snapshot 254:11 254:12 P 16 volumeGroup-base: 0 2097152 snapshot-origin 254:11 #ls -lL /dev/mapper/volumeGroup-*
brw------- 1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real brw------- 1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow brw------- 1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap brw------- 1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base
Формат
snapshot-origin
:
начало длина
snapshot-originисходный
начало
- первый блок виртуального устройства
длина
- длина сегмента
исходный
- исходный том, для которого создается снимок
Исходный том
snapshot-origin
обычно имеет один или несколько снимков. При чтении проецирование будет осуществляться напрямую. При записи исходные данные будут сохранены в COW-устройство каждого снимка. Это делается с целью буферизации изменений, до тех пор пока COW-устройство не будет заполнено.
Формат
snapshot
:
начало длина
snapshotисходный COW-устройство
P|Nразмер_секции
начало
- первый блок виртуального устройства
длина
- длина сегмента
исходный
- исходный том, для которого создается снимок
COW-устройство
- Устройство, где будут сохраняться измененные секции данных
- P|N
- P (Persistent) или N (Not persistent) определяют, будет ли сохраняться снимок после перезагрузки. Значение P сохраняет снимок, а N — не сохраняет, в случае чего метаданные будут храниться в памяти.
размер_секции
- Размер изменяемых секций на COW-устройстве (в секторах).
Следующий пример демонстрирует
snapshot-origin
для устройства с номером 254:11.
0 2097152 snapshot-origin 254:11
В следующем примере исходное устройство — 254:11, COW-устройство — 254:12. Снимок будет сохраняться между перезагрузками, а размер секций данных, сохраняемых в COW-устройстве, равен 16 секторам.
0 2097152 snapshot 254:11 254:12 P 16
A.1.5. Тип error
Тип «error» завершает неудачей любые запросы ввода и вывода к заданному сектору.
«error» обычно используется для тестирования. Скажем, надо проверить поведение устройства в случае сбоя. Для этого просто создается соответствие с поврежденным сектором где-нибудь посередине или работающий компонент зеркала специально заменяется поврежденным.
Проекция «error» может использоваться вместо поврежденного устройства во избежание задержек обращения или при реорганизации метаданных LVM в случае сбоя.
error
требует указания только двух параметров — начало и конец.
Пример:
0 65536 error
A.1.6. Тип zero
Для подстановки соответствия
zero
используется блочное устройство /dev/zero
. Запросы чтения будут возвращать блоки нулей, а запись хоть и будет завершена успешно, но записываемые данные не будут сохранены. zero
принимает два параметра — начало и длина.
Пример создания соответствия
zero
для устройства размером 16 ТБ:
0 65536 zero
A.1.7. Тип multipath
Тип «multipath» обеспечивает сопоставление для многопутевых устройств. Формат:
начало длина
multipath
#число_функций [функция1 ... функцияN] #число_аргументов [аргумент1 ... аргументN] #число_групп след_группа аргументы_группы1 ... аргументы_группыN
Каждой группе путей соответствует один набор
аргументы_группы
.
начало
- первый блок виртуального устройства
длина
- длина сегмента
#число_функций
- Число функций с их последующим списком. Если равно нулю, далее сразу будет следовать
#число_аргументов
. В настоящее время поддерживается лишь одна функция —queue_if_no_path
, которая ставит запросы ввода-вывода в очередь при отсутствии доступных путей.К примеру, если параметрno_path_retry
в файлеmultipath.conf
ставит операции ввода и вывода в очередь до тех пор, пока все пути не будут отмечены как сбойные после заданного числа попыток, соответствие будет выглядеть так:0 71014400 multipath 1 queue_if_no_path 0 2 1 round-robin 0 2 1 66:128 \ 1000 65:64 1000 round-robin 0 2 1 8:0 1000 67:192 1000
После того как все проверки путей завершились неудачей, соответствие будет выглядеть так:0 71014400 multipath 0 0 2 1 round-robin 0 2 1 66:128 1000 65:64 1000 \ round-robin 0 2 1 8:0 1000 67:192 1000
#число_аргументов
- Число аргументов аппаратного обработчика с последующим списком аргументов. Обработчик определяет модуль для выполнения операций, связанных с оборудованием, при изменении групп путей или при обработке ошибок ввода-вывода. Если значение равно нулю, дальше сразу будет следовать
число_групп
. #число_групп
- Число групп маршрутов. Группа маршрутов представляет собой набор маршрутов, используемых многопутевым устройством для распределения нагрузки. Каждой группе соответствует один набор параметров
аргументы_группы
. след_группа
- Следующая группа маршрутов.
аргументы_группы
- Каждой группе соответствуют следующие аргументы:
алгоритм #число_аргументов #число_маршрутов #число_аргументов устройство1 число_запросов1 ... устройствоN число_запросовN
Каждому маршруту соответствует один набор аргументов.алгоритм
- Алгоритм выбора пути для обработки следующего запроса ввода-вывода.
#число_аргументов
- Число аргументов. По умолчанию равно 0.
#число_маршрутов
- Число маршрутов в группе.
#число_аргументов
- Число аргументов для каждого маршрута. По умолчанию равно 1 (единственный аргумент
ioreqs
). устройство
- Номер устройства маршрута в формате
основной
:вспомогательный
. ioreqs
- Число запросов ввода и вывода, которые будут переданы этому маршруту, прежде чем будет выбран следующий путь.
Рисунок A.1, «Соответствие multipath» демонстрирует проекцию с двумя группами маршрутов.

Рисунок A.1. Соответствие multipath
Следующий пример демонстрирует определение резервного устройства на случай сбоя многопутевого устройства. Цель включает четыре группы путей, но только один путь в группе может быть открыт.
0 71014400 multipath 0 0 4 1 round-robin 0 1 1 66:112 1000 \ round-robin 0 1 1 67:176 1000 round-robin 0 1 1 68:240 1000 \ round-robin 0 1 1 65:48 1000
Ниже приведен пример того же устройства, но в этом случае используется лишь одна группа маршрутов, между которыми нагрузка будет распределена равномерно.
0 71014400 multipath 0 0 1 1 round-robin 0 4 1 66:112 1000 \ 67:176 1000 68:240 1000 65:48 1000
Документ DM-Multipath содержит дальнейшую информацию.
A.1.8. Тип crypt
crypt
обеспечит шифрование передаваемых через заданное устройство данных. При этом используется API Crypto.
Формат:
начало длина
cryptкод ключ смещение_IV устройство смещение
начало
- первый блок виртуального устройства
длина
- длина сегмента
код
- Формат кода:
cipher[-режим]-ivmode[:iv параметры]
.код
- Список кодов можно найти в файле
/proc/crypto
(например,aes
). режим
- Надо указать
cbc
, а неebc
, так какebc
не использует исходный вектор (IV). ivmode[:iv параметры]
- IV — вектор инициализации, позволяющий изменить метод шифрования. Режим IV может принимать значения
plain
илиessiv:hash
. Методplain
использует номер сектора (плюс смещение IV) в качестве IV, в то время как-essiv
представляет собой расширение для усиления защиты от атак Watermarking.
ключ
- Ключ шифрования в шестнадцатеричной форме
смещение_IV
- Смещение вектора инициализации
устройство
- блочное устройство, которое можно указать по имени или по номеру в формате
основной
:вспомогательный
смещение
- смещение проекции
Пример:
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0