Страница 1 из 3
Device mapper
Добавлено: 22 июн 2018, 14:18
Olej
Интересная ссылка - освещает ряд деталей ... (свежая - 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
И, конечно:
Там множество интересного для изучения. ;D
Re: Device mapper
Добавлено: 22 июн 2018, 14:25
Olej
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).
Re: Device mapper
Добавлено: 22 июн 2018, 15:16
Olej
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...
Но пока это бездарный кусок байт.
Device mapper
Добавлено: 22 июн 2018, 15:22
Olej
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() ... но "про себя"
, для нас это не влечёт последствий:
Код: Выделить всё
[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
Re: Device mapper
Добавлено: 22 июн 2018, 15:24
Olej
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
Теперь на полученный раздел (который у нас значится ещё и загрузочным
) размечаем файловую систему (любую!) ... форматируем:
Код: Выделить всё
[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
Re: Device mapper
Добавлено: 22 июн 2018, 15:29
Olej
Olej писал(а):
Теперь на полученный раздел (который у нас значится ещё и загрузочным
) размечаем файловую систему (любую!) ... форматируем:
Код: Выделить всё
[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
Re: Device mapper
Добавлено: 22 июн 2018, 15:32
Olej
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
Re: Device mapper
Добавлено: 22 июн 2018, 17:39
Olej
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
... но с этим я разберусь позже...
Re: Device mapper
Добавлено: 22 июн 2018, 17:43
Olej
Olej писал(а):
... но с этим я разберусь позже...
Смысл этих нудных экспериментов с kpartx в том, что (это имеет отношение к разговору о драйверах блочных устройств) блочное устройство Linux ничем не отличается от неразмеченной последовательности байт, на которую а). затем наложена структура разделов (MBR, GPT) и б). форматирование этих разделов под требуемые типы файловых систем.
Re: Device mapper
Добавлено: 30 мар 2023, 13:11
Olej
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