1. 程式人生 > >Linux學習筆記 軟連結和硬連結

Linux學習筆記 軟連結和硬連結

Linux 中,“everything is file”。接下來給大家介紹 linux 如何通過連結,達到節省磁碟空間、共享檔案等目的。連結檔案有兩種方式,軟連結(soft link)和硬連結(hard link)。

考慮這幾個場景。

1) 假如你在 Linux 系統中有一堆媒體檔案,你想將他們分類,但一部電影或者一首歌往往能打上幾個標籤,比如說陳奕迅的《不良嗜好》,我想把這歌,放到 音樂/歌手/陳奕迅/U-87/ 的資料夾中,又想把它放到 音樂/作詞/黃偉文/2005/ 資料夾中,更想把它放到 曲風/R&B 檔案中。。。但我不想使用複製,因為一首無損都 30M 左右大小了,U-87 一專輯都幾百M 了,我有數十個專輯的歌想要這樣處理。如果要複製的話,磁碟容量很快就滿了。

2) 有一堆重要的日誌要備份,不想被系統的定時任務刪除(比如只保留30天的日誌)。比如我想備份的 8月份的日誌,比如 是 /var/log/nginx/access.log-201808 開頭的所有檔案。大概有幾百G的。但不想複製黏貼佔用過多的磁碟空間。同時系統備份,系統不停寫日誌檔案(比如現在是 8月31號),我的備份檔案也能同時修改。不用重複備份。

3) 我用 golang 的兩個版本。一個是用於開發的,和生產環境的一樣。另外一個就比較新的,有很多的新特性。我想在開發的時候用生產環境的 sdk,而平時自己的小玩具用最新版本。要如何弄呢?

答曰: 1,2 場景可以用 硬連結(hard link)。3 可以用軟連線(soft link 或者 symbolic link)。這是些什麼東西? 簡單地解釋就是,硬連結相當於一個指標,指向同一個檔案結點(node)。就是原檔案刪除,並不會真正地刪除,當沒有指標指向這個結點的時候,檔案才會真正地被刪除。而軟連線就相當於 windows 的快捷方式,指向的是檔案的路徑。下面再詳細解釋吧

硬連結

Linux 中的檔案的表示分成兩部分,一部分是元資料(metadata),用於描述檔案的名字、大小、更新時間、許可權,Inode號之類的,另一部分才是檔案的資料。Linux 中檔案的唯一標識是 Inode 號,系統查詢檔案就是通過 Inode 的索引找到 Inode號從而找到檔案。

linux 中檔案表示

接下來看一個例子,比如我現在建立一個檔案 file1,裡面的內容是Hello World

    echo "Hello World" >> file1

檢視該檔案的 Inode 號

    ls -il | grep "file1"
81940 -rw-rw-r-- 1 zgj zgj 24 Aug 30 21:10 file1

或者

    stat file1
    File: ‘file1’
      Size: 24          Blocks: 8          IO Block: 4096   regular file
    Device: fd01h/64769d    Inode: 81940       Links: 1
    Access: (0664/-rw-rw-r--)  Uid: ( 1001/     zgj)   Gid: ( 1001/     zgj)
    Access: 2018-08-30 21:10:01.204598497 +0800
    Modify: 2018-08-30 21:10:44.753614034 +0800
    Change: 2018-08-30 21:10:44.753614034 +0800

可以看到file1Inode號是: 81940

給檔案建立一個硬連結

    ln file1 file2

再來看看變化

    ls -il | grep "file"
    81940 -rw-rw-r-- 2 zgj zgj 24 Aug 30 21:10 file1
    81940 -rw-rw-r-- 2 zgj zgj 24 Aug 30 21:10 file2

有什麼變化呢?

  1. file1 和 file2 共享同一個 Inode,都是 81940
  2. 就是許可權後面那個數字(那個數字是指向檔案的連結數),1->2,+1s了。 不同與複製黏貼,硬連結相當於一個指向檔案的指標,檔案裡面的內容改變了,硬連結的檔案也會跟著改變。如果連結數是0,這個檔案就相當於不存在了。

再操作一下

我將 file2 的內容再新增一條 ”Hello Linux“

    echo "Hello Linux" >> file2
    cat file1
    Hello World
    Hello Linux

為何如此,因為 file1 和 file2 就是同一個檔案。 而查詢系統中 file1 的所有硬連結可以這樣

    find ~ -inum 81940
    #或者
    find ~ -samefile file1

總結

使用硬連結的好處是

  • 檔案的內容可以同步修改(本來就是同一個檔案)
  • 檔案不怕被刪除了,只要還有一個硬連結在檔案就會存在
  • 節省空間

so,使用硬連結可以很好地滿足 場景1 和 場景2 的問題了。 但 硬連結當然也有相對不太好的地方:

  • 不能對目錄進行建立,只可對檔案建立
  • 不能交叉檔案系統進行硬連結的建立(不同檔案系統,Inode 可能是一樣的)
  • 硬連結檔案沒有自己的許可權
  • 不存在的檔案不能建立硬連結

而軟連結就沒有上述的這些問題了,接下來我們來看看軟連結

軟連結

軟連結真的和 windows 的快捷連結差不多

  • 它自己就是一個檔案,有自己的 inode 號,有自己的資料塊,有自己的檔案許可權(軟連結的許可權是沒啥意義的,都是 777,改軟連結的許可權會變成改原檔案的許可權)
  • 資料塊的內容是檔案路徑
  • 軟連結可以在不同的檔案系統中使用
  • 可以對不存在的檔案或目錄建立軟連結。如果原檔案不在,它會找不到的
  • 建立軟連結時,連結計數 link 不會增加,當然刪除軟連線對原檔案也沒有影響

與之相關的命令如下

建立

    ln -s file1 file3
ls -il | egrep "file[0-9]"
81940 -rw-rw-r-- 2 zgj zgj 36 Aug 30 21:31 file1
81940 -rw-rw-r-- 2 zgj zgj 36 Aug 30 21:31 file2
81941 lrwxrwxrwx 1 zgj zgj  5 Aug 30 22:43 file3 -> file1

查詢

# 查詢在主目錄下的檔案 file1 的軟連結
find ~ -lname file1
# 查詢在主目錄下的檔案的所有軟連結
find ~ -type l -ls 

修改

在原來的基礎上再添加個 -f 引數強制修改

    ln –sf file2 file3

如果是用來連結資料夾還要加個 -n 引數

總結

軟連結可以在場景三中表現良好吧。而軟連結相對來講不太好的地方是,如果檔案重命令或者移動路徑不會跟著改,就會變成死鏈了。硬連結和軟連結有好有壞吧,還得看場景。

參考文章