Назад | Перейти на главную страницу

устройство цикла в контейнере Linux?

Я пытаюсь использовать устройство цикла внутри контейнера, чтобы смонтировать файл образа:

> sudo losetup /dev/loop0 test.img
losetup: /dev/loop0: failed to set up loop device: No such file or directory

/dev/loop0 действительно не существует, и

> sudo mknod /dev/loop0 b 7 0
mknod: ‘/dev/loop0’: Operation not permitted

Как я могу заставить это работать? Требуется ли контейнеру какое-то разрешение cgroup, которого у него может не быть?

Если вы используете systemd-nspawn, запустите свой контейнер с --capability=CAP_MKNOD переключатель командной строки. Это позволит вам создавать узлы устройств внутри вашего контейнера. Затем создайте петлевое устройство, подобное этому:

# mknod /dev/loop0 b 7 0

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

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

Быстрый ответ

docker run --privileged=true ...

Альтернатива

sudo losetup /dev/loop0 test.img
mount /dev/loop0 /mnt
docker run -v /mnt:/mnt ...

Это почти работает

docker run --device=/dev/loop-control:/dev/loop-control --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN ...

Однако я получаю эту ошибку:

root@5c033d5f8625:/# sudo mount /dev/loop0 /mnt
mount: block device /dev/loop0 is write-protected, mounting read-only
mount: cannot mount block device /dev/loop0 read-only

См. Эту ссылку для получения дополнительной информации Информация.


Примечание к странице руководства systemd-nspawn:

systemd-nspawn ограничивает доступ к различным интерфейсам ядра в контейнере только для чтения, например / sys, / proc / sys или / sys / fs / selinux. Сетевые интерфейсы и системные часы не могут быть изменены изнутри контейнера. Узлы устройств не могут быть созданы. Хост-система не может быть перезагружена, а модули ядра не могут быть загружены из контейнера.