อะไรคือความแตกต่างระหว่างลิงค์สัญลักษณ์และลิงค์ยาก?


768

เมื่อเร็ว ๆ นี้ฉันถูกถามในระหว่างการสัมภาษณ์งาน ฉันซื่อสัตย์และบอกว่าฉันรู้ว่าลิงก์สัญลักษณ์ทำงานอย่างไรและสร้างอย่างไร แต่ไม่เข้าใจการใช้ฮาร์ดลิงก์และวิธีการเชื่อมโยงนั้นแตกต่างจากลิงก์สัญลักษณ์อย่างไร


2
เกี่ยวกับ 'ไม่เข้าใจการใช้ฮาร์ดลิงก์' สามารถใช้ในระบบการสร้างที่ทำสำเนาไบนารีจำนวนมาก การสร้างฮาร์ดลิ้งค์แทนการทำสำเนาที่เกิดขึ้นจริง MSBuild 4.0 รองรับสิ่งนี้
Ankush

13
ฉันพบลิงค์นี้มีประโยชน์มากที่จะเข้าใจ askubuntu.com/questions/108771/…
kta

2
unix.stackexchange มีรายการของสัญลักษณ์แสดงหัวข้อย่อยที่ดี ... เป็นประโยชน์มากเพราะมันวางข้อ จำกัด ทั้งหมดที่รัดกุมและง่ายต่อการอ่าน (กระสุนจำนวนมากเหล่านี้ครอบคลุมกรณีขอบ / คำเตือนที่กล่าวถึงเฉพาะในความคิดเห็นของคำถามนี้ ... หรือไม่ได้กล่าวถึงเลย)
Trevor Boyd Smith

คำตอบ:


779

ภายใต้ระบบไฟล์ไฟล์จะแสดงโดย inodes (หรือเป็นหลาย inodes หรือไม่แน่ใจ)

ไฟล์ในระบบไฟล์นั้นเป็นลิงค์ไปยังไอโหนด
ฮาร์ดลิงก์จากนั้นสร้างไฟล์อื่นที่มีลิงก์ไปยังไอโหนดพื้นฐานเดียวกัน

เมื่อคุณลบไฟล์มันจะลบหนึ่งลิงก์ไปยัง inode ที่สำคัญ ไอโหนดจะถูกลบเท่านั้น (หรือลบ / เขียนทับได้) เมื่อลิงก์ทั้งหมดไปยังไอโหนดถูกลบไปแล้ว

ลิงก์สัญลักษณ์คือลิงก์ไปยังชื่ออื่นในระบบไฟล์

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

หมายเหตุ: ฮาร์ดลิงก์ใช้ได้ภายในระบบไฟล์เดียวกันเท่านั้น ลิงก์สัญลักษณ์สามารถขยายระบบไฟล์ได้เนื่องจากเป็นเพียงชื่อของไฟล์อื่น


2
ฉันแน่ใจว่า i-nodes ขึ้นอยู่กับตัวแปรเฉพาะของระบบปฏิบัติการ อย่างไรก็ตามฉันเชื่อว่ามันมักจะเป็น i-node เดียว i-node มีข้อมูลเกี่ยวกับไฟล์และข้อมูลเกี่ยวกับที่เก็บข้อมูลบนดิสก์ ไฟล์ขนาดใหญ่จะมีตัวชี้ทางอ้อมไปยังตารางเพิ่มเติม
terson

76
คุณอาจต้องการเพิ่มคุณสมบัติที่มีประโยชน์ที่ลิงก์สัญลักษณ์สามารถข้ามระบบไฟล์ฮาร์ดลิงก์ไม่สามารถ (ต้องอ้างถึงไฟล์ในระบบไฟล์เดียวกัน)
paxdiablo

52
มีคำอธิบายภาพที่ดีในบทความเกี่ยวกับ Linux Gazette
Rodrigue

1
ฉันยังเขียนบล็อกเกี่ยวกับสิ่งนั้นหลังจากอ่านและทดลองcsharpbsharp.tumblr.com
Adnan Bhatti

1
@zen: คุณสามารถยกเลิกการต่อเชื่อม / ติดตั้งระบบไฟล์ใหม่ได้ตลอดเวลาที่ไม่ได้ใช้งาน สำหรับพาร์ติชั่นรูทนี่ค่อนข้างยุ่งยาก แต่ก็สามารถทำได้ (ไม่แนะนำ) หากต้องการทำเพื่อรูทปกติแล้วการบูตซีดี Rescuse จะเป็นการดีที่สุดก่อนแก้ไขการเมาท์และรีบูต แต่คุณควรถามคำถามแบบนี้กับผู้ใช้ระดับสูง
Martin York

464

สัญชาตญาณที่ดีที่อาจช่วยได้โดยใช้คอนโซล Linux (ish)

สร้างสองไฟล์:

$ touch foo; touch bar

ป้อนข้อมูลบางส่วนลงในพวกเขา:

$ echo "Cat" > foo
$ echo "Dog" > bar

(อันที่จริงแล้วฉันสามารถใช้เสียงสะท้อนได้ตั้งแต่แรกเพราะมันจะสร้างไฟล์ถ้ามันไม่มีตัวตน ... แต่ไม่เป็นไรหรอก)

และตามที่คาดไว้:

$cat foo; cat bar
Cat
Dog

มาสร้างลิงก์ที่แข็งและอ่อนนุ่มกันเถอะ:

$ ln foo foo-hard
$ ln -s bar bar-soft

มาดูกันว่าเกิดอะไรขึ้น:

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

การเปลี่ยนชื่อของ foo ไม่สำคัญ:

$ mv foo foo-new
$ cat foo-hard
Cat

foo-hard ชี้ไปที่ไอโหนด, เนื้อหา, ของไฟล์ - ที่ไม่เปลี่ยนแปลง

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-soft: No such file or directory

ไม่พบเนื้อหาของไฟล์เนื่องจากซอฟต์ลิงก์ชี้ไปที่ชื่อที่ถูกเปลี่ยนแปลงและไม่ไปที่เนื้อหา

เช่นเดียวกันหากfooถูกลบfoo-hardยังคงมีเนื้อหาอยู่ หากbarถูกลบbar-softเป็นเพียงลิงค์ไปยังไฟล์ที่ไม่มีอยู่


12
นี่หมายความว่า "ไฟล์" และ "ฮาร์ดลิงก์" เหมือนกันทั้งคู่ชี้ไปที่ไอโหนดหรือไม่? ในการลบไฟล์หรือลิงค์ยากเนื้อหายังคงมีอยู่ตราบเท่าที่ยังคงชี้ไปที่ไอโหนดหรือไม่
Daniel W.

1
@DanFromGermany ถูกต้อง เนื้อหาสามารถเข้าถึงได้ตราบใดที่ฮาร์ดลิงก์อย่างน้อยหนึ่งลิงก์ (เช่นไฟล์) ชี้ไปที่เนื้อหานั้น
Adam Matan

6
touch blah1; touch blah2สามารถย่อให้เล็กลงได้touch blah1 blah2
Dmitri Zaitsev

11
@DmitriZaitsev จริง แต่มันจะอ่านง่ายสำหรับผู้เริ่มต้น IMO
Adam Matan

8
ฉันคิดว่านี่เป็นคำตอบที่เข้าใจได้ดีที่สุดเกี่ยวกับคำตอบมากมายที่ฉันอ่าน ตัวอย่างนั้นดีกว่าข้อความอธิบายจำนวนมาก
Scott Chu

435

