請關注本頭條號,每天堅持更新原創乾貨技術文章。
如需學習視頻,請在微信搜索公眾號「智傳網優」直接開始自助視頻學習
1. 前言
本文主要講解linux軟連結與硬連結的原理以及使用的方法。Linux的連結包括軟連結和硬連結,類似於Linux的快捷方式。
linux怎麼建立軟連結和硬連結
一個文件由文件名和數據組成,在 Linux 系統上也是被分成兩個部分:用戶數據 (user data) 與元數據 (metadata)。用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如文件大小、創建時間、所有者等信息。在 Linux系統中,元數據中的 inode 號(inode 是文件元數據的一部分但其並不包含文件名,inode 號即索引節點號)才是文件的唯一標識而非文件名。文件名僅是為了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。下圖展示了程序通過文件名獲取文件內容的過程。
通過文件名打開文件
2. 查看文件對應的inode號碼
在 Linux 系統中查看 inode 號可使用命令 stat 或 ls -i。
[root@CentOS7 ~]# 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號
[root@zcwyou ~]# ls -i -F anaconda-ks.cfg
67146830 anaconda-ks.cfg
使用mv命令對文件anaconda-ks.cfg移動
[root@zcwyou ~]# mv anaconda-ks.cfg 123.cfg
再次查看文件的inode號
[root@zcwyou ~]# 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 號僅文件名不同的文件,因此硬連結存在以下幾點特性:
3. Linux創建硬連結
[root@CentOS7 ~]# ls -li
總用量 4
67146830 -rw-------. 1 root root 1408 5月 31 17:36 123.cfg
只能對已存在的文件創建硬連接
命令格式
link old.file hard.link
操作案例:
[root@zcwyou ~]# cp 123.cfg anaconda-ks.cfg
[root@zcwyou ~]# 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
[root@CentOS7 ~]# 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。
不能交叉文件系統
[root@zcwyou ~]# ln /dev/input/event5 /root/bfile.txt
ln: 無法創建硬連結"/root/bfile.txt" => "/dev/input/event5": 無效的跨設備連接
不能對目錄進行創建硬連接
[root@CentOS7 ~]# mkdir -p test_dir/test
[root@CentOS7 ~]# ln test_dir/ test2.dir
ln: "test_dir/": 不允許將硬連結指向目錄
3.1 查找有相同 inode 號的文件
查看文件系統
[root@zcwyou ~]# 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
[root@zcwyou ~]# find / -inum
/root/anaconda-ks.cfg
/root/hard-link.cfg
找到兩個文件具有相關的inode號67146843,實際上是同一文件
硬連結不能對目錄創建是受限於文件系統的設計。現 Linux 文件系統中的目錄均隱藏了兩個特殊的目錄:當前目錄(.)與父目錄(..)。查看這兩個特殊目錄的 inode 號可知其實這兩目錄就是兩個硬連結(注意目錄 /mnt/lost+found/ 的 inode 號)。若系統允許對目錄創建硬連結,則會產生目錄環。
4. Linux創建軟連結
軟連結與硬連結不同,若文件用戶數據塊中存放的內容是另一文件的路徑名的指向,則該文件就是軟連接。軟連結就是一個普通文件,只是數據塊內容有點特殊。軟連結有著自己的 inode 號以及用戶數據塊。
Linux創建軟連結
因此軟連結的創建與使用沒有類似硬連結的諸多限制:
4.1 Linux軟連結命令
命令格式:ln -s 源文件 軟連結新文件
[root@zcwyou ~]# ln -s anaconda-ks.cfg soft-link.cfg
查看軟連結文件
[root@CentOS7 ~]# ll soft-link.cfg
lrwxrwxrwx. 1 root root 15 6月 2 09:47 soft-link.cfg -> anaconda-ks.cfg
創建目錄軟連結命令格式
ln -s 源目錄路徑 軟連結路徑
[root@CentOS7 ~]# ln -s test_dir/ soft_link_dir
查看軟連結目錄結果:
bash [root@CentOS7 ~]# ll soft_link_dir ¨G16G bash [root@CentOS7 ~]# 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的快捷方式。它實際上是一個特殊的文件。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。
本文已同步至博客站,尊重原創,轉載時請在正文中附帶以下連結:
https://www.linuxrumen.com/rmxx/1023.html
點擊了解更多,快速查看更多的技術文章列表。