Device mapper

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

Модератор: Olej

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

Device mapper

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

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

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

Device mapper

Непрочитанное сообщение Olej » 31 мар 2023, 16:39

Olej писал(а):
30 мар 2023, 15:12
Особенно интересным и актуальным это стало в прошедшие (с создания темы) несколько лет, применительно к разнообразным SSD и M2 NVME и всяким подобным флеш-устройствам хранения без движущихся честей
К сожалению, я как-то забегался тогда, и упустил теперь эту проработку при подготовке 1-го издания книги: Книга: "Расширения ядра Linux: драйверы и модули".
Сейчас самое время заняться и подготовить фактический материал для 2-го издания.

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

olej@R420:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Linuxmint
Description:    Linux Mint 21.1
Release:        21.1
Codename:       vera

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

Device mapper

Непрочитанное сообщение Olej » 31 мар 2023, 16:40

Olej писал(а):
31 мар 2023, 16:39
Сейчас самое время заняться и подготовить фактический материал для 2-го издания.
У меня для этого дела по случаю ("белый рояль в кустах" :lol: ) есть на сервере пустой раздел на одном из дисков, для экспериментов:

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

olej@R420:/mnt/sdc2$ df /dev/sdc2
Файл.система   1K-блоков Использовано  Доступно Использовано% Cмонтировано в
/dev/sdc2      954122316           28 905582232            1% /mnt/sdc2

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

olej@R420:~$ mount | grep sdc2
/dev/sdc2 on /mnt/sdc2 type ext4 (rw,nosuid,nodev,noexec,relatime,user)

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

olej@R420:~/2023/EmerCoin$ cd /mnt/sdc2

olej@R420:/mnt/sdc2$ ls -l
итого 16
drwx------ 2 olej olej 16384 мая 20  2022 lost+found

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

Device mapper

Непрочитанное сообщение Olej » 31 мар 2023, 16:57

Olej писал(а):
31 мар 2023, 16:40
для экспериментов

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

olej@R420:/mnt/sdc2$ dd if=/dev/zero of=./vdisk bs=10M count=100
100+0 записей получено
100+0 записей отправлено
1048576000 байт (1,0 GB, 1000 MiB) скопирован, 0,905297 s, 1,2 GB/s
Такой вот в 1 Gb линейный участок байт:

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

olej@R420:/mnt/sdc2$ ls -l
итого 1024020
drwx------ 2 olej olej      16384 мая 20  2022 lost+found
-rw-rw-r-- 1 olej olej 1048576000 мар 31 16:49 vdisk

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

Device mapper

Непрочитанное сообщение Olej » 31 мар 2023, 20:02

Olej писал(а):
31 мар 2023, 16:57
Такой вот в 1 Gb линейный участок байт:
Olej писал(а):
22 июн 2018, 15:16
Теперь из этого куска байтов делаем виртуальный диск:
Сейчас, в отличие от тогда, этот номер не проходит :!:

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

olej@R420:/mnt/sdc2$ sudo kpartx -a -v ./vdisk
[sudo] пароль для olej:

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

olej@R420:/mnt/sdc2$ ls -l /dev/mapper
итого 0
crw------- 1 root root 10, 236 мар 31 11:03 control

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

