Mis juhtub, kui palute mul selgitada kõva lingi ja sümboolse lingi erinevust

Lubage mul öelda lühidalt:

Selles maailmas on igasuguseid vorstilinke. * Sama kehtib ka faililinkide kohta.

DIDUKNOW? Universum sisaldab nii kõva (!) Kui ka pehmet aka sümboolset (!!) faililinki. Teisisõnu ... faililinkid on täpselt nagu vorsilinkid.

Nüüd, kui ma olen teie huvi tundnud (kuna vorsilinkid on hämmastavad ja kui faililinkid on nagu vorsilinkid, peavad ka need olema hämmastavad), lubage mul jagada veel mõned punktid kõvade ja sümboolsete linkide kohta.

Esiteks, harjumatu jaoks

Mis on kõvad lingid ja sümboolsed lingid?

Nii kõvad lingid kui ka sümboolsed lingid on failid, mis toimivad otseteedena teistele failidele.

Täpsemalt lugege julgelt ülejäänud seda jaotist (vastasel korral liikuge järgmise jaotise juurde - „Mis vahe on rasketel ja sümboolsetel linkidel?“).

Failile kõva või pehme lingi loomisel saate seda linki kasutada originaalfailile juurde pääsemiseks või sellega manipuleerimiseks samamoodi, nagu kasutaksite faili enda asukohta. Näiteks ütleme, et teen oma Linuxi masinas faili nimega “tühi” (kasutades käsku touch).

rona @ mugwort: ~ $ cd ~ / test /
rona @ mugwort: ~ / test $ ll
kokku 8
drwxrwxr-x 2 rona rona 4096 7. mai 19:39 ./
drwxr-xr-x 37 rona rona 4096 7. mai 19:39 ../
rona @ mugwort: ~ / test $ touch tühi
rona @ mugwort: ~ / test $ ll
kokku 8
drwxrwxr-x 2 rona rona 4096 7. mai 19:39 ./
drwxr-xr-x 37 rona rona 4096 7. mai 19:39 ../
-rw-rw-r-- 1 rona rona 0 7. mai 19:39 tühi

Siiani pole ühtegi linki sellega seotud. Fail on minu kataloogis lihtsalt tühi, ~ / test. Uuele failile juurdepääsemiseks saan lihtsalt kutsuda faili juurde nime ~ / test / tühi.

Järgmises näites kasutan teed ~ / test / empty, et lugeda “tühi”, sisestada string “tühjaks” ja lugeda see uuesti.

rona @ mugwort: ~ / test $ kass ~ / test / tühi
rona @ mugwort: ~ / test $ echo "paneme selle stringi tühjaks"> ~ / test / empty
rona @ mugwort: ~ / test $ kass ~ / test / tühi
paneme selle stringi tühjaks

Ülaltoodud toimib ka tühja asemel ~ / test / tühi (kuna tühi on minu praegusest kataloogist suhteline tee “tühja” juurde).

rona @ mugwort: ~ / test $ kass tühi
paneme selle stringi tühjaks

Samu asju saab teha nii kõvade kui ka pehmete linkide abil “tühjendamiseks”. Nt

rona @ mugwort: ~ / test $ ln empty empty_hl
rona @ mugwort: ~ / test $ ll
kokku 8
drwxrwxr-x 2 rona rona 4096 7. mai 19:39 ./
drwxr-xr-x 37 rona rona 4096 7. mai 19:39 ../
-rw-rw-r-- 2 rona rona 0 7. mai 19:39 tühi
-rw-rw-r-- 2 rona rona 0 7. mai 19:39 tühi_hl
rona @ mugwort: ~ / test $ ln -s tühi empty_sl
rona @ mugwort: ~ / test $ ll
kokku 16
drwxrwxr-x 2 rona rona 4096 7. mai 21:26 ./
drwxr-xr-x 37 rona rona 4096 7. mai 19:39 ../
-rw-rw-r-- 2 rona rona 106 7. mai 21:24 tühi
-rw-rw-r-- 2 rona rona 106 7. mai 21:24 tühi_hl
lrwxrwxrwx 1 rona rona 5. mai 7 21:26 empty_sl -> tühi
rona @ mugwort: ~ / test $ echo "lisame tühjale veel ühe stringi, kasutades selleks meie kõva linki, empty_hl" >> empty_hl
rona @ mugwort: ~ / test $ echo "lisame tühja jaoks kolmanda stringi, kasutades selleks seekord meie pehmet linki, empty_sl" >> empty_sl
rona @ mugwort: ~ / test $ kass tühi
paneme selle stringi tühjaks
lisame tühjaks veel ühe stringi, kasutades selleks meie kõva linki tühi_hl
lisame tühjaks kolmanda stringi, kasutades selleks seekord meie pehmet linki, tühi_sl

Ülaltoodud näites lõin kõva ja pehme lingi "tühjaks": "tühi_hl" ja "tühi_sl", kasutades vastavalt ln ja ln -s. Siis kasutasin radade tühjaks lisamiseks radasid tühi_hl ja tühi_sl, selle asemel, et kasutada radu tühjaks või ~ / test / tühjaks.

Seega on „tühi_hl” ja „tühi_sl” failid, mida saate kasutada nende tühja lingitud faili juurde pääsemiseks või sellega manipuleerimiseks. Pange tähele, et kassi kasutamine tühjadel_hl ja tühjadel_sl annab sama väljundi kui kassil tühjadel:

rona @ mugwort: ~ / test $ kass empty_hl
paneme selle stringi tühjaks
lisame tühjaks veel ühe stringi, kasutades selleks meie kõva linki tühi_hl
lisame tühjaks kolmanda stringi, kasutades selleks seekord meie pehmet linki, tühi_sl
rona @ mugwort: ~ / test $ kass empty_sl
paneme selle stringi tühjaks
lisame tühjaks veel ühe stringi, kasutades selleks meie kõva linki tühi_hl
lisame tühjaks kolmanda stringi, kasutades selleks seekord meie pehmet linki, tühi_sl

Faililinkid on kasulikud, kui soovite juurde pääseda mõne teise kataloogi (või isegi erineva serveri) failile, nagu oleks see teie praeguses kataloogis olev kohalik fail.

Nüüd, kui olen põhitõed tutvunud, lubage mul selgitada järgmist:

Mille poolest erinevad kõvad ja sümboolsed lingid?

Selle selgitamiseks pean ma natuke sügavamalt uurima failide endi tegelikku olemust.

Me kipume arvama, et failid sarnanevad andmeid sisaldavate pakettidega. See on lõppkasutajatele kasulik abstraktsioon, kuid kerneli jaoks on fail tegelikult rohkem nagu noot, mis ütleb, kus andmed asuvad füüsilises mälus koos mõne muu teabega (millal need andmed loodi, millal viimati muudetud, kelle poolt ja kellele see kuulub jne) (lisateabe saamiseks otsige sisendeid).

See tähendab, et kui soovite luua uue faili, mis võimaldab teil juurde pääseda mõne muu faili sisule, on teil kaks võimalust: saate teha uue faili, mis sisaldab samu märkmeid kui originaalfail (andmetele juurdepääsu aadress, andmete omanik jne) VÕI võite teha uue faili, mille andmed on algsed. Esimene neist on kõva link, teine ​​aga pehme link.

rona @ mugwort: ~ / test $ stat tühi
  Fail: 'tühi'
  Suurus: 187 plokki: 8 IO plokki: 4096 tavafail
Seade: 808h / 2056d Sood: 1706426 Lingid: 2
Juurdepääs: (0664 / -rw-rw-r--) Uid: (1000 / rona) Gid: (1000 / rona)
Juurdepääs: 2017-05-07 21: 30: 15.613353122 -0700
Muutke: 2017-05-07 21: 26: 26.182109021 -0700
Muutus: 2017-05-07 21: 26: 26.182109021 -0700
 Sünd:
rona @ mugwort: ~ / test $ stat empty_hl
  Fail: 'empty_hl'
  Suurus: 187 plokki: 8 IO plokki: 4096 tavafail
Seade: 808h / 2056d Sood: 1706426 Lingid: 2
Juurdepääs: (0664 / -rw-rw-r--) Uid: (1000 / rona) Gid: (1000 / rona)
Juurdepääs: 2017-05-07 21: 30: 15.613353122 -0700
Muutke: 2017-05-07 21: 26: 26.182109021 -0700
Muutus: 2017-05-07 21: 26: 26.182109021 -0700
 Sünd:
rona @ mugwort: ~ / test $ stat empty_sl
  Fail: 'tühi_sl' -> 'tühi'
  Suurus: 5 plokki: 0 IO plokk: 4096 sümboolne link
Seade: 808h / 2056d Sood: 1706413 Lingid: 1
Juurdepääs: (0777 / lrwxrwxrwx) Uid: (1000 / rona) Gid: (1000 / rona)
Juurdepääs: 2017-05-07 21: 26: 17.706140971 -0700
Muutke: 2017-05-07 21: 26: 02.522199049 -0700
Muutus: 2017-05-07 21: 26: 02.522199049 -0700
 Sünd:

See toob kaasa mõned erinevused kõvade ja pehmete linkide vahel. Kõva link peegeldab muudatusi ainult faili sisus, mitte aga originaalfailis, pehme link peegeldab algfaili muudatusi.

Näiteks viitavad fail „tühi” ja selle raske link „tühi_hl” samadele andmetele. Pehme link “tühi_sl” ei osuta nendele andmetele, vaid lahendab “tühja”, mis seda teeb. Nii et kui muudame andmeid aadressil, mis on märgitud tühjas_hl, kajastavad seda muudatust kõik kolm faili - tühi, tühi_hl ja tühi_sl.

rona @ mugwort: ~ / test $ echo "muudame andmeid aadressil, millele osutab tühi"> empty_hl
rona @ mugwort: ~ / test $ kass tühi
muudame andmeid aadressil, millele osutatakse tühjaga
rona @ mugwort: ~ / test $ kass empty_hl
muudame andmeid aadressil, millele osutatakse tühjaga
rona @ mugwort: ~ / test $ kass empty_sl
muudame andmeid aadressil, millele osutatakse tühjaga

Kuid kui me ei muuda andmeid ise, vaid sellele, millistele andmetele „tühjad” osutavad (tühjale märgitud aadress), siis pehme link „tühi_sl” kajastab seda muudatust, kuid kõva link „tühi_hl” seda ei tee.

rona @ mugwort: ~ / test $ head ~ / .bash_history -n2> copy_of_bash_history
rona @ mugwort: ~ / test $ ll
kokku 20
drwxrwxr-x 2 rona rona 4096 8. mai 00:07 ./
drwxr-xr-x 37 rona rona 4096 7. mai 19:39 ../
-rw-rw-r-- 1 rona rona 55 8. mai 00:07 copy_of_bash_history
-rw-rw-r-- 2 rona rona 43 7. mai 23:53 tühi
-rw-rw-r-- 2 rona rona 43 7. mai 23:53 tühi_hl
lrwxrwxrwx 1 rona rona 5. mai 7 21:26 empty_sl -> tühi
rona @ mugwort: ~ / test $ mv copy_of_bash_history tühi
rona @ mugwort: ~ / test $ ll
kokku 16
drwxrwxr-x 2 rona rona 4096 8. mai 00:07 ./
drwxr-xr-x 37 rona rona 4096 7. mai 19:39 ../
-rw-rw-r-- 1 rona rona 55 8. mai 00:07 tühi
-rw-rw-r-- 1 rona rona 43 7. mai 23:53 tühi_hl
lrwxrwxrwx 1 rona rona 5. mai 7 21:26 empty_sl -> tühi
rona @ mugwort: ~ / test $ kass tühi
sudo apt installima mysql-server
sudo apt install apache2
rona @ mugwort: ~ / test $ kass empty_sl
sudo apt installima mysql-server
sudo apt install apache2
rona @ mugwort: ~ / test $ kass empty_hl
muutkem andmed, millele tühjad osutavad

Kui muudame andmeid, millele “tühi” algselt osutas (kuid enam ei tee), siis ei kuva seda muudatust ei tühi ega tühi_sl.

rona @ mugwort: ~ / test $ echo "muudame andmeid, mis tühjad osutasid algselt osutamisele"> empty_hl
rona @ mugwort: ~ / test $ kass empty_hl
muudame andmeid, millele tühjad algselt osutasid
rona @ mugwort: ~ / test $ kass tühi
sudo apt installima mysql-server
sudo apt install apache2
rona @ mugwort: ~ / test $ kass empty_sl
sudo apt installima mysql-server
sudo apt install apache2

Teise näitena, kui kustutame sõna „tühi”, puruneb meie pehme link „tühi_sl”, kuna faili, millest ta sõltus, enam ei eksisteeri. Meie kõva linki „tühi_hl” see aga ei mõjuta, kuna see ei sõltu tühjast.

rona @ mugwort: ~ / test $ rm tühi
rona @ mugwort: ~ / test $ ll
kokku 12
drwxrwxr-x 2 rona rona 4096 8. mai 00:26 ./
drwxr-xr-x 37 rona rona 4096 7. mai 19:39 ../
-rw-rw-r-- 1 rona rona 55 8. mai 00:22 tühi_hl
lrwxrwxrwx 1 rona rona 5. mai 7 21:26 empty_sl -> tühi
rona @ mugwort: ~ / test $ kass empty_sl
kass: empty_sl: sellist faili või kataloogi pole
rona @ mugwort: ~ / test $ kass empty_hl
muudame andmeid, millele tühjad algselt osutasid

Selle peamine tagajärg on see, et kui soovite aru saada failisüsteemi toimimise mõjust faili lingile, peate teadma, mida failisüsteemi toimimine tegelikult teeb: kas see muudab faili ennast või muudab faili viidatud andmeid? Sõltuvalt vastusest võib see teie kõva / pehme lingi "katkestada"!

Kui olete selle arvutuse teinud, saate siiski ka ise otsustada, kas kõva või pehme link on seda tüüpi link, mida soovite oma eesmärgi saavutamiseks. Nii et hurraa! Kas faililinke pole vinge?

(Vastus on jah.)

* Fyi, juhul kui teil tekib huvi, on ülaltoodud pildil olevad “kõvad” vorstilinkid magusad Hiina vorstid, samas kui “pehmed” vorstilingid on chorizo ​​vorstid. Kas pole tore, et siin maailmas on vorstikeste ja faililinkide mitmekesisus?

** Siin on nimekiri ressurssidest, millega ma selle ajaveebipostituse kirjutamiseks nõu pidasin:

  • https://askubuntu.com/questions/108771/what-is-the-difference-between-a-hard-link-and-a-symbolic-link
  • http://stackoverflow.com/questions/185899/what-is-the-difference-between-a-symbolic-link-and-a-hard-link
  • https://en.wikipedia.org/wiki/Symbolic_link
  • inode https://en.wikipedia.org/wiki/Inode
  • http://stackoverflow.com/questions/16912997/what-is-there-behind-a-symbolic-link