Vraag Wat is het verschil tussen een harde link en een symbolische link?


Zoals de titel al zegt, zou ik graag het verschil willen weten tussen een harde link en een zachte link die door het commando is gecreëerd ln. Het bevel man ln geeft wel informatie, maar beantwoordt mijn vraag niet voldoende.

Het zou ook leuk zijn als iemand een instelling zou kunnen bieden waar een harde link de voorkeur zou kunnen hebben boven een symbolische link.


447
2018-02-29 09:03


oorsprong


een van de verschillen ... je hebt een bestand, bijvoorbeeld een bestandstest. Als u ln testhardlink maakt, maak ln-s testsymlink en verplaats bestandstest naar andere dir (of hernoem), zal de symlink niet werken. Hardlink werkt. Probeer nu de bestandstest te verwijderen. Hardlink zal nog steeds werken, in feite zul je nog steeds in staat zijn om een ​​bestand te benaderen totdat het aantal hardlinks naar het bestand niet 0 is. Dat komt door inodes, het is geschreven in handmatige ... - Denwerko
Ik heb dit opnieuw geopend omdat het een goed algemeen antwoord op dit probleem verdient (in tegenstelling tot de vorige vraag die een obscuur C-voorbeeld was). - Oli♦
Beste antwoord: youtube.com/watch?v=aO0OkNxDJ3c - Abhishek Bhatia
Ook een vrij compleet antwoord: stackoverflow.com/questions/185899/... - Elzo Valugi
@AbhishekBhatia de video is niet beschikbaar - Ooker


antwoorden:


 In Linux / Unix staan ​​snelkoppelingen bekend als Links


Er zijn twee soorten koppelingen: zachte koppelingen (symbolische koppelingen) of harde koppelingen.

  1. Softlinks (symbolische links)

    U kunt koppelingen maken naar bestanden en mappen en u kunt koppelingen (snelkoppelingen) maken op verschillende partities en met een ander inode-nummer dan het origineel.

    Als het echt kopie is verwijderd, de link zal niet werken.

  2. Harde links

    Harde koppelingen zijn alleen voor bestanden; u kunt niet linken naar een bestand op een andere partitie met een ander inode-nummer.

    Als het echt kopie is de link zal werken, omdat het toegang heeft tot de onderliggende gegevens waartoe de echte kopie toegang had.


Vraag: Hoe maak ik een zachte link?

Antwoord: Er kan een zachte koppeling worden gemaakt ln -s; eerst moet je de bron definiëren en dan moet je de bestemming definiëren. (Houd er rekening mee dat je de volledige paden van zowel de bron als de bestemming moet bepalen, anders werkt het niet.)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

enter image description here

Zoals je ziet heeft het een andere inode en kan het op een andere partitie gemaakt worden.


Vraag: Hoe maak ik een harde link?

Antwoord: Een harde koppeling kan worden gemaakt met ln; eerst moet je de bron definiëren en dan moet je de bestemming definiëren. (Houd er rekening mee dat je het volledige pad van zowel de bron als de bestemming moet bepalen, anders werkt het niet.)

Laten we zeggen dat ik een script heb in de /script map genoemd firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

enter image description here

Zoals je ziet, heeft het dezelfde inode. Als ik de originele verwijder, werkt de link en deze fungeert als het origineel.

enter image description here

Hierboven controleer ik of de link werkt en verwijder dan het originele firefox-script.


Jij vraag: Het zou mooi zijn als iemand een instelling kan bieden waar een harde link de voorkeur verdient boven een symbolische link.

Antwoord : Afhankelijk van de lay-out van de schijfpartitie, Harde links hebben de beperking dat ze zich op dezelfde partitie moeten bevinden (-1 punt) en kan alleen linken naar bestanden (-1 punt) ), maar +1 punt als het origineel is verwijderd, werkt de link en werkt deze als het origineel.

Aan de andere kant kan een softlink naar mappen of bestanden verwijzen (+1 punt) en er is geen partitiebeperking (+1 punt), maar (-1 punt) als de bron is verwijderd, werkt de link niet.


