Som tittelen sier, vil jeg gjerne vite forskjellen mellom en hard lenke og en myk lenke opprettet med kommandoen ln
. Kommandoen man ln
gir informasjon, men svarer ikke tilstrekkelig på spørsmålet mitt.
Det ville også være fint om noen kunne gi en innstilling der hard lenke kan være å foretrekke fremfor en symbolsk lenke.
En hardlink er ikke en peker til en fil, det er en katalogoppføring (en fil) som peker til samme inode. Selv om du endrer navnet på den andre filen, peker en hardlink fortsatt til filen. Hvis du erstatter den andre filen med en ny versjon (ved å kopiere den), vil en hardlink ikke peke til den nye filen. Du kan bare ha hardlenker innenfor samme filsystem. Med hardlenker har du ikke noe begrep om de opprinnelige filene og lenkene, alle er like (tenk på det som en referanse til et objekt). Det er et konsept på veldig lavt nivå.
På den annen side peker en symbolsk kobling faktisk til en annen bane (et filnavn); den løser navnet på filen hver gang du får tilgang til den via den symbolske koblingen. Hvis du flytter filen, følger ikke symbolkoblingen med. Hvis du erstatter filen med en annen og beholder navnet, vil symbolkoblingen peke til den nye filen. Symkoblinger kan gå på tvers av filsystemer. Med symbolske koblinger har du et veldig tydelig skille mellom den faktiske filen og den symbolske koblingen, som ikke lagrer noen informasjon ved siden av banen om filen den peker til.
Begge er pekere til filer; forskjellen er typen peker. En symbolsk lenke peker til en annen fil ved navn. Den har en spesiell modusbit som identifiserer den som en symbolsk lenke, og innholdet er navnet på den virkelige filen. Fordi den bare inneholder et navn, trenger ikke dette navnet faktisk å eksistere, eller kan eksistere på et annet filsystem. Hvis du erstatter den navngitte filen (endrer innholdet uten å påvirke navnet), inneholder lenken fortsatt det samme navnet, og peker nå til den nye filen. Du kan enkelt identifisere en symbolsk lenke og se navnet på filen den peker til.
En hard lenke peker til filen etter inode-nummer. Som sådan er harde lenker ikke annerledes enn det første navnet på en fil. Det er ingen forskjell mellom "ekte" navn og navn på harde lenker; alle harde lenker er like gyldige navn på filen. På grunn av dette må filen du lenker til, faktisk eksistere og være i det samme filsystemet der du prøver å opprette lenken. Hvis du sletter det opprinnelige navnet, vil den harde lenken fortsatt peke til den samme filen. Fordi alle harde lenker er like gyldige navn for filen, kan du ikke se på en og se de andre navnene for filen; for å finne dette, må du se på hver fil og sammenligne deres inode-nummer for å finne de andre navnene som har samme inode-nummer.
Du kan se hvor mange navn en fil har fra utdataene fra ls -l
. Det første tallet etter filmodusen er antall lenker. En fil med mer enn 1 lenke har andre navn et eller annet sted, og omvendt har en fil med et lenkeantall på bare 1 ingen (andre) harde lenker.
Et av svarene fra den andre tråden (nå lenket fra toppen av innlegget ditt) nevner denne siden som jeg synes er en ganske god forklaring på middels nivå. Hvis du går deg vill i ascii-kunsten, her er tl;dr-versjonen:
Kjernen og filsystemene som er involvert oversetter alt transparent.
Så basert på det:
../parent.file
).Jeg kan ha forvirret meg selv litt, men når jeg leser gjennom forskjellige ting, sliter jeg med å finne forskjellen mellom en standardfil og en hardlink. Slik jeg leser det, består hver fil av en hardlink (lagring av filnavnet), som lenker til en inode som peker på fysiske data.
Å legge til en hardlink gir bare en inode med en ekstra filsystembasert peker. Er det riktig?