Device mapper

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Device mapper

Непрочитанное сообщение Olej » 22 июн 2018, 14:18

Интересная ссылка - освещает ряд деталей ... (свежая - 15 октября 2017, хотя и использование device mapper активно началось, по существу, года только с 2013-го):
https://ru.wikipedia.org/wiki/Device_mapper
Device mapper (dm) — подсистема (модуль) ядра Linux, позволяющая создавать виртуальные блочные устройства (ВБУ).
Для поэкспериментировать и поизучать:

Код: Выделить всё

[olej@dell /]$ sudo dmsetup ls
cryptswap1      (253:0)

[olej@dell /]$ ls /dev/mapper/
control  cryptswap1
И, конечно:

Код: Выделить всё

$ dmsetup --help
...
Там множество интересного для изучения. ;D

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Device mapper

Непрочитанное сообщение Olej » 22 июн 2018, 14:25

Olej писал(а):Интересная ссылка - освещает ряд деталей ... (свежая - 15 октября 2017, хотя и использование device mapper активно началось, по существу, года только с 2013-го):
https://ru.wikipedia.org/wiki/Device_mapper
Device mapper (dm) — подсистема (модуль) ядра Linux, позволяющая создавать виртуальные блочные устройства (ВБУ).
Возможности device mapper используются в следующих проектах:
...
kpartx — утилита, вызываемая hotplug, для создания и удаления таблиц разделов БУ;
Очень полезные игры с kpartx уже обсуждались детально здесь: образы и карточки - относительно файлов образов .img для создания загрузочных SD карт для одноплатных микрокомпьютеров (SBC).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Device mapper

Непрочитанное сообщение Olej » 22 июн 2018, 15:16

Olej писал(а):
Возможности device mapper используются в следующих проектах:
...
kpartx — утилита, вызываемая hotplug, для создания и удаления таблиц разделов БУ;
Очень полезные игры с kpartx уже обсуждались детально здесь: образы и карточки - относительно файлов образов .img для создания загрузочных SD карт для одноплатных микрокомпьютеров (SBC).
Делаю вот такой фиктивный-виртуальный диск...

Код: Выделить всё

[olej@xenix dm]$ time dd if=/dev/zero of=./vbu bs=10M count=50
50+0 записей получено
50+0 записей отправлено
524288000 байт (524 MB, 500 MiB) скопирован, 0,586872 s, 893 MB/s

real	0m0,589s
user	0m0,000s
sys	0m0,584s

[olej@xenix dm]$ ls -l
итого 512000
-rw-rw-r-- 1 olej olej 524288000 июн 22 14:31 vbu
Пока это просто тупая заготовка - файл на 500Mb.
Теперь из этого куска байтов делаем виртуальный диск:

Код: Выделить всё

[olej@xenix dm]$ kpartx -a -v ./vbu
/dev/mapper/control: open failed: Permission denied
Failure to communicate with kernel device-mapper driver.
Incompatible libdevmapper 1.02.144 (2017-10-06) and kernel driver (unknown version).
device mapper prerequisites not met

[olej@xenix dm]$ sudo kpartx -a -v ./vbu
[sudo] пароль для olej: 
add map loop0p1 (253:0): 0 1023997 linear 7:0 3

[olej@xenix dm]$ ls -l /dev/mapper
итого 0
crw------- 1 root root 10, 236 июн 22 13:28 control
lrwxrwxrwx 1 root root       7 июн 22 14:37 loop0p1 -> ../dm-0

[olej@xenix dev]$ ls -l /dev/dm*
brw-rw---- 1 root disk 253, 0 июн 22 14:37 /dev/dm-0
Понятно, что kpartx нужен root для работы с /dev...
Но пока это бездарный кусок байт.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Device mapper

Непрочитанное сообщение Olej » 22 июн 2018, 15:22

Olej писал(а):Но пока это бездарный кусок байт.
Теперь нанесём на него (разметим) структуру разделов:

Код: Выделить всё

[olej@xenix dev]$ sudo fdisk /dev/dm-0

Добро пожаловать в fdisk (util-linux 2.30.2).
Изменения останутся только в памяти до тех пор, пока вы не решите записать их.
Будьте внимательны, используя команду write.

Устройство не содержит стандартной таблицы разделов.
Создана новая метка DOS с идентификатором 0x4d865227.

Команда (m для справки): p
Диск /dev/dm-0: 500 MiB, 524286464 байт, 1023997 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x4d865227

