Povremeno, radi preseljenja u CRS razgovaram s različitim velikim tvrtkama, većinom iz Petersburga i Moskve za poziciju DevOps. Primijetio sam da mnoge tvrtke (mnoge dobre tvrtke, kao što je Yandex) postavljaju dva slična pitanja:
- što je inode;
- iz kojih razloga može doći do greške prilikom pisanja na disk (ili, na primjer: zašto može nestati prostora na disku, suština je ista).
Kao i obično, bio sam siguran da ovu temu dobro poznajem, ali čim sam počeo objašnjavati — otkrili su se propusti u znanju. Kako bih sistematizirao svoje znanje, popunio praznine i više se ne osramotio, pišem ovaj članak, možda će nekom drugom također koristiti.
Počnem „odozdo“, tj. s tvrdog diska (uskoro ćemo zaboraviti na flash diskove, SSD-ove i druge moderne naprave, radi primjera razmatrat ćemo bilo koji stari disk od 20 ili 80 gigabajta, jer tamo veličina bloka iznosi 512 bajtova).
Tvrdog disk ne može adresirati svoj prostor bajt po bajt, uvjetno ga dijeli na blokove. Numeracija blokova počinje od 0. (to se naziva LBA, detalji ovdje: )

Kao što se može vidjeti iz slike, blokovi LBA označio sam kao razinu HDD-a. Usput, možete provjeriti koja je veličina bloka vašeg diska na sljedeći način:
root@ubuntu:/home/serp# blockdev --getpbsz /dev/sdb
512Na razini iznad razgraničen je partiton, jedan za cijeli disk (ponovno zbog jednostavnosti). Najčešće se koristi raspored particija dvaju tipova: msdos i gpt. Otp corresponding msdos — stari format, koji podržava diskove do 2 Tb, gpt — novi format sposoban adresirati do 1 zettabajta 512-bajtnih blokova. U našem slučaju imamo particiju tipa msdos, kao što se vidi iz slike, particija počinje od bloka br. 1, dok se nulti koristi za MBR.
U prvoj particiji stvorio sam datotečni sustav ext2, prema zadanim postavkama veličina bloka iznosi 4096 bajta, to je također prikazano na slici. Veličinu bloka datotečnog sustava možete provjeriti na sljedeći način:
root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Ime datotečnog sustava:
Zadnje montiranje na:
UUID datotečnog sustava: a600bf40-f660-41f6-a3e6-96c303995479
Magični broj datotečnog sustava: 0xEF53
Revizija datotečnog sustava #: 1 (dinamična)
Karakteristike datotečnog sustava: ext_attr resize_inode dir_index filetype sparse_super large_file
Zastavice datotečnog sustava: signed_directory_hash
Zadane opcije montiranja: user_xattr acl
Stanje datotečnog sustava: clean
Ponašanje grešaka: Continue
Vrsta OS-a datotečnog sustava: Linux
Broj inoda: 65536
Broj blokova: 261888
Broj rezerviranih blokova: 13094
Slobodni blokovi: 257445
Slobodni inodi: 65525
Prvi blok: 0
Veličina bloka: 4096
Veličina fragmenta: 4096
Rezervirani GDT blokovi: 63
Blokovi po grupi: 32768
Fragmenti po grupi: 32768
Inodi po grupi: 8192
Inodni blokovi po grupi: 512
Datotečni sustav kreiran: Pet Aug 2 15:02:13 2019
Zadnji put montirano: n/a
Zadnji put pisano: Pet Aug 2 15:02:14 2019
Broj montiranja: 0
Maksimalni broj montiranja: -1
Zadnji pregled: Pet Aug 2 15:02:13 2019
Interval provjere: 0 ()
Rezervirani blokovi uid: 0 (korisnik root)
Rezervirani blokovi gid: 0 (grupa root)
Prvi inode: 11
Veličina inoda: 256
Obavezna dodatna veličina: 28
Željena dodatna veličina: 28
Zadani hash direktorija: half_md4
Sjemenski hash direktorija: c0155456-ad7d-421f-afd1-c898746ccd76Potrebna nam je varijabla — „Veličina bloka.“
Sada dolazi najzanimljivije, kako pročitati datoteku /home/serp/testfile? Datoteka se sastoji od jednog ili više blokova datotečnog sustava u kojima su pohranjeni njeni podaci. Kako pronaći datoteku znajući njeno ime? Koje blokove čitati?
Tu dolaze do izražaja inodi. U datotečnom sustavu ext2fs postoji „tablica“ koja sadrži informacije o svim inodeima. Broj inodea u slučaju ext2fs postavlja se prilikom kreiranja datotečnog sustava. Potrebne brojke gledamo u parametru „Broj inoda“ izlaza tune2fs, tj. imamo 65536 komada. U inodu se nalaze informacije koje su nam potrebne: popis blokova datotečnog sustava za traženu datoteku. Kako pronaći broj inoda za navedenu datoteku?
Odnos između imena i broja inoda nalazi se u direktoriju, a direktorij u ext2fs — to je datoteka posebne vrste, tj. također ima svoj broj inoda. Da bismo prekinuli ovaj začarani krug, za korijenski direktorij dodijeljen je „fiksni“ broj inoda „2“. Pogledajmo sadržaj inoda pod brojem 2:
root@ubuntu:/# debugfs /dev/sdb1
debugfs 1.42.9 (4-Feb-2014)
debugfs: stat
Inod: 2 Tip: direktorij Mod: 0755 Zastavice: 0x0
Generacija: 0 Verzija: 0x00000000:00000002
Korisnik: 0 Grupa: 0 Veličina: 4096
Datotečni ACL: 0 ACL direktorija: 0
Linkovi: 3 Broj blokova: 8
Fragment: Adresa: 0 Broj: 0 Veličina: 0
ctime: 0x5d43cb51:16b61bcc -- Pet Aug 2 16:34:09 2019
atime: 0x5d43c247:b704301c -- Pet Aug 2 15:55:35 2019
mtime: 0x5d43cb51:16b61bcc -- Pet Aug 2 16:34:09 2019
crtime: 0x5d43b5c6:00000000 -- Pet Aug 2 15:02:14 2019
Veličina dodatnih polja inoda: 28
BLOKOVI:
(0):579
UKUPNO: 1Kao što se može vidjeti, potrebna nam je direktorija smještena u bloku s brojem 579. U njoj ćemo pronaći broj noda za mapu home, i tako dalje po lancu, sve dok u direktoriju serp ne vidimo broj noda za traženu datoteku. Ako netko želi provjeriti je li broj ispravan i ima li tamo potrebnih informacija, to nije teško. 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_imageU izlazu se mogu pročitati imena datoteka u direktoriju.
Evo došao sam do glavnog pitanja: "koji su razlozi zbog kojih može nastati pogreška zapisivanja"?
Naravno, ovako će se dogoditi ako ne ostane slobodnih blokova u datotečnom sustavu. Što se može učiniti u tom slučaju? Osim očitog "izbrisati nešto nepotrebno", treba imati na umu da u datotečnim sustavima ext2,3 i 4 postoji stvar poput "Reserved block count". Ako pogledamo u popis iznad, imamo takvih blokova "13094". To su blokovi dostupni za zapisivanje samo korisniku root. No, ako je potrebno hitno riješiti pitanje, kao privremeno rješenje, moguće ih je učiniti dostupnima za sve, čime dolazi do oslobađanja malo slobodnog prostora:
root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Postavljanje postotka rezerviranih blokova na 0% (0 blokova)To jest, prema zadanim postavkama, 5% diskovnog prostora nije dostupno za zapisivanje, a s obzirom na kapacitete modernih diskova, to mogu biti stotine gigabajta.
Što još može biti? Također je moguća situacija kada su slobodni blokovi prisutni, a nodovi su nestali. To se obično događa ako imate u datotečnom sustavu mnoštvo datoteka veličine manje od veličine bloka datotečnog sustava. Uzimajući u obzir da se za 1 datoteku ili direktorij troši 1 inode, a ukupno ih imamo (za ovaj datotečni sustav) 65536 — situacija je više nego realna. To se može vizualizirati 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/wwwKao što se može primijetiti u odjeljku /var/www, broj slobodnih blokova datotečnog sustava i broj slobodnih inodeova značajno se razlikuju.
U slučaju da su inodeovi istekli, nemam rješenja, jer ih nema (ako se varam, javite mi). Dakle, za odjele gdje se nagomilavaju mali datoteke, važno je pametno odabrati datotečni sustav. Tako, na primjer, u btrfs inodeovi ne mogu nestati, jer se dinamički stvaraju novi po potrebi.
Izvor: habr.com
