`Nsenter: 'kullanarak alt süreçleri hapse atmanın güvenilir yolu


15

Linux ad alanlarının, diğer birçok şeyin yanı sıra, zombi olma ve boşaltma şansı olmadan çocuk süreçlerini kısıtlama ve hapse atma işlemlerini kaldırabileceğini biliyorum init. Ama uygulama detaylarında bulanıkım. util-linuxGibi mountve tarafından sağlanan araçları nsenter, başlatılan tüm işlemlerin başka bir işlemin doğrudan ad alanı torunları olduğunu izlemek, izlemek ve sağlamak için nasıl kullanabilirim ?

Yanıtlar:


19

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ı 1içinde, initsü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 initsü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 psyeni ad alanındaki komutu kullanabilmek procfsiç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 psiçin kabul procfsDİR /proc. Bir çözüm, bir chroothapishane oluşturmak ve yenisini procfsoraya 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 procfsgerçek kök /procdizini 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 unsharekomut şu --mount-procseçeneği sunar:

sudo unshare -fp --mount-proc some_command

Artık psbirleş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.


Teşekkürler Graeme. Bu, soruyu ve daha fazlasını zaten yanıtladı. Aslında bana soran şey, procfs man sayfasındaki / proc / pid / ns / * dosyasındaki çeşitli dosyalardaki notları okumaktı . ... şu anda ad alanındaki tüm işlemler sonlansa bile pid alive tarafından belirtilen sürecin ad alanı. " Neredeyse aynı soru, biliyorum, ama bu zaten çok iyi Eğer alakalı olduğunu düşünüyorsanız, eklemek isteyebilirsiniz. Linux.die.net/man/5/proc
mikeserv

Bu, son bölüm LWN makalesinde ele alınmıştır (sadece bağlama bağlamasını arayın). PID ad alanını canlı tuttuğundan gerçekten emin değilim ama üst düzey initstil süreci öldükten sonra, artık yaratamazsınız.
Graeme

Evet, geri kalanýndan da emin deđilim. Ama bu cevap ve manve kendime bir hafta sonu ile biraz daha aşina olmak istiyorum. Tekrar teşekkürler. Belki de --user isim alanında daha alakalı .
mikeserv
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.