硬鏈接和軟鏈接是Linux系統中十分重要的概念。在我們瞭解硬鏈接和軟鏈接之前,我們還要先了解一下inode這個概念。
inode(即索引節點號)是Linux系統識別文件的唯一標識。我們都知道Linux系統中文件數據分爲兩類:metadata(元數據)和data(普通數據)。元數據存放的是文件的附加屬性,例如大小、時間戳、所有者等。普通數據纔是真正的數據內容。而系統是通過inode來查找正確的文件數據塊,並不是通過文件名。
硬鏈接和軟鏈接
在Linux系統爲了解決文件共享問題,使用兩種方式:hard link(硬鏈接)和soft link(軟鏈接),鏈接不僅僅可以共享文件,還有方便管理、隱藏路徑、節省空間等好處。若是使用同一個inode對應多個文件,則使用的就是硬鏈接。
硬鏈接可以使用link和ln創建:
語法:ln filename [linkname ]
示例:
link data link
ln data link
硬鏈接的特性
只能和已存在的文件建立硬鏈接
我們在/app目錄下進行實驗,當硬鏈接的源文件不存在時,硬鏈接無法創建文件的inode相同和文件屬性,只是文件名不同
我們在/app目錄下創建一個data的源文件,並通過stat
命令查看文件屬性,然後創建硬鏈接link,ll -i
查看兩者的inode相同,從ctime的變化也能確定硬鏈接就是用一個文件不能跨文件系統建立硬鏈接
在/dev目錄下建立硬鏈接link,因爲所在不同的文件系統,所以不能建立硬鏈接硬鏈接創建後鏈接數會增加
我們通過對link和data建立新的硬鏈接link2和link3,發現鏈數都有增長,由此也能看出硬鏈接實質上就是同一個文件不能對目錄創建硬鏈接
在/app目錄下創建dir1目錄文件,嘗試建立硬鏈接link4,創建失敗。因爲硬鏈接能針對目錄創建刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件數據
在刪除源文件data的之前,查看源文件和鏈接文件的數據是一致的。在刪除data之後,其他的硬鏈接文件的內容不受影響,只是鏈接數減少了
軟鏈接的特性
軟鏈接其實存放的就是源文件的路徑,所以如果文件的內容數據是另一個文件的路徑是,這個文件就是軟鏈接。軟鏈接有自己獨立的inode和文件屬性,這點和硬鏈接有本質的區別,也正是因爲這樣,所以軟鏈接使用上少了許多限制,平時使用的更多。
語法:ln -s filename [linkname ]
示例:
link -s data link
ln -s data link
軟鏈接可對不存在文件建立鏈接
在/app的空目錄中,建立軟鏈接,目錄下沒有文件,但鏈接依舊能建立,找不到目標文件會有報錯提示軟鏈接有自己的inode和屬性
在目錄下建立文件soft,之後對soft設置軟鏈接slink,通過stat
命令查看soft和slink的文件屬性,可以看出和之前硬鏈接的本質區別,不論是權限、inode、時間戳、大小、數據塊都不同軟鏈接課跨文件系統建立
在/dev目錄下建立test文件目錄用於實驗,然後設置軟鏈接testlink軟鏈接可以對目錄文件建立
接着直接以/app/testdir爲目標文件,和/dev/test目錄文件,建立軟鏈接軟鏈接創建不會增加鏈接數
建立了軟鏈接,而鏈接數還是1沒有改變刪除軟鏈接並不影響源文件,但刪除源文件軟鏈接就會變成死鏈接,若鏈接指向的路徑文件被重新建立,則鏈接恢復
在/app目錄下再創創建一個軟鏈接slink2,在我們刪除slink之後,源文件soft和slink2都沒有受到影響,但當我們把soft文件刪除後,slink2就變成了死鏈接,不再能顯示數據
其他相關命令
使用find
命令可以查找鏈接文件
- 查找目錄文件下相同inode的文件
find /dirs inum inode
查到data文件的inode=67,使用命令find /app -inum 67
查到/app目錄下的所有inode是67的硬鏈接文件
- 查找目錄下文件的軟鏈接文件
find /dirs -lname filename
使用find /app -lname soft
命令,找到/app目錄下所有soft的軟鏈接文件
- 查找目錄下所有目標文件的硬鏈接
find /dirs -samefile filename
在/app的目錄和子目錄下建立多個硬鏈接,使用find /app -samefile data
都可以找到
- 查找目錄文件下的所有軟鏈接文件
find /dirs -type l -ls
使用命令find /app -type l -ls
,可以查找/app下的所有軟鏈接文件
- 查看磁盤分區的inode值(只能在ext的系統格式中使用)
dumpe2fs -h /dev/sda | grep "Inode size"
- 查看軟鏈接的源文件
readlink
readlink
命令在後面我們編寫腳本中可以使用
總結:
瞭解了inode概念還有硬鏈接與軟鏈接原理,硬鏈接本質上就是同一個文件的不同文件名。軟鏈接就是獨立的文件,不過文件中存放的是源文件的路徑。並總結出了兩者的區別:
硬鏈接
1. 只能和已存在的文件建立硬鏈接
2. 文件的inode相同和文件屬性,只是文件名不同
3. 不能跨文件系統建立硬鏈接
4. 不能跨文件系統建立硬鏈接
5. 不能對目錄創建硬鏈接
6. 刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件數據
軟鏈接
1. 軟鏈接可對不存在文件建立鏈接
2. 軟鏈接有自己的inode和屬性
3. 軟鏈接課跨文件系統建立
4. 軟鏈接可以對目錄文件建立
5. 軟鏈接創建不會增加鏈接數
6. 刪除軟鏈接並不影響源文件,但刪除源文件軟鏈接就會變成死 鏈接,若鏈接指向的路徑文件被重新建立,則鏈接恢復