目录硬链接以多种方式破坏文件系统
它们允许您创建循环
对目录的硬链接可以链接到其自身的父目录,从而创建一个文件系统循环。例如,以下命令可以使用反向链接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/Directory /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Directory/foobar.txt /home/nischay/Hard-Directory/foobar.txt
Files /Some/Directory/foobar.txt and /home/nischay/Hard-Directory/foobar.txt are identical
$ echo bar >> /Some/Directory/foobar.txt
$ diff -s /Some/Directory/foobar.txt /home/nischay/Hard-Directory/foobar.txt
Files /Some/Directory/foobar.txt and /home/nischay/Hard-Directory/foobar.txt are identical
$ cat /Some/Directory/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
[ ... ]
ln -F <src> <dst>
命令,或许会起作用。确实,在旧版本的Unix中,超级用户可以使用这个命令。有人还记得是UCB还是System V吗?是的,可能会发生一些不好的事情,但通常不会。据我回忆,rmdir
命令知道在硬链接处停止删除。然而,用户可能会因为混淆而错误地删除东西。 - Steve Pitchersrmdir
如何以特殊方式处理硬链接?硬链接只是普通链接的附加链接。甚至很难找出是否存在不寻常的额外链接,而不需要额外的记录。 - Volker Siegelrmdir
可以判断目录是否有来自其他位置的链接。递归删除rm -r
必须小心编码,以确保即使出现“权限被拒绝”等错误,它也能正确执行。顺便说一下,UCB = BSD,呃! - Steve Pitchersln -F
命令,并且它能够正常工作。但是你不敢在之后删除该目录,因为担心会破坏文件系统。 - Edward Falk