Программирование loopback-устройства, состоящего из нескольких файлов в Linux - PullRequest
3 голосов
/ 23 декабря 2010

Хей,

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

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

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

Спасибо заранее и всего наилучшего, Rainer

Ответы [ 2 ]

4 голосов
/ 23 декабря 2010

Вам не нужно ничего программировать. Вы можете использовать подсистему Linux для нескольких устройств (a.k.a. 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: Теперь это действительно подходит для суперпользователя, не так ли?

2 голосов
/ 23 декабря 2010

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

...