Vraag Waarom zijn harde links niet toegestaan ​​voor mappen?


Ik gebruik Ubuntu 12.04. Wanneer ik een harde koppeling voor elke map probeer te maken, mislukt deze. Ik kan harde koppelingen maken voor bestanden binnen de grenzen van het bestandssysteem. Ik weet de reden waarom we geen hardlinks kunnen maken voor bestanden buiten het bestandssysteem.

Ik heb deze opdrachten geprobeerd:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Ik wil alleen de reden achter dit weten. Is dit hetzelfde voor alle GNU / Linux distro's en Unix-smaken (BSD, Solaris, HP-UX, IBM AIX) of alleen in Ubuntu of Linux?


97
2017-11-01 21:18


oorsprong


unix.stackexchange.com/questions/22394/... - Nanne
Proberen ln -F <src> <dst> en het macht werk. Het werkte zeker voor de superuser in oudere versies van Unix. Weet iemand nog of dit UCB of System V was? Ja, er kunnen slechte dingen gebeuren, maar meestal niet. Zoals ik me herinner, rmdir wist niet verder te gaan met het verwijderen van een harde link. Gebruikers kunnen echter in de war raken en dingen ten onrechte verwijderen. - Steve Pitchers
@StevePitchers Hoe kan rmdir moeilijke verbindingen op een speciale manier behandelen? Een harde link is slechts een normale link - maar een extra link. Het is niet eens gemakkelijk om uit te zoeken of er een ongewone extra koppeling bestaat zonder extra opnames. - Volker Siegel
Elke knoop slaat het aantal harde koppelingen op die erop wijzen: de inhoud wordt pas vrijgegeven als er geen resterende koppelingen zijn. Zo rmdir kan zien of de directory links bevat van andere plaatsen. Recursieve verwijdering, rm -r, moet zorgvuldig worden gecodeerd, om er zeker van te zijn dat het correct werkt, zelfs als er fouten zijn zoals "toestemming geweigerd". BTW, UCB = BSD, doh! - Steve Pitchers
ik heb gedaan ln -F op mappen en laat het werken. Maar je durft de map achteraf niet te verwijderen uit angst voor beschadiging van het bestandssysteem. - Edward Falk


antwoorden:


Directory-hardlinks breken het bestandssysteem op verschillende manieren

Hiermee kunt u loops maken

Een harde koppeling naar een map kan een koppeling naar een bovenliggend element van zichzelf bevatten, waardoor een lus voor het bestandssysteem ontstaat. Deze opdrachten kunnen bijvoorbeeld een lus maken met de backlink l:

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Een bestandssysteem met een directorylus heeft een oneindige diepte:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Ieder find commando zonder de -maxdepth predikaat zal in een oneindige lus terechtkomen. Dat betekent dat je niet langer kunt gebruiken find, wat een belangrijk commando is, op een consistente manier. Vergelijkbaar voor even belangrijk locate opdracht.

Een boom heeft per definitie geen lussen, dus het bestandssysteem is niet langer een boom.

Ze breken de eenduidigheid van bovenliggende mappen

Met een loop van het bestandssysteem bestaan ​​er meerdere bovenliggende mappen:

cd /tmp/a/b
cd /tmp/a/b/l/b

In het eerste geval, /tmp/a is de hoofddirectory van /tmp/a/b.
In het tweede geval /tmp/a/b/l is de hoofddirectory van /tmp/a/b/l/b, wat hetzelfde is als /tmp/a/b.
Dus het heeft twee bovenliggende mappen.

Ze vermenigvuldigen bestanden

Bestanden worden geïdentificeerd door paden, na het oplossen van symlinks. Zo

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

zijn verschillende bestanden.
Er zijn oneindig veel verdere paden van het bestand. Ze zijn natuurlijk hetzelfde in termen van hun inode-nummer. Maar als je niet expliciet loops verwacht, is er geen reden om dat te controleren.

Een directory-hardlink kan ook verwijzen naar een onderliggende directory of een directory die geen onderliggende of bovenliggende map is. In dit geval wordt een bestand dat een onderliggende koppeling is, gerepliceerd naar twee bestanden, geïdentificeerd aan de hand van twee paden.

Jouw voorbeeld

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

Hoe kunnen zachte links naar directory's dan werken?

Een pad dat softlinks en zelfs soft-gelinkte directory-lussen kan bevatten, wordt vaak alleen gebruikt om een ​​bestand te identificeren en te openen. Het kan worden gebruikt als een normaal, lineair pad.

Maar er zijn andere situaties waarin paden worden gebruikt om bestanden te vergelijken. In dit geval kunnen symbolische koppelingen in het pad eerst worden omgezet en worden omgezet naar een minimaalen gezamenlijk overeengekomen representatie creëren van een canoniek pad:

Dit is mogelijk omdat de zachte koppelingen allemaal kunnen worden uitgebreid naar paden zonder de koppeling. Nadat dit met alle zachte koppelingen in een pad is gedaan, maakt het resterende pad deel uit van een boom, waar een pad altijd eenduidig ​​is.

Het bevel readlink kan een pad naar zijn canonieke pad oplossen:

$ readlink -f /some/symlinked/path

Soft links zijn anders dan wat het bestandssysteem gebruikt

Een softlink kan niet alle problemen veroorzaken, omdat deze verschilt van de links in het bestandssysteem. Het kan worden onderscheiden van harde koppelingen en worden omgezet naar een pad zonder symlinks, indien nodig.
In zekere zin verandert het toevoegen van symlinks niets aan de basisstructuur van het bestandssysteem - het behoudt het, maar voegt meer structuur toe als een applicatielaag.


Van 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
        [  ...  ]

124
2017-09-17 11:06



+1 Beste antwoord IMO. Het geaccepteerde antwoord spreekt over de voor- en nadelen van symlinks versus hardlinks, maar beantwoordt niet de oorspronkelijke vraag. Ik was verbaasd dat niemand de redenering achter het feit dat je geen hardlinks naar mappen kunt maken, noemde, totdat ik eindelijk bij deze post kwam;) - Malte Skoruppa
Waarom kan een zachte link dit niet allemaal doen? - Tanay
@Tanay Precies, het zou de expanatie kunnen helpen om het te vergelijken met soortgelijke gevallen met zachte links. Ik zal het proberen. - Volker Siegel
Precies hoe komt dit alleen voor directories? Zoals ik het begrijp, zijn deze problemen ook een probleem voor hardlink-bestanden. Bovendien zie ik hardlinking als een gemakkelijke manier om de toestemming van een bepaalde map in te stellen om anderen binnen te laten, zonder ze ook binnen de ouderketen toe te staan. Sounds heel handig als je niet de mogelijkheid hebt om groepen toe te voegen / aan te passen ... - inetknght
goed antwoord, maar dan ... hoe lost Apple deze problemen op voor Time Machine? - Damien


"Over het algemeen zou je harde links toch niet moeten gebruiken" is te breed. U moet het verschil tussen harde koppelingen en symlinks begrijpen en deze zo nodig gebruiken. Elk heeft zijn eigen set voordelen en nadelen:

Symlinks kunnen:

  • Wijs naar mappen
  • Wijs naar niet-bestaande objecten
  • Wijs bestanden en mappen aan buiten hetzelfde bestandssysteem

Harde links kunnen:

  • Houd het bestand waarnaar ze verwijzen verwijderd

Harde koppelingen zijn vooral handig bij het uitvoeren van "copy on write" -toepassingen. Hiermee kunt u een reservekopie van een directorystructuur behouden, terwijl u alleen ruimte gebruikt voor de bestanden die tussen twee versies wisselen.

Het bevel cp -al is in dit opzicht bijzonder nuttig. Het maakt een volledige kopie van een directorystructuur, waarin alle bestanden worden vertegenwoordigd door harde koppelingen naar de originele bestanden. U kunt vervolgens doorgaan met het bijwerken van bestanden in de structuur en alleen de bestanden die u bijwerkt, nemen extra ruimte in beslag. Dit is vooral handig bij het onderhouden van back-ups van meerdere generaties.


72
2018-02-18 15:06



met betrekking tot de laatste alinea, als u het "gekopieerde" hardlinkbestand bewerkt, wordt ook het originele bestand gewijzigd - zie unix.stackexchange.com/questions/70531/... - marcin
Deze beschrijving van harde links is nogal misleidend. Het is eigenlijk waar dat harde links "het bestand behouden waarvan ze refereren dat ze worden verwijderd", maar dat is slechts een neveneffect van harde koppelingen. Het is zeker NIET waar dat je harde links in één map kunt maken, het "originele" bestand kunt wijzigen en vervolgens kunt verwachten dat de harde links op een of andere manier naar de oude inhoud verwijzen. In feite is de leidende waarheid van harde links dat het helemaal geen koppeling is, althans niet meer dan het originele "bestand", dat slechts een naam is die naar een bestand verwijst. Een harde link is gewoon een andere naam die naar hetzelfde bestand verwijst. - matty
Het backup-idee is goed en ik gebruik dat ook vaak, maar ik denk dat gebruikers moeten worden gewaarschuwd dat het wijzigen van een bestand ook de back-up zal veranderen. - Mark
Heck, een symlink hoeft helemaal nergens naar te verwijzen. ln -s "Don't use this directory" README is legitiem. Als u er bijvoorbeeld over nadenkt, kan een directory als een relationele database worden gebruikt en helemaal geen echte bestanden bevatten. - Edward Falk
-1 Dit geeft geen antwoord op de vraag, en sommige informatie is gewoon verkeerd. - wjandrea


Ter informatie, u kunt hetzelfde bereiken als harde koppelingen voor mappen met behulp van mount:

mount -t bind /var/www /home/user/workspace/www

Dit is erg gevaarlijk omdat de meeste hulpprogramma's en programma's zijn niet op de hoogte van de binding. Ik heb ooit zoiets gedaan als in het bovenstaande voorbeeld en ging toen verder rm -rf /home/user. Gelukkig was er niets relevant in /var/www.


37
2017-11-07 17:39



Ik heb gebruikt mount --bind <src> <dest>. Gebruik voorzichtig niet om de src ;) - kachar
Ik krijg: mount: unknown filesystem type 'bind' - Wizek
op Busybox, het is het mount -o bind src dest - Mat M
@MatM hetzelfde met Debian - hanshenrik


De reden dat hard-linking directories niet is toegestaan, is een beetje technisch. In wezen, ze verbreken de structuur van het bestandssysteem. Over het algemeen zou je sowieso geen harde links moeten gebruiken. Symbolische koppelingen maken het grootste deel van dezelfde functionaliteit mogelijk zonder problemen te veroorzaken (bijv ln -s target link).


18
2017-11-01 21:25



Harde links hebben goede use cases. Zeggen dat je ze over het algemeen niet zou moeten gebruiken, is iets te breed. - Sander Steffann
+2 voor het leveren van de link die daadwerkelijk de vraag van het OP (en de mijne) beantwoordt, -1 voor het uitbrengen van een mening ("Je zou over het algemeen geen harde links moeten gebruiken" - als er links waren om het te ondersteunen, zou het goed zijn). Wat goed was, omdat ik toch geen +2 kan geven. ; D - msb
de link "ze breken de structuur van het bestandssysteem" werkt niet. - Charlie Parker
Probeer de inhoud van de link in het antwoord samen te vatten en houd de link als referentie. Dit is een goede manier om Stack Exchange te gebruiken om linkrot te voorkomen, bedankt. - Oxwivi
goed gedaan @CharlieParker; beste onbedoelde (?) ironische opmerking aller tijden :) - Eliran Malka