ไม่มีเหตุผลที่จะมีทั้ง / run และ / tmp
ฉันคิดว่าคุณพูดถูก จะเลิกเป็นหลักตอนนี้เรามี/tmp
/run
ถ้าโปรแกรมของคุณอยู่ในตำแหน่งที่จะทำเช่นนั้น (ซึ่งต้องว่ามันเป็นที่ติดตั้งเป็นงานที่มีสิทธิพิเศษ) /run
แล้วในปัจจุบันคุณจะใช้ไดเรกทอรีย่อยของ นี่คือเหตุผลด้านความปลอดภัย
เช่น daemon การพิมพ์ CUPS ไม่ได้ทำงานเหมือนรูท แต่โดยทั่วไปจะติดตั้งจากแพ็คเกจระบบปฏิบัติการ แพ็คเกจจะติดตั้ง/usr/lib/tmpfiles.d/cups.conf
และsystemd-tmpfiles
สร้างไดเรกทอรีที่สามารถเข้าถึงได้ เนื่องจากไดเรกทอรีอยู่ภายใต้/run
ชื่อไม่สามารถถูกอ้างสิทธิ์โดยผู้ประสงค์ร้ายโดยไม่มีเจตนาได้/tmp
ซึ่งแตกต่างจากที่สามารถเขียนได้ทั่วโลก
"โปรแกรมที่ไม่ได้รับสิทธิพิเศษ" ซึ่งไม่สามารถใช้ได้/run
โดยตรง
ความแตกต่างที่แท้จริงคือถ้าโปรแกรมของคุณกำลังถูกเรียกใช้โดยผู้ใช้ที่ไม่มีสิทธิพิเศษภายใต้ ID ผู้ใช้ของตนเอง แต่โดยทั่วไปคุณยังคงไม่ต้องการใช้/tmp
เพราะสามารถเข้าถึงได้โดยผู้ใช้ที่ไม่มีสิทธิ์รายอื่น $XDG_RUNTIME_DIR
คุณต้องการที่จะใช้ โดยทั่วไปจะมีการใช้งานเป็น/run/user/$(id -u)
- ดังนั้นจึงเป็นไดเรกทอรีย่อยของ/run
เช่นกัน แม้ว่าจะไม่รับประกันตำแหน่ง โปรแกรมควรใช้ตัวแปรสภาพแวดล้อมเสมอ
/tmp
จะเป็นประโยชน์สำหรับความร่วมมือแบบเฉพาะกิจระหว่างผู้ใช้ที่ไม่มีสิทธิพิเศษต่างกันในระบบ ระบบ Ad-hoc ดังกล่าวมีความเสี่ยงต่อผู้ใช้ที่เป็นอันตรายที่ปฏิเสธที่จะร่วมมือและทำสิ่งต่าง ๆ ให้กับทุกคน :) ตัวอย่างหนึ่งคือผู้ใช้ที่ไม่มีสิทธิพิเศษที่ตัดสินใจใช้talk
daemon เวอร์ชันหนึ่งโดยใช้ซ็อกเก็ต unix
หมายเหตุรายการตรวจสอบของ Poettering ด้านล่างอ้างว่า/tmp
จะเป็นประโยชน์สำหรับ "ไฟล์ขนาดเล็ก" ในขณะที่/run
ควรใช้สำหรับ "การสื่อสารพื้นฐาน" เท่านั้น ฉันไม่คิดว่าความแตกต่างนี้เป็นจริงเช่นกัน ผู้โพสต์สำหรับ/run
คือudev
และฉันค่อนข้างแน่ใจว่า/run/udev
มีฐานข้อมูลภายใน เมื่อคุณมี/run
ไดเรกทอรีผมไม่คิดว่าทุกคนต้องการที่จะทำตามความแตกต่างและสร้างอ้างอีก/tmp
ไดเรกทอรีเพื่อถ่วง ดังนั้นในทางปฏิบัติเราเพิ่งใช้/run
ทุกวันนี้
การใช้เนมสเปซที่ใช้ร่วมกันที่เขียนได้ทั่วโลก [like / tmp] เพื่อจุดประสงค์ในการสื่อสารนั้นเป็นปัญหาเสมอมาเนื่องจากการสร้างการสื่อสารนั้นคุณต้องมีชื่อที่มั่นคง สิ่งนี้สามารถแก้ไขได้บางส่วนโดยสร้างไดเรกทอรีต่อแอพที่ได้รับการป้องกันสำหรับบริการบางอย่างระหว่างการบูทก่อนหน้า (เช่นที่เราทำสำหรับ X11) แต่สิ่งนี้จะแก้ไขปัญหาได้เพียงบางส่วนเท่านั้น
...
ฟีเจอร์ Fedora อีกตัว (สำหรับ Fedora 17) เปลี่ยนซีแมนทิกส์ของ / tmp สำหรับบริการระบบจำนวนมากเพื่อให้ปลอดภัยมากขึ้นโดยการแยก / tmp namespaces ของบริการต่างๆ
...
เนื่องจาก / tmp ไม่จำเป็นต้องเป็นเนมสเปซที่ใช้ร่วมกันอีกต่อไปจึงไม่เหมาะสมสำหรับสถานที่สำหรับการสื่อสารพื้นฐาน
...
[/ run] รับประกันว่าจะเป็น tmpfs และจะถูกล้างโดยอัตโนมัติที่บูท ไม่มีการทำความสะอาดอัตโนมัติเสร็จสิ้น
...
นี่คือคำแนะนำคร่าวๆเกี่ยวกับวิธีที่เราแนะนำให้คุณ (นักพัฒนาแอปพลิเคชัน Linux) เลือกไดเรกทอรีที่เหมาะสมในการใช้:
- คุณต้องมีที่วางซ็อกเก็ตของคุณ (หรือสื่อสารแบบดั้งเดิมอื่น ๆ ) และรหัสของคุณทำงานอภิสิทธิ์: ใช้ไดเรกทอรีย่อยใต้ / เรียกใช้ (หรือใต้ / var / run เพื่อความเข้ากันได้พิเศษ)
- คุณต้องมีที่วางซ็อกเก็ตของคุณ (หรือการสื่อสารดั้งเดิม) และโค้ดของคุณทำงานโดยไม่มีสิทธิพิเศษ: ใช้ไดเรกทอรีย่อยใต้ $ XDG_RUNTIME_DIR
- คุณต้องมีสถานที่ที่จะทำให้การดาวน์โหลดและการดาวน์โหลดที่มีขนาดใหญ่ขึ้นของคุณอยู่ในระหว่างดำเนินการและเรียกใช้แบบไม่มีสิทธิ์: ใช้ $ XDG_DOWNLOAD_DIR
- คุณต้องมีที่สำหรับวางแคชไฟล์ซึ่งควรจะคงอยู่และเรียกใช้ unprivileged: ใช้ $ XDG_CACHE_HOME
- ไม่มีสิ่งใดที่กล่าวมาข้างต้นและคุณจำเป็นต้องวางไฟล์ขนาดเล็กที่ไม่ต้องการความคงทน: ใช้ $ TMPDIR ด้วย fallback on / tmp และใช้ mkstemp () และ mkdtemp () และไม่มีอะไรพื้นบ้าน
- มิฉะนั้นให้ใช้ $ TMPDIR พร้อมกับทางเลือกใน / var / tmp ใช้ mkstemp () / mkdtemp () ด้วย
โปรดทราบว่าเราแนะนำกฎเหล่านี้ด้านบนเท่านั้น กฎเหล่านี้คำนึงถึงทุกสิ่งที่เรารู้เกี่ยวกับหัวข้อนี้และหลีกเลี่ยงปัญหาเกี่ยวกับการแจกแจงปัจจุบันและอนาคตเท่าที่เราจะเห็นได้ โปรดพิจารณาอัปเดตโครงการของคุณเพื่อปฏิบัติตามกฎเหล่านี้และระลึกไว้เสมอหากคุณเขียนรหัสใหม่
สิ่งหนึ่งที่เราต้องการเน้นคือ / tmp และ / var / tmp บ่อยกว่าไม่จริงไม่ใช่ตัวเลือกที่เหมาะสมสำหรับ usecase ของคุณ มีการใช้งานที่ถูกต้องของไดเรกทอรีเหล่านี้ แต่บ่อยครั้งที่ไดเรกทอรีอื่นอาจเป็นที่ที่ดีกว่า ดังนั้นระวังให้พิจารณาตัวเลือกอื่น ๆ แต่ถ้าคุณใช้สำหรับ / tmp หรือ / var / tmp อย่างน้อยต้องแน่ใจว่าใช้ mkstemp () / mkdtemp ()
พวกเราไปกับ/tmp
ซ็อกเก็ตดั้งเดิมที่ใช้โดยระบบ X window ดังที่อธิบายไว้ข้างต้นtmpfiles.d/x11.conf
ผมอ่านผิด ดูเหมือนจะขึ้นอยู่กับความร่วมมือ :) ฉันถือว่ารหัสตรวจสอบแล้วการปฏิเสธการให้บริการนั้นเป็นสิ่งที่เลวร้ายที่สุดที่สามารถเกิดขึ้นได้