連接你們都用過,好比 Windows 中的快捷方式就是一種連接,但是 Linux 裏又分硬連接和軟連接,它們表示什麼意思,又有什麼區別呢,本文來給你們作一個解釋。html
要想理解硬連接和軟連接的區別,首先要明白什麼是 Inode。Inode 是 Index node,索引節點的意思。每一個文件都有一個 inode,裏邊保存着文件的元數據(meta data),包括:inode 號、文件大小、文件全部者、文件權限、文件類型、建立時間、硬連接數等等,除了文件名之外的全部文件信息都存儲在這裏。它是文件或者目錄在一個文件系統中的惟一標識。node
查看一個文件的 inode,能夠用 stat 命令,或者 ls -i 選項來查看。下面分別用這兩個命令來查看一個文件 myfile.txt 的 inode 號爲 102171635shell
和元數據相對應的是用戶數據(user data),或者也叫文件數據塊(data block),文件的真實內容是存儲在這裏邊的。咱們經過一個文件名能夠查到它對應的 inode,再經過 inode 去查看文件的內容。它們之間的關係能夠用下面這張圖來表示。服務器
當多個文件名指向同一個 inode 時,這種連接就被稱爲硬連接。好比像下面的這種狀況,咱們爲原始文件 myfile.txt 建立了兩個連接,hardlink1 和 hardlink2,它們都指向同一個 inode,因此它們都是硬連接。從圖中能夠看出,硬連接指向的文件內容其實就是原始文件的內容,因此硬連接的做用之一就是能夠節省服務器的磁盤空間。spa
硬連接的另一個做用就是能夠防止文件被「誤刪」。由於 inode 會記錄文件硬連接的次數,只有當硬連接等於 0 的時候,纔會把存儲着文件內容的數據塊刪除,因此好比我不當心把 myfile.txt 文件刪除了,可是 inode 發現還有另外兩個硬連接在,因此不會刪除掉數據塊,經過兩個硬連接咱們仍是能夠讀取到文件內容。3d
硬連接能夠經過 ln [選項] [源文件] [連接文件] 命令來建立,不過要注意硬連接只能對已經存在的文件進行建立,而且不可以跨文件系統。下面舉一個例子來看一下硬連接和源文件的 inode號是否相同,以及刪除掉源文件,是否還能夠經過硬連接打開原文件。htm
首先建立一個文件 myfile.txt,而後分別給它建立兩個硬連接 hardlink1 和 hardlink2。經過 ls -li 命令查看它們的 inode 號,發現相同,因此驗證了咱們所說的,硬連接和原文件指向同一個 inode 。另外從長列表中,咱們還能夠看到 inode 記錄的硬連接次數(包括源文件本身),一共是3次。blog
接下來刪除掉文件 myfile.txt,經過 ls -li 命令再看一下,發現 inode 記錄的連接次數變成了 2,經過硬連接咱們仍是能夠讀取原來的文件內容,說明文件內容數據塊並無被刪除,只有當硬連接次數變爲 0 的時候,文件內容纔會真正被刪掉。索引
咱們對硬連接的特色進行一下總結:get
1) 硬連接文件都有相同的 inode 和 數據塊
2) 刪除掉一個硬連接文件,並不會影響 inode 號相同的其餘文件,只有當 inode 記錄的連接次數爲 0 時,數據塊纔會被真正刪除
3) 硬連接只能對已有文件進行建立
4) 硬連接不能跨文件系統建立
5) 普通用戶不能對目錄進行硬連接建立
軟連接也被稱爲符號連接(symbolic link)。Linux 中的軟連接和 Windows 的快捷方式很是類似。與硬連接的不一樣之處在於:
1) 它的 inode 與原文件不一樣
2) 它的數據塊存儲的是原文件的路徑
咱們用下面這張圖來進行一下說明,咱們爲 myfile.txt 建立了一個軟連接 softlink。能夠看出,它的 inode 和 myfile.txt 的 inode 是兩個徹底不一樣的索引節點,myfile.txt 的數據塊記錄的是文件的內容,而軟連接的數據塊記錄的是它指向文件的路徑。
軟連接的做用之一也是方便文件的管理,好比原文件的路徑比較複雜,咱們能夠在簡單的路徑下建立一個軟連接,這樣比較方便用戶訪問。可是和硬連接不一樣的是,一旦原文件被刪除,那麼軟連接就成了一個「死連接」,指向了一個不存在的文件。
軟連接能夠用命令 ln -s [源文件名或目錄] [軟連接文件名] 來進行建立。和硬連接不一樣之處在於,對不存在的文件也能夠建立軟連接,能夠跨文件系統,對文件或者目錄均可以建立軟連接。
舉一個例子,好比咱們爲 myfile.txt 建立一個軟連接 softlink。經過 ls -li 命令查看,發現 inode 號徹底不一樣,而且 myfile.txt 的連接次數仍是 1,並無增長,說明這裏的連接次數是指硬連接,經過軟連接咱們能夠讀取源文件的內容。
刪除原文件,軟連接變成了「死連接」,經過它再去讀取原來的文件內容,系統已經提示文件不存在了。
經過上面的實驗驗證,軟連接的特色以下:
1) 軟連接和其所指向的文件具備不一樣的 inode,而且其數據塊存儲的內容爲其所指向文件的路徑
2) 建立軟連接,其指向文件的硬連接次數不會增長
3) 刪除軟連接並不影響原文件,但刪掉原文件,軟連接會成爲一個「死」連接
4) 軟連接能夠指向文件,也能夠指向目錄
5) 軟連接能夠指向不存在的文件或目錄
6) 軟連接能夠跨文件系統建立
無論用軟連接仍是硬連接,都不會將原來的文件複製一份,都只是佔用了磁盤較小的空間,但它們的原理仍是徹底不同的。本文從 inode 的角度切入,對軟連接和硬連接進行了解釋。感興趣的同窗能夠對 inode 結構體再作進一步研究,這樣可以幫助咱們更好的理解 Linux 的工做原理。
相關閱讀:
- The End -