『學了就忘』Linux基礎命令 — 22、Linux中的硬連結和軟連結

繁華似錦Fighting發表於2021-11-04

提示:先來說明一下在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)硬連結特徵

  • 原始檔和硬連結檔案擁有相同的InodeBlock
  • 修改任意一個檔案,另一個都改變。
  • 刪除任意一個檔案,另一個都能使用。
  • 硬連結標記不清,很難確認硬連結檔案位置(很難確定這是一個硬連線檔案,自己建立的還可能記住,要是別人建立的,我根本無法判定一個檔案是硬連線檔案),不建議使用。
  • 硬連結不能連結目錄
  • 硬連結不能跨分割槽(因為兩個檔案需要同一個分割槽的同一個i節點號。所以跨分割槽找不到)。

(3)硬連線原理

我上邊在root目錄下建立了一個abc檔案,然後在/tmp/目錄下建立一個abc檔案硬連線檔案abc_h

root目錄、abc檔案、tmp目錄,每個都有自己的i節點號和對應的Block塊。通過root目錄的i節點號,找到對應的Block塊。Block塊中記錄著abc檔案的名稱和i節點號,就可以找到abc檔案。而硬連線檔案abc_hi節點號和檔名是記錄在tmp目錄的Block塊中的。並且上邊查詢到abc檔案和abc_h硬連線檔案的i節點號是相同的,所以通過tmpBlock塊中的abc_h資訊,也可以找到abc檔案的i節點號。

所以root目錄中記錄的abc檔案資訊和tmp目錄記錄的abc_h檔案資訊,都指向了root目錄下的abc檔案。

看下圖:

image

所以上圖證明了:
修改任意一個檔案,另一個都改變。
刪除任意一個檔案,另一個都能使用。

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)軟連結特徵

  • 軟連結和原始檔擁有不同的InodeBlock
  • 兩個檔案修改任意一個,另一個都改變。
  • 刪除軟連結,原始檔不受影響;刪除原始檔,軟連結不能使用,因為軟連結沒有實際資料,只儲存原始檔的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節點號。

如下圖:

image

這也就說明了為什麼新建立的軟連線檔案建立完成後就有資料,並且資料大小不隨原始檔的改變而改變。

還有一點要注意,軟連結檔案的許可權是最大的,但這個許可權是針對軟連結檔案的,軟連結檔案的block塊中並不存放資料,如果要操作原始檔,還是要看原始檔許可權,這裡需要注意。

(4)說明

Windows系統中建立快捷方式是為了軟體安裝位置太深,不好找,所以在桌面建立一個快捷方式,那Linux系統建立軟連結的作用是什麼,反正都是通過目錄訪問?

在Linux系統中,軟連結最主要的作用是照顧管理員的使用習慣。

如下圖:

image

在老式的Linux系統中,/etc/rc.local檔案的位置我們用著已經習慣了,系統更新之後,為了升級的需要,/etc/rc.local檔案的位置改變了。我們在找這個檔案就很麻煩了。解決這個問題的方法就是給這兩個檔案建立一個軟連結來解決上邊問題,既照顧了升級需要,也照顧了使用習慣。

還要注意一個情況,用相對路徑建立def檔案的軟連結,用絕對路徑建立anaconda-ks.cfg檔案的軟連結。

image

從上圖中可以看到用相對路徑建立的軟連結出現了報錯。

提示:建立軟連結時一定要使用絕對路徑,硬連線沒有要求。

相關文章