Команда (m для справки): n
Тип раздела
   p   основной (0 первичный, 0 расширеный, 4 свободно)
   e   расширенный (контейнер для логических разделов)
Выберите (по умолчанию - p):

Используется ответ по умолчанию p
Номер раздела (1-4, default 1): 
Первый сектор (2048-1023996, default 2048): 
Последний сектор + число секторов или + размер{K,M,G,T,P} (2048-1023996, default 1023996):

Создан новый раздел 1 с типом 'Linux' и размером 499 MiB.

Команда (m для справки): a
Выбранный раздел 1
Флаг загрузки раздела 1 включен.

Команда (m для справки): p
Диск /dev/dm-0: 500 MiB, 524286464 байт, 1023997 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x4d865227

Устр-во                   Загрузочный начало   Конец Секторы Размер Идентификатор Тип
/dev/mapper/loop0p1-part1 *             2048 1023996 1021949   499M            83 Linux

Команда (m для справки): w
Таблица разделов была изменена.
Вызывается ioctl() для перечитывания таблицы разделов.
Перечитывание таблицы разделов не удалось.: Недопустимый аргумент

Ядро все еще использует старую таблицу. Новая таблица будет использована при следующей перезагрузке или при запуске partprobe(8) или kpartx(8).
Что-то он там ругнулся на ioctl() ... но "про себя" :lol: , для нас это не влечёт последствий:

Код: Выделить всё

[olej@xenix dev]$ sudo fdisk -l /dev/dm-0
Диск /dev/dm-0: 500 MiB, 524286464 байт, 1023997 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x4d865227

Устр-во                   Загрузочный начало   Конец Секторы Размер Идентификатор Тип
/dev/mapper/loop0p1-part1 *             2048 1023996 1021949   499M            83 Linux
И для убедительности (чтобы по-новой не подключать его kpartx, что было бы как-раз совершенно правильно):

Код: Выделить всё

[olej@xenix dev]$ sudo partprobe /dev/dm-0

[olej@xenix dev]$ echo $?
0
Теперь у нас есть структура разделов:

Код: Выделить всё

