Niečo o inode

Aby som sa mohol presunúť do Centrálneho distribučného centra, pravidelne robím pohovory v rôznych veľkých spoločnostiach, najmä v Petrohrade a Moskve, na pozíciu DevOps. Všimol som si, že veľa spoločností (veľa dobrých spoločností, napríklad Yandex) kladie dve podobné otázky:

  • čo je inode;
  • z akých dôvodov sa môže vyskytnúť chyba pri zápise na disk (alebo napríklad: prečo vám môže dôjsť miesto na disku, podstata je rovnaká).

Ako sa často stáva, bol som si istý, že túto tému dobre poznám, no hneď ako som začal vysvetľovať, objavili sa medzery vo vedomostiach. Aby som systematizoval svoje vedomosti, doplnil medzery a už sa nehanbil, píšem tento článok, možno sa bude hodiť aj niekomu inému.

Začnem zdola, t.j. z pevného disku (vyhodíme flash disky, SSD a ďalšie moderné veci; vezmime napríklad do úvahy akýkoľvek 20 alebo 80 gigový starý disk, pretože veľkosť bloku je 512 bajtov).

Pevný disk nevie, ako riešiť svoj priestor bajt po byte, je podmienene rozdelený do blokov. Číslovanie blokov začína od 0. (Toto sa nazýva LBA, podrobnosti tu: ru.wikipedia.org/wiki/LBA)

Niečo o inode

Ako vidno z obrázku, ako úroveň HDD som označil bloky LBA. Mimochodom, akú veľkosť bloku má váš disk, môžete vidieť takto:

root@ubuntu:/home/serp# blockdev --getpbsz /dev/sdb
512

Úroveň vyššie je oddiel, jeden pre celý disk (opäť pre jednoduchosť). Najčastejšie sa používajú dva typy značiek oddielov: msdos a gpt. V súlade s tým je msdos starý formát, ktorý podporuje disky do 2 TB, gpt je nový formát schopný adresovať až 1 zettabajt 512 bajtových blokov. V našom prípade máme oddiel typu msdos, ako je z obrázku vidieť, oddiel začína blokom č.1, pričom pre MBR sa používa nula.

V prvom oddiele som vytvoril súborový systém ext2, jeho predvolená veľkosť bloku je 4096 bajtov, čo sa odráža aj na obrázku. Veľkosť bloku súborového systému môžete zobraziť takto:

root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          a600bf40-f660-41f6-a3e6-96c303995479
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65536
Block count:              261888
Reserved block count:     13094
Free blocks:              257445
Free inodes:              65525
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      63
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Fri Aug  2 15:02:13 2019
Last mount time:          n/a
Last write time:          Fri Aug  2 15:02:14 2019
Mount count:              0
Maximum mount count:      -1
Last checked:             Fri Aug  2 15:02:13 2019
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      c0155456-ad7d-421f-afd1-c898746ccd76

Parameter, ktorý potrebujeme, je „Veľkosť bloku“.

Teraz je zaujímavá časť, ako čítať súbor /home/serp/testfile? Súbor pozostáva z jedného alebo viacerých blokov systému súborov, v ktorých sú uložené jeho údaje. Poznáte názov súboru, ako ho nájsť? Ktoré bloky mám čítať?

Tu sa hodia inody. Súborový systém ext2fs má „tabuľku“, ktorá obsahuje informácie pre všetky inody. Počet inodov v prípade ext2fs sa nastavuje pri vytváraní súborového systému. Pozeráme sa na požadované čísla v parametri “Inode count” výstupu tune2fs, t.j. máme 65536 kusov. Inode obsahuje informácie, ktoré potrebujeme: zoznam blokov systému súborov pre súbor, ktorý hľadáme. Ako nájsť číslo inódu pre daný súbor?

Zodpovedajúci názov a číslo inodu sú obsiahnuté v adresári a adresár v ext2fs je špeciálny typ súboru, t.j. má tiež svoje vlastné inodové číslo. Na prelomenie tohto začarovaného kruhu bolo koreňovému adresáru priradené „pevné“ číslo inódu „2“. Pozrime sa na obsah inodu číslo 2:

root@ubuntu:/# debugfs /dev/sdb1
debugfs 1.42.9 (4-Feb-2014)
debugfs:  stat <2>

Inode: 2   Type: directory    Mode:  0755   Flags: 0x0
Generation: 0    Version: 0x00000000:00000002
User:     0   Group:     0   Size: 4096
File ACL: 0    Directory ACL: 0
Links: 3   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x5d43cb51:16b61bcc -- Fri Aug  2 16:34:09 2019
 atime: 0x5d43c247:b704301c -- Fri Aug  2 15:55:35 2019
 mtime: 0x5d43cb51:16b61bcc -- Fri Aug  2 16:34:09 2019
crtime: 0x5d43b5c6:00000000 -- Fri Aug  2 15:02:14 2019
Size of extra inode fields: 28
BLOCKS:
(0):579
TOTAL: 1

Ako vidíte, adresár, ktorý potrebujeme, sa nachádza v bloku číslo 579. V ňom nájdeme číslo uzla pre domovský priečinok a tak ďalej v reťazci, až kým v adresári serp neuvidíme číslo uzla pre požadovaný súbor. Ak zrazu chce niekto skontrolovať, či je číslo správne a či sú tam potrebné informácie, nie je to ťažké. Robíme:

root@ubuntu:/# dd if=/dev/sdb1 of=/home/serp/dd_image bs=4096 count=1 skip=579
1+0 records in
1+0 records out
4096 bytes (4,1 kB) copied, 0,000184088 s, 22,3 MB/s
root@ubuntu:/# hexdump -c /home/serp/dd_image

Vo výstupe si môžete prečítať názvy súborov v adresári.

Dostávam sa teda k hlavnej otázke: "z akých dôvodov môže dôjsť k chybe pri nahrávaní?"

Prirodzene sa to stane, ak v systéme súborov nezostanú žiadne voľné bloky. Čo sa dá v tomto prípade urobiť? Okrem zrejmého „odstrániť všetko nepotrebné“ by ste mali pamätať na to, že v súborových systémoch ext2,3 a 4 existuje niečo ako „počet rezervovaných blokov“. Ak sa pozriete na zoznam vyššie, máme „13094“ takýchto blokov. Toto sú bloky, do ktorých môže zapisovať iba používateľ root. ale ak potrebujete rýchlo vyriešiť problém, ako dočasné riešenie ich môžete sprístupniť všetkým, čím získate voľné miesto:

root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Setting reserved blocks percentage to 0% (0 blocks)

Tie. štandardne máte 5 % diskového priestoru, ktorý nie je k dispozícii na zápis, a vzhľadom na objem moderných diskov to môžu byť stovky gigabajtov.

Čo iné by to mohlo byť? Je tiež možné, že existujú voľné bloky, ale už nie sú žiadne uzly. Zvyčajne sa to stane, ak máte v systéme súborov veľa súborov, ktoré sú menšie ako veľkosť bloku systému súborov. Ak vezmeme do úvahy, že na 1 súbor alebo adresár sa minie 1 inode a celkovo ich máme (pre daný súborový systém) 65536 - situácia je viac než reálna. To možno jasne vidieť z výstupu príkazu df:

serp@ubuntu:~$ df -hi
Filesystem     Inodes IUsed IFree IUse% Mounted on
udev             493K   480  492K    1% /dev
tmpfs            493K   425  493K    1% /run
/dev/xvda1       512K  240K  273K   47% /
none             493K     2  493K    1% /sys/fs/cgroup
none             493K     2  493K    1% /run/lock
none             493K     1  493K    1% /run/shm
none             493K     2  493K    1% /run/user
/dev/xvdc1       320K  4,1K  316K    2% /var
/dev/xvdb1        64K   195   64K    1% /home
/dev/xvdh1       4,0M  3,1M  940K   78% /var/www
serp@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2,0G  4,0K  2,0G   1% /dev
tmpfs           395M  620K  394M   1% /run
/dev/xvda1      7,8G  2,9G  4,6G  39% /
none            4,0K     0  4,0K   0% /sys/fs/cgroup
none            5,0M     0  5,0M   0% /run/lock
none            2,0G     0  2,0G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/xvdc1      4,8G  2,6G  2,0G  57% /var
/dev/xvdb1      990M  4,0M  919M   1% /home
/dev/xvdh1       63G   35G   25G  59% /var/www

Ako je jasne vidieť na oddiele /var/www, počet voľných blokov v súborovom systéme a počet voľných uzlov sa značne líšia.

V prípade, že vám dôjdu inódy, nepoviem vám žiadne kúzla, pretože... nie sú žiadne (ak sa mýlim, dajte mi vedieť). Takže pre oddiely, v ktorých sa množia malé súbory, by ste mali zvoliť súborový systém múdro. Napríklad inody btrfs nemôžu skončiť, pretože V prípade potreby sa dynamicky vytvárajú nové.

Zdroj: hab.com

Pridať komentár