Nešto o inodeu

Povremeno, da bih prešao u Centralni distributivni centar, intervjuišem u raznim velikim kompanijama, uglavnom u Sankt Peterburgu i Moskvi, za DevOps poziciju. Primijetio sam da mnoge kompanije (mnoge dobre kompanije, na primjer Yandex) postavljaju dva slična pitanja:

  • šta je inode;
  • iz kojih razloga možete dobiti grešku u pisanju na disk (ili na primjer: zašto vam može ponestati prostora na disku, suština je ista).

Kao što se često dešava, bio sam siguran da dobro poznajem ovu temu, ali čim sam počeo da objašnjavam, postale su očigledne praznine u znanju. Kako bih sistematizovao svoje znanje, popunio praznine i više se ne sramotio, pišem ovaj članak, možda će nekome koristiti.

Počeću od dna, tj. sa tvrdog diska (odbacit ćemo fleš diskove, SSD-ove i druge moderne stvari; na primjer, uzmimo u obzir bilo koji disk od 20 ili 80 gigabajta, budući da je veličina bloka 512 bajtova).

Tvrdi disk ne zna kako da adresira svoj prostor bajt po bajt, on je uslovno podeljen na blokove. Numeracija blokova počinje od 0. (Ovo se zove LBA, detalji ovdje: ru.wikipedia.org/wiki/LBA)

Nešto o inodeu

Kao što se vidi sa slike, odredio sam LBA blokove kao nivo HDD-a. Usput, možete vidjeti koju veličinu bloka vaš disk ima ovako:

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

Nivo iznad je particija, jedna za cijeli disk (opet radi jednostavnosti). Najčešće se koriste dvije vrste označavanja particija: msdos i gpt. Shodno tome, msdos je stari format koji podržava diskove do 2Tb, gpt je novi format koji može adresirati do 1 zetabajt blokova od 512 bajta. U našem slučaju imamo particiju tipa msdos, kao što se vidi sa slike, particija počinje blokom br. 1, dok se za MBR koristi nula.

U prvoj particiji sam kreirao ext2 sistem datoteka, njegova podrazumevana veličina bloka je 4096 bajtova, što je takođe prikazano na slici. Možete pogledati veličinu bloka sistema datoteka ovako:

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

Parametar koji nam je potreban je “Veličina bloka”.

Sada je zanimljiv dio kako čitati /home/serp/testfile fajl? Datoteka se sastoji od jednog ili više blokova sistema datoteka u kojima su pohranjeni njeni podaci. Znajući naziv fajla, kako ga pronaći? Koje blokove da čitam?

Ovdje inode dobro dolaze. Ext2fs sistem datoteka ima "tabelu" koja sadrži informacije za sve inode. Broj inoda u slučaju ext2fs se postavlja prilikom kreiranja sistema datoteka. Gledamo tražene brojeve u parametru “Inod count” izlaza tune2fs, tj. imamo 65536 komada. Inode sadrži informacije koje su nam potrebne: listu blokova sistema datoteka za datoteku koju tražimo. Kako pronaći inode broj za dati fajl?

Odgovarajuće ime i inode broj se nalaze u direktoriju, a direktorij u ext2fs je posebna vrsta datoteke, tj. također ima svoj vlastiti inode broj. Da bi se prekinuo ovaj začarani krug, "fiksni" inode broj "2" je dodijeljen korijenskom direktoriju. Pogledajmo sadržaj inode broj 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

Kao što vidite, direktorij koji nam je potreban nalazi se u bloku broj 579. U njemu ćemo pronaći broj čvora za home folder, i tako niz lanac dok u serp direktoriju ne vidimo broj čvora za traženi fajl. Ako iznenada neko poželi da proveri da li je broj tačan i da li postoje potrebne informacije, to nije teško. Mi radimo:

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

U izlazu možete pročitati imena datoteka u direktoriju.

Tako dolazim do glavnog pitanja: "iz kojih razloga može doći do greške u snimanju?"

Naravno, to će se dogoditi ako u sistemu datoteka nema slobodnih blokova. Šta se može učiniti u ovom slučaju? Osim očiglednog "izbrišite sve nepotrebno", treba da zapamtite da u ext2,3 i 4 sistemima datoteka postoji nešto kao "broj rezervisanih blokova". Ako pogledate gornji listing, imamo “13094” takvih blokova. Ovo su blokovi u koje može pisati samo root korisnik. ali ako trebate brzo riješiti problem, kao privremeno rješenje možete ih učiniti dostupnim svima, što rezultira slobodnim prostorom:

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

One. podrazumevano, imate 5% prostora na disku koji nije dostupan za pisanje, a s obzirom na zapreminu modernih diskova, to može biti stotine gigabajta.

Šta bi drugo moglo biti? Također je moguće da postoje slobodni blokovi, ali čvorova više nema. Ovo se obično dešava ako imate gomilu datoteka na vašem sistemu datoteka koje su manje od veličine bloka sistema datoteka. S obzirom da se 1 inode troši na 1 fajl ili direktorij, a ukupno imamo (za dati sistem datoteka) 65536 - situacija je više nego realna. Ovo se može jasno vidjeti iz izlaza naredbe 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

Kao što je jasno vidljivo na /var/www particiji, broj slobodnih blokova u sistemu datoteka i broj slobodnih čvorova veoma variraju.

U slučaju da vam ponestane inoda, neću vam reći nikakve čini, jer... nema ih (ako griješim, javite mi). Dakle, za particije u kojima se male datoteke množe, trebali biste mudro odabrati sistem datoteka. Na primjer, btrfs inode ne mogu završiti, jer Nove se dinamički kreiraju ako je potrebno.

izvor: www.habr.com

Dodajte komentar