Niečo o inode

Pravidelne, s cieľom presťahovať sa do CRS, robím pohovory v rôznych veľkých spoločnostiach, prevažne v Petrohrade a Moskve na pozíciu DevOps. Všimol som si, že v mnohých spoločnostiach (v mnohých dobrých spoločnostiach, napríklad v Yandexe) kladú dve podobné otázky:

  • čo je inode;
  • z akých dôvodov môže dôjsť k chybe pri zápise na disk (alebo napríklad: prečo môže dôjsť k nedostatku miesta na disku, podstata je rovnaká).

Ako to často býva, bol som presvedčený, že túto tému poznám dobre, ale len čo som začal vysvetľovať — ukázali sa medzery vo vedomostiach. Aby som systematizoval svoje vedomosti, zaplnil medzery a viac sa neopakoval, píšem tento článok, možno ešte niekomu pomôže.

Začnem "zdola", t.j. s pevným diskom (USB kľúče, SSD a iné moderné zariadenia necháme bokom, pre príklad zvážim akýkoľvek 20 alebo 80 GB starý disk, pretože tam je veľkosť bloku 512 bajtov).

Pevný disk nevie adresovať svoj priestor po bajtoch, podmienečne je rozdelený na bloky. Číslovanie blokov začína od 0. (nazýva sa to LBA, podrobnosti tu: ru.wikipedia.org/wiki/LBA)

Niečo o inode

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

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

Na úrovni vyššie je rozdelenie, jedno pre celý disk (opäť pre jednoduchosť). Najčastejšie sa používajú dve typy rozdelení: msdos a gpt. Teda msdos — starý formát, ktorý podporuje disky do 2 TB, gpt — nový formát, schopný adresovať až 1 zettabajt 512 bajtových blokov. V našom prípade máme rozdelenie typu msdos, ako vidno z obrázku, rozdelenie začína od bloku č. 1, nula sa používa pre MBR.

V prvom rozdelení som vytvoril súborový systém ext2, bežná veľkosť bloku je 4096 bajtov, čo je tiež zobrazené na obrázku. Veľkosť bloku súborového systému môžete zistiť takto:

root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Názov objemu súborového systému:   
Posledné pripojenie na:          
UUID súborového systému:          a600bf40-f660-41f6-a3e6-96c303995479
Magické číslo súborového systému:  0xEF53
Revizia súborového systému #:    1 (dynamická)
Funkcie súborového systému:      ext_attr resize_inode dir_index filetype sparse_super large_file
Príznaky súborového systému:         signed_directory_hash
Predvolené možnosti pripojenia:    user_xattr acl
Stav súborového systému:         čistý
Správanie pri chybách:          Pokračovať
Typ operačného systému súborového systému:       Linux
Počet inode:              65536
Počet blokov:              261888
Počet rezervovaných blokov:     13094
Voľné bloky:              257445
Voľné inody:              65525
Prvý blok:              0
Veľkosť bloku:               4096
Veľkosť fragmentu:            4096
Rezervované GDT bloky:      63
Bloky na skupinu:         32768
Fragmenty na skupinu:      32768
Inody na skupinu:         8192
Inodové bloky na skupinu:   512
Súborový systém vytvorený:       Fri Aug  2 15:02:13 2019
Posledný čas pripojenia:          n/a
Posledný čas zápisu:          Fri Aug  2 15:02:14 2019
Počet pripojení:              0
Maximálny počet pripojení:      -1
Posledná kontrola:             Fri Aug  2 15:02:13 2019
Interval kontroly:           0 ()
Rezervované bloky uid:      0 (užívateľ root)
Rezervované bloky gid:      0 (skupina root)
Prvý inode:              11
Veľkosť inode:               256
Vyžaduje sa extra isize:     28
Požadovaná extra isize:      28
Predvolený hash adresára:   half_md4
Seed hash adresára:      c0155456-ad7d-421f-afd1-c898746ccd76

Naším potrebným parametrom je „Veľkosť bloku“.

Teraz sa dostávame k najzaujímavejšiemu, ako prečítať súbor /home/serp/testfile? Súbor sa skladá z jedného alebo viacerých blokov súborového systému, kde sú uložené jeho dáta. Ako ho nájsť, ak poznáme názov súboru? Ktoré bloky čítať?

Tu nám pomôžu inody. V súborovom systéme ext2fs existuje „tabuľka“, ktorá obsahuje informácie o všetkých inode. Počet inode sa nastavuje pri vytváraní súborového systému. Potrebné čísla nájdeme v parametri „Počet inodov“ výstupu tune2fs, t.j. máme 65536 kusov. V inode sú uložené potrebné informácie: zoznam blokov súborového systému pre hľadaný súbor. Ako nájsť číslo inode pre zadaný súbor?

Zodpovednosť medzi menom a číslom inode sa nachádza v adresári, a adresár v ext2fs je špeciálny typ súboru, t.j. má tiež svoje vlastné číslo inode. Aby sme roztrhli tento zlý kruh, pridelili sme „fixné“ číslo inode „2“ pre koreňový adresár. Pozrime sa na obsah inode čísla 2:

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

Inode: 2   Typ: adresár    Mód:  0755   Príznaky: 0x0
Generácia: 0    Verzia: 0x00000000:00000002
Užívateľ:     0   Skupina:     0   Veľkosť: 4096
File ACL: 0    Directory ACL: 0
Odkazy: 3   Počet blokov: 8
Fragment:  Adresa: 0    Číslo: 0    Veľkosť: 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
Veľkosť extra polí inode: 28
BLOKY:
(0):579
CELKOVO: 1

Ako vidno, potrebná nám adresárová štruktúra sa nachádza v bloku s číslom 579. V nej nájdeme číslo uzla pre zložku home a tak ďalej po reťazci, kým v adresári serp neuvidíme číslo uzla pre požadovaný súbor. Ak by sa niekomu chcelo overiť, či je číslo správne a či tam sú 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 záznamov vstupných
1+0 záznamov výstupných
4096 bajtov (4,1 kB) skopírovaných, 0,000184088 s, 22,3 MB/s
root@ubuntu:~# hexdump -c /home/serp/dd_image

Vo výstupe je možné prečítať názvy súborov v adresári.

A teraz sa dostávam k hlavnej otázke: „z akých dôvodov môže vzniknúť chyba zápisu“?

Samozrejme sa to stane, ak nebudú voľné bloky súborového systému. Čo môžeme v tomto prípade urobiť? Okrem očividného „vymazať niečo zbytočné“ je potrebné si pamätať, že v súborových systémoch ext2,3 a 4 existuje taká vec, ako „Rezervovaný blokový počet“. Ak sa pozrieme na výpis vyššie, máme takých blokov „13094“. Toto sú bloky dostupné na zápis iba pre používateľa root. Ale ak treba rýchlo vyriešiť problém, ako dočasné riešenie môžeme sprístupniť ich pre všetkých, čím sa objaví trochu voľného miesta:

root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Nastavenie percenta rezervovaných blokov na 0% (0 blokov)

T.j. predvolene máte pre zápis nedostupných 5% diskového priestoru, a zohľadňujúc objemy moderných diskov, to môžu byť stovky gigabajtov.

Čo môže byť ešte? Ďalšia možná situácia je, keď voľné bloky sú, ale uzly sa minuli. Toto sa zvyčajne stáva, ak máte v súborovom systéme množstvo súborov menších ako veľkosť bloku súborového systému. Zohľadňujúc, že na 1 súbor alebo adresár sa používa 1 inode a celkovo ich máme (pre tento súborový systém) 65536 — situácia je viac než reálna. To je možné vidieť v príkaze 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 sa dobre ukazuje na oddiele /var/www, počet voľných blokov súborového systému a počet voľných inode sa výrazne líši.

V prípade, že dôjdu inode, nenápovediem, pretože ich nie je (ak sa mýlim, dajte vedieť). Takže pre oddiely, v ktorých sa množia malé súbory, by ste mali múdro vybrať súborový systém. Napríklad vo vtrfs sa inode nikdy neskončia, pretože sa dynamicky vytvárajú nové podľa potreby.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster