在linux系統中有種文件是鏈接文件,可以為解決文件的共享使用。鏈接的方式可以分為兩種,一種是硬鏈接(Hard Link),另一種是軟鏈接或者也稱為符號鏈接(Symbolic Link)。
查看linux系統中哪些是鏈接文件。
l 為符號鏈接
上圖文件列表中第一列權限位標識第一個字符顯示的是文件類型,-為一般文件,d為目錄,而l顯示的就是鏈接文件。
此時每行顯示一個文件或者目錄的信息。第一個字母描述文件類型:- 為一般文件,d 為目錄,l 為符號鏈接。
硬鏈接
硬鏈接是指通過索引節點來進行鏈接。在Linux的文件系統中,保存在磁盤分區中的文件不管是什么類型都會給它分配一個編號,這個編號被稱為索引節點編號號(Inode
Index)或者Inode,它是文件或者目錄在一個文件系統中的唯一標識,文件的實際數據放置在數據區域(data block),它存儲着文件重要參數信息,也就是元數據 (metadata),比如創建時間、修改時間、文件大小、屬主、歸屬的用戶組、讀寫權限、數據所在block號等,如下圖所示。
圖片來源於網絡
在Linux系統中,多個文件名指向同一索引節點(Inode)是正常且允許的。一般這種鏈接就稱為硬鏈接。硬鏈接的作用之一是允許一個文件擁有多個有效路徑名,這樣用戶就可以建立硬鏈接到重要的文件,以防止“誤刪”源數據(很多硬件,如netapp存儲中的快照功能就應用了這個原理,增加一個快照就多了一個硬鏈接》。不過硬鏈接只能在同一文件系統中的文件之間進行鏈接,不能對目錄進行創建。之所以文件建立了硬鏈接就會防止數據誤刪,是因為文件系統的原理是,只要文件的索引節點還有一個以上的鏈接(僅刪除了該文件的指向),只刪除其中一個鏈接並不影響索引節點本身和其他的鏈接(數據的實體並未刪除),只有當最后一個鏈接被刪除后,此時如果有新數據要存儲到磁盤上,被刪除的文件的數據塊及目錄的鏈接才會被釋放,空間被新數據暫用覆蓋。
軟鏈接
軟鏈接(也叫符號鏈接),類似於windows系統中的快捷方式,與硬鏈接不同,軟鏈接就是一個普通文件,只是數據塊內容有點特殊,文件用戶數據塊中存放的內容是另一文件的路徑名的指向,通過這個方式可以快速定位到軟連接所指向的源文件實體。軟鏈接可對文件或目錄創建。
軟鏈接作用:
- 便於文件的管理,比如把一個復雜路徑下的文件鏈接到一個簡單路徑下方便用戶訪問。
- 節省空間解決空間不足問題,某個文件文件系統空間已經用完了,但是現在必須在該文件系統下創建一個新的目錄並存儲大量的文件,那么可以把另一個剩余空間較多的文件系統中的目錄鏈接到該文件系統中。
刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接就變成了死鏈接。
軟連接和硬鏈接的特點:
軟鏈接:
- 1.軟鏈接是存放另一個文件的路徑的形式存在。
- 2.軟鏈接可以 跨文件系統 ,硬鏈接不可以。
- 3.軟鏈接可以對一個不存在的文件名進行鏈接,硬鏈接必須要有源文件。
- 4.軟鏈接可以對目錄進行鏈接。
硬鏈接:
- 1. 硬鏈接,以文件副本的形式存在。但不占用實際空間。
- 2. 不允許給目錄創建硬鏈接。
- 3. 硬鏈接只有在同一個文件系統中才能創建。
- 4. 刪除其中一個硬鏈接文件並不影響其他有相同 inode 號的文件。
不論是硬鏈接或軟鏈接都不會將原本的檔案復制一份,只會占用非常少量的磁碟空間。
linux系統可以用ln命令來創建鏈接文件。
ln命令格式:
ln [參數] [源文件或目錄] [目標文件或目錄]
主要參數:
- -i 交互模式,文件存在則提示用戶是否覆蓋。
- -s 軟鏈接(符號鏈接)。
- -d 允許超級用戶制作目錄的硬鏈接。
- -b 刪除,覆蓋以前建立的鏈接
- 軟鏈接 (符號鏈接) ln -s source target
- 硬鏈接 (實體鏈接)ln source target
案例:
給文件創建硬鏈接
[root@localhost tmp]# mkdir dirIn 創建測試目錄 [root@localhost tmp]# cd dirIn/ [root@localhost dirIn]# touch infile [root@localhost dirIn]# ll 總用量 0 -rw-r--r-- 1 root root 0 5月 31 14:53 infile [root@localhost dirIn]# ln infile infile_hard_file 在默認不帶參數情況下,ln命令創建的是硬鏈接。 [root@localhost dirIn]# ll 總用量 0 -rw-r--r-- 2 root root 0 5月 31 14:53 infile -rw-r--r-- 2 root root 0 5月 31 14:53 infile_hard_file
給文件創建軟鏈接
[root@localhost dirIn]# ln -s infile infile_soft_file 創建軟鏈接用s參數 [root@localhost dirIn]# ls -l 總用量 0 -rw-r--r-- 2 root root 0 5月 31 14:53 infile -rw-r--r-- 2 root root 0 5月 31 14:53 infile_hard_file lrwxrwxrwx 1 root root 6 5月 31 15:03 infile_soft_file -> infile 軟鏈接
我們知道硬鏈接是有着相同 inode 號僅文件名不同的文件,用ls命令查看。
[root@localhost dirIn]# ls -li 1177358 -rw-r--r-- 2 root root 0 5月 31 14:53 infile 1177358 -rw-r--r-- 2 root root 0 5月 31 14:53 infile_hard_file
#上面源文件和硬鏈接文件inode號相同 (第一列就是inode號),指向同一個索引節點。 1177363 lrwxrwxrwx 1 root root 6 5月 31 15:03 infile_soft_file -> infile 軟鏈接是一個鏈接文件,文件模式那塊前面有個l字母,表示是個鏈接文件。
硬鏈接不能指向目錄
[root@localhost dirIn]# ln dir infile dir是個目錄 ln: "dir": 不允許將硬鏈接指向目錄
軟鏈接可以
[root@localhost dirIn]# ll -i 201884844 drwxr-xr-x 2 root root 19 5月 31 15:21 dir 1177358 -rw-r--r-- 3 root root 0 5月 31 14:53 infile 1177358 -rw-r--r-- 3 root root 0 5月 31 14:53 infile_hard_file 1177363 lrwxrwxrwx 1 root root 6 5月 31 15:03 infile_soft_file -> infile 1177365 lrwxrwxrwx 1 root root 3 5月 31 15:24 infile_soft_file_name -> dir
刪除文件測試:
[root@localhost dirIn]# echo "this a file" > infile 向文件中添加數據 [root@localhost dirIn]# cat infile 查看文件內容 this a file [root@localhost dirIn]# cat infile_hard_file infile_soft_file 查看軟鏈接和硬鏈接文件內容一致 this a file this a file [root@localhost dirIn]# rm -f infile 刪除源文件 [root@localhost dirIn]# ls -lrti 1177363 lrwxrwxrwx 1 root root 6 5月 31 15:03 infile_soft_file -> infile 201884844 drwxr-xr-x 2 root root 19 5月 31 15:21 dir 1177365 lrwxrwxrwx 1 root root 3 5月 31 15:24 infile_soft_file_name -> dir 1177358 -rw-r--r-- 2 root root 12 5月 31 15:27 infile_hard_file [root@localhost dirIn]# cat infile_hard_file 硬鏈接文件存在 內容和源文件內容一樣。
原因:雖然刪除源文件,但是任然有硬鏈接指向源文件inode
節點,所以不會被釋放刪除,
這里只是刪除infile到inode節點的鏈接。 this a file [root@localhost dirIn]# cat infile_soft_file 軟鏈接文件已經不存在了,目錄還會顯示這個文件,
就是軟鏈接文件已經失效。 cat: infile_soft_file: 沒有那個文件或目錄
刪除軟鏈接
[root@localhost dirIn]# rm -f infile_soft_file 直接刪除這個軟鏈接文件就行 [root@localhost dirIn]# ll drwxr-xr-x 2 root root 19 5月 31 15:21 dir -rw-r--r-- 2 root root 12 5月 31 15:27 infile_hard_file lrwxrwxrwx 1 root root 3 5月 31 15:24 infile_soft_file_name -> dir