Buat namespace PID
Perintah yang benar untuk digunakan di sini adalah unshare
. Perhatikan bahwa opsi yang diperlukan untuk melakukan ini hanya tersedia dari util-linux 2.23
. Idenya adalah untuk membuat namespace PID baru untuk program yang Anda jalankan sehingga semua anak-anaknya juga dibuat di namespace ini. Anda dapat menjalankan perintah di namespace PID baru hanya dengan melakukan:
sudo unshare -fp some_command
Untuk menjalankan shell, abaikan saja perintahnya. Ini akan membuat proses yang, bersama dengan anak-anaknya, akan memiliki PID seperti biasa di dalam ruang nama orang tua (sistem). Namun, di dalam namespace baru, itu akan memiliki PID 1
bersama dengan beberapa karakteristik khusus dari init
proses tersebut. Mungkin karakteristik yang paling relevan dari perspektif pemantauan adalah bahwa jika salah satu dari keturunannya menjadi yatim piatu, mereka akan dipasangkan kembali ke proses ini daripada proses yang sebenarnya init
.
Cukup melakukan ini mungkin cukup untuk sebagian besar kasus pemantauan. Seperti disebutkan sebelumnya, proses-proses dalam namespace semua memiliki PID di dalam namespace induk sehingga perintah biasa dapat digunakan untuk memantau aktivitas mereka. Kami juga yakin bahwa jika proses apa pun di namespace menjadi yatim piatu, tidak akan jatuh dari cabang-cabang pohon proses di bawah PID dari program tingkat atas yang berarti bahwa ia masih dapat dengan mudah dilacak.
Gabungkan dengan mount namespace
Namun, yang tidak bisa kita lakukan adalah memantau proses sehubungan dengan PID yang menurutnya sudah. Untuk melakukan ini, dan khususnya untuk dapat menggunakan ps
perintah di dalam namespace baru, Anda perlu me-mount procfs
sistem file yang terpisah untuk namespace. Ini pada gilirannya menyebabkan masalah lain karena satu-satunya lokasi yang ps
menerima procfs
adalah /proc
. Salah satu solusinya adalah membuat chroot
penjara dan memasang yang baru di procfs
sana. Tapi ini adalah pendekatan yang rumit karena setidaknya kita perlu menyalin (atau setidaknya hard link) setiap biner yang ingin kita gunakan bersama dengan perpustakaan yang mereka bergantung pada root baru.
Solusinya adalah juga menggunakan namespace mount baru . Dalam hal ini kita dapat memasang yang baru procfs
dengan cara yang menggunakan /proc
direktori root yang sebenarnya , dapat digunakan dalam namespace PID dan tidak mengganggu yang lain. Untuk membuat proses ini sangat sederhana, unshare
perintah memberikan --mount-proc
opsi:
sudo unshare -fp --mount-proc some_command
Sekarang berjalan ps
dalam ruang nama gabungan hanya akan menunjukkan proses dengan namspace PID dan itu akan menunjukkan proses tingkat atas memiliki PID 1
.
Bagaimana dengan nsenter
?
Seperti namanya, nsenter
dapat digunakan untuk memasukkan namespace yang sudah dibuat dengan unshare
. Ini berguna jika kita ingin mendapatkan informasi yang hanya tersedia dari dalam namespace dari skrip yang tidak terkait. Cara paling sederhana adalah dengan mengakses berikan PID dari setiap program yang berjalan dalam namespace. Untuk menjadi jelas ini harus menjadi PID dari program target dalam namespace dari mana nsenter
sedang dijalankan (karena namespaces dapat disarangkan, dimungkinkan untuk satu proses memiliki banyak PID). Untuk menjalankan shell di PID / mount namespace target, cukup lakukan:
sudo nsenter -t $PID -m -p
Jika namespace ini diatur seperti di atas, ps
sekarang hanya akan mencantumkan proses dalam namespace itu.