olej@R420:/mnt/sdc2$ ls -l /dev/dm*
итого 0
crw------- 1 root root 249, 0 мар 31 11:03 system
Никакого эффекта. :-(

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

Device mapper

Непрочитанное сообщение Olej » 31 мар 2023, 20:07

Olej писал(а):
31 мар 2023, 20:02
Никакого эффекта.
Разбирательство, которое потребовало довольно много времени, показало, что kpartx, предназначенный для работы с имиджами дисковых устройств, не хочет иметь дел с неразмеченным куском байт :!:

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

Device mapper

Непрочитанное сообщение Olej » 31 мар 2023, 20:08

Olej писал(а):
31 мар 2023, 20:07
не хочет иметь дел с неразмеченным куском байт
Для чистоты экспериментирования (чтобы исключить внутреннее структурирование виртуального диска) каждый раз начинаем с чистого неразмеченного куска:

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

root@R420:/mnt/sdc2# rm vdisk

olej@R420:/mnt/sdc2$ dd if=/dev/zero of=./vdisk bs=10M count=100
100+0 записей получено
100+0 записей отправлено
1048576000 байт (1,0 GB, 1000 MiB) скопирован, 1,261 s, 832 MB/s

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

olej@R420:/mnt/sdc2$ losetup -a
olej@R420:/mnt/sdc2$

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

root@R420:/mnt/sdc2# kpartx -a -vvv vdisk

root@R420:/mnt/sdc2# echo $?
0

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

olej@R420:/mnt/sdc2$ losetup -a
/dev/loop0: []: (/mnt/sdc2/vdisk)
Это вот имидж на петлевом интерфейсе.

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

Device mapper

Непрочитанное сообщение Olej » 31 мар 2023, 20:12

Olej писал(а):
31 мар 2023, 20:08
Это вот имидж на петлевом интерфейсе.
А теперь на нём создадим структуру диска (метка, разделы...)

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

root@R420:/mnt/sdc2# fdisk /dev/loop0

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

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

Команда (m для справки): o
Создана новая метка DOS с идентификатором 0xc81a4efc.

Команда (m для справки): n
Тип раздела
   p   основной (0 primary, 0 extended, 4 free)
   e   расширенный (контейнер для логических разделов)
Выберите (по умолчанию - p): p
Номер раздела (1-4, по умолчанию 1):
Первый сектор (2048-2047999, по умолчанию 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2047999, по умолчанию 2047999): +200M

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

Команда (m для справки): n
Тип раздела
   p   основной (1 primary, 0 extended, 3 free)
   e   расширенный (контейнер для логических разделов)
Выберите (по умолчанию - p): p
Номер раздела (2-4, по умолчанию 2):
Первый сектор (411648-2047999, по умолчанию 411648): 600000
Last sector, +/-sectors or +/-size{K,M,G,T,P} (600000-2047999, по умолчанию 2047999): +200M

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

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

Устр-во      Загрузочный начало   Конец Секторы Размер Идентификатор Тип
/dev/loop0p1               2048  411647  409600   200M            83 Linux
/dev/loop0p2             600000 1009663  409664   200M            83 Linux

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

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or partx(8).

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

root@R420:/mnt/sdc2# partprobe /dev/loop0
И так же точно это мог бы быть не MBR диск а GPT:

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

root@R420:/mnt/sdc2# fdisk -l /dev/loop0
Диск /dev/loop0: 1000 MiB, 1048576000 байт, 2048000 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0xc81a4efc

Устр-во      Загрузочный начало   Конец Секторы Размер Идентификатор Тип
/dev/loop0p1               2048  411647  409600   200M            83 Linux
/dev/loop0p2             600000 1009663  409664   200M            83 Linux

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

root@R420:/mnt/sdc2# gdisk -l /dev/loop0
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present
  
  
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory.
***************************************************************

Disk /dev/loop0: 2048000 sectors, 1000.0 MiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 8D15B77D-D3F6-43A7-8357-79237B64BE7D
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 2047966
Partitions will be aligned on 64-sector boundaries
Total free space is 1228669 sectors (599.9 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          411647   200.0 MiB   8300  Linux filesystem
   2          600000         1009663   200.0 MiB   8300  Linux filesystem

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

Device mapper

Непрочитанное сообщение Olej » 31 мар 2023, 20:15

Olej писал(а):
31 мар 2023, 20:12
создадим структуру диска

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

root@R420:/mnt/sdc2# kpartx -a -vvv vdisk
add map loop0p1 (253:0): 0 409600 linear 7:0 2048
add map loop0p2 (253:1): 0 409664 linear 7:0 600000

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

olej@R420:/mnt/sdc2$ ls -l /dev/mapper/*
crw------- 1 root root 10, 236 мар 31 11:03 /dev/mapper/control
lrwxrwxrwx 1 root root       7 мар 31 19:04 /dev/mapper/loop0p1 -> ../dm-0
lrwxrwxrwx 1 root root       7 мар 31 19:04 /dev/mapper/loop0p2 -> ../dm-1

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

olej@R420:/mnt/sdc2$ ls -l /dev/dm-*
brw-rw---- 1 root disk 253, 0 мар 31 19:04 /dev/dm-0
brw-rw---- 1 root disk 253, 1 мар 31 19:04 /dev/dm-1
Вот оно :!:
Это уже полноценные диски ... с которыми можно делать всё, что и с любыми другими дисками:

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

root@R420:/mnt/sdc2# hdparm -tT /dev/dm-0

/dev/dm-0:
 Timing cached reads:   19242 MB in  1.99 seconds = 9667.55 MB/sec
 Timing buffered disk reads: 200 MB in  0.17 seconds = 1199.75 MB/sec

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

root@R420:/mnt/sdc2# hdparm -tT /dev/dm-1

/dev/dm-1:
 Timing cached reads:   14856 MB in  1.99 seconds = 7454.76 MB/sec
 Timing buffered disk reads: 200 MB in  0.13 seconds = 1559.60 MB/sec

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

Device mapper

Непрочитанное сообщение Olej » 31 мар 2023, 20:17

Olej писал(а):
31 мар 2023, 20:15
Вот оно
Теперь на этих 2-х разделах расфрматируем 2 разных файловых системы:

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

root@R420:/mnt/sdc2# sudo mkfs.ext2 /dev/dm-0
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 51200 4k blocks and 51200 inodes
Filesystem UUID: d9a32344-280e-45bd-b118-ffd63839bbc1
Superblock backups stored on blocks:
    32768

Allocating group tables: done
Сохранение таблицы inod'ов: done
Writing superblocks and filesystem accounting information: готово

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

root@R420:/mnt/sdc2# sudo mkfs.vfat /dev/dm-1
mkfs.fat 4.2 (2021-01-31)

Ответить

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

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

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