我有一个小型 Docker 容器,可以从中访问 /dev/loop0。为此,我添加了docker run
:
--device=/dev/loop-control:/dev/loop-control \
--device=/dev/loop0:/dev/loop0 \
在此环回设备上,我使用 parted/fdisk 创建了两个或多个分区。
现在,我需要安装这两个分区,但不幸的是,我无法访问其中一个/dev/loop0p1
或/dev/loop0p2
任何其他动态创建的分区。
有没有什么方法可以让我无需生成容器就可以访问它们--privileged
?
谢谢。
答案1
尽管这个问题很老了,但这仍然是一个问题。
Linux 内核不会将设备注册事件传播到容器,这就是为什么/dev/*
在容器运行时添加的设备的文件不会出现在容器内。
作为容器内的解决方法,您可以查找丢失的设备文件并像以下 shell 脚本一样创建它们:
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
才能使用设备。
另请参阅此 moby 问题评论我的脚本基于。