Сіз мені қатты сілтеме мен символдық сілтеменің айырмашылығын түсіндіруді сұрағанда не болады

Қысқаша тұжырым жасауға рұқсат етіңіз:

Бұл әлемде шұжық байланысының барлық түрлері бар. * Файл сілтемелері үшін де дәл осындай.

DIDUKNOW? Әлемде қатты (!) Және жұмсақ aka символдық (!!) файлдық сілтемелер бар. Басқаша айтқанда ... файлдық сілтемелер шұжық сілтемесі сияқты.

Енді мен сіздің қызығушылығыңызды байқадым (өйткені шұжық байланыстары таңқаларлық, ал егер файлдық сілтемелер шұжық сілтемесі сияқты болса, онда олар да таңқаларлық болуы керек), маған қатты және символдық сілтемелер туралы тағы бірнеше ойды бөлуге рұқсат етіңіз.

Біріншіден, бейтаныс адамдар үшін,

Қатты сілтемелер мен символдық сілтемелер дегеніміз не?

Қатаң сілтемелер де, символдық сілтемелер де басқа файлдарға сілтеме ретінде әрекет ететін файлдар.

Бұл бөлімнің қалған бөлігін оқып шығыңыз (әйтпесе келесі бөлімге өтіңіз - «Қатты және символдық сілтемелер арасындағы айырмашылық неде?»).

Файлға қатты немесе жұмсақ сілтеме жасағанда, сіз сол сілтемені түпнұсқа файлға қатынасу немесе оны басқару үшін, дәл сол файлдың жолын қолдана аласыз. Мысалы, мен Linux компьютерімде «бос» деп аталатын файл жасаймын (командалық түрту арқылы).

rona @ mugwort: ~ $ cd ~ / тест /
rona @ mugwort: ~ / тест $ ll
барлығы 8
drwxrwxr-x 2 rona rona 4096 7 мамыр 19:39 ./
drwxr-xr-x 37 rona rona 4096 7 мамыр 19:39 ../
rona @ mugwort: ~ / тест $ сенсорлық бос
rona @ mugwort: ~ / тест $ ll
барлығы 8
drwxrwxr-x 2 rona rona 4096 7 мамыр 19:39 ./
drwxr-xr-x 37 rona rona 4096 7 мамыр 19:39 ../
-rw-rw-r-- 1 rona rona 0 7 мамыр 19:39 бос

Әзірге мұнда сілтемелер болған жоқ. Менің каталогымда ~ «test» файлы бар, ~ / test. Жаңа файлға кіру үшін мен файлға жолды шақыра аламын, ~ / test / boş.

Келесі мысалда мен ~ / test / empty жолын «бос» оқу үшін, «бос» ішіне кіргізіп, қайта оқимын.

rona @ mugwort: ~ / тест $ мысық ~ / тест / бос
rona @ mugwort: ~ / test $ echo «осы жолды бос қалдырамыз»> ~ / test / empty
rona @ mugwort: ~ / тест $ мысық ~ / тест / бос
осы жолды босқа жіберейік

Жоғарыда көрсетілгендер бос / орнына / бос орнына жұмыс істейді (өйткені бос - бұл қазіргі каталогтағы «бос» дегенге қатысты жол).

rona @ mugwort: ~ / тест $ мысық бос
осы жолды босқа жіберейік

Қатты да жұмсақ та сілтемелерді қолдана отырып, бірдей нәрсені жасауға болады. Мысалы,

rona @ mugwort: ~ / тест $ ln бос бос_hl
rona @ mugwort: ~ / тест $ ll
барлығы 8
drwxrwxr-x 2 rona rona 4096 7 мамыр 19:39 ./
drwxr-xr-x 37 rona rona 4096 7 мамыр 19:39 ../
-rw-rw-r-- 2 rona rona 0 7 мамыр 19:39 бос
-rw-rw-r-- 2 rona rona 0 7 мамыр 19:39 бос_хл
rona @ mugwort: ~ / тест $ ln -s бос бос_sl
rona @ mugwort: ~ / тест $ ll
барлығы 16
drwxrwxr-x 2 rona rona 4096 7 мамыр 21:26 ./
drwxr-xr-x 37 rona rona 4096 7 мамыр 19:39 ../
-rw-rw-r-- 2 rona rona 106 7 мамыр 21:24 бос
-rw-rw-r-- 2 rona rona 106 7 мамыр 21:24 бос_хл
lrwxrwxrwx 1 rona rona 5 мамыр 7 21:26 empty_sl -> бос
rona @ mugwort: ~ / test $ echo «босқа тағы бір жол қосайық, бірақ оған қатты сілтемені қолдана отырып, boş_hl» >> empty_hl
rona @ mugwort: ~ / test $ echo «босқа үшінші жолды қосайық, бұл жолы оған жұмсақ сілтемені қолдана отырып, boş_sl» >> empty_sl
rona @ mugwort: ~ / тест $ мысық бос
осы жолды босқа жіберейік
босқа тағы бір жол қосайық, бірақ оған қатты сілтемені қолдана отырып, empty_hl
бос жолға үшінші жолды қосайық, бұл жолы оған жұмсақ сілтемені қолдана отырып, empty_sl жіберейік

Жоғарыда келтірілген мысалда мен «бос» дегенге қатты және жұмсақ сілтеме жасадым: «empty_hl» және «empty_sl», сәйкесінше ln және ln -s қолдана отырып. Содан кейін мен бос_hl және empty_sl жолдарын бос немесе ~ / test / empty жолдарының орнына жолдарды «бос» ішіне салу үшін қолдандым.

Осылайша, «empty_hl» және «empty_sl» - сіз «бос» дегенге сілтейтін файлға кіруге немесе оны басқаруға болатын файлдар. Мысалды «empty_hl» және «empty_sl» мысалында қолдану «бос» мысықпен бірдей нәтиже беретініне назар аударыңыз:

rona @ mugwort: ~ / тест мысық бос_хл
осы жолды босқа жіберейік
босқа тағы бір жол қосайық, бірақ оған қатты сілтемені қолдана отырып, empty_hl
үшінші жолды босқа қосамыз, бұл жолы оған жұмсақ сілтемені қолдана отырып, empty_sl жіберейік
rona @ mugwort: ~ / тестке мысық бос_sl
осы жолды босқа жіберейік
босқа тағы бір жол қосайық, бірақ оған қатты сілтемені қолдана отырып, empty_hl
бос жолға үшінші жолды қосайық, бұл жолы оған жұмсақ сілтемені қолдана отырып, empty_sl жіберейік

Файлға сілтемелер басқа каталогтағы файлға (немесе басқа серверге) ағымдағы каталогтағы жергілікті файл сияқты қатынасқыңыз келсе пайдалы.

Енді мен негіздерді қарастырғаннан кейін маған мынаны түсіндіруге рұқсат етіңіз:

Қатты және символдық байланыстардың айырмашылығы неде?

Мұны түсіндіру үшін мен файлдардың нақты табиғатын тереңірек қазып алуым керек.

Біз файлдарды «құрамында» деректер пакетіне ұқсас деп санаймыз. Бұл ақырғы пайдаланушылар үшін пайдалы абстракция, бірақ ядроға қарағанда, бұл файл, мысалы, физикалық жадта орналасқан бірнеше ескертулерге ұқсас, және басқа да бірнеше мәліметтер бөлігімен (бұл деректер қашан жасалған, қашан болған еді) өзгертілген, оны кім және кім иеленген және т. б.) (көбірек білу, инодтарды іздеу).

Бұл басқа файлдың мазмұнына қол жеткізуге мүмкіндік беретін жаңа файл жасағыңыз келсе, сізде екі нұсқа бар: бастапқы файлдағы бірдей жазбалардан тұратын жаңа файл жасай аласыз (деректерге қол жеткізу мекен-жайы, деректердің иесі т.б.) немесе НЕМЕСЕ, сіз жаңа файл жасай аласыз, ол үшін бастапқы файл болады. Біріншісі - қиын сілтеме, ал екіншісі - жұмсақ буын.

rona @ mugwort: ~ / тест $ стат бос
  Файл: «бос»
  Көлемі: 187 блок: 8 IO блок: 4096 қарапайым файл
