циклічний пристрій у контейнері Linux?


14

Я намагаюся використовувати пристрій циклу всередині контейнера, щоб змонтувати якийсь файл зображення:

> 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

Як я можу змусити цю роботу? Чи потрібен контейнеру якийсь дозвіл групи, який він може не мати?

Відповіді:


17

Якщо ви використовуєте systemd-nspawn, запустіть контейнер за --capability=CAP_MKNODдопомогою перемикача командного рядка. Це дозволить створити вузли пристрою всередині вашого контейнера. Потім створіть циклічний пристрій так:

# mknod /dev/loop0 b 7 0

Пам'ятайте, що цей циклічний пристрій спільно використовується з хостом, і він також називається /dev/loop0. І що тепер ви можете отримати доступ до хост-пристроїв, якщо ви знаєте основні та незначні числа. Можуть бути й інші наслідки, про які я не думав. Будьте попереджені.


Хтось може підтвердити, що --capability=CAP_MKNODвсе ще працює? Для мене це, здається, не має ніякого ефекту, я Operation not permittedнавіть з цим розуміюсь, і так роблять це і цей користувач .
nh2

2
Я змусив його працювати зараз, але на додаток до того, що --capability=CAP_MKNODмені потрібно було встановити DeviceAllow=block-loop rwmв підрозділ systemd-nspawn, щоб він працював (я отримав цю ідею звідси ).
nh2

Мені довелося додати, --device-cgroup-rule="b 7:* rmw"щоб docker runдозволити повний доступ до петельних пристроїв (але жодних інших, оскільки немає --privilege). Знайдено через docs.docker.com/edge/engine/reference/commandline/create/… та перевірено на docker 18.06.1-ce (документ стверджується, що стосується лише Docker Edge)
RobM

9

Циклічні пристрої забезпечуються модулем ядра. Тому для доступу до них потрібні спеціальні привілеї. Також вам потрібно їх виставити у ваш контейнер або вам потрібно створити файли пристрою вручну.

Швидка відповідь

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 man:

systemd-nspawn обмежує доступ до різних інтерфейсів ядра в контейнері лише для читання, наприклад / sys, / proc / sys або / sys / fs / selinux. Мережеві інтерфейси та системний годинник можуть не змінюватися зсередини контейнера. Вузли пристрою можуть бути створені. Хост-систему не можна перезавантажувати, а модулі ядра можуть не завантажуватися зсередини контейнера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.