Linux命令之ln,linuxln
永久連結與軟連結是 Linux 檔案系統中的一個重要概念,其涉及檔案系統中的索引節點 (index node 又稱 inode),而索引節點對象是 Linux 虛擬檔案系統 (VFS) 的四個基本概念之一。
不過討論連結之前,有必要複習一下Linux的檔案系統和檔案。提起檔案,我們最先想到的就是檔案名稱和檔案內容。沒錯,這的確是我們(人類)最關心的兩個屬性,但是在電腦看來,除此之外還需要加入更多的屬性才能實現有效檔案管理。這些屬性從電腦的角度可以分為兩大類:中繼資料和使用者資料,電腦關心的是前者,因為中繼資料是實現管理的關鍵,而這個檔案裡面到底存了哪些內容卻並不關心(準確的說是檔案系統並不關心,但不代表其他組件不關心);使用者資料是人類關心的焦點,但是人類並不關心中繼資料——那是電腦的事。有趣的是,檔案名稱並不在中繼資料的範圍之內,電腦並不關心檔案名稱是什麼,後面將會解釋。
在這篇文章中我曾仔細的介紹過磁碟與檔案系統,但是太羅嗦了,這裡說一下重點:
+ 建立檔案系統的時候,至少要有兩個部分:inode table和data blocks,前者存放inode,後者就是檔案內容存放區。當然還有其他重要部分。
+ 檔案系統將一個檔案的所有資訊分成中繼資料和使用者資料分別存放在不同的位置。存放中繼資料的是inode,而使用者資料存放在data blocks中。inode中有很多重要資料,但是最重要的恐怕就是使用者資料存放在哪個block。普通檔案的使用者資料不必多說,但是目錄檔案的data block到底都是些什嗎?就是這個目錄下所有檔案的名字以及對應的inode,類似於一個映射表。
+ 在操作一個檔案的時候,至少會提供兩個基本參數:路徑名和檔案名稱。路徑名就是分類樹,樹根就是根目錄“/”。檔案系統首先會找到檔案所在目錄的inode(絕對路徑我猜是從根目錄開始遞迴查詢的,相對路徑可能有更快的方法),從而找到目錄內容在的block,從中尋找與檔案名稱對應的inode,然後才能從這個inode中找到檔案內容所在的block。可見,檔案名稱並不是檔案系統定位檔案的唯一標識,inode才是。檔案名稱是給人類看的。
然後什麼才是連結呢?從面我們知道,檔案內容的位置資訊存放在它的inode中,且這個inode是唯一的。而要尋找這個inode,只能去其父目錄的的data block中,這裡記錄了檔案名稱和對應inode的映射。而映射可以是多對一的,於是存在這麼一種情況,有兩個不同的檔案名稱指向同一個inode,當然這種映射不必存在於同一張映射表中,比如/etc下有一個檔案叫test1,那麼/etc的data block中必然記錄了test1和其inode的映射;而在/user中有個檔案叫test2,且在/user的data block中,與test2對應的是同一個inode,這種情況下,test1就是test2的永久連結,反過來也成立,反正它們指向同一個inode然後同樣的data block。可見,建立一個永久連結其實就是在目錄的data block的映射表中增加一項,且增加項的inode是已經存在的。永久連結只是增加了目錄的data block的內容,沒有增加inode的總使用量,也沒有增加data block的總使用量,形象的說只是為原來的檔案增加了一個新的入口。
那麼軟串連的原理又是什麼呢?軟串連是在目前的目錄下建立一個檔案,擁有全新的inode和data block,然而檔案的使用者資料,也就是data block中的內容是另一個檔案的檔案名稱和路徑等資訊。
可以對比一下複製檔案,複製一個檔案到另一個目錄,不僅要給新檔案分配新的inode和data block,還要把源檔案的內容copy到新檔案中。
通過ls -l命令可以查看一個目錄下所有檔案的連結計數情況:
m@sys:~/program/C_codes/tools/calculators$ ll總用量 20drwxrwxr-x 2 m m 4096 5月 4 00:16 ./drwxrwxr-x 3 m m 4096 4月 24 11:24 ../-rw-rw-r-- 1 m m 340 4月 24 14:10 calculator.l-rw-rw-r-- 1 m m 673 5月 4 00:16 calculator.y-rw-rw-r-- 1 m m 367 4月 24 14:20 Makefile
我們看到,對於普通檔案,其連結計數都是1(假如不存在其他永久連結),而有“.”表示的目錄本身的連結計數卻是2。實際上,在目前的目錄下每建立一個子目錄,都會使目前的目錄的連結計數增加1。但是一個子目錄也沒有時為什麼是2呢?首先看看1是怎麼來的:顯然,每個檔案都有父目錄(根目錄似乎也有。。),那麼父目錄的data block中肯定有這個檔案的一個映射,這就是1的來源;那為什麼每個目錄檔案的連結計數至少是2?因為除了父目錄中的映射,代表當前的“.”也是一次引用,從上面的結果中看以看出,這個“.”應該是記錄在該目錄的data block中,所以至少連結數是2。我們還看到,每個子目錄中還添加了符號“..”,代表上層目錄,所以每增加一個子目錄,父目錄的連結計數都會增加1。
使用ln命令可以建立連結,ln是最常用的命令,但不是唯一的,cp命令也可以建立連結,這個以後再說。
其使用格式為:ln 源檔案名稱 連結名
要注意添加路徑。不加選項時,建立的就是永久連結,像建立軟串連的話,需要加上選項-s。這是ln最基本的用法,更多的請參考man ln。
軟永久連結的一些注意事項:
1. 永久連結不可以對目錄使用;
2. 永久連結只能對已經存在的檔案使用;
3. 軟串連可以對不存在的檔案使用;
4. 源檔案移動後,軟串連失效;
5. 建立軟串連可以使用相對路徑,但連結檔案本身移動後連結會失效。