コンテナー内のループデバイスを使用して、いくつかのイメージファイルをマウントしようとしています。
> 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アクセス許可が必要ですか?
Systemd-nspawnを使用している場合は、--capability=CAP_MKNOD
コマンドラインスイッチ。これにより、コンテナー内にデバイスノードを作成できます。次に、次のようなループデバイスを作成します。
# mknod /dev/loop0 b 7 0
このループデバイスはホストと共有され、/dev/loop0
もあります。また、メジャー番号とマイナー番号がわかっている場合は、ホストデバイスにアクセスできるようになりました。私が考えていなかった他の結果もあり得ます。警告されます。
ループデバイスは、カーネルモジュールによって提供されます。したがって、それらにアクセスするには特別な権限が必要です。また、それらをコンテナーに公開するか、デバイスファイルを手動で作成する必要があります。
簡単な答え
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などの読み取り専用に制限します。ネットワークインターフェイスとシステムクロックは、コンテナー内から変更できません。デバイスノードが作成されない場合があります。ホストシステムは再起動できず、カーネルモジュールはコンテナ内からロードされない可能性があります。