Kõik, mida olete kunagi tahtnud teada Linuxi inoodide kohta

Linuxi failisüsteem tugineb inoodidele. Neid failisüsteemi sisemise toimimise olulisi osi mõistetakse sageli valesti. Vaatame täpselt, mis nad on ja mida nad teevad.

Failisüsteemi elemendid

Definitsiooni järgi peab failisüsteem faile salvestama ja need sisaldavad ka katalooge. Failid salvestatakse kataloogidesse ja nendel kataloogidel võivad olla alamkataloogid. Midagi peab kusagil salvestama, kus kõik failid failisüsteemis asuvad, kuidas neid nimetatakse, millistele kontodele nad kuuluvad, millised õigused neil on ja palju muud. Seda teavet nimetatakse metaandmeteks, kuna see kirjeldab muid andmeid.

Linuxi ext4-failisüsteemis töötavad inode- ja kataloogistruktuurid koos, et luua alusraamistik, mis salvestab kõigi failide ja kataloogide kõik metaandmed. Nad muudavad metaandmed kättesaadavaks kõigile, kes seda vajavad, olgu see siis kernel, kasutajarakendused või Linuxi utiliidid, näiteks ls, statja df.

Inodes ja failisüsteemi suurus

Kuigi on tõsi, et seal on paar struktuuri, nõuab failisüsteem palju muud. Iga struktuuri on tuhandeid ja tuhandeid. Kõik failid ja kataloogid vajavad inoodi ja kuna kõik failid asuvad kataloogis, vajavad kõik failid ka kataloogistruktuuri. Kataloogistruktuure nimetatakse ka kataloogikirjeteks ehk hambaproteesideks.

Igal inoodil on inode number, mis on failisüsteemis ainulaadne. Sama inoodinumber võib ilmuda rohkem kui ühes failisüsteemis. Kuid failisüsteemi ID ja inode number moodustavad ainulaadse identifikaatori, hoolimata sellest, kui palju failisüsteeme on teie Linuxi süsteemile ühendatud.

Pidage meeles, et Linuxis ei ühendata kõvaketast ega partitsiooni. Paigaldate partitsioonil oleva failisüsteemi, nii et mitut failisüsteemi saab hõlpsasti omada. Kui teil on ühel kettal mitu kõvaketast või sektsiooni, on teil mitu failisüsteemi. Need võivad olla sama tüüpi - näiteks kõik ext4 -, kuid on siiski erinevad failisüsteemid.

Kõik inoodid on ühes tabelis. Inode numbri abil arvutab failisüsteem hõlpsasti nihke inooditabelisse, kus see inood asub. Saate aru, miks inode tähis „i” tähistab indeksit.

Inoodinumbrit sisaldav muutuja deklareeritakse lähtekoodis 32-bitise allkirjastamata pika täisarvuna. See tähendab, et inoodinumber on täisarv väärtus maksimaalse suurusega 2 ^ 32, mis arvutab välja 4 294 967 295 - tublisti üle 4 miljardi inoodi.

See on teoreetiline maksimum. Praktikas määratakse ext4-failisüsteemi inoodide arv siis, kui failisüsteem luuakse vaikesuhtega üks inood 16 KB failisüsteemi mahtuvuse kohta. Kataloogistruktuurid luuakse käigult, kui failisüsteem on kasutusel, kuna failid ja kataloogid luuakse failisüsteemis.

Seal on käsk, mille abil saate vaadata, kui palju inode on teie arvutis failisüsteemis. The -i (inodes) võimalus df käsk käsib kuvada väljundit inoodide arvuna.

Vaatame esimese kõvaketta esimese sektsiooni failisüsteemi, nii et sisestame järgmise:

df -i / dev / sda1

Väljund annab meile:

  • Failisüsteem: Failisüsteem, millest teatatakse.
  • Inodes: Selles failisüsteemis olevate inoodide koguarv.
  • Ma kasutasin: Kasutatavate inoodide arv.
  • IFree: Järelejäänud kasutatavate inode arv.
  • Ma kasutan%: Kasutatud inoodide protsent.
  • Paigaldatud: Selle failisüsteemi ühenduspunkt.

Oleme selles failisüsteemis kasutanud 10 protsenti inoodidest. Failid salvestatakse kõvakettale kettablokkidena. Iga inood osutab kettablokkidele, mis talletavad nende esindatava faili sisu. Kui teil on miljoneid pisikesi faile, võite enne kõvakettaruumi lõppemist inodes otsa saada. See on aga väga keeruline probleem.

Varem oli see probleem mõnel meiliserveril, mis salvestas e-kirju diskreetsete failidena (mis viis kiiresti väikeste failide suurte kogudeni). Kui need rakendused muutsid oma tagumised otsad andmebaasideks, lahendas see siiski probleemi. Keskmises kodusüsteemis inoodid otsa ei saa, mis on sama hästi, sest ext4-failisüsteemi abil ei saa te rohkem inode lisada ilma failisüsteemi uuesti installimata.

Failisüsteemi kettablokkide suuruse nägemiseks võite kasutada blockdev käsk --getbsz (saada ploki suurus) variant:

sudo blockdev --getbsz / dev / sda

Ploki suurus on 4096 baiti.

Kasutame -B (ploki suurus) võimalus määrata 4096 baiti ploki suurus ja kontrollida tavalist kettakasutust:

df -B 4096 / dev / sda1

See väljund näitab meile:

  • Failisüsteem: Failisüsteem, mille kohta me aru anname.
  • 4K-plokid: Selles failisüsteemis olevate 4 kB plokkide koguarv.
  • Kasutatud: Mitu 4K plokki on kasutusel.
  • Saadaval: Järelejäänud 4 KB kasutatavate plokkide arv.
  • Kasuta%: Kasutatud 4 kB plokkide protsent.
  • Paigaldatud: Selle failisüsteemi ühenduspunkt.

Meie näites on failisalvestus (ja inoodide ning kataloogistruktuuride salvestamine) kasutanud selles failisüsteemis 28 protsenti ruumist 10 protsendi inoodide hinnaga, seega oleme heas seisukorras.

Inode metaandmed

Faili inode numbri nägemiseks saame seda kasutada ls koos -i (inode) variant:

ls -i geek.txt

Selle faili inoodinumber on 1441801, nii et see inood hoiab selle faili metaandmeid ja traditsiooniliselt viiteid kettablokkidele, kus fail kõvakettal asub. Kui fail on killustatud, väga suur või mõlemad, võivad mõned plokid, millele inode osutab, hoida täiendavaid viiteid teistele kettablokkidele. Ja mõned neist teistest kettablokkidest võivad omada ka viiteid teisele kettablokkide komplektile. See ületab probleemi, et inood on kindla suurusega ja suudab hoida lõplikku arvu näpunäiteid kettablokkide jaoks.

Selle meetodi asendas uus skeem, mis kasutab “ulatusi”. Need salvestavad iga faili salvestamiseks kasutatud külgnevate plokkide komplekti algus- ja lõpploki. Kui fail on killustamata, peate salvestama ainult esimese ploki ja faili pikkuse. Kui fail on killustatud, peate salvestama faili iga osa esimese ja viimase ploki. See meetod on (ilmselgelt) tõhusam.

Kui soovite teada saada, kas teie failisüsteem kasutab kettablokkide osutajaid või ulatust, võite vaadata inoodi sisemust. Selleks kasutame silumine käsk -R (taotlus) valik ja edastage see huvipakkuva faili inode. See küsibsilumine kasutada sisemist käsku “stat” inoodi sisu kuvamiseks. Kuna inoodnumbrid on ainulaadsed ainult failisüsteemis, peame ka seda ütlema silumine failisüsteem, kus inood asub.

See näide näeb välja järgmine:

sudo debugfs -R "stat" / dev / sda1

Nagu allpool näidatud, silumine käsk ekstraheerib inoodilt teabe ja esitab selle meile vähem:

Meile kuvatakse järgmine teave:

  • Inode: Vaadatava inoodi number.
  • Tüüp: See on tavaline fail, mitte kataloog ega sümboolne link.
  • Režiim: Faili õigused oktaalides.
  • Lipud: Näitajad, mis tähistavad erinevaid funktsioone või funktsioone. 0x80000 on lipp "ulatus" (sellest leiate allpool).
  • Põlvkond: Võrgufailisüsteem (NFS) kasutab seda, kui keegi pöördub kaugfailisüsteemide poole võrguühenduse kaudu nii, nagu oleks nad ühendatud kohalikku masinasse. Inode- ja põlvkonnanumbreid kasutatakse failikäitluse vormina.
  • Versioon: Inode versioon.
  • Kasutaja: Faili omanik.
  • Grupp: Faili grupi omanik.
  • Projekt: Peaks alati olema null.
  • Suurus: Faili suurus.
  • Fail ACL: Failile juurdepääsu kontrollimise loend. Need olid loodud selleks, et saaksite anda kontrollitud juurdepääsu inimestele, kes ei kuulu omanikegruppi.
  • Lingid: Failiga seotud linkide arv.
  • Blockcount: Sellele failile eraldatud kõvakettaruumi suurus, antud 512-baidiste tükkidena. Meie failile on eraldatud neist kaheksa, mis on 4096 baiti. Niisiis, meie 98-baidine fail asub ühes 4096-baidises kettablokis.
  • Fragment: See fail pole killustatud. (See on vananenud lipp.)
  • Ctime: Faili loomise aeg.
  • Aeg: Aeg, millal seda faili viimati kasutati.
  • Mtime: Aeg, millal seda faili viimati muudeti.
  • Crtime: Faili loomise aeg.
  • Täiendavate inoodiväljade suurus: Ext4-failisüsteem tutvustas võimalust eraldada vormingus suuremat kettal olevat inoodi. See väärtus on inode kasutatavate lisabaitide arv. Seda lisaruumi saab kasutada ka uute tuumade tulevaste nõuete rahuldamiseks või laiendatud atribuutide salvestamiseks.
  • Inode kontrollsumma: Selle inoodi kontrollsumma, mis võimaldab tuvastada, kas inood on rikutud.
  • Ulatus: Kui kasutatakse ekstreeme (ext4-l, on need vaikimisi), on failide kettabloki kasutamise metaandmetel kaks numbrit, mis tähistavad killustatud faili iga osa algus- ja lõpplokki. See on tõhusam kui faili iga osa haaratud iga kettabloki salvestamine. Meil on üks ulatus, kuna meie väike fail asub selles ploki nihkes ühes kettablokis.

Kus on faili nimi?

Nüüd on meil faili kohta palju teavet, kuid nagu te ehk märkasite, ei saanud me failinime kätte. Siin tuleb mängu kataloogistruktuur. Linuxis, nagu failis, on ka kataloogis inood. Selle asemel, et osutada failiandmeid sisaldavatele kettablokkidele, osutab kataloogis olev inode kataloogistruktuure sisaldavatele kettablokkidele.

Võrreldes inoodiga sisaldab kataloogistruktuur faili kohta piiratud hulgal teavet. See sisaldab ainult faili inode numbrit, nime ja nime pikkust.

Inood ja kataloogistruktuur sisaldavad kõike, mida peate faili või kataloogi kohta teadma (või mõni rakendus). Kataloogistruktuur asub kataloogikettal, seega teame kataloogi, milles fail asub. Kataloogistruktuur annab meile failinime ja inode numbri. Inood ütleb meile faili kohta kõik muu, sealhulgas ajatemplid, õigused ja kust failiandmeid failisüsteemist leida.

Kataloogide koodid

Kataloogi inode numbrit näete sama lihtsalt kui failide puhul.

Järgmises näites kasutame ls koos -L (pikk formaat), -i (inode) ja -d (kataloog) valikud ja vaadake töö kataloog:

ls -lid töö /

Sest me kasutasime -d (kataloog) valik,ls aruanded kataloogi enda, mitte selle sisu kohta. Selle kataloogi inood on 1443016.

Korrata seda Kodu kataloogi, sisestame järgmise:

ls -lid ~

Infosõlmele jaoks Kodu kataloog on 1447510 ja töö kataloog asub kodukataloogis. Vaatame nüüd töö kataloogi. Selle asemel-d (kataloog) valik, kasutame -a (kõik) variant. See näitab meile kataloogikirjeid, mis tavaliselt on peidetud.

Sisestame järgmise:

ls -lia töö /

Sest me kasutasime -a (kõik) suvand, kuvatakse ühe- (.) ja kahe punktiga (..) kirjed. Need kirjed tähistavad kataloogi ennast (üks punkt) ja selle vanemat kataloogi (topeltpunkt).

Kui vaatate ühe punktiga kirje inoodinumbrit, siis see on 1443016 - sama inoodinumber, mille saime, kui avastasime töö kataloogi. Samuti on kahepunktilise sissekande inode number sama, mis sisendi number Kodu kataloogi.

Sellepärast saate kasutada cd .. käsk kataloogipuus tasemel ülespoole liikumiseks. Samamoodi, kui eelnete rakenduse või skripti nimele./, annate kestale teada, kust rakendus või skript käivitada.

Inoodid ja lingid

Nagu me oleme käsitlenud, on vaja hästi vormistatud ja juurdepääsetava faili failisüsteemis kolme komponenti: fail, kataloogistruktuur ja inood. Fail on kõvakettale salvestatud andmed, kataloogistruktuur sisaldab faili nime ja selle inode numbrit ning inode sisaldab kõiki faili metaandmeid.

Sümboolsed lingid on failisüsteemi kirjed, mis näevad välja nagu failid, kuid need on tõesti otseteed, mis osutavad olemasolevale failile või kataloogile. Vaatame, kuidas nad sellega hakkama saavad ja kuidas kolme elementi selle saavutamiseks kasutatakse.

Oletame, et meil on kataloog, kus on kaks faili: üks on skript ja teine ​​rakendus, nagu allpool näidatud.

Saame kasutada käsku ln ja -s (sümboolne) võimalus luua skriptifailile pehme link, näiteks:

ls -s my_script geek.sh

Oleme loonud lingi my_script.sh helistas geek.sh. Saame tippida järgmise ja kasutadals kahte skriptifaili vaadata:

