Если круговые символьные ссылки бесполезны, то почему они разрешены?


Я как раз читал этот пост здесь:

Для чего используются циклические символьные ссылки в Unix-подобных системах?

И ответы были довольно интересными. Они, кажется, убедительно говорят, что нет никакой причины, по которой можно было бы создать такую круговую символическую ссылку, и поэтому она должна была быть создана по ошибке. Если это правда, то почему же им это позволено? Не потому ли, что механика их запрещения непомерно сложна или требует больших вычислительных затрат?

I не понимаю, почему это так: не можем ли мы просто сравнить адрес в памяти, чтобы увидеть, совпадает ли он с целевым адресом, а затем, если они совпадают, выдать ошибку?

EDIT: возможно, в некоторых языках будет ошибка, если вы не используете какую-то принудительную опцию. В таких случаях мой вопрос сводится к следующему: почему вы допускаете силовой вариант?

EDIT: после некоторых дальнейших исследований с помощью @Wumpus Q Wembley, кажется, что это действительно запрещено в unix и приводит к следующей ошибке:

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

Но это действительно может произойти, когда файлы, которые символически связаны с самими собой, уже являются символическими ссылками из какого-то другого файла. Я не уверен, почему такое поведение желательно?

- Павел

2   2  

2 ответа:

Я знаю (и использую) один случай, когда круговая символьная ссылка полезна. Это угловой случай, но тем не менее.

Рассматриваемая символьная ссылка находится в каталоге /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
}
Обратите внимание на отсутствие /boot перед /vmlinuz и /initramfs.

Причина этого в том, что раздел /boot является корневым разделомдля GRUB и vmlinuz и initramfs расположены в корне / справочник.

Тогда как, для систем без отдельного раздела /boot корневой раздел system также является корневым разделом для GRUB , аvmlinuz и initramfs расположены в каталоге /boot.

Имея символическую ссылку, я могу использовать один и тот же grub.cfg для систем обоих типов.

Было бы не особенно трудно обнаружить, что символьная ссылка будет указывать на саму себя при ее создании, но это не помешает им быть созданными другими способами. Рассмотрим:

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

Предотвращениетого, что потребует, чтобы перед переименованием каталога ОС сканировала его содержимое (включая подкаталоги), проверяя цель каждой ссылки. Слишком дорого.

Даже проверка при создании может быть дорогостоящей, если целевой путь символьной ссылки содержит много другие символьные ссылки или некоторые медленные сетевые файловые системы.

В принципе, это просто не стоит хлопот. Самореферентные символьные ссылки не полезны,но и не вредны.