Маунт iso -o loop выбрать устройство петли

0

У меня есть скрипт bash, где я монтирую ISO для зацикливания устройств:

mount -o loop my.iso /tmp/foo

И бывает, что в то же время в моей ОС (Linux Mint 19) у меня смонтирован ISO-образ с использованием опции GUI для этого действия.

Итак, я получаю ошибку

mount: / tmp / foo: / dev / loop0 Вы можете использовать это приложение.

(... точка монтирования loop0 занята ...)

Вопрос:

Могу ли я выбрать, какой цикл я могу смонтировать ISO, что-то вроде:

mount - loop3 my.iso /tmp/foo

поэтому мне не нужно размонтировать предыдущий ISO?

Гильермо Чаморро
источник
@ 炸鱼 薯条 德里克 не совсем ;-)
мосви
@ 炸鱼 薯条 德里克 хорошо, мое предположение было совершенно глупым, не надо спорить об этом.
Мосвы
Является ли /tmp/fooкаталог? Как насчет собственности и разрешений? Вы монтируете с правами суперпользователя (вошли как rootили с sudo)?
Судодус
@sudodus /tmp/foo- это каталог, и я запускаю скрипт как sudo.
Гильермо Чаморро
Вы всегда можете вручную настроить петлевое устройство с помощьюlosetup
ivanivan

Ответы:

3

Ошибка не в том, что у вас уже установлено другое устройство ISO; mount -o loopвсегда будет получить первое неиспользуемое устройство петли или создать новую.

И это не потому, что одно и то же устройство ISO / образ петли уже смонтировано в другом каталоге - одно и то же устройство может быть смонтировано в разных точках монтирования одновременно.

Вероятно, вы пытаетесь дважды смонтировать один и тот же ISO-файл в одну точку монтирования. mount(8)Утилита попытается защитить вас против того, проверяя , если файл Подложка уже подключен к устройству контура и повторное использование этого устройства, а не присоединять один и тот же файл на несколько устройств цикла.

Но если вы действительно хотите это сделать, вы можете обойти проверку, подключив устройство петли вручную losetup:

# mount -o ro a.iso dir/

# mount -o ro a.iso dir/
mount: /tmp/a.iso is already mounted

# losetup --show -f a.iso
/dev/loop1
# mount -o ro /dev/loop1 dir/
# 

Два вместе взятых:

# dev=$(losetup --show -f a.iso) && { mount -o ro "$dev" dir/ || losetup -d "$dev"; }

Затем вы должны использовать -dопцию umount(8)явного или вручную отсоединить цикл с помощью losetup -d:

# umount -d dir/

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

mosvy
источник
Хороший ответ говорит о дополнительном поведении mountутилиты. Но мне все еще интересно, как это сделать? Есть ли какой-нибудь ioctlспособ обнаружить основной файл устройства петли? Что делать, если базовый файл просто меняет имя, или удаляется, или перемонтируется.
德里克 薯条 德里克
Да, есть - посмотрите на loop(5)справочную страницу. Часть этой информации также доступна через /sys/block/7:X/loop/. Устройство цикла подключается не к записи каталога, а к файлу / индоду. mount(8)проверяет через пару dev: inode и не будет обманут при смене имени и т. д.
mosvy
Ядро также сохраняет имя файла поддержки, но оно чисто информативное: хотя ядро ​​может отслеживать имя через rename(2)s, оно будет одурачено ln+ rmили bind mounts (точно так же, как /proc/PID/fd/FDцели symlink).
Мосви