31
2018-05-09 00:42





Een hardlink is geen verwijzing naar een bestand, het is een directory-item (een bestand) dat naar dezelfde inode wijst. Zelfs als u de naam van het andere bestand wijzigt, wijst een hardlink nog altijd naar het bestand. Als u het andere bestand vervangt door een nieuwe versie (door het te kopiëren), wijst een hardlink niet naar het nieuwe bestand. Je kunt alleen hardlinks binnen hetzelfde bestandssysteem hebben. Met hardlinks heb je geen concept van de originele bestanden en links, allemaal zijn ze gelijk (denk aan het als een verwijzing naar een object). Het is een concept van een zeer laag niveau.

Aan de andere kant verwijst een symlink eigenlijk naar een ander pad (een bestandsnaam); het lost de naam van het bestand op elke keer dat je het opent via de symlink. Als u het bestand verplaatst, zal de symlink niet volgen. Als u het bestand vervangt door een ander, met behoud van de naam, wijst de symlink naar het nieuwe bestand. Symlinks kunnen bestandssystemen overspannen. Met symlinks heb je een heel duidelijk onderscheid tussen het eigenlijke bestand en de symlink, die geen info opslaat naast het pad naar het bestand waar het naar verwijst.


314
2018-05-18 09:51



Een ding dat (door eigen woorden) "verwijst naar het bestand"  kan een worden genoemd wijzer (het is bijna triviaal bijna tautologisch waar). Als we nitpicking zijn dan kan (in het algemeen) het idee van hardlinks bestaan, zelfs als een bestandssysteem geen inodes gebruikt. - jfs


"Een foto zegt meer dan duizend woorden." Pictorial representation


En: "Een voorbeeld is honderd paragrafen waard ..."

Maak twee bestanden:

$ touch blah1   
$ touch blah2

Voer wat gegevens in:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

En zoals verwacht:

$cat blah1; cat blah2
Cat
Dog

Laten we harde en zachte links maken:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Laten we eens kijken wat er net is gebeurd:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Het veranderen van de naam van blah1 maakt niet uit:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hard wijst naar de inode, de inhoud van het bestand - dat was niet veranderd.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

De inhoud van het bestand kan niet worden gevonden omdat de zachte koppeling verwijst naar de naam, die is gewijzigd en niet naar de inhoud.
Evenzo, als blah1 is verwijderd, bevat blah1-hard nog steeds de inhoud; als blah2 wordt verwijderd, is blah2-soft slechts een koppeling naar een niet-bestaand bestand.


bron: het is duidelijk overgenomen van StackOverflow!


293
2017-07-21 07:33



Om eerlijk te zijn - je hebt de mooie afbeelding bovenaan toegevoegd ... ah je hebt dat ook gekopieerd! Het combineren van de twee antwoorden is eigenlijk heel nuttig :) - icc97
beter uitgelegd, nergens! - dennisbot
Ik bleef maar 20 seconden naar het beeld staren en toen, plotseling, bedacht ik het. Dit is eigenlijk geweldig. - Mohammed Joraid
btw: Hardlinks gebruiken met git  is een slecht idee, voor het geval dat iemand (gefrustreerd over zachte links) zich afvraagt ​​... ook van toepassing zou kunnen zijn op andere versiesystemen. - Frank Nocke
Is een inode voor zijn hardlinks vergelijkbaar met een bestand dat in de cloud is opgeslagen, naar welk apparaat dan ook? - Ooker


Beide zijn verwijzingen naar bestanden; het verschil is de soort van de aanwijzer. Een symbolische koppeling verwijst naar een ander bestand bij naam. Het heeft een speciale modusbit die het als een symbolische koppeling identificeert, en de inhoud ervan is de naam van het echte bestand. Omdat het alleen een naam bevat, hoeft die naam niet echt te bestaan ​​of bestaat deze op een ander bestandssysteem. Als u het benoemde bestand vervangt (de inhoud ervan wijzigen zonder de naam ervan aan te tasten), bevat de koppeling nog steeds dezelfde naam en nu verwijst deze naar het nieuwe bestand. U kunt eenvoudig een symbolische link identificeren en de naam zien van het bestand waarnaar het verwijst.

Een harde koppeling wijst naar het bestand op inodenummer. Als zodanig zijn harde koppelingen niet anders dan de eerste naam van een bestand. Er is geen "echte" naam versus de naam van de harde koppeling; alle harde koppelingen zijn even geldige namen voor het bestand. Daarom moet het bestand waarnaar u linkt, daadwerkelijk bestaan ​​en zich in hetzelfde bestandssysteem bevinden als waar u de koppeling probeert te maken. Als u de originele naam verwijdert, wijst de harde koppeling nog altijd naar hetzelfde bestand. Omdat alle harde links even geldige naam (namen) voor het bestand zijn, kunt u er niet naar zoeken en de andere namen voor het bestand bekijken; om dit te vinden, moet je elk bestand bekijken en hun inode nummer vergelijken om de andere naam (namen) te vinden die hetzelfde inode nummer hebben.

U kunt zien hoeveel namen een bestand heeft van de uitvoer van ls -l. Het eerste nummer na de bestandsmodus is het aantal verbindingen. Een bestand met meer dan één link heeft ergens anders een andere naam en omgekeerd heeft een bestand met een aantal koppelingen van slechts 1 geen (andere) harde koppelingen.


87
2018-05-18 15:23



If you replace the named file, then the link still contains the same name, and so now it points to the new file - Ik denk dat dit niet goed uitgelegd is. Bedoel je als ik het bestand vervang waar ik een symbolische link naar heb, dan blijven de links met de naam onaangetast. Maar het zou alleen naar het vervangen bestand verwijzen als de bestandsnaam (dat wil zeggen het nieuwe bestand dat de oude vervangt) hetzelfde is als het vervangen (dat wil zeggen, het oude bestand dat werd vervangen door het nieuwe), één correct? - Mike
@Mike, ja: de symbolische koppeling verwijst naar de originele bestandsnaam. Als u dat bestand vervangt, betekent dit dat de koppeling nu verwijst naar het nieuwe bestand. - psusi
Maar alleen als het dezelfde naam correct heeft? Zou symlink wijzen naar banaan en ik vervang het bestand door oranje dan kan sy-link het bestand banaan niet meer vinden, d.w.z. het zal niet werken - Mike
@Mike, de wereld vervangen betekent dat het dezelfde naam heeft, anders verwijdert u slechts één bestand en voegt u er nog een toe;) - psusi


Een hardlink kan alleen op hetzelfde bestandssysteem werken, het is gewoon een andere naam voor dezelfde inode (er wordt intern naar verwezen door inodes). Een bestand wordt alleen van de schijf verwijderd wanneer de laatste link naar zijn inode is verdwenen (u rmd or unlinkd de laatste link). Hardlinks werken meestal alleen voor bestanden, niet voor directory's.

Een symlink (symbolische koppeling) is een speciaal bestand met een pad naar een ander bestand. Dit pad kan absoluut of relatief zijn. symlinks kunnen werken op verschillende bestandssystemen en kunnen zelfs naar verschillende bestanden verwijzen, bijvoorbeeld als u een externe harde schijf loskoppelt en vervangt door een andere, die een ander bestand op hetzelfde pad heeft. Een symlink kan verwijzen naar bestanden of mappen.


57
2018-02-29 09:20



