Linux 中的文件分爲 Hard Link 和 Symbolic Link 兩種。Hard Link 文件又被稱爲硬連接文件、實體連接文件,Symbolic Link 文件則常被稱爲符號連接、軟連接文件。html
ln 命令用來在文件之間創建連接。在介紹 ln 命令前,讓咱們先來搞清楚究竟什麼是硬連接,什麼又是軟連接。node
咱們知道,在 Linux 系統中,每一個文件對應一個 inode,文件的內容在存儲在 inode 指向的 data block 中。要讀取該文件的內容,須要經過文件所在的目錄中記錄的文件名找到文件的 inode 號,而後經過 inode 找到存儲文件內容的 data block(參考《Linux 文件與目錄》)。
也就是說,文件名存儲在目錄中,inode 號執行文件存儲的內容,文件名和 inode 之間有一個對應關係。那麼多個文件名可不能夠同時指向同一個 inode 呢?答案是能夠的,這就是硬連接!從本質上來講,硬連接只是在目錄下新添加了一個文件名,這個文件名與一個已有文件的 inode 相關聯。讓咱們也經過 /etc/crontab 文件來進行觀察:linux
$ ll -i /etc/crontab 131213 -rw-r--r-- 1 root root 722 Nov 16 2017 /etc/crontab
使用 ln 命令在當前目錄下建立一個 /etc/crontab 文件的硬連接,而後觀察其文件屬性:spa
$ sudo ln /etc/crontab . $ ll -i /etc/crontab crontab 131213 -rw-r--r-- 2 root root 722 Nov 16 2017 crontab 131213 -rw-r--r-- 2 root root 722 Nov 16 2017 /etc/crontab
這兩個文件名關聯的 inode 號徹底相同,都是 131213,因此它們指向的是同一個文件。同時請注意文件屬性中的第三個字段,由 1 變成了 2。這個字段被稱爲 "連接數",它說明有多少個文件名連接到同一個文件的 inode。
另外須要注意的一點是上面全部輸出中的第二個字段中的第一位,它們都是 "-",它說明這個文件的類型爲普通文件,連接類型爲硬連接。.net
咱們能夠經過下圖來理解硬連接在文件系統中的實現方式:code
硬連接的特色htm
因爲硬連接只是在目錄中添加了一條包含文件名和 對應 inode 的記錄,因此它幾乎不會消耗額外的磁盤容量。
另外在刪除硬連接所關聯的文件時,其實只是刪除了一條目錄中的記錄,真正的文件並不受影響。只有在刪除最後一個硬連接時纔會真正刪除文件的內容數據。 blog
硬連接的侷限性crontab
因爲這兩個限制,實際使用中硬連接並無軟連接使用的普遍,下面咱們看看究竟什麼是軟連接。字符串
軟連接的實現方式與硬連接有本質上的不一樣。建立軟連接時會建立一個新的文件(分配一個 inode 和對應的 data block),新文件的 data block 中存儲了目標文件的路徑。
還拿 /etc/crontab 文件舉例子,此次建立一個軟連接並查看其文件屬性:
$ sudo ln -s /etc/crontab crontab2
第一列,兩個文件名對應的 inode 不一樣,說明這是兩個文件。
第二列顯示的文件權限也不同,這一點和硬連接徹底不一樣。注意文件類型被標記爲 "l",說明這是一個軟連接文件。
第三列頗有意思,注意 /etc/crontab 文件的連接數量,仍是 2,這和建立軟連接文件 crontab2 前是同樣的。也就是說建立軟連接並不增長原文件的連接數。
第六列是文件大大小,注意新建的軟連接文件大小爲 12 Bytes,也就是字符串 "/etc/crontab" 的長度。
最後一列會友好的顯示出軟連接文件指向的源文件。
咱們能夠經過下圖來理解軟連接在文件系統中的實現方式:
從上圖咱們能夠看出,軟連接文件 crontab2 是一個實實在在的文件,有本身的 inode 和 data block。可是它的 data block 中保存的是目標文件的地址:/etc/crontab。 像 open() 這樣的 API 可以識別出軟連接,並根據 data block 中的目標文件徑把操做重定向到目標文件上。
能夠連接目錄是軟連接的一大優點,建立目錄連接的方式和普通文件同樣:
$ ln -s /bin testbin
此時進入 testbin 目錄和進入 /bin 目錄是同樣的。
更厲害的是,還能夠跨文件系統建立軟連接!
刪除源文件
對於軟連接來講,刪除源連接後,連接文件就會沒法找到指向的源文件了。看下面的演示:
$ echo "hello world" > hello.txt $ ln -s hello.txt hello2 $ cat hello2 hello world $ rm hello.txt $ cat hello2 cat: hello2: No such file or directory
刪除原文件後,操做連接文件時的提示是:"No such file or directory"。
從上文中的示例咱們能夠看到,當建立硬連接文件時,文件的連接數會增長 1,而建立軟連接時文件的連接數卻不發生變化。
下面讓咱們看一個目錄文件的連接數,先建立一個空目錄:
$ mkdir /home/nick/testdir $ ll /home/nick | grep testdir drwxr-xr-x 2 nick nick 4096 Jul 10 08:58 testdir/
新建的空目錄有兩個硬連接,分別是:
/home/nick/testdir
/home/nick/testdir/.
而 /home/nick/testdir 目錄下還有一個指向其父目錄的硬連接:/home/nick/testdir/..
也就是說當咱們建立一個目錄時,其父目錄的硬連接數會增長 1。
ln 命令用來在文件之間創建連接,其的經常使用方式爲:
ln source target
ln -s source target
它們分別用來建立硬連接文件和軟連接文件。還有一個比較經常使用的選項是 f,它會強制刪除已經存在的目標文件。
參考:
ln man page
鳥哥的私房菜
完全理解「軟連接」和「硬連接」
The difference between hard and soft links