作者 主題: hard link  (閱讀 42761 次)

0 會員 與 1 訪客 正在閱讀本文。

bojing

  • 憂鬱的高中生
  • ***
  • 文章數: 133
    • 檢視個人資料
hard link
« 於: 2002-10-06 20:30 »
請問hard link 會不會占用硬碟空間?因之前做個測試,
於家目錄下$ln /etc/termcap linkfile
再來用$du -b .  --->發現所占用block 空間變大,
不是說連結檔不占空間嗎?這是怎麼一回事呢?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5384
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
hard link
« 回覆 #1 於: 2002-10-06 22:27 »
所有的檔案都會佔用空間, 就算是 hard link 也一樣..
只不過 link 是只做一個記錄, 並不會像複製一樣使用與原本檔案一樣的空間大小.

總要有地方讓 filesystem 儲存這些資訊吧 (檔名, 屬性...)....

bojing

  • 憂鬱的高中生
  • ***
  • 文章數: 133
    • 檢視個人資料
hard link
« 回覆 #2 於: 2002-10-07 11:19 »
可是我用du -b 去看所佔block 空間,其所增加的block size,就等於
/etc/termcap 所佔的block size.這又如何解釋呢?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5384
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
hard link
« 回覆 #3 於: 2002-10-07 12:09 »
引述: "bojing"
可是我用du -b 去看所佔block 空間,其所增加的block size,就等於
/etc/termcap 所佔的block size.這又如何解釋呢?


原因... 你自己想想看有什麼地方會造成這樣吧.

我做的測試並不會有這個現象.
一個檔案是 4096 blocks, 產生 30 個 link 並不會佔用 4096 * 30 的 blocks.

代碼: [選擇]

tommywu@gibak:/tmp$ dd if=/dev/zero of=testfile bs=1024 count=1
1+0 records in
1+0 records out
tommywu@gibak:/tmp$ du -b .
4096    .
tommywu@gibak:/tmp$ ln testfile 1
tommywu@gibak:/tmp$ ln testfile 2
tommywu@gibak:/tmp$ ln testfile 3
tommywu@gibak:/tmp$ ln testfile 4
tommywu@gibak:/tmp$ ln testfile 5
tommywu@gibak:/tmp$ ln testfile 6
tommywu@gibak:/tmp$ ln testfile 7
tommywu@gibak:/tmp$ ln testfile 8
tommywu@gibak:/tmp$ ln testfile 9
tommywu@gibak:/tmp$ ln testfile 10
tommywu@gibak:/tmp$ ln testfile 11
tommywu@gibak:/tmp$ ln testfile 12
tommywu@gibak:/tmp$ ln testfile 13
tommywu@gibak:/tmp$ ln testfile 14
tommywu@gibak:/tmp$ ln testfile 15
tommywu@gibak:/tmp$ ln testfile 16
tommywu@gibak:/tmp$ ln testfile 17
tommywu@gibak:/tmp$ ln testfile 18
tommywu@gibak:/tmp$ ln testfile 19
tommywu@gibak:/tmp$ ln testfile 20
tommywu@gibak:/tmp$ ln testfile 21
tommywu@gibak:/tmp$ ln testfile 22
tommywu@gibak:/tmp$ ln testfile 23
tommywu@gibak:/tmp$ ln testfile 24
tommywu@gibak:/tmp$ ln testfile 25
tommywu@gibak:/tmp$ ln testfile 26
tommywu@gibak:/tmp$ ln testfile 27
tommywu@gibak:/tmp$ ln testfile 28
tommywu@gibak:/tmp$ ln testfile 29
tommywu@gibak:/tmp$ ln testfile 30
tommywu@gibak:/tmp$ du -b .
8192    .
tommywu@gibak:/tmp$ l
total 132
drwxrwxrwt    2 root     root         4096 Oct  7 12:03 .
drwxr-xr-x   19 root     root         4096 Oct  3 13:41 ..
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 1
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 10
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 11
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 12
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 13
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 14
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 15
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 16
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 17
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 18
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 19
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 2
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 20
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 21
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 22
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 23
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 24
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 25
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 26
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 27
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 28
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 29
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 3
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 30
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 4
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 5
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 6
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 7
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 8
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 9
-rw-r--r--   31 tommywu  tommywu      1024 Oct  7 12:02 testfile

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
hard link
« 回覆 #4 於: 2002-10-07 13:01 »
我建議在了解 link 之前,先將 file -> inode -> block 的關係搞清楚。
疑問頓失...

micworm

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
hard link
« 回覆 #5 於: 2002-10-08 15:54 »
都是 link 一定會占空間的
但是 soft link 和 hard link 相較下
soft link 是比較不站空間的
只是一個鏈結
希望能幫上忙喔 :roll:

octapult

  • 可愛的小學生
  • *
  • 文章數: 27
    • 檢視個人資料
hard link
« 回覆 #6 於: 2002-11-23 02:06 »
弟最近想要搞懂 hard link 和 soft link,於是查了 study area 裡面的資料 (包含網頁與討論區部份),接著弟又查了書上的資料和網路上面的資料,發覺網頁的解釋部份有點問題。另外再看到這一個討論串,也發現了一些問題。首先是網頁的部份:
引用

如果用 hard link 的話﹐檔案系統會再建立一個 inode﹐其指向的磁碟位置和原來的檔案位置一樣﹐而所有指到這個位置的 inode 都會更新其 link 指標﹐hard link 越多﹐指標越多。
.......................
那 soft link 又是什麼呢﹖和 hard link 不一樣的地方是﹕它並不是以 inode 指向相同的磁碟空間﹐而是單純的指向原來的 inode 而已﹐如果原來的 inode 移除了﹐那這個 link 就變為無主孤魂了﹐也就是所謂的 dead link 是也。就好比宋七力有一個本尊﹐同時也有好些分身﹐但如果一旦本尊毀掉﹐那分身也跟著滅亡﹐道理是一樣的。

這邊有關 inode 的部份似乎講反了。
hard link 並沒有另外建立一個 inode,而是增加一個 directory entry,內容為原始檔案的 inode number、這個 hard link 的檔案名稱和其他相關資訊,所以 hard link 的 inode number 跟原始檔案的 inode number 是一樣的。在建立 soft link 的時候才會建立一個新的 inode 指到原始檔案的 inode,所以 soft link 的 inode number 跟原始檔案的 inode number 不一樣。這也是為甚麼 hard link 只能指向同一個檔案系統裡面的檔案,因為每個檔案系統都有它自己一系列的 inode,兩個不同的檔案系統可能有相同的 inode number。而 soft link 具有完整的 pathname,所以他可以跨越不同的檔案系統。範例:
代碼: [選擇]

octapult@mydebian:~/temp$ ls -li
總計 0
octapult@mydebian:~/temp$ dd if=/dev/zero of=test bs=128 count=1
讀入了 1+0 個區段
輸出了 1+0 個區段
128 bytes transferred in 0.001447 seconds (88456 bytes/sec)
octapult@mydebian:~/temp$ df -i
檔案系統               Inode (I)已用 (I)可用 (I)已用% 掛載點
/dev/hda1             904960  127338  777622   15% /
octapult@mydebian:~/temp$ ln test 1
octapult@mydebian:~/temp$ df -i
檔案系統               Inode (I)已用 (I)可用 (I)已用% 掛載點
/dev/hda1             904960  127338  777622   15% /
octapult@mydebian:~/temp$ ln -s test 2
octapult@mydebian:~/temp$ ls -li
總計 8
 517530 -rw-r--r--    2 octapult octapult      128 2002-11-23 01:36 1
 517531 lrwxrwxrwx    1 octapult octapult        4 2002-11-23 01:37 2 -> test
 517530 -rw-r--r--    2 octapult octapult      128 2002-11-23 01:36 test
octapult@mydebian:~/temp$ df -i
檔案系統               Inode (I)已用 (I)可用 (I)已用% 掛載點
/dev/hda1             904960  127339  777621   15% /


再來是關於這個討論串的部份:

hard link 本來就會佔空間,不包含檔案名稱的話,就要用掉 8 bytes,檔案名稱一個字元一個 byte,所以總長度並不固定。假設一個 block 為 4K bytes、一個 hard link 平均為 16 bytes 的話,建立超過 256 個 hard link 的話,就需要再另外增加一個 data block 來存放新的 hard link 了,所以建立新的 hard link 的時候,du -b 的結果會增加一個 block (4K bytes) 是有可能的。

另外關於 hard link 和 soft link 那一個比較佔空間的問題,就要看我們以甚麼角度去看了。如果純粹以佔用硬碟空間的角度來看的話,應該是 soft link 比較佔空間。hard link 的長度為 8 bytes + 檔案名稱的長度。soft link 至少用掉一個 inode,一個 inode 為 128 bytes,如果pathname 小於 60 characters 的話,剛好可以存進 inode 的 i-block 裡面 (12 x direct blocks 指標、single indirect、double indirect、triple inderect,總共剛好 15 x 4 bytes);假如 pathname 超過 60 characters 的話,還需要多一個 data block (4K bytes) 來存放。可是如果我們以檔案佔用多少 data block 來看的話 (du 指令),hard link 比較佔空間,因為du 並沒有把檔案系統的資料結構所佔的空間算進去,除非 soft link 的 pathname 過長,多佔了一個 data block。

p.s.1 以上以 Ext2 File System 為範例。
p.s.2 如果弟有講錯的地方,希望各位網友不吝指正 :)
-----BEGIN GEEK CODE BLOCK------
Version: 3.12
G! d- s+:+ a? C++(+++) UBL>++++ P L++ E+ W++ N+ o+ K- w(--) O?
M? V PS+ PE+ Y+ PGP- t 5? X++ R tv b+ DI- D+ G e? h! r-- z?
-------END GEEK CODE BLOCK-------

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
hard link
« 回覆 #7 於: 2002-11-23 02:18 »
引述: "octapult"
這邊有關 inode 的部份似乎講反了。
hard link 並沒有另外建立一個 inode,而是增加一個 directory entry,內容為原始檔案的 inode number、這個 hard link 的檔案名稱和其他相關資訊,所以 hard link 的 inode number 跟原始檔案的 inode number 是一樣的。在建立 soft link 的時候才會建立一個新的 inode 指到原始檔案的 inode,所以 soft link 的 inode number 跟原始檔案的 inode number 不一樣。這也是為甚麼 hard link 只能指向同一個檔案系統裡面的檔案,因為每個檔案系統都有它自己一系列的 inode,兩個不同的檔案系統可能有相同的 inode number。而 soft link 具有完整的 pathname,所以他可以跨越不同的檔案系統。


sorry,的確是我理解錯誤,這概念我也是前不久才糾正過來的。
我馬上改一下網頁好了。

感謝 octapult 兄的指正!

jacky0220

  • 憂鬱的高中生
  • ***
  • 文章數: 119
    • 檢視個人資料
hard link
« 回覆 #8 於: 2003-02-11 22:02 »
引述: "bojing"
可是我用du -b 去看所佔block 空間,其所增加的block size,就等於
/etc/termcap 所佔的block size.這又如何解釋呢?


將近快一年的文章了, 因弟也有這方面的疑問, 用 搜尋 剛好看到, 也順便回答一下

上面之所以會得到相同的答案(佔用相同的block size), 正是因為 ln 的關係啊!
因為 ln /etc/termcap testfile後, 你 du /etc/termcap 會等於 du ~/testfile
也就是說 termcap = testfile 了!

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
hard link
« 回覆 #9 於: 2003-07-10 15:19 »
引用
hard link 並沒有另外建立一個 inode,而是增加一個 directory entry,內容為原始檔案的 inode number、這個 hard link 的檔案名稱和其他相關資訊,所以 hard link 的 inode number 跟原始檔案的 inode number 是一樣的。在建立 soft link 的時候才會建立一個新的 inode 指到原始檔案的 inode,所以 soft link 的 inode number 跟原始檔案的 inode number 不一樣。這也是為甚麼 hard link 只能指向同一個檔案系統裡面的檔案,因為每個檔案系統都有它自己一系列的 inode,兩個不同的檔案系統可能有相同的 inode number。而 soft link 具有完整的 pathname,所以他可以跨越不同的檔案系統。範例:

hard link 本來就會佔空間,不包含檔案名稱的話,就要用掉 8 bytes,檔案名稱一個字元一個 byte,所以總長度並不固定。假設一個 block 為 4K bytes、一個 hard link 平均為 16 bytes 的話,建立超過 256 個 hard link 的話,就需要再另外增加一個 data block 來存放新的 hard link 了,所以建立新的 hard link 的時候,du -b 的結果會增加一個 block (4K bytes) 是有可能的。


請教directory entry是增加到那去??原來的inode中嗎??

引用
另外關於 hard link 和 soft link 那一個比較佔空間的問題,就要看我們以甚麼角度去看了。如果純粹以佔用硬碟空間的角度來看的話,應該是 soft link 比較佔空間。hard link 的長度為 8 bytes + 檔案名稱的長度。soft link 至少用掉一個 inode,一個 inode 為 128 bytes,如果pathname 小於 60 characters 的話,剛好可以存進 inode 的 i-block 裡面 (12 x direct blocks 指標、single indirect、double indirect、triple inderect,總共剛好 15 x 4 bytes);假如 pathname 超過 60 characters 的話,還需要多一個 data block (4K bytes) 來存放。可是如果我們以檔案佔用多少 data block 來看的話 (du 指令),hard link 比較佔空間,因為du 並沒有把檔案系統的資料結構所佔的空間算進去,除非 soft link 的 pathname 過長,多佔了一個 data block。


"因為du 並沒有把檔案系統的資料結構所佔的空間算進去"
這句可不可以在解釋一下,參不透哩!!

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
hard link
« 回覆 #10 於: 2003-07-10 15:59 »
先了解 directory 與 file 的差別吧,見另篇討論:
http://phorum.study-area.org/viewtopic.php?t=17506
我將我的個人見解轉貼一次如下:
    一個 dir 其內容其實就是其下包有哪些 file name(含 sub-dir),及其對應的 inode number 。
    而一個 file 其內容就是本身的資料。
    以 /etc/sysconfig/network 為例。
    從 / partition 讀取 2 號 inode ,可得到 / 的 block ,
    其下可得到 etc 的 inode ,再可的到 /etc 的 block ,
    其下可得到 sysconfig 的 inode ,再可得到 /etc/sysconfig 的 block ,
    其下可的到 network 的 inode ,再可得 /etc/sysconfig/network 的 block ,
    最後讀取 block 就是其內容了。