Құрылғы: 808h / 2056d Inode: 1706426 Сілтемелер: 2
Қатынау: (0664 / -rw-rw-r--) Uid: (1000 / rona) Gid: (1000 / rona)
Кіру: 2017-05-07 21: 30: 15.613353122 -0700
Өзгерту: 2017-05-07 21: 26: 26.182109021 -0700
Өзгерту: 2017-05-07 21: 26: 26.182109021 -0700
 Туған жылы: -
rona @ mugwort: ~ / тест $ stat бос_хл
  Файл: 'empty_hl'
  Көлемі: 187 блок: 8 IO блок: 4096 қарапайым файл
Құрылғы: 808h / 2056d Inode: 1706426 Сілтемелер: 2
Қатынау: (0664 / -rw-rw-r--) Uid: (1000 / rona) Gid: (1000 / rona)
Кіру: 2017-05-07 21: 30: 15.613353122 -0700
Өзгерту: 2017-05-07 21: 26: 26.182109021 -0700
Өзгерту: 2017-05-07 21: 26: 26.182109021 -0700
 Туған жылы: -
rona @ mugwort: ~ / тест $ stat бос емес_sl
  Файл: 'empty_sl' -> 'бос'
  Көлемі: 5 блок: 0 IO блогы: 4096 символдық сілтеме
Құрылғы: 808h / 2056d Inode: 1706413 Сілтемелер: 1
Кіру: (0777 / lrwxrwxrwx) Uid: (1000 / rona) Gid: (1000 / rona)
Кіру: 2017-05-07 21: 26: 17.706140971 -0700
Өзгерту: 2017-05-07 21: 26: 02.522199049 -0700
Өзгерту: 2017-05-07 21: 26: 02.522199049 -0700
 Туған жылы: -

Бұл қатты сілтемелер мен жұмсақ сілтемелер арасындағы бірнеше айырмашылықтарға әкеледі. Қатты сілтеме бастапқы файлды емес, тек «мазмұндағы» файлдағы өзгерістерді көрсетеді, ал жұмсақ сілтеме бастапқы файлдағы өзгерістерді көрсетеді.

Мысалы, «бос» файлы және оның «empty_hl» қатты сілтемесі сол деректерге нұсқайды. «Empty_sl» жұмсақ сілтемесі бұл деректерді көрсетпейді, бірақ «бос» деп шешеді, ол жасайды. Егер біз «empty_hl» -де көрсетілген мекен-жайдағы деректерді өзгертсек, үш файл - «бос», «бос_hl» және «empty_sl» - бұл өзгерісті көрсетеді.

rona @ mugwort: ~ / test $ echo «бос жолмен көрсетілген мекен-жайдағы деректерді өзгертейік»> empty_hl
rona @ mugwort: ~ / тест $ мысық бос
бос көрсетілген көрсетілген мекен-жай бойынша деректерді өзгертейік
rona @ mugwort: ~ / тест мысық бос_хл
бос көрсетілген көрсетілген мекен-жай бойынша деректерді өзгертейік
rona @ mugwort: ~ / тестке мысық бос_sl
бос көрсетілген көрсетілген мекен-жай бойынша деректерді өзгертейік

ДЕГЕН, егер біз деректердің өзін өзгертпесек, бірақ «бос» сілтеме (бос мекен-жаймен көрсетілген) қандай болса, «empty_sl» жұмсақ сілтемесі бұл өзгерісті көрсетеді, бірақ «empty_hl» қатты сілтемесі болмайды.

rona @ mugwort: ~ / сынақ $ бас ~ / .bash_history -n2> copy_of_bash_history
rona @ mugwort: ~ / тест $ ll
барлығы 20
drwxrwxr-x 2 rona rona 4096 8 мамыр 00:07 ./
drwxr-xr-x 37 rona rona 4096 7 мамыр 19:39 ../
-rw-rw-r-- 1 rona rona 55 мамыр 8 00:07 copy_of_bash_history
-rw-rw-r-- 2 rona rona 43 мамыр 7 23:53 бос
-rw-rw-r-- 2 rona rona 43 мамыр 7 мамыр 23:53 бос_хл
lrwxrwxrwx 1 rona rona 5 мамыр 7 21:26 empty_sl -> бос
rona @ mugwort: ~ / тест $ mv copy_of_bash_history бос
rona @ mugwort: ~ / тест $ ll
барлығы 16
drwxrwxr-x 2 rona rona 4096 8 мамыр 00:07 ./
drwxr-xr-x 37 rona rona 4096 7 мамыр 19:39 ../
-rw-rw-r-- 1 rona rona 55 мамыр 8 00:07 бос
-rw-rw-r-- 1 rona rona 43 мамыр 7 мамыр 23:53 бос_хл
lrwxrwxrwx 1 rona rona 5 мамыр 7 21:26 empty_sl -> бос
rona @ mugwort: ~ / тест $ мысық бос
sudo apt mysql-серверді орнатыңыз
sudo apt орнатыңыз apache2
rona @ mugwort: ~ / тестке мысық бос_sl
sudo apt mysql-серверді орнатыңыз
sudo apt орнатыңыз apache2
rona @ mugwort: ~ / тест мысық бос_хл
бос деректерді өзгертейік

Енді егер біз «бос» бастапқыда көрсетілген (бірақ енді көрсетпейді) деректерді өзгертсек, «бос» да, «бос_sl» де бұл өзгерісті көрсетпейді.

rona @ mugwort: ~ / test $ echo «алдымен көрсетілген бос деректерді өзгертейік»> empty_hl
rona @ mugwort: ~ / тест мысық бос_хл
басында көрсетілген бос деректерді өзгертейік
rona @ mugwort: ~ / тест $ мысық бос
sudo apt mysql-серверді орнатыңыз
sudo apt орнатыңыз apache2
rona @ mugwort: ~ / тестке мысық бос_sl
sudo apt mysql-серверді орнатыңыз
sudo apt орнатыңыз apache2

Тағы бір мысал ретінде, егер біз «бос» дегенді жоятын болсақ, «empty_sl» жұмсақ сілтемесі бұзылады, өйткені оған тәуелді файл енді болмайды. Біздің «boş_hl» деген қате сілтемесі өзгермейді, өйткені ол «бос» дегенге тәуелді емес.

rona @ mugwort: ~ / тест $ rm бос
rona @ mugwort: ~ / тест $ ll
барлығы 12
drwxrwxr-x 2 rona rona 4096 8 мамыр 00:26 ./
drwxr-xr-x 37 rona rona 4096 7 мамыр 19:39 ../
-rw-rw-r-- 1 rona rona 55 мамыр 8 00:22 бос_хл
lrwxrwxrwx 1 rona rona 5 мамыр 7 21:26 empty_sl -> бос
rona @ mugwort: ~ / тестке мысық бос_sl
cat: empty_sl: Мұндай файл немесе каталог жоқ
rona @ mugwort: ~ / тест мысық бос_хл
басында көрсетілген бос деректерді өзгертейік

Мұның басты салдары: егер сіз файлдық жүйенің жұмысының файл сілтемесіне әсерін түсінгіңіз келсе, онда файлдық жүйенің әрекеті нақты не істейтінін білуіңіз керек: ол файлдың өзін өзгерте ме, әлде файлмен көрсетілген деректерді өзгерте ме? Жауапқа байланысты, ол сіздің қатты / жұмсақ сілтемеңізді «бұзуы» немесе болмауы мүмкін!

Алайда, сіз осы есептеуді жасағаннан кейін, сіз қатаң немесе жұмсақ сілтеме сіздің мақсатыңызға сәйкес келетін сілтеме түрі болып табылатындығын анықтай аласыз. Сонымен, дауыл! Файлдық сілтемелер керемет емес пе?

(Жауабы иә.)

* Фи, таңқалар болсаңыз, жоғарыдағы суреттегі «қатты» шұжық байланыстары - тәтті қытай шұжықтары, ал «жұмсақ» шұжық байланыстары - чоризо шұжықтары. Бұл әлемде бізде шұжық пен файлдық байланыстардың алуан түрлілігі бар екендігі керемет емес пе?

** Міне, мен осы блогты жазуға кеңес берген ресурстардың тізімі:

  • 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