Sticky bit เดิมทำอะไรเมื่อนำไปใช้กับไฟล์


65

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

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

สิ่งนี้ทำให้คำถาม:

สิ่งที่ไม่บิตเหนียวนำไปใช้ปฏิบัติการทำอย่างไร มันเหมือน setuid ไหม?

หมายเหตุกาลที่ผ่านมา นี่ไม่ใช่วิธีการทำงานของหมุด? ตอนนี้ มันเป็นวิธีที่ใช้ในการทำงานแล้ว


3
ฉันต้องการจะชี้ให้เห็นว่า "ฉันสังเกตเห็นว่าระบบที่ทันสมัยในทางปฏิบัติดูเหมือนจะไม่นำไปใช้กับไฟล์" เป็นจริงสำหรับบางระบบเท่านั้น หน้าวิกิพีเดียในบันทึกย่อแบบติดหนึบ "ปัจจุบันพฤติกรรมนี้ใช้งานได้เฉพาะใน HP-UX และ UnixWare" มีแผนภูมิแสดงการใช้งานที่หลากหลาย: เธรดทั่วไปคือระบบปฏิบัติการที่ละเว้นมันหรือจัดการกับมันเพื่อระบุว่าหน่วยความจำ / swap / etc ควรได้รับการจัดการ รายละเอียดของวิธีการใช้นั้นแตกต่างกันไประหว่างระบบปฏิบัติการ เช่นไม่มีระบบลีนุกซ์ที่เคยใช้สิ่งที่เหนียวเช่นคำตอบของ JdeBP
TOOGAM

คำตอบ:


91

ไม่บิตเหนียวไม่เหมือนธง set-UID หรือ set-GID ไม่มีผลต่อการเปลี่ยนแปลงข้อมูลรับรองกระบวนการ

สิ่งที่บิตเหนียวทำคือทำให้ข้อความโปรแกรม "เหนียว" เดิมทีมันไม่ใช่การเรียกชื่อผิด

พื้นหลัง: ส่วนภาพโปรแกรมและข้อความที่แชร์

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

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

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

มีอะไรพิเศษเกี่ยวกับส่วน "ข้อความ" คือรหัสเครื่อง (และค่าคงที่) นั้นแทบจะไม่ได้เขียนไว้เสมอไป มีความเป็นไปได้ที่จะถูกแชร์ไปยังอิมเมจหน่วยความจำเสมือนของกระบวนการดำเนินการทั้งหมดที่มีไฟล์อิมเมจที่สามารถเรียกใช้งานนั้นโหลดเข้ามาได้ สถานการณ์ที่แน่นอนซึ่งข้อความโปรแกรมสามารถแบ่งปันไม่อยู่ในขอบเขตของคำตอบนี้และเกี่ยวข้องกับสิ่งต่าง ๆ เช่น idempotence fixup ตัวโหลดและข้อมูลประจำตัวโครงร่างพื้นที่ที่อยู่ ผู้คนสามารถและมีหนังสือที่เขียนเกี่ยวกับเรื่องนี้ได้เช่นกัน ☺

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

ข้อความเหนียว

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

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

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

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

desuetude

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

วันของบิตข้อความเหนียวสำหรับภาพโปรแกรมที่ปฏิบัติการได้หายไปนาน ตัวอย่างเช่นการตั้งค่าสถานะตัวทำเครื่องหมายข้อความเหนียวสำหรับภาพโปรแกรมที่ใช้งานได้นั้นถือว่าล้าสมัยโดยนักเขียน 4.3BSD ในช่วงกลางทศวรรษ 1980

อ่านเพิ่มเติม

  • Maurice J. Bach (1986) การออกแบบของระบบปฏิบัติการยูนิกซ์ ศิษย์ฮอลล์. ไอ 9780132017992

1
คำตอบที่ดีมาก! วันนี้ฉันเรียนรู้บางสิ่ง :)
Andreas Wiese

ฉันด้วย :) นี่ฟังดูเหมือนสิ่งที่ฉันเคยรู้เหมือนTSRในสมัยดอส - "ยุติและพักอาศัย" อย่างไรก็ตามโดยทั่วไปแล้วสำหรับสิ่งต่าง ๆ เช่นโปรแกรมควบคุมอุปกรณ์ที่กระบวนการอื่นที่เรียกใช้ในภายหลังจำเป็นต้องเรียกใช้และอาจล้าสมัยเมื่อโลกถูกย้ายไปยังระบบปฏิบัติการแบบมัลติเธรด / หลายกระบวนการ
Steve

1
นี่เป็นคำตอบที่ยอดเยี่ยม ฉันจะอ่านเกี่ยวกับแหล่งกำเนิดของbssที่ไหน
แมว

1
TSR นั้นไม่ได้คล้ายกันจริงๆ สำหรับอะนาล็อกในโลก IBM + Microsoft ให้ดูที่ DOS + Windows 3.x ในโหมดมาตรฐานและ 16-bit OS / 2 เวอร์ชัน 1.x เซกเมนต์CODE(และบน OS / 2 ส่วนอ่านอย่างเดียวDATA) ของ EXE และ DLLs (โดยปกติ) จะถูกแชร์ในโปรแกรมที่ทำงานอยู่ทั้งหมด ไม่มีส่วนใดเทียบเท่า "stickiness" ที่แท้จริงส่วนหนึ่งเป็นเพราะ 32-bit OS / 2 เวอร์ชั่น 2.x และ386 Enhanced Modeแทนที่เซ็กเมนต์การสลับกับหน่วยความจำเสมือนเพจความต้องการเสมือนโลก Unix เมื่อหลายปีก่อน ต้องการการแบ่งส่วนเหนียวหนึบในแบบเดียวกัน
JdeBP

3
@JdeBP: คำถาม "เป็นบิตเหนียวเหมือน setuid?" ค่อนข้างกว้างและไม่แน่ชัด ฉันจะยืนยันว่าคำตอบคือ "ดีค่อนข้าง; มันซับซ้อน" เพราะการสั่งซื้อต่ำเก้าบิตได้และมีความคล้ายคลึงกับที่พวกเขาส่งผลกระทบต่อว่าผู้ใช้บางรายอาจดำเนินการบางอย่างในแฟ้ม และการตั้ง UID, ตั้ง GID และบิตเหนียวมีความคล้ายคลึงกันในการที่พวกเขาไม่ได้เกี่ยวข้องกับการไม่ว่าจะดำเนินการได้รับอนุญาต แต่แทนที่จะมีการตรวจสอบทุกแง่มุมของบางวิธีมัน (เฉพาะรันการทำงาน) ได้ดำเนินการ
G-Man
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.