Как я могу предоставить доступ к устройствам loopback, которые динамически создаются в контейнере Docker?
У меня есть небольшой контейнер Docker, из которого я могу получить доступ к /dev/loop0. Для этого я добавил в docker run
:
--device=/dev/loop-control:/dev/loop-control \
--device=/dev/loop0:/dev/loop0 \
На этом устройстве loopback я создаю два или более раздела с помощью parted/fdisk.
Теперь мне нужно смонтировать оба раздела, но, к сожалению, я не могу получить доступ ни к одному /dev/loop0p1
или же /dev/loop0p2
или любой другой раздел, который был создан динамически.
Есть ли способ, которым я мог бы получить к ним доступ без порождения контейнера --privileged
?
Спасибо.
0 ответов
Хотя вопрос старый, это все еще проблема.
Ядро Linux не передает события регистрации устройства в контейнеры, поэтому /dev/*
файлы не отображаются в контейнере для устройств, которые добавляются во время работы контейнера.
В качестве обходного пути в контейнере вы можете искать отсутствующие файлы устройства и создавать их, как это делает следующий скрипт оболочки:
FILTER='^loop'
lsblk --raw -a --output "NAME,MAJ:MIN" --noheadings | grep -E "$FILTER" | while read LINE; do
DEV=/dev/$(echo $LINE | cut -d' ' -f1)
MAJMIN=$(echo $LINE | cut -d' ' -f2)
MAJ=$(echo $MAJMIN | cut -d: -f1)
MIN=$(echo $MAJMIN | cut -d: -f2)
[ -b "$DEV" ] || mknod "$DEV" b $MAJ $MIN
done
(Я использовал FILTER='^(r|n)bd'
соответствовать /dev/rbdX
а также /dev/nbdX
девайсы ceph создает динамически в моем случае.)
Помните, что приведенный выше скрипт не отменяет регистрацию устройств, которые были удалены на хосте. В случае, если вам также нужно сделать это, вы можете запустить следующее (FILTER
необходимо указать):
find /dev -mindepth 1 -maxdepth 1 -type b | cut -d/ -f3 | grep -E "$FILTER" | sort > /tmp/devs-created
lsblk --raw -a --output "NAME" --noheadings | grep -E "$FILTER" | sort > /tmp/devs-available
for ORPHAN in $(comm -23 /tmp/devs-created /tmp/devs-available); do
rm /dev/$ORPHAN
done
Если ваши устройства создаются динамически, вы можете периодически запускать оба сценария в контейнере.
Вам все еще нужно запустить свой контейнер --privileged
для того, чтобы работать с устройствами.
Также посмотрите этот комментарий к проблеме, на котором основан мой сценарий.