Linux的軟硬連接

##軟連接: 也叫符號連接,實際上就是windows之中的快捷方式,軟鏈接是一個文件,這個文件保存這目標文件完整路徑。因此建立軟鏈接的時候目標文件必定輸入完整路徑。不然你將軟鏈接文件移動到別的地方就很差用了。 建立軟鏈接命令:node

<!-- lang: shell -->
ln -s /home/myhome/vim/vimrc /home/myhome/.vimrc #-s選項表示建立符號鏈接

此外你徹底能夠建立一個目標文件不存在的軟鏈接,以做爲特殊用途。shell

##硬連接: 相對於軟鏈接,硬連接要複雜的多。在瞭解硬連接前,首先須要知道inode的概念。編程

inode 是 UNIX 操做系統中的一種數據結構,其本質是結構體,它包含了與文件系統中各個文件相關的一些重要信息。在 UNIX 中建立文件系統時,同時將會建立大量的 inode 。一般,文件系統磁盤空間中大約百分之一空間分配給了 inode 表。vim

咱們都知道,磁盤是將文件分割成許多塊,放到由扇區(sector,512字節)組成的塊(block,通常爲4mb)之中。而爲了快速查找文件,必須有索引來指示那個文件的第一塊的位置。這就是inode的做用之一。 在Linux當中,最多見的就是EXT系列文件系統,它們的inode組成大體以下:windows

  • 文件的字節數
  • 文件擁有者的User ID
  • 文件的Group ID
  • 文件的讀、寫、執行權限
  • 文件的時間戳,共有三個:ctime指inode上一次變更的時間,mtime指文件內容上一次變更的時間,atime指文件上一次打開的時間。
  • 連接數,即有多少文件名指向這個inode
  • 文件數據block的位置

其次是目錄項。Linux中全部的目錄都被視爲文件,內容是他所包含的文件的文件名和對應inode。特別的,對於根目錄,每個分區都包含一個磁道組信息。根分區也不例外,根分區的 Cylinder Group Blocks裏面也包含了根分區的inodes數據,其中包含了根的inode編號。 Linux查找一個文件,例如/home/wgj/ak47.txt,假設咱們未對/home獨立分區。 那麼系統首先讀取分區的頭部分,得到根目錄的inode值,而後獲得根目錄文件的內容,查找wgj目錄,獲取其inode值,遞歸下去,直到找到ak47.txt的inode值爲止。數據結構

瞭解了這個過程,硬連接就不難理解了:實際上全部的你見到的文件都是硬連接。添加一個硬連接實際上就是在目錄文件中添加一個文件名和inode值的key-value對。操作系統

這樣就能夠理解硬連接的一些特性了,例如不佔用inode值(只是對目錄文件的修改),沒法跨分區建立硬連接(分區不一樣,inode值多是同樣的),刪除源文件,不影響硬連接。(inode值未丟失。還有至少一個)code

學過JAVA編程的能夠這麼理解,硬連接就至關於變量的引用,一個對象能夠有多個引用。若是沒有引用指向這個對象,那就能夠回收了。因此對於垃圾文件或者非重要文件不要創建硬連接,要否則你刪除的時候還要找它全部的硬連接Orz。對象

建立硬連接(無需完整路徑):遞歸

<!-- lang: shell -->
ln ak47.txt ak48.txt

##軟連接和硬連接的場景

  1. 軟連接會佔用inode值,若是存在大量軟鏈接,可能形成硬盤空間未滿,inode值卻耗盡的問題。(軟鏈接很小,可是卻至少要佔一個block),但這種狀況不多發生。
  2. 根據硬連接的特性,能夠爲重要文件建立多個硬連接,防止誤操做刪除致使的問題。
  3. 若是遇到了磁盤空間佔滿的狀況,但又忘記配置LVM的狀況,可是文件不是太大的話,能夠將數據遷移到其餘磁盤,經過軟鏈接訪問。(不過若是是文件數目特別大的時候,消耗的時間就。。。因此儘快遷移到LVM吧)

##關於硬連接目錄和軟連接目錄 根據ln的man page,Linux使能夠創建目錄的硬連接的,可是須要root權限。這麼作的緣由是爲了防止環的存在。例若有一個目錄A,如今創建一個目錄A的硬連接,添加到A當中,做爲A的子文件夾,那麼遞歸搜索的時候,就會造成一個環,進入死循環。若是要防止這種狀況發生,那麼就必須將訪問過的目錄儲存在內存中,而後每訪問一個文件都檢查一下是否已經訪問過了。這個過程對於系統來講,不管是時間複雜度和空間複雜度都是沒法接受的。因此原則上並不建議爲目錄創建硬連接,雖然這對於系統來講並非很麻煩。

可是軟連接卻不存在上述問題。對於系統來講,軟鏈接數目相對較少,並且識別一個文件是軟連接的成本很低,所能以較小的代價在內存中創建一個軟連接的樹或者散列。因此當存在軟鏈接目錄環的時候就能夠十分方便的判斷。

相關文章
相關標籤/搜索