ทำไมลิงค์แข็งถึงดูเหมือนจะใช้พื้นที่เดียวกันกับต้นฉบับ?


14

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

ดังนั้นฉันทดสอบสิ่งที่ฉันเรียนรู้ด้วยไฟล์บางไฟล์ ("saluton_mondo.cpp" ด้านล่าง) สร้างลิงก์ที่อ่อนนุ่มและสำเนา

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

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

คำตอบ:


16

ไฟล์เป็น inode ที่มีข้อมูลเมตาซึ่งเป็นรายการของตัวชี้ไปยังตำแหน่งที่จะค้นหาข้อมูล

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

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

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

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

เหนือหมายเลขไฟล์ 10486707 เป็นไฟล์ปกติ สองรายการในไดเรกทอรีปัจจุบัน (หนึ่งรายการที่มีชื่อaหนึ่งรายการมีbลิงก์) เนื่องจากจำนวนลิงก์คือ 2 เราจึงรู้ว่าไม่มีชื่ออื่นของไฟล์นั้นในไดเรกทอรีปัจจุบันหรือไดเรกทอรีอื่น ๆ หมายเลขไฟล์ 10502404 เป็นอีกไฟล์หนึ่งซึ่งเป็นประเภท symlink ที่เชื่อมโยงกับไดเรกทอรีปัจจุบันสองครั้ง เนื้อหา (เป้าหมาย) คือพา ธ สัมพัทธ์ "a"

โปรดทราบว่าหาก 10502404 เชื่อมโยงไปยังไดเรกทอรีอื่นมากกว่าไดเรกทอรีปัจจุบันโดยทั่วไปแล้วมันจะชี้ไปที่ไฟล์อื่นขึ้นอยู่กับวิธีการเข้าถึง

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

ไฟล์ไม่มีชื่อที่เกี่ยวข้องกับพวกเขานอกจากในไดเรกทอรีที่เชื่อมโยงพวกเขา พื้นที่ที่ใช้โดยชื่อของพวกเขาคือรายการในไดเรกทอรีเหล่านั้นมันถูกคิดในการใช้งานขนาด / ดิสก์ของไดเรกทอรี

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


อ่า ... ตอนนี้ฉันรู้แล้ว ดังนั้นไฟล์ที่เรียกว่า "สวัสดี" และสำเนาถูกต้องที่เรียกว่า "ajhĝjdmjefsjmksgskgjkmŝŭna" ใช้ว่า ammout เดียวกันของพื้นที่; เนื่องจากชื่อของพวกเขาจะไม่นับสำหรับการlstatเรียกระบบนั้นที่มีขนาด
JMCF125

@ JMCF125 ใช่ขนาดที่ใช้โดยชื่อของพวกเขาคือรายการในไดเรกทอรีที่สอดคล้องกันมันถูกคิดเป็นขนาดไฟล์ของไดเรกทอรี
Stéphane Chazelas

ขอบคุณ คุณสามารถรวมสิ่งนั้นไว้ในคำตอบของคุณได้ไหม? เดี๋ยวก่อนฉันจะอธิบายคำถามของฉันก่อน
JMCF125

5

ฮาร์ดลิงก์คือไฟล์ต้นฉบับเป็นหลัก ดังนั้นขนาดที่คุณเห็นรายงานคือขนาดของไฟล์ที่ถูกลิงค์ไป มันเป็นลิงค์อ่อน ๆที่ใช้พื้นที่ของชื่อ (kinda) เท่านั้น

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


แต่ชื่อของฮาร์ดลิงก์ต้องใช้พื้นที่ว่างใช่ไหม?
JMCF125

ดูคำตอบของ @ stephan ด้านล่างเขาอธิบายได้ดีกว่า
terdon

2
@ JMCF125 ใช่ แต่พื้นที่นั้นอยู่ในไดเรกทอรี หากคุณสร้างไฟล์เพียงพอคุณจะสังเกตเห็นว่าขนาดไดเรกทอรีเพิ่มขึ้น ขนาดของไฟล์ไม่รวมข้อมูลเมตาเช่นชื่อไฟล์
Gilles 'หยุดชั่วร้าย'

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