硬鏈接與軟鏈接


  Linux鏈接分兩種,一種被稱為硬鏈接(Hard Link),另一種被稱為軟鏈接,即符號鏈接(Symbolic Link)。

  在Linux的文件系統中,保存在磁盤分區中的文件不管是什么類型都給它分配一個編號,這個編號被稱之為索引節點號(Inode Index),也就是常說的inode號。Inode號上與文件名關聯,下與用戶數據庫(data block)關聯。

  硬鏈接指文件名與索引節點號(即inode號)的鏈接(所以創建一個新的文件,該文件使用stat命令查看時,links顯示的是1),索引節點號(inode號)可以對應一個或多個文件名,並且這些文件名可以在同一或不同目錄。

  由於硬鏈接是直接將文件名與索引節點號(即inode號)鏈接,因此硬鏈接存在以下幾個特點: 1、文件有相同的inode號及data block,這使得修改其中一個硬鏈接文件屬性或文件數據時,其他硬鏈接文件都會發生相應修改;2、只能對已存在的文件進行創建;3、不能跨文件系統(即分區)進行創建;4、不能對目錄文件進行創建;5、刪除其中一個硬鏈接文件時,不會對其他硬鏈接文件產生影響。

 

  軟鏈接類似於Windows的快捷方式。它實際上是一個特殊的文件,有着自己的索引節點號(即inode號)以及用戶數據塊(data block),但用戶數據塊(data block)中包含的是另一個文件的位置信息。

  由於軟鏈接有着自己的索引節點號(即inode號)以及用戶數據塊(data block),因此沒有硬鏈接的諸多限制,它的特性如下:1、軟鏈接有自己的文件屬性、inode號和data block,但是編輯文件其實就是編輯源文件;2、可以對不存在的文件或目錄進行創建;3、可以跨文件系統(即分區)進行創建,使用ln命令跨文件系統創建時,源文件必須是絕對路徑,否則為死鏈接;4、可以對文件或目錄文件進行創建;5、刪除軟鏈接並不影響源文件,但源文件被刪除,則相關軟鏈接文件變為死鏈接(dangling link),若源文件(原地址原文件名)重新被創建,則死鏈接恢復為正常軟鏈接。

  實例:如果源文件沒有給others讀寫權限,軟鏈接顯示的是有權限,但實際不能讀寫。

 

  硬鏈接與軟鏈接特性比較