剛巧昨天我在 news 上也討論過 link 的問題,茲錄如下:
    "閒雲朵朵 朵朵閒雲" <brain13homepage@yahoo.com.tw> 撰寫於郵件
    news:47CDYV$ASd@w42.tpe.yahoo.tw...

    > 補充一下,

    我也來補充一下  ^_^

    > 不常去注意,印象中是這樣的:
    >
    > hardlink 是直接指向硬碟中的同一個區塊,
    > softlink 則是先指向檔案系統中連結的檔案,
    > 再由該檔案去指向硬碟中的區塊.

    hardlink 指向同一個 inode ,
    再從 inode 得知 block 的位址,
    讀取 block 就得知 content 。

    softlink 使用另一 inode ,
    但它只是一個 pointer ,指向另一 path 。

    >
    > hardlink 無法跨越檔案系統, softlink 則可以,
    > 一般而言,是以 softlink 為主,hardlink 比較少用,
    > 因為 hardlink 無法跨越磁碟分割區.

    因為 inode 的關係(不同的 partition 有相同的 inode ),
    所以 hardlink 不能跨 parition 。
    但 softlink 是指向 path ,
    因此只要 mount point 建立好,就可找得到 pointer 所指的 object。

    除了 partition 的差異,
    hardlink 不能 link 目錄,soft link 則可。
    至於為甚麼?我就不清楚了... (請其他朋友幫忙說明一下吧)

    還有,hard link 建立之後,file 本身的 link count 會增加。
    假如將 source file 砍掉,其 block 並不會釋放出來,
    也就是原有 content 還在。
    但若是用 soft link 的話,link count 不變,
    若將 source file 砍掉,pointer 所指的 path 就找不到了,
    也就會得到 file not found 的 error 。
    若 source file 之 link count 在刪除後扣掉為 0 ,
    則原有 block 就會釋放出來,
    content 就有可能被其後使用該 block 的資料覆蓋掉。
    如果 file 本身的 attribute 帶有 s flag,
    那在 deletion 之後其 block 將全部歸零處理,
    就算拿到 disk 重讀該 block 也不能還原資料。
    不過,man chattr 有提到 u flag ,
    在 deletion 時會被 save 起來,以便 undelete 處理。
    不過,不知現階段 linux file system 的 undeletion 是否有 implement 呢?

    一些個人見解,給大家參考。謝謝﹗

    --

    =======
http://www.study-area.org =======
飛雪迎春到﹐風雨送春歸
已是寒崖百丈冰﹐尤有花枝俏
俏也不爭春﹐只把春來報
待得山花爛漫時﹐他在叢中笑﹗[/list]

因此,不管是 hard link 還是 soft link ,
都會在 directory 的 content 中增加一行 entry ,
但 hard link 因為用同一 inode ,因此也是用相同的 block(s) ,故此空間不會多出來。
但 du 卻不管這套,它只單純算出"每一 entry 所代表"的用量而已,卻不管兩個 entries 是否為同一 inode 。
要是 soft link ,因為本身就要消耗 inode table entry,因此肯定回用掉一些空間。
但是否為  data block 上的空間呢?不需要,用掉 inode table 的空間而已。
因為 soft link 只需在 pointer 上記錄 path name 就行,
而具體的 size (如 60 characters )情行如何,請重看 octapult 兄的說明吧...

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
hard link
« 回覆 #11 於: 2003-07-10 16:47 »
呵...剛才看到另一篇有我要的答案!!
另一個覺得有疑惑的地方.

harklink應該只是檔案的連結吧,而連結後檔案的功能應該不會變吧?!

但....以zcat來說.

#ls -i zcat
3801132 zcat

# find -inum 3801132
./gzip
./zcat
./gunzip

下面二行出來的結果不同,僅管指令找冊上說zcat = gunzip -c 但這是為什麼呢?? >"<
# gunzip /root/vpn/tmp/linux-2.4.21-openssl-0.9.6b-mppe.patch.gz
# zcat /root/vpn/tmp/linux-2.4.21-openssl-0.9.6b-mppe.patch.gz

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
hard link
« 回覆 #12 於: 2003-07-10 16:53 »
因為  program 的作者會判斷你用哪個 command ,然後給不同的處理。
這樣,他可以寫一個 program 就行了...

你想玩的話,也可寫一個  shell script ,然後做成多個 hard link ,
然後在 script 中抓 $(basename $0) 就能判斷不同的名字,
再跟據不同的名字來砲不同的東西...

duan

  • 榮譽博士
  • 活潑的大學生
  • ***
  • 文章數: 253
    • 檢視個人資料
hard link
« 回覆 #13 於: 2003-07-10 16:54 »
引述: "ericshei"

下面二行出來的結果不同,僅管指令找冊上說zcat = gunzip -c 但這是為什麼呢?? >"<
# gunzip /root/vpn/tmp/linux-2.4.21-openssl-0.9.6b-mppe.patch.gz
# zcat /root/vpn/tmp/linux-2.4.21-openssl-0.9.6b-mppe.patch.gz


一種情況:
程式本身會檢查自己的名字, 來決定要做的事情.
ex:  /usr/bin/makemap , /usr/bin/newaliases 都是 sendmail 的 link 而已.

弟沒 check gunzip , zcat 的情況, 但應該是同樣的原因.
供您參考.   :)

ericshei

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 2257
    • 檢視個人資料
hard link
« 回覆 #14 於: 2003-07-10 17:00 »
哦!!真是謝謝了~因為一個zcat我今天又多了解很多東西,真是高興.

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
hard link
« 回覆 #15 於: 2004-05-24 15:06 »
關於 link 的問題,這兩天在 news 上也有討論。
下面是我發表的其中兩篇:
    "網中人" <netman@junk.com> 在郵件 news:c8s6dg$9qd$1@news.seed.net.tw 中撰寫...
    >
    > "國父" <d2207197.bbs@bbs.sayya.org> 在郵件 news:4CLUSJ$1vm@bbs.sayya.org 中撰寫
    > ...
    > > ※ 引述《ycheng (ycheng)》之銘言:
    > > > 這個一定錯. 因為 soft link 是 by name, 不是 by inode.
    > > > 有一個可能是, soft_inode 指到 另一個 file_block, file block 裡面放
    > > > 字串, 內容就是指過去的 file_path_name, 在此就是 "file"
    > > 根據
    > >
http://phorum.study-area.org/viewtopic.php?t=12235&highlight=hard+link+soft
> > octapult 大的說法是
> > 「在建立 soft link 的時候才會建立一個新的 inode 指到原始檔案的 inode」
> >
> > 而 netman 說
> > 「要是 soft link ,因為本身就要消耗 inode table entry,
> > 因此肯定回用掉一些空間。但是否為 data block 上的空間呢?不需要,
> > 用掉 inode table 的空間而已。 」
> > 所以說創建一個 soft link 並沒有多一個 file block
> >
> > 當然前提是他們倆個講的都對囉 ^^
>
> 我可以肯定的是:
> * soft link 的 pointer 不是指向別的 inode ,而是一個 path_name 。
>
> 至於 pointer 寫在 inode table 裡還是在另一個 data-block?
> 我之前是以為在 inode table 。
> 不過,數星期前去參觀一位朋友的 office 時,
> 在空餘時翻到一本 O'Reilly 的 Unix 管理手冊(全名我忘了),
> 在談到 soft link 時有一個圖解,卻是:
> * inode 指到 data-block ,再指到 path_name 去。
>
> 嗯,由於我沒有深入追過 Linux kernel 這方面的資料,
> 我也不確定 soft link 究竟耗不耗 data-block 。
> 我想,這得請其它朋友幫忙解釋了...
>
>
> --
>
> ======= http://www.study-area.org =======
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑﹗
>

