Linux 永久連結與軟連結,linux連結

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.