如果循环符号链接没有用,那么为什么允许它们呢?
If circular symlinks are useless, then why are they allowed?
我刚在这里 post 阅读这篇文章:
What are circular symlinks in Unix-like systems used for?
答案很有趣。他们似乎断定地说,没有理由创建这样一个循环符号链接,因此它一定是错误创建的。如果这是真的,那么到底为什么允许他们这样做呢?是因为禁止它们的机制过于复杂或计算量大吗?
我不明白为什么会这样:我们不能只比较内存中的地址,看它是否与目标地址相同,如果相同,则抛出错误?
编辑:除非您使用某种强制选项,否则在某些语言中可能会出现错误。在这些情况下,那么我的问题就变成了:为什么要允许强制选项?
编辑:在@Wumpus Q Wembley 的帮助下进一步研究后,看来这在 unix 中确实是不允许的,并导致以下错误:
ln: ‘/usr/bin/apt-config’ and ‘/usr/bin/apt-config’ are the same file
但是当被符号链接到自身的文件已经是来自其他文件的符号链接时,这确实会发生。我不确定为什么这种行为是可取的?
-保罗
检测到符号link在创建时会指向自身并不是特别困难,但这不会阻止它们以其他方式创建。考虑:
mkdir foo
cd foo
ln -s ../bar/example example
cd ..
mv foo bar
防止 that 需要在重命名目录之前,OS 将扫描其内容(包括子目录)检查每个 link 的目标.太贵了。
如果 symlink 的目标路径包含许多其他 symlink 或一些慢速网络文件系统,即使在创建时进行检查也可能代价高昂。
基本上,这不值得麻烦。自引用 symlinks 没有用,但它们也不是真的有害。
我知道(并使用过)一个循环符号链接很有用的案例。这是一个极端案例,但尽管如此。
有问题的符号链接位于 /boot
目录中,并且(循环地)指向自身,如:
boot -> ./
它是使用以下命令创建的:
ln -s . boot
需要它的原因如下:
当我设置各种 Linux 系统时,在某些情况下我使用单独的 /boot
分区,而在某些情况下我不使用。
我有一个千篇一律的 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
}
注意 /vmlinuz
和 /initramfs
前面没有 /boot
。
原因是 /boot
分区是 root 分区 GRUB 和 vmlinuz
和 initramfs
位于 root /
目录中。
然而,对于没有单独 /boot
分区的系统,系统 根 /
分区也是 GRUB 的根分区、vmlinuz
和 initramfs
位于 /boot
目录中。
有了符号链接,我可以对两种类型的系统使用相同的 grub.cfg
。
我刚在这里 post 阅读这篇文章:
What are circular symlinks in Unix-like systems used for?
答案很有趣。他们似乎断定地说,没有理由创建这样一个循环符号链接,因此它一定是错误创建的。如果这是真的,那么到底为什么允许他们这样做呢?是因为禁止它们的机制过于复杂或计算量大吗?
我不明白为什么会这样:我们不能只比较内存中的地址,看它是否与目标地址相同,如果相同,则抛出错误?
编辑:除非您使用某种强制选项,否则在某些语言中可能会出现错误。在这些情况下,那么我的问题就变成了:为什么要允许强制选项?
编辑:在@Wumpus Q Wembley 的帮助下进一步研究后,看来这在 unix 中确实是不允许的,并导致以下错误:
ln: ‘/usr/bin/apt-config’ and ‘/usr/bin/apt-config’ are the same file
但是当被符号链接到自身的文件已经是来自其他文件的符号链接时,这确实会发生。我不确定为什么这种行为是可取的?
-保罗
检测到符号link在创建时会指向自身并不是特别困难,但这不会阻止它们以其他方式创建。考虑:
mkdir foo
cd foo
ln -s ../bar/example example
cd ..
mv foo bar
防止 that 需要在重命名目录之前,OS 将扫描其内容(包括子目录)检查每个 link 的目标.太贵了。
如果 symlink 的目标路径包含许多其他 symlink 或一些慢速网络文件系统,即使在创建时进行检查也可能代价高昂。
基本上,这不值得麻烦。自引用 symlinks 没有用,但它们也不是真的有害。
我知道(并使用过)一个循环符号链接很有用的案例。这是一个极端案例,但尽管如此。
有问题的符号链接位于 /boot
目录中,并且(循环地)指向自身,如:
boot -> ./
它是使用以下命令创建的:
ln -s . boot
需要它的原因如下:
当我设置各种 Linux 系统时,在某些情况下我使用单独的 /boot
分区,而在某些情况下我不使用。
我有一个千篇一律的 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
}
注意 /vmlinuz
和 /initramfs
前面没有 /boot
。
原因是 /boot
分区是 root 分区 GRUB 和 vmlinuz
和 initramfs
位于 root /
目录中。
然而,对于没有单独 /boot
分区的系统,系统 根 /
分区也是 GRUB 的根分区、vmlinuz
和 initramfs
位于 /boot
目录中。
有了符号链接,我可以对两种类型的系统使用相同的 grub.cfg
。