私はDockerコンテナー(公式のcentos:6.4イメージに基づく)を使用してISOを構築し、それをマウントして検証する必要があります。次を使用してISOをマウントできません。
Sudo mount -o loop /path/to/iso /mnt
与える:
mount: Could not find any loop device. Maybe this kernel does not know
about the loop device? (If so, recompile or `modprobe loop'.)
カーネルはループデバイスサポートなしでコンパイルされているようです。ループデバイスをサポートするDockerイメージをビルドすることは可能ですか?私はこれに関する情報を見つけることができませんでした、しかし this thread を見ると、これは継続的なトピックであるようです。
この制限を回避する方法はありますか?
コンテナ内にISOをマウントするには、次の2つが必要です。
デフォルトでは、Dockerは両方をロックダウンします。そのため、そのエラーメッセージが表示されます。
最も簡単な解決策は、コンテナを特権モードで起動することです。
docker run --privileged ...
よりきめの細かいソリューションは、デバイスのcgroupとコンテナーの機能を詳しく調べて、必要な権限を付与することです。
Dockerfileの一部として特権操作を実行することはできません。つまり、そのISOをDockerfileにマウントする必要がある場合、そのISOをマウントすることはできません。
ただし、 Xorriso 、特に osirrox ツールを確認することをお勧めします。これにより、tarファイルを抽出するのと同じようにISOイメージからファイルを抽出できます。あらゆる種類の特別なアクセス、例:
osirrox -indev /path/to/iso -extract / /full-iso-contents
これは私の問題を解決するための良い方法ではないと感じていますが、これは、より健全なアイデアが現れるまで、私が当面行ってきたことです。
私のコンテナーはbashから始まります。このシェルから、次を使用してループデバイスを追加できます。
# mknod /dev/loop0 -m0660 b 7 0
# mknod /dev/loop1 -m0660 b 7 1
...
# mknod /dev/loop9 -m0660 b 7 9
そして今、利用可能なループデバイスがあるので、ISOをマウントできます。しかし、私が最初に利用できるループデバイスは/dev/loop2
:
bash-4.1# losetup -f
/dev/loop2
これは、loop0とloop1がすでに使用されていることを意味します。これは、次のように確認されます。
bash-4.1# losetup -a
/dev/loop0: [fd00]:1978974 (/dev/loop0)
/dev/loop1: [fd00]:1978975 (/dev/loop1)
/dev/loop2: [fd00]:2369514 (/path/to/my/iso)
そして、これが私がこの解決策を悪いと思う理由です、コンテナの外側から:
12:36:02 $ losetup -a
/dev/loop0: []: (/var/lib/docker/devicemapper/devicemapper/data)
/dev/loop1: []: (/var/lib/docker/devicemapper/devicemapper/metadata)
/dev/loop2: []: (/path/to/my/iso)
したがって、コンテナーで作成した最初の2つのループデバイスは、コンテナーの外側のloop0とloop1にマップされているように見えます。そのため、これらのデバイスは使用できませんでした。これらのデバイスをdevicemapper(docker、looksで使用されている)でセットアップする方法が必要だと思いますが、これについて多くの情報を提供することはできませんでした。
とりあえず、このソリューションは私にとっては問題ありません-作業が終わったら、イメージをumount
に覚えておく必要があります。
これはまともな解決策とはほど遠いことを知っているので、他の誰かがより良い計画を思い付くことができれば、私はすべて耳を傾けます。