> Ordu, я столько лет пользуюсь линуксом, но до сих пор понять не
> могу, зачем нужны loop-устройства и что они конкретно делают и почему
> обычного файла недостаточно, ведь в обычных файлах тоже можно и перематывать
> дескриетов, и читать, а лучше - вообще отобразить в память. Просветишь? В ядре есть драйвера для файловых систем. Это уже готовые реализации файловых систем. Если ты работаешь с образом файловой системы в файле, было бы удобно использовать эти реализации, вместо того, чтобы писать новые, которые будут работать в user-space, так?
Или та же проблем с другой стороны? Ты вызываешь fprintf(3), тот вызывает write(2), а write -- это заглушка glibc, которая вызывает сисколл ядра write. Как write поймёт, что он пишет в "файл в файле", а не в сам файл? Что, например, надо выделить новый inode в образе файловой системы, а не просто продолжать писать байтики последовательно до конца файла, и потом за конец его увеличивая его размер по мере необходимости? Ты вызываешь fclose(3), который вызывает заглушку close(2), которая вызывает сисколл close, который должен догадаться, что закрывать надо не файл образа фс, а файл лежащий в файле образа фс.
Я не буду утверждать, что проблему нельзя решить чисто в юзерспейсе, посредством модификации glibc и, может быть, добавлением какого-нибудь специального сисколла в ядро, или там ioctl'а. Или вынесением реализаций фс в юзерспейс. Но в linux это сделано при помощи устройств /dev/loop.
Файловые системы ядра работают поверх блочных устройств. losetup просит ядро сделать виртуальное блочное устройство, содержимое которого будет совпадать с содержимым указанного файла. То есть если ты будешь читать /dev/loop0 ты прочитаешь тот самый файл, на который он ссылается. Но loop0 -- это не обычный файл, а файл блочного устройства -- он ссылается на драйвер, который ведёт себя как драйвер жёсткого диска/флешки/... А это значит, что драйвера файловой системы в ядре умеют с ним работать. И этот /dev/loop0 можно смонтировать используя те же механизмы монтирования, которые ты используешь при монтировании /dev/sda1.
Такая реализация отличается простотой: всё что надо дополнительно, чтобы оно заработало -- это модуль ядра, который будет уметь изображать блочное устройство поверх обычного файла файла.