Как я могу предоставить доступ к устройствам 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 для того, чтобы работать с устройствами.

Также посмотрите этот комментарий к проблеме, на котором основан мой сценарий.

Другие вопросы по тегам