提示:先來說明一下在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
檔案的軟連結。
從上圖中可以看到用相對路徑建立的軟連結出現了報錯。
提示:建立軟連結時一定要使用絕對路徑,硬連線沒有要求。