กลับไปหน้าบทความ

อ่าน 6 นาที

เนมสเปซของลินุกซ์

เนมสเปซ เป็นคุณลักษณะของ เคอร์เนลลินุกซ์ ที่แบ่ง ทรัพยากร เคอร์เนล ออกเป็นส่วนๆ โดยที่ กระบวนการ ชุดหนึ่งจะเห็นทรัพยากรชุดหนึ่ง...

เนมสเปซของลินุกซ์

เนมสเปซ
ผู้เขียนต้นฉบับอัล วีโร
นักพัฒนาเอริก ดับเบิลยู. บีเดอร์แมน, พาเวล เอเมลยานอฟ, อัล วิโร, ไซริล กอร์คูนอฟ, เทจุน เฮโอ และคณะ
ปล่อย2002 ( 2002 )
เขียนเป็นซี
ระบบปฏิบัติการลินุกซ์
พิมพ์ซอฟต์แวร์ระบบ
ใบอนุญาตGPLและLGPL

เนมสเปซเป็นคุณลักษณะของเคอร์เนลลินุกซ์ที่แบ่ง ทรัพยากร เคอร์เนล ออกเป็นส่วนๆ โดยที่ กระบวนการชุดหนึ่งจะเห็นทรัพยากรชุดหนึ่ง ในขณะที่กระบวนการอีกชุดหนึ่งจะเห็นทรัพยากรอีกชุดหนึ่ง คุณลักษณะนี้ทำงานโดยการกำหนดประเภทเนมสเปซเดียวกันให้กับชุดทรัพยากรและกระบวนการ แต่ยอมให้เนมสเปซเหล่านั้นอ้างอิงถึงสภาพแวดล้อมที่แยกออกจากกันอย่างชัดเจน ซึ่งทำให้เกิดภาพลวงตาว่ากระบวนการหรือกลุ่มกระบวนการเป็นผู้ใช้เพียงผู้เดียวของทรัพยากรฮาร์ดแวร์และซอฟต์แวร์ของระบบ ตัวอย่างของทรัพยากรดังกล่าว ได้แก่รหัสกระบวนการชื่อโฮสต์ รหัสผู้ใช้ ชื่อไฟล์ อินเทอร์เฟซเครือข่าย และกลไกการสื่อสารระหว่างกระบวนการ[ 1 ] [ 2 ]

เนมสเปซของลินุกซ์ ควบคู่ไปกับซีกรุ๊ป (กลุ่มควบคุม) เป็นเทคโนโลยีพื้นฐานที่รองรับ แพลตฟอร์มการจำลองเสมือน และการจัดการคอนเทนเนอร์ระดับระบบปฏิบัติการ สมัยใหม่ เช่นDocker , Kubernetes , LXCและPodmanในขณะที่ซีกรุ๊ปกำหนดว่า กระบวนการหนึ่งๆ สามารถใช้ทรัพยากรของระบบได้ มากน้อยเพียงใด (เช่น ข้อจำกัดด้าน CPU, หน่วยความจำ และการอ่าน/เขียนดิสก์) เนมสเปซจะกำหนดว่ากระบวนการนั้นๆ ได้รับอนุญาตให้มองเห็นและโต้ตอบกับ อะไรบ้าง

คำว่า "เนมสเปซ" มักใช้เพื่อระบุประเภทของเนมสเปซโดยเฉพาะ (เช่น เนมสเปซรหัสกระบวนการ) รวมถึงพื้นที่ของชื่อต่างๆ ด้วย ระบบลินุกซ์เริ่มต้นด้วยเนมสเปซเริ่มต้นเพียงหนึ่งเดียวสำหรับแต่ละประเภท ซึ่งใช้ร่วมกันโดยทุกกระบวนการ ต่อมา กระบวนการต่างๆ สามารถสร้างเนมสเปซเพิ่มเติมหรือเข้าร่วมเนมสเปซที่มีอยู่แล้ว ทำให้เกิดขอบเขตการแยกที่ซับซ้อนและซ้อนกันได้

ประวัติศาสตร์

เนมสเปซของลินุกซ์ได้รับแรงบันดาลใจอย่างมากจากฟังก์ชันเนมสเปซที่กว้างขึ้นซึ่งใช้ทั่วทั้ง ระบบปฏิบัติการ Plan 9 ของ Bell Labsซึ่งถือว่าทุกอย่างเป็นไฟล์และให้การแยกเนมสเปซต่อกระบวนการ[ 3 ]

การใช้งานเนมสเปซของ Linux มีต้นกำเนิดในปี 2002 พร้อมกับการเปิดตัวเคอร์เนลเวอร์ชัน 2.4.19 เนมสเปซแรกที่เปิดตัวคือเนมสเปซ mount ซึ่งริเริ่มโดยนักพัฒนาเคอร์เนล Al Viro ซึ่งแยกจุดเชื่อมต่อระบบไฟล์[ 4 ]เนื่องจากเป็นเนมสเปซประเภทแรก ธง การเรียกใช้ระบบที่เปิดตัวสำหรับเนมสเปซนี้จึงถูกตั้งชื่อว่าCLONE_NEWNS(New Namespace) ซึ่งเป็นชื่อที่ไม่ได้ระบุ "mount" และมักถูกมองว่าเป็นสิ่งประดิษฐ์ทางประวัติศาสตร์

เนมสเปซอื่นๆ ได้ถูกทยอยนำมาใช้ในช่วงหลายปีที่ผ่านมา:

  • เนมสเปซ UTS และ IPCถูกเพิ่มเข้ามาในเคอร์เนลเวอร์ชัน 2.6.19 ในปี 2006
  • ระบบเนมสเปซ PIDได้รับการกำหนดอย่างเป็นทางการในเคอร์เนลเวอร์ชัน 2.6.24 ในปี 2008
  • เนมสเปซเครือข่ายส่วนใหญ่เสร็จสมบูรณ์ในเคอร์เนลเวอร์ชัน 2.6.29 ในปี 2552 [ 5 ]
  • เนมสเปซของผู้ใช้ซึ่งพัฒนาโดย Eric W. Biederman เป็นหลัก ถือว่าสมบูรณ์และใช้งานได้ในเคอร์เนลเวอร์ชัน 3.8 ซึ่งวางจำหน่ายในปี 2013 [ 6 ]การนำเนมสเปซของผู้ใช้มาใช้ถือเป็นก้าวสำคัญ เนื่องจากทำให้สามารถสร้าง "คอนเทนเนอร์ที่ไม่ได้รับสิทธิ์พิเศษ" ซึ่งเป็นคอนเทนเนอร์ที่สามารถทำงานได้อย่างปลอดภัยโดยไม่จำเป็นต้องใช้สิทธิ์ผู้ใช้ระดับสูง (root) บนระบบโฮสต์[ 7 ]
  • เนมสเปซ Cgroupได้รับการแนะนำในเคอร์เนล 4.6 ในเดือนมีนาคม 2016 โดยมี Tejun Heo เป็นผู้ริเริ่ม[ 8 ]
  • เนมสเปซเวลาถูกรวมเข้าด้วยกันในเคอร์เนลเวอร์ชัน 5.6 ในเดือนมีนาคม พ.ศ. 2563 ทำให้คอนเทนเนอร์สามารถมีเวลาโมโนโทนิกและเวลาบูตของตัวเองได้[ 9 ]

ชนิดของเนมสเปซ

ตั้งแต่ เวอร์ชัน เคอร์เนล Linux 5.6 เป็นต้นไป มีเนมสเปซอยู่แปดประเภท ฟังก์ชันการทำงานของเนมสเปซนั้นเหมือนกันทุกประเภท: แต่ละกระบวนการจะเชื่อมโยงกับเนมสเปซ และสามารถมองเห็นหรือใช้ทรัพยากรที่เกี่ยวข้องกับเนมสเปซนั้นเท่านั้น รวมถึงเนมสเปซย่อยในกรณีที่เกี่ยวข้องด้วย สิ่งนี้ทำให้แต่ละกระบวนการ (หรือกลุ่มของกระบวนการ) มีมุมมองที่เป็นเอกลักษณ์และแยกส่วนของระบบ

ภูเขา (mnt)

เนมสเปซสำหรับการเมานต์ ซึ่งเป็นเนมสเปซแรกที่ถูกเพิ่มเข้ามาในลินุกซ์ ทำหน้าที่ควบคุมจุดเมานต์โดยจะให้กระบวนการที่มองเห็นลำดับชั้นของระบบไฟล์แบบแยกส่วน เมื่อสร้างเนมสเปซใหม่ จุดเมานต์จากเนมสเปซปัจจุบันจะถูกคัดลอกไปยังเนมสเปซใหม่ก่อน อย่างไรก็ตาม จุดเมานต์ที่สร้างหรือยกเลิกการเมานต์ในภายหลังจะไม่ถูกส่งต่อระหว่างเนมสเปซโดยค่าเริ่มต้น

การใช้คุณสมบัติซับทรีที่ใช้ร่วมกันของ Linux ทำให้สามารถกำหนดค่าจุดเชื่อมต่อเฉพาะเพื่อเผยแพร่เหตุการณ์ (เช่น การเชื่อมต่อไดรฟ์ USB) ระหว่างโฮสต์และคอนเทนเนอร์ หรือในทางกลับกันได้[ 10 ]แฟล็กโคลนที่ใช้ในการสร้างเนมสเปซใหม่ประเภทนี้คือCLONE_NEWNS.

รหัสกระบวนการ (pid)

เนมสเป ซ PIDจัดเตรียมชุดรหัสประจำตัวกระบวนการ (PID) ที่เป็นอิสระให้กับกระบวนการต่างๆ เนมสเปซ PID นั้นมีการซ้อนกันอย่างเคร่งครัด เมื่อมีการสร้างกระบวนการใหม่ในเนมสเปซ PID ใหม่ กระบวนการนั้นจะมี PID ที่แตกต่างกันสำหรับแต่ละเนมสเปซ ตั้งแต่เนมสเปซปัจจุบันไปจนถึงเนมสเปซ PID เริ่มต้น (ราก) ดังนั้น กระบวนการในเนมสเปซ PID เริ่มต้น (เช่น ระบบปฏิบัติการโฮสต์) จึงสามารถมองเห็นกระบวนการทั้งหมดในคอนเทนเนอร์ทั้งหมดได้ แม้ว่าจะมี PID ที่แตกต่างจากที่เห็นภายในคอนเทนเนอร์ก็ตาม

กระบวนการแรกที่สร้างขึ้นในเนมสเปซ PID จะได้รับหมายเลข ID กระบวนการ 1 โดยจะได้รับการปฏิบัติเป็นพิเศษเช่นเดียวกับ กระบวนการ init ปกติของระบบโฮสต์ ที่สำคัญที่สุดคือกระบวนการที่ไม่มีผู้ปกครอง ใด ๆ ภายในเนมสเปซจะถูกเปลี่ยนผู้ปกครองโดยอัตโนมัติเป็นกระบวนการ PID 1 นี้ หากกระบวนการ PID 1 นี้สิ้นสุดลง เคอร์เนลจะยุติกระบวนการอื่น ๆ ทั้งหมดภายในเนมสเปซ PID นั้นและลูกหลานของมันทันทีโดยการส่งSIGKILLสัญญาณ[ 11 ]

เครือข่าย (เน็ต)

เนมสเปซเครือข่ายจำลองสแต็กเครือข่ายเมื่อสร้างเนมสเปซใหม่ จะมีเพียงอินเทอร์ เฟซ ลูปแบ็ก (loopback interface lo) เท่านั้น ซึ่งในตอนเริ่มต้นจะอยู่ในสถานะปิดใช้งาน อินเทอร์เฟซเครือข่ายแต่ละตัว ไม่ว่าจะเป็นแบบกายภาพหรือเสมือน จะสามารถอยู่ในเนมสเปซเดียวเท่านั้นในแต่ละครั้ง แต่ผู้ดูแลระบบสามารถย้ายอินเทอร์เฟซระหว่างเนมสเปซได้

แต่ละเน็ตเวิร์กเนมสเปซจะรักษาชุดที่อยู่ IPส่วนตัวตารางการกำหนดเส้นทาง รายการ ซ็อกเก็ต ตารางการติดตามการเชื่อมต่อกฎไฟร์วอลล์ (เช่นiptablesหรือnftables ) และทรัพยากรอื่นๆ ที่เกี่ยวข้องกับเครือข่าย[ 5 ]เพื่อให้คอนเทนเนอร์สามารถเชื่อมต่อเครือข่ายได้ ผู้ดูแลระบบมักจะสร้างvethคู่ Virtual Ethernet ( ) โดยวางปลายด้านหนึ่งไว้ในเนมสเปซของโฮสต์และอีกด้านหนึ่งไว้ในเน็ตเวิร์กเนมสเปซของคอนเทนเนอร์ จากนั้นจึงเชื่อมต่อปลายด้านโฮสต์กับเครือข่ายทางกายภาพ การทำลายเน็ตเวิร์กเนมสเปซจะทำลายอินเทอร์เฟซเสมือนใดๆ ภายในนั้นโดยอัตโนมัติ และย้ายอินเทอร์เฟซทางกายภาพใดๆ กลับไปยังเน็ตเวิร์กเนมสเปซเริ่มต้น

การสื่อสารระหว่างกระบวนการ (IPC)

เนมสเปซ IPC แยกกระบวนการออกจาก กลไกการสื่อสารระหว่างกระบวนการแบบ SysVรวมถึง คิวข้อความ POSIXซึ่งจะป้องกันไม่ให้กระบวนการในเนมสเปซ IPC ที่แตกต่างกันโต้ตอบกันโดยใช้ตัวระบุ IPC ทั่วไป ตัวอย่างเช่น สองกระบวนการในเนมสเปซที่แตกต่างกันสามารถใช้ตัวระบุส่วนหน่วยความจำที่ใช้ร่วมกันเดียวกันเพื่อจัดสรรหน่วยความจำผ่านตระกูลฟังก์ชัน SHM และเคอร์เนลจะรับประกันว่าพวกมันจะได้รับพื้นที่หน่วยความจำที่ใช้ร่วมกันสองส่วนที่แตกต่างกันและแยกจากกันอย่างสมบูรณ์

ยูทีเอส

เนมสเปซ UTS แยกตัวระบุระบบสองตัว ได้แก่ชื่อโฮสต์และชื่อโดเมน NIS ชื่อ "UTS" มาจากโครงสร้างข้อมูลที่ส่งไปยังunameการเรียกใช้ระบบ ซึ่งในอดีตหมายถึง UNIX Time-Sharing System เมื่อกระบวนการสร้างเนมสเปซ UTS ใหม่ ชื่อโฮสต์และชื่อโดเมนจะถูกคัดลอกจากเนมสเปซของผู้เรียก จากนั้นกระบวนการภายในเนมสเปซใหม่สามารถเปลี่ยนชื่อโฮสต์ได้โดยไม่ส่งผลกระทบต่อเครื่องโฮสต์หรือคอนเทนเนอร์อื่นๆ[ 12 ]

รหัสผู้ใช้ (ผู้ใช้)

เนมสเปซของผู้ใช้เป็นคุณลักษณะด้านความปลอดภัยที่สำคัญ ซึ่งออกแบบมาเพื่อแยกสิทธิ์และระบุตัวตนผู้ใช้ในกระบวนการต่างๆ หลายชุด โดยถูกนำมาใช้ครั้งแรกในเคอร์เนลเวอร์ชัน 3.8 และเป็นหัวใจหลักของคอนเทนเนอร์ที่ไม่มีสิทธิ์พิเศษ เช่นเดียวกับเนมสเปซของ PID เนมสเปซของผู้ใช้ก็มีการซ้อนกัน โดยแต่ละเนมสเปซใหม่จะถือเป็นลูกของเนมสเปซที่สร้างขึ้น

เนมสเปซของผู้ใช้จะรักษาตารางการแมปที่แปลงรหัสผู้ใช้ (UID) และรหัสกลุ่ม (GID) จากมุมมองภายในของคอนเทนเนอร์ไปยังมุมมองทั่วโลกของระบบโฮสต์ ซึ่งช่วยให้กระบวนการมี สิทธิ์ ระดับรูท (UID 0) ภายในคอนเทนเนอร์ แต่แมปทางคณิตศาสตร์ไปยังรหัสผู้ใช้ที่ไม่มีสิทธิ์และถูกจำกัด (เช่น UID 100000) บนเครื่องโฮสต์ที่อยู่เบื้องหลัง[ 13 ]หากช่องโหว่ทำให้กระบวนการ "รูท" ของคอนเทนเนอร์หลุดออกจากเนมสเปซ ระบบโฮสต์จะยังคงถือว่าเป็นรหัสผู้ใช้ที่ถูกจำกัด ซึ่งจำกัดความเสียหายที่อาจเกิดขึ้นได้อย่างมาก

เนมสเปซกลุ่มควบคุม (cgroup)

เนมสเป ซ cgroupซ่อนตัวตนของ ลำดับชั้น กลุ่มควบคุมที่กระบวนการนั้นสังกัดอยู่ ก่อนที่จะมีเนมสเปซนี้ กระบวนการภายในคอนเทนเนอร์สามารถตรวจสอบ/proc/self/cgroupและเห็นเส้นทางทั้งหมดของ cgroup ของตนเองเมื่อเทียบกับระบบโฮสต์ได้ (เช่น/sys/fs/cgroup/memory/docker/container_id)

ด้วยการจำลองมุมมองระบบไฟล์ cgroup กระบวนการภายในเนมสเปซ cgroup จะเห็นไดเร็กทอรี cgroup ของตนเองเป็นรูท ( /) ซึ่งจะป้องกันการรั่วไหลของข้อมูลเกี่ยวกับโครงสร้างพื้นฐานพื้นฐานของโฮสต์ และช่วยให้เครื่องมือจัดการคอนเทนเนอร์สามารถย้ายคอนเทนเนอร์ระหว่างโหนดได้อย่างราบรื่นโดยไม่มีเส้นทาง cgroup ที่ขัดแย้งกัน เนมสเปซประเภทนี้มีมาตั้งแต่เดือนมีนาคม 2016 ใน Linux 4.6 [ 14 ]

เวลา

เนมสเปซเวลา (time namespace) อนุญาตให้กระบวนการต่างๆ สังเกตเวลาของระบบที่แตกต่างกันได้ โดยมีการนำเนมสเปซนี้มาใช้ใน Linux 5.6 ในเดือนมีนาคม 2020 โดยเฉพาะอย่างยิ่ง จะแยกนาฬิกาเคอร์เนลสองตัวที่เฉพาะเจาะจงได้แก่ CLOCK_MONOTONICและCLOCK_BOOTTIME

เมื่อคอนเทนเนอร์ถูกย้ายจากโฮสต์ทางกายภาพหนึ่งไปยังอีกโฮสต์หนึ่ง หรือกู้คืนจากสแนปช็อต เวลาการทำงานของระบบและค่าเวลาของนาฬิกาแบบโมโนโทนิกของโฮสต์ใหม่จะแตกต่างจากโฮสต์เดิมอย่างแน่นอน เนมสเปซเวลาช่วยให้รันไทม์ของคอนเทนเนอร์สามารถตั้งค่าการชดเชยเวลาได้ ทำให้มั่นใจได้ว่าแอปพลิเคชันภายในคอนเทนเนอร์จะไม่ประสบปัญหาการเปลี่ยนแปลงเวลาอย่างกะทันหันและทำให้ระบบหยุดชะงัก

เนมสเปซที่เสนอ

เนมสเปซซิสล็อก

เนมสเปซ syslog ได้รับการเสนอโดย Rui Xiang วิศวกรของHuaweiเพื่อแยกวงแหวนการบันทึกของเคอร์เนล อย่างไรก็ตาม ข้อเสนอดังกล่าวไม่ได้ถูกรวมเข้ากับเคอร์เนล Linux หลัก[ 15 ]ในทางกลับกัน โซลูชันในพื้นที่ผู้ใช้ได้ตอบสนองความต้องการนี้เป็นส่วนใหญ่ ตัวอย่างเช่นsystemdได้แนะนำแนวคิดของ "เนมสเปซบันทึก" ในเดือนกุมภาพันธ์ 2020 เพื่อจัดเตรียมสภาพแวดล้อมการบันทึกที่แยกต่างหาก[ 16 ]

เนมสเปซ IMA

สถาปัตยกรรมการวัดความสมบูรณ์ (IMA) เป็นระบบย่อยความปลอดภัยของเคอร์เนลที่วัดไฟล์ก่อนที่จะเข้าถึงเพื่อให้แน่ใจว่าไฟล์นั้นไม่ได้ถูกแก้ไข IMA มาตรฐานทำงานทั่วโลก ซึ่งทำให้เกิดความขัดแย้งในสภาพแวดล้อมคอนเทนเนอร์ การพัฒนาอย่างต่อเนื่องโดยชุมชนเคอร์เนล—โดยมีส่วนร่วมอย่างมากจาก IBM และ Huawei—มีเป้าหมายที่จะแนะนำเนมสเปซ IMA ซึ่งจะช่วยให้คอนเทนเนอร์แต่ละตัวสามารถรักษารีจิสเตอร์การกำหนดค่าแพลตฟอร์ม (PCR) ที่แยกจากกัน บันทึกการวัด (ML) ที่ไม่ซ้ำกัน และคีย์การประเมินอิสระ ซึ่งจะนำการรับรองการเข้ารหัสระดับฮาร์ดแวร์มาสู่คอนเทนเนอร์แต่ละตัวโดยตรง[ 17 ]

ลำดับชั้นการบริหาร

เพื่อให้ง่ายต่อการแยกสิทธิ์สำหรับการดำเนินการด้านการดูแลระบบ เนมสเปซทุกประเภทจึงเชื่อมโยงกับเนมสเปซของผู้ใช้ เมื่อมีการสร้างเนมสเปซที่ไม่ใช่ของผู้ใช้ เนมสเปซนั้นจะถือว่า "เป็นของ" เนมสเปซของผู้ใช้ที่ใช้งานอยู่ในขณะที่สร้างเนมสเปซนั้น

ผู้ใช้ที่มีสิทธิ์ในการดูแลระบบ (โดยเฉพาะผู้ที่มีCAP_SYS_ADMINความสามารถ ) ในเนมสเปซของผู้ใช้ที่เป็นเจ้าของจะได้รับอนุญาตให้ดำเนินการดูแลระบบในเนมสเปซนั้น ตัวอย่างเช่น หากกระบวนการมีสิทธิ์ในการดูแลระบบเพื่อเปลี่ยนที่อยู่ IP ของอินเทอร์เฟซเครือข่าย กระบวนการนั้นอาจทำได้ แต่เฉพาะในกรณีที่เนมสเปซของผู้ใช้ที่ใช้งานอยู่เป็นเจ้าของเนมสเปซเครือข่ายเฉพาะนั้น เนื่องจากเนมสเปซของผู้ใช้เริ่มต้น (โฮสต์) เป็นบรรพบุรุษของเนมสเปซอื่นๆ ทั้งหมด ผู้ใช้รูทของโฮสต์จึงยังคงควบคุมการดูแลระบบเหนือเนมสเปซทุกประเภททั่วทั้งระบบโดยธรรมชาติ[ 18 ]

รายละเอียดการดำเนินการ

เนมสเปซจะถูกแสดงเป็นอ็อบเจ็กต์ไฟล์เสมือนภายในเคอร์เนล ซึ่งสามารถเข้าถึงได้ผ่านทางprocfsระบบไฟล์เสมือน

การมองเห็นใน /proc

เคอร์เนลจะเปิดเผยการเชื่อมโยงเนมสเปซของแต่ละกระบวนการที่กำลังทำงานอยู่ที่พาธ. เช่นเดียวกับทรัพยากรที่ไม่ใช่ไฟล์จำนวนมากในรายการเหล่านี้จะปรากฏในรูปแบบของลิงก์สัญลักษณ์พิเศษ การอ่านลิงก์จะให้สตริงที่จัดรูปแบบเป็น. /proc/pid/ns/kind/prockind:[inode_number]

หมายเลข inode เหล่านี้สอดคล้องกันแบบหนึ่งต่อหนึ่งกับอ็อบเจ็กต์เนมสเปซที่ไม่ซ้ำกันในหน่วยความจำเคอร์เนล หากสองกระบวนการแสดงหมายเลข inode เดียวกันสำหรับชนิดเนมสเปซเฉพาะ (เช่นnet:[4026531969]) แสดงว่าทั้งสองกระบวนการนั้นใช้เนมสเปซร่วมกัน

ตั้งแต่ Linux เวอร์ชัน 6.1.0 เป็นต้นไปkindสตริงสามารถเป็นได้ทั้งcgroup, ipc, mnt, net, pid, time, userหรือutsนอกจากนี้ สำหรับเนมสเปซที่กระบวนการลูกอาจสืบทอดคุณลักษณะที่แตกต่างจากกระบวนการแม่ (เช่น เนมสเปซ PID หรือเนมสเปซผู้ใช้) เคอร์เนลจะให้ลิงก์มา ด้วย/proc/pid/ns/kind_for_children

การเรียกใช้ระบบ

ระบบเรียกใช้งานหลักสี่ ระบบ จะจัดการเนมสเปซโดยตรง:

  • clone: ใช้เพื่อสร้างกระบวนการใหม่ โดยการส่งแฟล็กเฉพาะ (เช่นCLONE_NEWPIDหรือCLONE_NEWNET) เคอร์เนลจะสร้างเนมสเปซใหม่ที่ระบุและวางกระบวนการลูกไว้ภายในเนมสเปซเหล่านั้น
  • unshare: อนุญาตให้กระบวนการหนึ่งแยกส่วนบริบทการทำงานของตนออกจากกระบวนการแม่ ทำให้กระบวนการที่เรียกใช้งานนั้นย้ายไปอยู่ในเนมสเปซใหม่โดยสิ้นเชิง
  • setns: อนุญาตให้กระบวนการที่กำลังทำงานอยู่เข้าสู่เนมสเปซที่มีอยู่แล้ว โดยต้องมีตัวระบุไฟล์ที่ชี้ไปยังลิงก์สัญลักษณ์ของเนมสเปซตัวใดตัวหนึ่งใน ไฟล์ /proc.
  • ioctl: ใช้ร่วมกับคำขอเนมสเปซเฉพาะ (เช่นNS_GET_PARENTหรือNS_GET_USERNS) เพื่อค้นหาความสัมพันธ์เชิงลำดับชั้นระหว่างเนมสเปซต่างๆ

การทำลาย

หากส่วนใดส่วนหนึ่งของระบบไม่อ้างอิงถึงเนมสเปซอีกต่อไป เคอร์เนลจะทำลายเนมสเปซนั้นโดยอัตโนมัติ กระบวนการทำความสะอาดทรัพยากรที่อยู่ภายในจะแตกต่างกันไปตามชนิดของเนมสเปซ เนมสเปซจะถือว่ายังมีการอ้างอิงอยู่และคงอยู่ตราบใดที่เงื่อนไขใดเงื่อนไขหนึ่งต่อไปนี้เป็นจริง:

  • ประกอบด้วยกระบวนการสมาชิกที่มีชีวิตอย่างน้อยหนึ่งกระบวนการ
  • มีเนมสเปซย่อยที่อ้างอิงอย่างน้อยหนึ่งรายการ (สำหรับประเภทที่ซ้อนกัน เช่น PID และ User)
  • ไฟล์เสมือน ( ) ปัจจุบันถูกเปิดไว้ผ่าน ตัว ระบุไฟล์/proc/pid/ns/kind
  • มันเป็นพื้นฐานของการสร้าง bind mount ในระบบไฟล์ (ซึ่งเป็นเทคนิคทั่วไปที่เครื่องมือเครือข่ายใช้iproute2เพื่อรักษา network namespace ให้ใช้งานได้โดยไม่ต้องเรียกใช้กระบวนการใดๆ)

การรับเลี้ยงบุตรบุญธรรม

เนมสเปซ ของ Linux ได้รับการนำไปใช้อย่างแพร่หลายในภูมิทัศน์ซอฟต์แวร์สมัยใหม่ พวกมันถูกรวมเข้ากับcgroupsเพื่อสร้างเทคโนโลยีคอนเทนเนอร์ ตัวอย่างเช่น Docker [ 19 ] LXC ( Linux Containers), Podmanและระบบจัดการคอนเทนเนอร์เช่นKubernetes

นอกเหนือจากคอนเทนเนอร์บริสุทธิ์แล้ว เนมสเปซยังถูกนำมาใช้อย่างกว้างขวางสำหรับแซนด์บ็อกซ์กระบวนการและความปลอดภัยGoogle ChromeและChromiumอาศัยเนมสเปซของผู้ใช้ PID และเครือข่ายอย่างมากเพื่อแซนด์บ็อกซ์กระบวนการเรนเดอร์เว็บ ซึ่งจำกัดความเสียหายที่ผู้โจมตีสามารถก่อขึ้นได้อย่างมากหากเรนเดอร์ถูกบุกรุก[ 20 ]รูปแบบแพ็กเกจเช่นFlatpakและSnapใช้เนมสเปซเพื่อแยกแอปพลิเคชันเดสก์ท็อปออกจากระบบไฟล์โฮสต์และข้อมูลผู้ใช้

นอกจากนี้ ระบบเริ่มต้นsystemdยังใช้เนมสเปซเพื่อรักษาความปลอดภัยของบริการระบบ คำสั่งต่างๆ เช่นPrivateNetwork=yesหรือPrivateTmp=yesในไฟล์บริการของ systemd จะสั่งให้เคอร์เนลสร้างเดมอนขึ้นภายในเนมสเปซเครือข่ายและเนมสเปซการเมานต์ที่แยกต่างหากตามลำดับ

ยูทิลิตี้แบบบรรทัดคำสั่งก็ใช้คุณสมบัติเหล่านี้เช่นกันutil-linuxแพ็กเกจนี้มีunshareคำสั่งที่ช่วยให้ผู้ใช้สามารถเริ่มเชลล์หรือสคริปต์ภายในเนมสเปซที่สร้างขึ้นใหม่ได้ ตัวอย่างของการใช้เนมสเปซเพื่อสร้างสภาพแวดล้อมที่แยกต่างหากและไม่มีสิทธิ์พิเศษคล้ายกับผู้ใช้ระดับรูท:

unshare --map-root-user --fork --pid --mount-proc --root = " ${ chrootdir } " " $@ "

คำสั่งนี้จะสร้างกระบวนการใหม่ในเนมสเปซของผู้ใช้, PID และเมานต์ใหม่ ซึ่งทำหน้าที่เป็นวิธีการที่ทันสมัยและปลอดภัยกว่ามากเมื่อเทียบกับวิธีการแบบchrootดั้งเดิม

  • เนมสเปซ(7) - หน้าคู่มือ Linux
  • เนมสเปซ — เอกสารประกอบเคอร์เนลลินุกซ์
  • เนมสเปซและซีกรุ๊ปในเคอร์เนลลินุกซ์ โดย รามิ โรเซน
  • เนมสเปซและซีกรุ๊ปส์ พื้นฐานของคอนเทนเนอร์ลินุกซ์ (รวมถึงซีกรุ๊ปส์เวอร์ชัน 2) - สไลด์จากการบรรยายของ รามิ โรเซน ในงาน Netdev 1.1 ณ เมืองเซบียา ประเทศสเปน (2016)
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Linux_namespaces&oldid=1356697396 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ เนมสเปซของลินุกซ์

เนมสเปซ เป็นคุณลักษณะของ เคอร์เนลลินุกซ์ ที่แบ่ง ทรัพยากร เคอร์เนล ออกเป็นส่วนๆ โดยที่ กระบวนการ ชุดหนึ่งจะเห็นทรัพยากรชุดหนึ่ง...

ประวัติศาสตร์

เนมสเปซของลินุกซ์ได้รับแรงบันดาลใจอย่างมากจากฟังก์ชันเนมสเปซที่กว้างขึ้นซึ่งใช้ทั่วทั้ง ระบบปฏิบัติการ Plan 9 ของ Bell Labs ซึ่งถือว่าทุกอย่างเป็นไฟล์และให้การแยกเนมสเปซต่อกระบวนการ [ 3 ]

ชนิดของเนมสเปซ

ตั้งแต่ เวอร์ชัน เคอร์เนล Linux 5.6 เป็นต้นไป มีเนมสเปซอยู่แปดประเภท ฟังก์ชันการทำงานของเนมสเปซนั้นเหมือนกันทุกประเภท: แต่ละกระบวนการจะเชื่อมโยงกับเนมสเปซ และสามารถมองเห็นหรือใช้ทรัพยากรที่เกี่ยวข้องกับเนมสเปซนั้นเท่านั้น...

ภูเขา (mnt)

เนมสเปซสำหรับการเมานต์ ซึ่งเป็นเนมสเปซแรกที่ถูกเพิ่มเข้ามาในลินุกซ์ ทำหน้าที่ควบคุม จุดเมานต์ โดยจะให้กระบวนการที่มองเห็นลำดับชั้นของระบบไฟล์แบบแยกส่วน เมื่อสร้างเนมสเปซใหม่ จุดเมานต์จากเนมสเปซปัจจุบันจะถูกคัดลอกไปยังเนมสเปซใหม่ก่อน อย่างไรก็ตาม...