Створіть простір імен PID
Тут використовується правильна команда unshare
. Зауважте, що необхідні варіанти для цього доступні лише з util-linux 2.23
. Ідея полягає у створенні нового простору імен PID для програми, яку ви запускаєте, щоб усі її діти також були створені в цьому просторі імен. Ви можете запустити команду в новому просторі імен PID, просто виконавши:
sudo unshare -fp some_command
Щоб запустити оболонку, просто опустіть команду. Це створить процес, який разом із будь-яким із його дітей матиме PID, як зазвичай, у батьківському (системному) просторі імен. Однак у новому просторі імен він матиме PID 1
разом із деякими особливими характеристиками init
процесу. Мабуть, найрелевантніша характеристика з точки зору моніторингу полягає в тому, що якщо хтось із його нащадків осиротів, вони будуть перероджені для цього процесу, а не до реального init
процесу.
Просто цього може бути достатньо для більшості випадків моніторингу. Як вже було сказано раніше, всі процеси в просторі імен мають PID в батьківському просторі імен, тому звичайні команди можуть використовуватися для контролю їх активності. Ми також впевнені, що якщо будь-який процес у просторі імен стане осиротілим, він не випаде з гілок дерева процесів під PID програми верхнього рівня, що означає, що його все ще можна легко відстежувати.
Поєднайте з простором імен для кріплення
Однак ми не можемо контролювати процес щодо PID, який, на його думку , є таким. Для цього і, зокрема, щоб мати можливість використовувати ps
команду в новому просторі імен, потрібно встановити окрему procfs
файлову систему для простору імен. Це , в свою чергу , призводить до іншої проблеми , так як єдине місце , яке ps
приймає для procfs
IS /proc
. Одним з рішень було б створити chroot
в'язницю та встановити procfs
там нову . Але це громіздкий підхід, оскільки як мінімум нам потрібно буде скопіювати (або принаймні жорстке посилання) будь-яких двійкових файлів, які ми маємо намір використовувати разом із будь-якими бібліотеками, від яких вони залежать, до нового кореня.
Рішення полягає також у використанні нового простору імен для кріплення . У межах цього ми можемо змонтувати нове procfs
таким чином, що використовує справжній кореневий /proc
каталог, може бути корисним у просторі імен PID та не заважати нічому іншому. Щоб зробити цей процес дуже простим, unshare
команда дає --mount-proc
можливість:
sudo unshare -fp --mount-proc some_command
Тепер, що працює ps
в комбінованих просторах імен, будуть показані лише процеси з NID-простором PID, і він буде показувати процес верхнього рівня, як PID 1
.
Про що nsenter
?
Як випливає з назви, nsenter
його можна використовувати для введення простору імен, для якого вже створено unshare
. Це корисно, якщо ми хочемо отримати інформацію, доступну лише з простору імен, з інакше не пов'язаного сценарію. Найпростіший спосіб - це отримати дані PID будь-якої програми, що працює в просторі імен. Щоб було зрозуміло, це повинен бути PID цільової програми в просторі імен, з якого nsenter
запускається (оскільки простори імен можуть бути вкладені, для одного процесу можливо мати багато PID). Для запуску оболонки в цільовому просторі імен PID / mount просто виконайте такі дії:
sudo nsenter -t $PID -m -p
Якщо цей простір імен налаштовано як вище, ps
тепер буде перераховано лише процеси в цьому просторі імен.