perangkat loop dalam wadah Linux?

14

Saya mencoba menggunakan perangkat lingkaran di dalam wadah, untuk memasang beberapa file gambar:

> sudo losetup /dev/loop0 test.img
losetup: /dev/loop0: failed to set up loop device: No such file or directory

/dev/loop0 memang tidak ada, dan

> sudo mknod /dev/loop0 b 7 0
mknod: ‘/dev/loop0’: Operation not permitted

Bagaimana saya bisa membuat ini berfungsi? Apakah wadah memerlukan izin cgroup yang mungkin tidak dimiliki?

Johannes Ernst
sumber

Jawaban:

17

Jika Anda menggunakan systemd-nspawn, mulai wadah Anda dengan --capability=CAP_MKNODsaklar baris perintah. Ini akan memungkinkan Anda untuk membuat simpul perangkat di dalam wadah Anda. Kemudian buat perangkat loop seperti ini:

# mknod /dev/loop0 b 7 0

Ingat bahwa perangkat loop ini dibagikan dengan host dan dipanggil juga ke /dev/loop0sana. Dan sekarang dimungkinkan untuk mengakses perangkat host jika Anda tahu angka utama dan minor. Mungkin juga ada konsekuensi lain yang belum saya pikirkan. Diperingatkan.

Troels Folke
sumber
Adakah yang bisa memastikan itu --capability=CAP_MKNODmasih berfungsi? Bagi saya itu tampaknya tidak berpengaruh, saya membalasnya Operation not permitted, dan begitu juga pengguna ini dan pengguna ini .
nh2
2
Saya membuatnya bekerja sekarang, tetapi selain memberi --capability=CAP_MKNODsaya harus mengatur DeviceAllow=block-loop rwmdi systemd-nspawn unit untuk membuatnya bekerja (mendapat ide dari sini ).
nh2
Saya harus menambahkan --device-cgroup-rule="b 7:* rmw"untuk docker runmengizinkan akses penuh ke perangkat loopback (tetapi tidak ada yang lain, karena tidak ada --privilege). Ditemukan melalui docs.docker.com/edge/engine/reference/commandline/create/… dan diuji pada buruh pelabuhan 18.06.1-ce (dokumen mengklaim hanya berlaku untuk Docker Edge)
RobM
9

Perangkat loop disediakan oleh modul kernel. Karena itu, Anda memerlukan hak istimewa untuk mengaksesnya. Anda juga membutuhkannya untuk diekspos ke wadah Anda, atau Anda perlu secara manual membuat file perangkat.

Jawaban cepat

docker run --privileged=true ...

Sebuah alternatif

sudo losetup /dev/loop0 test.img
mount /dev/loop0 /mnt
docker run -v /mnt:/mnt ...

Ini hampir berhasil

docker run --device=/dev/loop-control:/dev/loop-control --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN ...

Namun saya mendapatkan kesalahan ini:

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

Lihat tautan ini untuk informasi lebih lanjut .


Catatan pada halaman manual systemd-nspawn:

systemd-nspawn membatasi akses ke berbagai antarmuka kernel di dalam wadah hanya-baca, seperti / sys, / proc / sys atau / sys / fs / selinux. Antarmuka jaringan dan jam sistem tidak dapat diubah dari dalam wadah. Perangkat node tidak dapat dibuat. Sistem host tidak dapat di-boot ulang dan modul kernel mungkin tidak dimuat dari dalam wadah.

Mat
sumber