Linux 永久連結與軟連結,linux連結
在 Linux 的檔案系統中,磁碟塊分成了 3 個部分。一部分稱為資料區,用來存放檔案內容。另一部分稱為 inode 表,用來存放檔案屬性。第三部分稱為超級塊,用來存放檔案系統本身的屬性。檔案的內容和屬性分開存放,檔案的屬性儲存區在一個稱為 inode 的資料結構中,inode 存放在 inode 表裡,每個 inode 有一個唯一的編號對應其在 inode 表中的位置。
Linux 中有兩種連結:永久連結(Hard Link)和軟連結(Soft Link),軟連結也稱為符號連結(Symbolic Link)。
永久連結
永久連結其實已存在檔案的另一個名字,連結與原來的檔案並沒有什麼區別,它們共用一個 inode,而 inode 包含了一個檔案的所有屬性。當為一個檔案建立硬鏈時,核心不會分配新的 inode。
huey@huey-K42JE:~/huey/linux/cmdline$ touch f1huey@huey-K42JE:~/huey/linux/cmdline$ ln f1 f1-hardhuey@huey-K42JE:~/huey/linux/cmdline$ ls -litotal 010272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:28 f110272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:28 f1-hard
系統並沒有為 f1-hard 分配新的 inode,f1-hard 的 inode 與 f1 一致,這說明了它們是同一個檔案的兩個名字。建立連結後,f1 和 f1-hard 的連結數也由 1 增加到 2。再看看使用 rm 命令的過程:
huey@huey-K42JE:~/huey/linux/cmdline$ ls -litotal 010272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:33 f110272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:33 f1-hardhuey@huey-K42JE:~/huey/linux/cmdline$ rm f1huey@huey-K42JE:~/huey/linux/cmdline$ ls -litotal 010272788 -rw-rw-r-- 1 ng ng 0 Apr 20 15:33 f1-hardhuey@huey-K42JE:~/huey/linux/cmdline$ rm f1-hardhuey@huey-K42JE:~/huey/linux/cmdline$ ls -litotal 0
當刪除檔案的時候,系統只是將檔案的連結數減一,直到檔案的連結數為 0 時,系統才會將磁碟的檔案內容刪除。
永久連結有兩個重要的限制:
1) 永久連結不能引用自身檔案系統之外的檔案。即連結不能引用與該連結不在同一磁碟分割的檔案。
2) 永久連結不能引用目錄(有些 Linux 版本允許超級使用者使用 -d 選項建立引用目錄的連結)。
符號連結
符號連結是為了克服永久連結的局限性而建立的。符號連結是通過建立一個特殊類型的檔案來起作用的,該檔案包含了指向引用檔案或目錄的文本指標。從這點來看,符號連結與 Windows 的捷徑很相似。符號連結指向的檔案與符號連結自身幾乎沒有區別。例如,將一些內容寫進符號連結裡,那麼這些內容同樣也寫進了引用檔案。而當刪除一個符號連結時,刪除的只是符號連結而沒有刪除引用檔案。如果先於符號連結之前刪除引用檔案,那麼這個連結依然存在,但是不指向任何檔案。此時,這個連結就稱為壞連結。ls 命令一般會用不同的顏色來顯示壞連結,比如紅色。
軟連結相比永久連結有個不足的地方是:由於軟連結包含引用檔案的路徑資訊,所以如果引用檔案移動到其他目錄,連結則變成一個壞連結。
ln 命令格式
ln [OPTION]... [-T] TARGET LINK_NAME (1st form)
ln [OPTION]... TARGET (2nd form)
ln [OPTION]... TARGET... DIRECTORY (3rd form)
ln [OPTION]... -t DIRECTORY TARGET... (4th form)
ln 命令參數
--backup[=CONTROL]
如果指定的連結名已經存在,為該同名檔案建立備份檔案
-b
類似 --backup 選項,但不接受參數。
-d, -F, --directory
允許超級使用者建立目錄的永久連結(註:由於系統限制很有可能會失敗,即使是超級使用者)
-f, --force
如果指定的連結名已經存在,則覆蓋該同名檔案
-n, --no-dereference
如果指定的連結名是一個引用目錄的符號連結,則將其當作是普通檔案
-i, --interactive
如果指定的連結名已經存在,提示是否覆蓋該同名檔案
-s, --symbolic
建立符號連結而非永久連結
-S, --suffix=SUFFIX
使用 SUFFIX 作為備份檔案的尾碼
-v, --verbose
顯示連結過程的資訊
--help display this help and exit
列印協助資訊
--version
列印版本資訊
ln 執行個體
a) 建立永久連結
ln testfile testfile-hard
b) 建立符號連結
ln -s testfile testfile-sym
c) 強制建立連結,如果指定的連結名已經存在,則覆蓋該同名檔案
ln -f testfile testfile-hard
d) 為被覆蓋的檔案建立備份
ln -bf testfile testfile-hard
e) 為被覆蓋的檔案建立備份,並以 ".~[num]~" 作為尾碼
ln -f --backup=numbered testfile testfile-hard
f) 為被覆蓋的檔案建立備份,並指定備份檔案的尾碼為 ".bak"
ln -bf -S '.bak' testfile testfile-hard
ln 的 -n 選項
使用 man ln 命令,-n 選項的釋義是 "treat destination that is a symlink to a directory as if it were a normal file",如何理解?
假設有 a、b 兩個目錄,還有一個指向 a 目錄的軟連結 c:
huey@huey-K42JE:~/huey/linux/cmdline$ mkdir a bhuey@huey-K42JE:~/huey/linux/cmdline$ ln -s a c
現在如果要使軟連結 c 改為指向 b 目錄而執行下面這條命令:
huey@huey-K42JE:~/huey/linux/cmdline$ ln -sf b c
這並不能達到預期的效果,而是會在 c 的引用目錄(即 a 目錄)裡建立 b 目錄的軟連結。這種情況下, -n 選項會將軟連結 c 當作一個普通檔案而被覆蓋:
huey@huey-K42JE:~/huey/linux/cmdline$ ln -sfn b c