Loop в linux что это

Обновлено: 05.07.2024

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

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

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

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

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

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

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

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

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

Вам не нужно явно указывать losetup , просто используйте mount -o loop,offset=$((512*2048)) , где 512 размер сектора, и 2048 это то, что fdisk дало Start для раздела. Да, это был только пример использования. В этом конкретном примере это может быть проще сделать расчет смещения , но могут быть случаи использования (например , несколько разделов , которые вы хотите установить в то же время) , где она может быть проще просто losetup и kpartx . Пусть инструменты сделают тяжелую работу :-)

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

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

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

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

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

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

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

По поводу первой команды "Мне нужно" Рассчитать смещение от начала изображения до начала раздела ", но не знаю, что означают числа, указанные в ** (512 в этом примере):

о второй команде, что такое "loop0":

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

Как работает третья команда? Что означает каждая часть в этом?:

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

Спасибо за ваши ответы и обучение меня (:

1 ответ

В первой команде число 512 относится к размеру блока изображения. Когда файл записывается на диск, он использует x количество блоков. Оставшаяся часть любого неиспользованного блока - пустое место. Вот почему вы иногда видите вещи, перечисленные как размер (фактический размер файла, папки и т. Д.) И размер на диске (объем фактически занятого диска, что позволяет учитывать несоответствие размера блока. Возьмите, например, файл размером 1234 байта, если бы мы использовали блоки по 512 байт, то на самом деле это заняло бы 3 блока, или 1536 байт (512 * 3) и 302 байта (1536 - 1234) были бы "потрачены впустую".

Loop0 - это устройство с обратной связью. Все файлы в /dev на самом деле устройства (отсюда и название:-)). Linux рассматривает устройства как файлы, что позволяет очень легко выполнять некоторые задачи при работе с оборудованием. т. е. следующая команда отправит аудиофайл непосредственно на звуковую карту для воспроизведения (программное обеспечение не требуется, аккуратно!)

Устройства с обратной связью - это специальные псевдо или поддельные устройства, которые Linux использует в таких случаях, как ваш. В этой команде вы говорите, что хотите, чтобы Linux воспринимал ваш файл образа как жесткий диск. Это позволяет вам выполнить любую команду, которую вы обычно запускаете на жестком диске, в вашем файле образа.

Для последней команды мы просто монтируем файловую систему на вашем поддельном диске (ваш файл образа) в папку в локальной файловой системе. В Linux мы используем плоскую структуру каталогов, поэтому каждое местоположение файла (включая устройства, сетевые диски и внешние жесткие диски и т. Д.) Начинается с '/', который также называется корнем файловой системы. Монтирование файловой системы просто помещает ее в место, доступное для остальной части системы (где-то в /).

Теперь по умолчанию только пользователь с именем "root" может монтировать файловые системы. Пользователь root в основном такой же, как пользователь администратора в Windows. Кто-то, кто может сделать что-нибудь на компьютере. В Ubuntu пользователь root скрыт для безопасности, поэтому нам нужно использовать sudo , Команда sudo, по сути, означает "эй, сделайте меня пользователем root для запуска этой команды".

mount вот команда, которую мы запускаем как root (sudo), /dev/loop0 - это наш поддельный диск, который мы создали ранее, и /mnt - это место, где мы хотим, чтобы образ был доступен. /mnt и /media - это стандартные места в Linux, где мы монтируем файловые системы, хотя это может быть где угодно. Лучше всего создавать подпапку в /mnt или /media для монтирования, вместо просто /mnt. Это потому, что у вас могут быть смонтированы другие файловые системы, и если вы смонтируете поверх них, они не будут доступны! Единственное предостережение: вам нужны права суперпользователя для создания папки, поэтому ваша последняя команда должна состоять из двух команд и выглядеть следующим образом:

Другой пример смотрите в losetup(8).

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

Для закольцованного блочного устройства доступны следующие операции ioctl(2):

LOOP_SET_FD Связывает закольцованное устройство с открытым файлом, чей файловый дескриптор передаётся в третьем аргументе ioctl(2). LOOP_CLR_FD Отвязывает закольцованное устройство от файлового дескриптора. LOOP_SET_STATUS Назначает состояние (передаваемое в третьем аргументе ioctl(2)) закольцованному устройству. Данный аргумент представляет собой указатель на структуру loop_info, определённую в <linux/loop.h> следующим образом:

Типом шифрования (lo_encrypt_type) должно быть одно из значений: LO_CRYPT_NONE, LO_CRYPT_XOR, LO_CRYPT_DES, LO_CRYPT_FISH2, LO_CRYPT_BLOW, LO_CRYPT_CAST128, LO_CRYPT_IDEA, LO_CRYPT_DUMMY, LO_CRYPT_SKIPJACK или LO_CRYPT_CRYPTOAPI (начиная с Linux 2.6.0).

Поле lo_flags представляет собой битовую маску, в которой может быть ноль или несколько следующих значений:

LO_FLAGS_READ_ONLY Закольцованное устройство доступно только для чтения. LO_FLAGS_AUTOCLEAR (начиная с Linux 2.6.25) Закольцованное устройство автоматически уничтожится после закрытия. LO_FLAGS_PARTSCAN (начиная с Linux 3.2) Разрешено автоматическое сканирования разделов. LOOP_GET_STATUS Получить состояние закольцованного устройства. В третьем аргументе ioctl(2) должен быть задан указатель на структуру struct loop_info. LOOP_CHANGE_FD (начиная с Linux 2.6.5) Поменять источник данных (backing store) закольцованного устройства на новый файл, определяемый файловым дескриптором, указанным в третьем аргументе ioctl(2), представленный целым числом. Данная операция допустима только, если закольцованное устройство доступно только на чтение и новый источник данных имеет тот же размер и тип, использованный ранее. LOOP_SET_CAPACITY (начиная с Linux 2.6.30) Изменить размер используемого (live) закольцованного устройства. Можно изменить размер используемого источника данных, а затем применить эту операцию для того, чтобы драйвер закольцованных устройств учёл новый размер. У этой операции нет аргументов.

Начиная с Linux 2.6, появилось две новые операции ioctl(2):

LOOP_SET_STATUS64, LOOP_GET_STATUS64 Они подобны описанным выше LOOP_SET_STATUS и LOOP_GET_STATUS, но используют структуру loop_info64, в которой есть несколько дополнительных полей, а некоторым другим полям назначены типы с большим диапазоном значений:

Другой пример смотрите в losetup(8).

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

Для закольцованного блочного устройства доступны следующие операции ioctl(2):

LOOP_SET_FD Связывает закольцованное устройство с открытым файлом, чей файловый дескриптор передаётся в третьем аргументе ioctl(2). LOOP_CLR_FD Отвязывает закольцованное устройство от файлового дескриптора. LOOP_SET_STATUS Назначает состояние (передаваемое в третьем аргументе ioctl(2)) закольцованному устройству. Данный аргумент представляет собой указатель на структуру loop_info, определённую в <linux/loop.h> следующим образом:

Типом шифрования (lo_encrypt_type) должно быть одно из значений: LO_CRYPT_NONE, LO_CRYPT_XOR, LO_CRYPT_DES, LO_CRYPT_FISH2, LO_CRYPT_BLOW, LO_CRYPT_CAST128, LO_CRYPT_IDEA, LO_CRYPT_DUMMY, LO_CRYPT_SKIPJACK или LO_CRYPT_CRYPTOAPI (начиная с Linux 2.6.0).

Поле lo_flags представляет собой битовую маску, в которой может быть ноль или несколько следующих значений:

LO_FLAGS_READ_ONLY Закольцованное устройство доступно только для чтения. LO_FLAGS_AUTOCLEAR (начиная с Linux 2.6.25) Закольцованное устройство автоматически уничтожится после закрытия. LO_FLAGS_PARTSCAN (начиная с Linux 3.2) Разрешено автоматическое сканирования разделов. LOOP_GET_STATUS Получить состояние закольцованного устройства. В третьем аргументе ioctl(2) должен быть задан указатель на структуру struct loop_info. LOOP_CHANGE_FD (начиная с Linux 2.6.5) Поменять источник данных (backing store) закольцованного устройства на новый файл, определяемый файловым дескриптором, указанным в третьем аргументе ioctl(2), представленный целым числом. Данная операция допустима только, если закольцованное устройство доступно только на чтение и новый источник данных имеет тот же размер и тип, использованный ранее. LOOP_SET_CAPACITY (начиная с Linux 2.6.30) Изменить размер используемого (live) закольцованного устройства. Можно изменить размер используемого источника данных, а затем применить эту операцию для того, чтобы драйвер закольцованных устройств учёл новый размер. У этой операции нет аргументов.

Начиная с Linux 2.6, появилось две новые операции ioctl(2):

LOOP_SET_STATUS64, LOOP_GET_STATUS64 Они подобны описанным выше LOOP_SET_STATUS и LOOP_GET_STATUS, но используют структуру loop_info64, в которой есть несколько дополнительных полей, а некоторым другим полям назначены типы с большим диапазоном значений:

Читайте также: