PID ad alanı oluşturma
Burada kullanılacak doğru komut unshare
. Bunu yapmak için gerekli seçeneklerin yalnızca adresinden edinilebileceğini unutmayın util-linux 2.23
. Buradaki fikir, çalıştırdığınız program için tüm alt öğeleri de bu ad alanında oluşturulacak yeni bir PID ad alanı oluşturmaktır . Yeni bir PID ad alanında, aşağıdakileri yaparak bir komut çalıştırabilirsiniz:
sudo unshare -fp some_command
Bir kabuk çalıştırmak için komutu atlamanız yeterlidir. Bu, alt öğelerinden herhangi biriyle birlikte, üst (sistem) ad alanında her zamanki gibi bir PID'ye sahip olacak bir işlem oluşturur. Bununla birlikte, yeni ad alanı 1
içinde, init
sürecin bazı özel özellikleri ile birlikte bir PID'ye sahip olacaktır . Bir izleme perspektifinden belki de en ilgili özellik, soyundan herhangi birinin yetim kalması durumunda gerçek init
süreç yerine bu sürece yeniden katılacaklarıdır .
Bunu yapmak çoğu izleme vakası için yeterli olabilir. Daha önce belirtildiği gibi, ad alanındaki işlemlerin tümü üst ad alanındaki PID'lere sahiptir, böylece etkinliklerini izlemek için normal komutlar kullanılabilir. Ayrıca, ad alanındaki herhangi bir işlem yetim kalırsa, üst düzey programın PID'sinin altındaki işlem ağacı dallarından düşmeyeceğinden ve yine de kolayca izlenebileceğinden emin olabiliriz.
Bir montaj ad alanı ile birleştirin
Ancak, yapamayacağımız, sahip olduğunu düşündüğü PID ile ilgili süreci izlemek . Bunu yapmak ve özellikle ps
yeni ad alanındaki komutu kullanabilmek procfs
için, ad alanı için ayrı bir dosya sistemi bağlamanız gerekir . Bu yalnızca bir konumda beri başka soruna dönüş derivasyonlarda ps
için kabul procfs
DİR /proc
. Bir çözüm, bir chroot
hapishane oluşturmak ve yenisini procfs
oraya bağlamak olacaktır . Ancak bu, hantal bir yaklaşımdır, çünkü en azından yeni köke bağımlı oldukları kütüphanelerle birlikte kullanmayı düşündüğümüz herhangi bir ikili dosyayı kopyalamamız (veya en azından zor bağlantı) yapmamız gerekir.
Çözüm aynı zamanda yeni bir bağlanma ad alanı kullanmaktır . Bunun içinde yeniyi procfs
gerçek kök /proc
dizini kullanan bir şekilde bağlayabiliriz, PID ad alanı içinde kullanılabilir ve başka hiçbir şeye müdahale etmeyebiliriz. Bu işlemi çok basit hale getirmek için unshare
komut şu --mount-proc
seçeneği sunar:
sudo unshare -fp --mount-proc some_command
Artık ps
birleştirilmiş ad alanlarında çalışan yalnızca PID ad alanına sahip işlemleri gösterecek ve en üst düzey işlemi PID'ye sahip olarak gösterecektir 1
.
Ne olmuş nsenter
?
Adından da anlaşılacağı gibi, nsenter
önceden oluşturulmuş bir ad alanına girmek için kullanılabilir unshare
. Aksi halde ilgisiz bir komut dosyasından yalnızca ad alanının içinden bilgi almak istiyorsak yararlı olur. En basit yol, ad alanı içinde çalışan herhangi bir programın PID'sini vermektir. Açık olmak için nsenter
, bunun çalıştırıldığı ad alanındaki hedef programın PID'si olmalıdır (ad alanları yuvalanabildiğinden, tek bir işlemin birçok PID'ye sahip olması mümkündür). Hedef PID / mount ad alanında bir kabuk çalıştırmak için şunları yapmanız yeterlidir:
sudo nsenter -t $PID -m -p
Bu ad alanı yukarıdaki gibi ayarlandıysa ps
, artık yalnızca o ad alanındaki işlemleri listeleyecektir.