web-dev-qa-db-ja.com

Linuxコンテナーでデバイスをループしますか?

コンテナー内のループデバイスを使用して、いくつかのイメージファイルをマウントしようとしています。

> 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アクセス許可が必要ですか?

15
Johannes Ernst

Systemd-nspawnを使用している場合は、--capability=CAP_MKNODコマンドラインスイッチ。これにより、コンテナー内にデバイスノードを作成できます。次に、次のようなループデバイスを作成します。

# mknod /dev/loop0 b 7 0

このループデバイスはホストと共有され、/dev/loop0もあります。また、メジャー番号とマイナー番号がわかっている場合は、ホストデバイスにアクセスできるようになりました。私が考えていなかった他の結果もあり得ます。警告されます。

18
Troels Folke

ループデバイスは、カーネルモジュールによって提供されます。したがって、それらにアクセスするには特別な権限が必要です。また、それらをコンテナーに公開するか、デバイスファイルを手動で作成する必要があります。

簡単な答え

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などの読み取り専用に制限します。ネットワークインターフェイスとシステムクロックは、コンテナー内から変更できません。デバイスノードが作成されない場合があります。ホストシステムは再起動できず、カーネルモジュールはコンテナ内からロードされない可能性があります。

11
Matt