เมื่อพูดไปรูปภาพก็มีค่าหนึ่งพันคำ นี่คือวิธีที่ฉันเห็นภาพ:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือวิธีที่เราได้รับภาพนั้น:

  1. สร้างชื่อmyfile.txtในระบบไฟล์ที่ชี้ไปที่ inode ใหม่ (ซึ่งมีข้อมูลเมตาสำหรับไฟล์และชี้ไปที่บล็อกของข้อมูลที่มีเนื้อหาเช่นข้อความ "Hello, World!":

    $ echo 'Hello, World!' > myfile.txt
    
  2. สร้างฮาร์ดลิงก์my-hard-linkไปยังไฟล์myfile.txtซึ่งหมายถึง "สร้างไฟล์ที่ควรชี้ไปที่ไอโหนดเดียวกันกับที่myfile.txtชี้ไปที่":

    $ ln myfile.txt my-hard-link
    
  3. สร้างซอฟต์ลิงค์my-soft-linkไปยังไฟล์myfile.txtซึ่งหมายถึง "สร้างไฟล์ที่ควรชี้ไปที่ไฟล์myfile.txt":

    $ ln -s myfile.txt my-soft-link
    

ดูว่าจะเกิดอะไรขึ้นหากmyfile.txtถูกลบ (หรือย้าย): my-hard-linkยังคงชี้ไปที่เนื้อหาเดียวกันและไม่ได้รับผลกระทบใด ๆ ในขณะmy-soft-linkนี้ชี้ไปที่ไม่มีอะไรเลย คำตอบอื่น ๆ พูดถึงข้อดี / ข้อเสียของแต่ละข้อ


3
@ThunderWiring โดย "จุด" ฉันหมายถึงสิ่งที่อ้างอิงลิงค์ ในกรณีของฮาร์ดลิงก์จะอ้างอิง inode โดยตรง (เช่น inode เดียวกันที่อ้างอิงโดยmyfile.txt) สำหรับ soft link การอ้างอิงไม่ใช่ inode (ซึ่งมีข้อมูล) แต่เป็นการอ้างอิงคือพา ธ ของระบบไฟล์ไปยังmyfile.txt(เช่น/home/Documents/myfile.txt)
akivajgordon

4
ฉันชอบการตอบสนองต่อภาพของคุณ @akivajgordon - ช่วยให้ฉันเข้าใจความแตกต่างได้ดียิ่งขึ้น!
wmock

7
หมื่นคำ!
SaganRitual

13
บางทีฉันอาจจะช้า แต่รูปภาพของคุณเพิ่งลบล้างความลึกลับ 20 ปีในเวลาประมาณ 2 วินาที
jdk1.0

3
คำตอบที่มีประโยชน์ที่สุดฉันบ้านี่ฝังลึกในโพสต์นี้มาก ฉันจะให้คะแนนอินเทอร์เน็ตเป็นร้อยคะแนนแก่คุณ แต่น่าเสียดายที่ฉันสามารถให้คุณได้เพียงหนึ่งคะแนนเท่านั้น
Dagrooms

71

ฮาร์ดลิงก์มีประโยชน์เมื่อไฟล์ต้นฉบับถูกย้ายไปมา ตัวอย่างเช่นการย้ายไฟล์จาก / bin ไปยัง / usr / bin หรือไปที่ / usr / local / bin symlink ใด ๆ ที่ไปยังไฟล์ใน / bin จะถูกทำลายโดยสิ่งนี้ แต่ฮาร์ดลิงก์ซึ่งเป็นลิงก์โดยตรงไปยัง inode สำหรับไฟล์นั้นจะไม่สนใจ

ฮาร์ดลิงก์อาจใช้พื้นที่ดิสก์น้อยลงเนื่องจากใช้เฉพาะรายการไดเรกทอรีในขณะที่ symlink ต้องการ inode ของตัวเองเพื่อเก็บชื่อที่ชี้ไป

ฮาร์ดลิงก์ยังใช้เวลาในการแก้ไขน้อยลง - symlink สามารถชี้ไปที่ symlink อื่น ๆ ที่อยู่ในไดเรกทอรี symlinked และสิ่งเหล่านี้บางอย่างอาจอยู่ใน NFS หรือระบบไฟล์ความหน่วงสูงอื่น ๆ และอาจส่งผลให้ปริมาณการใช้เครือข่ายได้รับการแก้ไข ฮาร์ดลิงก์ซึ่งอยู่ในระบบไฟล์เดียวกันมักจะได้รับการแก้ไขในการค้นหาครั้งเดียวและไม่เคยเกี่ยวข้องกับเวลาแฝงเครือข่าย (หากเป็นฮาร์ดลิงก์บนระบบไฟล์ NFS เซิร์ฟเวอร์ NFS จะทำการแก้ไขและจะมองไม่เห็น ระบบไคลเอนต์) บางครั้งสิ่งนี้สำคัญ ไม่ใช่สำหรับฉัน แต่ฉันสามารถจินตนาการระบบที่มีประสิทธิภาพสูงซึ่งนี่อาจสำคัญ

ฉันคิดว่าสิ่งต่าง ๆ เช่น mmap (2) และแม้กระทั่ง open (2) ใช้ฟังก์ชั่นเดียวกับ hardlinks เพื่อให้ inode ของไฟล์ทำงานอยู่ดังนั้นแม้ว่าไฟล์จะถูกยกเลิกการเชื่อมโยง (2) ed, inode ยังคงอนุญาตให้กระบวนการเข้าถึงต่อไปได้ และเมื่อกระบวนการปิดไฟล์จะหายไปจริงๆ สิ่งนี้ช่วยให้ไฟล์ชั่วคราวปลอดภัยมากขึ้น (ถ้าคุณสามารถเปิดและยกเลิกการเชื่อมโยงให้เกิดขึ้นแบบ atomically ซึ่งอาจมี POSIX API สำหรับที่ฉันจำไม่ได้แล้วคุณมีไฟล์ชั่วคราวที่ปลอดภัยจริงๆ) ซึ่งคุณสามารถอ่าน / เขียนได้ ข้อมูลของคุณโดยไม่มีใครสามารถเข้าถึงได้ นั่นเป็นเรื่องจริงมาก่อน / proc ทำให้ทุกคนสามารถดูไฟล์อธิบายของคุณได้ แต่นั่นเป็นอีกเรื่องหนึ่ง

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


35

ซอฟต์ลิงค์ :

soft หรือ symbolic เป็นทางลัดไปยังไฟล์ต้นฉบับมากขึ้น ... ถ้าคุณลบไฟล์ต้นฉบับทางลัดจะล้มเหลวและถ้าคุณลบเฉพาะทางลัดไม่มีอะไรเกิดขึ้นกับไฟล์ต้นฉบับ

ซอฟต์ลิงค์ไวยากรณ์ :ln -s Pathof_Target_file link

ผลผลิต: link -> ./Target_file

หลักฐาน: readlink link นอกจากนี้ในls -l linkผลลัพธ์คุณจะเห็นตัวอักษรตัวแรกlrwxrwxrwxเป็นlซึ่งเป็นการบ่งชี้ว่าไฟล์นั้นเป็นซอฟต์ลิงค์

การลบลิงค์: unlink link

หมายเหตุ:หากคุณต้องการ softlink ของคุณสามารถทำงานได้แม้หลังจากย้ายไปที่อื่นจาก dir ปัจจุบัน ตรวจสอบให้แน่ใจว่าคุณกำหนดเส้นทางที่แน่นอนและไม่ใช่เส้นทางที่สัมพันธ์กันในขณะที่สร้างซอฟต์ลิงค์ ie (เริ่มต้นจาก / รูท / ผู้ใช้ / Target_file และไม่. /Target_file)

ฮาร์ดลิงก์:

ฮาร์ดลิงก์เป็นสำเนามิรเรอร์หรือหลายพา ธ ไปยังไฟล์เดียวกัน ทำอะไรกับไฟล์ 1 และมันปรากฏในไฟล์ 2 การลบอันใดอันหนึ่งก็ยังคงใช้ได้อยู่

inode (หรือไฟล์) จะถูกลบเฉพาะเมื่อลิงก์ (ฮาร์ด) ทั้งหมดหรือพา ธ ทั้งหมดไปยัง inode (ไฟล์เดียวกัน) ถูกลบ

เมื่อสร้างฮาร์ดลิงก์ลิงก์นั้นจะมี inode ของไฟล์ต้นฉบับ การลบการเปลี่ยนชื่อหรือย้ายไฟล์ต้นฉบับจะไม่มีผลกับฮาร์ดลิงก์เนื่องจากลิงก์ไปยัง inode ที่อยู่ภายใต้ การเปลี่ยนแปลงใด ๆ กับข้อมูลบนไอโหนดจะสะท้อนให้เห็นในไฟล์ทั้งหมดที่อ้างถึงไอโหนดนั้น

ไวยากรณ์ฮาร์ดลิงก์ :ln Target_file link

เอาต์พุต:ไฟล์ที่มีลิงก์ชื่อจะถูกสร้างขึ้นด้วยหมายเลขไอโหนดเดียวกันกับ Targetfile

พิสูจน์: ls -i link Target_file (ตรวจสอบ inodes ของพวกเขา)

การลบลิงค์: rm -f link (ลบลิงค์เหมือนไฟล์ปกติ)

หมายเหตุ : ลิงก์สัญลักษณ์สามารถขยายระบบไฟล์ได้เนื่องจากเป็นเพียงชื่อของไฟล์อื่น ในขณะที่ฮาร์ดลิงก์สามารถใช้ได้ภายในระบบไฟล์เดียวกันเท่านั้น

ลิงก์สัญลักษณ์มีคุณสมบัติบางอย่างที่ลิงก์หายไป:

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

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • ฮาร์ดลิงก์ไม่สามารถชี้ไปยังไดเรกทอรีได้

ฮาร์ดลิงก์มีข้อ จำกัด สองประการ:

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

3
"ในขณะที่ขนาดของฮาร์ดลิงก์คือขนาดของเนื้อหาในขณะที่ซอฟต์ลิงก์กำลังมีขนาดชื่อไฟล์" เพียงชี้แจงให้ชัดเจนการสร้างฮาร์ดลิงก์อื่นจะส่งผลต่อพื้นที่ว่างเพียงไม่กี่ไบต์
Ingo

34

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

ดังนั้นหากเรามีไฟล์ชื่อ "a" และสร้างฮาร์ดลิงก์ "b" และลิงก์สัญลักษณ์ "c" ซึ่งทั้งหมดอ้างถึงไฟล์ "a":

echo "111" > a
ln a b
ln -s a c

ผลลัพธ์ของ "a", "b" และ "c" จะเป็น:

cat a --> 111
cat b --> 111
cat c --> 111

ตอนนี้ให้ลบไฟล์ "a" และดูว่าเกิดอะไรขึ้นกับผลลัพธ์ของ "a", "b" และ "c":

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

แล้วเกิดอะไรขึ้น?

เนื่องจากไฟล์ "c" ชี้ไปที่ไฟล์ "a" เองหากไฟล์ "a" ถูกลบไปแล้วไฟล์ "c" จะไม่มีอะไรให้ชี้ไปที่จริงแล้วมันถูกลบด้วยเช่นกัน

อย่างไรก็ตามไฟล์ "b" ชี้ไปที่ตำแหน่งของที่เก็บข้อมูลหรือ inode ของไฟล์ "a" ดังนั้นหากไฟล์ "a" ถูกลบมันจะไม่ชี้ไปที่ไอโหนดอีกต่อไป แต่เนื่องจากไฟล์ "b" ทำอยู่ inode จะทำการเก็บเนื้อหาใด ๆ ที่เป็นของ "a" ต่อไปจนกว่าจะไม่มีฮาร์ดลิงก์ชี้ไปที่อีกต่อไป


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

28

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

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


นอกจากนี้เมื่อคุณลบไฟล์ที่คุณเชื่อมโยงลิงก์สัญลักษณ์จะใช้งานไม่ได้ลิงก์ถาวรจะยังคงใช้งานได้เพราะจะ "เก็บ" ไฟล์ในระบบไฟล์
njsf

21

ฉันจะชี้คุณไปที่ Wikipedia:

คะแนนน้อย:

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

1
ในทางทฤษฎี (และในบางกรณีแม้แต่ในทางปฏิบัติ) ฮาร์ดลิงก์สามารถชี้ไปยังไดเรกทอรีได้เช่นกัน (ในความเป็นจริง "." คือฮาร์ดลิงก์ไปยังไดเรกทอรีปัจจุบันและ ".. " เป็นฮาร์ดลิงก์ไปยังไดเรกทอรีแม่) แต่มันอาจเป็นอันตรายได้ดังนั้นยูนิกซ์ส่วนใหญ่จึงไม่อนุญาตให้ใช้ (หรือกำหนดให้คุณต้องทำตามขั้นตอนพิเศษเพื่อดำเนินการ) Apple ใช้พวกเขาสำหรับการปรับใช้ไทม์แมชชีน: earthlingsoft.net/ssp/blog/2008/03/x5_time_machine
Joachim Sauer

3
คุณกำลังชี้ไปที่ลิงก์ไปยังบทความ ... นั่นทำให้คุณเป็นลิงค์สัญลักษณ์หรือไม่?
Ian Campbell

@JoachimSauer คุณคิดว่าระบบไฟล์ Apple ใหม่จะไม่จำเป็นต้องใช้ Time Machine ในการใช้ฮาร์ดลิงก์ไปยังไดเรกทอรีหรือไม่?
cjm

ฉันพบคำอธิบายของวิกิพีเดียสั้นกว่าและเป็นรูปธรรมมากกว่าคำอธิบายในคำตอบที่ได้รับคะแนนมากที่สุด
ทะเลสาบ

9

ฮาร์ดลิงก์มีประโยชน์มากเมื่อทำการสำรองข้อมูลเพิ่มเติม ดูrsnapshotตัวอย่างเช่น แนวคิดคือการทำสำเนาโดยใช้ฮาร์ดลิงก์:

  • คัดลอกหมายเลขสำรอง n ถึง n + 1
  • คัดลอกข้อมูลสำรอง n - 1 ถึง n
  • ...
  • คัดลอกข้อมูลสำรอง 0 เป็นข้อมูลสำรอง 1
  • อัปเดตการสำรองข้อมูล 0 ด้วยไฟล์ที่มีการเปลี่ยนแปลง

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


6

ฮาร์ดลิงก์ vs ซอฟท์ลิงค์

ฮาร์ดลิงก์ Vs ซอฟท์ลิงค์สามารถอธิบายได้อย่างง่ายดายจากภาพนี้


5
ฉันเดารูป soft link ของคุณไม่ถูกต้อง จุด: inode ของซอฟต์ลิงค์ไม่ควรชี้ไปที่ไอโหนดของไฟล์ดั้งเดิม สาเหตุหากคุณเปลี่ยนชื่อไฟล์ต้นฉบับลิงค์อ่อนที่เกี่ยวข้องนั้นจะตาย
percy507

@ percy507 ใช่คุณพูดถูก แต่ฉันก็ยังพบว่ามันเป็นคำอธิบายที่ดีและเข้าใจง่าย แค่คิดว่าลูกศรระหว่าง
Michael Litvin

5

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


ระบบที่กระจายด้วยจุดเมานท์ในสถานที่ต่างกันในระบบที่ต่างกัน แน่นอนว่าสิ่งนี้สามารถออกแบบได้โดยระบบที่สอดคล้องกัน
terson

ฉันคิดว่า @Tanktalus เป็นตัวอย่างที่ดี
Nick Stinemates

4

จากMSDN ,

ลิงก์สัญลักษณ์

ลิงก์สัญลักษณ์เป็นวัตถุระบบไฟล์ที่ชี้ไปยังวัตถุระบบไฟล์อื่น วัตถุที่ถูกชี้ไปที่เรียกว่าเป้าหมาย

ลิงก์สัญลักษณ์มีความโปร่งใสสำหรับผู้ใช้ ลิงก์ปรากฏเป็นไฟล์หรือไดเรกทอรีปกติและสามารถดำเนินการโดยผู้ใช้หรือแอปพลิเคชันในลักษณะเดียวกัน

ลิงก์สัญลักษณ์ถูกออกแบบมาเพื่อช่วยในการโยกย้ายและความเข้ากันได้ของโปรแกรมประยุกต์กับระบบปฏิบัติการ UNIX Microsoft ได้ติดตั้งลิงก์สัญลักษณ์เพื่อให้ทำงานเหมือนกับลิงก์ UNIX

ลิงก์สัญลักษณ์อาจเป็นลิงก์แบบสัมบูรณ์หรือแบบสัมพัทธ์ ลิงก์แบบสัมบูรณ์คือลิงก์ที่ระบุชื่อพา ธ แต่ละส่วน ลิงก์ที่สัมพันธ์กันจะถูกกำหนดโดยสัมพันธ์กับที่ซึ่งตัวระบุความสัมพันธ์ –Link อยู่ในพา ธ ที่ระบุ

ตัวอย่างของลิงค์สัญลักษณ์แอบโซลูท

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

ตัวอย่างของลิงค์สัญลักษณ์สัมพัทธ์

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

ฮาร์ดลิงก์

การเชื่อมโยงอย่างหนักคือการแสดงระบบแฟ้มของแฟ้มโดยที่เส้นทางมากกว่าหนึ่งอ้างอิงไฟล์เดียวในปริมาณเดียวกัน

หากต้องการสร้างฮาร์ดลิงก์ใน windows ให้นำทางไปยังตำแหน่งที่จะสร้างลิงก์และป้อนคำสั่งนี้:

mklink /H Link_name target_path

โปรดทราบว่าคุณสามารถลบการเชื่อมโยงฮาร์ดลำดับใดก็ได้โดยไม่คำนึงถึงลำดับที่ถูกสร้างขึ้น นอกจากนี้ฮาร์ดลิงก์ไม่สามารถสร้างได้เมื่อ

  • การอ้างอิงอยู่ในไดรฟ์ภายในเครื่องอื่น
  • การอ้างอิงรวมถึงไดรฟ์เครือข่าย อีกนัยหนึ่งหนึ่งในการอ้างอิงคือไดรฟ์เครือข่าย
  • ฮาร์ดลิงก์ที่จะสร้างนั้นอยู่ในเส้นทางเดียวกันกับเป้าหมาย

ทางแยก

NTFS รองรับลิงค์ประเภทอื่นที่เรียกว่าจังก์ชัน MSDN กำหนดดังต่อไปนี้:

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

ส่วนที่เป็นตัวหนาในส่วนฮาร์ดลิงก์และส่วนหัวต่อแสดงความแตกต่างพื้นฐานระหว่างสองส่วน

คำสั่งเพื่อสร้างจุดเชื่อมต่อใน windows นำทางไปยังตำแหน่งที่จะสร้างลิงก์จากนั้นป้อน:

mklink /J link_name target_path

3

นอกจากนี้:

  1. ประสิทธิภาพการอ่านของฮาร์ดลิงก์ดีกว่าลิงก์สัญลักษณ์ (micro-performance)
  2. ลิงก์สัญลักษณ์สามารถคัดลอก, ควบคุมเวอร์ชัน, .. เป็นต้น กล่าวอีกนัยหนึ่งมันเป็นไฟล์จริง ในอีกด้านหนึ่งฮาร์ดลิงก์เป็นสิ่งที่อยู่ในระดับต่ำกว่าเล็กน้อยและคุณจะพบว่าเมื่อเทียบกับลิงก์สัญลักษณ์มีเครื่องมือน้อยกว่าที่ให้วิธีการทำงานกับฮาร์ดลิงก์เป็นฮาร์ดลิงก์ไม่ใช่ไฟล์ปกติ

3

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

Symbolic link (symlink): เป็นตัวชี้ไฟล์ไปยังไฟล์อื่นหากลิงก์สัญลักษณ์ชี้ไปยังไฟล์ที่มีอยู่ซึ่งถูกลบในภายหลังลิงก์สัญลักษณ์จะยังคงชี้ไปที่ชื่อไฟล์เดียวกันแม้ว่าชื่อจะไม่มีชื่อไฟล์ใด ๆ อีกต่อไป


3

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

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

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


2

รายการไดเรกทอรีคือการเชื่อมโยง structrue:

struct dentry{
    ino_t ino;
    char  name[256];
}

ino คือจำนวน inode, ชื่อคือชื่อไฟล์, โครงสร้าง inode อาจจะชอบ:

struct inode{
      link_t nlink; 
      ...
}

ตัวอย่างเช่นคุณสร้างไฟล์ / 1 รายการไดเรกทอรีอาจชอบ:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

struct inode อาจจะชอบ:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

จากนั้นคุณสร้างฮาร์ดลิงก์ (อาจเป็น / 100), รายการไดเรกทอรีอาจจะ:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

struct inode อาจจะชอบ:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

จากนั้นคุณสร้างลิงก์สัญลักษณ์ (อาจเป็น / 200) ไปยังไฟล์ 1 รายการไดเรกทอรีอาจจะคล้ายกับ:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

struct inode อาจจะชอบ:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */

2

เมื่อเพิ่มคำตอบข้างต้นทั้งหมดความแตกต่างในการค้นหาไฟล์ hardlink และ softlink สามารถเข้าใจได้ดังต่อไปนี้:

ฉันมีไฟล์f6ในไดเรกทอรีปัจจุบันของฉันเช่นเดียวกับไดเรกทอรีชื่อt2ในไดเรกทอรีปัจจุบันของฉันเช่นเดียวกับไดเรกทอรีชื่อ

ชื่อไฟล์f1และ./t2/f2เป็นลิงก์สัญลักษณ์ไปยังf6มีการเชื่อมโยงสัญลักษณ์

ชื่อไฟล์f7และ./t2/f8เป็นลิงก์ที่ยากของf6มีการเชื่อมโยงอย่างหนักของ

เพื่อหาลิงก์อ่อนและแข็งเราสามารถใช้:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

ในการค้นหาฮาร์ดลิงค์เดียวที่เราสามารถใช้:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

เนื่องจากสามารถสร้างลิงก์บนระบบไฟล์เดียวกันได้เราจึงสามารถค้นหาลิงก์ทั้งหมดโดยไม่-Lใช้ตัวเลือก (ด้วย-xdevตัวเลือก) ในระบบไฟล์ / จุดเมานท์เดียวกัน มันบันทึกการค้นหาที่ไม่จำเป็นลงในจุดยึดต่าง ๆ

ดังนั้นการค้นหา hardlink ค่อนข้างเร็วกว่านั้นจากนั้นค้นหา softlink (โปรดแก้ไขถ้าฉันผิดหรือไม่ชัดเจน)


1

ลิงก์สัญลักษณ์ให้ชื่ออื่นกับไฟล์ในลักษณะคล้ายกับลิงก์ยาก แต่ไฟล์สามารถลบได้แม้ว่าจะมีลิงก์สัญลักษณ์เหลืออยู่


ไม่ symlink ไม่ใช่ "ชื่ออื่นสำหรับไฟล์เดียวกัน" เป็นไฟล์ในสิทธิของตนเองเชื่อมโยงไปยังไฟล์เป้าหมาย
Kusalananda

1

การใช้งานสองเซ็นต์ของฉัน:

ซอฟต์ลิงก์อาจถูกใช้เพื่อย่นชื่อพา ธ แบบยาวเช่น:

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

การเปลี่ยนแปลงที่ทำกับ/short/file.txtจะถูกนำไปใช้กับไฟล์ต้นฉบับ

ฮาร์ดลิงก์อาจใช้เพื่อย้ายไฟล์ขนาดใหญ่:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

คัดลอกไปยังโฟลเดอร์อื่นทันทีและไฟล์ต้นฉบับ (เปิด/myapp/dev) อาจถูกย้ายหรือลบโดยไม่ต้องแตะที่ไฟล์/myapp/prd


0

ฉันเพิ่งพบวิธีง่าย ๆ ในการทำความเข้าใจกับฮาร์ดลิงก์ในสถานการณ์ทั่วไปติดตั้งซอฟต์แวร์

วันหนึ่งฉันดาวน์โหลดซอฟต์แวร์ไปยังโฟลเดอร์Downloadsเพื่อติดตั้ง หลังจากที่ฉันทำsudo make installบาง executables ถูกcped ไปยังโฟลเดอร์ถังขยะท้องถิ่น ที่นี่cpจะสร้างการเชื่อมโยงอย่างหนัก ฉันมีความสุขกับซอฟต์แวร์ แต่ในไม่ช้าก็รู้ว่านั่นDownloadsไม่ใช่สถานที่ที่ดีในระยะยาว ดังนั้นฉันจะmvแก้ไขโฟลเดอร์ซอฟต์แวร์ไปยัง sourceไดเรกทอรี ฉันยังคงสามารถใช้งานซอฟต์แวร์ได้เหมือนเดิมโดยไม่ต้องกังวลเกี่ยวกับสิ่งที่ลิงก์เป้าหมายเช่นใน Windows ซึ่งหมายความว่าฮาร์ดลิงก์จะค้นหา inode โดยตรงและไฟล์อื่น ๆ


0

ในคำตอบนี้เมื่อฉันพูดไฟล์ฉันหมายถึงตำแหน่งในหน่วยความจำ

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

ลิงก์สัญลักษณ์เป็นไฟล์ชนิดพิเศษเนื่องจากมันเป็นไฟล์ที่จะมีชื่อไฟล์และหมายเลขไอโหนดดังกล่าวข้างต้นหมายเลขไอโหนดจะเพิ่มไอโหนดซึ่งชี้ไปที่ข้อมูลตอนนี้สิ่งที่ทำให้ลิงก์สัญลักษณ์พิเศษคือ inodenumbers ในลิงก์สัญลักษณ์เข้าถึง inodes เหล่านั้นซึ่งชี้ไปที่ "พา ธ " ไปยังไฟล์อื่นโดยเฉพาะหมายเลขไอโหนดในลิงก์สัญลักษณ์จะเพิ่มจำนวนไอโหนดเหล่านั้นซึ่งชี้ไปยังฮาร์ดลิงก์อื่น

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

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