我正在使用Ubuntu 12.04。当我尝试为任何目录创建硬链接时,它都会失败。我可以在文件系统边界内为文件创建硬链接。我知道为什么我们无法为文件系统以外的文件创建硬链接的原因。
我尝试了以下命令:

$ 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中是否相同?

评论

unix.stackexchange.com/questions/22394/…

尝试ln -F ,它可能会起作用。当然,它曾经在旧版本的Unix中为超级用户工作。有谁记得这是UCB还是System V?是的,可能发生坏事,但通常不会发生。我记得,rmdir知道不要继续删除过去的硬链接。但是,用户可能会感到困惑并删除错误的内容。

@StevePitchers rmdir如何以特殊方式处理硬链接?硬链接只是普通链接-只是一个附加链接。要查找是否存在不带额外录音的不寻常的额外链接甚至不容易。

每个节点存储指向它的硬链接数:仅在没有剩余链接时才释放内容。因此,rmdir可以判断目录是否具有其他位置的链接。递归删除rm -r必须谨慎编码,以确保即使出现诸如“权限被拒绝”之类的错误,它也能正确执行。 BTW,UCB = BSD,doh!

我在目录上完成了ln -F并使其正常工作。但是由于害怕损坏文件系统,您以后不敢删除目录。

#1 楼

目录硬链接以多种方式破坏文件系统

它们允许您创建循环

目录的硬链接可以链接到其自身的父级,从而创建文件系统循环。例如,这些命令可以创建带有反向链接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


遍历这样的目录结构时避免无限循环有些困难(尽管例如POSIX需要find来避免这种情况)。

具有这种困难的文件系统链接不再是一棵树,因为根据定义,一棵树一定不能包含循环。

它们打破了父目录的明确性

通过文件系统循环,多个父目录目录存在:

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
        [  ...  ]


评论


为什么软链接不能全部完成?

–塔尼
2015年5月26日下午5:57

@Tanay对,将其与带有软链接的类似案例进行比较将有助于解释。我会尽力。

– Volker Siegel
15年5月26日在17:23

究竟这仅与目录有关吗?以我的理解,这些问题也是硬链接文件的问题。此外,我认为硬链接是更改给定目录权限以允许其他人进入内部的一种简便方法,而不必也允许他们进入父链。如果您没有添加/修改组的功能,这听起来很有用...

–inetknght
17年4月18日在23:02

很好的答案,但是……苹果如何为Time Machine解决这些问题?

– Damien
18年6月4日在17:25

听起来很有趣!但是我对这个问题一无所知-您能给我一个提示吗?

– Volker Siegel
18年6月6日,0:21

#2 楼

“无论如何,您通常不应该使用硬链接”过于笼统。您需要了解硬链接和符号链接之间的区别,并适当使用它们。每个都有其优点和缺点:

符号链接可以:


指向目录
指向不存在的对象
指向同一文件系统之外的文件和目录

硬链接可以:


保持引用的文件不被删除

硬链接在执行“写时复制”应用程序中特别有用。它们使您可以保留目录结构的备份副本,而仅使用空间来存储在两个版本之间更改的文件。

命令cp -al在这方面特别有用。它制作了目录结构的完整副本,其中所有文件都由指向原始文件的硬链接表示。然后,您可以继续更新结构中的文件,只有更新的文件会占用额外的空间。在维护多代备份时,此功能特别有用。

评论


关于最后一段,如果您编辑“复制的”硬链接文件,则原始文件也会更改-请参见unix.stackexchange.com/questions/70531/…

– marcin
2014年6月20日10:55



这种对硬链接的描述颇具误导性。硬链接“保留其所引用的文件不会被删除”是绝对正确的,但这只是硬链接的副作用。您可以在一个目录中创建硬链接,更改“原始”文件,然后期望这些硬链接以某种方式指向旧内容,这当然不是正确的。实际上,硬链接的指导性事实是它根本不是链接,至少与原始“文件”无关,后者仅仅是指向文件的名称。硬链接只是指向同一文件的另一个名称。

–哑光
2015年7月9日在2:32

备份的想法很好,实际上我经常使用它,但是我认为应该警告用户更改文件也会更改备份。

–马克
15年8月18日在9:10

哎呀,符号链接根本不需要指向任何东西。 ln -s“不要使用此目录”自述文件是合法的。实际上,如果您考虑一下,目录可以用作关系数据库,而根本不包含任何实际文件。

–爱德华·福克
16 Mar 10 '16 at 19:39

-1这不能回答问题,某些信息是完全错误的。

– wjandrea
18年2月12日在18:49

#3 楼

仅供参考,您可以使用mount来实现与目录的硬链接相同的功能:

mount -t bind /var/www /home/user/workspace/www


这非常危险,因为大多数工具和程序都不会意识到绑定。我曾经在上面的示例中做了类似的操作,然后继续进行rm -rf /home/user。幸运的是,在/var/www中没有任何相关内容。

评论


我已经使用了--bind 。小心使用,不要擦拭src;)

– kachar
14年2月17日在8:46

我得到:mount:未知文件系统类型'bind'

–维泽克
16 Feb 25 '16:04

在Busybox上,它挂载-o bind src dest

– Mat M
16-10-1在16:01

@MatM与Debian相同

– hanshenrik
17年12月23日在3:21

如果只需要挂载以进行读取,则可以在挂载点上设置权限,避免rm -rf问题。 superuser.com/questions/320415/…

– zanerock
19年1月26日在17:33

#4 楼

不允许硬链接目录的原因有些技术问题。本质上,它们破坏了文件系统的结构。您通常不应该使用硬链接。符号链接允许大多数相同的功能而不会引起问题(例如ln -s target link)。

评论


硬链接有很好的用例。说您通常不应该使用它们有点宽泛。

–桑德·斯特凡(Sander Steffann)
13年11月28日在8:34

+2用于提供实际上可以回答OP的问题(和我的问题)的链接,+ -1用于提供意见(“您通常无论如何都不应使用硬链接”-如果有链接来支持它,那是可以的)。很好,因为我还是不能给+2。 ; D

–msb
2014年1月14日,下午1:34

链接“它们破坏了文件系统结构”不起作用。

–查理·帕克(Charlie Parker)
2014年6月15日下午4:01

尝试总结答案中链接的内容,并保留该链接作为参考。谢谢您,这是Stack Exchange避免链接腐烂的良好做法。

– Oxwivi
2014-09-17 11:32

做得好@CharlieParker;有史以来最好的无意(?)具有讽刺意味的评论:)

–伊莱兰·马尔卡(Eliran Malka)
17-12-12在14:45