//第一個特性,硬鏈接與源文件具有相同inode號和data block,修改文件屬性或文件數據會應影響所有硬鏈接(包括源文件);
//軟鏈接雖然有自己的inode號和data block,但修改的其實還是源文件
[xf@xuexi ~]$ stat File |grep Inode  //也可使用ls -i File查看
Device: 803h/2051d	Inode: 52016343    Links: 2
[xf@xuexi ~]$ stat link1 |grep Inode
Device: 803h/2051d	Inode: 52016343    Links: 2
[xf@xuexi ~]$ stat link2 |grep Inode
Device: 803h/2051d	Inode: 52016746    Links: 1
[xf@xuexi ~]$ echo aaaa >> link1  //硬鏈接修改文件數據
[xf@xuexi ~]$ cat File 
aaaa
[xf@xuexi ~]$ echo aaaa >> link2  //軟鏈接修改文件數據 
[xf@xuexi ~]$ cat File 
aaaa
aaaa
[xf@xuexi ~]$ ll File link2
-rw-rw-r--. 2 xf xf 0 3月 11 14:27 File
lrwxrwxrwx. 1 xf xf 4 3月 11 14:28 link2 -> File
[xf@xuexi ~]$ chmod +x link2  //軟鏈接修改文件屬性
[xf@xuexi ~]$ ll File link2
-rwxrwxr-x. 2 xf xf 0 3月 11 14:27 File
lrwxrwxrwx. 1 xf xf 4 3月 11 14:28 link2 -> File
[xf@xuexi ~]$ stat File 
文件:"File"
大小:0 塊:0 IO 塊:4096 普通空文件
設備:803h/2051d	Inode:52016343 硬鏈接:2
權限:(0775/-rwxrwxr-x) Uid:( 1000/ xf) Gid:( 1000/ xf)
環境:unconfined_u:object_r:user_home_t:s0
最近訪問:2019-03-11 14:27:29.750638827 +0800
最近更改:2019-03-11 14:27:29.750638827 +0800
最近改動:2019-03-11 14:38:22.936661898 +0800
創建時間:-
[xf@xuexi ~]$ stat link2
文件:"link2" -> "File"
大小:4 塊:0 IO 塊:4096 符號鏈接
設備:803h/2051d	Inode:52016746 硬鏈接:1
權限:(0777/lrwxrwxrwx) Uid:( 1000/ xf) Gid:( 1000/ xf)
環境:unconfined_u:object_r:user_home_t:s0
最近訪問:2019-03-11 14:28:37.354054265 +0800
最近更改:2019-03-11 14:28:37.353054303 +0800
最近改動:2019-03-11 14:28:37.353054303 +0800
創建時間:-
//第二個特性,硬鏈接不能對不存在的文件進行創建,但軟鏈接可以(包括目錄文件)
[xf@xuexi ~]$ ls
File  link1  link2  公共  模板  視頻  圖片  文檔  下載  音樂  桌面
[xf@xuexi ~]$ ln File1 link3
ln: failed to access "File1": 沒有那個文件或目錄
[xf@xuexi ~]$ ln -s File1 link4
[xf@xuexi ~]$ ls -l link4
lrwxrwxrwx. 1 xf xf 5 3月  11 11:50 link4 -> File1  //這是一個死鏈接
//第三個特性,硬鏈接不可以跨文件系統(即分區)創建,軟鏈接可以
[xf@xuexi ~]$ su -
密碼:
上一次登錄:一 3月 11 13:16:55 CST 2019pts/0 上
[root@xuexi ~]# file -s /dev/sdb1  //查看分區文件系統類型
/dev/sdb1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
[root@xuexi ~]# mount /dev/sdb1 /sdb1  //掛載分區
[root@xuexi ~]# ln /home/xf/File /sdb1/link5  //硬鏈接無法跨文件系統創建
ln: 無法創建硬鏈接"/sdb1/link5" => "/home/xf/File": 無效的跨設備連接
[root@xuexi ~]# ln -s /home/xf/File /sdb1/link6  //軟鏈接可以,但源文件必須是絕對路徑,否則為死鏈接
[root@xuexi ~]# ls -l /sdb1/link6 
lrwxrwxrwx. 1 root root 13 3月  11 13:19 /sdb1/link6 -> /home/xf/File
//第四個特性,硬鏈接不能對目錄創建鏈接,但軟鏈接可以
[root@xuexi ~]# exit
登出
[xf@xuexi ~]$ ls
File  link1  link2  link4  公共  模板  視頻  圖片  文檔  下載  音樂  桌面
[xf@xuexi ~]$ mkdir newDir
[xf@xuexi ~]$ ln newDir link7
ln: "newDir": 不允許將硬鏈接指向目錄
[xf@xuexi ~]$ ln -s newDir link8
[xf@xuexi ~]$ ll link8
lrwxrwxrwx. 1 xf xf 6 3月  11 13:26 link8 -> newDir
[xf@xuexi ~]$ cd link8  //link8可以執行cd命令
[xf@xuexi link8]$
//第五個特性,刪除源文件,硬鏈接沒有影響;軟鏈接變成死鏈接,但在相同位置重新創建同名文件,軟鏈接變成指向新文件的鏈接
[xf@xuexi link8]$ cd ..
[xf@xuexi ~]$ cat File 
aaaa
aaaa
[xf@xuexi ~]$ rm File  //刪除源文件
[xf@xuexi ~]$ cat link1  //硬鏈接沒有影響
aaaa
aaaa
[xf@xuexi ~]$ cat link2  //軟鏈接變為死鏈接
cat: link2: 沒有那個文件或目錄
[xf@xuexi ~]$ touch File  //相同位置創建同名文件
[xf@xuexi ~]$ echo bbbb >> File
[xf@xuexi ~]$ cat link1  //硬鏈接沒有影響
aaaa
aaaa
[xf@xuexi ~]$ cat link2  //軟鏈接指向新建立的同名文件
bbbb

  這里還隱含了一個問題,雖然目錄無法創建硬鏈接,但是目錄的鏈接數卻是2。其實這是由於目錄文件本身以及其下的'.'文件。

[xf@xuexi ~]$ mkdir newDir
[xf@xuexi ~]$ stat newDir
  文件:"newDir"
  大小:6         	塊:0          IO 塊:4096   目錄
設備:803h/2051d	Inode:17263583    硬鏈接:2
權限:(0775/drwxrwxr-x)  Uid:( 1000/      xf)   Gid:( 1000/      xf)
環境:unconfined_u:object_r:user_home_t:s0
最近訪問:2019-03-11 15:08:17.061905895 +0800
最近更改:2019-03-11 15:08:17.061905895 +0800
最近改動:2019-03-11 15:08:17.061905895 +0800
創建時間:-
[xf@xuexi ~]$ ls -id newDir newDir/.
17263583 newDir  17263583 newDir/.  //可以看到inode號是一樣的

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM