Nejprve poznámka:ln
příkaz nemá možnosti jako -d
, -F
, --directory
, toto je nepřenosný GNUismus.
Funkce, kterou hledáte, je implementována pomocí link(1)
příkaz.
Zpět k vaší původní otázce:
V typickém systému UNIX se rozhodnutí, zda jsou možné pevné odkazy na adresáře, provádí v ovladači souborového systému.
Ovladač Solaris UFS podporuje pevné odkazy na adresáře, ovladač ZFS nikoli.
Důvod, proč UFS na Solarisu podporuje pevné odkazy, je ten, že AT&T se o tuto funkci zajímalo - UFS od BSD nepodporuje pevné propojené adresáře.
Důvod, proč ZFS nepodporuje hardlinkové adresáře, je ten, že Jeffu Bonwickovi se tato funkce nelíbí.
Pokud jde o Linux, tipoval bych, že Linux blokuje pokusy o vytvoření pevných odkazů na adresáře v horních vrstvách jádra. Důvodem tohoto předpokladu je, že Linus Torvalds napsal kód pro GIT, který skartoval adresáře, když git clone
byl volán jako root na platformě, která podporuje pevně propojené adresáře.
Všimněte si, že souborový systém, který podporuje vytváření pevně propojených adresářů, musí také podporovat unlink(1)
odstranit neprázdné adresáře jako root.
Pokud tedy předpokládáme, že Torvalds ví, jak Linux funguje, a pokud Linux podporoval pevně propojené adresáře, měl Torvalds vědět, že volání unlink(2)
v adresáři, když je root, nevrátí se s chybou, ale tento adresář skartuje. Jinými slovy, je nepravděpodobné, že Linux povoluje ovladači souborového systému implementovat pevně propojené adresáře.
Otázka OP zmiňuje mount --bind
. Rychlá kontrola ukazuje, že nemění počet odkazů pro adresář, který je připojen. Pevné propojení vždy upravuje počet odkazů, který můžete zobrazit pomocí ls -ld
.
Normálně (většina unixových systémů) bude počet pevných odkazů na adresář odpovídat počtu adresářů připojených k tomuto názvu, např.
".."
(nadřazený adresář)"."
(samotný adresář)- podadresáře
Pokud si přečtete (obvykle) více informativní informace můžete objevit stejně jako ostatní:
Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries. (These
restrictions are not mandated by POSIX, however.)
Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".
i když je aktuálně formulován
Většina systémů zakazuje vytvoření pevného odkazu na adresář; na těch, kde je to povoleno, to může udělat pouze superuživatel (a opatrně, protože vytvoření cyklu způsobí problémy mnoha dalším utilitám). Pevné odkazy nemohou překročit hranice systému souborů. (Tato omezení však POSIX nenařizuje.)
Vytváření (a odstraňování) pevných odkazů na adresář je omezená funkce, která chrání před ztrátou souborů, pokud je adresář odpojen. Protože operace propojení/odpojení v rozhraní operačního systému C jsou symetrické , propojení s adresáři se normálně provádí pouze pomocí volání mkdir/rmdir.
Mějte na paměti, že velká část GNU coreutils byla napsána (a zdokumentována) před 20-30 lety, kdy se ještě používaly některé skutečné muzejní kousky. Jak je uvedeno v části Ohledně pevného odkazu, původně existovaly žádná volání mkdir/rmdir; adresáře byly vytvořeny (jako privilegovaná operace) pomocí pevných odkazů. To vše zmizelo, když byla přidána systémová volání k vyřešení zmíněných problémů. Ale dokumentace nadále odkazuje na tyto systémy mimo paměť jejich správců. Možnost, která byla zpochybněna, byla v předchůdci fileutils
(který byl kombinován s textutils
a shellutils
v polovině 90. let za vzniku coreutils
). Několik položek z changelogu může pomoci objasnit původ funkce:
Mon Jul 23 16:57:44 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
* cp.c (copy): Make +update operate silently, like +one-file-system.
* ln.c: Add -F as synonym for -d, for SunOS compatibility.
Wed Feb 21 11:13:26 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
* ln.c (error): New function.
(main, do_link): Call error instead of fprintf and exit.
(main): Recognize new -d +directory option to allow superuser to
make hard links to dirs, like the BSD ln -f option.
(do_link): Don't allow hard links to dirs (they are hard to
get rid of -- rmdir and unlink don't do it), unless -d was given.
(usage): Mention -d +directory option.
Můžete tedy například vidět, že jednou ze starožitností, pro kterou byla tato funkce použitelná, byl SunOS. Odpovídající manuálová stránka říkala toto:
OPTIONS
-f Force a hard link to a directory -- this option is only avail-
able to the super-user.
-s Create a symbolic link or links.
SYSTEM V OPTIONS
-f Force files to be linked without displaying permissions, asking
questions or reporting errors.
-F Force a hard link to a directory -- this option is only avail-
able to the super-user.
-s Create a symbolic link or links.
Jak je uvedeno v dokumentaci, tato funkce (a odpovídající možnost není v POSIX (viz Odůvodnění část, která vysvětluje proč). Spíše byla tato funkce přesunuta do nového příkazu (poskytovaného také GNU coreutils) nazvaného link
. Popis samotného příkazu je vágní; musíte si přečíst popis volání funkce, abyste získali nějaké použití ze standardu. Standard však neobjasňuje podmínky, za kterých by příkaz fungoval, kromě předávání prohlášení o požadovaných oprávněních. Chcete-li to provést, musíte přejít na funkce závislé na systému mimo standard:
Propojení s adresářem je ve většině historických implementací omezeno na superuživatele, protože tato schopnost může vytvářet smyčky v hierarchii souborů nebo jinak poškodit systém souborů. Tento svazek POSIX.1-2008 pokračuje v této filozofii tím, že zakazuje
link()
aunlink()
z toho dělat. Jiné funkce by to dokázaly, pokud by implementátor takové rozšíření navrhl.
jsou systémy, které používají pevné odkazy na adresáře nad normální počet (2 plus podadresáře).
OSX používá více pevných odkazů na adresáře pro běžné soubory . Nepodporuje to pomocí ln
(viz manuálová stránka). Podle How Time Machine Works its Magic to dělá proto, aby poskytoval verze používané pro zálohovací zařízení Time Machine.
Další čtení:
- Proč OS X Time Machine vytváří pevné odkazy na adresář?
- Co je unixový příkaz k vytvoření pevného odkazu na adresář v OS X?