首页 > 代码库 > 學習筆記:Linux軟硬鏈接

學習筆記:Linux軟硬鏈接

1. 鏈接概念:

在Linux 系統中,鏈接可以分為兩種:ㄧ種為硬鏈接(Hard link),另一種為軟鏈接或符號鏈接(symbolic Link or soft link)。

我們前面講過ln這個命令就是創建鏈接文件的,在默認不帶參數的情況下,執行ln命令創建的鏈接是硬鏈接

如果使用ln -s 創建鏈接則為軟鏈接,前面文件類型為l(字母L)的是軟鏈接

實踐直觀命令演示理解:

硬鏈接: ln 源文件 目標文件 ---->透過索引節點(inode)來進行鏈接

軟鏈接: ln -s 源文件 目標文件 (目標文件不能事先存在)


1.1 硬鏈接:

1)透過索引節點(inode)來進行鏈接

2)硬鏈接文件就將當於文件的另外一個入口

3)允許ㄧ個文件擁有多個有效的路徑名(多個入口)

4)可以避免檔案被誤刪而不見


演示:

[root@oldboy oldboy]# pwd
/oldboy
[root@oldboy oldboy]# echo 1 > a
[root@oldboy oldboy]# ls -l a
-rw-r--r--. 1 root root 2 Jul 17 22:40 a
[root@oldboy oldboy]# cat a
1
[root@oldboy oldboy]# ln a b
[root@oldboy oldboy]# ls -hil a b ----->注意 兩個文件的inode號相同
390210 -rw-r--r--. 2 root root 2 Jul 17 22:40 a   
390210 -rw-r--r--. 2 root root 2 Jul 17 22:40 b
[root@oldboy oldboy]# rm -rf a
[root@oldboy oldboy]# ls -lhi a b 
ls: cannot access a: No such file or directory
390210 -rw-r--r--. 1 root root 2 Jul 17 22:40 b
[root@oldboy oldboy]# cat b
1


因為文件系統(ext2)的原理是,只要文件的索引節點號(inode index)還有一個以上的硬鏈接,只刪除其中一個

硬鏈接(即僅僅刪除了該文件的鏈接指向)並不影響索引節點本身和其他的鏈接(即數據文件實體並未被刪除),只

有當文件的最後一個鏈接被刪除後,此時如果有新數據要存儲在硬盤上時或者系統通過類似fsck做硬盤檢查時。

被刪除文件的數據以及目錄的鏈接才會被釋放,空間被新數據占用並覆蓋。此時,數據就再也無法找回了。也就是說,

在Linux系統中,刪除靜態文件(沒有進程調用) (目錄也是文件)的條件是與之相關的所有硬鏈接文件均被刪除。(暫時這樣理解即可,後文會講和進程的占用也有關)



硬鏈接的創建:

直接執行命令"ln 源文件 硬鏈接文件" ,即可完成創建硬鏈接,具體實例後文演示。

硬鏈接知識小結:

1) 具有相同inode節點號的多個文件互為硬鏈接文件

2) 刪除硬鏈接文件或者刪除源文件任意之ㄧ,文件實體並沒有被刪除

3) 只有刪除了源文件以及所有對應的硬鏈接文件,文件實體才會被刪除

4) 當所有的硬鏈接文件及源文件被刪除後,再存放新的數據會占用這個文件的空間,或者時磁盤fsck檢查的時候,刪除的數據也會被系統回收

5) 硬鏈接文件就是文件的另一個入口(相當於超市的前門跟後門ㄧ樣)

6) 可以透過給文件設置硬鏈接文件,來防止重要文件被誤刪

7) 透過執行命令 "ln 源文件 硬鏈接文件",即可完成創建應鏈接

8) 硬鏈接文件是普通文件,因此可以用rm 命令刪除

9) 對於靜態文件 (沒有進程正在調用的文件)來講,當對應硬鏈接數為0 (i_link),文件就被刪除。i_link的查看方法就是(ls -l 結果的第三列就是)