"網中人" <netman@junk.com> 在郵件 news:c8s8ao$a7c$1@news.seed.net.tw 中撰寫...
>
> "夏天來了 小肚不要來" <Quota.bbs@bbs.mcu.edu.tw> 在郵件
> news:4CMDOb$0GU@bbs.mcu.edu.tw 中撰寫...
> > ※ 引述《Neisseria.bbs@ptt.cc (Neisseria)》之銘言:
> > > 那請問一下
> > > 就"功能"上來說
> > > 為什麼需要兩種 link
> > > 看了討論串不是很懂  @@
> > > 大概是我用得太少了
> > > 我都只用 soft link 而已
> > 這部分我也很好奇
> > 不知其他大大 在怎樣的情況下會用hard link?
>
> 我不知那些大大們如何用的,以在下之愚,大概想到的如下:
>
> 1) 防止檔案被誤刪
> 當然,你有做 backup 或用 copy 也行。
> 但這些方法有同步上的不足,以及空間的消耗。
> 假設你習慣了用 root 來操作系統(這是非常不好的習慣﹗),
> 某天意外的不小心的刪了某一重要的檔又沒有備份,
> 這時,你的脊骨應該整根透著濃濃的寒意吧?﹗
> 若,被刪的檔案還有一個 hard link 呢?
> 哈哈,simple: link it back!  ^_^
>
> 2) 版本兼容策略
> 再以前面所引的酷學園討論為例:gcat 與 gzip 與 gunzip 都是 hard link 。
> 我不清楚原程式設計者的真正意圖。
> 但換作是我,我或許會想到:
> * 這幾個 program 的 code 有大部份是相同的。
> * 要更新的話,我只想改一個 file 就好。
> * 若有人不想要其中一個 program ,砍掉即可。
> 那,或許還有人說:用 library 就好...
> fine ~~~ 若我"就是偏偏"不喜歡用 library 呢?
> (或許是我懶,或許我不想動系統函式庫,或許....)
> 那,用 soft link 不可以嗎?
> 也 fine ~~~~ 但我本想砍掉 zcat 不用呢?(別問我理由了,可以"掰"很多... ^_^)
> 若 zcat 是個 soft link ,那 okay ,若好死不死,他是本尊呢?﹗
>
> 3) 降低 inode 消耗
> 若你還用 ext2/ext3 這種"落後(相較於先進而言)"的 file system,
> 都應該知到 inode block 是有限的,且不能調整的(除非重做 mkfs)。
> 那麼,用 soft link 與用 hard link 對 inode 的消耗來說,不言而諭了吧﹗
>
> 不過,用 soft link 還是有其好處的:
> * 可以跨不同 file system
> * 可以 link directory
> 前者我可以解釋為何 hard link 做不到。
> 但是,hard link 為何不能 link directory ? 卻是我一直想不透的地方。
> 不知哪位朋友出來解惑一下呢?謝謝﹗
>
>
> --
>
> ======= http://www.study-area.org =======
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑﹗
>
[/list]

還有更多後續討論(我會隨時補充):
    "我回來了" <lcp.bbs@bbs.sayya.org> 在郵件 news:4CMN09$2zz@bbs.sayya.org 中撰寫...
    > ※ 引述《d2207197 (國父)》之銘言:
    > > 假使某個目錄下面有一個叫做 file 的檔案
    > > ln file hard
    > > ln -s file soft
    > > 當進到這個目錄時    ┌─────────────┐
    > > Directory Inode --> │     Directory Block      │
    > >                     ├─────────────┤
    > >         ┌─────┼>file   file_inode_number ┼─┬─> file_inode ─┐
    > >         │          │ hard   file_inode_number ┼─┘                 V
    > >         │          │ soft   soft_inode_number │                file_block
    > >         │          └───────┼─────┘
    > >         │                           V
    > >         └ soft_block存在呼?? <─ soft_inode
    > 根據Advanced Programming in the Unix Environment這本書裡面的p.94
    > .. symbolic link, the actual contents of the file(the data blocks)
    > contains the name of the file that the symbolic link points to.
    > 所以應該是有佔block
    >
    > 小實驗:
    > ln email em ; ln -s email ems ; ls -l
    >
    > -rw-r--r--   2 lcp lcp   60 11月 21  2003 em
    > -rw-r--r--   2 lcp lcp   60 11月 21  2003 email
    > lrwxr-xr-x   1 lcp lcp    5  5月 24 20:38 ems -> email
    >
    > 我的小結論:
    > em是hard link,所佔的大小跟email一樣,所以應該是直接用inode指向email的
    > block。而ems是symbolic link,所佔的大小剛剛好是5bytes,所以是一個檔案
    > 包了email這個string。
    >
    > 有錯歡迎指正^^



    "lloyd huang" <lloyd@nomail.com> 在郵件 news:c8st0m$101d$1@adenine.netfront.net 中撰寫...
    > 網中人 wrote:
    > > 不過,用 soft link 還是有其好處的:
    > > * 可以跨不同 file system
    > > * 可以 link directory
    > > 前者我可以解釋為何 hard link 做不到。
    > > 但是,hard link 為何不能 link directory ? 卻是我一直想不透的地方。
    > > 不知哪位朋友出來解惑一下呢?謝謝﹗
    > ========>
    > 1)
    >  GNU OPTIONS
    >        -d, -F, --directory
    >               Allow the super-user to make hard links to directories.
    > 2)
    >        -d, -F, --directory
    >               hard link directories (super-user only)
    >
    > 3)
    > -d, -F, --directory         allow the superuser to attempt to hard link
    >                                 directories (note: will probably fail due to
    >                                 system restrictions, even for the superuser)
    >
    >
http://wombat.doc.ic.ac.uk/foldoc/foldoc.cgi?hard+links
> <%
> The standard ln command does not usually allow you to create a hard link to
> a directory, chiefly because the standard rm and rmdir commands do not
> allow you to delete such a link. Some systems provide link and unlink
> commands which give direct access to the system calls of the same name, for
> which no such restrictions apply.
> %>
>
> http://www.dewassoc.com/kbase/hard_drives/file_systems_unix.htm
> <%
> Links:
>
>     A link is a pointer to another file. Remember that a directory is
> nothing more than a list of the names and i-numbers of files. A directory
> entry can be a hard link, in which the i-number points directly to another
> file. A hard link to a file is indistinguishable from the file itself. When
> a hard link is made, then the i-numbers of two different directory file
> entries point to the same inode. For that reason, hard links cannot span
> across file systems. A soft link (or symbolic link) provides an indirect
> pointer to a file. A soft link is implemented as a directory file entry
> containing a pathname. Soft links are distinguishable from files, and can
> span across file systems. Not all versions of UNIX support soft links.
> %>
>
> Advanced Programming in the UNIX Environment (國際中文版)
> 3.14 檔案系統  (page 92 頁)
> 3.16 符號連結 (page 101 頁)
> (書上的解釋十分詳細)
> --
>     ◢◣
> □□□ ██ □□□□
> □  ◢█□ 造形.空間.秩序.
> □  ███◣ 主從.對比.韻律
>



