Vse, kar ste kdaj želeli vedeti o inodih v Linuxu

Datotečni sistem Linux se zanaša na inode. Ti vitalni deli notranjega delovanja datotečnega sistema so pogosto napačno razumljeni. Poglejmo natančno, kaj so in kaj počnejo.

Elementi datotečnega sistema

Po definiciji mora datotečni sistem shraniti datoteke in vsebujejo tudi imenike. Datoteke so shranjene v imenikih in ti imeniki imajo lahko podimenike. Nekaj ​​mora nekje zabeležiti, kje vse datoteke se nahajajo v datotečnem sistemu, kako se imenujejo, katerim računom pripadajo, katera dovoljenja imajo in še veliko več. Te informacije se imenujejo metapodatki, ker gre za podatke, ki opisujejo druge podatke.

V datotečnem sistemu Linux ext4 strukture inode in imenikov sodelujejo, da zagotovijo temeljni okvir, ki shrani vse metapodatke za vsako datoteko in imenik. Metapodatke dajo na voljo vsem, ki jih potrebujejo, ne glede na to, ali gre za jedro, uporabniške programe ali pripomočke za Linux, kot lsso stat, in df.

Inode in velikost datotečnega sistema

Res je, da obstaja par struktur, vendar datotečni sistem zahteva veliko več od tega. Vsake strukture je na tisoče in tisoče. Vsaka datoteka in imenik zahteva inode, in ker je vsaka datoteka v imeniku, vsaka datoteka zahteva tudi strukturo imenika. Strukture imenikov se imenujejo tudi vnosi v imenik ali »zobniki«.

Vsak inode ima številko inode, ki je v datotečnem sistemu edinstvena. Ista številka inode se lahko pojavi v več datotečnih sistemih. Vendar se ID datotečnega sistema in številka inode združita v enolični identifikator, ne glede na to, koliko datotečnih sistemov je nameščenih v vašem sistemu Linux.

Ne pozabite, da v Linuxu ne namestite trdega diska ali particije. Namestite datotečni sistem, ki je na particiji, zato je enostavno imeti več datotečnih sistemov, ne da bi se tega zavedali. Če imate na enem pogonu več trdih diskov ali particij, imate več kot en datotečni sistem. Mogoče so iste vrste - na primer vsi ext4, vendar bodo še vedno različni datotečni sistemi.

Vsi inodi so v eni tabeli. Z uporabo številke inode datotečni sistem zlahka izračuna odmik v tabelo inode, v kateri je ta inoda. Vidite lahko, zakaj "i" v inode pomeni indeks.

Spremenljivka, ki vsebuje številko inode, je v izvorni kodi deklarirana kot 32-bitno, nepodpisano dolgo celo število. To pomeni, da je število inod celoštevilska vrednost z največjo velikostjo 2 ^ 32, kar pomeni 4 294 967 295 - kar je več kot 4 milijarde inodov.

To je teoretični maksimum. V praksi se število inodov v datotečnem sistemu ext4 določi, ko se datotečni sistem ustvari s privzetim razmerjem enega inode na 16 KB zmogljivosti datotečnega sistema. Strukture imenikov se ustvarjajo sproti, ko je datotečni sistem v uporabi, saj se datoteke in imeniki ustvarjajo znotraj datotečnega sistema.

Obstaja ukaz, s katerim lahko vidite, koliko inodov je v datotečnem sistemu v računalniku. Možnost -i(inode) dfukaza mu naroči, naj svoj izhod prikaže v številu inodov.

Ogledali si bomo datotečni sistem na prvi particiji na prvem trdem disku, zato vtipkamo naslednje:

df -i / dev / sda1

Rezultat nam daje:

  • Datotečni sistem : datotečni sistem, o katerem se poroča.
  • Inode : skupno število inod v tem datotečnem sistemu.
  • IUsed : Število uporabljenih inodov.
  • IFree : Število preostalih inodov, ki so na voljo za uporabo.
  • IUse% : Odstotek uporabljenih inodov.
  • Montirano na : Točka vpetja za ta datotečni sistem.

V tem datotečnem sistemu smo uporabili 10 odstotkov inodov. Datoteke so shranjene na trdem disku v diskovnih blokih. Vsak inode kaže na bloke diskov, ki shranjujejo vsebino datoteke, ki jo predstavljajo. Če imate na milijone drobnih datotek, vam lahko zmanjka inodov, preden zmanjka prostora na trdem disku. Vendar je to zelo težaven problem.

V preteklosti so imeli to težavo nekateri poštni strežniki, ki so e-poštna sporočila shranili kot ločene datoteke (kar je hitro privedlo do velikih zbirk majhnih datotek). Ko so te aplikacije spremenile svoj hrbtni del v zbirke podatkov, je to vseeno rešilo težavo. V povprečnem domačem sistemu ne bo zmanjkalo inodov, kar je prav tako dobro, ker z datotečnim sistemom ext4 ne morete dodati več inodov brez ponovne namestitve datotečnega sistema.

Če si želite ogledati velikost diskovnih blokov v datotečnem sistemu, lahko uporabite blockdevukaz z --getbszmožnostjo (pridobi velikost bloka):

sudo blockdev --getbsz / dev / sda

Velikost bloka je 4096 bajtov.

Z -Bmožnostjo (velikost bloka) določimo velikost bloka 4096 bajtov in preverimo običajno uporabo diska:

df -B 4096 / dev / sda1

Ta rezultat nam pokaže:

  • Datotečni sistem : datotečni sistem, o katerem poročamo.
  • 4K-bloki : Skupno število 4 KB blokov v tem datotečnem sistemu.
  • Uporabljeno : koliko blokov 4K je v uporabi.
  • Na voljo : število preostalih 4 KB blokov, ki so na voljo za uporabo.
  • Uporaba% : odstotek uporabljenih blokov 4 KB.
  • Montirano na : Točka vpetja za ta datotečni sistem.

V našem primeru je shranjevanje datotek (in shranjevanje inodov in struktur imenikov) porabilo 28 odstotkov prostora v tem datotečnem sistemu s ceno 10 odstotkov inodov, zato smo v dobri formi.

Metapodatki inode

Če si želite ogledati številko inode datoteke, lahko lsz -imožnostjo (inode) uporabimo :

ls -i geek.txt

Številka inoda za to datoteko je 1441801, zato ta inode vsebuje metapodatke za to datoteko in običajno kazalce na bloke diskov, kjer je datoteka na trdem disku. Če je datoteka razdrobljena, zelo velika ali oboje, lahko nekateri bloki, na katere kaže inode, vsebujejo nadaljnje kazalce na druge bloke diska. Nekateri od teh drugih diskovnih blokov lahko vsebujejo tudi kazalce na drug nabor diskovnih blokov. S tem je premagan problem, da je inode fiksne velikosti in lahko zadrži končno število kazalcev na diskovne bloke.

To metodo je nadomestila nova shema, ki uporablja "ekstenzije". Ti zapišejo začetni in končni blok vsakega sklopa sosednjih blokov, ki se uporabljajo za shranjevanje datoteke. Če je datoteka nerazdrobljena, morate shraniti le prvi blok in dolžino datoteke. Če je datoteka razdrobljena, morate shraniti prvi in ​​zadnji blok vsakega dela datoteke. Ta metoda je (očitno) učinkovitejša.

Če želite preveriti, ali vaš datotečni sistem uporablja kazalce ali razširitve diskovnih blokov, lahko pogledate v inode. Za to bomo uporabili debugfsukaz z -Rmožnostjo (request) in mu poslali inode datoteke, ki nas zanima. Ta zahteva  debugfs uporabo notranjega ukaza "stat" za prikaz vsebine inode. Ker so številke inode v datotečnem sistemu edinstvene, moramo debugfs datotečnemu sistemu, v katerem je inode, tudi sporočiti .

Tukaj bi izgledal ta primer ukaza:

sudo debugfs -R "stat" / dev / sda1

Kot je prikazano spodaj, debugfsukaz izvleče podatke iz inode in nam jih predstavi v less:

Prikazane so naslednje informacije:

  • Inode : Število inode, ki ga gledamo.
  • Tip : To je običajna datoteka, ne imenik ali simbolična povezava.
  • Način : Dovoljenja za datoteke v osmici.
  • Zastave : kazalniki, ki predstavljajo različne funkcije ali funkcionalnosti. 0x80000 je zastavica "extents" (več o tem spodaj).
  • Generacija : Omrežni datotečni sistem (NFS) to uporablja, ko nekdo dostopa do oddaljenih datotečnih sistemov prek omrežne povezave, kot da bi bil nameščen na lokalnem računalniku. Številke inode in generacije se uporabljajo kot oblika ročaja datoteke.
  • Različica : različica inode.
  • Uporabnik : lastnik datoteke.
  • Skupina : Lastnik skupine datoteke.
  • Projekt : Vedno mora biti nič.
  • Velikost : velikost datoteke.
  • Datoteka ACL : seznam za nadzor dostopa do datotek. Namenjeni so vam, da omogočite nadzorovan dostop ljudem, ki niso v skupini lastnikov.
  • Povezave : število trdih povezav do datoteke.
  • Blockcount : Količina prostora na trdem disku, dodeljena tej datoteki, podana v 512-bajtnih kosih. Naši datoteki je bilo dodeljenih osem od teh, kar je 4.096 bajtov. Naša 98-bajtna datoteka je torej v enem samem 4.096-bajtnem bloku diska.
  • Fragment : Ta datoteka ni razdrobljena. (To je zastarela zastava.)
  • Ctime : čas, ko je bila datoteka ustvarjena.
  • Atime : čas zadnjega dostopa do te datoteke.
  • Mtime : čas, ko je bila datoteka nazadnje spremenjena.
  • Čas delovanja : čas, ko je bila datoteka ustvarjena.
  • Velikost dodatnih polj inode : datotečni sistem ext4 je uvedel možnost dodelitve večjega inode na disku v času formatiranja. Ta vrednost je število dodatnih bajtov, ki jih uporablja inode. Ta dodaten prostor lahko uporabite tudi za prilagoditev prihodnjim zahtevam za nova jedra ali za shranjevanje razširjenih atributov.
  • Kontrolna vsota inode: kontrolna vsota za to inodo, ki omogoča zaznavanje, ali je inode poškodovan.
  • Razširitve : če se uporabljajo ekstenzije (na ext4 so privzeto), imajo metapodatki o uporabi datotek diskovnega bloka dve številki, ki označujeta začetni in končni blok vsakega dela razdrobljene datoteke. To je bolj učinkovito kot shranjevanje vsakega bloka diska, ki ga zavzame vsak del datoteke. Imamo en obseg, ker naša majhna datoteka sedi v enem bloku diska pri tem premiku bloka.

Kje je ime datoteke?

Zdaj imamo veliko informacij o datoteki, toda, kot ste morda opazili, imena datoteke nismo dobili. Tu pride do izraza imeniška struktura. V Linuxu ima mapa, tako kot datoteka, inode. Namesto da bi kazal na bloke diskov, ki vsebujejo podatke o datotekah, imenik inode kaže na bloke diskov, ki vsebujejo imeniške strukture.

V primerjavi z inode struktura imenika vsebuje omejeno količino informacij o datoteki. Vsebuje samo številko inode datoteke, ime in dolžino imena.