1.2 軟鏈接

軟鏈接(Soft Link)也稱為符號鏈接(Symbolic Link)。linux 裡的軟鏈接文件就類似於windows系統中的快捷方式。linux裡的軟鏈接文件實際上是一個特殊的文件,

文件類型是l。軟鏈接文件實際上可以理解為ㄧ個文本文件,這個文本文件中包含有軟鏈接指向另ㄧ源文件的位置信息內容,因此,通過訪問這個"快捷文件"就可以迅速定位到

軟鏈接指向的源文件實體。


演示:

[root@oldboy oldboy]# touch file
[root@oldboy oldboy]# ln -s file soft_file
[root@oldboy oldboy]# ls -lhi file soft_file    ---->兩者的inode號不同
390210 -rw-r--r--. 1 root root 0 Jul 17 23:33 file
390227 lrwxrwxrwx. 1 root root 4 Jul 17 23:34 soft_file -> file


軟鏈接的創建:

執行命令"ln -s 源文件 軟鏈接文件",即可完成創建軟鏈接,具體實例後文演示

誤區:  創建軟鏈接源文件是需要存在的,要創建的軟鏈接文件是不能存在的,是要用ln命令創建的。

軟鏈接知識小結:

1) 軟鏈接類似windows的快捷方式(可以透過readlink查看其指向)

2) 軟鏈接類似ㄧ個文本文件,裡面存放的是源文件的路徑,指向源文件實體。

3) 刪除源文件,軟鏈接文件依然存在,但是無法訪問指向的源文件路徑內容了。

4) 失效的時候ㄧ般是白字紅底閃爍提示。oldboy_soft_link_file --> oldboy_file

5) 執行命令"ln -s 源文件 軟鏈接文件",即可完成創建軟鏈接(目標不能存在)

6) 軟鏈接和源文件是不同類型的文件,也是不同的文件。inode號也不同。

7) 軟鏈接的文件類型為(l),可以用rm 命令。



綜合演示:

[root@oldboy oldboy]# mkdir /test/oldboy -p
[root@oldboy oldboy]# cd /test/oldboy/
[root@oldboy oldboy]# touch oldboyfile
[root@oldboy oldboy]# ln oldboyfile oldboy_hard_link
[root@oldboy oldboy]# ln -s oldboyfile oldboyfile_soft_link
[root@oldboy oldboy]# ls -lhi     ---->此處要注意inode號的不同與相同
total 0
402520 -rw-r--r--. 2 root root  0 Jul 18 22:25 oldboyfile
402521 lrwxrwxrwx. 1 root root 10 Jul 18 22:26 oldboyfile_soft_link -> oldboyfile
402520 -rw-r--r--. 2 root root  0 Jul 18 22:25 oldboy_hard_link



1.3. 有關文件的鏈接小結:

透過以上的測試,我們可以得到以下幾個結論:

1)刪除軟鏈接 oldboyfile_soft_link ,對oldboyfile, oldboy_hard_link無影響。

全局討論:刪除軟鏈接文件對源文件及硬鏈接文件沒有任何影響。

2)刪除硬鏈接 oldboy_hard_link, 對oldboyfile, oldboyfile_soft_link都沒有影響。

全局討論: 刪除硬鏈接文件對源文件及軟鏈接文件沒有任何影響。

3)刪除原文件 oldboyfile ,對oldboy_hard_link沒有影響,但是會導致 oldboyfile_soft_link失效

全局討論: 刪除源文件,對硬鏈接文件沒有影響,但是會導致軟鏈接失效,白字紅底閃爍。

4)同時刪除源文件oldboyfile及硬鏈接oldboy_hard_link,才會導致文件真的被刪除。

5)很多硬件設備中的快照功能,就是利用了硬鏈接的原理。

