Linux上建立和更改硬連接和符號連接(軟鏈接)
對於Linux上的硬連接和軟鏈接而言,使用cp命令,不管覆蓋其中的那個文件(源文件,軟鏈接文件,硬連接文件),其它文件的內容都會同步修改。
css
點擊(此處)摺疊或打開java
- [oracle@edsir4p1- ~]$ ll
- [oracle@edsir4p1- ~]$ touch a.txt
- [oracle@edsir4p1- ~]$ ln -s a.txt b.txt
- [oracle@edsir4p1- ~]$ ll
- -rw-r--r-- 1 oracle oinstall 0 Dec 4 12:32 a.txt
- lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
- [oracle@edsir4p1- ~]$ ln a.txt c.txt
- [oracle@edsir4p1- ~]$ ll
- -rw-r--r-- 2 oracle oinstall 0 Dec 4 12:32 a.txt
- lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
- -rw-r--r-- 2 oracle oinstall 0 Dec 4 12:32 c.txt
- [oracle@edsir4p1- ~]$ echo lhr > a.txt
- [oracle@edsir4p1- ~]$ more a.txt
- lhr
- [oracle@edsir4p1- ~]$
- [oracle@edsir4p1- ~]$ more a.txt
- lhr
- [oracle@edsir4p1- ~]$ more b.txt
- lhr
- [oracle@edsir4p1- ~]$ more c.txt
- lhr
- [oracle@edsir4p1- ~]$ echo lihuarong > b.txt
- [oracle@edsir4p1- ~]$ more a.txt
- lihuarong
- [oracle@edsir4p1- ~]$ more b.txt
- lihuarong
- [oracle@edsir4p1- ~]$ more c.txt
- lihuarong
- [oracle@edsir4p1- ~]$ echo best > d.txt
- [oracle@edsir4p1- ~]$
- [oracle@edsir4p1- ~]$
- [oracle@edsir4p1- ~]$ cp d.txt b.txt
- [oracle@edsir4p1- ~]$ ll *.txt
- -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt
- lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
- -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt
- -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
- [oracle@edsir4p1- ~]$ more a.txt
- best
- [oracle@edsir4p1- ~]$ more b.txt
- best
- [oracle@edsir4p1- ~]$ more c.txt
- best
- [oracle@edsir4p1- ~]$ more d.txt
- best
- [oracle@edsir4p1- ~]$ ls -i a.txt
- 46236787 a.txt
- [oracle@edsir4p1- ~]$ ls -li *.txt
- 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt
- 46236797 lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
- 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt
- 46236798 -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
- [oracle@edsir4p1- ~]$ echo xxxoooo > e.txt
- [oracle@edsir4p1- ~]$ ls -li *.txt
- 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt
- 46236797 lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
- 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt
- 46236798 -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
- 46236799 -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt
- [oracle@edsir4p1- ~]$ cp b.txt b.txt_bk
- [oracle@edsir4p1- ~]$
- [oracle@edsir4p1- ~]$
- [oracle@edsir4p1- ~]$ cp e.txt b.txt
- [oracle@edsir4p1- ~]$
- [oracle@edsir4p1- ~]$ more b.txt
- xxxoooo
- [oracle@edsir4p1- ~]$ more a.txt
- xxxoooo
- [oracle@edsir4p1- ~]$ more c.txt
- xxxoooo
- [oracle@edsir4p1- ~]$ more b.txt_bk
- best
- [oracle@edsir4p1- ~]$ cp b.txt_bk a.txt
- [oracle@edsir4p1- ~]$ more a.txt
- best
- [oracle@edsir4p1- ~]$ more b.txt
- best
- [oracle@edsir4p1- ~]$ more c.txt
- best
- [oracle@edsir4p1- ~]$ ll *.txt
- -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 a.txt
- lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
- -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 c.txt
- -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
- -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt
- [oracle@edsir4p1- ~]$ rm -rf b.txt
- [oracle@edsir4p1- ~]$ ll *.txt
- -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 a.txt
- -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 c.txt
- -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
- -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt
- [oracle@edsir4p1- ~]$
概述
在本篇中,學習建立和管理硬連接和符號連接。學習:node
- 建立硬或軟連接
- 識別連接並知道它們的類型
- 理解複製與連接文件之間的區別
- 使用連接執行系統管理任務
連接簡介
在存儲設備上,文件或目錄包含在一些數據塊中。有關某個文件的信息包含在一個 inode 中,它記錄了全部者、最後訪問該文件的時間、文件的大小、它是不是目錄,以及誰能夠讀取或寫入它等信息。inode 編號也稱爲文件序列號 ,該編號在特定文件系統內是惟一的。一個 目錄條目 包含一個文件或目錄的名稱,以及用來存儲該文件或目錄的信息的 inode 的指針。python
建立連接
硬連接 是指向 inode 的目錄條目,而 軟連接 或 符號連接 是指向提供另外一個目錄條目的名稱的 inode 的目錄條目。存儲第二個名稱的準確機制可能依賴於文件系統和名稱的長度。符號連接也稱爲symlink 。linux
您能夠只爲文件建立硬連接,而不爲目錄建立硬連接。一個例外是一個包含該目錄和它的父目錄(. 和 ..)的目錄中的特殊目錄條目,它們是維護子目錄數量的硬連接。由於硬連接指向 inode,並且 inode 僅在特定的文件系統內是惟一的,因此硬連接不能跨文件系統使用。若是一個文件有多個硬連接,那麼只在指向該 inode 的最後一個連接被刪除,並且連接數量變爲 0 時,纔會刪除該文件。c++
軟連接或 symlink 僅按名稱指向另外一個文件或目錄,而不是按 inode。軟連接能夠跨越文件系統邊界進行使用。刪除軟連接不會刪除目標文件或目錄,刪除目標文件或目錄也不會自動刪除任何軟連接。shell
首先讓咱們看看如何建立硬和軟連接。在本教程後面,咱們將介紹識別和使用咱們在這裏建立的連接的方式。windows
硬連接
使用 ln 命令建立現有文件的額外的硬連接(但不能是目錄,即便系統將 . 和 .. as 設置爲硬連接)。centos
清單 1 展現瞭如何建立一個包含兩個文件和一個子目錄的目錄,其中包含 file1 的兩個硬連接,一個位於同一個目錄中,另外一個位於子目錄中。咱們向 file1 添加一個詞,而後向 file3 添加另外一個詞,並在子目錄中顯示該連接的內容,以代表全部連接確實都指向相同的數據。bash
清單 1. 建立硬連接
[plain] view plain copy
- [ian@atticf22 ~]$ mkdir -p lpi104-6/subdir
- [ian@atticf22 ~]$ touch lpi104-6/file1
- [ian@atticf22 ~]$ touch lpi104-6/file2
- [ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/file3
- [ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/subdir/file3sub
- [ian@atticf22 ~]$ echo "something" > lpi104-6/file1
- [ian@atticf22 ~]$ echo "else" >> lpi104-6/file3
- [ian@atticf22 ~]$ cat lpi104-6/subdir/file3sub
- something
- else
若是嘗試建立跨文件系統或針對目錄的硬連接,則會得到錯誤。清單 2 顯示個人主目錄和 research 目錄在不一樣的文件系統上,並且跨這些文件系統建立硬連接的嘗試失敗了,與建立 lpi104-6 目錄的硬連接的嘗試同樣。
清單 2. 硬連接建立失敗
[plain] view plain copy
- [ian@atticf22 ~]$ df . research
- Filesystem 1K-blocks Used Available Use% Mounted on
- /dev/sda5 71168700 31642752 35887712 47% /
- /dev/sdb3 60326992 30677592 26578276 54% /home/ian/research
- [ian@atticf22 ~]$ mkdir -p research/lpi104-6/
- [ian@atticf22 ~]$ ln lpi104-6/file1 research/lpi104-6/file3
- ln: failed to create hard link ‘ research/lpi104-6/file3 ’ =>
- ‘ lpi104-6/file1 ’ : Invalid cross-device link
- [ian@atticf22 ~]$ ln lpi104-6 lpidir104-6
- ln: ‘ lpi104-6 ’ : hard link not allowed for directory
軟連接
使用 ln 命令和 -s 選項來建立軟連接。軟連接使用文件或目錄名稱,這些名稱多是相對或絕對的。若是使用相對名稱,您可能但願當前工做目錄是您建立連接的目錄。不然,您建立的連接將是文件系統中的另外一個位置相對的連接。
清單 3 展現了爲咱們剛建立的 file1 建立軟連接的兩種方式,以及如何建立軟連接,而不是建立在 清單 2中失敗的兩個硬連接。
清單 3. 建立軟連接
[plain] view plain copy
- [ian@atticf22 ~]$ # Create symlink using absolute paths
- [ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~/lpi104-6/file4
- [ian@atticf22 ~]$ # Create symlink using relative paths
- [ian@atticf22 ~]$ cd lpi104-6/
- [ian@atticf22 lpi104-6]$ ln -s file1 file5
- [ian@atticf22 lpi104-6]$ cd ..
- [ian@atticf22 ~]$ # Create symlink across file systems
- [ian@atticf22 ~]$ mkdir -p ~ian/research/lpi104-6
- [ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~ian/research/lpi104-6/file4
- [ian@atticf22 ~]$ # Create symlink for directory
- [ian@atticf22 ~]$ ln -s lpi104-6 lpidir104-6
與以前同樣,您可使用任何連接或目標文件名來引用該文件或目錄。清單 4 顯示了一些例子。
清單 4. 使用軟連接
[plain] view plain copy
- [ian@atticf22 ~]$ echo "another line" >> ~ian/research/lpi104-6/file
- [ian@atticf22 ~]$ # cat a symlink
- [ian@atticf22 ~]$ cat lpi104-6/file5
- something
- else
- [ian@atticf22 ~]$ # cat a hard link
- [ian@atticf22 ~]$ cat lpi104-6/file1
- something
- else
- [ian@atticf22 ~]$ # display directory contents using symlink
- [ian@atticf22 ~]$ ls lpidir104-6
- file1 file2 file3 file4 file5 subdir
在建立連接時,讓咱們在工做目錄 不是咱們想要存放連接的目錄時使用相對路徑建立一個連接。下一節將介紹如何實現此目的。
清單 5. 建立不良的軟連接
[plain] view plain copy
- [ian@atticf22 ~]$ ln -s lpi104-6/file1 lpi104-6/file6
識別連接
在上一節中,您瞭解瞭如何建立連接,但不知道如何區分您建立的連接。如今讓咱們討論一下這個主題。
查找信息
在許多系統上,ls 命令等同於 ls --color=auto ,它以不一樣顏色打印不一樣類型的文件系統對象。若是使用此選項,可能使用藍綠色文原本顯示 symlink,如 圖 1中所示。
圖 1. 使用 ls 的 --colors 選項來識別連接
在舊配置上,可能使用深藍色背景來顯示硬連接。這些顏色可以使用 dircolors 程序來配置。若是要自定義您的終端外觀,您可能但願更改ls 的一些輸出的顏色。清單 6顯示了一種在 Fedora 22 系統上得到硬連接的藍色背景的方式,而 圖 2 則顯示告終果。使用手冊頁進一步理解該示例。
清單 6. 使用 dircolors 爲硬連接設置一種藍色背景
[plain] view plain copy
- [ian@atticf22 ~]$ # Save a copy of dircolors defaults
- [ian@atticf22 ~]$ dircolors -p > dircolors-defaults
- [ian@atticf22 ~]$ grep MULTI dircolors-defaults
- MULTIHARDLINK 00 # regular file with more than one link
- [ian@atticf22 ~]$ # Change MULTIHARDLINK to blue background
- [ian@atticf22 ~]$ sed -e'/MULTI/s/00/00;44/' dircolors-defaults > dircolors-new
- [ian@atticf22 ~]$ grep MULTI dircolors-new
- MULTIHARDLINK 00;44 # regular file with more than one link
- [ian@atticf22 ~]$ # Set the new colors for the current terminal session
- [ian@atticf22 ~]$ eval $(dircolors dircolors-new )
圖 2. 使用藍色背景來標識硬連接
對於可以區分顏色的視力正常的人而言,顏色可能很方便,但它們對其餘人沒多大用處,對 shell 腳本或程序確定也沒多大用處。沒有顏色,就須要更多的信息,好比使用ls -l 經過一個長清單所提供的信息。在 清單 7中,咱們爲第一個示例顯式禁用了顏色輸出,但您也能夠像咱們對另外兩個示例所作的同樣顯式調用/bin/ls 命令。
清單 7. 識別連接
[plain] view plain copy
- [ian@atticf22 ~]$ ls --color=none -lR lpi104-6
- lpi104-6:
- total 12
- -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file1
- -rw-rw-r--. 1 ian ian 0 Aug 9 14:19 file2
- -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3
- lrwxrwxrwx. 1 ian ian 24 Aug 9 14:26 file4 -> /home/ian/lpi104-6/file1
- lrwxrwxrwx. 1 ian ian 5 Aug 9 14:26 file5 -> file1
- lrwxrwxrwx. 1 ian ian 14 Aug 9 14:34 file6 -> lpi104-6/file1
- drwxrwxr-x. 2 ian ian 4096 Aug 9 14:19 subdir
-
- lpi104-6/subdir:
- total 4
- -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3sub
- [ian@atticf22 ~]$ /bin/ls -l ~ian/research/lpi104-6/file4
- lrwxrwxrwx. 1 ian ian 24 Aug 9 14:27 /home/ian/research/lpi104-6/file4 -> /home/ian/lpi104-6/file1
- [ian@atticf22 ~]$ /bin/ls -l lpidir104-6
- lrwxrwxrwx. 1 ian ian 8 Aug 9 14:27 lpidir104-6 -> lpi104-6
輸出的第二列是一個連接計數,顯示了此文件的硬連接數,因此咱們知道 file一、file3 和 file3sub 都擁有多個指向它們表示的對象的硬連接。咱們仍沒有足夠的信息來知道它們都表示同一個對象。若是您刪除一個連接數大於 1 的文件,inode 中的連接數會減 1,但該文件只在連接數變爲 0 時纔會刪除。同一個文件的其餘全部硬連接將顯示一個如今減去了 1 的連接數。
在輸出的第一列中,您會看到第一個字符是表示符號連接的 「l」(L 的小寫形式)。您還會看到在 -> 字符後顯示了連接的目標。例如,file4 -> /home/ian/lpi104-6/file1。另外一個提示是,該大小是連接目標的名稱中的字符數。請注意,對於符號連接,目錄清單中的連接數沒有更新。刪除該連接不會影響目標文件。Symlink 不會阻止文件被刪除。若是目標文件被移動或刪除,那麼 symlink 將被破壞。出於這個緣由,許多系統在目錄清單中使用了顏色,一般使用淡藍色表示正常連接,使用紅色表示被破壞的連接。
您可使用 ls 命令的 -i 選項來顯示文件和目錄條目的 inode 數量。清單 8同時給出了咱們的 lpi104-6 目錄的短和長輸出。
清單 8. 顯示 inode 信息
[plain] view plain copy
- [ian@atticf22 ~]$ ls -i lpi104-6
- 1988884 file1 1988884 file3 1988892 file5 1988605 subdir
- 1988886 file2 1988885 file4 1988891 file6
- [ian@atticf22 ~]$ ls -il lpi104-6
- total 12
- 1988884 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file1
- 1988886 -rw-rw-r--. 1 ian ian 0 Aug 9 14:19 file2
- 1988884 -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3
- 1988885 lrwxrwxrwx. 1 ian ian 24 Aug 9 14:26 file4 -> /home/ian/lpi104-6/file1
- 1988892 lrwxrwxrwx. 1 ian ian 5 Aug 9 14:26 file5 -> file1
- 1988891 lrwxrwxrwx. 1 ian ian 14 Aug 9 14:34 file6 -> lpi104-6/file1
- 1988605 drwxrwxr-x. 2 ian ian 4096 Aug 9 14:19 subdir
您還可使用 find 命令,使用 -type l 查找表達式來搜索符號連接,如 清單 9中所示。
清單 9. 使用 find 查找 symlink
[plain] view plain copy
- [ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -type l
- lpi104-6/file4
- lpi104-6/file6
- lpi104-6/file5
- research/lpi104-6/file4
破壞的 symlink
在 清單 5 中,咱們聲明要建立一個不良的軟連接。這是破壞的 symlink 的一個示例。由於硬連接始終指向一個表示文件的 inode,因此它們始終有效。可是,symlink 可能出於許多緣由而遭到破壞,包括:
- 在建立連接時,連接的原始文件或目標不存在(就像 清單 5 中同樣)。
- 連接的目標被刪除或重命名。
- 目標的路徑中的某個元素被刪除或重命名。
全部這些條件都不會拋出錯誤,因此您須要仔細考慮您在建立 symlink 時可能發生了什麼狀況。具體地講,對於絕對或相對路徑的選擇,可能受到您但願連接的對象在連接生存期中發生什麼的影響。
若是您使用顏色輸出,破壞的 symlink 可能在黑色背景上顯示爲紅色文本,就像 圖 1 中的 file6 的狀況同樣。不然,您須要使用 ls 的 -H 或 -L 選項來取消引用該連接,並提供有關目標的信息。-H 選項在命令行上取消引用連接,-L 選項取消引用顯示中包含的附加連接。清單 10演示了來自這兩個選項的輸出中的區別。
清單 10. 使用 ls -H 和 ls -L 取消引用連接
[plain] view plain copy
- [ian@atticf22 ~]$ /bin/ls -lH lpidir104-6
- total 12
- -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file1
- -rw-rw-r--. 1 ian ian 0 Aug 9 14:19 file2
- -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3
- lrwxrwxrwx. 1 ian ian 24 Aug 9 14:26 file4 -> /home/ian/lpi104-6/file1
- lrwxrwxrwx. 1 ian ian 5 Aug 9 14:26 file5 -> file1
- lrwxrwxrwx. 1 ian ian 14 Aug 9 14:34 file6 -> lpi104-6/file1
- drwxrwxr-x. 2 ian ian 4096 Aug 9 14:19 subdir
- [ian@atticf22 ~]$ /bin/ls -lL lpidir104-6
- /bin/ls: cannot access lpidir104-6/file6: No such file or directory
- total 20
- -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file1
- -rw-rw-r--. 1 ian ian 0 Aug 9 14:19 file2
- -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file3
- -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file4
- -rw-rw-r--. 3 ian ian 15 Aug 9 14:19 file5
- l?????????? ? ? ? ? ? file6
- drwxrwxr-x. 2 ian ian 4096 Aug 9 14:19 subdir
請注意,錯誤消息代表 file6 不存在,另請注意針對它的包含全部 「?」 字符的輸出,它們一樣代表該文件不存在。
關於破壞的符號連接,還要說明最後一點。讀取該文件的嘗試將失敗,由於它不存在。可是,若是您擁有目標文件的合適權限,寫入它的嘗試將有效,如 清單 11中所示。請注意,咱們須要在寫入該文件以前建立 lpi104-6/lpi104-6。
清單 11. 讀取和寫入一個破壞的 symlink
[plain] view plain copy
- [ian@atticf22 ~]$ cat lpi104-6/file6
- cat: lpi104-6/file6: No such file or directory
- [ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6
- bash: lpi104-6/file6: No such file or directory
- [ian@atticf22 ~]$ mkdir lpi104-6/lpi104-6
- [ian@atticf22 ~]$ cat lpi104-6/file6
- cat: lpi104-6/file6: No such file or directory
- [ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6
- [ian@atticf22 ~]$ cat lpi104-6/file6
- Testing file6
- [ian@atticf22 ~]$ ls lpi104-6/lpi104-6
- file1
- [ian@atticf22 ~]$ ls -l lpi104-6/file6
- lrwxrwxrwx. 1 ian ian 14 Aug 9 14:34 lpi104-6/file6 -> lpi104-6/file1
誰連接到我?
要肯定哪些文件是一個特定 inode 的硬連接,可使用 find 命令和 -samefile 選項及一個文件名,或者-inum 選項及一個 inode 編號,如 清單 12 中所示。
清單 12. 查找同一個文件的硬連接
[plain] view plain copy
- [ian@atticf22 ~]$ find lpi104-6 -samefile lpi104-6/file1
- lpi104-6/file1
- lpi104-6/file3
- lpi104-6/subdir/file3sub
- [ian@atticf22 ~]$ ls -i lpi104-6/file1
- 1988884 lpi104-6/file1
- [ian@atticf22 ~]$ find lpi104-6 -inum 1988884
- lpi104-6/file1
- lpi104-6/file3
- lpi104-6/subdir/file3sub
要查找哪些文件經過符號連接而連接到一個特定文件,可使用 find 命令和 -lname 選項及一個文件名,如 清單 13 所示。連接可使用相對或絕對路徑,因此您可能但願在名稱中放入一個前導的星號來找到全部匹配結果。
清單 13. 查找一個文件或目錄的符號連接
[plain] view plain copy
- [ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -lname "*file1"
- lpi104-6/file4
- lpi104-6/file6
- lpi104-6/file5
- research/lpi104-6/file4
複製仍是連接
根據您想要完成的任務,有時會使用連接,有時複製一個文件可能會更好一些。主要區別在於,連接提供了一個文件的多個名稱,而副本會在兩個不一樣的名稱下建立兩組相同的數據。對於備份和測試用途,確定會使用副本,您但願試驗一個新程序而不讓您的操做數據處於風險之中。在須要某個文件(或目錄)的別名時(可能用於提供更方面或更短的路徑),可使用連接。在下一節中,咱們將介紹連接的其餘一些用法。
您已經看到,在更新一個文件時,它全部的連接都會看到更新信息,而複製文件不會這樣。您還看到,符號連接能夠破壞,後續寫入操做能夠建立新的文件。請當心使用連接。
連接和系統管理
連接(尤爲是符號連接)一般用在 Linux 系統管理中。命令一般具備別名,因此用戶不須要知道當前命令的版本號,但在必要的時候,可使用更長的名稱來訪問其餘版本。如 清單 14所示,python 命令是python2 的 symlink,python2 自己是 2.7 版的 python2.7 的 symlink。
清單 14. 將命令別名化爲一個特定版本
[plain] view plain copy
- [ian@atticf22 ~]$ which python
- /usr/bin/python
- [ian@atticf22 ~]$ ls -l /usr/bin/python
- lrwxrwxrwx. 1 root root 7 May 27 14:12 /usr/bin/python -> python2
- [ian@atticf22 ~]$ ls -l /usr/bin/python2
- lrwxrwxrwx. 1 root root 9 May 27 14:12 /usr/bin/python2 -> python2.7
- [ian@atticf22 ~]$ ls -l /usr/bin/python2.7
- -rwxr-xr-x. 1 root root 7120 May 27 14:12 /usr/bin/python2.7
在多個命令名稱使用相同的基礎代碼時,好比存儲和從新啓動系統的各類命令,其餘用途就能夠派上用場。有時,一個新命令名稱(好比 genisoimage )將取代舊命令名稱,但舊名稱 (mkisofs) 保持爲新命令的連接。一些替代性 工具會普遍使用連接,因此您能夠在多個替代性工具中選擇一個來用於某條命令,好比java 。清單 15顯示了一些示例。
清單 15. 命令別名的示例
[plain] view plain copy
- [ian@atticf22 ~]$ which halt
- /usr/sbin/halt
- [ian@atticf22 ~]$ ls -l /usr/sbin/halt
- lrwxrwxrwx. 1 root root 16 Jun 9 09:16 /usr/sbin/halt -> ../bin/systemctl
- [ian@atticf22 ~]$ find /usr/sbin /usr/bin -lname "*/systemctl"
- /usr/sbin/halt
- /usr/sbin/telinit
- /usr/sbin/shutdown
- /usr/sbin/runlevel
- /usr/sbin/poweroff
- /usr/sbin/reboot
- [ian@atticf22 ~]$ which mkisofs
- /usr/bin/mkisofs
- [ian@atticf22 ~]$ ls -l /usr/bin/mkisofs
- lrwxrwxrwx. 1 root root 25 Jun 15 08:02 /usr/bin/mkisofs -> /etc/alternatives/mkisofs
- [ian@atticf22 ~]$ alternatives --display mkisofs
- mkisofs - status is auto.
- link currently points to /usr/bin/genisoimage
- /usr/bin/genisoimage - priority 50
- slave mkisofs-mkhybrid: /usr/bin/genisoimage
- slave mkisofs-mkhybridman: /usr/share/man/man1/genisoimage.1.gz
- slave mkisofs-mkisofsman: /usr/share/man/man1/genisoimage.1.gz
- Current `best' version is /usr/bin/genisoimage.
庫名稱一般也使用 symlink 來管理,不管是容許程序在獲取當前版本時連接到通常名稱,仍是管理系統,好比可以運行 32 位程序的 64 位系統。清單 16顯示了一些示例。請注意,一些狀況會使用絕對路徑,而另外一些狀況會使用相對路徑。
清單 16. 庫連接
[plain] view plain copy
- [ian@atticf22 ~]$ ls -l /usr/lib*/libm.so*
- lrwxrwxrwx. 1 root root 21 Feb 23 10:31 /usr/lib64/libm.so -> ../../lib64/libm.so.6
- lrwxrwxrwx. 1 root root 12 Feb 23 10:33 /usr/lib64/libm.so.6 -> libm-2.21.so
- lrwxrwxrwx. 1 root root 12 Feb 23 10:35 /usr/lib/libm.so.6 -> libm-2.21.so
- [ian@atticf22 ~]$ find /usr/lib/ /usr/lib64/ -lname "*libstdc++*"
- /usr/lib/gcc/x86_64-redhat-linux/5.1.1/libstdc++.so
- /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.so
- /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.a
- /usr/lib64/libstdc++.so.6
- [ian@atticf22 ~]$ ls -l /usr/lib64/libstdc++.so.6
- lrwxrwxrwx. 1 root root 19 Jun 18 06:52 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.21
- [ian@atticf22 ~]$ ls -l /usr/lib64/libwbclient*
- lrwxrwxrwx. 1 root root 19 Jul 1 10:37 /usr/lib64/libwbclient.so.0 -> libwbclient.so.0.12
- lrwxrwxrwx. 1 root root 40 Jul 1 10:37 /usr/lib64/libwbclient.so.0.12 ->
- /etc/alternatives/libwbclient.so.0.12-64
原文地址:
http://blog.csdn.net/sinat_31726559/article/details/51835785
1 . 使用方式 :ln [option] source_file dist_file
-f 創建時,將同檔案名刪除.
-i 刪除前進行詢問.
ln -s abc cde 創建abc 的軟鏈接
ln abc cde 創建abc的硬鏈接,
2. 軟連接與硬連接的區別(通俗):
硬連接可認爲是一個文件擁有兩個文件名;而軟連接則是
系統新建一個連接文件,此文件指向其所要指的文件
3. 軟連接與硬連接的區別(講解):
Linux 軟鏈接與硬鏈接
對於一個文件來講,有惟一的索引接點與之對應,而對於一個索引接點號,卻能夠有多個文件名與之對應。所以,在磁盤上的同一個文件能夠經過不一樣的路徑去訪問該文件。注意在Linux下是一切皆文件的啊,文件夾、新加的硬盤 ...均可以看着文件來處理的啊。
鏈接有軟鏈接和硬鏈接(hard link)之分的,軟鏈接(symbolic link)又叫符號鏈接。符號鏈接至關於Windows下的快捷方式。
不能夠對文件夾創建硬鏈接的,咱們一般用的仍是軟鏈接比較多。
eg:
ln -s source dist # 創建軟鏈接
ln source dist # 創建硬鏈接
軟連接實際上只是一段文字,裏面包含着它所指向的文件的名字,系統看到軟連接後自動跳到對應的文件位置處進行處理;相反,硬聯接爲文件開設一個新的目錄 項,硬連接與文件原有的名字是平權的,在Linux看來它們是等價的。因爲這個緣由,硬連接不能鏈接兩個不一樣文件系統上的文件。
(1)軟鏈接能夠 跨文件系統 ,硬鏈接不能夠 。實踐的方法就是用共享文件把windows下的 aa.txt文本文檔鏈接到linux下/root目錄 下 bb,cc . ln -s aa.txt /root/bb 鏈接成功 。ln aa.txt /root/bb 失敗 。
(2)關於 I節點的問題 。硬鏈接無論有多少個,都指向的是同一個I節點,會把 結點鏈接數增長,只要結點的鏈接數不是 0,文件就一直存在,無論你刪除的是源文件仍是 鏈接的文件 。只要有一個存在 ,文件就 存在 (其實也不分什麼源文件鏈接文件的 ,由於他們指向都是同一個 I節點)。 當你修改源文件或者鏈接文件任何一個的時候 ,其餘的文件都會作同步的修改。軟連接不直接使用i節點號做爲文件指針,而是使用文件路徑名做爲指針。因此 刪除鏈接文件 對源文件無影響,可是刪除源文件,鏈接文件就會找不到要指向的文件 。軟連接有本身的inode,並在磁盤上有一小片空間存放路徑名.
(3)軟鏈接能夠對一個不存在的文件名進行鏈接 。
(4)軟鏈接能夠對目錄進行鏈接。
備 注:I節點 :它是UNIX內部用於描述文件特性的數據結構.咱們一般稱I節點爲文件索引結點(信息結點).i節點含有關於文件的大部分的重要信息,包括文件數據塊在 磁盤上的地址.每個I節點有它本身的標誌號,咱們稱爲文件順序號.I節點包含的信息 1.文件類型 2.文件屬主關係 3.文件的訪問權限 4.文件的時間截.
最後 刪除符號連接,有建立就有刪除
rm -rf symbolic_name 注意不是rm -rf symbolic_name/
1.Linux連接概念
Linux連接分兩種,一種被稱爲硬連接(Hard Link),另外一種被稱爲符號連接(Symbolic Link)。默認狀況下,ln命令產生硬連接。
【硬鏈接】
硬鏈接指經過索引節點來進行鏈接。在Linux的文件系統中,保存在磁盤分區中的文件無論是什麼類型都給它分配一個編號,稱爲索引節點號(Inode Index)。在Linux中,多個文件名指向同一索引節點是存在的。通常這種鏈接就是硬鏈接。硬鏈接的做用是容許一個文件擁有多個有效路徑名,這樣用戶就能夠創建硬鏈接到重要文件,以防止「誤刪」的功能。其緣由如上所述,由於對應該目錄的索引節點有一個以上的鏈接。只刪除一個鏈接並不影響索引節點自己和其它的鏈接,只有當最後一個鏈接被刪除後,文件的數據塊及目錄的鏈接纔會被釋放。也就是說,文件真正刪除的條件是與之相關的全部硬鏈接文件均被刪除。
【軟鏈接】
另一種鏈接稱之爲符號鏈接(Symbolic Link),也叫軟鏈接。軟連接文件有相似於Windows的快捷方式。它其實是一個特殊的文件。在符號鏈接中,文件其實是一個文本文件,其中包含的有另外一文件的位置信息。
2.經過實驗加深理解
[oracle@Linux]$ touch f1 #建立一個測試文件f1
[oracle@Linux]$ ln f1 f2 #建立f1的一個硬鏈接文件f2
[oracle@Linux]$ ln -s f1 f3 #建立f1的一個符號鏈接文件f3
[oracle@Linux]$ ls -li # -i參數顯示文件的inode節點信息
total 0
9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx 1 oracle oinstall 2 Apr 21 08:11 f3 -> f1
從上面的結果中能夠看出,硬鏈接文件f2與原文件f1的inode節點相同,均爲9797648,然而符號鏈接文件的inode節點不一樣。
[oracle@Linux]$ echo "I am f1 file" >>f1
[oracle@Linux]$ cat f1
I am f1 file
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
I am f1 file
[oracle@Linux]$ rm -f f1
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
cat: f3: No such file or directory
經過上面的測試能夠看出:當刪除原始文件f1後,硬鏈接f2不受影響,可是符號鏈接f1文件無效
3.總結
依此您能夠作一些相關的測試,能夠獲得如下所有結論:
1).刪除符號鏈接f3,對f1,f2無影響;
2).刪除硬鏈接f2,對f1,f3也無影響;
3).刪除原文件f1,對硬鏈接f2沒有影響,致使符號鏈接f3失效;
4).同時刪除原文件f1,硬鏈接f2,整個文件會真正的被刪除。
【硬連接(Hard Link)】
硬連接指經過索引節點來進行鏈接,在Linux爲文件系統中,保存在磁盤分區中的文件無論是什麼類型都給它分配一個編號,稱爲索引節點號;
硬連接指的就是在Linux中,多個文件名指向同一索引節點;
常見用途:經過創建硬連接到重要文件,防止誤刪,刪除其實對應的是刪除其中的一個硬連接,當文件對應的硬連接都被刪除了,該文件才真正被刪除;
注意: 默認狀況下,ln命令產生硬連接;
點擊(此處)摺疊或打開
- [root@centos7 home]# vi 1.txt
- hello, this is 1.
- [root@centos7 home]# cp -l 1.txt 2.txt # 爲1.txt創建硬連接2.txt,等同於ln 1.txt 2.txt
- [root@centos7 home]# more 2.txt # 查看2.txt文件中的內容和1.txt文件內容同樣
- hello, this is 1.
- # 這兩個文件的索引節點號,能夠看見索引號同樣:
- [root@centos7 home]# ls -li
- 總用量 69868
- 33845219 -rw-r--r--. 2 root root 44 1月 21 10:12 1.txt
- 33845219 -rw-r--r--. 2 root root 44 1月 21 10:12 2.txt
- [root@centos7 home]# vi 2.txt # 編輯2.txt,在末未添加:
- hello, this is 2.
- [root@centos7 home]# more 1.txt # 查看1.txt中是否內容改動
- hello, this is 1.
- hello, this is 2.
- [root@centos7 home]# rm -f 1.txt # 刪除1.txt
- [root@centos7 home]# more 2.txt # 查看2.txt的內容
- hello, this is 1.
- hello, this is 2.
- 建立硬連接命令:cp -l 1.txt 2.txt等同於ln 1.txt 2.txt # 爲1.txt創建硬連接2.txt
【軟連接】
也成爲符號連接(Symbolic Link),相似於Windows的快捷方式,其中包含的是另外一個文件的位置信息;
點擊(此處)摺疊或打開
- [root@centos7 home]# cp -s 2.txt sLink # 爲2.txt文件創建符號連接sLink,等同於ln –s 2.txt sLink
- [root@centos7 home]# ls –li # 能夠看到兩個文件有不一樣的索引節點號
- 總用量 69864
- 33845219 -rw-r--r--. 1 root root 44 1月 21 10:12 2.txt
- 36830246 lrwxrwxrwx. 1 root root 5 1月 21 10:21 sLink -> 2.txt
- [root@centos7 home]# more sLink
- hello, this is 1.
- hello, this is 2.
- [root@centos7 home]# rm -f sLink # 刪除符號連接,不影響源文件
- [root@centos7 home]# more 2.txt
- hello, this is 1.
- hello, this is 2.
- [root@centos7 home]# rm -f 2.txt # 刪除2.txt
- [root@centos7 home]# ls -li
- 總用量 69860
- 36830246 lrwxrwxrwx. 1 root root 5 1月 21 10:21 sLink -> 2.txt
- [root@centos7 home]# more sLink
- sLink: 沒有那個文件或目錄
建立符號連接命令:cp -s 2.txt sLink 等同於ln –s 2.txt sLink # 爲2.txt文件創建符號連接sLink
注意:
只能在同種存儲媒體上的文件之間建立硬連接(Hard Link),不能在不一樣掛載點下的文件間建立硬連接,對於後一種狀況,可使用軟連接;(區分不一樣掛載點與同一掛載點不一樣目錄)
如跨不一樣的掛載點創建硬連接的報錯信息:
[root @centos7 home] # ln 2.txt /dev/hLink
ln : 沒法建立硬連接 "/dev/hLink" => "2.txt" : 無效的跨設備鏈接
小結:
1: 硬連接是同一文件的不一樣訪問路徑,其對應的索引節點號是同樣的,刪除文件其實就是刪除其中的一個硬連接,若是該文件對應的硬連接都被刪除了該文件才被刪除,經常使用於保護文件; 2: 符號連接相似於Windows中對應的快捷方式,刪除符號連接不影響源文件,刪除源文件,則對應的符號連接也沒有意義;