ls -li * .sh

Kanne geek.sh ilmub sinisega. Õiguste lippude esimene märk on lingi tähis lingi jaoks ja-> osutab my_script.sh . Kõik see viitab sellele geek.sh on link.

Nagu arvata võib, on kahel skriptifailil erinevad inode numbrid. Mis aga võib olla üllatavam, on pehme link, geek.sh, pole algse skriptifailiga samu kasutajaõigusi. Tegelikult on õigusedgeek.sh on palju liberaalsemad - kõigil kasutajatel on täielikud õigused.

Domeeni kataloogistruktuur geek.sh sisaldab lingi nime ja selle inoodi. Kui proovite linki kasutada, viidatakse selle inoodile nagu tavalisele failile. Lingi inode osutab kettablokile, kuid failisisuandmete sisaldamise asemel sisaldab kettablokk algse faili nime. Failisüsteem suunab algse faili.

Kustutame algfaili ja näeme, mis juhtub, kui sisestame sisu vaatamiseks järgmisegeek.sh:

rm my_script.sh
kass geek.sh

Sümboolne link on katki ja ümbersuunamine nurjub.

Rakendusfaili kõva lingi loomiseks tippime nüüd järgmise.

spetsiaalse rakenduse geek-rakenduses

Nende kahe faili inode vaatamiseks sisestame järgmise:

ls -li

Mõlemad näevad välja nagu tavalised failid. Ei midagi geek-rakendus näitab, et see on link ls loend geek.sh tegi. Lisaksgeek-rakendus on algse failiga samad kasutajaõigused. Üllatav võib aga olla see, et mõlemal rakendusel on sama inode number: 1441797.

Kataloogi kirje geek-rakendus sisaldab nime „geek-app” ja inoodinumbrit, kuid see on sama mis algse faili inoodinumber. Seega on meil kaks erineva nimega failisüsteemi kirjet, mis mõlemad osutavad samale inoodile. Tegelikult võib ükskõik milline arv üksusi osutada samale inoodile.

Sisestame järgmise ja kasutame stat programm sihtfaili vaatamiseks:

stat special-app

Näeme, et sellele failile osutavad kaks kõvaketta linki. See salvestatakse inode.

Järgmises näites kustutame algfaili ja proovime linki kasutada salajase, turvalise parooliga:

rm spetsiaalne rakendus
./geek-app correcthorsebatterystaple

Üllatuslikult töötab rakendus ootuspäraselt, aga kuidas? See töötab, kuna faili kustutamisel on inode tasuta uuesti kasutada. Kataloogistruktuur on tähistatud nulliga inoodinumbrina ja seejärel on kettablokid saadaval selles ruumis teise faili jaoks.

Kui inoodiga seotud kõvaketta linkide arv on suurem kui üks, vähendatakse kõvaketaste arvu ühe võrra ja kustutatud faili kataloogistruktuuri inoodi number on null. Kõvakettal ja inode'is olev failide sisu on endiselt saadaval olemasolevatele kõvakettalinkidele.

Sisestame järgmise ja kasutame stat veel kord - seekord edasi geek-rakendus:

stat geek-rakendus

Need üksikasjad on tõmmatud samast inoodist (1441797) kui eelmine stat käsk. Lingide arvu vähendati ühe võrra.

Sest kui me kustutame, on sellel inoodil üks kindel linkgeek-rakendus, see kustutab faili tõeliselt. Failisüsteem vabastab inoodi ja tähistab kataloogistruktuuri nulliga. Uus fail saab seejärel kõvakettale salvestatud andmesalvestuse üle kirjutada.

SEOTUD:Kuidas käsku stat kasutada Linuxis

Inode üldkulud

see on korralik süsteem, kuid on ka üldkulusid. Faili lugemiseks peab failisüsteem tegema kõik järgmised toimingud:

  • Leidke õige kataloogistruktuur
  • Lugege inode numbrit
  • Leidke õige inode
  • Lugege inode teavet
  • Järgige kas inode linke või asjakohaste ketasplokkide ulatust
  • Lugege faili andmeid

Veidi rohkem ringi hüppamine on vajalik, kui andmed on pidevad.

Kujutage ette tööd, mille nimel tuleb tehals paljude failide pika formaadiga failide loendi esitamiseks. Ainult selleks on palju edasi-tagasi ls väljundi genereerimiseks vajaliku teabe saamiseks.

Muidugi on failisüsteemile juurdepääsu kiirendamine see, miks Linux üritab võimalikult palju ennetavat failide vahemällu salvestamist. See aitab palju, kuid mõnikord - nagu iga failisüsteemi puhul - võivad üldkulud ilmneda.

Nüüd saate teada, miks.


$config[zx-auto] not found$config[zx-overlay] not found