LXC kök bağlama noktasını nasıl kurar?


2

Ubuntu'da mount ad alanıyla denemeye çalışıyorum. Şimdiye kadar aşağıdakileri kullanarak boş bir mount ad alanı oluşturabilirim:

# mkdir test
# unshare --mount
# mount none test -t tmpfs
# cd test
# pivot_root . . 
# cd / <--- test becomes /

Bir LXCUbuntu kabını kontrol ettiğimde , mountkomut aşağıdakileri görüntüler:

görüntü tanımını buraya girin

Mount ad boşluğu başlangıçta mount noktalarının bir kopyasını aldığından /dev/sda1, kabın içinde genel olduğunu sanırım /dev/sda1( /dev/sda1başlatıldıktan sonra kabın içinde yoktur ) ve /kabın içindeki içerik köklerine karşılık gelir. LXC'ye aşina biri, lütfen LXC'nin pivot_rootkonteynır içinde yapmadan önce hangi montaj işlemlerini yaptığını açıklayabilir mi?


Lütfen soruya metnin ekran görüntülerini eklemeyin. Onlar hesaplanamaz, bu yüzden kimse sorunuzu kolayca alıntılayamaz. Bunun yerine, metni kopyalayın ve kod bloğuna yerleştirin.
Danila Kiver

Yanıtlar:


1

LXC'nin gerçekte ne yaptığını görmek için, yeni bir kap oluşturalım ve başlangıç ​​işlemini aşağıdaki yollarla izleyelim strace(1):

[root@localhost /]# lxc-create -n testcontainer -t debian
[root@localhost /]# strace -e trace=clone,chdir,mount,pivot_root,execve \
                           -f -o lxclog \
                           lxc-start -n testcontainer

Sonuçta ortaya çıkan izleme lxclog dosyasına yazılmıştır ve işte en alakalı kısımlarıdır (önemli olmayan bazı çağrıların alınmadığı elipsler benim tarafımdan eklenir):

14671 clone(child_stack=0x7fff9379eb80, flags=CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWNET|SIGCHLD) = 14677
<...>
14677 mount("/var/lib/lxc/testcontainer/rootfs", "/usr/lib64/lxc/rootfs", 0x7fe4c2d10eac, MS_BIND|MS_REC, NULL) = 0
<...>
14677 chdir("/usr/lib64/lxc/rootfs")    = 0
14677 pivot_root(".", "/usr/lib64/lxc/rootfs/lxc_putold") = 0
14677 chdir("/")
<...>
14677 execve("/sbin/init", ["/sbin/init"], [/* 1 var */]) = 0

İlk önce yeni bir işlem (PID 14677) kullanılarak lxc-start(PID 14671) üretilir clone(2)ve yeni mount ad alanına ( CLONE_NEWNSbayrak) yerleştirilir. Daha sonra bu yeni mount ad alanının içinde kabın ( / var / lib / lxc / testcontainer / rootfs ) kök dosya sistemi bağlanır ( MS_BINDbayrak) / usr / lib64 / lxc / rootfs'a bağlanır , bu da yeni kök olur. Son olarak, kabın başlatılması tamamlandığında, işlem 14677 kabın haline gelir init.

Buradaki önemli şey, kabinin kurucu ad alanının kök dizininin , sunucunun kök FS'sine ait dizinin bağlanma dizini olmasıdır . Bu yüzden kabın kök montajı hala çıkışta bir kaynak olarak / dev / sda1'e sahiptir mount(8). Bununla birlikte, gösterilmeyen bir fark da vardır mount(8)- görmek findmnt(8)için kabın içinde deneyin :

root@testcontainer:~# findmnt
TARGET                                SOURCE                     FSTYPE    OPTIONS
/                                     /dev/sda1[/var/lib/lxc/testcontainer/rootfs]

Çıkış için bu karşılaştırın findmnt(8)ana bilgisayar sisteminden:

[root@localhost /]# findmnt
TARGET                                SOURCE                    FSTYPE     OPTIONS
/                                     /dev/sda1

Not kaynak aynıdır, ancak kabın içine ayrıca bağlama kaynak dizin monte bkz.


bindLXC'de kullanılan mount ile ilgili bir soru : Kabın içinde kök dizininde yapılan değişiklikler rootfs, global /var/lib/lxc/testcontainer/dizindeki klasöre yansıtılacaktır . Bu, kabın durumunu kaydetme nedenleriyle yapıldı mı, bu nedenle kapatılıp yeniden başlatılması durumunda, son değişiklikten kök dizinine dönebilir mi? Teşekkürler.
Jake,

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.