linux硬鏈接和軟鏈接的區(qū)別
簡而言之,軟鏈接相當(dāng)于windows中的快捷方式,硬鏈接相當(dāng)于一個(gè)災(zāi)備系統(tǒng),數(shù)據(jù)存放在兩處,與復(fù)制不同
的是兩處之間存在同步機(jī)制,一處數(shù)據(jù)的改變會實(shí)時(shí)同步到另一處,另外,一處數(shù)據(jù)如果被刪除了,不會影響
到另一處的數(shù)據(jù).下面是詳細(xì)的介紹:
硬連接指向的是節(jié)點(diǎn)(inode),是已存在文件的另一個(gè)名字,修改其中一個(gè),與其連接的文件同時(shí)被修
改;對硬鏈接文件進(jìn)行讀寫和刪除操作時(shí)候,效果和軟鏈接相同。但如果我們刪除硬鏈接文件的源文件,
硬鏈接文件仍然存在,而且保留了原有的內(nèi)容。這時(shí),系統(tǒng)就“忘記”了它曾經(jīng)是硬鏈接文件,而把他當(dāng)
成一個(gè)普通文件。
硬鏈接文件有兩個(gè)限制:
1、不允許給目錄創(chuàng)建硬鏈接;
2、只有在同一文件系統(tǒng)中的文件之間才能創(chuàng)建鏈接。
軟連接指向的是路徑(path),軟鏈接又叫符號鏈接,這個(gè)文件包含了另一個(gè)文件的路徑名??梢允?/p>
任意文件或目錄,還可以鏈接不同文件系統(tǒng)的文件,和win下的快捷方式差不多。 軟鏈接文件甚至可以鏈
接不存在的文件,這就產(chǎn)生一般稱之為"斷鏈"的問題(或曰“現(xiàn)象"),鏈接文件甚至可以循環(huán)鏈接自己,類
似于編程語言中的遞歸。
命令格式:
ln -s source_path target_path //軟鏈接文件
ln -d existfile newfile //硬鏈接文件,如果不加任何參數(shù),默認(rèn)情況下就是硬鏈接.
示例:
$ ln httpd.conf httpd1.conf
$ ln -s httpd.conf
httpd2.conf
第一條為硬鏈接,第二條為軟鏈接
$ ls -li //查看一個(gè)文件或目錄的inode,要通過ls 命令的的
-i參數(shù),inode值相同的文件,他們的關(guān)
系是互為硬鏈接的關(guān)系
總用量 80
1077669 -rw-r--r-- 2 sam adm
34890 10月 31 00:57 httpd1.conf
1077668 lrwxrwxrwx 1 sam
adm 10 10月 31 00:58 httpd2.conf ->;
httpd.conf
1077669 -rw-r--r-- 2 sam adm 34890 10月 31
00:57 httpd.conf
可以看到,使用ls -li,軟連接只產(chǎn)生了10字節(jié)的快捷而已,硬連接卻實(shí)實(shí)在在的的拷貝。最前面的
inode硬鏈接和源文件是一樣的,而軟鏈接不一樣.對http1.conf進(jìn)行編輯,可以發(fā)現(xiàn)httpd.conf也發(fā)生了
一樣的變化.
現(xiàn)在使用命令:
$ rm httpd.conf
現(xiàn)在刪除鏈接的源文件,來比較不同之處
代碼:
$ ls -l
總用量 44
-rw-r--r-- 1 sam adm 34890
10月 31 00:57 httpd1.conf
lrwxrwxrwx 1 sam adm 10 10月
31 00:58 httpd2.conf ->; httpd.conf
發(fā)現(xiàn),httpd2.conf實(shí)際已經(jīng)不存在了,是斷鏈,而httpd1.conf變也了普通文件.
一、硬鏈接
硬鏈接說白了是一個(gè)指針,指向文件索引節(jié)點(diǎn),系統(tǒng)并不為它重新分配inode。可以用:ln命令來建立硬鏈
接。語法:
ln [options] existingfile newfile
ln[options] existingfile-list
directory
用法: 第一種:為”existingfile”創(chuàng)建硬鏈接,文件名為”newfile”。第二種:在”directory”目錄中,
為 ”existingfile-list”中包含的所有文件創(chuàng)建一個(gè)同名的硬鏈接。常用可選[options] –f 無論”
newfile”存在與否,都創(chuàng)建鏈接。-n 如果”newfile”已存在,就不創(chuàng)建鏈接。
下面舉一些例子:
$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38
file1
13059 -rwx - - - - - - 1 longcheng longcheng 57 8月 5 16:40 file2
$
ln file2 file2hard
$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng
48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5
16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40
file2hard
注意在創(chuàng)建鏈接前,file1 顯示的鏈接數(shù)目為1,創(chuàng)建鏈接后(1)file1和file1hard的鏈接數(shù)目都變?yōu)?;(2)
file1和file1hard在inode號是一樣的(3) file1和file1hard顯示的文件大小也是一樣??梢娺M(jìn)行了ln命
令的操作結(jié)果:file1和file1hard是同一個(gè)文件的兩個(gè)名字,它們具有同樣的索引節(jié)點(diǎn)號和文件屬性,建
立文件file1的硬鏈接,就是為file1的文件索引節(jié)點(diǎn)在當(dāng)前目錄上建立一個(gè)新指針。如下圖,你可以刪除
其中任何一個(gè),如rm file2 ,每次只會刪除一個(gè)指針,
鏈接數(shù)同時(shí)減一,只有將所有指向文件內(nèi)容的指針,也即鏈接數(shù)減為0時(shí),內(nèi)核才會把文件內(nèi)容從磁盤上刪
除。
還可以在不同目錄,但同一文件系統(tǒng)中建立文件的硬鏈接。設(shè)file1、file2在目錄/home/longcheng/dir1
中,下面的命令,在/home/longcheng中建立file2的硬鏈接。
ln file2 /home/longcheng/file2hard
下面的程序,是將dir1目錄中所有文件,在目錄dir2中建立硬鏈接
$mkdir dir2
$ln /home/longcheng/dir1/* /home/longcheng/dir2
如果使用了 ln –f existingfile newfile,如果newfile已經(jīng)存在,則無論原來newfile是什么文件,只
用當(dāng)前用戶對它有寫權(quán)限,newfile就成為exisitngfile的硬鏈接文件。
盡管硬鏈接節(jié)省空間,也是Linux系統(tǒng)整合文件系統(tǒng)的傳統(tǒng)方式,但是存在一下不足之處:(1)不可以在
不同文件系統(tǒng)的文件間建立鏈接(2)只有超級用戶才可以為目錄創(chuàng)建硬鏈接。雖然很多樹上說root用戶
可以創(chuàng)建,但是筆者在學(xué)習(xí)過程中發(fā)現(xiàn)即使是root用戶也不能創(chuàng)建,我的系統(tǒng)是Redhat,內(nèi)核 2.4、2.6
都試過,在其他系統(tǒng)中不知道是不是可以。
二、軟鏈接(符號鏈接)
軟鏈接克服了硬鏈接的不足,沒有任何文件系統(tǒng)的限制,任何用戶可以創(chuàng)建指向目錄的符號鏈接。因而現(xiàn)
在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機(jī)器、不同網(wǎng)絡(luò)對文件進(jìn)行鏈接。
建立軟鏈接,只要在ln后面加上選項(xiàng) –s,下面舉個(gè)例子
$ ls -il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38
file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40
file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40
file2hard
$ln –s file1 file1soft
$ls -il
13058 -rwx - - - - - - 1
longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng
longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57
8月 5 16:40 file2hard
13061 lrwxrwxrwx 1 longcheng longcheng 5 8月 5 16:58
file1soft->file1
從上面鏈接后的結(jié)果可以看出來軟鏈接與硬鏈接,區(qū)別不僅僅是在概念上,在實(shí)現(xiàn)上也是不同的。
區(qū)別:硬鏈接原文件&鏈接文件公用一個(gè)inode號,說明他們是同一個(gè)文件,而軟鏈接原文件&鏈接文件
擁有不同的inode號,表明他們是兩個(gè)不同的文件;在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈
接沒有寫出來,因?yàn)樵诒举|(zhì)上硬鏈接文件和原文件是完全平等關(guān)系;鏈接數(shù)目是不一樣的,軟鏈接的鏈接
數(shù)目不會增加;文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文件是一樣的,這用強(qiáng)調(diào),因?yàn)槭堑?/p>
同的嘛,而這里軟鏈接顯示的大小與原文件就不同了,file1大小是48B,而file1soft是5B,這里面的5實(shí)
際上就是“file1”的大小。
總之,建立軟鏈接就是建立了一個(gè)新文件。當(dāng)訪問鏈接文件時(shí),系統(tǒng)就會發(fā)現(xiàn)他是個(gè)鏈接文件,它讀取鏈
接文件找到真正要訪問的文件。
在不同系統(tǒng)之間建立軟鏈接、對目錄建立鏈接,這里就不舉例了,讀者可以自己去嘗試,我也是在不斷實(shí)
踐中學(xué)習(xí)的。
當(dāng)然軟鏈接也有硬鏈接沒有的缺點(diǎn),因?yàn)殒溄游募性募穆窂叫畔?,所以?dāng)原文件從一個(gè)目錄下
移到其他目錄中,再訪問鏈接文件,系統(tǒng)就找不到了,而硬鏈接就沒有這個(gè)缺陷,你想怎么移就怎么移;
還有它要系統(tǒng)分配額外的空間用于建立新的索引節(jié)點(diǎn)和保存原文件的路徑。