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

どうすればこれを機能させることができますか?コンテナには、持たないかもしれないcgroup権限が必要ですか?

回答:


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/...(文書の主張だけドッカーEdgeに適用する)とドッキングウィンドウ18.06.1-CE上でテスト
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など、コンテナ内のさまざまなカーネルインターフェイスへのアクセスを読み取り専用に制限します。ネットワークインターフェイスとシステムクロックは、コンテナ内から変更できません。デバイスノードが作成されない場合があります。ホストシステムを再起動できず、カーネルモジュールがコンテナ内からロードされない場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.