初識linux軟鏈接和硬鏈接

1.從文件開始到軟硬鏈接


在認識軟鏈接和硬鏈接之前,我們先來了解一下整個系統當中的文件存放特點,在linux當中,數據分爲元數據和用戶數據,元數據包括文件的一些屬性,例如文件大小,創建時間等一些內容。元數據當中有一個叫做inode(它是元數據的一部分,可以叫做索引節點號),inode作爲文件的唯一標識。而文件名,是爲了方便記憶。linux系統通過inode來查找正確的數據塊,獲取對應的信息,而對於用戶數據,就是存放真是數據的地方,我們可以理解爲磁盤。
這裏寫圖片描述

爲了解決文件的共享使用,所以引入了兩種鏈接,硬鏈接和軟鏈接(符號鏈接)。

2.硬鏈接


若一個inode對應多個別名,我們就把這些別名叫做硬鏈接。
硬鏈接就是多個文件名對應相同的inode。
而且對於硬鏈接使用引用計數的方式進行維護。

硬鏈接創建命令:

ln 文件名 目的鏈接文件名

我們在這裏進行測試一番,我們首先建立一個文件,然後建立兩個對應的硬鏈接,我們查看他們的inode號,我們會發現,他們的inode號是是相同,另外,我們也可以看出來它們的引用計數,就是有多少個文件名指向inode就是這個計數就顯示多少。
這裏寫圖片描述

所以,因爲它們指向的是相同的inode,所以當你修改這三個的任何一個,他們都會全部被修改。

硬鏈接的特點:
1)相同的硬鏈接有相同的inode和數據塊
2)不能交叉系統創建
3)無法創建文件夾的硬鏈接
4)當刪除一個硬鏈接的時候,對另外的一個硬鏈接是沒有影響的。
5)硬鏈接的大小顯示的就是你原來數據塊的大小

硬鏈接就是採用引用計數的方式,一個磁盤文件被引用的此時共有幾次。
硬鏈接只有在引用計數變爲0的時候纔會被刪除。

3.軟鏈接


關於軟鏈接理解爲一種windows當中常見的快捷方式,linux當中常常用它解決一些庫版本的問題。將一些目錄層次較深的文件鏈接到一個更加容易訪問的目錄當中。我們通常會使用到軟鏈接。

軟鏈接命令

ln -s 文件名 軟鏈接文件名

當我們創建兩個軟鏈接後,我們可以發現它們的inode號是不一樣的。它們有軟鏈接對應獨立的inode號。另外,軟鏈接的文件也是和一般文件不一樣,這個時候顯示爲鏈接文件。

另外我們通過stat命令來查看數據塊,發現軟鏈接和硬鏈接他們都在一個數據塊,但是他們的inode有區別,而且還可以看到,硬鏈接的大小都是本身所存數據的大小,而軟鏈接的大小就不一樣了。

[yuzhe@bogon 12_22]$ stat test hard_link_1 soft_link_1
  File: `test'
  Size: 16            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931216      Links: 3
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 03:53:56.400946549 -0800
Modify: 2016-12-22 03:53:29.193946464 -0800
Change: 2016-12-22 03:53:29.193946464 -0800
  File: `hard_link_1'
  Size: 16            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931216      Links: 3
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 03:53:56.400946549 -0800
Modify: 2016-12-22 03:53:29.193946464 -0800
Change: 2016-12-22 03:53:29.193946464 -0800
  File: `soft_link_1' -> `test'
  Size: 4             Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d    Inode: 931341      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:05:14.497945726 -0800
Modify: 2016-12-22 04:05:00.429945859 -0800
Change: 2016-12-22 04:05:00.429945859 -0800
[yuzhe@bogon 12_22]$ stat soft_link_2
  File: `soft_link_2' -> `test'
  Size: 4             Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d    Inode: 931342      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:05:14.497945726 -0800
Modify: 2016-12-22 04:05:11.083945668 -0800
Change: 2016-12-22 04:05:11.083945668 -0800

另外,我們需要說一下我們刪除軟鏈接被指向的文件,當我們刪除了這個文件時,軟鏈接就會變成死鏈接。
這裏寫圖片描述

死鏈接就好像是windows當中的沒有了源文件的快捷方式。當你刪除了鏈接的文件,就找不到了,軟鏈接更接近一種快捷方式,這種快捷方式當它的源文件被刪除以後,這個時候你這個快捷方式就無用了。
但是對於死鏈接,你是可以恢復的,我們可以嘗試着想軟鏈接當中進行輸入信息。
這裏寫圖片描述
我們可以看到test恢復了,但是當我們使用stat再次去查看信息的時候。

[yuzhe@bogon 12_22]$ stat test hard_link_1 hard_link_2 soft_link_1 soft_link_2
  File: `test'
  Size: 4             Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931345      Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:26:12.171945209 -0800
Modify: 2016-12-22 04:26:12.171945209 -0800
Change: 2016-12-22 04:26:12.171945209 -0800
  File: `hard_link_1'
  Size: 16            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931216      Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 03:53:56.400946549 -0800
Modify: 2016-12-22 03:53:29.193946464 -0800
Change: 2016-12-22 04:22:13.793945047 -0800
  File: `hard_link_2'
  Size: 16            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931216      Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 03:53:56.400946549 -0800
Modify: 2016-12-22 03:53:29.193946464 -0800
Change: 2016-12-22 04:22:13.793945047 -0800
  File: `soft_link_1' -> `test'
  Size: 4             Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d    Inode: 931341      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:05:14.497945726 -0800
Modify: 2016-12-22 04:05:00.429945859 -0800
Change: 2016-12-22 04:05:00.429945859 -0800
  File: `soft_link_2' -> `test'
  Size: 4             Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d    Inode: 931342      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:05:14.497945726 -0800
Modify: 2016-12-22 04:05:11.083945668 -0800
Change: 2016-12-22 04:05:11.083945668 -0800

我們發現test創建到了新的inode上了。

所以,軟鏈接的特點有:
1)軟鏈接郵資機的文件屬性和權限
2)軟鏈接可以對文件和目錄進行創建
3)軟鏈接可以對不存在的文件和目錄進行創建軟鏈接
4)軟鏈接可以交叉文件系統
5)軟鏈接的inode不一樣,引用計數不會增加。
6)刪除軟鏈接不影響被指向的文件,但是被指向的文件被刪除了,那麼軟鏈接就變成了一個死鏈接。

6.其他關於鏈接的命令


ls -i

用來查看文件的inode號

stat 文件

顯示文件的屬性,包括inode和IO Block以及大小等信息。

find 路徑 -inum 123456

查找路徑下inode號是123456的硬鏈接

find 路徑 -samefile 文件

查看路徑下與文件相同的inode的所有硬鏈接。

find 路徑 -lname 文件

查看路徑下該文件的軟鏈接。

find 路徑 -type l -ls

查看路徑下所有軟鏈接

5.總結


所以根據這些特性,我們可以繪製一張圖來寫出軟鏈接和硬鏈接的關係。
這裏寫圖片描述
當需要原文件移動後鏈接依然可用,這個時候使用硬鏈接。如果需要對文件夾創建鏈接或者跨文件系統,這個時候需要使用軟鏈接。創建軟鏈接,注意精良使用相對路徑,還可以爲不存在的文件創建軟鏈接。只要鏈接到文件存在,這個鏈接就有效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章