Tạo một không gian tên PID
Lệnh chính xác để sử dụng ở đây là unshare
. Lưu ý rằng các tùy chọn cần thiết để làm điều này chỉ có sẵn từ util-linux 2.23
. Ý tưởng là tạo ra một không gian tên PID mới cho chương trình bạn đang chạy sao cho tất cả các phần tử con của nó cũng được tạo trong không gian tên này. Bạn có thể chạy một lệnh trong một không gian tên PID mới chỉ bằng cách thực hiện:
sudo unshare -fp some_command
Để chạy shell, chỉ cần bỏ qua lệnh. Điều này sẽ tạo ra một quy trình, cùng với bất kỳ đứa con nào của nó, sẽ có một PID như bình thường trong không gian tên cha (hệ thống). Tuy nhiên, trong không gian tên mới, nó sẽ có một bộ vi xử lý 1
cùng với một số đặc điểm đặc biệt của init
quy trình. Có lẽ đặc điểm phù hợp nhất từ góc độ giám sát là nếu bất kỳ hậu duệ nào của nó mồ côi, họ sẽ được cấp lại cho quy trình này chứ không phải là init
quy trình thực .
Đơn giản chỉ cần làm điều này có thể là đủ cho hầu hết các trường hợp giám sát. Như đã đề cập trước đó, tất cả các quy trình trong không gian tên đều có các PID trong không gian tên cha mẹ để các lệnh thông thường có thể được sử dụng để giám sát hoạt động của chúng. Chúng tôi cũng đảm bảo rằng nếu bất kỳ quy trình nào trong không gian tên trở thành mồ côi, nó sẽ không rơi ra khỏi các nhánh cây quy trình bên dưới PID của chương trình cấp cao nhất có nghĩa là nó vẫn có thể dễ dàng theo dõi.
Kết hợp với một không gian tên mount
Tuy nhiên, những gì chúng ta không thể làm là theo dõi quá trình liên quan đến PID mà nó nghĩ là có. Để làm điều này và đặc biệt để có thể sử dụng ps
lệnh trong không gian tên mới, bạn cần gắn một procfs
hệ thống tệp riêng cho không gian tên. Điều này dẫn đến một vấn đề khác vì vị trí duy nhất ps
chấp nhận procfs
là /proc
. Một giải pháp sẽ là tạo ra một chroot
nhà tù và gắn kết cái mới procfs
ở đó. Nhưng đây là một cách tiếp cận rườm rà vì ở mức tối thiểu chúng ta sẽ cần sao chép (hoặc ít nhất là liên kết cứng) bất kỳ nhị phân nào chúng ta dự định sử dụng cùng với bất kỳ thư viện nào mà chúng phụ thuộc vào root mới.
Giải pháp là cũng sử dụng một không gian tên mount mới . Trong phạm vi này, chúng ta có thể gắn kết cái mới procfs
theo cách sử dụng /proc
thư mục gốc thực sự , có thể sử dụng được trong không gian tên PID và không can thiệp vào bất cứ điều gì khác. Để làm cho quá trình này rất đơn giản, unshare
lệnh đưa ra --mount-proc
tùy chọn:
sudo unshare -fp --mount-proc some_command
Bây giờ chạy ps
trong các không gian tên kết hợp sẽ chỉ hiển thị các quy trình với không gian tên PID và nó sẽ hiển thị quy trình cấp cao nhất khi có một PID 1
.
Thế còn nsenter
?
Như tên cho thấy, nsenter
có thể được sử dụng để nhập một không gian tên đã được tạo unshare
. Điều này hữu ích nếu chúng tôi muốn nhận thông tin chỉ có sẵn từ bên trong không gian tên từ một tập lệnh không liên quan. Cách đơn giản nhất là truy cập cung cấp cho PID của bất kỳ chương trình nào đang chạy trong không gian tên. Để rõ ràng, đây phải là bộ vi xử lý của chương trình đích trong không gian tên nsenter
đang được chạy (vì không gian tên có thể được lồng vào nhau, nên có thể một quy trình có nhiều bộ vi xử lý). Để chạy shell trong không gian tên PID / mount đích, chỉ cần làm:
sudo nsenter -t $PID -m -p
Nếu không gian tên này được thiết lập như trên, ps
bây giờ sẽ chỉ liệt kê các quy trình trong không gian tên đó.