เมื่อเร็ว ๆ นี้ฉันถูกถามในระหว่างการสัมภาษณ์งาน ฉันซื่อสัตย์และบอกว่าฉันรู้ว่าลิงก์สัญลักษณ์ทำงานอย่างไรและสร้างอย่างไร แต่ไม่เข้าใจการใช้ฮาร์ดลิงก์และวิธีการเชื่อมโยงนั้นแตกต่างจากลิงก์สัญลักษณ์อย่างไร
เมื่อเร็ว ๆ นี้ฉันถูกถามในระหว่างการสัมภาษณ์งาน ฉันซื่อสัตย์และบอกว่าฉันรู้ว่าลิงก์สัญลักษณ์ทำงานอย่างไรและสร้างอย่างไร แต่ไม่เข้าใจการใช้ฮาร์ดลิงก์และวิธีการเชื่อมโยงนั้นแตกต่างจากลิงก์สัญลักษณ์อย่างไร
คำตอบ:
ภายใต้ระบบไฟล์ไฟล์จะแสดงโดย inodes (หรือเป็นหลาย inodes หรือไม่แน่ใจ)
ไฟล์ในระบบไฟล์นั้นเป็นลิงค์ไปยังไอโหนด
ฮาร์ดลิงก์จากนั้นสร้างไฟล์อื่นที่มีลิงก์ไปยังไอโหนดพื้นฐานเดียวกัน
เมื่อคุณลบไฟล์มันจะลบหนึ่งลิงก์ไปยัง inode ที่สำคัญ ไอโหนดจะถูกลบเท่านั้น (หรือลบ / เขียนทับได้) เมื่อลิงก์ทั้งหมดไปยังไอโหนดถูกลบไปแล้ว
ลิงก์สัญลักษณ์คือลิงก์ไปยังชื่ออื่นในระบบไฟล์
เมื่อทำการฮาร์ดลิงก์แล้วลิงค์นั้นจะเข้าสู่ inode การลบเปลี่ยนชื่อหรือย้ายไฟล์ต้นฉบับจะไม่มีผลกับฮาร์ดลิงก์เนื่องจากลิงก์ไปยัง inode เป็นต้น การเปลี่ยนแปลงใด ๆ กับข้อมูลบนไอโหนดจะสะท้อนให้เห็นในไฟล์ทั้งหมดที่อ้างถึงไอโหนดนั้น
หมายเหตุ: ฮาร์ดลิงก์ใช้ได้ภายในระบบไฟล์เดียวกันเท่านั้น ลิงก์สัญลักษณ์สามารถขยายระบบไฟล์ได้เนื่องจากเป็นเพียงชื่อของไฟล์อื่น
สัญชาตญาณที่ดีที่อาจช่วยได้โดยใช้คอนโซล 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
เป็นเพียงลิงค์ไปยังไฟล์ที่ไม่มีอยู่
touch blah1; touch blah2
สามารถย่อให้เล็กลงได้touch blah1 blah2
เมื่อพูดไปรูปภาพก็มีค่าหนึ่งพันคำ นี่คือวิธีที่ฉันเห็นภาพ:
นี่คือวิธีที่เราได้รับภาพนั้น:
สร้างชื่อmyfile.txt
ในระบบไฟล์ที่ชี้ไปที่ inode ใหม่ (ซึ่งมีข้อมูลเมตาสำหรับไฟล์และชี้ไปที่บล็อกของข้อมูลที่มีเนื้อหาเช่นข้อความ "Hello, World!":
$ echo 'Hello, World!' > myfile.txt
สร้างฮาร์ดลิงก์my-hard-link
ไปยังไฟล์myfile.txt
ซึ่งหมายถึง "สร้างไฟล์ที่ควรชี้ไปที่ไอโหนดเดียวกันกับที่myfile.txt
ชี้ไปที่":
$ ln myfile.txt my-hard-link
สร้างซอฟต์ลิงค์my-soft-link
ไปยังไฟล์myfile.txt
ซึ่งหมายถึง "สร้างไฟล์ที่ควรชี้ไปที่ไฟล์myfile.txt
":
$ ln -s myfile.txt my-soft-link
ดูว่าจะเกิดอะไรขึ้นหากmyfile.txt
ถูกลบ (หรือย้าย): my-hard-link
ยังคงชี้ไปที่เนื้อหาเดียวกันและไม่ได้รับผลกระทบใด ๆ ในขณะmy-soft-link
นี้ชี้ไปที่ไม่มีอะไรเลย คำตอบอื่น ๆ พูดถึงข้อดี / ข้อเสียของแต่ละข้อ
myfile.txt
) สำหรับ soft link การอ้างอิงไม่ใช่ inode (ซึ่งมีข้อมูล) แต่เป็นการอ้างอิงคือพา ธ ของระบบไฟล์ไปยังmyfile.txt
(เช่น/home/Documents/myfile.txt
)
ฮาร์ดลิงก์มีประโยชน์เมื่อไฟล์ต้นฉบับถูกย้ายไปมา ตัวอย่างเช่นการย้ายไฟล์จาก / 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 แต่ยกเลิกการเชื่อมโยงในระบบไฟล์หมุนรอบตัวโดยใช้ฮาร์ดลิงก์เพื่อสร้างลิงก์ไอโหนดใหม่เพื่อให้ไฟล์ไม่หายไปเมื่อกระบวนการที่เปิดเปิดปิดหรือหายไป
ซอฟต์ลิงค์ :
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
ฮาร์ดลิงก์ไม่สามารถชี้ไปยังไดเรกทอรีได้
ฮาร์ดลิงก์มีข้อ จำกัด สองประการ:
วิธีง่ายๆในการดูความแตกต่างระหว่างฮาร์ดลิงก์และลิงก์สัญลักษณ์คือตัวอย่างง่ายๆ ฮาร์ดลิงก์ไปยังไฟล์จะชี้ไปยังตำแหน่งที่จัดเก็บไฟล์หรือ 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" ต่อไปจนกว่าจะไม่มีฮาร์ดลิงก์ชี้ไปที่อีกต่อไป
ลิงก์สัญลักษณ์เชื่อมโยงกับชื่อพา ธ สิ่งนี้สามารถอยู่ที่ใดก็ได้ในแผนผังไฟล์ของระบบและไม่จำเป็นต้องมีอยู่แม้กระทั่งเมื่อสร้างลิงค์ เส้นทางเป้าหมายสามารถเป็นญาติหรือแน่นอน
ฮาร์ดลิงก์เป็นตัวชี้เพิ่มเติมไปยัง inode ซึ่งหมายความว่าสามารถมีได้เฉพาะบนวอลุ่มเดียวกับเป้าหมาย ฮาร์ดลิงก์เพิ่มเติมไปยังไฟล์นั้นแยกไม่ออกจากชื่อ "ดั้งเดิม" ที่ใช้เพื่ออ้างอิงไฟล์
ฉันจะชี้คุณไปที่ Wikipedia:
คะแนนน้อย:
ฮาร์ดลิงก์มีประโยชน์มากเมื่อทำการสำรองข้อมูลเพิ่มเติม ดูrsnapshotตัวอย่างเช่น แนวคิดคือการทำสำเนาโดยใช้ฮาร์ดลิงก์:
การสำรองข้อมูลใหม่จะไม่ใช้พื้นที่เพิ่มเติมนอกเหนือจากการเปลี่ยนแปลงใด ๆ ที่คุณทำเนื่องจากการสำรองข้อมูลที่เพิ่มขึ้นทั้งหมดจะชี้ไปที่ inode ชุดเดียวกันสำหรับไฟล์ที่ไม่มีการเปลี่ยนแปลง
ฉันเพิ่มคำถามของ Nick: ลิงก์ถาวรมีประโยชน์หรือจำเป็นเมื่อใด แอปพลิเคชันเดียวที่อยู่ในใจของฉันซึ่งลิงก์สัญลักษณ์ไม่สามารถใช้งานได้คือการให้สำเนาของไฟล์ระบบในสภาพแวดล้อมที่ chrooted
ลิงก์สัญลักษณ์เป็นวัตถุระบบไฟล์ที่ชี้ไปยังวัตถุระบบไฟล์อื่น วัตถุที่ถูกชี้ไปที่เรียกว่าเป้าหมาย
ลิงก์สัญลักษณ์มีความโปร่งใสสำหรับผู้ใช้ ลิงก์ปรากฏเป็นไฟล์หรือไดเรกทอรีปกติและสามารถดำเนินการโดยผู้ใช้หรือแอปพลิเคชันในลักษณะเดียวกัน
ลิงก์สัญลักษณ์ถูกออกแบบมาเพื่อช่วยในการโยกย้ายและความเข้ากันได้ของโปรแกรมประยุกต์กับระบบปฏิบัติการ 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
นอกจากนี้:
เพียงแค่ฮาร์ดลิงก์: เพียงแค่เพิ่มชื่อใหม่ลงในไฟล์นั่นหมายความว่าไฟล์สามารถมีชื่อได้หลายชื่อในเวลาเดียวกันชื่อทั้งหมดจะเหมือนกันไม่มีใครต้องการฮาร์ดลิงก์ไม่ได้หมายถึงการคัดลอกเนื้อหาทั้งหมด ของไฟล์และสร้างไฟล์ใหม่ไม่ได้เป็นเพียงแค่สร้างชื่อสำรองที่เป็นที่รู้จัก ..
Symbolic link (symlink): เป็นตัวชี้ไฟล์ไปยังไฟล์อื่นหากลิงก์สัญลักษณ์ชี้ไปยังไฟล์ที่มีอยู่ซึ่งถูกลบในภายหลังลิงก์สัญลักษณ์จะยังคงชี้ไปที่ชื่อไฟล์เดียวกันแม้ว่าชื่อจะไม่มีชื่อไฟล์ใด ๆ อีกต่อไป
สิ่งที่คุณคิดว่าเป็น "ไฟล์" ธรรมดาเป็นจริงสองสิ่งที่แยกจากกัน: ข้อมูลของไฟล์และรายการไดเรกทอรี เมื่อคุณสร้างฮาร์ดลิงก์สำหรับไฟล์คุณจะสร้างรายการไดเรกทอรีที่สองซึ่งอ้างอิงข้อมูลเดียวกัน รายการไดเรกทอรีทั้งสองมีฟังก์ชั่นเหมือนกันทุกประการ แต่ละไฟล์สามารถใช้เปิดไฟล์เพื่ออ่านได้ ดังนั้นคุณไม่มี "ไฟล์บวกลิงค์ยาก" คุณมี "ข้อมูลไฟล์ที่มีสองรายการไดเรกทอรี" สิ่งที่คุณคิดว่าเป็นการลบไฟล์จะเป็นการลบรายการไดเรกทอรีและเมื่อรายการไดเรกทอรีสุดท้ายสำหรับข้อมูลถูกลบข้อมูลนั้นก็จะถูกลบเช่นกัน สำหรับไฟล์ธรรมดาที่มีรายการไดเรกทอรีเพียงรายการเดียวการลบรายการไดเรกทอรีจะเป็นการลบข้อมูลเช่นเคย (ขณะที่เปิดไฟล์ระบบปฏิบัติการจะสร้างลิงก์ชั่วคราวไปยังไฟล์
ยกตัวอย่างเช่นสร้างไฟล์ A.txt ลิงค์ยาก B.txt และลบ A.txt เมื่อคุณสร้าง A.txt ข้อมูลบางส่วนจะถูกสร้างขึ้นและรายการไดเรกทอรี A.txt เมื่อคุณสร้างฮาร์ดลิงก์รายการไดเร็กทอรี B.txt อื่นถูกสร้างขึ้นชี้ไปที่ข้อมูลเดียวกันที่แน่นอน เมื่อคุณลบ A.txt คุณยังคงมีข้อมูลทั้งหมดและรายการไดเรกทอรีเดียว B.txt เหมือนกับที่คุณสร้างไฟล์ B.txt ในตอนแรก
ซอฟต์ลิงค์เป็นเพียงไฟล์ธรรมดา (เกือบ) ยกเว้นว่ามันไม่มีข้อมูล แต่เป็นพา ธ ของรายการไดเรกทอรีอื่น หากคุณลบไฟล์ที่ลิงค์นุ่มหมายถึงแล้วลิงค์นุ่มจะมีเส้นทางที่ไม่ได้ชี้ไปที่รายการไดเรกทอรีอีกต่อไป; มันแตก. หากคุณลบซอฟต์ลิงค์มันก็เหมือนกับการลบไฟล์อื่น ๆ ไฟล์ที่ชี้ไปนั้นไม่ได้รับผลกระทบ
รายการไดเรกทอรีคือการเชื่อมโยง 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 */
เมื่อเพิ่มคำตอบข้างต้นทั้งหมดความแตกต่างในการค้นหาไฟล์ 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 (โปรดแก้ไขถ้าฉันผิดหรือไม่ชัดเจน)
ลิงก์สัญลักษณ์ให้ชื่ออื่นกับไฟล์ในลักษณะคล้ายกับลิงก์ยาก แต่ไฟล์สามารถลบได้แม้ว่าจะมีลิงก์สัญลักษณ์เหลืออยู่
การใช้งานสองเซ็นต์ของฉัน:
ซอฟต์ลิงก์อาจถูกใช้เพื่อย่นชื่อพา ธ แบบยาวเช่น:
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
ฉันเพิ่งพบวิธีง่าย ๆ ในการทำความเข้าใจกับฮาร์ดลิงก์ในสถานการณ์ทั่วไปติดตั้งซอฟต์แวร์
วันหนึ่งฉันดาวน์โหลดซอฟต์แวร์ไปยังโฟลเดอร์Downloads
เพื่อติดตั้ง หลังจากที่ฉันทำsudo make install
บาง executables ถูกcp
ed ไปยังโฟลเดอร์ถังขยะท้องถิ่น ที่นี่cp
จะสร้างการเชื่อมโยงอย่างหนัก ฉันมีความสุขกับซอฟต์แวร์ แต่ในไม่ช้าก็รู้ว่านั่นDownloads
ไม่ใช่สถานที่ที่ดีในระยะยาว ดังนั้นฉันจะmv
แก้ไขโฟลเดอร์ซอฟต์แวร์ไปยัง source
ไดเรกทอรี ฉันยังคงสามารถใช้งานซอฟต์แวร์ได้เหมือนเดิมโดยไม่ต้องกังวลเกี่ยวกับสิ่งที่ลิงก์เป้าหมายเช่นใน Windows ซึ่งหมายความว่าฮาร์ดลิงก์จะค้นหา inode โดยตรงและไฟล์อื่น ๆ
ในคำตอบนี้เมื่อฉันพูดไฟล์ฉันหมายถึงตำแหน่งในหน่วยความจำ
ข้อมูลทั้งหมดที่บันทึกไว้จะถูกเก็บไว้ในหน่วยความจำโดยใช้โครงสร้างข้อมูลที่เรียกว่า inodes ทุก ๆ inode มี inodenumber หมายเลข inode นั้นถูกใช้เพื่อเข้าถึง inode ทั้งหมดฮาร์ดไดรฟ์ที่เชื่อมโยงไปยังไฟล์นั้นอาจมีชื่อแตกต่างกัน เนื่องจากฮาร์ดลิงก์ทั้งหมดมี inodenumber เหมือนกัน (ซึ่ง inturn เข้าถึง inode เดียวกัน) ลิงก์ทั้งหมดจึงชี้ไปยังหน่วยความจำกายภาพเดียวกัน
ลิงก์สัญลักษณ์เป็นไฟล์ชนิดพิเศษเนื่องจากมันเป็นไฟล์ที่จะมีชื่อไฟล์และหมายเลขไอโหนดดังกล่าวข้างต้นหมายเลขไอโหนดจะเพิ่มไอโหนดซึ่งชี้ไปที่ข้อมูลตอนนี้สิ่งที่ทำให้ลิงก์สัญลักษณ์พิเศษคือ inodenumbers ในลิงก์สัญลักษณ์เข้าถึง inodes เหล่านั้นซึ่งชี้ไปที่ "พา ธ " ไปยังไฟล์อื่นโดยเฉพาะหมายเลขไอโหนดในลิงก์สัญลักษณ์จะเพิ่มจำนวนไอโหนดเหล่านั้นซึ่งชี้ไปยังฮาร์ดลิงก์อื่น
เมื่อเรากำลังย้ายคัดลอกลบไฟล์ใน GUI เรากำลังเล่นกับ hardlinks ของไฟล์ไม่ใช่หน่วยความจำกายภาพเมื่อเราลบไฟล์เราจะลบ hardlink ของไฟล์ เราไม่ได้ลบหน่วยความจำทางกายภาพออกไปถ้าหากฮาร์ดลิงก์ทั้งหมดของไฟล์ถูกลบไปแล้วมันจะไม่สามารถเข้าถึงข้อมูลที่เก็บไว้ได้แม้ว่ามันจะยังคงอยู่ในหน่วยความจำก็ตาม