天天看點

ln使用-linux下軟連結和硬連結(符号連結)差別一、概念二、實踐

一、概念

連結:一種對檔案的引用,分為硬連結和軟連結(符号連結)。

索引節點(inode):在Linux系統中,核心為每一個新建立的檔案配置設定一個inode(索引結點),每個檔案都有一個惟一的inode号,我們可以将inode簡單了解成一個指針,它永遠指向本檔案的具體存儲位置。檔案屬性儲存在索引結點裡,在通路檔案時,索引結點被複制到記憶體,進而實作檔案的快速通路。系統是通過索引節點(而不是檔案名)來定位每一個檔案。

硬連結和軟連結差別:

1. 硬連結不會建立inode,即使用的inode都是一樣的。軟連結會建立新的inode。

2. 硬連結的通路屬性和源檔案一模一樣,沒有l的辨別。軟連結的通路屬性寫明了是l,且通路權限不能設定,隻能是777,真正的權限取決于源檔案。

3. 如果移動源檔案,則軟連結找不到,而硬連結則沒有這個問題,因為軟連結存的是檔案的位置。

4. 硬連結是一種引用關系,一個源檔案建立1個硬連結,引用計數加1,删除一個檔案(硬連結檔案或者源檔案),引用計數減1,當引用計數為0時,真正删除檔案。删除源檔案軟連結隻是找不到了目标檔案。

5. 不能建立目錄的硬連結,不能在不同的檔案系統的檔案間建立硬連結,軟連結則沒有這些限制。

二、實踐

1.建立一個源目錄,為源目錄建立一個子檔案和子目錄。

$ mkdir linktest
$ cd linktest
$ mkdir sd
$ echo “a” > sd/a.txt
$ mkdir sd/subsd           

2. 建立2個源檔案。

$ echo “test1” > sf1.txt
$ echo “test2” > sf2.txt
$ ls -il
total 8
523364 drwxrwxr-x. 3 user user 4096 Jun 20 12:30 sd
523369 -rw-rw-r--.  1 user user   6 Jun 20 12:30 sf1.txt
523370 -rw-rw-r--.  1 user user   6 Jun 20 12:30 sf2.txt           

3. 為目錄建立一個硬連結和軟連結。

$ ln sd hardsd
ln: ‘sd’: hard link not allowed for directory           

目錄不能建立硬連結。

$ln -s sd softsd           

為目錄建立軟連結,目錄softsd之前不存在。

$ ls -il
total 8
523364 drwxrwxr-x.  3 user user 4096 Jun 20 12:30 sd
523369 -rw-rw-r--.  1 user user   6 Jun 20 12:30 sf1.txt
523370 -rw-rw-r--.  1 user user   6 Jun 20 12:30 sf1.txt
523371 lrwxrwxrwx.  1 user user   2 Jun 20 12:30 softsd-> sd           

第一列為inode,軟連結的inode和源目錄的inode不相同。

第二列為通路屬性,l代表是軟連結,後面的通路權限并非真正的權限,權限和源檔案一樣。

$ ls -il sd
total 8
523367 -rw-rw-r--.  1 user user   2 Jun 20 12:30 a.txt
523368 drwxrwxr-x. 2 user user 4096 Jun 20 12:30 subsd
$ cd softsd
$ ls -il
total 8
523367 -rw-rw-r--.  1 user user   2 Jun 20 12:30 a.txt
523368 drwxrwxr-x. 2 user user 4096 Jun 20 12:30 subsd
$ cd ../           

軟連結的子目錄和源檔案一模一樣。

4. 為不同的檔案建立一個硬連結和軟連結。

