如果循环符号链接没用,那么它们为什么被允许?

时间:2016-05-24 01:30:10

标签: symlink

我刚刚在这里阅读这篇文章:

What are circular symlinks in Unix-like systems used for?

答案非常有趣。他们似乎最终确定没有理由创建这样一个循环符号链接,因此它必须是错误创建的。如果这是真的,那么为什么它们被允许呢?是因为禁止它们的机制非常复杂或计算密集吗?

我不明白为什么会出现这种情况:我们不能只比较内存中的地址以查看它是否与目标地址相同,然后如果它们相同,则抛出错误?< / p> 编辑:可能在某些语言中会出现错误,除非您使用某种强制选项。在那些情况下,那么我的问题就变成了:为什么你会允许强制选择?

编辑:在@Wumpus Q Wembley的帮助下进行了一些进一步的研究,似乎在unix中确实不允许这样做,并导致以下错误:

ln: ‘/usr/bin/apt-config’ and ‘/usr/bin/apt-config’ are the same file

但是,当符号链接到自身的文件已经是来自其他文件的符号链接时,这确实会发生。我不确定为什么这种行为是可取的?

-Paul

2 个答案:

答案 0 :(得分:5)

我知道(并使用)循环符号链接有用的一种情况。这是一个极端的案例,但仍然。

有问题的符号链接位于/boot目录中,并且(循环地)指向自身,如下所示:

boot -> ./

它是使用以下命令创建的:

ln -s . boot

有必要的原因如下:

当我设置各种Linux系统时,在某些情况下我使用单独的/boot分区,而在某些情况下 - 我没有。

我有一个cookie-cutter grub.cfg文件,其内容如下:

menuentry "Gentoo GNU/Linux" {
    echo "Loading Linux kernel"
    linux /boot/vmlinuz root=...
    echo "Loading initial ramdisk"
    initrd /boot/initramfs
}

如果我没有符号链接,则上述内容对于具有单独/boot分区的系统不起作用。对于那些我需要的系统:

menuentry "Gentoo GNU/Linux" {
    echo "Loading Linux kernel"
    linux /vmlinuz root=...
    echo "Loading initial ramdisk"
    initrd /initramfs
}

请注意/boot/vmlinuz前面没有/initramfs

原因是/boot分区是 GRUB root 分区,vmlinuzinitramfs是位于 root /目录中。

然而,对于没有单独/boot分区的系统,系统/分区也是 GRUB 的根分区,{ {1}}和vmlinuz位于initramfs目录。

使用符号链接后,我可以对两种类型的系统使用相同的/boot

答案 1 :(得分:2)

在创建时,检测到符号链接会指向自身并不是特别困难,但这不会阻止它们以其他方式创建。考虑:

mkdir foo
cd foo
ln -s ../bar/example example
cd ..
mv foo bar

在重命名目录之前,防止 要求操作系统将扫描其内容(包括子目录),检查每个链接的目标。太贵了。

如果符号链接的目标路径包含许多其他符号链接或一些慢速网络文件系统,即使检查创建也是代价高昂。

基本上,这不值得麻烦。自引用符号链接没用,但它们也不是真正有害。