Show Table of Contents
Приложение 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 volumeGroupvolumeGroup-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

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.