"網中人" <netman@junk.com> 在郵件 news:c8svvk$ht9$1@news.seed.net.tw 中撰寫...
>
> "lloyd huang" <lloyd@nomail.com> 在郵件 news:c8st0m$101d$1@adenine.netfront.net
> 中撰寫...
> > Links:
> >
> >     A link is a pointer to another file. Remember that a directory is
> > nothing more than a list of the names and i-numbers of files. A directory
> > entry can be a hard link, in which the i-number points directly to another
> > file. A hard link to a file is indistinguishable from the file itself. When
> > a hard link is made, then the i-numbers of two different directory file
> > entries point to the same inode. For that reason, hard links cannot span
> > across file systems. A soft link (or symbolic link) provides an indirect
> > pointer to a file. A soft link is implemented as a directory file entry
> > containing a pathname. Soft links are distinguishable from files, and can
> > span across file systems. Not all versions of UNIX support soft links.
> > %>
> >
> > Advanced Programming in the UNIX Environment (國際中文版)
> > 3.14 檔案系統  (page 92 頁)
> > 3.16 符號連結 (page 101 頁)
> > (書上的解釋十分詳細)
>
> 嗯,感謝黃老師說明﹗過然有所獲~~~  ^_^
>
> 從如下這句來看:
> > A soft link (or symbolic link) provides an indirect pointer to a file.
> 似乎所耗的也不是 data-block 而是 indirect block 而已。
> 根據 ext2 file system 的設計,
> 是透過所謂的 direction + three level indirection 來找到所有的 data-block 的:
> * directly address 在 inode 內,可有 12 個位址指標。
> * first indirect block 可有定址 256 個 data-block
> * second indirect block 可定址 65536(256^2) 個 data-block
> * third indirect block 可定址 16777216(256^3) 個 data-block
>
> 這裡,我想請教黃老師的是:
> --- 究竟 soft link 的 pointer 是寫在如下那一個部份呢?
>     1) inode 之 direct address field
>     2) indirect blocks (1st/2nd/3rd)
>
> 因為手上沒有您提到的書本,一時偷懶,先來請教您了...  ^_^
> 謝謝﹗
>
>




"lloyd huang" <lloyd@nomail.com> 在郵件 news:c8tc87$1ve6$1@adenine.netfront.net 中撰寫...
> 網中人 wrote:
> > "lloyd huang" <lloyd@nomail.com> 在郵件
> >> Advanced Programming in the UNIX Environment (國際中文版)
> >> 3.14 檔案系統  (page 92 頁)
> >> 3.16 符號連結 (page 101 頁)
> >> (書上的解釋十分詳細)
>
> 強烈建議去翻翻這本書,翻過之後在多的解釋我都會認為很多餘..  ^_^
>  
> > 嗯,感謝黃老師說明﹗過然有所獲~~~  ^_^
> >
> > 從如下這句來看:
> >> A soft link (or symbolic link) provides an indirect pointer to a file.
> > 似乎所耗的也不是 data-block 而是 indirect block 而已。
> > 根據 ext2 file system 的設計,
> > 是透過所謂的 direction + three level indirection 來找到所有的 data-block 的:
> > * directly address 在 inode 內,可有 12 個位址指標。
> > * first indirect block 可有定址 256 個 data-block
> > * second indirect block 可定址 65536(256^2) 個 data-block
> > * third indirect block 可定址 16777216(256^3) 個 data-block
> >
> > 這裡,我想請教黃老師的是:
> > --- 究竟 soft link 的 pointer 是寫在如下那一個部份呢?
> >     1) inode 之 direct address field
> >     2) indirect blocks (1st/2nd/3rd)
> >
> > 因為手上沒有您提到的書本,一時偷懶,先來請教您了...  ^_^
> > 謝謝﹗
>
> -_-||| 冒冷汗... 抖抖抖抖....實在是很害怕,
> 你翻出來的資料,我才疏學淺實在是有看而不是很懂,可能要麻煩你
> 引出全文來好好研究看看。
>
> Advanced Programming in the UNIX Environment (國際中文版)
> (page 92)
> * 其他形式的連結稱為符號連結(symbolic link)。符號連結檔案的實際內容
> (資料區塊)包括該符號連結所指的檔案名稱.........
>
> 3.1.17 symlink 與 readlink 函式 (page 102)
>  略『 open 函式會使用符號連結.......可透過 readlink 完成.』
> PS: 書云: readlink 是結合 open , read , close 三個動作
> 我實際試過直接 open read close, 其實是讀不出內容來的。
> 非得用 readlink () 不可。
>
> 查了一下 readlink 在 linux 應該是 kernel system call
> $> less fs/ext2/symlink.c
> $> less fs/ext3/symlink.c
> $> less fs/sysv/symlink.c
> $> less fs/ufs/symlink.c
> ......
> static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen)
> {
>         char *s = (char *)dentry->d_inode->u.ext2_i.i_data;
>         return vfs_readlink(dentry, buffer, buflen, s);
> }
>
> 其實到了 kernel system call 之後,我就無能為力了。
> --
>     ◢◣
> □□□ ██ □□□□
> □  ◢█□ 造形.空間.秩序.
> □  ███◣ 主從.對比.韻律
>




"小州" <kenduest.bbs@bbs.sayya.org> 在郵件 news:4CMSCR$2Xo@bbs.sayya.org 中撰寫...
> ※ 引述《lloyd@nomail.com (lloyd huang)》之銘言:
> > 網中人 wrote:
> > > 不過,用 soft link 還是有其好處的:
> > > * 可以跨不同 file system
> > > * 可以 link directory
> > > 前者我可以解釋為何 hard link 做不到。
> > > 但是,hard link 為何不能 link directory ? 卻是我一直想不透的地方。
> > > 不知哪位朋友出來解惑一下呢?謝謝﹗
> > ========>
> > 1)
> >  GNU OPTIONS
> >        -d, -F, --directory
> >               Allow the super-user to make hard links to directories.
> > 2)
> >        -d, -F, --directory
> >               hard link directories (super-user only)
> > 3)
> > -d, -F, --directory         allow the superuser to attempt to hard link
> >                                 directories (note: will probably fail due to
> >                                 system restrictions, even for the superuser)
>
>   這參數目前只有提供 "參考" 而已。
>
>   一般 hard link 用於目錄目前暫時是無法達成的,一但使用都會出現 operation
>   not permitted 這類訊息。
>
>   目錄不大允許使用 hard link,這其中原因一般來說在於 hard link 要於目錄
>   使用的話,表示該目錄內的所有檔案與包含子目錄都要被進行 hard link 動作,
>   結果層面已經脫離了單純一般檔案項目的 hard link 情況。
>
>   再來,一但可以允許 hard link 於該目錄,若你在該目錄內建立一個檔案
>   與目錄,這表示這兩個目錄的檔案都要再處理 hard link 情況,那整個
>   環境會變得非常複雜。
>
> --
>    相信一種真誠存在於心與心之間...
> --



