Kada počnemo da se igramo sa GNU/Linuxom, prije ili kasnije se pojavi pomalo misteriozan koncept: inode. Znamo da imaju veze sa načinom na koji se datoteke pohranjuju na disk, da ih provajderi hostinga ograničavaju i da ako ih nestane, sistem poludi... U ovom članku ćemo baciti malo svjetla na ovu temu, objašnjavajući šta su inode u Linuxu i njihovu pravu važnost.
Objašnjavamo tačno šta je inod, šta pohranjuje, kako je organizovan na disku , zašto nam može ponestati čak i sa slobodnim prostorom i koje komande imamo za kontrolu.
Šta je inode u Linuxu?
Inod (od index node - indeksni čvor ) je struktura podataka datotečnog sistema koja pohranjuje sve metapodatke datoteke ili direktorija u Unix-sličnim sistemima (Linux, BSD, itd.). Svaka obična datoteka, svaka mapa, pa čak i neke posebne vrste objekata (socketi, FIFO-ovi, uređaji) imaju pridruženi inod.
Ovaj inod je identifikovan jedinstvenim cijelim brojem unutar svakog datotečnog sistema , poznatim kao "broj inoda". Ovaj broj je ono što kernel interno koristi za pozivanje na datoteku; ime koje vidite u direktoriju je zapravo "oznaka" koja pokazuje na odgovarajući inod.
Važno je razumjeti da inode ne sadrži ni naziv datoteke ni sadržaj datoteke . Naziv datoteke se pohranjuje u unosu direktorija (u dentries), a sadržaj se nalazi u odvojenim blokovima podataka. Inode pohranjuje sve ostalo što je sistemu potrebno za lociranje i upravljanje tim sadržajem.
Unutar istog datotečnog sistema (particije, radi jednostavnosti), ne mogu postojati dva inoda s istim brojem . Međutim, broj inoda se može ponavljati u različitim datotečnim sistemima jer se globalno identificira kombinacijom "uređaj" + "broj inoda".

