linux硬链接不能创建目录,为什么硬链接不允许用于目录?
問題描述
我使用的是Ubuntu 12.04,我是一個非常新的Linux世界。當我嘗試為任何目錄創建硬鏈接并失敗時,我感到非常驚訝。我可以為文件系統邊界內的文件創建硬鏈接。我知道我們無法為文件系統以外的文件創建硬連接的原因。
我試過這些命令:
$ 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發行版和Unix版本(BSD,Solaris,HP-UX,IBM AIX),還是僅在Ubuntu或Linux中都一樣。
最佳解決方案
“你一般不應該使用硬鏈接”是over-broad。您需要了解硬鏈接和符號鏈接之間的區別,并根據需要使用它們。每種產品都有其自身的優點和缺點:
符號鏈接可以:
指向目錄
指向non-existent對象
指向同一文件系統之外的文件和目錄
硬鏈接可以:
保持它們引用的文件被刪除
硬鏈接在執行“寫入時復制”應用程序時特別有用。它們允許您保留目錄結構的備份副本,同時僅為兩個版本之間的文件使用空間。
命令cp -al在這方面特別有用。它制作了目錄結構的完整副本,其中所有文件都通過硬鏈接指向原始文件。然后,您可以繼續更新結構中的文件,只有您更新的文件才會占用額外的空間。這在維護多代備份時特別有用。
次佳解決方案
目錄硬鏈接以多種方式破壞文件系統
它們允許你創建循環
到目錄的硬鏈接可以鏈接到它自己的父目錄,從而創建文件系統循環。例如,這些命令可以通過反向鏈接l創建一個循環:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
具有目錄循環的文件系統具有無限深度:
cd /tmp/a/b/l/b/l/b/l/b/l/b
任何沒有-maxdepth謂詞的find命令都將運行到無限循環。這意味著您不能再以一致的方式使用find,這是一項重要的命令。類似于同樣重要的locate命令。
根據定義,樹沒有循環,因此文件系統不再是樹。
它們打破了父目錄的無歧義性
在文件系統循環中,存在多個父目錄:
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相同。所以它有兩個父目錄。
他們增加文件
解析符號鏈接后,文件由路徑標識。所以
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
是不同的文件。該文件有更多的路徑。當然,它們的inode數量相同。但是如果你沒有明確地期望循環,那么沒有理由去檢查這個循環。
一個硬鏈接目錄也可以指向一個子目錄,或者一個不是任何深度的父子目錄。在這種情況下,作為鏈接子項的文件將被復制到由兩個路徑標識的兩個文件。
你的榜樣
$ 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
那么目錄的軟鏈接如何工作呢?
可能包含軟鏈接和甚至軟鏈接目錄循環的路徑通常用于識別和打開文件。它可以用作正常的線性路徑。
但是還有其他一些情況,當使用路徑來比較文件時。在這種情況下,可以先解析路徑中的符號鏈接,然后將其轉換為最小的,并且通常一致的表示形式,從而創建規范路徑:
這是可能的,因為軟鏈接都可以擴展為沒有鏈接的路徑。在完成路徑中的所有軟鏈接之后,剩余路徑是樹的一部分,其中路徑始終是明確的。
命令readlink可以解析其規范路徑的路徑:
$ readlink -f /some/symlinked/path
軟鏈接與文件系統使用的不同
軟鏈接不會造成所有麻煩,因為它與文件系統內的鏈接不同。它可以與硬鏈接區分開來,并根據需要解析為沒有符號鏈接的路徑。從某種意義上講,添加符號鏈接不會改變基本的文件系統結構 – 它保留它,但增加了更多的結構,如應用程序層。
來自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實現與目錄的硬鏈接相同的功能:
mount -t bind /var/www /home/user/workspace/www
這是非常危險的,因為大多數工具和程序都不會意識到綁定。我曾經做過類似上面的例子,然后進入rm -rf /home/user。幸運的是,/var/www沒有任何關聯。
第四種方案
不允許hard-linking目錄的原因是一個小技術。基本上,they break the file-system structure。無論如何,你通常不應該使用硬鏈接。符號鏈接允許大部分相同的功能而不會導致問題(例如ln -s target link)。
參考資料
總結
以上是生活随笔為你收集整理的linux硬链接不能创建目录,为什么硬链接不允许用于目录?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 通讯录设计(五)
- 下一篇: linux 其他常用命令