Bedankt, dit vertelt me ​​hoe ze werken, maar wat doet de harde band precies? En waarom werkt het niet voor mappen? - ste_kwr
@knittl: weet je het zeker? Het lijkt erop dat op sommige bestandssystemen hardlinks naar mappen zijn toegestaan, maar alleen root ze kan maken. Zie de -d, -F, --directory schakelaars. En ja, ik hebben gezien de notitie in de ln(1) pagina :) - 0xC0000022L
@kniwor: de gemakkelijkste manier om hardlinks te beschrijven is "gewoon een andere naam voor hetzelfde bestand (dat wil zeggen data op schijf)". En - althans op mijn systeem (en) - ln kan niet worden gebruikt om hardlinks naar mappen te maken. Er bestaan ​​echter wel hardlinks naar mappen, waarvan het meest prominente voorbeeld is . en ... Ik wilde dat niet opnemen in mijn oorspronkelijke antwoord, omdat dat alleen maar de zaken zou compliceren. - knittl
@STATUS_ACCESS_DENIED: oké ... maar meestal is dit geen goed idee. Daarom schreef ik »meestal« in mijn oorspronkelijke antwoord. Zie ook mijn vorige opmerking voor voorbeelden. - knittl
dus een harde link kan verwijzen naar dezelfde map / bestand met verschillende namen, d.w.z. met verschillende namen die linken naar dezelfde inode? - Charlie Parker


Een van de antwoorden uit de andere thread (nu gelinkt vanaf de bovenkant van uw bericht) vermeldt deze pagina waarvan ik denk dat het een redelijk goede uitleg op middel niveau is. Als je verdwaalt in de ascii-kunst, hier is de versie tl; dr:

  • Standaardbestanden zijn een aanwijzer van het bestandssysteem naar een inode die op zijn beurt verwijst naar fysieke gegevens. De bestandscomponent slaat de koppeling naar het bestandssysteem op (in wezen het pad) en een link naar de inode.
  • Hardlinks zijn net als bestanden. Ze zijn slechts een extra aanwijzer rechtstreeks naar een inode.
  • Symbolische koppelingen zijn afzonderlijke bestanden (inclusief afzonderlijke inode en gegevens) die een bestandssysteempad opslaan in een bestand.

De betrokken kernel en bestandssystemen vertalen alles transparant.

Dus op basis daarvan:

  • Hardlinks staan ​​alleen toe dat hetzelfde bestandssysteem wordt gekoppeld. Symlinks kunnen op elk pad wijzen.
  • Hardlinks wijzen (in wezen) naar absolute gegevens. Symlinks kunnen verwijzen naar relatieve paden (bijv ../parent.file)
  • Als u bij uitbreiding de doelaanwijzer van een hardlink verplaatst (wat onthoud dat zichzelf in feite gewoon een hardlink is die naar een inode verwijst), werkt de hardlink nog steeds. Het verplaatsen van het doel van een symlink verbreekt meestal de symlink.
  • Het oplossen van een hardlink zou sneller maar onmetelijk zo zijn. Dat onbelangrijke deel van snelheid komt ten koste van een inflexibel bestandssysteem.

Ik heb mezelf misschien een beetje in de war gebracht maar door verschillende dingen te lezen, ben ik aan het worstelen om het verschil te vinden tussen een standaardbestand en een hardlink. De manier waarop ik het lees, is dat elk bestand bestaat uit een hardlink (opslag van de bestandsnaam), die linkt naar een inode die naar fysieke gegevens verwijst.

Het toevoegen van een hardlink levert alleen een inode met een extra aanwijzer op basis van het bestandssysteem. Is dat juist?


20
2018-05-18 15:10



Ik denk dat je gelijk hebt, elk bestand is een padnaam voor een inode en een harde koppeling is een extra padnaam voor dezelfde inode. Dus een harde koppeling is niet anders dan een normaal bestand. - enzotib
Ik probeer dit te begrijpen ... maar u zegt:> "Symbolische koppelingen zijn afzonderlijke bestanden (inclusief afzonderlijke inode en gegevens) die een bestandssysteempad opslaat naar een bestand. "Heeft een symlink echt afzonderlijke gegevens? Dan is het precies hetzelfde als een kopie van de map waarnaar het linkt, toch? ... en elke keer dat iets naar de symlink wordt geschreven, moet het twee keer op schijf worden geschreven? Klinkt nergens op. - MiniGod
@MiniGod Geen symlink is een inode voor een gegevensblok met een pad naar een andere inode (bestandsnaam). Ja, het is Matrix-achtig verwarrend, maar als je het eenmaal weet, vergeet je het nooit :) - Oli♦
@Oli Ik ben misschien in de war, maar als je zegt: "inclusief aparte inode en gegevens ", bedoel je dat de symlink aparte gegevens heeft !? - MiniGod
@MiniGod Ja. De Symlink is een inode die naar gegevens verwijst (net als bij een normaal bestand) en die gegevens zijn een pad. Het is een beetje slimmer dan dat - om transparant gebruik mogelijk te maken via symlinks - maar dat is in wezen alles wat ze zijn. - Oli♦


Wanneer Soft Link gebruiken:

Link over bestandssystemen: Als u bestanden wilt koppelen tussen de bestandssystemen, kunt u alleen symlinks / softlinks gebruiken.

Koppelingen naar map: als u mappen wilt koppelen, moet u Softlinks gebruiken, omdat u geen harde koppeling naar een map kunt maken.

Wanneer gebruik je Hard Link:

Opslagruimte: harde koppelingen nemen een zeer verwaarloosbare hoeveelheid ruimte in beslag, omdat er geen nieuwe inodes zijn gemaakt tijdens het maken van harde koppelingen. In softlinks maken we een bestand dat ruimte in beslag neemt (meestal 4KB, afhankelijk van het bestandssysteem)

Prestaties: de prestaties zullen iets beter zijn tijdens het gebruik van een harde koppeling, omdat u de schijfwijzer direct gebruikt in plaats van door een ander bestand te gaan. Bestandslocatie verplaatsen: Als u het bronbestand naar een andere locatie op hetzelfde bestandssysteem verplaatst, blijft de harde koppeling werken, maar de softlink mislukt.

Redundantie: als je zeker wilt zijn van de veiligheid van je gegevens, zou je een harde link moeten gebruiken, omdat bij een harde link de data veilig is, totdat alle links naar de bestanden zijn verwijderd, in plaats van dat in de zachte link, zul je verliezen de gegevens als de hoofdinstantie van het bestand wordt verwijderd.


15
2017-09-06 23:48



Merk op dat er ook een snelle symbolische koppeling is voor padnaamomvang tot 64 bytes. Het kost nog steeds één inode, maar verbruikt niet de blokruimte van 4 kB. - syockit


De verwarring begint als je het verschil probeert te vinden tussen "de bestandsnaam" en een harde link omdat er geen is.

Elk bestand dat u maakt, bestaat uit gegevens op de schijf en een harde koppeling - Dit is een bestandsnaam in een map en een verwijzing naar de gegevens op de schijf. Einde verhaal. Wanneer de laatste (of enige) harde koppeling wordt verwijderd, weet het besturingssysteem dat de gegevens niet langer nodig zijn.

Hieruit kunt u zien dat de feitelijke gegevens nooit worden verwijderd, maar alleen de harde koppeling (en). En wanneer het voldoende druk wordt op de schijf, kunnen de gegevens worden overschreven door de gegevens van een ander bestand. Tot die tijd kunnen de gegevens van het verwijderde bestand worden hersteld, maar het is moeilijk om die zonder de harde link te vinden.

Symlinks, zoals eerder uitgelegd, vertellen u gewoon "er is een bestand met de naam <targetname> in een map met de naam <targetfolder>"Ze wijzen naar de harde link, ze weten niet waar de data is, de harde link weet dat.


7
2018-03-01 11:28





Voor een uitstekend nieuweling-en-ex-Windoze-gebruiker-vriendelijk uitleg, met mooie diagrammen en een FAQ bekijk deze pagina http://www.geekride.com/hard-link-vs-soft-link/. Hun auteursrechten beperkingen verhinderen dat ik hun spul uithaal, dus volstaat het dat ik de link hier geef.

Dit is mijn tweede of zelfs derde poging om het raadsel van de zachte / hard-link te begrijpen, altijd de handdoek in de ring gooien en mijn begrip uitzetten tot een onbepaald tijdstip in de toekomst - zodra de uitleg en man-pagina's diep in de kern worden opgenomen en te technisch met inodes en alle ...

Genieten!


3
2018-02-10 16:03