linux建立軟硬連結的N個實用案例(類似於Windows系統的快捷方式)

2019-08-19   Linux學習教程

請關注本頭條號,每天堅持更新原創乾貨技術文章。

如需學習視頻,請在微信搜索公眾號「智傳網優」直接開始自助視頻學習

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 號僅文件名不同的文件,因此硬連結存在以下幾點特性:

  • 文件有相同的 inode 及 data block;
  • 只能對已存在的文件進行創建;
  • 不能交叉文件系統進行硬連結的創建;
  • 不能對目錄進行創建,只可對文件創建;
  • 刪除一個硬連結文件並不影響其他有相同 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創建軟連結

因此軟連結的創建與使用沒有類似硬連結的諸多限制:

  • 軟連結有自己的文件屬性及權限等;
  • 可對不存在的文件或目錄創建軟連結;
  • 軟連結可交叉文件系統;
  • 軟連結可對文件或目錄創建;
  • 創建軟連結時,連結計數 i_nlink 不會增加;
  • 刪除軟連結並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱為死連結(即 dangling link,若被指向路徑文件被重新創建,死連結可恢復為正常的軟連結)。

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

點擊了解更多,快速查看更多的技術文章列表。