![]() |
| By By Lew Pitcher Учествијем у око 30 њусгрупа и питања увек пристижу. Одговорио сам на нека од њих са одговором који је довољан да реши проблем. Ево једног одговора. Питање: Која је разлика између меког (soft) и тврдог (hard) линка. Одговор: Јуникс фајлови имају 2 дела, податак и име фајла. Податак је повезан са нечим што се зове инод. Инод има мапу где је податак, овлашћење приступа, итд.
.--------------- податак
/ +---------+
Адреаса податка, овлашћење приступа
+------------ инод --------------+
Име фајла садржи име и инод број.
.-------------- Адреаса податка, овлашћење приступа
/ +--------- инод -------------+
Име фајла, инод број
+--------------------+
Више фајлова може да има везу са једним инод бројем. Ови фајлови су `тврдо` повезани.
! име фајла, инод !
+--------------------+
\
-------------- Адреаса податка, овлашћење приступа
/ +--------- инод -------------+
! друго име фајла, инод !
+---------------------+
Такође постоји специјалан фајл чији податак садржи стазу то другог фајла.
Оперативни систем види овај фајл као стазу, тако да усмерава писање и читање података до другог фајла. Овај специјални фајл је Меки линк.
! име фајла, инод !
+--------------------+
\
.------- ! Адреаса податка, овлашћење приступа
+--------- инод -------------+
/
/
/
.----------------------------------------------'
(
' !стаза до другог фајла!
+---------податак-------------+
/ }
.~ ~ ~ ~ ~ ~ ~ }-- (усмерен ..)
( }
' ! име фајла, инод !
+--------------------+
\
'------------! Адреаса податка, овлашћење приступа !
+---------инод -------------+
/
/
.----------------------------------------------------'
(
! податак!! податак !
+------+ +------+
Постоји и специјални фајл, који се зове директоријум. Он садржи имена фајлова у директоријуму.
Замисли ово као групу имена фајлова. Када се директоријум креира, у почетку садржи имена фајлова два специјална фајла `.` и `..` Име фајла за `.` садржи инод директоријум фајла где је податак креиран. `.` је тврди линк до фајла текућег директоријума. Име фајла за `..` је попуњен са инодом директоријума који садржи фајл име текућег директоријума. `..` је тврди линк до фајла непосредног родитеља текућег директоријума. Команда 'ln' зна како да креира тврде и меке линкове. Команда 'mkdir' зна како да креира директоријуме (оперативни систем води рачуна о тврдим линковима). Постоје ограничења шта може бити тврди линк (оба линка морају бити у истом фајл систему, изворни фајл мора постојати, итд). Ове ограничења не важе за меке линкове (изворни и цињни фајл могу бити на одвојеним фајл системима, изворни фајл не мора да постоји, итд) Али меки линк има друга ограничења која нема тврди линк (додатни ИО неопходан за приступ фајлу, додатни простор који заузима меки линк фајл податак, итд). Другим речима, компромис мора да се направи код оба линка. Хајде да демонстрирамо неке од примера ... Команда `ln` у акцији Креирајмо фајл у празном директоријуму. ~/directory $ ls -lia total 3 73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:16 . 91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:16 .. ~/directory $ echo "This is a file" >basic.file ~/directory $ ls -lia total 4 73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:17 . 91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:16 .. 73478 -rw-r--r-- 1 lpitcher users 15 Mar 11 20:17 basic.file ~/directory $ cat basic.file This is a fileСада креирајмно тврди линк до фајла. ~/directory $ ln basic.file hardlink.file ~/directory $ ls -lia total 5 73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:20 . 91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:18 .. 73478 -rw-r--r-- 2 lpitcher users 15 Mar 11 20:17 basic.file 73478 -rw-r--r-- 2 lpitcher users 15 Mar 11 20:17 hardlink.file ~/directory $ cat hardlink.file This is a fileВидимо да:
~/directory $ chmod a+w basic.file ~/directory $ ls -lia total 5 73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:20 . 91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:18 .. 73478 -rw-rw-rw- 2 lpitcher users 15 Mar 11 20:17 basic.file 73478 -rw-rw-rw- 2 lpitcher users 15 Mar 11 20:17 hardlink.fileонда исто овлашћење приступа се промени на hardlink.file. Два фајла (basic.file и hardlink.file) деле исти инод и податке али имају различито име. Хајде да креирамо меки линк до оригиналног фајла. ~/directory $ ln -s basic.file softlink.file ~/directory $ ls -lia total 5 73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:24 . 91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:18 .. 73478 -rw-rw-rw- 2 lpitcher users 15 Mar 11 20:17 basic.file 73478 -rw-rw-rw- 2 lpitcher users 15 Mar 11 20:17 hardlink.file 73479 lrwxrwxrwx 1 lpitcher users 10 Mar 11 20:24 softlink.file --> basic.file ~/directory $ cat softlink.file This is a fileОвде видимо да иако softlink.file приступа истим подацима као basic.file и hardlink.file, он не дели исти инод (73479 у односу на 73478) и нема иста овлашћења приступа. Има ново овлашћење приступа: 'l' (меки линк) знак. Ако обришемо basic.file: ~/directory $ rm basic.file ~/directory $ ls -lia total 4 73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:27 . 91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:18 .. 73478 -rw-rw-rw- 1 lpitcher users 15 Mar 11 20:17 hardlink.file 73479 lrwxrwxrwx 1 lpitcher users 10 Mar 11 20:24 softlink.file ->basic.fileонда не можемо више приступити повезаним подацима преко меког линка. ~/directory $ cat softlink.file cat: softlink.file: No such file or directoryАли још увек имамао присту оригиналним подацима преко тврдог линка. ~/directory $ cat hardlink.file This is a fileПриметићеш да када обришемо оригинални фајл, тврди линк није обрисан. Ако би смо обрисали меки линк, оригинални фајл не би нестао. Додане информације у вези тврдих линкова Када обришеш фајл, део који садржи податке није обрисан док сви делови који садрже име фајла нису обрисани. Постоји бројач у иноду, који показује колико имена фајлова води то фајла. Бројач се смањује за један сваки пут када се обрише неки од имена фајлова. Када бројач постане нула, инод и подаци се бришу. Бројач такође показује колико пута је фајл био отворен и не затворен (другим речима, колико показивача је још увек активно). Овде има `рачвања` које није очигледно на први поглед: обриши фајл тако да нема имена фајла који води до инода, али пошто је фајл још увек отворен, простор који заузимају подаци није ослобођен. Да ли ти се ово некад десило: приметио си да /var/log/messages (или нека друга врста `syslog` фајла) превише расте и ти радиш следеће rm /var/log/messages touch /var/log/messagesда повратиш простор на диску, али се он не појављује. Ово је зато што, иако си обрисао име фајла, постоји процес који држи део са подацима још увек отворен (syslogd), и оперативни систем неће ослободити простор док процес не затвори део са подацима. Да би у потпуноси ослободио простор, уради следеће kill -SIGHUP `cat /var/run/syslogd.pid`да би syslogd затворио и поново отворио фајл. Можеш да користиш ово као додатак програмима: да ли си се некада питао како да сакријеш привремени фајл? па, уради следеће
{
FILE *fp;
fp = fopen("some.hidden.file","w");
unlink("some.hidden.file"); /* deletes the filename part */
/* some.hidden.file no longer has a filename and is truely hidden */
fprintf(fp,"This data won't be found\n"); /* access the data part */
/*etc*/
fclose(fp); /* finally release the data part */
}
Напомена преводиоца: Ја сам 100% аматер у превођењу и веома се двоумим када треба да преведем неке речи карактеристичне за област рачунара. Биће ми драго ако има оних који су вештији у превођењу и вољни да развијају овај сајт. | |||