要提到 inode 之前,我們得先來了解一下硬盤的整體構造才行!硬盤裡面有多個硬盤盤組合在一起,而一個硬盤盤可以如下圖所示,硬盤盤為圓形的,其中,每一個硬盤盤上面都有個可以讀寫的磁頭( Head ),而當這個磁頭固定住,讓硬盤盤轉一圈,那麼那一個圓形的就是磁道( Track )啦,而在硬盤內的幾個硬盤盤同半徑的那一圈的磁道總和稱為磁柱( Cylinder ),而由圓心向外畫出直線,可以得到如下圖所示,那麼那一顆一顆的咚咚,就是硬盤的最小儲存物理量,我們稱為扇區( setctor ),一個扇區的物理量大約是 512 bytes ( 約 0.5K )。
磁頭 ( Head ) :可擦寫的金屬磁盤;
磁道 ( Track ) :讀寫頭轉一圈 ( 同心圓的一圈 ) 的量;
扇區 ( Sector ) :最小的物理儲存量。
好了,知道了大體的硬盤構造之後,再來談一談怎麼硬盤分割( partition )呢?我們在進行硬盤分割的時候,最小都是以磁柱為單位進行分割的,那麼分割完成之後自然就是格式化( format )啰,在 Linux 裡面我們在進行格式化的時候必須要考慮到 Block 與 inode 的信息,這個 block 還好理解,他是我們磁盤可以記錄的最小單位,是由數個 sector 所組成的,所以他的大小通常為 n*512 bytes ,例如 4K 。那麼 inode 是什麼? Block 是記錄『檔案內容數據』的地區,而 inode 則是記錄『該檔案的屬性、及該檔案放置在哪一個 Block 之內』的信息!所以,每個檔案都會占用到至少一個 inode 。而當我們 Linux 系統要找到這個檔案時,他會先去搜尋 inode table 找到這個檔案的屬性及數據放置的地區,然後再到數據去找到數據存放的 Block 進而將數據取出利用。這個 inode 數目在一開始就會被設定好,他的設定方式通常是利用 ( 硬盤大小 / 一個容量 ),這個容量至少應該比 Block 要大一些較佳,例如剛剛的 Block 訂為 4K ,那麼 inode 可以訂為 8K 左右。所以,一顆 1GB 的硬盤,如果以 8K 來規劃他的 inode 數時,他的 inode 就會有 131072 個 inode 啦!而一個 inode 的大小為 128 bytes 這麼大!這麼一來的話,我們就可以清楚的知道了,那就是一個 partition 格式化為一個 filesystem 之後,基本上,他一定會有 inode table 與 data area 兩個區塊,一個用來記錄檔案的信息與該檔案放置的 block 區塊,一個用來記錄檔案的內容!
由於我們 Linux 在讀取數據的時候,是先查詢 inode table 以得到數據是放在那個 Block 裡面,然後再去該 Block 裡面讀取真正的數據內容!然後,那個 block 是我們在格式化硬盤的時候規定出來的一個值,這個 block 是由 2 的 n 次方個 sector 所集結而成的!所以,他是 0.5K 的倍數喔!假設我們 block 規劃為 4KBytes 好了,那麼由於一個 inode 與一個 block 最多均只紀錄一個檔案,所以,哈哈!如果你的一個檔案有 0.1 K bytes 這麼大時,你要曉得的是,由於你的 block 為 4K bytes ,因此,你就會有 3.9 Kbytes 的空間『浪費掉』喔!所以,當你在格式化硬盤的時候,請千萬注意到你的系統未來的使用方向喔!
當 block 越小 ( 最小為 0.5K ) 、inodes 越多,可利用空間越多,但是大檔案寫入效率較差:適合檔案數量多但是檔案容量小的系統,例如 BBS 或者新聞群組 news 這方面的服務之系統;
當 block 越大 ( 最大可到 16 * 0.5K 以上 ) 、 inodes 數越少,大檔案寫入效率較佳,但浪費的空間較多:適合檔案容量大的系統。
--------------------------------------------------------------------------------
ln
OK!知道了什麼是 inode 與他的功能之後,接著下來就要來介紹 link 這個玩意兒了!說到 link 其實也沒有什麼大不了的,說穿了,就真的有點像是 Windows 的『快捷方式』一樣,不過, link 的功能要好的多呦! Link 又分為 hard link 與 symbolic link 兩種方式,分別來談一談:
Hard Links:
剛剛說過,當系統要讀取某一個檔案的時候,就會先去讀 inode table ,然後再根據 inode 的信息到 block area 去將數據取出來利用!而 hard link 就是直接再建立一個 inode 連結到檔案放置的 block 區塊。也就是說,進行 hard link 的時候,實際上,你的檔案內容不會改變,只是你在查詢的時候,利用原來的 inode 與後來的 inode 均可被指定到該檔案放置的地點,因此兩個檔案的內容會是一樣的!所以讀取任何一個 inode 的結果都是存取在同一個檔案的內容就是了。不過,這樣一來就有個問題啦,因為 inode 是會連結到 block 區域去的,而『目錄』本身僅消耗 inode 而已,那麼一來的話, hard link 不就不能 link 目錄啦?對的!沒錯! Hard link 有兩個最大的限制:
不能跨 filesystem ,因為不同的 filesystem 有不同的 inode table 嘛!
不能 link 目錄!
Symbolic Links:
相對於 hard link , Symbolic link 可就好理解多了,基本上,他就是在建立一個獨立的檔案,而這個檔案會讓數據讀取指向他 link 的那個檔案內容!由於只是利用檔案來做為指向的動作,所以,當來源檔被刪除之後,symbolic link 的檔案會『開不了』,會一直說『無法開啟某檔案!』
所以,看樣子,似乎 hard link 比較安全,因為即使某一個 inode 被殺掉了,只要有任何一個 inode 存在,那麼該檔案就不會不見!不過,不幸的是,由於 Hard Link 的限制太多了,包括無法做『目錄』的 link ,所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方向較廣喔!好了,說的天花亂墜,看您也差不多快要昏倒了!沒關系,實作一下就知道怎麼回事了!
特別留意,底下的案例中,我們是將系統的設定文件 copy 到 /root/test 底下進行測試用的,請不要在 /etc/ 底下做,未來我們的工作目錄都會在 /root/test 底下進行,這有個好處,是可以讓您清楚的知道,這是用來 test 用的啦!
語法: [root @test /root ]# ln [-s] [來源檔] [目的檔]
參數說明:
-s :提供連結檔的連結!如果直接以 ln 不加任何參數的話,那麼就屬於 hard link 啰!
范例:
[root @test /root]# mkdir test
[root @test /root]# cd test
[root @test /test]# cp /usr/bin/passwd .
0. 原本的信息:
[root @test /test]# ll
-rw-r--r-- 1 root root 13476 Jun 26 11:31 passwd
[root @test /test]# du -k <==查看該目錄下的占用硬盤空間
20
1. Hard Link 信息:
[root @test /test]# ln passwd passwd-hard
[root @test /test]# ll
total 32
-rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd
-rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd-hard
注意看,上面那個數字變成 2 啰!這就是占用掉 inodes 啰!
[root @test /test]# du -k
20 <==注意看,容量並沒有變大!因為是 link 檔案呀!
2. Symbolic Link 信息:
[root @test /test]# ln -s passwd passwd-soft; ll
-rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd
-rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd-hard
lrwxrwxrwx 1 root root 6 Jun 26 11:37 passwd-sofe -> passwd
注意啰!該 Symbolic Link 的檔案是有容量的呦!
注意啰, passwd-soft 會指到另外一個檔案去,而且,最前面屬性顯示 l ,
此外,他是一個獨立的檔案!先殺掉 passwd 後,我們分別 more 一下內容:
3. 用 more 來試試看是怎樣?!
[root @test test]# rm passwd
rm: remove regular file `passwd'? y
[root @test test]# more passwd-hard
………(正常顯示)
[root @test test]# more passwd-soft
passwd-soft: No such file or directory
說明:
要注意啰!如果不加任何參數的話,那麼就是 Hard Link 啰!如同上面的情況,增加了 hard link 之後,可以發現 link 那一欄屬性增加了!而如果這個時候砍掉 passwd 會發生什麼事情呢?呵呵! passwd-hard 的內容還是會跟原來 passwd 相同,但是 passwd-soft 就會找不到該檔案啦!就是這樣!了解了嗎?!還有,跟 cp 也不一樣呦!因為雖然 Hard Link 的檔案看起來是有容量的,但是基本上還是指向原來的檔案,所以啰,整體容量是沒有增大的啦!
而如果使用 -s 的參數時,就做成差不多是 Windows 底下的『快捷方式』的意思(Symbolic Link,較常用!)不過,需要特別注意的是, Linux 的 link 與 Windows 的快捷方式是不一樣的東西!舉個例子說,當你在 Windows 建立一個快捷方式時,你可以在這個快捷方式內修改任何數據,而你的原始數據並不會跟著變!不過,當你修改 Linux 下的 link 檔案時,則更動的其實是『原始檔』,呵呵,所以不論你的這個原始檔被連結到哪裡去,只要你修改了連結檔,呵呵!原始檔就跟著變啰!以上面為例,由於你使用 -s 的參數建立一個名為 passwd-soft 的檔案,則你修改 passwd-soft 時,其內容與 passwd 完全相同,並且,當你按下儲存之後,被改變的將是 passwd 這個檔案!
此外,如果你做了底下這樣的連結:
ln –s /bin /root/bin
那麼如果你進入 /root/bin 這個目錄下,『請注意呦!該目錄其實是 /bin 這個目錄,因為你做了連結檔了!』所以,如果你進入 /root/bin 這個剛剛建立的連結目錄,並且將其中的數據殺掉時,嗯! /bin 裡面的數據就通通不見了!這點