สร้างเนมสเปซ 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
/proc
ทางออกหนึ่งคือการสร้างchroot
คุกและติดตั้งใหม่ที่procfs
นั่น แต่นี่เป็นวิธีที่ยุ่งยากเพราะอย่างน้อยเราจะต้องคัดลอก (หรือฮาร์ดลิงก์อย่างน้อย) ไบนารีใด ๆ ที่เราตั้งใจจะใช้พร้อมกับไลบรารีใด ๆ ที่พวกเขาต้องพึ่งพารูทใหม่
การแก้ปัญหาคือยังใช้ใหม่ติด namespace ภายในนี้เราสามารถติดตั้งใหม่procfs
ในวิธีที่ใช้/proc
ไดเรกทอรีรูทจริงสามารถใช้งานได้ในเนมสเปซ PID และไม่รบกวนสิ่งอื่นใด เพื่อทำให้กระบวนการนี้ง่ายมากunshare
คำสั่งให้--mount-proc
ตัวเลือก:
sudo unshare -fp --mount-proc some_command
ตอนนี้ทำงานps
ภายใน namespaces รวมจะแสดงเฉพาะกระบวนการที่มี namspace PID และมันจะแสดงขั้นตอนการระดับบนสุดตามที่มี PID 1
ของ
เกี่ยวกับnsenter
อะไร
ตามชื่อที่แนะนำnsenter
สามารถใช้เพื่อป้อนเนมสเปซที่สร้างขึ้นunshare
แล้วได้ สิ่งนี้มีประโยชน์ถ้าเราต้องการรับข้อมูลจากใน namespace จากสคริปต์ที่ไม่เกี่ยวข้องเท่านั้น วิธีที่ง่ายที่สุดคือการเข้าถึงให้ PID ของโปรแกรมใด ๆ ที่ทำงานอยู่ใน namespace หากต้องการล้างข้อมูลนี้ต้องเป็น PID ของโปรแกรมเป้าหมายภายในเนมสเปซที่nsenter
กำลังทำงานอยู่ (เนื่องจากเนมสเปซสามารถซ้อนกันได้จึงเป็นไปได้ที่กระบวนการเดียวจะมี PID จำนวนมาก) หากต้องการเรียกใช้เชลล์ในเนมสเปซ PID / mount เป้าหมายให้ทำดังนี้
sudo nsenter -t $PID -m -p
หากเนมสเปซนี้ตั้งค่าไว้ด้านบนps
ตอนนี้จะแสดงรายการกระบวนการภายในเนมสเปซนั้นเท่านั้น