# 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 .
```

從結果可以看出:
- `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` 查看當前 directory 的大小了話,便會正常的顯示出 `2.1G`。
**接著我們試著刪除 `file1`**
```bash
rm file1
```
**查看當前目錄**

從 `file1_h` 的資料上可以看到 inode:262514 的 hardlink 變成只有一個了。
> 因此可以發現一個 inode 只有在他所有的 hardlink 被刪除時才會被真的刪除
> 不過實際上的細節還需要近一步的查看 linux file system 機制
**查看當前目錄的硬碟空間使用量**

一樣還是 2.1 G
**使用 `cat` 查看 `file1_s`**

由於 `file1_s` 是 symbolic link,檔案系統會去試圖去查看已被刪除的 `file1`,所以會迸出 error
**查看 `file1_h`**

由於 `file1_h` 是直接與 inode 連結,而不是依賴於 `file1` 因此就算刪除了 `file1`, `file1_h` 仍然是可以讀取的。
## 應用
可用做版本切換

ubuntu snap 版 discord 使用 symbolic link
## Other
- ==TODO:== 研究 inode 與 file system