"lloyd huang" <lloyd@nomail.com> 在郵件 news:c8te11$22rr$1@adenine.netfront.net 中撰寫...
> 小州 wrote:
> > ※ 引述《lloyd@nomail.com (lloyd huang)》之銘言:
> >> 網中人 wrote:
> >> > 不過,用 soft link 還是有其好處的:
> >> > * 可以跨不同 file system
> >> > * 可以 link directory
> >> > 前者我可以解釋為何 hard link 做不到。
> >> > 但是,hard link 為何不能 link directory ? 卻是我一直想不透的地方。
> >> > 不知哪位朋友出來解惑一下呢?謝謝﹗
> >> ========>
> >> 1)
> >>  GNU OPTIONS
> >>        -d, -F, --directory
> >>               Allow the super-user to make hard links to directories.
> >> 2)
> >>        -d, -F, --directory
> >>               hard link directories (super-user only)
> >> 3)
> >> -d, -F, --directory         allow the superuser to attempt to hard link
> >>                                 directories (note: will probably fail due
> >>                                 to system restrictions, even for the
> >>                                 superuser)
> >
> >   這參數目前只有提供 "參考" 而已。
> >
> >   一般 hard link 用於目錄目前暫時是無法達成的,一但使用都會出現 operation
> >   not permitted 這類訊息。
> >
> >   目錄不大允許使用 hard link,這其中原因一般來說在於 hard link 要於目錄
> >   使用的話,表示該目錄內的所有檔案與包含子目錄都要被進行 hard link 動作,
> >   結果層面已經脫離了單純一般檔案項目的 hard link 情況。
> >
> >   再來,一但可以允許 hard link 於該目錄,若你在該目錄內建立一個檔案
> >   與目錄,這表示這兩個目錄的檔案都要再處理 hard link 情況,那整個
> >   環境會變得非常複雜。
>
> 州大說的沒錯不會動
>
> hard link 也有可能會造成檔案系統的 loop
> $> mkdir foo
> $> touch foo/a
> $> ln ../foo foo/testdir
>
> foo
> foo/a
> foo/testdir
> foo/testdir/testdir/a
> foo/testdir/testdir/testdir
> foo/testdir/testdir/testdir/a
> .......
>
> 書註解:作者實際測試,結果檔案系統毀損......fsck 修復無效,需動用 clri dcheck 云云.
> 目錄無法 hard link 看來並非沒有道理
> --
>     ◢◣
> □□□ ██ □□□□
> □  ◢█□ 造形.空間.秩序.
> □  ███◣ 主從.對比.韻律
>


"阿西" <yuhsi.bbs@bbs.cis.nctu.edu.tw> 在郵件 news:4CMh9f$J5b@bbs.cis.nctu.edu.tw 中撰寫...
> ==> 在 lloyd huang <lloyd@nomail.com> 的文章中提到:
> > 網中人 wrote:
> > > "lloyd huang" <lloyd@nomail.com> 在郵件
> > 強烈建議去翻翻這本書,翻過之後在多的解釋我都會認為很多餘..  ^_^
> > > 嗯,感謝黃老師說明﹗過然有所獲~~~  ^_^
> > > 從如下這句來看:
> > > 似乎所耗的也不是 data-block 而是 indirect block 而已。
> > > 根據 ext2 file system 的設計,
> > > 是透過所謂的 direction + three level indirection 來找到所有的 data-block 的:
> > > * directly address 在 inode 內,可有 12 個位址指標。
> > > * first indirect block 可有定址 256 個 data-block
> > > * second indirect block 可定址 65536(256^2) 個 data-block
> > > * third indirect block 可定址 16777216(256^3) 個 data-block
> > > 這裡,我想請教黃老師的是:
> > > --- 究竟 soft link 的 pointer 是寫在如下那一個部份呢?
> > >     1) inode 之 direct address field
> > >     2) indirect blocks (1st/2nd/3rd)
> > > 因為手上沒有您提到的書本,一時偷懶,先來請教您了...  ^_^
> > > 謝謝﹗
> > -_-||| 冒冷汗... 抖抖抖抖....實在是很害怕,
> > 你翻出來的資料,我才疏學淺實在是有看而不是很懂,可能要麻煩你
> > 引出全文來好好研究看看。
> > Advanced Programming in the UNIX Environment (國際中文版)
> > (page 92)
> > * 其他形式的連結稱為符號連結(symbolic link)。符號連結檔案的實際內容
> > (資料區塊)包括該符號連結所指的檔案名稱.........
> > 3.1.17 symlink 與 readlink 函式 (page 102)
> >  略『 open 函式會使用符號連結.......可透過 readlink 完成.』
> > PS: 書云: readlink 是結合 open , read , close 三個動作
> > 我實際試過直接 open read close, 其實是讀不出內容來的。
> > 非得用 readlink () 不可。
> > 查了一下 readlink 在 linux 應該是 kernel system call
> > $> less fs/ext2/symlink.c
> > $> less fs/ext3/symlink.c
> > $> less fs/sysv/symlink.c
> > $> less fs/ufs/symlink.c
> > .......
> > static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen)
> > {
> >         char *s = (char *)dentry->d_inode->u.ext2_i.i_data;
> >         return vfs_readlink(dentry, buffer, buflen, s);
> > }
> > 其實到了 kernel system call 之後,我就無能為力了。
>
> 網中人  好久不見了
> 這篇我本來昨晚有回  不過後來看到"黃老師"一詞  我又把他給刪了
> 想說你本來問別人的  阿  我又姓黃  不好意思
> 現在看了回答  所以現在又來越狙代庖一下
>
> 其實這個不用去看到kernel code啦
>
> soft link 是在所謂的directory entry放檔名跟inode的對應
> 那...  啥米是directory entry???
> directory entry 其實就是一個檔案
> 所以他是會佔data block的
> 只不過指著這個特殊檔案的inode會說明這個檔案是directory entry檔
> 會用特別的function去讀他  如果OS中檔案大小有限制  檔案個數有限制等等
>
> 在一般unix like的OS的file system都差不多是這樣
> linux比教科書多了block group吧  這是為甚麼 linux/unix系統
> 不需要defrag的原因
>
> 這個去看
> http://www.tldp.org/LDP/tlk/fs/filesystem.html
> 的directory entry那邊
>
> In the EXT2 file system, directories are special files that are used to
> create and hold access paths to the files in the file system. Figure  9.3
> shows the layout of a directory entry in memory.
>
> A directory file is a list of directory entries, each one containing the
> following information:
>
> inode
>     The inode for this directory entry. This is an index into the array of
>     inodes held in the Inode Table of the Block Group. In figure  9.3,
>     the directory entry for the file called file has a reference to inode
>     number i1,
> name length
>     The length of this directory entry in bytes,
> name
>     The name of this directory entry.
>
> The first two entries for every directory are always the standard ``.''
> and ``..'' entries meaning ``this directory'' and ``the parent directory''
> respectively.
>
>
> 至於direct indirect reference那是檔案大小跟搜尋效率的平衡作法
> 檔案小時  用那12個direct對應就一下直接找到對應的block
> 檔案大時  就要用複雜點的indirect去找
> 所以要看這個directory下的檔案多不多  檔名長不長  使得directory entry太大
>
> 所以direct indirect跟soft link沒甚麼關係  只是檔案大小跟定址的關係
>



