提示:先來說明一下在Linux系統中文件和目錄的基本存儲,這樣更方便我們理解和學習Linux系統中的硬鏈接和軟鏈接。
1、文件和目錄的基本存儲
之前說過分區,每個分區都可以理解為分成兩部分,一小部分里邊是存放文件的i節點信息,大部分放的是Block文件塊。
在文件的i節點當中保存的信息有:i節點號,時間,權限,保存位置。而Block塊中保存的是文件中的數據。
每個文件夾中都會有i節點和對應的Block文件。
-
但是有一個問題,一個文件的文件名是存放哪里?
我們就以在文件夾
root中有一個文件abc為例。文件路徑為/root/abc。在
root目錄中,所有的文件都有i節點名和對應的Block塊,而root目錄也有自己的i節點信息。有i節點信息,就有與之對應的Block塊,root目錄的Block塊中存放的數據是root目錄下所有的子文件和子目錄的文件名,和它對應的i節點號。
也就是說,root目錄下文件的文件名,沒有寫在該文件的i節點里。而是寫在上級目錄的Block塊中。
如果我要查找abc文件的文件名,要先找到root文件夾的i節點,然后在root目錄的Block塊中找到abc的文件名和對應的i節點號才能找到。通過abc文件的i節點號最終讀取到abc文件中的數據。 -
那
root目錄的文件名或者說是i節點存儲在哪里?那
root目錄是在根目錄下的,根目錄會有自己的i節點信息,也會有自己的Block,綜上所述,那root目錄的文件名和i節點號的信息是放在根目錄的Block塊中的。
那根的i節點號怎么獲取?
根的i節點號是固定的,根的i節點號為2。(因為編號1在系統內核加載的時候被占用了)[root@192 ~]# ls -ild / 2 dr-xr-xr-x. 25 root root 4096 12月 27 22:27 / 第一位顯示的就是i節點號。 -
總結
綜上所訴,要查看
abc文件的內容,就先用通過根的i節點號,讀取根的Block塊中數據,找到root目錄的i節點信息,讀取root目錄的Block塊中數據,找到abc文件的i節點信息,讀取abc文件的Block塊中數據。
以上就是文件和目錄的基本存儲。
2、In命令介紹
(1)我們來看看ln命令的基本信息
- 命令名稱:
ln - 英文原意:
make links between file - 所在路徑:
/bin/ln - 執行權限:所有用戶。
- 功能描述:在文件之間建立鏈接。
(2)ln命令的基本格式
[root@localhost ~ ] # ln [選項] 源文件 目標文件
選項:
-s:建立軟鏈接文件。如果不加“-s”選項,則建立硬鏈接文件
-f:強制。如果目標文件已經存在,則刪除目標文件后再建立鏈接文件
3、創建硬鏈接
(1)如何創建硬鏈接
示例如下:
[root@localhost ~] # touch cangls
[root@localhost ~ ]# ln /root/cangls /tmp/
# 建立硬鏈接文件,目標文件沒有寫文件名,會和原合一致
# 也就是/root/cangls和/tmp/cangls 是硬鏈接文件
說明ln命令應用:
# 新創建一個文件abc,查看abc文件的硬連接數
[root@192 ~]# touch abc
[root@192 ~]# ls -il abc
1043285 -rw-r--r--. 1 root root 0 12月 29 18:18 abc
# 可以看到abc文件的硬連接數為1。
# 在tmp目錄中給abc文件創建一個硬連接文件,然后查看這兩個文件硬連接數。
[root@192 ~]# ln abc /tmp/abc_h
[root@192 ~]# ls -il abc /tmp/abc_h
1043285 -rw-r--r--. 2 root root 0 12月 29 18:18 abc
1043285 -rw-r--r--. 2 root root 0 12月 29 18:18 /tmp/abc_h
# 可以看到abc文件的引用計數(硬連接數)增加了1。
# 同時還可以看到,上邊的兩個文件的i節點號是一樣的。
(2)硬鏈接特征
- 源文件和硬鏈接文件擁有相同的
Inode和Block。 - 修改任意一個文件,另一個都改變。
- 刪除任意一個文件,另一個都能使用。
- 硬鏈接標記不清,很難確認硬鏈接文件位置(很難確定這是一個硬連接文件,自己創建的還可能記住,要是別人創建的,我根本無法判定一個文件是硬連接文件),不建議使用。
- 硬鏈接不能鏈接目錄。
- 硬鏈接不能跨分區(因為兩個文件需要同一個分區的同一個
i節點號。所以跨分區找不到)。
(3)硬連接原理
我上邊在root目錄下創建了一個abc文件,然后在/tmp/目錄下創建一個abc文件硬連接文件abc_h。
root目錄、abc文件、tmp目錄,每個都有自己的i節點號和對應的Block塊。通過root目錄的i節點號,找到對應的Block塊。Block塊中記錄着abc文件的名稱和i節點號,就可以找到abc文件。而硬連接文件abc_h的i節點號和文件名是記錄在tmp目錄的Block塊中的。並且上邊查詢到abc文件和abc_h硬連接文件的i節點號是相同的,所以通過tmp的Block塊中的abc_h信息,也可以找到abc文件的i節點號。
所以root目錄中記錄的abc文件信息和tmp目錄記錄的abc_h文件信息,都指向了root目錄下的abc文件。
看下圖:

所以上圖證明了:
修改任意一個文件,另一個都改變。
刪除任意一個文件,另一個都能使用。
4、創建軟鏈接
(1)如何創建軟鏈接
軟連接可以直接看作為Windows系統中的快捷方式。
建立軟鏈接文件,如下:
[root@localhost ~]# touch abc
[root@localhost ~]# ln -s /root/abc /tmp/
root目錄中cde文件,然后創建軟連接/tmp/cde_s文件,查看這兩個文件。
如下圖所示:
#
[root@localhost ~ ] # touch cde
[root@localhost ~ ] # ln -s /root/cde /tmp/cde_s
[root@localhost ~ ] # ls -il /root/cde /tmp/cde_s
1055972-rw-r--r--1 root root 0 2月1715:30 /root/cde
261634 1rwxrwxrwx 1root root 9 2月1715:30 /tmp/cde_s->/root/cde
說明:
- 第一:可以看到創建的軟連接文件有明確的提示這個一個軟鏈接文件,和它的源文件的位置在哪里。
/tmp/cde_s->/root/cde。這也就是為什么說硬連接標記不清的原因。 - 第二:文件的引用鏈接數沒有增加。
- 第三:兩個文件的i節點號完全不同。
- 第四:源文件
abc是0字節,空的。而軟連接的文件大小為9個字節。
(2)軟鏈接特征
- 軟鏈接和源文件擁有不同的
Inode和Block。 - 兩個文件修改任意一個,另一個都改變。
- 刪除軟鏈接,源文件不受影響;刪除源文件,軟鏈接不能使用,因為軟鏈接沒有實際數據,只保存源文件的
Inode,不論源文件多大,軟鏈接文件大小不變。 - 軟鏈接的權限是最大權限
lrwxrwxrwx.,但是由於沒有實際數據,最終訪問時需要參考源文件權限。 - 軟鏈接可以鏈接目錄,軟鏈接可以跨分區。
- 軟鏈接特征明顯,建議使用軟連接。
(3)軟連接原理
在root目錄下有一個cde文件,在tmp目錄創建一個cde文件的軟鏈接文件cde_s。通過root目錄的i節點號,可以找到root目錄的block塊,root目錄的block塊中記錄了cde文件的文件名和i節點號。查到cde文件的i節點號就找到了cde文件的block塊,就能讀取里邊的數據。
tmp目錄有自己的i節點號,與之對應的block塊,tmp目錄的block塊中有cde_s文件的文件名和i節點號,(之前說硬連接這兩個i節點號是相同的,所以指向的同一個文件),而軟連接文件和源文件的i節點號是不相同的。說明cde_s文件有自己的i節點號,並且cde_s文件有自己的block塊。
現在的關鍵是,cde_s文件的block塊中存放的是什么?
如果里邊存放的是數據,那cde文件和cde_s文件就不是鏈接的關系了,就完全是復制關系了,這樣就不會出現修改源文件時軟鏈接文件也變,修改軟鏈接文件后源文件也改變的情況。
其實在cde_s文件的block塊中存放的是源文件的i節點號。
如下圖:

這也就說明了為什么新創建的軟連接文件創建完成后就有數據,並且數據大小不隨源文件的改變而改變。
還有一點要注意,軟鏈接文件的權限是最大的,但這個權限是針對軟鏈接文件的,軟鏈接文件的block塊中並不存放數據,如果要操作源文件,還是要看源文件權限,這里需要注意。
(4)說明
Windows系統中創建快捷方式是為了軟件安裝位置太深,不好找,所以在桌面創建一個快捷方式,那Linux系統創建軟鏈接的作用是什么,反正都是通過目錄訪問?
在Linux系統中,軟鏈接最主要的作用是照顧管理員的使用習慣。
如下圖:

在老式的Linux系統中,/etc/rc.local文件的位置我們用着已經習慣了,系統更新之后,為了升級的需要,/etc/rc.local文件的位置改變了。我們在找這個文件就很麻煩了。解決這個問題的方法就是給這兩個文件創建一個軟鏈接來解決上邊問題,既照顧了升級需要,也照顧了使用習慣。
還要注意一個情況,用相對路徑創建def文件的軟鏈接,用絕對路徑創建anaconda-ks.cfg文件的軟鏈接。

從上圖中可以看到用相對路徑創建的軟鏈接出現了報錯。
提示:創建軟鏈接時一定要使用絕對路徑,硬連接沒有要求。
