มีระบบไฟล์ใดบ้างที่ `ln -d` ประสบความสำเร็จ?


11

จาก manpage สำหรับln :

-d, -F, --directory
  allow the superuser to attempt to hard link directories (note: will 
  probably fail due to system restrictions, even for the superuser)

มีไดร์เวอร์ระบบไฟล์ใดบ้างที่สามารถใช้งานได้จริงหรือเป็นเพียงตัวเลือกเดียวmount --bind <src> <dest>? หรือพฤติกรรมแบบนี้ถูกบล็อกโดยเคอร์เนลก่อนที่มันจะเข้าสู่ไดร์เวอร์เฉพาะระบบไฟล์หรือไม่?

หมายเหตุ: ฉันไม่ได้วางแผนที่จะทำสิ่งนี้บนเครื่องใด ๆ

คำตอบ:


6

ครั้งแรกหมายเหตุ: lnคำสั่งไม่ได้มีตัวเลือกเช่น-d, -F, --directoryนี้เป็น GNUism ไม่ใช่แบบพกพา

ฟีเจอร์ที่คุณกำลังค้นหานั้นถูกใช้งานโดยlink(1)คำสั่ง

กลับไปที่คำถามดั้งเดิมของคุณ:

บนระบบ UNIX ทั่วไปการตัดสินใจว่าจะทำลิงก์ฮาร์ดไดรฟ์ในไดเรกทอรีสามารถทำได้หรือไม่ในไดรเวอร์ระบบไฟล์

ไดรเวอร์ Solaris UFS สนับสนุนการเชื่อมโยงอย่างหนักในไดเรกทอรีไดรเวอร์ ZFS ไม่

เหตุผลที่ UFS บน Solaris สนับสนุนฮาร์ดลิงก์คือ AT&T สนใจคุณสมบัตินี้ - UFS จาก BSD ไม่รองรับไดเรกทอรีที่เชื่อมโยงอย่างหนัก

เหตุผลที่ ZFS ไม่รองรับไดเรกทอรีเชื่อมโยงคือ Jeff Jeffwick ไม่ชอบคุณสมบัตินั้น

เกี่ยวกับลีนุกซ์, ฉันจะเดาว่าลีนุกซ์บล็อคพยายามสร้างฮาร์ดลิงก์ในไดเรกทอรีในเคอร์เนลชั้นบน. เหตุผลสำหรับสมมติฐานนี้คือ Linus Torvalds เขียนโค้ดสำหรับ GIT ที่ทำไดเรกทอรีฉีกเมื่อgit cloneถูกเรียกว่าเป็น root บนแพลตฟอร์มที่รองรับไดเรกทอรีที่เชื่อมโยงอย่างหนัก

โปรดทราบว่าระบบไฟล์ที่รองรับการสร้างไดเรกทอรีที่เชื่อมโยงอย่างหนักนั้นจำเป็นต้องมีการสนับสนุนunlink(1)เพื่อลบไดเรกทอรีที่ไม่ว่างเปล่าออกเป็นรูทด้วย

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


3

คำถามของ OP mount --bindกล่าว ตรวจสอบอย่างรวดเร็วแสดงให้เห็นว่ามันไม่ได้แก้ไขการเชื่อมโยงนับสำหรับไดเรกทอรีที่ติดตั้ง การเชื่อมโยงถาวรจะแก้ไขการนับลิงก์ซึ่งคุณสามารถดูls -ldได้ตลอดเวลา

โดยปกติ (ระบบ Unix-like ส่วนใหญ่) จำนวนฮาร์ดลิงก์ไปยังไดเรกทอรีจะเป็นจำนวนไดเรกทอรีที่เชื่อมต่อกับชื่อนั้นเช่น

  • ".." (ไดเรกทอรีแม่)
  • "." (ไดเรกทอรีเอง)
  • ไดเรกทอรีย่อย

หากคุณอ่านหน้าข้อมูลที่ให้ข้อมูลมากขึ้น (โดยปกติ) คุณอาจค้นพบว่าคนอื่น ๆได้ทำ:

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

แม้ว่ามันจะถูกใช้ในปัจจุบัน

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

การสร้าง (และลบ) ฮาร์ดลิงก์ไปยังไดเรกทอรีเป็นคุณสมบัติที่ จำกัด เพื่อป้องกันการสูญเสียไฟล์หากไม่มีการลิงก์ไดเรกทอรี เนื่องจากการดำเนินการ link / unlink ที่อินเตอร์เฟสของระบบปฏิบัติการ C นั้นมีความสมมาตรการลิงก์ไปยังไดเร็กทอรีจึงทำได้โดยปกติในการเรียก mkdir / rmdir เท่านั้น

โปรดจำไว้ว่า coreutils ของ GNU ส่วนใหญ่เขียน (และจัดทำเอกสาร) เมื่อ 20-30 ปีที่แล้วเมื่อบางส่วนของพิพิธภัณฑ์ที่แท้จริงยังใช้อยู่ ตามที่ระบุไว้ในเกี่ยวกับการเชื่อมโยงอย่างหนักแต่เดิมมีอยู่ไม่มีการโทร mkdir / rmdir; ไดเรกทอรีถูกสร้างขึ้น (เป็นการดำเนินการพิเศษ) โดยใช้ฮาร์ดลิงก์ สิ่งเหล่านี้ทั้งหมดหายไปเมื่อมีการเพิ่มการเรียกของระบบเพื่อแก้ไขปัญหาที่กล่าวถึง แต่เอกสารอ้างอิงยังคงอ้างอิงถึงระบบเหล่านี้ผ่านหน่วยความจำของผู้ดูแล ตัวเลือกที่ถูกสอบปากคำนั้นอยู่ในรุ่นก่อนfileutils(ซึ่งรวมกับtextutilsและshellutilsในช่วงกลางทศวรรษที่ 1990 ถึงรูปแบบcoreutils) รายการจากการเปลี่ยนแปลงบางอย่างอาจช่วยอธิบายที่มาของคุณสมบัติ:

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

ดังนั้นคุณสามารถดูตัวอย่างว่าหนึ่งในโบราณวัตถุซึ่งคุณสมบัตินี้สามารถใช้งานได้คือ SunOS หน้าคู่มือที่เกี่ยวข้องกล่าวว่า:

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

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

การลิงก์ไปยังไดเรกทอรีนั้นถูก จำกัด ไว้ที่ superuser ในการนำไปใช้ในอดีตส่วนใหญ่เนื่องจากความสามารถนี้อาจสร้างลูปในลำดับชั้นของไฟล์หรือทำให้ระบบไฟล์เสียหาย ปริมาณของ POSIX.1-2008 นี้ยังคงปรัชญาดังกล่าวโดยการห้ามlink()และไม่ให้unlink()ทำเช่นนี้ ฟังก์ชั่นอื่น ๆ สามารถทำได้หากผู้ดำเนินการออกแบบส่วนขยายดังกล่าว

มีเป็นระบบที่ใช้ hardlinks ไดเรกทอรีเกินจำนวนตามปกติ (2 บวกไดเรกทอรีย่อย)

OSX ใช้ฮาร์ดลิงก์หลายรายการไปยังไดเรกทอรีสำหรับไฟล์ทั่วไป ไม่รองรับการใช้สิ่งนี้ln(ดูหน้าคู่มือ ) ตามที่Time Machine ใช้งาน Magicมันทำสิ่งนี้เพื่อให้รุ่นที่ใช้สำหรับการสำรองข้อมูล Time Machine

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


3
ดูเหมือนจะไม่ตอบคำถามเลย
Michael Homer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.