請關注本頭條号,每天堅持更新原創幹貨技術文章。
如需學習視訊,請在微信搜尋公衆号“智傳網優”直接開始自助視訊學習
1. 前言
本文主要講解linux軟連結與硬連結的原理以及使用的方法。Linux的連結包括軟連結和硬連結,類似于Linux的快捷方式。

linux怎麼建立軟連結和硬連結
一個檔案由檔案名和資料組成,在 Linux 系統上也是被分成兩個部分:使用者資料 (user data) 與中繼資料 (metadata)。使用者資料,即檔案資料塊 (data block),資料塊是記錄檔案真實内容的地方;而中繼資料則是檔案的附加屬性,如檔案大小、建立時間、所有者等資訊。在 Linux系統中,中繼資料中的 inode 号(inode 是檔案中繼資料的一部分但其并不包含檔案名,inode 号即索引節點号)才是檔案的唯一辨別而非檔案名。檔案名僅是為了友善人們的記憶和使用,系統或程式通過 inode 号尋找正确的檔案資料塊。下圖展示了程式通過檔案名擷取檔案内容的過程。
通過檔案名打開檔案
2. 檢視檔案對應的inode号碼
在 Linux 系統中檢視 inode 号可使用指令 stat 或 ls -i。
[[email protected] ~]# stat anaconda-ks.cfg
檔案:"anaconda-ks.cfg"
大小:1408 塊:8 IO 塊:4096 普通檔案
裝置:fd00h/64768d Inode:67146830 硬連結:1
權限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root)
環境:system_u:object_r:admin_home_t:s0
最近通路:2019-05-31 17:36:00.109184712 +0800
最近更改:2019-05-31 17:36:00.110184571 +0800
最近改動:2019-05-31 17:36:00.111184429 +0800
建立時間:-
檢視檔案anaconda-ks.cfg的inode号
[[email protected] ~]# ls -i -F anaconda-ks.cfg
67146830 anaconda-ks.cfg
使用mv指令對檔案anaconda-ks.cfg移動
[[email protected] ~]# mv anaconda-ks.cfg 123.cfg
再次檢視檔案的inode号
[[email protected] ~]# ls -i -F 123.cfg
67146830 123.cfg
可以看出在Linux系統中使用指令 mv 移動并重命名檔案123.cfg,其結果不影響檔案的使用者資料及 inode 号,檔案移動前後 inode 号均為:67146830。
為解決檔案的共享使用,Linux 系統引入了兩種連結:硬連結 (hard link) 與軟連結(又稱符号連結,即 soft link 或 symbolic link)。連結為 Linux 系統解決了檔案的共享使用,還帶來了隐藏檔案路徑、增權重限安全及節省存儲等好處。若一個 inode 号對應多個檔案名,則稱這些檔案為硬連結。換言之,硬連結就是同一個檔案使用了多個别名。hard link 就是 file 的一個别名,他們有共同的 inode)。硬連結可由指令 link 或 ln 建立。如下是對檔案 oldfile 建立硬連結。
執行指令
link 舊檔案名 新檔案名
或者
ln 舊檔案名 新檔案名
由于硬連結是有着相同 inode 号僅檔案名不同的檔案,是以硬連結存在以下幾點特性:
- 檔案有相同的 inode 及 data block;
- 隻能對已存在的檔案進行建立;
- 不能交叉檔案系統進行硬連結的建立;
- 不能對目錄進行建立,隻可對檔案建立;
- 删除一個硬連結檔案并不影響其他有相同 inode 号的檔案。
3. Linux建立硬連結
[[email protected] ~]# ls -li
總用量 4
67146830 -rw-------. 1 root root 1408 5月 31 17:36 123.cfg
隻能對已存在的檔案建立硬連接配接
指令格式
link old.file hard.link
操作案例:
[[email protected] ~]# cp 123.cfg anaconda-ks.cfg[[email protected] ~]# link anaconda-ks.cfg hard-link.cfg | ls -li
總用量 8
67146830 -rw-------. 1 root root 1408 5月 31 17:36 123.cfg
67146843 -rw-------. 2 root root 1408 6月 2 09:36 anaconda-ks.cfg
[[email protected] ~]# ls -li
總用量 12
67146830 -rw-------. 1 root root 1408 5月 31 17:36 123.cfg
67146843 -rw-------. 2 root root 1408 6月 2 09:36 anaconda-ks.cfg
67146843 -rw-------. 2 root root 1408 6月 2 09:36 hard-link.cfg
檔案 anaconda-ks.cfg與 hard-link.cfg 有着相同的 inode 号:67146843及檔案權限,inode 是随着檔案的存在而存在,是以隻有當檔案存在時才可建立硬連結,即當 inode 存在且連結計數器(link count)不為 0 時。inode 号僅在各檔案系統下是唯一的,當 Linux 挂載多個檔案系統後将出現 inode 号重複的現象,檔案比如檔案系統1(比如/dev)的1.txt、檔案系統2(比如/root)的2.txt 并無關聯,卻有着相同的 inode 号),是以硬連結建立時不可跨檔案系統。裝置檔案目錄 /dev 使用的檔案系統是 devtmpfs,而 /root(與根目錄 / 一緻)使用的是磁盤檔案系統 ext4。
不能交叉檔案系統
[[email protected] ~]# ln /dev/input/event5 /root/bfile.txt
ln: 無法建立硬連結"/root/bfile.txt" => "/dev/input/event5": 無效的跨裝置連接配接
不能對目錄進行建立硬連接配接
[[email protected] ~]# mkdir -p test_dir/test[[email protected] ~]# ln test_dir/ test2.dir
ln: "test_dir/": 不允許将硬連結指向目錄
3.1 查找有相同 inode 号的檔案
檢視檔案系統
[[email protected] ~]# df -i --print-type
檔案系統 類型 Inode 已用(I) 可用(I) 已用(I)% 挂載點
/dev/mapper/centos-root xfs 19394560 29924 19364636 1% /
devtmpfs devtmpfs 229908 394 229514 1% /dev
tmpfs tmpfs 232906 1 232905 1% /dev/shm
tmpfs tmpfs 232906 738 232168 1% /run
tmpfs tmpfs 232906 16 232890 1% /sys/fs/cgroup
/dev/sda1 xfs 524288 334 523954 1% /boot
tmpfs tmpfs 232906 1 232905 1% /run/user/0
[[email protected] ~]# find / -inum
/root/anaconda-ks.cfg
/root/hard-link.cfg
找到兩個檔案具有相關的inode号67146843,實際上是同一檔案
硬連結不能對目錄建立是受限于檔案系統的設計。現 Linux 檔案系統中的目錄均隐藏了兩個特殊的目錄:目前目錄(.)與父目錄(..)。檢視這兩個特殊目錄的 inode 号可知其實這兩目錄就是兩個硬連結(注意目錄 /mnt/lost+found/ 的 inode 号)。若系統允許對目錄建立硬連結,則會産生目錄環。
4. Linux建立軟連結
軟連結與硬連結不同,若檔案使用者資料塊中存放的内容是另一檔案的路徑名的指向,則該檔案就是軟連接配接。軟連結就是一個普通檔案,隻是資料塊内容有點特殊。軟連結有着自己的 inode 号以及使用者資料塊。
Linux建立軟連結
是以軟連結的建立與使用沒有類似硬連結的諸多限制:
- 軟連結有自己的檔案屬性及權限等;
- 可對不存在的檔案或目錄建立軟連結;
- 軟連結可交叉檔案系統;
- 軟連結可對檔案或目錄建立;
- 建立軟連結時,連結計數 i_nlink 不會增加;
- 删除軟連結并不影響被指向的檔案,但若被指向的原檔案被删除,則相關軟連接配接被稱為死連結(即 dangling link,若被指向路徑檔案被重新建立,死連結可恢複為正常的軟連結)。
4.1 Linux軟連結指令
指令格式:ln -s 源檔案 軟連結新檔案
[[email protected] ~]# ln -s anaconda-ks.cfg soft-link.cfg
檢視軟連結檔案
[[email protected] ~]# ll soft-link.cfg
lrwxrwxrwx. 1 root root 15 6月 2 09:47 soft-link.cfg -> anaconda-ks.cfg
建立目錄軟連結指令格式
ln -s 源目錄路徑 軟連結路徑
[[email protected] ~]# ln -s test_dir/ soft_link_dir
檢視軟連結目錄結果:
bash [[email protected] ~]# ll soft_link_dir ¨G16G bash [[email protected] ~]# ls -li
總用量 12
67146830 -rw-------. 1 root root 1408 5月 31 17:36 123.cfg
67146843 -rw-------. 2 root root 1408 6月 2 09:36 anaconda-ks.cfg
67146843 -rw-------. 2 root root 1408 6月 2 09:36 hard-link.cfg
67146844 lrwxrwxrwx. 1 root root 15 6月 2 09:47 soft-link.cfg -> anaconda-ks.cfg
67146845 lrwxrwxrwx. 1 root root 9 6月 2 09:49 soft_link_dir -> test_dir/
100673615 drwxr-xr-x. 3 root root 34 6月 2 09:51 test_dir
5. 總結
硬連結指通過索引節點來進行連接配接。在Linux的檔案系統中,儲存在磁盤分區中的檔案不管是什麼類型都給它配置設定一個編号,稱為索引節點号(Inode Index)。在Linux中,多個檔案名指向同一索引節點是存在的。一般這種連接配接就是硬連接配接。硬連接配接的作用是允許一個檔案擁有多個有效路徑名,這樣使用者就可以建立硬連接配接到重要檔案,以防止“誤删”的功能。其原因如上所述,因為對應該目錄的索引節點有一個以上的連接配接。隻删除一個連接配接并不影響索引節點本身和其它的連接配接,隻有當最後一個連接配接被删除後,檔案的資料塊及目錄的連接配接才會被釋放。也就是說,檔案真正删除的條件是與之相關的所有硬連接配接檔案均被删除。
另外一種連接配接稱之為符号連接配接(Symbolic Link),也叫軟連接配接。軟連結檔案有類似于Windows的快捷方式。它實際上是一個特殊的檔案。在符号連接配接中,檔案實際上是一個文本檔案,其中包含的有另一檔案的位置資訊。