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:
  1. Устройство с линейным проецированием (linear), содержащее изначальную таблицу соответствий для исходного тома.
  2. Устройство с линейным проецированием, используемое в качестве устройства CoW (copy-on-write) для исходного тома. При каждой операции записи данные сохраняются и на COW-устройство, тем самым синхронизируя содержимое (до тех пор пока COW-устройство не заполнится).
  3. Устройство с проецированием snapshot, совмещающим типы 1 и 2, которое представляет собой видимый снимок тома.
  4. Исходный том. Таблица этого тома заменяется соответствием "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» демонстрирует проекцию с двумя группами маршрутов.
Соответствие 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