符號連接、軟連接、硬連接、快捷方式、副本(copy)之間有何區別和聯繫?

通過百度、google只明白了部分(可能有理解有誤的地方,還望指正):

1,快捷方式(shortcut)是一個.lnk類型的普通文件,只是可以指向系統中任何合法的位置。

2,符號連接(symbolic link)和快捷方式類似,但是,只有人和Windows內部知道這個是符號連接,其他程序會把它認作是它所指向的文件夾。刪除符號連接不影響源文件。

3,軟連接(junction link),軟連接在建立時會自動引用源文件(或目錄)的絕對路徑,而符號連接允許相對路徑的引用。這個不太懂,相對路徑絕對路徑什麼情況下使用?。

4,硬連接(hard link),同一源文件的另一個別名,彼此不受讀寫影響。這個也不太懂,它和副本有什麼區別?

5,副本(copy),和源文件一樣的另一個文件。

我想知道的是:

1,為什麼會有這麼多類型?

2,分別如何使用的?為什麼這種情況下用這個而不用那個?

PS:我不是開發者,也不是搞計算機的,只是普通用戶,這個問題只是由使用dropbox而了解到mklink命令時引起的,現在對這幾個名詞只是一知半解。我只是希望能夠搞清楚這個問題。wiki看了,只是不懂的名詞太多,一個一個弄懂太耗精力了.....好吧,我還是有點懶....我先繼續看wiki...

PPS:Windows的庫(library)好像就是一種符號連接(symbolic link),不知道對不對。


其實只有兩種:硬鏈接和符號鏈接。

誰說硬鏈接是讀寫不受影響的?

硬鏈接就是:一面牆上有一個洞,洞里放著一個蘋果。從牆的這一面看是這個蘋果,從牆的另一面看還是同一個蘋果。

硬鏈接就是同一塊數據但有兩個不同的名字,讀寫的時候本質上都是修改的同一塊數據。硬鏈接在刪除的時候只是刪除了一個名字。只有一塊數據的所有名字都刪除了的時候,數據才會被刪除。(刪除的時候相當於把牆的這一麵糊上,但蘋果本身不動,只有兩面都糊上了,你才會看不到)

符號鏈接就是:我聲稱我有一個蘋果,但是當你找我要的時候,我對你說,到某個建築物的倉庫就可以拿到那個蘋果了。可見我並不真正擁有一個蘋果,我只是擁有「某個地方有一個蘋果」這個信息。但對於外部的觀察者來說,這跟我實際上擁有一個蘋果並無差異。

符號鏈接的刪除:假設我死了,不會影響到原始數據。假設原始數據沒了,那我這個符號鏈接就變成了一張空頭支票,也就是懸空的符號鏈接。

快捷方式:本質上就是符號鏈接,只不過 Windows 的資源管理器可以直接管理這種文件。

junction points:可能跟符號鏈接的區別僅僅是能否使用相對路徑。

複製:把一個蘋果變成兩個蘋果。

鏈接都是為文件起別名(alias)的方式,跟複製有本質區別的。


問題中這5種對象,分別在2個不同的OS中,你應該分類理解。

部分對象有類比性,但是不能強行橫向對比。

這五種對象的發展,和OS中文件系統(FS)的發展和實現方式有緊密聯繫,同樣不能割裂來看。

我覺得問題的主人自己歸納一下,會收穫更大,我就不碼字了。

---------以下更新wiki,以及分OS的橫向對比---------

Symbolic link


鏈接方式其實是為了更好更方便的幫助應用程序使用操作系統中文件系統的資源。

當然相對操作系統,文件系統的不同,以及目標的不同,所以實現的方式也不同。

這裡有個基礎概念:當文件保存在硬碟中,實際上有兩份重要信息:

(可以這樣理解)

A. 文件名以及文件存放的空間地址

B. 文件實際內容的存放

副本?

所以這就直接將副本(copy)和其他鏈接方式區別開來:副本就是將A,B兩份硬碟數據全部拷貝一遍,實際上對於操作系統或者應用程序就是不同的兩個文件,可能數據信息是相同的,但是所存放的空間位置,目錄位置等等都是不同的。兩個文件的兩個信息分別使用A1,B1,A2,B2來替代,則這種情況文件情況是:

A1 不等於 A2

B2 不等於 B2。

兩個文件沒有任何直接關係。

軟連接、硬連接

軟連接、硬連接通常是Linux/Unix的概念。

軟鏈接同樣是建立了個文件,但是這個文件保存的信息是:

A. 文件名以及文件存放的空間地址--這時保存的是軟鏈接的名字

B. 文件實際內容的存放--這時保存的是實際指向的另外一個文件。

兩個文件的兩個信息分別使用A1,B1,A2,B2來替代,則這種情況文件情況是:

A1 不等於 A2

B1 包含的是 A2的信息。

文件查找路徑是 A1--&> B1 --&> A2 --&> B2,最終訪問B2數據。

硬鏈接可以指向文件,也可以指向目錄。可以跨越任何文件系統。拷貝刪除原始文件或者鏈接文件,不會造成相互影響。

硬連接就不是建立個文件而已了,實際上是建立了不同的A信息,兩個文件的兩個信息分別使用A1,B1,A2,B2來替代,則這種情況文件情況是:

A1 不等於 A2

B1 就是 B2,實際上只有一份B!

這時候文件的訪問路徑其實有兩條,通過A1 --&> B,或者通過A2 --&> B,最終都是訪問B的數據(注意,B只有一份)

硬鏈接只能指向文件,不能指向目錄。不能跨越任何文件系統。由於數據只有一份,所以即使刪除其中任意一份(刪除操作實際上只是刪除文件的A部分),還是可以通過另外的路徑訪問。同時,不同的訪問路徑訪問的是同樣的數據,所以可以保證數據一直同步

快捷方式

通常是微軟Windows的概念,理念上類似軟連接,但是實際實現由於操作系統不同實現過程有很大差異。而快捷方式實際上是擁有lnk後綴的普通文件。文件夾快捷方式和文件的快捷實現不太一樣,文件夾的快捷方式實際上是包含了部分文件的普通文件夾。

符號鏈接(不是連接),通常是軟連接、硬連接、快捷方式等的總稱。


比較這幾個概念時:

首先,應該先排除副本,因為經過copy之後,文件內容也經過複製存儲到到磁碟的其他位置了,副本和源文件已經沒有任何聯繫了。

其次,從我看看的資料,符號鏈接和軟鏈接是同一個概念,相當於Windows下的快捷方式。所以只剩下軟鏈接和硬鏈接的區別。 這部分內容可以參考Linux下的鏈接文件。

Linux中的鏈接文件分為兩種:硬鏈接和軟鏈接。軟鏈接(symbolic link)很好理解,就是類似於Windows的快捷方式功能的文件,讓你可以快速鏈接到目標文件(或目錄);另一種是通過文件系統的inode鏈接來產生新文件名,而不是產生新文件,這種稱為硬鏈接(hard link)。

1. Hard link

在博客中EXT2/EXT3文件系統(一),我們知道:

  • 每個文件都會佔用一個inode,文件內容由inode的記錄來指向;
  • 想要讀取該文件,必須經過目錄記錄的文件名來指向正確的inode號碼才能讀取。

也就是說,其實文件名只與目錄有關,但是文件內容則與inode有關。那麼,有沒有可能多個文件名對應同一個inode呢?這就是所謂hard link的由來。簡單地說:hard link只是記錄某個目錄下新建一條文件名連接到某inode號碼的關聯而已。

如果將讀取數據的示意圖畫出,則如下:

上圖的意思是:可以通過1或2的目錄inode去找到兩個不同的文件名,而不管使用哪個文件名均可以指到real那個inode去讀取最終的數據。這樣做的最大好處就是安全,如果你將一個文件名刪除,其實inode與block都還是存在的。此時可以通過另一個「文件名」來讀到正確的數據。此外,不論使用哪個「文件名」來編輯,最終的結果都會寫入到inode與block中,因此均能對數據進行修改。

硬連接的基本特性與限制:

  • 使用hard link設置鏈接文件時,磁碟的空間與inode的數目都不會改變,只是在某個目錄下的block多寫入一條關聯數據;
  • 不能跨文件系統;
  • 不能鏈接到目錄。如果設置硬鏈接到目錄,鏈接的數據需要連同目錄下面的所有數據都建立鏈接,會造成相當大的複雜度,目前不支持。

2.symbolic link

symbolic link很好理解,就是新建了一個文件,而這個文件會讓數據的讀取指向它連接的那個文件的文件名。由於只是作為指向的作用,所以,當源文件被刪除後,symbilic link的文件會「開不了」,實際上就是找不到源文件「文件名」。下圖為symbolic link文件讀取示意圖:

由1號inode讀取到鏈接文件的文件內容只有文件名,根據文件名鏈接到正確的目錄去取得目標文件的inode,最終就能夠讀取到正確的數據了。

軟鏈接文件的特點:

  • 軟鏈接文件的重要內容就是它會寫上目標文件的「文件名」。
  • 這個symbilic link和Windows的快捷方式可以划上等號,由symbolic link所創建的文件是一個獨立的新文件,會佔用inode與block。
  • hard link更安全,但限制多,所以symbolic link應用更廣。

更詳細的內容可以參見:Linux下的鏈接文件


把這裡的inode看做你實際的文件信息.

我們可以看到硬鏈接和文件名都是直接指向文件的, 二者只是同一個文件的不同標籤而已.

軟鏈接是指向文件名的, 修改它並不會改變文件信息. 也就是我們常說的快捷方式.

至於副本, 把這張圖複製一下, 兩張並排一起看就好了.


desktop只是啟動方式(只能通過參數來啟動軟體,作用有限)

副本就是兩個獨立的文件,佔用兩個文件的大小

軟鏈接就是真正意義上的快捷方式,比如指向任何文件夾或這文件

硬鏈接就是一個文件(不是文件夾)的別名,無論有多少各別名,但它其實 是一個文件

---------------

再啰嗦一遍:

對我來說,軟硬鏈接只是為了防止文件不小心被刪,

比如我將一個名為知乎筆記.txt從/home/XX/筆記硬鏈接到/home/XX/桌面,

編輯桌面的知乎筆記.txt時 筆記下的知乎筆記.txt已同步更新了

即使不小心把桌面上的知乎筆記.txt刪了, /home/XX/筆記里的知乎筆記.txt還在

你可能會說為什麼不直接複製知乎筆記.txt呢?

複製要佔兩個大小啊,而且複製了,你編輯了一個,另一個它不同步啊

再說說同步吧,

linux下沒有onenote,zim雖然簡單也足夠了

用cryptkeeper設置一個加密文件夾,(注意是實際加密的那個,不是映射的那個,切記)

在金山快盤裡將該加密文件夾設置為自動同步,既方便,又安全


說一個 Windows 下的一個有用的區別,

Windows 下快捷方式只能使用絕對路徑,這導致移動硬碟、U盤裡的快捷方式如果盤符改變了(比如 F: 變成了 G:),就失效了。

而使用符號連接(mklink 命令創建的)就可以在改變了盤符的情況下繼續有效。


看到這個問題,我回去研究了一下,這裡就說一下linux系統ubuntu發行版的情況。

受條件所限,手頭只有ubuntu的系統,那位大能能夠多研究幾個系統然後弄一個完整的答案?

========================================

ubuntu的yelp.desktop是一個快捷方式,本質上是一個文本文件。

$ cat yelp.desktop

[Desktop Entry]

Name=Help

Comment=Get help with Unity

Keywords=documentation;information;manual;

OnlyShowIn=GNOME;Unity;

Exec=yelp %u

Icon=help-browser

StartupNotify=true

Terminal=false

Type=Application

Categories=GNOME;GTK;Core;Documentation;Utility;

X-GNOME-Bugzilla-Bugzilla=GNOME

X-GNOME-Bugzilla-Product=Yelp

X-GNOME-Bugzilla-Component=general

X-GNOME-Bugzilla-Version=3.10.2