Koje informacije pohranjuje inode?
Inode sadrži gotovo sve metapodatke datoteke ili direktorija. Drugim riječima, sve što opisuje datoteku osim njenog imena i stvarnog sadržaja . Između ostalog, nalazimo:
- Broj inoda: jedinstveni cjelobrojni identifikator inode-a unutar datotečnog sistema.
- Veličina datoteke u bajtovima
- Broj blokova podataka koje datoteka zauzima na disku.
- Identifikator uređaja (ID uređaja): na kojem uređaju / datotečnom sistemu je sačuvano.
- UID (korisnički ID): identifikator korisnika vlasnika.
- GID (ID grupe): identifikator vlasničke grupe.
- Dozvole i tip (mod): regularna datoteka, direktorij, veza, uređaj i bitovi za čitanje/pisanje/izvršavanje za vlasnika, grupu i ostale.
- Broj tvrdih linkova (tvrde veze) povezane s tim inodeom.
- vremenske oznakeatime (zadnji pristup), mtime (zadnja izmjena podataka) i ctime (zadnja promjena samog inode-a, na primjer dozvole ili vlasnik).
- Informacije o verziji ili proširene atribute, ovisno o datotečnom sistemu.
- Tabela pokazivača na blokove podataka, što pokazuje gdje se fizički nalaze blokovi koji sadrže sadržaj datoteke.
Na Linux sistemima, ove informacije možemo provjeriti naredbom `stat` . Na primjer, ako pokrenemo:
stat archivo.txt
Vidjet ćemo izlaz koji uključuje broj inode-a, dozvole, UID/GID, veličinu, tri datuma i broj linkova , između ostalih polja. Sve to je u suštini sadržaj inode-a povezanog s tom datotekom.
Kako funkcionišu inode i blokovi podataka
Unix-slični datotečni sistemi, kao što su ext2/ext3/ext4, XFS, Btrfs ili UFS, organiziraju disk u blokove podataka fiksne veličine (4 KB je tipično danas). Sadržaj datoteke je distribuiran po ovim blokovima; velika datoteka će zauzeti mnogo blokova, moguće i ne susjednih.
Da bi sistem pronašao taj sadržaj, inode uključuje pokazivače na blokove u kojima je datoteka pohranjena . To je kao kartica knjige u biblioteci: kartica (inode) ne sadrži knjigu, ali vam tačno govori gdje je pronaći na policama (blokovi podataka).
Na primjer, u ext4, klasična struktura inode-a rezerviše 15 unosa za adresiranje :
- 12 direktnih pokazivača na blokove podataka.
- 1 jednostavan indirekcijski pokazivač.
- 1 dvostruki indirekcijski pokazivač.
- 1 trostruki indirekcijski pokazivač.
Direktni pokazivači pokazuju direktno na blokove koji sadrže podatke datoteke. Sve dok se datoteka uklapa unutar tih 12 blokova (otprilike 48 KB ako je veličina bloka 4 KB), pristup je vrlo brz jer inode direktno dolazi do podataka.
Kada datoteka premaši taj kapacitet, na scenu stupa jednostavna indirekcije : pokazivač 13 inode-a pokazuje na blok koji ne sadrži podatke datoteke, već na tabelu sa više pokazivača na blokove podataka. Ako datoteka nastavi da raste, koristi se dvostruka i trostruka indirekcije, povezujući nivoe tabela pokazivača, što omogućava ogromne datoteke, do desetina terabajta u ext4 , po cijenu većeg broja skokova i nešto sporijeg pristupa posljednjim blokovima.
Iz ovoga možemo izvući dvije ključne ideje: s jedne strane, malim datotekama se upravlja vrlo efikasno (samo direktni pokazivači); s druge strane, gigantske datoteke zahtijevaju viši nivo indirekcije i, stoga, više rada za određivanje lokacije svakog bloka.
Gdje se inode čuvaju na disku?
Inode također zauzimaju prostor na disku. Oni nisu "magični": oni su dio same strukture datotečnog sistema . Specifičan način na koji su raspoređeni zavisi od tipa datotečnog sistema.
U ext porodici (ext2, ext3, ext4), prilikom kreiranja datotečnog sistema, particija je podijeljena u grupe blokova. Svaka grupa sadrži svoju vlastitu tabelu inode-ova i blokove podataka , tako da inode-ovi u jednom području diska pokazuju na obližnje blokove podataka. Ovo minimizira pomicanje glave na mehaničkim diskovima i poboljšava performanse.
Karakteristike kao što su veličina inoda, ukupan broj ili koliko ih je u grupi možemo provjeriti pomoću tune2fs . Na primjer:
tune2fs -l /dev/sda1 | grep Inode
Prikazat će nam polja kao što su broj inodea, broj inodea po grupi, veličina inodea itd. Sasvim je uobičajeno vidjeti veličine inodea od 128 ili 256 bajtova u ext2/ext3/ext4, iako drugi sistemi koriste drugačije strukture.
U drugim datotečnim sistemima poput ReiserFS-a, XFS-a ili Btrfs-a , pristup je drugačiji: ne postoji uvijek unaprijed dodijeljena "tradicionalna" tabela inode-ova, već dinamičnije strukture koje kreiraju inode po potrebi. Uprkos tome, uvijek postoji neki ekvivalentni mehanizam koji obavlja istu funkciju : opisivanje datoteka pomoću metapodataka i pokazivača podataka.
Dentryji: kako su imena i inode povezani
Do sada smo pričali o inode-ima, ali nedostaje ključni dio: gdje se pohranjuje naziv datoteke? To se obrađuje pomoću dentries-a (unosa direktorija).
Svaki direktorij održava tabela sa parovima "ulazno ime → broj inoda"To jest, dentry kaže „datoteka Carta.odt odgovara inodeu 10043“. Kada to uradite ls Ili otvorite datoteku po njenoj putanji, kernel prelazi kroz hijerarhiju direktorija prateći ove asocijacije imena i inoda.
Tipičan direktorij će sadržavati posebne unose: . (tačka) koja pokazuje na sam direktorij i .. (dvotačka) koja pokazuje na nadređeni direktorij. Ovi unosi se također upravljaju pomoću inode-ova i pomažu u navigaciji hijerarhijskom strukturom.
Ključno je to što jedan inod može imati više povezanih imena u različitim dentrijama , što rezultira tvrdim vezama. Suprotno tome, sasvim je moguće da inod postoji bez ikakvih povezanih imena (na primjer, otvorena datoteka koja je izbrisana), a sistem će mu i dalje moći pristupiti sve dok ga neki proces drži otvorenim.
Tvrde veze i uloga inoda
U Linuxu se datoteke interno ne referenciraju po njihovoj putanji ili imenu, već po njihovom inodnom broju . Ovo omogućava vrlo moćnu funkciju: tvrde veze.
Čvrsta veza je jednostavno dodatni unos u direktorij koji ukazuje na isti inode . Ako to učinite:
ln archivo.txt copia.txt
Oba imena, archivo.txt i copia.txt , povezana su s istim inodeom. Dijele potpuno isti sadržaj i metapodatke (osim, naravno, imena direktorija). Ako izbrišete jedno od njih, inode se ne briše dok brojač linkova ne dostigne nulu, jer još uvijek postoji drugo ime koje ga referencira.
Ovo je u oštroj suprotnosti sa simboličkim vezama (ili Windows prečicama): simbolička veza sadrži putanju ciljne datoteke kao tekst i ima svoj vlastiti inode i metapodatke. Ako preimenujemo ili izbrišemo stvarnu datoteku, simbolička veza postaje neaktivna. Nasuprot tome, kod tvrdih veza, sva imena su ekvivalentna; nijedna nije "važnija" od ostalih.
Veliki dio fleksibilnosti i robusnosti Unix datotečnog sistema dolazi upravo iz ove odvojenosti između dentries i inode . To omogućava, na primjer, zamjenu izvršne datoteke u produkciji brisanjem stare datoteke i kreiranjem nove s istim imenom, bez prekidanja procesa koji su već pokretali prethodnu verziju.
Ograničenje inoda i zašto im može ponestati
Prilikom kreiranja datotečnog sistema, definirate koliko će inode-ova ukupno biti dostupno . U klasičnim ext sistemima, ovaj broj je fiksan u trenutku formatiranja i ne može se promijeniti bez potpunog ponovnog kreiranja datotečnog sistema (što uključuje formatiranje i stoga gubitak podataka ako se prethodno ne napravi sigurnosna kopija).
Uobičajeno heurističko pravilo u ext2/ext3/ext4 je rezerviranje približno jednog inoda za svakih 16 KB kapaciteta. Teoretski, s 32-bitnim brojevima, maksimum bi bio oko 2 <sup>32</sup> inoda (oko 4,3 milijarde), ali u praksi se za veličinu particije bira razumna vrijednost.
Ovo ima važnu posljedicu: broj inoda je konačan i može se iscrpiti , baš kao i prostor na disku. Nadalje, relativno je lako ostati bez inoda kada imate milione vrlo malih datoteka, čak i ako na particiji ima još dosta prostora.
Zamislite disk s nekoliko miliona slobodnih inoda i stotinama megabajta slobodnog prostora. Ako aplikacija generira milione sitnih datoteka (na primjer, e-poruke spremljene po jedna po datoteci, privremene sesije, rotirane logove, datoteke predmemorije itd.), moguće je da će svi inodi biti popunjeni dok se koristi samo nekoliko megabajta prostora za pohranu . Čim više nema dostupnih inoda, ne mogu se kreirati nove datoteke, čak i ako postoje slobodni blokovi.
U toj situaciji, prilikom pokušaja kreiranja novih datoteka ili direktorija, možete naići na poruke poput Nema više prostora na uređaju ili vidite da aplikacije ne uspijevaju bez ikakvog vidljivog razloga, iako je naredba df i dalje prikazuje slobodan prostor u GB.
Praktične posljedice nestanka toaleta
Kada brojač inode dostigne 100% iskorištenosti, sistem počinje pokazivati prilično neugodno ponašanje. Tipični problemi koji nastaju zbog prekomjerne upotrebe inode uključuju:
- Nemogućnost kreiranja novih datoteka ili direktorijačak i ako na particiji ima dosta slobodnog prostora.
- Aplikacija se ruši ili zamrzava koji pokušavaju pisati privremene datoteke i ne mogu.
- Neplanirano ponovno pokretanje ili pad sistema ako kritične usluge ne mogu evidentirati ili kreirati datoteke statusa.
- Neuspjeh zakazanog zadatka (cronjobs) koji trebaju kreirati radne datoteke.
- Gubitak podataka u servisima kao što su serveri pošte ako ne mogu pohraniti nove poruke.
Ovaj scenario se često viđa na serverima za dijeljeni hosting, web serverima i email serverima , gdje se akumuliraju milioni malih datoteka (keš memorije, PHP sesije, stare e-poruke, privremene CMS datoteke itd.). Zato mnogi provajderi hostinga eksplicitno ograničavaju broj inode-ova pored prostora na disku: to sprečava da jedan klijent preoptereti sistem milionima malih datoteka.
Kako provjeriti korištenje inode-a
Linux pruža nekoliko naredbi za upit ukupnog broja inode-ova i njihove upotrebe , kao i specifičnog broja inode-a datoteke ili direktorija. Ovo su osnovni alati za svaku sistemsku administraciju.
Pogledajte slobodne i korištene inode pomoću df -i
Naredba df prikazuje prostor na disku, a s opcijom -i umjesto toga prikazuje informacije o inode-u:
df -i
Tipičan izlaz uključuje kolone kao što su Inodes, IUsed, IFree i IUse% , pored tačke montiranja. Sabiranje polja used i free inodes daje nam ukupan broj inodes dostupnih na svakom datotečnom sistemu.
Ako želimo da se fokusiramo na određenu particiju, možemo joj proslijediti uređaj ili tačku montiranja, na primjer:
df -i /dev/sda1
Ovo je posebno korisno kada sumnjamo da je problem "Nema više prostora na uređaju" uzrokovan nedostatkom inoda, a ne blokova . Ako je IUse% blizu 100%, znamo gdje leži problem.
Pogledajte broj inode datoteka i direktorija
Da bismo saznali koji inode datoteka koristi, možemo koristiti ls s opcijom -i :
ls -i archivo.txt
Ili, da biste naveli cijeli direktorij s njegovim inode brojevima:
ls -i
U prvoj koloni ćemo vidjeti broj inoda povezan sa svakim imenom. Ovo je vrlo korisno prilikom istraživanja koliko imena ukazuje na isti inod (tvrde veze) ili prilikom unakrsnog referenciranja informacija s uslužnim programima niskog nivoa koji prikazuju samo brojeve inoda.
Ako nas zanimaju potpune informacije o inode-ovima (datumi, dozvole, veličina itd.), naredba stat je još detaljnija:
stat /var/log/lastlog
U liniji koja kaže "Inode" vidjet ćemo identifikator, a oko njega će se pojaviti klasični metapodaci koje inode pohranjuje : veličina, broj blokova, linkovi, UID, GID, načini pristupa i vremenske oznake.
Izbrojite koliko se inode-ova koristi u stablu direktorija
Ako želimo dobiti predstavu o tome koliko inoda zauzima direktorij i sve ispod njega, možemo kombinirati find sa wc -l :
find /var/log | wc -l
Rezultirajući broj će biti broj unosa (datoteka i poddirektorija) unutar te putanje; to jest, približan broj inoda korištenih u tom specifičnom stablu. Ovo je vrlo korisno za lociranje područja sistema gdje se akumuliraju hiljade ili milioni malih datoteka.
Promijeni broj i veličinu inode-ova (ext4)
U ext4 datotečnim sistemima, inode se kreiraju prilikom formatiranja particije . Nakon što je datotečni sistem kreiran, ukupan broj inode-ova i njihova veličina su fiksni i ne mogu se dinamički povećavati, osim u vrlo specifičnim slučajevima (određena LVM proširenja ili promjena datotečnog sistema).
Prilikom formatiranja sa mkfs.ext4 , možemo eksplicitno odrediti koliko inoda želimo i koju veličinu. Na primjer:
sudo mkfs.ext4 -N 2000000 -I 256 /dev/sdX
Ova naredba će kreirati ext4 datotečni sistem u /dev/sdX sa 2.000.000 inode-ova, svaki veličine 256 bajtova . Međutim, postoji nekoliko detalja koje treba imati na umu:
- Veličina inoda Mora biti potencija broja 2 jednaka ili veća od 128 bajtova (obično 128 ili 256).
- Što više inoda i što su većiŠto više prostora na disku zauzima sama struktura datotečnog sistema, to će više prostora na disku koristiti.
- Nije dobra ideja "igrati se" s ovim parametrima bez da zaista znate šta radite.jer možemo gubiti prostor ili nam ponestati inode-ova.
U većini slučajeva, za korisnike bez posebnih potreba, dovoljno je dozvoliti da mkfs.ext4 odredi zadane parametre:
sudo mkfs.ext4 /dev/sdX
Ako kasnije otkrijemo da ext4 particiji hronično nedostaju inode, pravo rješenje obično uključuje promjenu veličine ili ponovno formatiranje (nakon pravljenja sigurnosne kopije) ili migraciju na fleksibilniji datotečni sistem poput XFS-a ili Btrfs-a koji ne dodjeljuju unaprijed sve inode.
Kako otkriti i riješiti probleme s toaletom
Kada sistem počne pokazivati čudne simptome (rušenje aplikacija, neuspješno pokretanje cron poslova, naizgled nasumične greške), jedna od prvih provjera trebala bi biti provjera korištenja inode-a . Tipičan dijagnostički tok izgleda otprilike ovako:
Prvo provjeravamo status sumnjive particije pomoću:
df -i /punto/de/montaje
Ako je postotak korištenih inoda vrlo visok (iznad 90%, a svakako na 100%), možemo potvrditi da je usko grlo broj inoda, a ne prostor za pohranu . Stoga, rješenje uključuje oslobađanje inoda brisanjem datoteka.
Tipična strategija je lociranje direktorija s mnogo malih datoteka. Datoteke u direktoriju možemo sortirati po veličini pomoću:
ls -laShr /ruta
i tako na prvi pogled vidjeti gdje se nakupljaju hiljade sitnih datoteka koje vjerovatno više nemaju smisla (na primjer, stare sesije, keš memorije, privremene datoteke, rotirani logovi, zastarjele sigurnosne kopije...).
Na serverima gdje se stalno generiraju privremene ili keš datoteke, dobra praksa je Automatizirajte brisanje starih datoteka pomoću cronaNa primjer, možemo izbrisati datoteke starije od 14 dana u određenom direktoriju pomoću naredbe find prikladno u periodičnom cron zadatku.
Ako nam, nakon temeljitog čišćenja, i dalje ponestaje inoda ili nemamo mjesta za brisanje bilo čega, jedino pravo rješenje je reparticioniranje ili ponovno kreiranje datotečnog sistema s više inoda . Ovo je delikatan proces jer uključuje potpune sigurnosne kopije i, obično, gašenje servisa. Ali kada početni dizajn datotečnog sistema ne uspije, ne postoji čarobni štapić koji jednostavno "doda" inode u hodu.
Ukratko, praćenje inode-ova pomoću alata poput df -i, du, find i ls dio je rutinskih zadataka održavanja, u rangu s praćenjem slobodnog prostora ili opterećenja CPU-a.
Razumijevanje kako inode funkcionišu u Linuxu, koje podatke pohranjuju i zašto su ograničeni pomaže u izbjegavanju mnogih problema u produkciji i omogućava nam da bolje dimenzioniramo naše datotečne sisteme. Znajući da svaka datoteka i direktorij troše inode , da je njihov broj definiran (u mnogim sistemima) kada se particija kreira i da nestanak inodea blokira kreiranje novih datoteka čak i ako disk nije pun, možemo mudro planirati: odabrati pravi datotečni sistem, kontrolirati rast malih datoteka i koristiti naredbe za inspekciju kako bismo ovaj bitan, ali često nevidljivi resurs držali pod kontrolom.
