Зачем вообще нужно петлевое устройство?

15

Ранее я использовал для создания файлов изображений с помощью dd, настроить на них файловую систему mkfsи mountих доступ к ним как смонтированные разделы. Позже я увидел в Интернете, что многие примеры используют losetupзаранее, чтобы сделать запись устройства петли /dev, а затем смонтировать ее. Я не мог сказать, почему практически нужен файл изображения, чтобы он работал как устройство цикла и имел собственную /devзапись, в то время как такое же поведение можно было бы получить без всяких хлопот.

Описание: В реальном сценарии, зачем нам вообще нужна /dev/loopXзапись, когда мы можем просто смонтировать образ fs без него? Какая польза от петлевого устройства?

corsel
источник
9
«... в то же время такое же поведение можно получить без всяких хлопот». - Вы не правы;) - в Linux файл не может быть смонтирован без "хлопот" зацикленного устройства. Просто в наше время mountдостаточно умен, чтобы доставить вам хлопоты. (как показывает Стивен Харрис в своем ответе)
marcelm
1
Возможный дубликат В чем разница между циклом mount и mount -o
Дмитрий Григорьев,

Ответы:

22

Монтирование, как правило, должно выполняться на блочных устройствах. Драйвер цикла помещает интерфейсный блок устройства в ваш файл данных.

Если вы делаете монтирование без цикла, losetupто ОС делает это в фоновом режиме.

например

$ dd if=/dev/zero of=/tmp/foo bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0798775 s, 1.3 GB/s
$ mke2fs /tmp/foo
mke2fs 1.42.9 (28-Dec-2013)
....


$ losetup    
$ mount -o loop /tmp/foo /mnt1    
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         1  0 /tmp/foo
$ umount /mnt1
$ losetup
$ 

Вам может потребоваться позвонить losetupнапрямую, если в вашем образе файла есть встроенные разделы.

например, если у меня есть это изображение:

$ fdisk -l /tmp/foo2      

Disk /tmp/foo2: 104 MB, 104857600 bytes, 204800 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 label type: dos
Disk identifier: 0x1f25ff39

     Device Boot      Start         End      Blocks   Id  System
/tmp/foo2p1            2048      204799      101376   83  Linux

Я не могу установить это напрямую

$ mount -o loop /tmp/foo2 /mnt1
mount: /dev/loop0 is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error

Но если я использую losetupи kpartxтогда я могу получить доступ к разделам:

$ losetup -f /tmp/foo2
$ losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /tmp/foo2
$ kpartx -a /dev/loop0
$ mount /dev/mapper/loop0p1 /mnt1
$
Стивен Харрис
источник
Вам не нужно явно указывать losetup, просто используйте mount -o loop,offset=$((512*2048)), где 512размер сектора, и 2048это то, что fdiskдало Startдля раздела.
Руслан
Да, это был только пример использования. В этом конкретном примере это может быть проще сделать расчет смещения , но могут быть случаи использования (например , несколько разделов , которые вы хотите установить в то же время) , где она может быть проще просто losetupи kpartx. Пусть инструменты сделают тяжелую работу :-)
Стивен Харрис
18

Файловые системы ожидают чтения и записи на блочные устройства, но файлы изображений не являются блочными устройствами. Петлевые устройства предоставляют блочное устройство поверх файла (или другое блочное устройство, возможно с переназначением).

Во многих случаях нет необходимости учитывать петлевые устройства при монтаже изображений, потому что mountобо всем позаботится; но петлевые устройства все еще участвуют. losetup -l -aпокажет им.

Смотрите также В чем разница между циклом mount и mount -o .

Стивен Китт
источник
Таким образом, блочное устройство неявно обрабатывается mount?
Corsel
2
Да, mountзаботится losetup, добавляет -o loopи т. Д.
Стивен Китт
@corsel, В большинстве случаев у вас нормально работает вызов на вызов потерь, но есть исключения, такие как монтирование нескольких разделов из образа диска.
hildred
11

Похоже, вы работаете в Linux, и Linux использует неверное имя для этой функции.

Я изобрел эту функцию в 1988 году на SunOS-4.0, и я называю эту функцию fbk- файл эмулирует устройство BlocK.

Фоном является то, что драйвер устройства эмулирует блочное устройство поверх простого файла. Это необходимо, поскольку файловая система не может использовать обычный файл в качестве фонового хранилища для файловой системы. Это скорее нуждается в блочном устройстве, и это - то, что fbkподражает.

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

Шили
источник
3
Очень впечатляющее резюме, которое вы получили в своем профиле. Уважение ...
corsel
11
Ваш пост выглядит несколько элитным. Возможно, вы написали первую реализацию, но Linux использует другую реализацию, поэтому в ней не используется «неправильное» имя, а только другое, чем вы выбрали для своей реализации.
Остин Хеммельгарн
4
Я никогда не говорил, что они использовали правильное имя, я просто сказал, что утверждение, что это неправильно, заставляет вас звучать как элитный самоуверенный человек.
Остин Хеммельгарн
9
Название «loop» является сокращенным от «loopback» и относится к тому, как операции на блочном устройстве «зацикливаются» на VFS. Solaris 8 представил устройство lofi(«loopback file»), которое работало аналогично; BSD представила их под именем vnd(«vnode disk»), так что у концепции было много разных названий за эти годы.
кафе
2
Две самые серьезные проблемы в CS: когерентность кэша, присвоение имен идентификаторам и ошибки «один на один».
Дженс
1

Даже если он не нужен в фоновом режиме для монтирования файловых систем из файлов, он все равно понадобится для любой установки, использующей драйвер или программу, которая абсолютно ожидает блочное устройство. Представьте себе серверы nbd (сетевые блочные устройства), драйверы составных блочных устройств, такие как mdraid, lvm и т. Д.

rackandboneman
источник