linux硬链接不能创建目录,为什么硬链接不允许用于目录?
問題描述
我使用的是Ubuntu 12.04,我是一個(gè)非常新的Linux世界。當(dāng)我嘗試為任何目錄創(chuàng)建硬鏈接并失敗時(shí),我感到非常驚訝。我可以為文件系統(tǒng)邊界內(nèi)的文件創(chuàng)建硬鏈接。我知道我們無法為文件系統(tǒng)以外的文件創(chuàng)建硬連接的原因。
我試過這些命令:
$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay:
hard link not allowed for directory
我只想知道背后的原因。對于所有的GNU /Linux發(fā)行版和Unix版本(BSD,Solaris,HP-UX,IBM AIX),還是僅在Ubuntu或Linux中都一樣。
最佳解決方案
“你一般不應(yīng)該使用硬鏈接”是over-broad。您需要了解硬鏈接和符號鏈接之間的區(qū)別,并根據(jù)需要使用它們。每種產(chǎn)品都有其自身的優(yōu)點(diǎn)和缺點(diǎn):
符號鏈接可以:
指向目錄
指向non-existent對象
指向同一文件系統(tǒng)之外的文件和目錄
硬鏈接可以:
保持它們引用的文件被刪除
硬鏈接在執(zhí)行“寫入時(shí)復(fù)制”應(yīng)用程序時(shí)特別有用。它們允許您保留目錄結(jié)構(gòu)的備份副本,同時(shí)僅為兩個(gè)版本之間的文件使用空間。
命令cp -al在這方面特別有用。它制作了目錄結(jié)構(gòu)的完整副本,其中所有文件都通過硬鏈接指向原始文件。然后,您可以繼續(xù)更新結(jié)構(gòu)中的文件,只有您更新的文件才會占用額外的空間。這在維護(hù)多代備份時(shí)特別有用。
次佳解決方案
目錄硬鏈接以多種方式破壞文件系統(tǒng)
它們允許你創(chuàng)建循環(huán)
到目錄的硬鏈接可以鏈接到它自己的父目錄,從而創(chuàng)建文件系統(tǒng)循環(huán)。例如,這些命令可以通過反向鏈接l創(chuàng)建一個(gè)循環(huán):
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
具有目錄循環(huán)的文件系統(tǒng)具有無限深度:
cd /tmp/a/b/l/b/l/b/l/b/l/b
任何沒有-maxdepth謂詞的find命令都將運(yùn)行到無限循環(huán)。這意味著您不能再以一致的方式使用find,這是一項(xiàng)重要的命令。類似于同樣重要的locate命令。
根據(jù)定義,樹沒有循環(huán),因此文件系統(tǒng)不再是樹。
它們打破了父目錄的無歧義性
在文件系統(tǒng)循環(huán)中,存在多個(gè)父目錄:
cd /tmp/a/b
cd /tmp/a/b/l/b
在第一種情況下,/tmp/a是/tmp/a/b的父目錄。在第二種情況下,/tmp/a/b/l是/tmp/a/b/l/b的父目錄,與/tmp/a/b相同。所以它有兩個(gè)父目錄。
他們增加文件
解析符號鏈接后,文件由路徑標(biāo)識。所以
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
是不同的文件。該文件有更多的路徑。當(dāng)然,它們的inode數(shù)量相同。但是如果你沒有明確地期望循環(huán),那么沒有理由去檢查這個(gè)循環(huán)。
一個(gè)硬鏈接目錄也可以指向一個(gè)子目錄,或者一個(gè)不是任何深度的父子目錄。在這種情況下,作為鏈接子項(xiàng)的文件將被復(fù)制到由兩個(gè)路徑標(biāo)識的兩個(gè)文件。
你的榜樣
$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar
那么目錄的軟鏈接如何工作呢?
可能包含軟鏈接和甚至軟鏈接目錄循環(huán)的路徑通常用于識別和打開文件。它可以用作正常的線性路徑。
但是還有其他一些情況,當(dāng)使用路徑來比較文件時(shí)。在這種情況下,可以先解析路徑中的符號鏈接,然后將其轉(zhuǎn)換為最小的,并且通常一致的表示形式,從而創(chuàng)建規(guī)范路徑:
這是可能的,因?yàn)檐涙溄佣伎梢詳U(kuò)展為沒有鏈接的路徑。在完成路徑中的所有軟鏈接之后,剩余路徑是樹的一部分,其中路徑始終是明確的。
命令readlink可以解析其規(guī)范路徑的路徑:
$ readlink -f /some/symlinked/path
軟鏈接與文件系統(tǒng)使用的不同
軟鏈接不會造成所有麻煩,因?yàn)樗c文件系統(tǒng)內(nèi)的鏈接不同。它可以與硬鏈接區(qū)分開來,并根據(jù)需要解析為沒有符號鏈接的路徑。從某種意義上講,添加符號鏈接不會改變基本的文件系統(tǒng)結(jié)構(gòu) – 它保留它,但增加了更多的結(jié)構(gòu),如應(yīng)用程序?qū)印?/p>
來自man readlink:
NAME
readlink - print resolved symbolic links or canonical
file names
SYNOPSIS
readlink [OPTION]... FILE...
DESCRIPTION
Print value of a symbolic link or canonical file name
-f, --canonicalize
canonicalize by following every symlink in
every component of the given name recursively;
all but the last component must exist
[ ... ]
第三種解決方案
僅供參考,您可以使用mount實(shí)現(xiàn)與目錄的硬鏈接相同的功能:
mount -t bind /var/www /home/user/workspace/www
這是非常危險(xiǎn)的,因?yàn)榇蠖鄶?shù)工具和程序都不會意識到綁定。我曾經(jīng)做過類似上面的例子,然后進(jìn)入rm -rf /home/user。幸運(yùn)的是,/var/www沒有任何關(guān)聯(lián)。
第四種方案
不允許hard-linking目錄的原因是一個(gè)小技術(shù)。基本上,they break the file-system structure。無論如何,你通常不應(yīng)該使用硬鏈接。符號鏈接允許大部分相同的功能而不會導(dǎo)致問題(例如ln -s target link)。
參考資料
總結(jié)
以上是生活随笔為你收集整理的linux硬链接不能创建目录,为什么硬链接不允许用于目录?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 通讯录设计(五)
- 下一篇: C++ 通讯录设计(二)