เมื่อไหร่ที่คุณจะใช้อันอื่น
เมื่อไหร่ที่คุณจะใช้อันอื่น
คำตอบ:
ความหมายที่แตกต่างกันระหว่างฮาร์ดลิงก์และซอฟต์ลิงค์ทำให้มันเหมาะสมกับสิ่งต่าง ๆ
ลิงค์ยาก:
ลิงก์สัญลักษณ์ (ลิงก์อ่อน)
ls -l
จะแสดงเส้นทางที่ symlink ชี้ไป)unlink(2)
ด้วยซ้ำ ไฟล์ "ปกติ" (ที่มีจำนวนลิงค์ 1) เป็นเพียงกรณีพิเศษ หากช่วยได้คุณสามารถคิดว่า inodes เป็นวัตถุและชื่อเป็นตัวชี้นับที่อ้างอิง (จำนวนลิงก์ของ inode คือจำนวนการอ้างอิง)
..
.
จุดเชื่อมโยงทั้งสองประเภทคือการจัดทำวิธีการสร้างไฟล์ให้ปรากฏในสองตำแหน่งในเวลาเดียวกัน มีประโยชน์หลายอย่าง 9 ครั้งจากทั้งหมด 10 ครั้งคุณต้องการใช้ลิงก์สัญลักษณ์
ลิงก์สัญลักษณ์หรือ "symlinks" ทำงานคล้ายกับทางลัด Windows เล็กน้อย เนื้อหาของ symlink เป็นตัวชี้ไปยังตำแหน่งที่แท้จริงของไฟล์ / ไดเรกทอรี หากคุณลบไฟล์จริง symlink จะกลายเป็น "ห้อย" และจะไม่ทำงาน การลบ symlink ไม่ได้เป็นการลบไฟล์จริง คุณสามารถมี symlink ได้หลายไฟล์ในไฟล์เดียว (หรือแม้กระทั่ง symlink อื่น ๆ ) ตามที่คุณต้องการ
แตกต่างจาก Windows แม้ว่าจะทำงานกับระดับระบบแฟ้มไม่ใช่ระดับเชลล์หรือแอปพลิเคชันดังนั้นแอปพลิเคชันใด ๆ ก็ตามจะ "ติดตาม" symlink ตามที่คาดไว้ ls -al
สามารถใช้เป็นวิธีที่รวดเร็วเพื่อดูว่า symlink "ชี้" ไปที่ใด
ฮาร์ดลิงก์ทำงานได้แม้ในระดับที่ต่ำกว่า ฮาร์ดลิงก์คือรายการไดเร็กทอรีบนระบบไฟล์แบบฟิสิคัลจริงของไฟล์ ในทางเทคนิคแล้วรายการไดเรกทอรีคือฮาร์ดลิงก์ดังนั้นแต่ละไฟล์มีฮาร์ดลิงก์อย่างน้อยหนึ่งรายการในไดเรกทอรีบางแห่ง ฮาร์ดลิงก์ไม่ได้แยกจากไฟล์ที่พวกเขาชี้ไป หากไฟล์มีหลายฮาร์ดลิงก์ในไดเรกทอรีต่าง ๆ การลบฮาร์ดลิงก์ด้วยยูทิลิตี้อย่างrm
จะไม่ลบไฟล์จนกว่าจะหมดฮาร์ดลิงก์
ฉันไม่สามารถนึกถึงสถานการณ์ที่การใช้งานฮาร์ดลิงก์นั้นเป็นเรื่องปกติหรือจำเป็นแม้แต่ในกรณีที่คุณต้องการป้องกันไม่ให้ไฟล์ถูกลบหรือทำงานในระดับต่ำกับพาร์ทิชันหรือระบบไฟล์อื่น ๆ แก้ไข: มีความคิดที่ดีในคำตอบอื่น ๆ สำหรับคำถามนี้ แต่!
ls -l
ก็พอที่จะเห็นสิ่งที่ถูกเชื่อมโยงโดย symlink ที่a
ย่อมาจากให้--all
ดู manpage และแม้ว่า symlink จะทำงานที่ระบบไฟล์ แต่ก็มีฟังก์ชั่นทางเลือกอื่นให้ใช้ลิงก์สัญลักษณ์เป็นไฟล์แทนการติดตาม
ln -s /home 1; ls -l 1
แสดงว่า symlink 1 มีความยาว 5 ไบต์ในขณะที่ln -s /usr/share/ 2; ls -l 2
showas ที่ 2 มีความยาว 11 ไบต์
ฮาร์ดลิงก์มีประโยชน์มากสำหรับกลไกการสำรองข้อมูลบนดิสก์เนื่องจากคุณสามารถมีแผนผังไดเรกทอรีแบบเต็มสำหรับการสำรองข้อมูลแต่ละครั้งในขณะที่แชร์พื้นที่สำหรับไฟล์ที่ไม่ได้เปลี่ยนแปลง - และระบบไฟล์จะติดตามการนับการอ้างอิงดังนั้นเมื่อการอ้างอิงครั้งสุดท้าย รุ่นที่ระบุจะหายไปเนื่องจากการสำรองข้อมูลหมดอายุ / ลบออกด้วยเหตุผลด้านพื้นที่พื้นที่ที่ใช้จะถูกเรียกคืนโดยอัตโนมัติ ไคลเอ็นต์จดหมายบางรายยังใช้เพื่อส่งข้อความไปยังหลาย ๆ โฟลเดอร์ด้วยเหตุผลเดียวกัน
ฮาร์ดลิงก์เป็นเพียงการอ้างอิงถึงพื้นที่ดิสก์เดียวกันนั่นคือ 'ทำไม' คุณไม่สามารถฮาร์ดลิงก์บางอย่างในระบบไฟล์อื่น
Symlinks คือไฟล์ที่เชื่อมโยงไฟล์อื่น ๆ (เช่นทางลัดของ Windows) อาจอยู่ในระบบไฟล์เดียวกันอาจจะไม่ใช่
แก้ไข: ฉันจะอธิบายอะไรเพิ่มเติม ทุกไฟล์ที่มีอยู่จะมีฮาร์ดลิงก์อย่างน้อย 1 ไฟล์ ฮาร์ดลิงก์เป็นวิธีเข้าถึงเนื้อหาของ inode ของระบบไฟล์ คุณสามารถรับหมายเลขไอโหนดของไฟล์ด้วยls -i
และรับจำนวนฮาร์ดลิงก์ด้วยstat
ดังต่อไปนี้ในตัวอย่างนี้:
$ stat plantilla-disenos.odt
File: «plantilla-disenos.odt»
Size: 12367 Blocks: 32 IO Block: 4096 fichero regular
Device: 803h/2051d Inode: 319875 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ d4rio) Gid: ( 1000/ d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300
ขอบคุณ @geekosaur สำหรับการอ้างอิงนี้:
เคอร์เนลต้องรีสตาร์ทการแปล pathname-to-inode (ภายในแผนผังไดเรกทอรี) เพื่อขยาย symlink ในขณะที่ฮาร์ดลิงก์ทั้งหมดใช้ inode เดียวกัน (คุณมักจะเห็นสิ่งนี้เรียกว่า namei จากชื่อของฟังก์ชันเคอร์เนลที่ทำสิ่งนี้ใน Unix แบบดั้งเดิม)
และสิ่งนี้ (แก้ไข):
ฮาร์ดลิงก์มีประโยชน์มากสำหรับกลไกการสำรองข้อมูลแบบเพิ่มดิสก์เช่น Apple Time Machineเนื่องจากคุณสามารถมีแผนผังไดเรกทอรีแบบเต็มสำหรับการสำรองข้อมูลแต่ละครั้งในขณะที่แชร์พื้นที่สำหรับไฟล์ที่ไม่ได้เปลี่ยนแปลง - และระบบไฟล์จะติดตามการนับการอ้างอิงดังนั้น เมื่อการอ้างอิงครั้งล่าสุดไปยังรุ่นที่ระบุหายไปเนื่องจากการสำรองข้อมูลหมดอายุ / ลบออกด้วยเหตุผลด้านพื้นที่พื้นที่ที่ใช้จะถูกเรียกคืนโดยอัตโนมัติ ไคลเอ็นต์จดหมายบางรายยังใช้เพื่อส่งข้อความไปยังหลาย ๆ โฟลเดอร์ด้วยเหตุผลเดียวกัน
ไชโย
namei
จากชื่อของฟังก์ชั่นเคอร์เนลที่ทำสิ่งนี้ใน Unix แบบดั้งเดิม)
stat
นี้จะล้มเหลว
ซอฟต์ลิงก์ชี้ไปที่ชื่อพา ธ อื่น ชื่อพา ธ นั้นอาจมีหรือไม่มีอยู่จริง เส้นทางจะไม่ค้นหาจนกว่าคุณจะเข้าถึง symlink หากเส้นทางนั้นไม่มีอยู่เมื่อคุณพยายามเข้าถึงคุณมี symlink ที่ใช้งานไม่ได้
ด้วยฮาร์ดลิงก์คุณจะมีหนึ่งไฟล์ที่มีหลายชื่อ คุณไม่สามารถพูดได้ว่าหนึ่งในนั้นคือไฟล์ "ของจริง" และอื่น ๆ เป็นเพียงลิงก์ไปยังไฟล์ พวกเขาเท่ากันทั้งหมด ไม่มีสิ่งใดเป็นลิงก์ที่ใช้งานไม่ได้ในแบบที่มี symlink ที่ใช้งานไม่ได้
ฮาร์ดลิงก์ทำงานได้ภายในระบบไฟล์เดียวเท่านั้น หากคุณต้องการเชื่อมโยงไปยังไฟล์บนระบบไฟล์อื่น (เช่นพาร์ติชั่นอื่นหรือแชร์เครือข่าย) คุณต้องใช้ซอฟต์ลิงค์
ความแตกต่างใหญ่อีกอย่างคือสิ่งที่เกิดขึ้นเมื่อคุณลบไฟล์ที่เชื่อมโยง หากคุณลบไฟล์ hardlinked หนึ่งคู่จากนั้นสร้างไฟล์ใหม่ที่มีชื่อเดียวกันคุณจะมีไฟล์สองไฟล์แยกกัน (ลิงก์หายไป) หากคุณลบเป้าหมายของ symlink และสร้างไฟล์ใหม่ด้วยชื่อเดียวกันลิงก์จะชี้ไปที่ไฟล์ใหม่
ลิงก์ "ยาก" ใช้ inode เดียวกันร่วมกัน
$ touch foo
$ ln foo foolink # Creates a hard link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink
ถ้าฉันแก้ไข foo หรือ foolink มีเพียงไฟล์เดียวและมันจะได้รับการอัปเดต หากฉันลบชื่อไฟล์เพียงชื่อเดียวไอโหนดและข้อมูลจะยังคงอยู่คนโง่จะอยู่รอด
$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink
ถ้าฉันจะสร้างเหมือนกัน แต่มีลิงค์ "อ่อน" หรือสัญลักษณ์แล้วมีหนึ่งไฟล์หนึ่ง inode และไฟล์ใหม่ที่มี inode ของตัวเองชี้ไปที่แรก
$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo
หากฉันแก้ไข foo หรือ foolink ยังคงมีเพียงไฟล์เดียวและจะอัปเดต
ถ้าฉันลบ symlink เฉพาะ inode และ data จะยังคงอยู่ หากฉันลบ foo ข้อมูลจะหายไป symlink จะยังคงอยู่ แต่ชี้ไปที่ไฟล์ที่ไม่มีอยู่
$ rm foo
removed `foo'
$ ls -l foo foolink
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo
ฮาร์ดลิงก์คือรายการไดเร็กทอรีเพิ่มเติมสำหรับไฟล์เดียวกัน นั่นหมายความว่า
ผู้แก้ไขหลายคนไม่ได้เขียนเนื้อหาใหม่ลงในไฟล์เดียวกันเมื่อทำการบันทึก แต่ทำตามขั้นตอนต่อไปนี้:
แบบแผนนี้หมายความว่าฮาร์ดลิงก์อื่น ๆ ไปยังไฟล์เดียวกันจะไม่ชี้ไปที่ไฟล์ปัจจุบันอีกต่อไป แต่เป็นเวอร์ชั่นก่อนหน้า (ซึ่งเป็นจริงแม้ในกรณีที่ตัวแก้ไขลบไฟล์เก่าเนื่องจากภายใต้ Unix "ลบ" ไฟล์ หมายถึงการลบลิงค์ของมันเฉพาะเมื่อลิงค์ที่ถูกลบเป็นลิงค์เดียวที่ไฟล์จริงจะถูกลบ)
เนื่องจากฮาร์ดลิงก์ไปยังไฟล์โดยตรงคุณสามารถเข้าถึงไฟล์นั้นได้แม้ว่าคุณจะไม่สามารถเข้าถึงตำแหน่งเดิมของไฟล์นั้น (เช่นเนื่องจากคุณไม่มีสิทธิ์ใด ๆ ในไดเรกทอรีที่มีรายการต้นฉบับอยู่) . สิทธิ์ที่ระบุการเข้าถึงของคุณคือสิทธิ์การเข้าถึงของไฟล์เอง (ซึ่งเชื่อมโยงกับไฟล์ไม่ใช่ลิงก์คุณไม่สามารถสร้างฮาร์ดลิงก์ที่มีสิทธิ์แตกต่างกันสำหรับไฟล์เดียวกัน) และสิทธิ์การเข้าถึงพา ธ ของฮาร์ดลิงก์ มีอยู่ใน (โดยพื้นฐานแล้วสิทธิในการดำเนินการของไดเรกทอรีที่ลิงค์นั้นมีอยู่และไดเรกทอรีหลักโดยตรงและโดยอ้อม)
ในทางกลับกันลิงก์สัญลักษณ์จัดเก็บชื่อพา ธ (ชื่อไปยังไฟล์ - หรือแทนรายการไดเรกทอรี - อาจรวมถึงเส้นทางเช่น/bin/sh
หรือหรือsubdir/foo.bar
) - ของไฟล์อื่น หากชื่อพา ธ นั้นสัมพันธ์กันมันจะแปลความสัมพันธ์กับไดเรกทอรีที่ลิงค์นั้นบรรจุอยู่เสมอนั่นหมายถึง:
ลิงก์สัญลักษณ์อาจอ้างถึงไฟล์ในระบบไฟล์ที่แตกต่างกัน (แม้จะเป็นระบบไฟล์ที่ไม่สนับสนุนฮาร์ดลิงก์หรือซอฟต์ลิงก์เช่น FAT)
หากไฟล์ต้นฉบับถูกลบลิงก์สัญลักษณ์จะไม่รักษาเนื้อหาไฟล์ เว้นแต่จะมีลิงค์ฮาร์ดอื่น ๆ ไปยังไฟล์เดียวกันเนื้อหาไฟล์จะหายไป ลิงก์สัญลักษณ์จะถูกทิ้งห้อยอยู่ (นั่นคืออ้างถึงชื่อพา ธ ที่ไม่สอดคล้องกับรายการไดเรกทอรี) ในทางกลับกันการลบลิงก์สัญลักษณ์จะไม่ส่งผลกระทบต่อไฟล์ต้นฉบับเนื่องจากจะอ้างถึงชื่อพา ธ เท่านั้น
หากไฟล์ต้นฉบับถูกย้ายหรือเปลี่ยนชื่อลิงค์สัญลักษณ์จะไม่ได้รับการอัพเดต แต่จะห้อยอยู่ทางซ้าย หากคุณย้ายลิงก์สัญลักษณ์ลิงก์จะหยุดก็ต่อเมื่อมันมีพา ธ สัมพัทธ์และพา ธ นั้นไม่สามารถใช้งานได้จากตำแหน่งใหม่
หากไฟล์ต้นฉบับถูกแทนที่ด้วยไฟล์ใหม่ที่มีชื่อเหมือนกัน (ดังในสถานการณ์ของบรรณาธิการที่อธิบายไว้ด้านบน) ลิงก์จะอ้างถึงไฟล์ใหม่
การใช้งานฮาร์ดลิงก์ส่วนใหญ่นั้นเป็นวิธีที่จะมีสำเนาไฟล์โดยไม่ต้องจัดเก็บเนื้อหาไฟล์สองครั้ง วิธีนี้ใช้ได้ผลดีที่สุดหากไฟล์ไม่เคยเปลี่ยนอีกเพราะจะทำให้ลิงก์เสียหายโดยไม่ตั้งใจได้ง่าย แน่นอนว่ามีหลายกรณีที่คุณต้องการให้ลิงก์เสียหายเช่นเดียวกับในกรณีที่มีการสำรองข้อมูลหลาย ๆ อย่าง: สำหรับไฟล์ที่มีการเปลี่ยนแปลงในการสำรองข้อมูลที่ใหม่กว่าคุณไม่ต้องการให้สำเนาในการสำรองข้อมูลเก่าเปลี่ยนไป
โดยปกติหากคุณต้องการลิงค์คุณจะใช้ลิงค์สัญลักษณ์ ตัวอย่างหนึ่งคือเมื่อคุณย้ายไดเรกทอรีไปยังพาร์ติชันอื่น (เนื่องจากมีการเปิดใช้งานเต็ม) คุณสามารถตั้งค่าลิงก์อ่อนจากตำแหน่งเดิมไปยังไดเรกทอรีใหม่ดังนั้นโปรแกรมใด ๆ ที่พยายามเข้าถึงไดเรกทอรีในที่เดิมจะ เข้าถึงได้ที่สถานที่ใหม่แทน สิ่งนี้อาจเป็นไปไม่ได้เมื่อมีลิงก์ที่ยาก อย่างไรก็ตามโปรดทราบว่าลิงก์สัญลักษณ์ในไดเรกทอรีที่ย้ายแล้วสามารถแตกได้หากมีเส้นทางสัมพันธ์ที่นำไปสู่ไดเรกทอรีที่ย้าย
HARD LINK (เฉพาะไฟล์) vs SOFT LINK (ไฟล์หรือไดเรกทอรี) เทียบกับ BIND (HARD LINK สำหรับไดเรกทอรี)
(ที่มา: freesoftwareservers.com )
ในขณะที่คำตอบของ daxelrod อธิบายคำถามได้ดีฉันคิดว่าภาพในกรณีนี้สร้างความแตกต่างอย่างมากโดยเฉพาะกับผู้เริ่มต้นที่ไม่เข้าใจ inodes และศัพท์แสง Linux ที่ซับซ้อน
คิดว่าสิ่งนี้ถ้าคุณ "ลบ" ทุกอย่างออกจากไดรฟ์คุณสามารถเรียกใช้ซอฟต์แวร์เพื่อกู้คืนข้อมูลเนื่องจาก 1 และ 0 ยังคงอยู่ที่นั่นคุณเพียงลบฮาร์ดลิงก์ทั้งหมด วัตถุประสงค์ของซอฟต์แวร์กู้คืนคือสร้างฮาร์ดลิงก์ใหม่เพื่อให้เข้าใจถึง 0 และ 1
ฉันอ่าน "หนึ่งสายการบิน" ที่ยิ่งใหญ่ซึ่งทำให้ทุกอย่างเข้าท่าและฉันต้องการแบ่งปัน!
ไฟล์ทั้งหมดใน Linux คือ "ฮาร์ดลิงค์" ไปยัง 0 และ 1 ของบนดิสก์ เมื่อคุณสร้างข้อมูล (& ของ 0) ระบบปฏิบัติการจะสร้างฮาร์ดลิงก์ในทรีไฟล์เพื่ออ้างอิงถึงจุดนั้นบนฮาร์ดดิสก์
คุณอาจสร้างฮาร์ดลิงก์อื่นและลบไฟล์ต้นฉบับและคุณยังสามารถเข้าถึงฮาร์ดลิงก์ที่สร้างขึ้นใหม่ได้
หากคุณลบ HARD LINK 1 คุณคิดว่า SOFT LINK จะใช้งานได้หรือไม่ ไม่ระบบปฏิบัติการจะรายงานกลับมาว่า HARD LINK 1 ไม่มีอยู่
ในทางกลับกันถ้าคุณลบ SOFT LINK HARD LINK จะทำงานหรือไม่ ใช่. ตราบใดที่ระบบปฏิบัติการมีไฟล์ HARD LINK ไฟล์เดียวมันจะรายงานว่าการเติมนั้นยังไม่ถูกลบ
- มูลค่าการค้นคว้า / สังเกตคือ BIND วิธีการผูกสองไดเรกทอรีเช่น symlinking สองไดเรกทอรี แต่โปร่งใสสำหรับ OS (ระบบปฏิบัติการสามารถบอกได้เมื่อคุณ Symlink และบางคนมีกฎเกี่ยวกับสภาพอากาศที่พวกเขาสามารถติดตาม Symlink) มันใช้ Mount ไม่ใช่ LS และสามารถกำหนดค่าผ่าน FSTAB
ฮาร์ดลิงก์จะเก็บไฟล์ไว้ในดิสก์จนกระทั่งฮาร์ดลิงก์ทั้งหมดไปถึงแม้ไฟล์แรก ("ชื่อไฟล์" คือเทคนิคฮาร์ดลิงก์) จะถูกลบ ซอฟต์ลิงก์สามารถทิ้งไว้ "ห้อย" จนกว่าไฟล์นั้นจะชี้ไปที่ (s / ed) เพื่อถูกแทนที่
นี่เป็นคำถามที่เก่ามาก แต่ฉันมีกรณีการใช้งานที่ต้องการให้ฉันใช้ฮาร์ดลิงก์
ฉันเป็นนักดนตรีดังนั้นฉันจึงมีไฟล์เสียงมากมายหลายประเภทในฮาร์ดไดรฟ์หลายตัวที่ติดกับ Mac ของฉัน เทราไบต์ ฉันให้พวกเขาส่วนใหญ่จัดระเบียบอย่างดีกับไดเรกทอรี symlink เพื่อให้ฉันสามารถค้นหาพวกเขาโดยผู้เผยแพร่เนื้อหาสไตล์ / เสียงและเกณฑ์อื่น ๆ ตามที่ฉันคิดในเวลานั้น น่าเสียดายที่โปรแกรมหนึ่งที่ฉันใช้ Ableton Live ไม่สามารถดูนามแฝงหรือ symlink จากเบราว์เซอร์ไฟล์ได้อย่างสมบูรณ์ วิธีแก้ปัญหาเดียวที่ฉันพบคือการสร้างฮาร์ดลิงก์ของไดเรกทอรีที่ฉันต้องการให้สามารถดูได้จากนั้นทุกอย่างก็ใช้งานได้ดี
ดังนั้นนี่เป็นอีกกรณีเมื่อคุณอาจต้องใช้ฮาร์ดลิงก์ซึ่งอาจไม่เกิดกับผู้อื่น