(3) Solaris 10 - Suborove sucasti

12.07.2008 22:35

V dnesnom dieli sa pozrieme, ako funguje UFS (UNIX filesystem), ako rozpozname rozne typy suborov a povieme si co-to o tzv. hardlinkach.

Uvod o sucastiach suboru

Vsetky subory pouzivane v Solaris OS su reprezentovane svojim nazvom - filename a zaznamom, ktory sa nazyva inode. Vo vsebecnosti, filename je asociovany s inodom a inod je asociovany s prislusnym datovym blokom (blokmi).

V tomto obrazku si ukazeme asociaciu medzi adresarom, subormi v nom a preprezentaciou tychto suborov.

V generale: adresar samotny neobsahuje ziadne data. Adresar neobsahuje subory. Adresar je "iba" jeden jednoduchy zoznam, ktory obsahuje nazvy suborov, ktore "zhrnuje" a cislo inodu, ktore prislucha danemu fajlu.

Prikazom #ls -lai si vieme vypisat cisla inodov, na ktore odkazuje dany file(name). Cislo inodu sa nachadza v 1. kolonke vypisu.

20:40:23 (21) root@sol10-01:/export/home/schrapnel # ls -lai
total 16
        4 drwxr-xr-x  2 schrapnel other        512 Jul 12 20:40 .
        2 drwxr-xr-x  4 root    root        512 Jul  8 16:48 ..
        9 -rw-------  1 schrapnel other          4 Jul  8 16:48 .bash_history
        5 -rw-r--r--  2 schrapnel other        144 Jul  8 16:48 .profile
        5 -rw-r--r--  2 schrapnel other        144 Jul  8 16:48 hardlink_na_profile
        6 -rw-r--r--  1 schrapnel other        136 Jul  8 16:48 local.cshrc
        7 -rw-r--r--  1 schrapnel other        157 Jul  8 16:48 local.login
        8 -rw-r--r--  1 schrapnel other        174 Jul  8 16:48 local.profile

Pozorny citatel si isto vsimol subor, hardlink_na_profile, ktory ma zhodou okolnosti ten isty inode number ako subor .profile. Pozornemu citatelovi necham cas na porozmyslanie, budeme sa tomu venovat dalej :-)

Tu si mozeme pozriet strukturu inodu:

Ako vidime, inod obsahuje dalsie casti, potrebne pre adresaciu miesta pri velmi velkych suboroch. Tzv. direct data blocks su pointery, ktore odkazuju rovno na data blocky. Pocet tychto odkazov je samozrejme obmadzeny. Preto inod obsahuje aj tzv. single indirect data block, ktory odkazuje na dalsi inod, v ktorom sa vyuziju direct data bloky pre adresovanie dalsieho miesta data blockmi. Ak to nestaci, dalsia cast - double indirect data block obsahuje na dalsi inod, ktory odkazuje na inody, ktore pouzivaju dalsie single indirect data bloky atd atd. Sucastna verzia UFS takto pracuje az do triple indirect bloku. Tymto sposobom je mozne zaadresovat maximalne velky subor o velkosti 2^73 bajtov (8 ZiB). Ak to bude niekedy malo, nie je problem do specifikacie UFS pridat quad indirect data block a mame zas na istu dobu vystarano. ;)

Takze si to zhrnme:

File name

Filename je objekt, najcastiejsie pouzity pre pristup a na manipulaciu so suborom. Subor musi obsahovat meno, ktore je asociovane s inodom.


Inod

Inod je objekt, ktory Solaris OS pouziva na zapis informacie o subore. Vo vseobecnosti, inod obsahuje 2 casti. Prva obsahuje informacie o subore, jeho ownerovi, o pravach suboru, jeho velkosti a pod. Druha cast obsahuje pointery na data bloky prisluchajuce obsahu suboru.

Inody su cislovane a kazdy filesystem obsahuje svoj vlastny zoznam inodov. Vzdy, ked je vytvoreny novy subor, zoznam inodov je o tento novy inod doplneny.


Data block

Data block je jednotka diskoveho priestoru urcena na uchovavanie dat. Regulerne subory, adresare a symbolicke linky pouzivaju (odkazuju) na data blocky. Device files (subory zariadeni) nebsahuju data blocky.

Identifikacia typov suborov

Solaris OS podporuje standardny set typov suborov, ake mozme najst v skoro vsetkych UNIXovych OS. Subor ako taky, nam umoznuje ukladat data, pracovat so zariadeniami, resp prevadzkovat nejaku medzi-procesovu komunikaciu. Z mnohych roznych typov suborov, ktore mozme najst v Solaris OS, su tieto 4 najhlavnejsie:

  • Standardne, bezne subory
  • Adresare
  • Symbolicke linky
  • Subory zariadeni (device files)

Bezne subory, adresare a symbolicke linky, vsetky tieto typy suborov obsahuju v istom ponimani data. Naopak, device files, ziadne data neobsahuju. Device files nam dovoluju pristupovat k zariadeniam samotnym.

Na zistenie typu suboru, nam velmi posluzi prikaz ls -l

21:24:39 (31) root@sol10-01:/ # cd /etc/
21:24:42 (32) root@sol10-01:/etc # ls -l
total 658
lrwxrwxrwx  1 root    root          14 Jul  6 19:20 TIMEZONE -> ./default/init
drwxr-xr-x  6 root    other        512 Jul 11 18:32 X11
drwxr-xr-x  2 adm      adm          512 Jul  6 19:29 acct
-rw-r--r--  1 root    sys          253 Feb 28 16:00 aggregation.conf
lrwxrwxrwx  1 root    root          14 Jul  6 19:54 aliases -> ./mail/aliases
drwxr-xr-x  6 root    other        512 Jul  6 19:21 amd64
drwxr-xr-x  7 root    bin          512 Jul  6 19:30 apache
drwxr-xr-x  2 root    bin          512 Jul  6 19:31 apache2
drwxr-xr-x  2 root    other        512 Jul  6 19:31 apoc
-rw-r--r--  1 root    bin          194 Jan 22  2005 auto_home
-rw-r--r--  1 root    bin          248 Jan 22  2005 auto_master

21:26:10 (33) root@sol10-01:/etc # cd /devices/pci\@0\,0/
21:26:38 (34) root@sol10-01:/devices/pci@0,0 # ls -la
total 18
drwxr-xr-x  9 root    sys          512 Jul  6 20:08 .
drwxr-xr-x  2 root    sys          512 Jul 11 18:31 ..
drwxr-xr-x  2 root    sys          512 Jul  6 20:05 display@f
crw-------  1 root    root      99,  0 Jul  6 20:08 display@f:text-0
drwxr-xr-x  3 root    sys          512 Jul  6 20:05 pci-ide@7,1
drwxr-xr-x  8 root    sys          512 Jul  6 20:05 pci1000,30@10
crw-------  1 root    sys      169,  0 Jul 12 21:11 pci1000,30@10:devctl
crw-------  1 root    sys      169,  1 Jul 12 21:11 pci1000,30@10:scsi
drwxr-xr-x  2 root    sys          512 Jul  6 20:05 pci1022,2000@11
crw-------  1 root    sys      10,  1 Jul 12 21:11 pci1022,2000@11:pcn0
drwxr-xr-x  2 root    sys          512 Jul  6 20:05 pci1022,2000@12
crw-------  1 root    sys      10,  2 Jul 12 21:11 pci1022,2000@12:pcn1
drwxr-xr-x  2 root    sys          512 Jul  6 20:05 pci1022,2000@13
crw-------  1 root    sys      10,  3 Jul 12 21:11 pci1022,2000@13:pcn2
drwxr-xr-x  2 root    sys          512 Jul  6 20:05 pci8086,7191@1
crw-------  1 root    sys      84, 255 Jul 12 21:11 pci8086,7191@1:devctl

Ako vidime, mame tu celkom peknu zbierku typov suborov. Podla 1. znaku 1. kolonky (ktora nam mimo ineho vypisuje aj prava suboru), si vieme zistit o aky typ suboru ide.

-
regulerny subor
d
adresar (directory)
l
symbolicka linka (link)
b
blokovo orientovany device file
c
znakovo (character) orientovany device file

Adresar (directory)
Adresar obsahuje informaciu, ktora asociuje nazov suboru s inodom jemu prisluchajucim. Na rozdiel od regulernych suborov, ktore dokazu obsahovat rozne druhy obsahu, adresar dokaze drzat iba nazov-a-inod zoznam.

Regulerny subor
V podstate najrozsirenejsi druh subory pouzity v Solaris OS. Nebudem sa rozpisovat, co vsetko moze obsahovat, isto so subormi pracujete vsetci:-)

Symbolicka linka
Symbolicka linka je subor, ktory odkazuje na iny subor. Podobne ako adresar, obsahuje iba informacie tykajuce sa adresara, symbolicka linka obsahuje iba 1 druh informacie. Cestu k inemu suboru. Pretoze symbolicka linka obsahuje cestu k inemu suboru, moze odkazovat na subory aj na inom filesysteme. Velkost suboru typu symbolicka linka je pocet znakov, ktore obsahuje cesta k suboru, na ktory odkazuje.

21:37:18 (35) root@sol10-01:/devices/pci@0,0 # cd /
21:37:20 (36) root@sol10-01:/ # ls -l bin
lrwxrwxrwx  1 root    root          9 Jul  6 19:20 bin -> ./usr/bin

Symbolicke linky mozu odkazovat na regulerne subory, adresare, symbolicke linky a device files. Je mozne pouzit ako absolutne, tak aj relativnu cestu.

21:38:59 (44) root@sol10-01:/a # ls -l
total 0
-rw-r--r--  1 root    root          0 Jul 12 21:38 file1
21:39:01 (45) root@sol10-01:/a # ln -s file1 file2
21:39:06 (46) root@sol10-01:/a # ls -l
total 2
-rw-r--r--  1 root    root          0 Jul 12 21:38 file1
lrwxrwxrwx  1 root    root          5 Jul 12 21:39 file2 -> file1

Read a Write operacie na symbolicku linku sa prejavia na subore, na ktory odkazuje.

Device file
Device file nam poskutuje pristup k zariadeniam. Na rozdiel od regulerneho suboru, adresaru, ci symbolickej linky, device files nemaju asociacie na data bloky. Naopak, inod obsahuje 2 cisla, ktore reprezentuju dane zariadenie.

21:43:21 (54) root@sol10-01:/ # cd /devices/pci\@0\,0/
21:43:46 (55) root@sol10-01:/devices/pci@0,0 # ls -la | grep pcn
crw-------  1 root    sys      10,  1 Jul 12 21:11 pci1022,2000@11:pcn0
crw-------  1 root    sys      10,  2 Jul 12 21:11 pci1022,2000@12:pcn1
crw-------  1 root    sys      10,  3 Jul 12 21:11 pci1022,2000@13:pcn2

Ako vidime, mame tu subory typu character device. (znakovo orientovany) rozdiel si popiseme neskor. Dolezite su ale 2 kolonky, ktore su za ownerom a grupou tychto suborov. 10,1; 10,2; 10,3 ... Tieto dve cisla sa nazyvaju major a minor number. Major number je specificky identifikator, ktory nam hovori o tom, aky driver zariadenia je potrebny pre pristup k zariadeniu. (iny pre sietovu kartu, iny pre disk a pod). Minor number je identifikator zariadenia patriaci do skupiny minor numbera. Takze 10tka - major number nam hovori v podstate o type zariadenia a minor (1,2,3 ...) o identifikatore zariadeni rovnakeho typu.

Znakovo orientoany device file (character-special device file)
Oznacenie typu suboru "c" nam hovori o znakovo orientovanom datovom zariadeni. Data ktore citame/zapisujeme na toto zariadenie putuju v data streame.

22:02:44 (95) root@sol10-01:/ # ls -la /dev/rdsk/ | grep c1t0d0s2
lrwxrwxrwx  1 root    root          48 Jul  6 19:59 c1t0d0s2 -> ../../devices/pci@0,0/pci1000,30@10/sd@0,0:c,raw

Blokovo orientovany device file (block-special device file)
Oznacenie typu suboru "b" nam jednoznacne hovori o blokovo orientovanom datovom zariadeni. Pre diskove zariadenie, blokovo orientovany pristup nam zabezpeci volania pre IO operacie zalozene na definovanom bloku definovej velkosti. Velkost bloku zavisi od partikularneho zariadenia.

22:02:54 (96) root@sol10-01:/ # ls -la /dev/dsk/ | grep c1t0d0s2
lrwxrwxrwx  1 root    root          44 Jul  6 19:59 c1t0d0s2 -> ../../devices/pci@0,0/pci1000,30@10/sd@0,0:c

Aby sme si lepsie objasnili rozdiel medzi blokovo orientovanymi a znakovo orientovanymi - povedzme to - sposobmi pristupu k zariadeniu, trocha zabrdnem do niektorej z buducich kapitol, kde sa budeme venovat sprave diskov v Solaris OS.
Zoberme si samotny disk, na ktorom je filesystem, data, vsetko mozne. Ak budeme zapisovat na disk cez znakovo orientovany device, zapiseme 1. sektor, 2. sektor, 3.sektor - predstavme si zapis na magneticku pasku. V 1 case pristupujeme k 1. informacii.
Ak ale budeme pristupovat k disku cez blokovo orientovane zariadenie, cez IO operaciu sa nacita 1 blok dat (512b), nahodi sa do cache a pracujeme s celym blokom. Pri zapise sa takisto cely blok cez write zapise. Vyhody/nevyhody/podrobnosti v niektorom z buducich clankov.

Pouzitie Hard Linkov

Hard linka je asociacia medzi nazvom suboru a cislom inodu. Hard linka sa nijak nelisi od bezneho suboru. Kazdy jeden subor je hard linka.

Pred chvilou sme si povedali ze adresar obsahuje asociaciu nazov suboru - cislo inodu. Hard linka je tiez takato asociacia, odkazuje nazov suboru na cislo inodu - na ktory uz odkazuje iny nazov suboru.

22:06:10 (102) root@sol10-01:/ # cd /a
22:06:51 (103) root@sol10-01:/a # rm *
22:08:38 (104) root@sol10-01:/a # mkfile 10m file1
22:08:42 (105) root@sol10-01:/a # ls -li
total 20496
    338182 -rw------  1 root    root    10485760 Jul 12 22:08 file1
22:08:46 (106) root@sol10-01:/a # ln file1 file2
22:08:51 (107) root@sol10-01:/a # ls -li
total 40992
    338182 -rw-------  2 root    root    10485760 Jul 12 22:08 file1
    338182 -rw-------  2 root    root    10485760 Jul 12 22:08 file2

Ako vidime, mame tu 2 subory. file1 a file2. Oba maju svoj nazov a oba nam odkazuju na ten isty inod = ten isty datovy blok. Oba subory su o velkosti 10M. Oba subory zaberaju na disku 10M.

Ak si porovname symbolicku linku a hard linku, mozeme vidiet zopar rozdielov. Symbolicka linka odkazuje na subor. Subor, ktory ma svoje prava, svojho ownera, svoju grupu. Spocitane a podciarknute, symlink ma prava lrwxrwxrwx, cize prava umoznujuce kazdemu vsetko. Samozrejme pri pristupe na symlink narazime na prava suboru, na ktory odkazuje.

Hard linka je v podstate iny nazov pre ten isty suor. Odkazuje sa na ten isty inod, cize pocet inodov sa nezvysuje, pridal sa len dalsi zaznam do listu adresara. Cize, ked zmenime vlastnost 1 suboru, afektuje sa aj druhy subor - hardlinka, pretoze inod je len jeden a ten drzi zaznam o ownerovi, pravach a podobne.

Dalsia vyhoda hardlinkov je, ze ak by som napr. vytvoril ku kazdemu suboru este jednu hardlinku (napr v adresari /backup), zvacsi sa nam pocet inodov ale obsadenie filesystemu nie. Uzivatel moze zmazat svoje subory, nic sa ale nedeje, hardlinky mam stale v backupe a tym padom zarezervovany data block. = neprisiel som o data.

Vytvaranie hard linkov
majme adresar /export/home/schrapnel v ktorom mam svoje data, subor datafile.

        10 -rwx------  1 755      root    1048576 Jul 12 22:24 /export/home/schrapnel/datafile

Mozme si vsimnut relativne nizke cislo inodu (10) je to separatny filesystem a skoro ziadne subory tam niesu = nizke cislo.

Vytvorime k tomuto suboru backup:

22:28:16 (147) root@sol10-01:/export/home/schrapnel # ln datafile datafile_backup
22:28:21 (148) root@sol10-01:/export/home/schrapnel # ls -li | grep datafile
        10 -rwx------  2 755      root    1048576 Jul 12 22:24 datafile
        10 -rwx------  2 755      root    1048576 Jul 12 22:24 datafile_backup

Aby som vam dokazal, ze je to ten a isty file:

22:28:28 (149) root@sol10-01:/export/home/schrapnel # diff datafile datafile_backup
22:29:01 (150) root@sol10-01:/export/home/schrapnel # find . -inum 10
./datafile
./datafile_backup

Program find ma prepinac -inum ktory nam dovoluje hladat subory podla inodov.
Pri dlhom vypise ls -l si takisto mozme vypisat pocet hardlinkov, ktore nam odkazuju na dany datablock (ak =1 - je to regulerny subor, resp jedinecna hardlinka, aj =2 a viac - je zname ze je to dalsia hardlinka)

Mazanie hardlinkov

22:32:02 (157) root@sol10-01:/export/home/schrapnel # ls -l
total 4134
-rwx------  2 755      root    1048576 Jul 12 22:24 datafile
-rwx------  2 755      root    1048576 Jul 12 22:24 datafile_backup
-rw-r--r--  1 schrapnel other        136 Jul  8 16:48 local.cshrc
-rw-r--r--  1 schrapnel other        157 Jul  8 16:48 local.login
-rw-r--r--  1 schrapnel other        174 Jul  8 16:48 local.profile
22:32:04 (158) root@sol10-01:/export/home/schrapnel # rm datafile_backup
22:32:06 (159) root@sol10-01:/export/home/schrapnel # ls -l
total 2070
-rwx------  1 755      root    1048576 Jul 12 22:24 datafile
-rw-r--r--  1 schrapnel other        136 Jul  8 16:48 local.cshrc
-rw-r--r--  1 schrapnel other        157 Jul  8 16:48 local.login
-rw-r--r--  1 schrapnel other        174 Jul  8 16:48 local.profile
22:32:08 (160) root@sol10-01:/export/home/schrapnel #

Ako vidime, po zmazani hardlinku sa nam dekrementoval inode counter z 2 na 1. Miesto sa neuvolnilo ziadne.

V dalsom dieli sa pozrieme na spravu diskov v Solaris OS, fyzicku strukturu disku (sector, track, cylinder, particie - slice-y, name konvenciu podla fyzickeho pripojenia, logicke nazvy (/dev), fyzicke nazvy (/devices) + nejake cachre machre s hardwarom (re-read zariadeni, rekonfiguracny reboot )

    • Re: (3) Solaris 10 - Suborove sucasti 13.07.2008 | 00:30
      Avatar blackhole_tommyhot   Používateľ

      Pekny clanok, ale ako je to s hardlinkami? Celkom som nepochopil (alebo len prehliadol). Ked mam file1 (10MB) a vytvorim na neho hardlink file2, na disku budu dokopy zaberat 20MB?
      ----------
      tommyhot@hackingmachine:~$ microsoft &> /dev/null

      • Re: (3) Solaris 10 - Suborove sucasti 13.07.2008 | 06:03
        schrapnel   Návštevník

        NIe, hardlink je v podstate iny nazov suboru, ktory odkazuje na ten isty inode. = ten isty datablock. Cize mozes ich mat aj 1000, stale su to tie iste data.

        Napr si vsimni pri ls -l kolko hardlinkov ma "tento adresar" "." budu 2. Jeden pre ../tento_adresar a jeden pre "."

        • Re: (3) Solaris 10 - Suborove sucasti 16.07.2008 | 17:07
          Avatar blackhole_matej   Používateľ

          Dalsia vyhoda hardlinkov je, ze ak by som napr. vytvoril ku kazdemu suboru este jednu hardlinku (napr v adresari /backup), zvacsi sa nam pocet inodov ale obsadenie filesystemu nie. Uzivatel moze zmazat svoje subory, nic sa ale nedeje, hardlinky mam stale v backupe a tym padom zarezervovany data block. = neprisiel som o data.

          A preto su imho hardlinky pre zalohy nevhodne - sice ochrania pred zmazanim suboru, ale nie pred prepisanim. Opravte ma niekto, ak sa mylim a na UFS sa pri zmene robi kopia.

          linux-ext3$ echo test > subor-original
          linux-ext3$ ln subor-original subor-zaloha
          linux-ext3$ ls -al subor-*
          -rw-r--r--  2 matej users 5 2008-07-16 17:20 subor-original
          -rw-r--r--  2 matej users 5 2008-07-16 17:20 subor-zaloha
          linux-ext3$ echo bla > subor-original
          linux-ext3$ cat subor-zaloha
          bla

          • Re: (3) Solaris 10 - Suborove sucasti 17.07.2008 | 09:00
            schrapnel   Návštevník

            Jasne, nepisal som ze su odolne voci prepisaniu :-) A jasne ze to nieje plnohodnotna nahrada za backupovacie systemy. Mal som na mysli nestastne zmazanie. Zo specifikacie UFS a hardlinkov je jasne ze sa obsah prepise, ved oba odkazuju na ten isty inod, cize ten isty data block.

    • Re: (3) Solaris 10 - Suborove sucasti 13.07.2008 | 12:35
      Avatar blackhole_ventYl   Používateľ

      1) defakto jediny rozdiel medzi blokovymi a znakovymi zariadeniami je ten, ze znakove zariadenia (mozu, ale nemusia, ani sa to od nich v standardnom rozhrani necaka) podporuju len operaciu rewind (na zaciatok streamu, ak to ma zmysel), kdezto blokove zariadenia podporuju operaciu seek (tiez sice existuje zopar, ktore to nevedia, pretoze to nema zmysel, ale vo vseobecnosti to plati). Bufferovat vstup mozes aj zo znakoveho zariadenia a aj z neho mozes data citat po blokoch (blokujuci read na 512 bytov napr.)

      2) vytvorenie / zrusenie hardlinku nemeni pocet i-nodov. ked vytvoris hardlink, vytvori sa v adresari novy zaznam s rovnakym cislom i-nodu, cize ziadny novy i-nod sa nevytvori. clanok si protireci :) z toho vyplyva, ze nikomu inemu nemozes dat na subor s tym istym i-nodom ine prava, ako mas ty. vytvorenie i-nodu inkrementuje pole refcount o 1. pri mazani suboru z adresara sa v i-node refcount pocitadlo dekrementuje a ked dosiahne 0, je dealokovany aj i-nod.

      ---
      Cuchat s nadchou, to je ako sniffovat bez promiscu.

      --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
      • Re: (3) Solaris 10 - Suborove sucasti 14.07.2008 | 13:10
        schrapnel   Návštevník

        Ah jasne, detajly o hardlinkoch som upravil. Dik za postrehy.

    • Re: (3) Solaris 10 - Suborove sucasti 14.07.2008 | 17:44
      Avatar vektor   Používateľ

      Vyborne popisane, mam len poznamku k uvedeniu: bolo by dobre zdoraznit ze to co popisujes je spolocne pre vsetky unixy, pretoze clovek moze lahko nadobudnut dojem ze si hovoril specificky o Solarise.

      Ale mozno by som len mal pozornejsie citat uvod, to by sa mi potom nestalo ze pocas celeho clanku cakam kedy to uz bude ine ako unix a ono to ani nema byt:)

      EDIT: este pre slepcov ako ja s lesklym panelom: ten uvodny obrazok ma cierne popisky, co sa proti ciernemu pozadiu vynimaju extremne zle:)

      _________________________ There is some SERIOUS sh*t going on right now!
      • Re: (3) Solaris 10 - Suborove sucasti 14.07.2008 | 18:50
        schrapnel   Návštevník

        obrazok som opravil, ten zmrd mal transparency background. jo a mas pravdu; Unix File System neni specificky len pre solaris. ;-) Sorry za zmatenie.

    • Re: (3) Solaris 10 - Suborove sucasti 07.07.2009 | 14:01
      danto   Návštevník

      skvely clanok, velmi mi pomohol ...dakujem autorovi...dufam ze coskoro budu nasledovat dalsie casti.