[olej@xenix dev]$ ls -l /dev/mapper/*
crw------- 1 root root 10, 236 июн 22 13:28 /dev/mapper/control
lrwxrwxrwx 1 root root       7 июн 22 14:43 /dev/mapper/loop0p1 -> ../dm-0
lrwxrwxrwx 1 root root       7 июн 22 14:43 /dev/mapper/loop0p1p1 -> ../dm-1

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Device mapper

Непрочитанное сообщение Olej » 22 июн 2018, 15:24

Olej писал(а):
Olej писал(а): Теперь у нас есть структура разделов:

Код: Выделить всё

[olej@xenix dev]$ ls -l /dev/mapper/*
crw------- 1 root root 10, 236 июн 22 13:28 /dev/mapper/control
lrwxrwxrwx 1 root root       7 июн 22 14:43 /dev/mapper/loop0p1 -> ../dm-0
lrwxrwxrwx 1 root root       7 июн 22 14:43 /dev/mapper/loop0p1p1 -> ../dm-1
Теперь на полученный раздел (который у нас значится ещё и загрузочным :lol: ) размечаем файловую систему (любую!) ... форматируем:

Код: Выделить всё

[olej@xenix dev]$ sudo mkfs.ext2 /dev/dm-1
mke2fs 1.43.5 (04-Aug-2017)
Discarding device blocks: done                            
Creating filesystem with 510972 1k blocks and 128016 inodes
Filesystem UUID: 8b7ececd-a193-45f7-87d4-1e760496ee25
Superblock backups stored on blocks: 
    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done 

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Device mapper

Непрочитанное сообщение Olej » 22 июн 2018, 15:29

Olej писал(а): Теперь на полученный раздел (который у нас значится ещё и загрузочным :lol: ) размечаем файловую систему (любую!) ... форматируем:

Код: Выделить всё

[olej@xenix dev]$ sudo mkfs.ext2 /dev/dm-1
mke2fs 1.43.5 (04-Aug-2017)
Discarding device blocks: done                            
Creating filesystem with 510972 1k blocks and 128016 inodes
Filesystem UUID: 8b7ececd-a193-45f7-87d4-1e760496ee25
Superblock backups stored on blocks: 
    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done 
И монтируем теперь этот лже-диск в корневую файловую систему:

Код: Выделить всё

[olej@xenix dev]$ sudo mkdir /mnt/vbu

[olej@xenix dev]$ sudo mount /dev/dm-1 /mnt/vbu/

[olej@xenix dev]$ ls -l /mnt/vbu
итого 12
drwx------ 2 root root 12288 июн 22 14:48 lost+found
Смотрим где он и как там в файловой системе пристроился:

Код: Выделить всё

[olej@xenix dev]$ df
Файловая система      1K-блоков Использовано Доступно Использовано% Cмонтировано в
devtmpfs                4036752            0  4036752            0% /dev
tmpfs                   4049716        85384  3964332            3% /dev/shm
tmpfs                   4049716         1264  4048452            1% /run
tmpfs                   4049716            0  4049716            0% /sys/fs/cgroup
/dev/sdb2             156033024    134825560 20487000           87% /
tmpfs                   4049716            8  4049708            1% /tmp
/dev/sdb1                243815       189211    37708           84% /boot
tmpfs                    809940           36   809904            1% /run/user/1000
/dev/mapper/loop0p1p1    494816         2318   466950            1% /mnt/vbu

[olej@xenix dev]$ df | grep vbu
/dev/mapper/loop0p1p1    494816         2318   466950            1% /mnt/vbu

[olej@xenix dev]$ mount | grep vbu
/dev/mapper/loop0p1p1 on /mnt/vbu type ext2 (rw,relatime,block_validity,barrier,user_xattr,acl)
Всё! У нас появилось полноценное дисковое устройство - с major номером 253 и minor номерами 0,1 и т.д.:

Код: Выделить всё

[olej@xenix vbu]$ ls -l /dev/dm*
brw-rw---- 1 root disk 253, 0 июн 22 14:43 /dev/dm-0
brw-rw---- 1 root disk 253, 1 июн 22 14:48 /dev/dm-1
И даже специализирванная тестовая утилита для проверки дисковых носителей не отличает его от "железного" диска:

Код: Выделить всё

[olej@xenix vbu]$ sudo hdparm -tT /dev/dm-0
[sudo] пароль для olej: 

/dev/dm-0:
 Timing cached reads:   10378 MB in  1.99 seconds = 5205.99 MB/sec
 Timing buffered disk reads: 498 MB in  1.26 seconds = 396.09 MB/sec

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Device mapper

Непрочитанное сообщение Olej » 22 июн 2018, 15:32

Olej писал(а): Всё! У нас появилось полноценное дисковое устройство - с major номером 253 и minor номерами 0,1 и т.д.:

Код: Выделить всё

[olej@xenix vbu]$ ls -l /dev/dm*
brw-rw---- 1 root disk 253, 0 июн 22 14:43 /dev/dm-0
brw-rw---- 1 root disk 253, 1 июн 22 14:48 /dev/dm-1
Захожу на смонтированный диск и проверяю его "полноценность" файловыми операциями ... например так:

Код: Выделить всё

[olej@xenix vbu]$ cd /mnt/vbu 

[olej@xenix vbu]$ echo 12345 > test.file.txt
bash: test.file.txt: Отказано в доступе

[olej@xenix vbu]$ sudo chmod a+rwx /mnt/vbu
[sudo] пароль для olej: 

[olej@xenix vbu]$ echo 12345 > test.file.txt

[olej@xenix vbu]$ cat test.file.txt
12345

[olej@xenix vbu]$ ls -l
итого 13
drwx------ 2 root root 12288 июн 22 14:48 lost+found
-rw-rw-r-- 1 olej olej     6 июн 22 15:00 test.file.txt

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Device mapper

Непрочитанное сообщение Olej » 22 июн 2018, 17:39

Olej писал(а): Захожу на смонтированный диск и проверяю его "полноценность" файловыми операциями ... например так:
А теперь обратным порядком...
- размонтировали:

Код: Выделить всё

[olej@xenix mnt]$ sudo umount /mnt/vbu

[olej@xenix mnt]$ mount | grep vbu
- убрали отображение виртуального диска:

Код: Выделить всё

[olej@xenix dm]$ sudo kpartx -d -vvv /dev/dm-0
del devmap : loop0p1p1
Это должно бы полностью уничтожить диск ... но удалилось только отображение раздела:

Код: Выделить всё

[olej@xenix dm]$ ls -l /dev/dm*
brw-rw---- 1 root disk 253, 0 июн 22 14:43 /dev/dm-0
... но с этим я разберусь позже...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Device mapper

Непрочитанное сообщение Olej » 22 июн 2018, 17:43

Olej писал(а): ... но с этим я разберусь позже...
Смысл этих нудных экспериментов с kpartx в том, что (это имеет отношение к разговору о драйверах блочных устройств) блочное устройство Linux ничем не отличается от неразмеченной последовательности байт, на которую а). затем наложена структура разделов (MBR, GPT) и б). форматирование этих разделов под требуемые типы файловых систем.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Device mapper

Непрочитанное сообщение Olej » 30 мар 2023, 13:11

Olej писал(а): Смысл этих нудных экспериментов с kpartx
Всё то же самое, в разных вариациях, можно делать и с dm (device mapper), на котором построен kpartx.
Для терминального управления dm предоставляется утилита:

Код: Выделить всё

[olej@xenix dm]$ dmsetup
Usage:

dmsetup
        [--version] [-h|--help [-c|-C|--columns]]
        [-v|--verbose [-v|--verbose ...]] [-f|--force]
        [--checks] [--manglename {none|hex|auto}]
        [-r|--readonly] [--noopencount] [--noflush] [--nolockfs] [--inactive]
        [--udevcookie <cookie>] [--noudevrules] [--noudevsync] [--verifyudev]
        [-y|--yes] [--readahead {[+]<sectors>|auto|none}] [--retry]
        [-c|-C|--columns] [-o <fields>] [-O|--sort <sort_fields>]
        [-S|--select <selection>] [--nameprefixes] [--noheadings]
        [--separator <separator>]

	help [-c|-C|--columns]
	create <dev_name>
	    [-j|--major <major> -m|--minor <minor>]
	    [-U|--uid <uid>] [-G|--gid <gid>] [-M|--mode <octal_mode>]
	    [-u|--uuid <uuid>] [--addnodeonresume|--addnodeoncreate]
	    [--readahead {[+]<sectors>|auto|none}]
	    [-n|--notable|--table {<table>|<table_file>}]
	create --concise [<concise_device_spec_list>]
	remove [--deferred] [-f|--force] [--retry] <device>...
	remove_all [-f|--force]
	suspend [--noflush] [--nolockfs] <device>...
	resume [--noflush] [--nolockfs] <device>...
	       [--addnodeonresume|--addnodeoncreate]
	       [--readahead {[+]<sectors>|auto|none}]
	load <device> [<table>|<table_file>]
	clear <device>
	reload <device> [<table>|<table_file>]
	wipe_table [-f|--force] [--noflush] [--nolockfs] <device>...
	rename <device> [--setuuid] <new_name_or_uuid>
	message <device> <sector> <message>
	ls [--target <target_type>] [--exec <command>] [-o <options>] [--tree]
	info [<device>...]
	deps [-o <options>] [<device>...]
	stats <command> [<options>] [<device>...]
	status [<device>...] [--noflush] [--target <target_type>]
	table [<device>...] [--concise] [--target <target_type>] [--showkeys]
	wait <device> [<event_nr>] [--noflush]
	mknodes [<device>...]
	mangle [<device>...]
	udevcreatecookie 
	udevreleasecookie [<cookie>]
	udevflags <cookie>
	udevcomplete <cookie>
	udevcomplete_all [<age_in_minutes>]
	udevcookies 
	targets 
	version 
	setgeometry <device> <cyl> <head> <sect> <start>
	splitname <device> [<subsystem>]

<device> may be device name or (if only one) -u <uuid> or -j <major> -m <minor>
<mangling_mode> is one of 'none', 'auto' and 'hex'.
<fields> are comma-separated.  Use 'help -c' for list.
<concise_device_specification> has single-device entries separated by semi-colons:
    <name>,<uuid>,<minor>,<flags>,<table>
        where <flags> is 'ro' or 'rw' (the default) and any of <uuid>, <minor>
        and <flags> may be empty. Separate extra table lines with commas.
    E.g.: dev1,,,,0 100 linear 253:1 0,100 100 error;dev2,,,ro,0 1 error
Table_file contents may be supplied on stdin.
Options are: devno, devname, blkdevname.
Tree specific options are: ascii, utf, vt100; compact, inverted, notrunc;
                           blkdevname, [no]device, active, open, rw and uuid.
... ну и ещё ряд дополнительных tools:

Код: Выделить всё

[olej@xenix dm]$ ls /usr/sbin/dm*
/usr/sbin/dm_dso_reg_tool  /usr/sbin/dmevent_tool  /usr/sbin/dmidecode  /usr/sbin/dmraid.static  /usr/sbin/dmstats
/usr/sbin/dmeventd         /usr/sbin/dmfilemapd    /usr/sbin/dmraid     /usr/sbin/dmsetup

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей