Я тестирую некоторый код драйвера файловой системы и хотел бы сделать это вне ядра. Самый простой и безопасный способ сделать это из пользовательского пространства. Итак, я создал файл некоторой длины

dd if=/dev/zero of=testfs bs=10M count=50

Затем я установил схему разбиения MBR с помощью fdisk

fdisk testfs

Я могу настроить петлевое устройство для доступа к моему файлу в режиме эмуляции блока:

$ losetup /dev/loop0 testfs

На данный момент я могу видеть это новое эмулированное блочное устройство в списке устройств:

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0    50G  0 disk 
├─sda1   8:1    0    46G  0 part /
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0     4G  0 part [SWAP]
sr0     11:0    1  55.2M  0 rom  
loop0    7:0    0    50M  0 loop 

И это устройство имеет следующую таблицу разделов

$ fdisk -l /dev/loop0 

Disk /dev/loop0: 52 MB, 52428800 bytes
96 heads, 25 sectors/track, 42 cylinders, total 102400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xe7d5af9a

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *        2048      102399       50176    7  HPFS/NTFS/exFAT

Однако для создания файловой системы мне нужно смонтировать раздел, а не "диск". Разве система циклов не монтирует разделы устройства автоматически, как другие блочные устройства? Мне удалось создать файловую систему путем монтирования файла через цикл со смещением

$ losetup -o $((2048*512)) /dev/loop0 testfs

Но это решение далеко не идеальное, поскольку поведение немного отличается от реальных блочных устройств. Есть ли способ "автоподключения" разделов при выполнении через петлевое устройство?

1 ответ1

0

Для этого есть вариант:

losetup --partscan /dev/loop0 testfs

Это активирует поддержку регулярных разделов в вашем ядре, создав /dev/loop0p1 и так далее.


Вы также можете использовать partx из util-linux:

losetup /dev/loop0 testfs
partx -u /dev/loop0

Это создаст основанные на ядре разделы (/dev/loop0p1 и т.д.), Но сама таблица разделов будет проанализирована с использованием libblkid, а не по запросу ядра.


Наконец, есть kpartx из нескольких инструментов:

losetup /dev/loop0 testfs
kpartx -u /dev/loop0

Хотя на первый взгляд это то же самое, что и выше, оно вообще не использует встроенную в ядро поддержку циклических разделов. Вместо этого он создает /dev/mapper/loop0p1 с использованием подсистемы device-mapper (линейные отображения).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .