Программирование loopback-устройства, состоящего из нескольких файлов в Linux

Хей,

относительно легко использовать файл для эмуляции блочного устройства с помощью losetup в Linux:

Может ли кто-нибудь дать мне подсказку, что искать, если я хочу запрограммировать свое собственное блочное устройство, основанное на нескольких файлах, из которых я беру контент? Для вашего понимания, я хотел бы взять байты 1-500 и 1.000-3.000 из файла1 и байты 501-999 и байты 3.001-5.000 из файла2, чтобы предложить их как комбинированное блочное устройство. Мой любимый язык программирования — Python, и я хочу как можно больше писать свою программу в пользовательском пространстве.

Для Windows я нашел такую ​​реализацию. Он называется FileDisk и HttpDisk, и его можно найти здесь:

Заранее спасибо и с уважением, Райнер


person dubbaluga    schedule 23.12.2010    source источник


Ответы (2)


Вам не нужно ничего программировать. Вы можете использовать подсистему Linux для нескольких устройств (также известную как md) для создания блочного устройства, состоящего из нескольких меньших устройств.

Чтобы это работало, вы используете mdadm для сборки LINEAR устройства рейда из устройств меньшего размера.

Обновление
Вот что я сделал:

$ cd /images
$ dd if=/dev/zero bs=1M count=100 of=a.img
$ dd if=/dev/zero bs=1M count=50 of=b.img
$ dd if=/dev/zero bs=1M count=150 of=c.img
$ losetup -f
/dev/loop0
$ for i in a b c; do losetup -f $i.img; done
$ mdadm --build /dev/md0 -l linear -n 3 /dev/loop[012]
mdadm: array /dev/md0 built and started.
$ cat /proc/mdstat
Personalities : [linear] 
md0 : active linear loop2[2] loop1[1] loop0[0]
      307200 blocks super non-persistent 64k rounding

Обратите внимание, что я использовал $ в качестве подсказки, чтобы не путать автоматическую подсветку синтаксиса ;)

Так просто.

Ваше здоровье.

PS: Теперь это действительно подходит для суперпользователя, не так ли?

person Marcus Borkenhagen    schedule 23.12.2010
comment
Хей, спасибо за ответ. Но я думаю, что это решение не поддерживает сценарий, который я описал. На самом деле я забыл упомянуть, что хотел запрограммировать что-то вроде оверлейного блочного устройства, у которого есть некоторая логика, чтобы решить, из какого файла оно берет свое содержимое. Пока пойду на НБД. Также существуют некоторые реализации Python (например, lists.canonical.org/ pipermail/kragen-hacks/2004-May/000397.html). - person dubbaluga; 23.12.2010
comment
dubbaluga: Добро пожаловать. Вы говорили о программировании, но я подумал, что это будет слишком много перед лицом md ;). Удачи! - person Marcus Borkenhagen; 24.12.2010

Если вы хотите полностью оставаться в пользовательском пространстве с помощью простого API, я настоятельно рекомендую FUSE, который будет относительно просто в Python.

person Tim Post♦    schedule 23.12.2010
comment
FUSE — это уровень файловой системы, а не уровень блочного устройства. - person Marcus Borkenhagen; 23.12.2010
comment
Да, FUSE — это файловая система в пользовательском пространстве. Что ж, CUSE теперь позволяет использовать символьное устройство в пользовательском пространстве, но BUSE нет. Обычно люди просто взламывают NBD для этого. - person ephemient; 23.12.2010
comment
Большое спасибо за ваши предложения! На данный момент я пойду на NBD. Это кажется самым простым решением, и, как ответил Фричи на сообщение, также существуют реализации Python. - person dubbaluga; 24.12.2010