$ ln sf1.txt hardsf.txt
$ ln -s sf2.txt sotfsf.txt
$ ls -li
total 12
523369 -rw-rw-r--.  2 user user   6 Jun 20 12:30 hardsf.txt
523364 drwxrwxr-x. 3 user user 4096 Jun 20 12:30 sd
523369 -rw-rw-r--.  2 user user   6 Jun 20 12:30 sf1.txt
523370 -rw-rw-r--.  1 user user   6 Jun 20 12:30 sf2.txt
523371 lrwxrwxrwx. 1 user user   2 Jun 20 12:30 softsd-> sd
523372 lrwxrwxrwx. 1 user user   7 Jun 20 12:30 softsf.txt-> sf2.txt           

硬連結的inode、通路屬性都和源檔案一模一樣,硬連結會增加引用計數,引用計數都變成了2。

軟連結的inode和源檔案不一樣,通路屬性也不一樣,且引用計數保持不變。

5. 通路權限。

$ chmod 000 softsf.txt
$ chmod 000 hardsf.txt
$ ls -li
total 12
$ ln sf1.txt hardsf.txt
$ ln -s sf2.txt sotfsf.txt
$ ls -li
total 12
523369  ----------.  2 user user   6 Jun 20 12:30 hardsf.txt
523364 drwxrwxr-x. 3 user user 4096 Jun 20 12:30 sd
523369  ----------.  2 user user   6 Jun 20 12:30 sf1.txt
523370  ----------.  1 user user   6 Jun 20 12:30 sf2.txt
523371 lrwxrwxrwx. 1 user user   2 Jun 20 12:30 softsd-> sd
523372 lrwxrwxrwx. 1 user user   7 Jun 20 12:30 softsf.txt-> sf2.txt           

硬連結的通路權限直接影響自己和源檔案的通路權限。

軟連結自身的通路權限不會改變,但是會改變源檔案的通路權限。

$ cat sotfsf.txt
cat: sotfsf.txt: Permission denied           

軟連結的通路權限取決于源檔案

$ chmod 664 sf1.txt
$ chmod 664 sf2.txt           

6. 修改檔案内容。

$ echo “test1-m” > hardsf.txt
$ echo “test2-m” > softsf.txt
$ cat hardsf.txt
test1-m
$ cat sf1.txt
test1-m
$ cat softsf.txt
test2-m
$ cat sf2.txt
test2-m           

源檔案和引用檔案都變化了。

7. 移動源檔案位置。

$ mkdir temp
$ mv sf1.txt temp/
$ mv sf2.txt temp/
$ cat hardsf.txt
test1-m
$ cat softsf.txt
cat: sotfsf.txt: No such file or directory
$ mv temp/sf1.txt .
$ mv temp/sf2.txt .
$ rm -r temp           

8. 删除源檔案

$ rm sf1.txt
$ ls -li
523369 -rw-rw-r--.  1 user user   6 Jun 20 12:30 hardsf.txt
523364 drwxrwxr-x. 3 user user 4096 Jun 20 12:30 sd
523370 -rw-rw-r--.  1 user user   6 Jun 20 12:30 sf2.txt
523371 lrwxrwxrwx. 1 user user   2 Jun 20 12:30 softsd-> sd
523372 lrwxrwxrwx. 1 user user   7 Jun 20 12:30 softsf.txt-> sf2.txt
$ cat hardsf.txt
test1-m           

删除一個檔案,需要引用計數為0,則能真正删除。删除sf1.txt之後,硬連結檔案的引用計數為1,再次删除才能真正删掉。

$ rm sf2.txt
$ ls -li
523369 -rw-rw-r--.  1 user user   6 Jun 20 12:30 hardsf.txt
523364 drwxrwxr-x. 3 user user 4096 Jun 20 12:30 sd
523371 lrwxrwxrwx. 1 user user   2 Jun 20 12:30 softsd-> sd
523372 lrwxrwxrwx. 1 user user   7 Jun 20 12:30 softsf.txt-> sf2.txt
$ cat softsf.txt
cat: sotfsf.txt: No such file or directory           

删除軟連結指向的檔案,由于sf2.txt的引用計數為1,可以直接删除,軟連結的檔案還在,隻是找不到目标。

繼續閱讀