MimeType=x-scheme-handler/ghelp;x-scheme-handler/help;x-scheme-handler/info;x-scheme-handler/man;

X-Ubuntu-Gettext-Domain=yelp

==========================================================

而.desktop在ubuntu中被成為desktop configeration file,包含了很多參數,點開他的屬性發現他和windows的.link文件一樣都包含命令行參數。他們和各種鏈接都不同,因為他們本身能夠攜帶各種參數,是包含指向功能的配置文件。

軟鏈接是一個二進位文件,我不知道他的組成是什麼,因為看不到。但是依據書上的知識來看,他其中包含了指向源程序的路徑,獨立於源文件存在,創建了一個文件夾的軟鏈接之後,點進去會發現,他就像是完成了一個掛載操作一樣,進入了一個軟鏈接命名的文件夾中,好似這個文件夾真的存在一樣,但實際上他是進入了系統另一個路徑中。

硬鏈接實際上是一個指針,他本身不是文件,至少不是一般意義上的文件。學過C 語言的應該能夠理解。

符號鏈接沒接觸過不做評價。不過至少從表現上來看,和軟鏈接是一樣的。

副本和源文件是兩個東西。沒什麼聯繫。


我也在學習這幾個鏈接,在win7里剛才試了下。使用的是Link Shell Extension.

目錄鏈接和符號鏈接,都是指向源的記錄,應該是軟連接的一種,但在拷貝剪切時發生了不同的作用。拷貝時二者都是複製了源,也就是拷貝了真實的文件和目錄,但在剪切時符號鏈接僅僅剪切了符號自身,而目錄鏈接則直接剪切了源,剪切後目錄鏈接自身不會被刪除。由於源被剪切了,所以原來的目錄鏈接指向的目錄沒有了內容。

------------------------------------------------------------------------------------

修訂:

其實討論應該看是哪個系統,有共同點也有不同的地方。基本上只有硬鏈接和軟鏈接,硬鏈接就是對文件inode的引用,多一個硬連接就多一個引用,其文件實體本身只有一份。建立硬連接後,無論是最開始的文件還是最後建立的硬連接都是平等的文件,看不出誰是源誰是硬連接。如果要刪除文件,只有所有的硬連接都刪除才會最終刪除文件實體,也就是inode的引用為0才會刪除文件本身。硬連接限於同一個drive,移動任何一個都不會影響其他硬連接。

軟連接有自己的inode,文件內容是關於源的引用信息,也就是說軟連接的內容和源文件的內容是不同的,只不過軟連接的文件內容很小,是一些關於源的說明信息,系統可以從軟連接直接訪問源文件。當源被移動、修改文件名稱、刪除後,軟連接的引用信息不會自動更新同步,成了懸浮信息,軟連接也就失效了。軟連接可以跨drive。

windows7還有個鏈接叫做目錄鏈接,其實是翻譯的問題,原文是junction,這個我沒有了解。可能是雜糅了硬連接和軟連接的一些功能而成。

通俗地說,軟連接有點像快捷方式,硬連接則是同一個文件的不同叫法。


為什麼有這麼多類型?

這些類型的目的無非是兩個:

方便:你可以將任意程序的快捷方式放到桌面,而不用重重點擊。我可以將 ~/dev/myproject/.oOo./.zshrc 軟鏈接到 ~/.zshrc,從而統一管理我的配置文件。

節省資源:除了 copy 之外,剩下 4 種類型都不會額外消耗硬碟空間。

分別怎麼使用?

如果是普通用戶,你只需要知道「快捷方式」和「副本」之間的區別,後者是完全獨立的複製。

如果是開發者的話,我相信去 wikipedia 搜索定義即可,看到不會的名詞再多點一次。


推薦閱讀:

你們見過的最快的開機速度是多少秒?
點關閉按鈕關閉程序和在任務管理器中選結束任務有什麼區別?
現在國內缺乏優秀自主的桌面系統,為什麼沒有團隊或者公司試水chromium os?
現在還使用微軟的DOS操作系統是什麼體驗?

TAG:操作系統 | 計算機 | 文件系統 | 同步 |