# Linux Symbolic Link ###### tags: `note`, `linux` 在這邊簡單的紀錄一下關於 symbolic link 的小筆記 linux 中 symbolic link 分為:**hard link**, **soft link** 兩種 - hard link: 為已存在的檔案 inode 建立新的 file entry - soft link: 建立一個新的檔案指向目標檔案 ## Usage ```bash # create symbolic links ln -s source_file symbolic_link ``` ```bash # create hard link ln source_file hard_link ``` ```bash # print the index number of each file ls -l --innode # in short ls -li ``` ## 實驗 建立一定大小的檔案 ```bash yes | head -c 1000 > file1 ``` 建立 symbloic link ```bash ln -s file1 file1_s ``` 建立 hard link ```bash ln file1 file1_h ``` 檢視結果 ```bash ls -lih . ``` ![ls -lhi 結果](https://i.imgur.com/JEOkeBD.png) 從結果可以看出: - `file1` inode number 為 262514, 有 2 個 hard link - `file1_h` 的 indoe number 和檔案大小都與 `file1` 一模一樣 - `file1_s` 的 indoe number 為 262421 與 `file1` 不同,而檔案內容也只有 3 byte `file1_h` 與 `file1` 表面上是不同檔案,但是由於 `file1_h` 是藉由 hard link 的方式製造出來,因此兩者事實上是共用同一個檔案空間的。 有趣的是 `ls` 的檔案大小統計為 `total 4.1G`,因為 `ls` 統計總檔案大小的方式為將此 directory 下的所有檔案大小相加。而 `file1` `file1_h` `file1_s` 都被視為不同檔案,因此 `file1` 與 `file1_h` 雖然共用同樣的硬碟空間但是兩者都各被算了一次。 **使用 `du` 查看硬碟使用量** ![du 結果](https://i.imgur.com/SgAAiLs.png) 如果我們使用 `du` 查看當前 directory 的大小了話,便會正常的顯示出 `2.1G`。 **接著我們試著刪除 `file1`** ```bash rm file1 ``` **查看當前目錄** ![](https://i.imgur.com/rWucT0q.png) 從 `file1_h` 的資料上可以看到 inode:262514 的 hardlink 變成只有一個了。 > 因此可以發現一個 inode 只有在他所有的 hardlink 被刪除時才會被真的刪除 > 不過實際上的細節還需要近一步的查看 linux file system 機制 **查看當前目錄的硬碟空間使用量** ![](https://i.imgur.com/cjjXutd.png) 一樣還是 2.1 G **使用 `cat` 查看 `file1_s`** ![](https://i.imgur.com/moYMMPr.png) 由於 `file1_s` 是 symbolic link,檔案系統會去試圖去查看已被刪除的 `file1`,所以會迸出 error **查看 `file1_h`** ![](https://i.imgur.com/u3dfQ2b.png) 由於 `file1_h` 是直接與 inode 連結,而不是依賴於 `file1` 因此就算刪除了 `file1`, `file1_h` 仍然是可以讀取的。 ## 應用 可用做版本切換 ![](https://i.imgur.com/u28gCWa.png) ubuntu snap 版 discord 使用 symbolic link ## Other - ==TODO:== 研究 inode 與 file system