6)源文件和硬鏈接文件具有相同的inode號,可以視為同一個文件或ㄧ個文件的多個入口

7)源文件和軟鏈接文件inode號不同,是不同的文件,軟鏈接文件相當於源文件的快捷方式,含有源文件的位置指向。



1.4 有關目錄的鏈接小結:

1)對於目錄,不可以創建硬鏈接,但可以創件軟鏈接

2)對於目錄的軟鏈接是生產場景運維中常用的技巧(例子:第二關課前apache企業題)

3)目錄的硬鏈接不能跨越文件系統(從硬鏈接原理可以理解)

4)每個目錄下面都有一個硬鏈接"."號,和對應上級目錄的硬鏈接".."

5)在父目錄裡創件ㄧ個子目錄,父目錄的鏈接數增加1(子目錄裡都有..指向父目錄)

 但是在父目錄裡創建文件,父目錄的鏈接數不會增加



實例演示:

[root@oldboy oldboy]# mkdir oldboydir
[root@oldboy oldboy]# ln oldboydir oldboydir_hard_link
ln: `oldboydir‘: hard link not allowed for directory     ---->不能創建硬鏈接
[root@oldboy oldboy]# ln -s oldboydir oldboydir_soft_link
[root@oldboy oldboy]# ls -lhi
total 4.0K
402522 drwxr-xr-x. 2 root root 4.0K Jul 18 23:05 oldboydir
402520 lrwxrwxrwx. 1 root root    9 Jul 18 23:06 oldboydir_soft_link -> oldboydir
[root@oldboy oldboy]# ls -a oldboydir oldboydir/. -ldi          ---->注意inode號是相同的 
402522 drwxr-xr-x. 2 root root 4096 Jul 18 23:05 oldboydir
402522 drwxr-xr-x. 2 root root 4096 Jul 18 23:05 oldboydir/.
[root@oldboy oldboy]# ls -a oldboydir/.. ../oldboy/ -ldi ---->注意inode號是相同的
402519 drwxr-xr-x. 3 root root 4096 Jul 18 23:06 ../oldboy/    (本身ㄧ個,下面的點ㄧ個,下面裡的目錄裡面的..也是一個)
402519 drwxr-xr-x. 3 root root 4096 Jul 18 23:06 oldboydir/..

1.5 企業面試題:

企業面試題10:描述linux下軟鏈接和硬鏈接的區別

1) 默認不帶參數情況下,ln命令創建的是硬鏈接,帶-s 參數的ln命令創建的是軟鏈接

2) 軟鏈接文件與源文件的inode節點號相同,而軟鏈接文件的inode節點號與源文件不同

3) ln命令不能對目錄創建硬鏈接,但可以創建軟鏈接,對目錄的軟鏈接會經常被用到

4) 刪除軟鏈接文件,對源文件及硬鏈接文件無任何影響

5) 刪除文件的硬鏈接,對源文件及軟鏈接文件無任何影響

6) 刪除鏈接文件的源文件,對硬鏈接文件無影響,但會導致軟鏈接文件失效

7) 同時刪除源文件及其硬鏈接文件,整個文件才會被徹底刪除

8) 很多硬件設備中的快照功能,使用的就類似硬鏈接的原理

9) 軟鏈接文件可以跨文件系統,硬鏈接文件不可以跨文件系統

上述企業面試題的必勝思路1:

1.介紹軟硬鏈接的概念

2.如何創建軟硬鏈接

3.對於文件的軟硬鏈接區別

4.對於目錄的軟硬鏈接區別

上述企業面試題的必勝思路2:畫圖


企業案例:

Web服务器磁盘满故障深入解析

C.P http://oldboy.blog.51cto.com/2561410/612351

實際操作請看企業案例(1)


本文出自 “我的Linux之夢” 博客,请务必保留此出处http://12098022.blog.51cto.com/12088022/1950058

學習筆記:Linux軟硬鏈接