Linux kapsayıcısında döngü cihazı?


14

Bazı görüntü dosyası bağlamak için bir kapsayıcı içinde bir döngü aygıtı kullanmaya çalışıyorum:

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

/dev/loop0 gerçekten yok ve

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

Bu işi nasıl yapabilirim? Kapsayıcı, sahip olamayacağı bir grup izni gerektiriyor mu?

Yanıtlar:


17

Systemd-nspawn kullanıyorsanız, kabınızı --capability=CAP_MKNODkomut satırı anahtarıyla başlatın . Bu, kapsayıcınızın içinde cihaz düğümleri oluşturmanıza olanak tanır. Sonra şöyle bir döngü cihazı oluşturun:

# mknod /dev/loop0 b 7 0

Bu döngü cihazının ana bilgisayarla paylaşıldığını ve /dev/loop0orada da çağrıldığını unutmayın . Ve büyük ve küçük sayıları biliyorsanız artık ana cihazlara erişmek mümkün. Düşünmediğim başka sonuçlar da olabilir. Dikkatli olun.


--capability=CAP_MKNODHala çalıştığını onaylayan var mı? Benim için hiçbir etkisi yok gibi görünüyor, ben Operation not permittedbile onunla olsun, ve bu kullanıcı ve bu kullanıcı da .
nh2

2
Ben şimdi işe var, ama veren ek olarak --capability=CAP_MKNODben sete vardı DeviceAllow=block-loop rwm(var olduğu fikri dan çalışması için systemd-nspawn biriminde burada ).
nh2

Ben eklemek zorunda --device-cgroup-rule="b 7:* rmw"için docker run(hayır yoktur çünkü, ancak hiçbir başkalarına geri döngü cihazlarının tam erişime izin vermek için --privilege). Docs.docker.com/edge/engine/reference/commandline/create/… aracılığıyla bulunmuş ve 18.06.1-ce liman işçisi üzerinde test edilmiştir (belge yalnızca Docker Edge için geçerli olduğunu iddia etmektedir)
RobM

9

Döngü aygıtları bir çekirdek modülü tarafından sağlanır. Bu nedenle, bunlara erişmek için özel ayrıcalıklara ihtiyacınız vardır. Ayrıca bunların kapsayıcınıza maruz kalmaları veya aygıt dosyalarını el ile oluşturmanız gerekir.

Hızlı cevap

docker run --privileged=true ...

Bir alternatif

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

Bu neredeyse işe yarıyor

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

Ancak bu hatayı alıyorum:

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

Daha fazla bilgi için bu bağlantıya bakın .


Systemd-nspawn kılavuz sayfasında bir not:

systemd-nspawn, / sys, / proc / sys veya / sys / fs / selinux gibi kaptaki çeşitli çekirdek arabirimlerine erişimi salt okunur olarak sınırlar. Ağ arabirimleri ve sistem saati kapsayıcıdan değiştirilemez. Aygıt düğümleri oluşturulamayabilir. Ana bilgisayar sistemi yeniden başlatılamaz ve çekirdek modülleri kaptan yüklenemez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.