Inode in struktura imenika vsebujeta vse, kar morate (ali aplikacija) vedeti o datoteki ali imeniku. Struktura imenika je v bloku imeniškega diska, zato vemo, v katerem imeniku je datoteka. Imeniška struktura nam daje ime datoteke in številko inode. Inode nam pove vse ostalo o datoteki, vključno s časovnimi žigi, dovoljenji in kje najti podatke o datoteki v datotečnem sistemu.

Imenik Inode

Številko inode v imeniku lahko vidite enako enostavno kot datoteke.

V naslednjem primeru bomo uporabili ls z možnostmi -l(dolga oblika), -i(inode) in -d(imenik) ter si ogledali workimenik:

ls -lid delo /

Ker smo uporabili možnost -d(imenik),  lsporoča o samem imeniku in ne o njegovi vsebini. Inode za ta imenik je 1443016.

Da ponovimo to za homeimenik, vtipkamo naslednje:

ls -lid ~

homeInode za imenik je 1447510, workimenik pa je v domačem imeniku. Zdaj pa poglejmo vsebino workimenika. Namesto možnosti  -d(imenik) bomo uporabili možnost -a(vsi). To nam bo pokazalo vnose v imenik, ki so običajno skriti.

Vtipkamo naslednje:

ls -lia delo /

Ker smo uporabili možnost -a(vsi), so prikazani vnosi z eno (.) In z dvema pikama (..). Ti vnosi predstavljajo sam imenik (z eno piko) in njegov nadrejeni imenik (z dvema pikama.)

Če pogledate številko inode za vnos z eno piko, boste ugotovili, da je to1443016 - enako število inode, ki smo ga dobili, ko smo odkrili številko inode za workimenik. Številka inode za vnos z dvema pikama je enaka številki inode za homeimenik.

Zato se lahko z cd ..ukazom premaknete navzgor v drevesu imenikov. Prav tako, ko pred imenom aplikacije ali skripta   ./označite lupino, od kod naj zažene aplikacijo ali skript.

Inode in povezave

Kot smo že zajeli, morajo imeti tri komponente, da imajo v datotečnem sistemu dobro oblikovano in dostopno datoteko: datoteka, struktura imenika in inode. Datoteka so podatki, shranjeni na trdem disku, struktura imenika vsebuje ime datoteke in njeno številko inode, inode pa vsebuje vse metapodatke za datoteko.

Simbolične povezave so vnosi datotečnega sistema, ki so videti kot datoteke, vendar so res bližnjice, ki kažejo na obstoječo datoteko ali imenik. Poglejmo, kako jim to uspeva in kako se trije elementi uporabljajo za dosego tega.

Recimo, da imamo imenik z dvema datotekama: ena je skript, druga pa aplikacija, kot je prikazano spodaj.

Z ukazom ln in -s(simbolično) možnost lahko ustvarimo mehko povezavo do datoteke skripta, tako:

ls -s my_script geek.sh

Ustvarili smo povezavo do my_script.shklica geek.sh. Vtipkamo lahko naslednje in si  ls z njimi ogledamo dve skriptni datoteki:

ls -li * .sh

Vnos za se geek.sh prikaže v modri barvi. Prvi znak zastav dovoljenj je "l" za povezavo in  ->kaže na my_script.sh. Vse to pomeni, da geek.shje to povezava.

Kot verjetno pričakujete, imata obe skriptni različni številki inode. Kar je lahko bolj presenetljivo, pa je, da mehka povezava geek.sh, nima enakih uporabniških dovoljenj kot izvirna datoteka skripta. Pravzaprav so dovoljenja za  geek.shveliko bolj liberalna - vsi uporabniki imajo popolna dovoljenja.

Struktura imenika za geek.shvsebuje ime povezave in njeno inode. Ko poskusite uporabiti povezavo, se sklicuje na njen inode, tako kot na običajno datoteko. Inode povezave bo kazal na blok diska, vendar blok diska namesto podatkov o vsebini datoteke vsebuje ime izvirne datoteke. Datotečni sistem preusmeri na izvirno datoteko.

Izvirno datoteko bomo izbrisali in videli, kaj se zgodi, ko za ogled vsebine vtipkamo naslednje  geek.sh:

rm my_script.sh
mačka geek.sh

Simbolična povezava je prekinjena in preusmeritev ne uspe.

Zdaj vtipkamo naslednje, da ustvarimo trdo povezavo do datoteke aplikacije:

V posebni aplikaciji geek-app

Če si želimo ogledati inode za ti dve datoteki, vtipkamo naslednje:

ls -li

Obe sta videti kot običajni datoteki. Nič o tem ne geek-apppomeni, da gre za povezavo na način, kot je lsnaveden v seznamu geek.sh. Poleg tega  geek-app ima enaka uporabniška dovoljenja kot izvirna datoteka. Kar pa bi lahko presenetilo, je, da imata obe aplikaciji enako številko inode: 1441797.

Vnos v imeniku za geek-appvsebuje ime "geek-app" in številko inode, vendar je enak številki inode izvirne datoteke. Torej imamo dva vnosa v datotečnem sistemu z različnimi imeni, ki obe usmerjata na isto inode. Dejansko lahko poljubno število elementov kaže na isto inode.

Vtipkali bomo naslednje in s statprogramom pogledali ciljno datoteko:

stat posebna aplikacija

Vidimo, da na to datoteko kažeta dve trdi povezavi. Ta se shrani v inode.

V naslednjem primeru izbrišemo izvirno datoteko in poskusimo povezavo uporabiti s skrivnim, varnim geslom:

rm posebna aplikacija
./geek-app pravilnohorsebatterystaple

Presenetljivo je, da aplikacija deluje po pričakovanjih, ampak kako? Deluje, ker lahko inode, ko izbrišete datoteko, ponovno uporabite. Struktura imenika je označena s številom inode nič, bloki diska pa so nato na voljo za shranjevanje druge datoteke v tem prostoru.

Če je število trdih povezav do inode večje od ene, se število trdih povezav zmanjša za eno, število inode v imeniški strukturi izbrisane datoteke pa je nastavljeno na nič. Vsebina datotek na trdem disku in inode je še vedno na voljo obstoječim trdim povezavam.

Vtipkali bomo naslednje in še enkrat uporabili stat - tokrat naprej geek-app:

stat geek-app

Te podrobnosti so povlečene iz iste inode (1441797) kot prejšnji statukaz. Število povezav se je zmanjšalo za eno.

Ker imamo eno trdo povezavo do te inode, bi jo, če jo izbrišemo  geek-app, resnično izbrisali. Datotečni sistem bo sprostil inode in imeniško strukturo označil z ničlo nič. Nato lahko nova datoteka prepiše shranjevanje podatkov na trdem disku.

POVEZANE: Kako uporabljati ukaz stat v Linuxu

Inode režijski stroški

to je lep sistem, vendar obstajajo režijski stroški. Za branje datoteke mora datotečni sistem narediti vse naslednje:

  • Poiščite pravo strukturo imenika
  • Preberite številko inode
  • Poiščite pravo inode
  • Preberite informacije o inode
  • Sledite povezavam inode ali ekstenzijam do ustreznih diskovnih blokov
  • Preberite podatke o datoteki

Če so podatki nedosledni, je treba še malo skakati.

Predstavljajte si delo, ki ga je treba opraviti,  ls da lahko v dolgem formatu navedete seznam številnih datotek. Veliko je sem in tja samo zato, lsda dobimo informacije, ki jih potrebujemo za ustvarjanje svojih rezultatov.

Seveda je pospešitev dostopa do datotečnega sistema razlog, zakaj Linux poskuša narediti čim več preventivnega predpomnjenja datotek. To zelo pomaga, toda včasih - kot pri katerem koli datotečnem sistemu - se režijski stroški lahko pokažejo.

Zdaj boste vedeli zakaj.