"網中人" <netman@junk.com> 在郵件 news:c8ukj6$4b1$1@news.seed.net.tw 中撰寫...
>
> "阿西" <yuhsi.bbs@bbs.cis.nctu.edu.tw> 在郵件
> news:4CMh9f$J5b@bbs.cis.nctu.edu.tw 中撰寫...
> >
> > 至於direct indirect reference那是檔案大小跟搜尋效率的平衡作法
> > 檔案小時  用那12個direct對應就一下直接找到對應的block
> > 檔案大時  就要用複雜點的indirect去找
> > 所以要看這個directory下的檔案多不多  檔名長不長  使得directory entry太大
> >
> > 所以direct indirect跟soft link沒甚麼關係  只是檔案大小跟定址的關係
>
> 哦,謝謝 Cyril 兄的說明﹗看來是我理解了 宇新兄 的貼子了:
> > A soft link (or symbolic link) provides an indirect pointer to a file.
> 上句的 indirect 並不是指 indirect block ,
> 而是一個定語冠詞,以修飾 pointer 之用的...  ^_^
>
> 不過,我的疑問還沒解決:
> --> 究竟 soft link 的 indirect pointer 寫在哪?
>
> 能否再請兩位黃老師及其他前輩解惑嗎?
>
>
> 回宇新:
> 我的資料主要來源於:
> 1) 百資出版的"Linux 核心"(ISBN:957-97830-4-7)第128-130頁
> 2) IBM Linux 教材(LX03, ERC3.0)第10節
> 3) John's spec of the second extended filesystem
>     http://uranus.it.swin.edu.au/~jn/explore2fs/es2fs.htm
> 4) Design and Implementation of the Second Extended Filesystem
>     http://e2fsprogs.sourceforge.net/ext2intro.html
>
> --
>
> ======= http://www.study-area.org =======
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑﹗


"阿西" <yuhsi.bbs@bbs.cis.nctu.edu.tw> 在郵件 news:4CN4Qe$JPk@bbs.cis.nctu.edu.tw 中撰寫...
> ==> 在 "網中人" <netman@junk.com> 的文章中提到:
> > "阿西" <yuhsi.bbs@bbs.cis.nctu.edu.tw> 在郵件
> > news:4CMh9f$J5b@bbs.cis.nctu.edu.tw 中撰寫...
> > > 至於direct indirect reference那是檔案大小跟搜尋效率的平衡作法
> > > 檔案小時  用那12個direct對應就一下直接找到對應的block
> > > 檔案大時  就要用複雜點的indirect去找
> > > 所以要看這個directory下的檔案多不多  檔名長不長  使得directory entry太大
> > > 所以direct indirect跟soft link沒甚麼關係  只是檔案大小跟定址的關係
> > 哦,謝謝 Cyril 兄的說明﹗看來是我理解了 宇新兄 的貼子了:
> > > A soft link (or symbolic link) provides an indirect pointer to a file.
> > 上句的 indirect 並不是指 indirect block ,
> > 而是一個定語冠詞,以修飾 pointer 之用的...  ^_^
> 好吧 forget about anything about the 12 direct, indirect, doubly indirect...
> ^_^
>
> 這邊講的是非直接的指向某個神秘地方
> 那就是那個soft link的檔案內容
> 我想in memory inode或 in disk indoe應該沒有indirect pointer這樣名詞
>
> > 不過,我的疑問還沒解決:
> > --> 究竟 soft link 的 indirect pointer 寫在哪?
> > 能否再請兩位黃老師及其他前輩解惑嗎?
> 好像前面lcp 與lloyd兄已經有答案了
> 就是那個symbolic檔內的內容  是link的那個檔名
> 所以還是要佔data block的 其實通通都要佔data block  只是hard link佔的少
> 只有directory entry
>
> readlink(1) readlink(2)都可以看到soft link檔內容
> ?
> ext2的readlink
> static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen)
> {
>         char *s = (char *)dentry->d_inode->u.ext2_i.i_data;
>         return vfs_readlink(dentry, buffer, buflen, s);
> }
> 只是很單純的把inode的檔案內容還回去  在vfs_readlink就是copy_to_user();
> 所以要檢查的是
> symlink這個system call怎麼寫下去的
> 所以在ext2_symlink裡面有一段
>
>         inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO);
>         err = PTR_ERR(inode);
>         if (IS_ERR(inode))
>                 goto out;
>
>         if (l > sizeof (inode->u.ext2_i.i_data)) {
>                 /* slow symlink */
>                 inode->i_op = &page_symlink_inode_operations;
>                 inode->i_mapping->a_ops = &ext2_aops;
>                 err = block_symlink(inode, symname, l);
>                 if (err)
>                         goto out_fail;
>         } else {
>                 /* fast symlink */
>                 inode->i_op = &ext2_fast_symlink_inode_operations;
>                 memcpy((char*)&inode->u.ext2_i.i_data,symname,l);
>                 inode->i_size = l-1;
>         }
> symname在這邊被memcpy到inode->u.ext2_i.i_data了
> 最後會被ext2_update_inode寫入
>
[/list]

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
hard link
« 回覆 #16 於: 2004-05-30 00:15 »
問題似乎依然未解:
    "網中人" <netman@junk.com> 在郵件 news:c96nhc$1ki$1@news.seed.net.tw 中撰寫...
    >
    >
    > "網中人" <netman@junk.com> 在郵件 news:c8uvfc$78s$1@news.seed.net.tw 中撰寫...
    > >
    > > "阿西" <yuhsi.bbs@bbs.cis.nctu.edu.tw> 在郵件
    > > news:4CN4Qe$JPk@bbs.cis.nctu.edu.tw 中撰寫...
    > >
    > > > 好像前面lcp 與lloyd兄已經有答案了
    > > > 就是那個symbolic檔內的內容  是link的那個檔名
    > > > 所以還是要佔data block的 其實通通都要佔data block  只是hard link佔的少
    > > > 只有directory entry
    > >
    > > 看來,這就是我要的...  ^_^
    > > 感謝 Cyril 兄的說明﹗以及所有幫忙的朋友﹗
    > >
    >
    > 再次感謝眾前輩解釋 hard link 的知識﹗
    > 然而,小弟仍有一處不解,肯請前輩再次幫忙。
    >
    > 從 Cyrial 兄的貼子看來,
    > soft link 還是需要一個 data-block 來存放 pointer 。
    > 我想請教一下,可有方法來驗證嗎?
    >
    > 如下是我用 tune2fs 觀察的結果及疑問:
    >
    > 1)
    > # tune2fs -l /dev/hda7 | grep -i Free
    > Free blocks:              367223
    > Free inodes:              206802
    > 這是實驗前看到的 Free blocks 與 inodes 數量。
    >
    > 2)
    > # echo -n 1 > 1.txt
    > # tune2fs -l /dev/hda7 | grep -i Free
    > Free blocks:              367222
    > Free inodes:              206801
    > 建立一個 1byte 的檔案後,看得出 block 與 inode 都消耗了一個。
    >
    > 3)
    > # ln 1.txt 1.hard
    > # tune2fs -l /dev/hda7 | grep -i Free
    > Free blocks:              367222
    > Free inodes:              206801
    > 建立 hard link 並沒消耗任何的 block 與 inode 。
    >
    > 4)
    > # ln -s 1.txt 1.soft
    > # tune2fs -l /dev/hda7 | grep -i Free
    > Free blocks:              367222
    > Free inodes:              206800
    > 建立 soft link ,inode 被消耗了一個,這可以理解。
    > 但是,不解的是:為何 block 沒有消耗呢?
    > 若不消耗 block ,那 soft link 的 pointer 又存在哪?
    > (sorry,又回到之前的老問題去了...)
    >
    > 感謝解惑﹗
    >
    > --
    >
    > =======
http://www.study-area.org =======
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑﹗
> [/list]

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
hard link
« 回覆 #17 於: 2004-06-01 01:00 »
okay 答案終於出爐:

    "不務正業" <AD.bbs@bbs.sayya.org> 在郵件 news:4CS0AL$4Xg@bbs.sayya.org 中撰寫...
    > ※ 引述《netman@junk.com (網中人)》之銘言:
    > > "網中人" <netman@junk.com> 在郵件 news:c8uvfc$78s$1@news.seed.net.tw 中撰寫...
    > > > "阿西" <yuhsi.bbs@bbs.cis.nctu.edu.tw> 在郵件
    > > > news:4CN4Qe$JPk@bbs.cis.nctu.edu.tw 中撰寫...
    > > > 看來,這就是我要的...  ^_^
    > > > 感謝 Cyril 兄的說明﹗以及所有幫忙的朋友﹗
    > > 再次感謝眾前輩解釋 hard link 的知識﹗
    > > 然而,小弟仍有一處不解,肯請前輩再次幫忙。
    > > 從 Cyrial 兄的貼子看來,
    > > soft link 還是需要一個 data-block 來存放 pointer 。
    > > 我想請教一下,可有方法來驗證嗎?
    > > 如下是我用 tune2fs 觀察的結果及疑問:
    > > 1)
    > > # tune2fs -l /dev/hda7 | grep -i Free
    > > Free blocks:              367223
    > > Free inodes:              206802
    > > 這是實驗前看到的 Free blocks 與 inodes 數量。
    > > 2)
    > > # echo -n 1 > 1.txt
    > > # tune2fs -l /dev/hda7 | grep -i Free
    > > Free blocks:              367222
    > > Free inodes:              206801
    > > 建立一個 1byte 的檔案後,看得出 block 與 inode 都消耗了一個。
    > > 3)
    > > # ln 1.txt 1.hard
    > > # tune2fs -l /dev/hda7 | grep -i Free
    > > Free blocks:              367222
    > > Free inodes:              206801
    > > 建立 hard link 並沒消耗任何的 block 與 inode 。
    > > 4)
    > > # ln -s 1.txt 1.soft
    > > # tune2fs -l /dev/hda7 | grep -i Free
    > > Free blocks:              367222
    > > Free inodes:              206800
    > > 建立 soft link ,inode 被消耗了一個,這可以理解。
    > > 但是,不解的是:為何 block 沒有消耗呢?
    > > 若不消耗 block ,那 soft link 的 pointer 又存在哪?
    > > (sorry,又回到之前的老問題去了...)
    > > 感謝解惑﹗
    >
    > 最近剛好在接觸 linux source code,以 ext2 為例 (2.4.25-gentoo-r2):
    >
    > static int ext2_symlink (struct inode * dir, struct dentry * dentry,
    >         const char * symname)
    > {
    >     ...
    >
    >         unsigned l = strlen(symname)+1;
    >         struct inode * inode;
    >     ...
    >
    >         if (l > sizeof (inode->u.ext2_i.i_data)) {
    >                 /* slow symlink */
    >                 inode->i_op = &page_symlink_inode_operations;
    >                 inode->i_mapping->a_ops = &ext2_aops;
    >                 err = block_symlink(inode, symname, l);
    >                 if (err)
    >                         goto out_fail;
    >         } else {
    >                 /* fast symlink */
    >                 inode->i_op = &ext2_fast_symlink_inode_operations;
    >                 memcpy((char*)&inode->u.ext2_i.i_data,symname,l);
    >                 inode->i_size = l-1;
    >         }
    >
    >     ...
    > }
    >
    > 大概可以推測:當 i_data 可以容納 soft link 的檔名時,便不用消耗 block。
    > ( 在 struct ext2_inode_info 中的宣告是 __u32  i_data[15],也就是 480 bytes )
    >
    > 在 ext3 的情形也類似的,其他的 filesystem 我就沒有查了 :)
    > --



    "網中人" <netman@junk.com> 在郵件 news:c9fo63$6n8$1@news.seed.net.tw 中撰寫...
    >
    >
    > "不務正業" <AD.bbs@bbs.sayya.org> 在郵件 news:4CS0AL$4Xg@bbs.sayya.org 中撰寫...
    > >
    > > 最近剛好在接觸 linux source code,以 ext2 為例 (2.4.25-gentoo-r2):
    > >
    > > static int ext2_symlink (struct inode * dir, struct dentry * dentry,
    > >         const char * symname)
    > > {
    > >     ...
    > >
    > >         unsigned l = strlen(symname)+1;
    > >         struct inode * inode;
    > >     ...
    > >
    > >         if (l > sizeof (inode->u.ext2_i.i_data)) {
    > >                 /* slow symlink */
    > >                 inode->i_op = &page_symlink_inode_operations;
    > >                 inode->i_mapping->a_ops = &ext2_aops;
    > >                 err = block_symlink(inode, symname, l);
    > >                 if (err)
    > >                         goto out_fail;
    > >         } else {
    > >                 /* fast symlink */
    > >                 inode->i_op = &ext2_fast_symlink_inode_operations;
    > >                 memcpy((char*)&inode->u.ext2_i.i_data,symname,l);
    > >                 inode->i_size = l-1;
    > >         }
    > >
    > >     ...
    > > }
    > >
    > > 大概可以推測:當 i_data 可以容納 soft link 的檔名時,便不用消耗 block。
    > > ( 在 struct ext2_inode_info 中的宣告是 __u32  i_data[15],也就是 480 bytes )
    > >
    > > 在 ext3 的情形也類似的,其他的 filesystem 我就沒有查了 :)
    >
    > 真是太感謝了﹗  ^_^
    > 根據 AD 兄提示,在下的測試結果如下:
    >
    > 1)
    >
[kenny@pc2 kenny]$ cd
> [kenny@pc2 kenny]$ mkdir tmp
> [kenny@pc2 kenny]$ cd tmp
> [kenny@pc2 tmp]$ sudo /sbin/tune2fs -l /dev/hda14 | grep Free
> Free blocks:              52904
> Free inodes:              237287
> 這是實驗前看到的資訊。
>
> 2)
> [kenny@pc2 tmp]$ for ((i=1;i<=500;i++)); do mkdir $i; cd $i; done
> [kenny@pc2 500]$ sudo /sbin/tune2fs -l /dev/hda14 | grep Free
> Free blocks:              52404
> Free inodes:              236787
> 建立 500 個目錄後,block 與 inode 也減少了 500 個單位。
>
> 3)
> [kenny@pc2 500]$ ln -s $PWD ~/500
> [kenny@pc2 500]$ sudo /sbin/tune2fs -l /dev/hda14 | grep Free
> Free blocks:              52403
> Free inodes:              236786
> 建一個長度超過 480 bytes 的 soft link ,
> 結果真的會耗掉一個 block 耶﹗
>
> 4)
> [kenny@pc2 500]$ cd ..
> [kenny@pc2 499]$ ln -s 500 d500
> [kenny@pc2 499]$ sudo /sbin/tune2fs -l /dev/hda14 | grep Free
> Free blocks:              52403
> Free inodes:              236785
> 建一個 3 個 bytes 的 soft link,結果並沒有消耗任何 block ...
>
> 實驗結果證明了 AD 兄的推論。
> 感謝 AD 兄解開了小弟長期以來的一個盲點﹗
> 真是太 cool 了﹗~~~   ^_^
>
>
> --
>
> ======= http://www.study-area.org =======
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑﹗
[/list]