Kaikki mitä olet halunnut tietää Linuxin inodeista

Linux-tiedostojärjestelmä perustuu inodeihin. Nämä tiedostojärjestelmän sisäisen toiminnan tärkeät osat ymmärretään usein väärin. Katsotaanpa tarkalleen mitä he ovat ja mitä he tekevät.

Tiedostojärjestelmän elementit

Määritelmän mukaan tiedostojärjestelmän on tallennettava tiedostot, ja ne sisältävät myös hakemistoja. Tiedostot tallennetaan hakemistoihin, ja näillä hakemistoilla voi olla alihakemistoja. Jotain, jonnekin, on tallennettava, missä kaikki tiedostot sijaitsevat tiedostojärjestelmässä, mitä heille kutsutaan, mihin tileihin he kuuluvat, mitkä käyttöoikeudet heillä on ja paljon muuta. Tätä tietoa kutsutaan metatiedoksi, koska se kuvaa muita tietoja.

Linuxin ext4-tiedostojärjestelmässä inode- ja hakemistorakenteet tarjoavat yhdessä taustakehyksen, joka tallentaa kaikkien tiedostojen ja hakemistojen kaikki metatiedot. He tekevät metatiedot saatavilla kaikille, jotka sitä edellyttää, onko se ydin, käyttäjän sovelluksia, tai Linux apuohjelmia, kuten ls, statja df.

Inodit ja tiedostojärjestelmän koko

Vaikka on totta, että rakenteita on pari, tiedostojärjestelmä vaatii paljon muuta. Kutakin rakennetta on tuhansia ja tuhansia. Jokainen tiedosto ja hakemisto vaatii inodin, ja koska jokainen tiedosto on hakemistossa, jokainen tiedosto vaatii myös hakemistorakenteen. Hakemistorakenteita kutsutaan myös hakemistomerkinnöiksi tai hammashoitoiksi.

Jokaisella inodilla on inodinumero, joka on ainutlaatuinen tiedostojärjestelmässä. Sama inodinumero voi näkyä useammassa kuin yhdessä tiedostojärjestelmässä. Tiedostojärjestelmän tunnus ja inodinumero muodostavat kuitenkin yksilöllisen tunnisteen riippumatta siitä, kuinka monta tiedostojärjestelmää on asennettu Linux-järjestelmääsi.

Muista, että Linuxissa et asenna kiintolevyä tai osiota. Asennat osiossa olevan tiedostojärjestelmän, joten on helppo käyttää useita tiedostojärjestelmiä huomaamatta sitä. Jos sinulla on useita kiintolevyjä tai osioita yhdellä asemalla, sinulla on useampi kuin yksi tiedostojärjestelmä. Ne voivat olla samantyyppisiä - esimerkiksi kaikki ext4 -, mutta ne ovat silti erillisiä tiedostojärjestelmiä.

Kaikki inodit pidetään yhdessä taulukossa. Inodinumeron avulla tiedostojärjestelmä laskee helposti siirtymän inoditaulukkoon, jossa kyseinen inodi sijaitsee. Voit nähdä, miksi inoden ”i” tarkoittaa hakemistoa.

Inodinumeron sisältävä muuttuja ilmoitetaan lähdekoodissa 32-bittisenä, allekirjoittamattomana pitkänä kokonaislukuna. Tämä tarkoittaa, että inodinumero on kokonaislukuarvo, jonka enimmäiskoko on 2 ^ 32, joka laskee 4 294 967 295: een - reilusti yli 4 miljardiin inodiin.

Se on teoreettinen enimmäismäärä. Käytännössä inodeiden määrä ext4-tiedostojärjestelmässä määritetään, kun tiedostojärjestelmä luodaan oletussuhteella yksi inodi / 16 kt tiedostojärjestelmän kapasiteettia. Hakemistorakenteet luodaan lennossa, kun tiedostojärjestelmä on käytössä, kun tiedostot ja hakemistot luodaan tiedostojärjestelmässä.

Siellä on komento, jonka avulla voit nähdä, kuinka monta inodia on tietokoneen tiedostojärjestelmässä. -i(Inodes) valinnan dfkäskee se näyttää sen tuotannon määrä inodes.

Tarkastelemme ensimmäisen kiintolevyn ensimmäisen osion tiedostojärjestelmää, joten kirjoitamme seuraavan:

df -i / dev / sda1

Tuotos antaa meille:

  • Tiedostojärjestelmä : Tiedostojärjestelmä, josta raportoidaan.
  • Inodit : Inodeiden kokonaismäärä tässä tiedostojärjestelmässä.
  • IUsed : Käytettyjen inodien määrä.
  • IFree : Käytettävissä olevien jäljellä olevien inodien määrä.
  • IUse% : käytettyjen inodien prosenttiosuus.
  • Asennettu : Tämän tiedostojärjestelmän kiinnityskohta.

Olemme käyttäneet 10 prosenttia inodeista tässä tiedostojärjestelmässä. Tiedostot tallennetaan kiintolevylle levylohkoina. Jokainen inodi osoittaa levylohkoihin, jotka tallentavat edustamansa tiedoston sisällön. Jos sinulla on miljoonia pieniä tiedostoja, inodit voivat loppua ennen kuin kiintolevytila ​​loppuu. Se on kuitenkin erittäin vaikea ongelma.

Aiemmin joillakin sähköpostipalvelimilla, jotka tallensivat sähköpostiviestejä erillisinä tiedostoina (mikä johti nopeasti suuriin kokoelmiin pieniä tiedostoja), oli tämä ongelma. Kun nämä sovellukset muuttivat takapäät tietokannoiksi, tämä kuitenkin ratkaisi ongelman. Keskimääräisessä kotijärjestelmässä ei loppu inodeja, mikä on yhtä hyvin, koska ext4-tiedostojärjestelmällä et voi lisätä lisää inodeja asentamatta tiedostojärjestelmää uudelleen.

Jos haluat nähdä tiedostojärjestelmän levylohkojen koon, voit käyttää blockdevkomentoa --getbsz(hanki lohkon koko) -vaihtoehdolla:

sudo blockdev --getbsz / dev / sda

Lohkon koko on 4096 tavua.

Määritetään -B(lohkon koko) -vaihtoehdolla 4096 tavun lohkokoko ja tarkistetaan säännöllinen levyn käyttö:

df -B 4096 / dev / sda1

Tämä tulos näyttää meille:

  • Tiedostojärjestelmä : Tiedostojärjestelmä, josta raportoimme.
  • 4K-lohkot : 4 kt: n lohkojen kokonaismäärä tässä tiedostojärjestelmässä.
  • Käytetty : Kuinka monta 4K-lohkoa on käytössä.
  • Saatavilla : Käytettävissä olevien jäljellä olevien 4 kt: n lohkojen määrä.
  • Käytä% : Käytettyjen 4 kt: n lohkojen prosenttiosuus.
  • Asennettu : Tämän tiedostojärjestelmän kiinnityskohta.

Esimerkissämme tiedostotallennus (ja inodien ja hakemistorakenteiden tallennus) on käyttänyt 28 prosenttia tämän tiedostojärjestelmän tilasta 10 prosentin inodeista, joten olemme hyvässä kunnossa.

Inode-metatiedot

Nähdä inode määrän tiedoston, voimme käyttää lskanssa -i(inode) vaihtoehto:

ls -i geek.txt

Tämän tiedoston inodinumero on 1441801, joten tämä inodi pitää sisällään tämän tiedoston metatiedot ja perinteisesti osoittimet levylohkoihin, joissa tiedosto kiintolevyllä on. Jos tiedosto on pirstaloitunut, erittäin suuri tai molemmat, jotkut lohkot, joihin inode osoittaa, saattavat pitää muita viitteitä muihin levylohkoihin. Ja jotkut näistä muista levylohkoista saattavat myös pitää osoittimia toiseen levylohkoihin. Tämä ratkaisee ongelman, jossa inodi on kiinteä kokoinen ja pystyy pitämään rajallisen määrän osoittimia levylohkoihin.

Tämä menetelmä korvattiin uudella järjestelmällä, jossa käytetään "laajuuksia". Nämä tallentavat jokaisen vierekkäisen lohkon sarjan alku- ja loppulohkot, joita käytetään tiedoston tallentamiseen. Jos tiedosto on fragmentoimaton, sinun on tallennettava vain ensimmäinen lohko ja tiedoston pituus. Jos tiedosto on pirstaloitunut, sinun on tallennettava tiedoston jokaisen osan ensimmäinen ja viimeinen lohko. Tämä menetelmä on (ilmeisesti) tehokkaampi.

Jos haluat nähdä, käyttääkö tiedostojärjestelmä levynlohko-osoittimia vai laajuuksia, voit etsiä inodin sisältä. Tätä varten käytämme debugfskomentoa -R(pyyntö) -vaihtoehdon kanssa ja välitämme sille kiinnostavan tiedoston inodin. Tämä pyytää  debugfs käyttämään sisäistä "stat" -komentoa näyttämään inodin sisällön. Koska inodinumerot ovat ainutlaatuisia vain tiedostojärjestelmässä, meidän on myös kerrottava debugfs tiedostojärjestelmälle, jossa inodi sijaitsee.

Näin esimerkkikomento näyttäisi:

sudo debugfs -R "stat" / dev / sda1

Kuten alla on esitetty, debugfskomento poimii tiedot inodista ja esittelee sen meille less:

Meille näytetään seuraavat tiedot:

  • Inode : Tarkastamamme inodin numero.
  • Tyyppi : Tämä on tavallinen tiedosto, ei hakemisto tai symbolinen linkki.
  • Tila : Tiedoston oikeudet oktaalina.
  • Liput : Indikaattorit, jotka edustavat erilaisia ​​ominaisuuksia tai toimintoja. 0x80000 on "laajuus" -lippu (lisätietoja tästä alla).
  • Sukupolvi : Verkkotiedostojärjestelmä (NFS) käyttää tätä, kun joku käyttää etätiedostojärjestelmiä verkkoyhteyden kautta ikään kuin ne olisi asennettu paikalliseen koneeseen. Inodi- ja sukupolvenumeroita käytetään tiedostomuodon muodossa.
  • Versio : Inodiversio.
  • Käyttäjä : Tiedoston omistaja.
  • Ryhmä : Tiedoston ryhmän omistaja.
  • Projekti : Pitäisi aina olla nolla.
  • Koko : Tiedoston koko.
  • File ACL : Tiedoston käytön valvontaluettelo. Ne on suunniteltu antamaan sinulle hallittu pääsy ihmisille, jotka eivät ole omistajaryhmässä.
  • Linkit : Tiedostoon johtavien kovien linkkien määrä.
  • Lohkoluku : Tähän tiedostoon varatun kiintolevytilan määrä 512 tavun paloina. Tiedostollemme on varattu kahdeksan näistä, mikä on 4096 tavua. Joten 98-tavuinen tiedostomme sijaitsee yhdessä 4096-tavun levylohkossa.
  • Katkelma : Tämä tiedosto ei ole pirstoutunut. (Tämä on vanhentunut lippu.)
  • Ctime : Aika, jolloin tiedosto luotiin.
  • Aika : Aika, jolloin tiedostoa käytettiin viimeksi.
  • Mtime : Aika, jolloin tiedostoa muokattiin viimeksi.
  • Crtime : Aika, jolloin tiedosto luotiin.
  • Ylimääräisten inodikenttien koko : ext4-tiedostojärjestelmä otti käyttöön kyvyn jakaa suurempi levyllä oleva inodi muodon aikana. Tämä arvo on inodein käyttämien ylimääräisten tavujen määrä. Tätä ylimääräistä tilaa voidaan käyttää myös uusien ytimien tulevien vaatimusten täyttämiseen tai laajennettujen määritteiden tallentamiseen.
  • Inodin tarkistussumma : Tämän inodin tarkistussumma , jonka avulla voidaan tunnistaa, onko inodi vioittunut.
  • Laajuudet : Jos käytetään laajennuksia (ext4: ssä, ne ovat oletusarvoisesti), tiedostojen levylohkojen käyttöä koskevassa metatiedossa on kaksi numeroa, jotka osoittavat fragmentoidun tiedoston kunkin osan alku- ja loppulohkot. Tämä on tehokkaampaa kuin tallentaa jokaisen levyn lohko, jonka jokainen tiedoston osa on ottanut. Meillä on yksi laajuus, koska pieni tiedostomme istuu yhdessä levylohkossa tässä lohkon siirtymässä.

Missä tiedoston nimi on?

Meillä on nyt paljon tietoa tiedostosta, mutta kuten olet ehkä huomannut, emme saaneet tiedostonimeä. Täällä hakemistorakenne tulee esiin. Linuxissa, aivan kuten tiedostossa, hakemistossa on inode. Tiedostotietoja sisältävien levylohkojen osoittamisen sijaan hakemiston inode osoittaa levylohkoihin, jotka sisältävät hakemistorakenteita.

Inodiin verrattuna hakemistorakenne sisältää rajoitetun määrän tietoa tiedostosta. Siinä on vain tiedoston inodinumero, nimi ja nimen pituus.

Inode ja hakemistorakenne sisältävät kaiken, mitä sinun (tai sovelluksen) on tiedettävä tiedostosta tai hakemistosta. Hakemistorakenne on hakemistolevylohkossa, joten tiedämme hakemiston, jossa tiedosto on. Hakemistorakenne antaa meille tiedostonimen ja inodinumeron. Inode kertoo meille kaiken muun tiedostosta, mukaan lukien aikaleimat, käyttöoikeudet ja mistä tiedostotiedot löytyvät tiedostojärjestelmästä.

Hakemistoindeksit

Näet hakemiston inodinumeron yhtä helposti kuin tiedostot.

Seuraavassa esimerkissä käytämme ls vaihtoehtoja -l(pitkä muoto), -i(inode) ja -d(hakemisto) ja tarkastelemme workhakemistoa:

ls-työ /

Koska käytimme -d(hakemisto) -vaihtoehtoa,  lsraportit itse hakemistosta, ei sen sisällöstä. Tämän hakemiston inode on 1443016.

Toistaaksesi tämän homehakemistolle, kirjoita seuraava:

ls -lid ~

homeHakemiston inode on 1447510, ja workhakemisto on kotihakemistossa. Katsotaan nyt workhakemiston sisältöä . Sijasta  -d(hakemiston) vaihtoehto, käytämme -a(kaikki) vaihtoehto. Tämä näyttää meille yleensä piilotetut hakemistomerkinnät.

Kirjoitamme seuraavat:

ls -lia työ /

Koska käytimme -avaihtoehtoa (kaikki), yhden (.) Ja kaksoispisteen (..) merkinnät näytetään. Nämä merkinnät edustavat itse hakemistoa (yksi piste) ja sen päähakemistoa (kaksoispiste).

Jos tarkastelet yhden pisteen merkinnän inodinumeroa, se on 1443016 - sama inodinumero, jonka saimme löydettäessä workhakemiston inodinumeron . Kahden pisteen merkinnän inodinumero on sama kuin homehakemiston inodinumero .

Siksi voit käyttää cd ..komentoa siirtyäksesi ylöspäin hakemistopuussa. Samoin kun edeltät sovelluksen tai komentosarjan nimeä   ./, ilmoitat kuorelle, mistä sovellus tai komentosarja käynnistetään.

Inodit ja linkit

Kuten olemme käsitelleet, vaaditaan kolme komponenttia, jotta tiedostojärjestelmässä on hyvin muodostettu ja helposti käytettävissä oleva tiedosto: tiedosto, hakemistorakenne ja inode. Tiedosto on kiintolevylle tallennettu data, hakemistorakenne sisältää tiedoston nimen ja sen inodinumeron, ja inode sisältää kaikki tiedoston metatiedot.

Symboliset linkit ovat tiedostojärjestelmämerkintöjä, jotka näyttävät tiedostoilta, mutta ne ovat oikotiet, jotka viittaavat olemassa olevaan tiedostoon tai hakemistoon. Katsotaanpa, kuinka he hallitsevat tämän ja miten näitä kolmea elementtiä käytetään tämän saavuttamiseen.

Oletetaan, että meillä on hakemisto, jossa on kaksi tiedostoa: yksi on komentosarja ja toinen on sovellus, kuten alla on esitetty.

Voimme käyttää komentoa ln ja -s(symbolinen) -vaihtoehtoa luoda pehmeä linkki komentotiedostoon, kuten:

ls -s my_script geek.sh

Olemme luoneet linkin my_script.shsoitettuihin geek.sh. Voimme kirjoittaa seuraavat ja käyttää  ls niitä tarkastelemaan kahta komentotiedostoa:

ls -li * .sh

Kohteen nimi geek.sh näkyy sinisenä. Käyttöoikeuslippujen ensimmäinen merkki on linkin “l” ja  ->osoittaa my_script.sh. Kaikki tämä osoittaa geek.shlinkin.

Kuten luultavasti odotat, kahdella komentotiedostolla on erilaiset inodinumerot. Mikä voi olla yllättävämpää, on kuitenkin, että pehmeällä linkillä geek.shei ole samoja käyttäjän oikeuksia kuin alkuperäisellä komentotiedostolla. Itse asiassa käyttöoikeudet  geek.shovat paljon liberaalimpia - kaikilla käyttäjillä on täydet käyttöoikeudet.

Kohteen hakemistorakenne geek.shsisältää linkin nimen ja sen inodin. Kun yrität käyttää linkkiä, sen inodiin viitataan, kuten tavalliseen tiedostoon. Linkin inode osoittaa levylohkoon, mutta sen sijaan, että se sisältäisi tiedostosisältötietoja, levylohko sisältää alkuperäisen tiedoston nimen. Tiedostojärjestelmä ohjaa alkuperäisen tiedoston.

Poistamme alkuperäisen tiedoston ja näemme, mitä tapahtuu, kun kirjoitamme seuraavan sisällön tarkastelemiseksi  geek.sh:

rm my_script.sh
kissa geek.sh

Symbolinen linkki on rikki ja uudelleenohjaus epäonnistuu.

Kirjoittamme nyt seuraavan muodostaaksemme kovan linkin sovellustiedostoon:

erityissovelluksen geek-sovellus

Voit tarkastella näiden kahden tiedoston inodeja kirjoittamalla seuraavat:

ls -li

Molemmat näyttävät tavallisilta tiedostoilta. Mikään ei geek-appviittaa siihen, että se on linkki tapaan, jolla lsluettelo geek.shteki. Lisäksi  geek-app sillä on samat käyttöoikeudet kuin alkuperäisellä tiedostolla. Mikä voi olla yllättävää, on kuitenkin, että molemmilla sovelluksilla on sama inodinumero: 1441797.

Kohteen hakemistomerkintä geek-appsisältää nimen "geek-app" ja inodinumeron, mutta se on sama kuin alkuperäisen tiedoston inodinumero. Joten meillä on kaksi tiedostojärjestelmämerkintää eri nimillä, jotka molemmat osoittavat samaan inodiin. Itse asiassa mikä tahansa määrä kohteita voi osoittaa samaan inodiin.

Kirjoitamme seuraavan ja tarkastelemme statohjelmaa kohdetiedostoon:

stat special-app

Näemme, että kaksi kovaa linkkiä viittaavat tähän tiedostoon. Tämä on tallennettu inodiin.

Seuraavassa esimerkissä poistamme alkuperäisen tiedoston ja yritämme käyttää linkkiä salaisella, suojatulla salasanalla:

rm special-sovellus
./geek-app correcthorsebatterystaple

Yllättäen sovellus toimii odotetulla tavalla, mutta miten? Se toimii, koska kun poistat tiedoston, inode voidaan vapaasti käyttää uudelleen. Hakemistorakenteella on merkintä, että inodinumero on nolla, ja levylohkot ovat sitten käytettävissä toiselle tiedostolle, joka voidaan tallentaa kyseiseen tilaan.

Jos kovien linkkien määrä inodiin on suurempi kuin yksi, kovien linkkien lukumäärä pienenee yhdellä ja poistetun tiedoston hakemistorakenteen inodinumero asetetaan nollaksi. Kiintolevyn ja inodin tiedostosisältö ovat edelleen olemassa olevien kiintolevyjen käytettävissä.

Kirjoitamme seuraavan ja käytämme statia vielä kerran - tällä kertaa geek-app:

stat geek-app

Nämä yksityiskohdat vedetään samasta inodista (1441797) kuin edellinen statkomento. Linkkien määrää vähennettiin yhdellä.

Koska meillä on yksi kova linkki tähän inodiin, jos poistamme  geek-app, se todella poistaa tiedoston. Tiedostojärjestelmä vapauttaa inodin ja merkitsee hakemistorakenteen nollalla. Uusi tiedosto voi sitten korvata kiintolevyn tietojen tallennuksen.

RELATED: Kuinka käyttää stat-komentoa Linuxissa

Inode-yleiskustannukset

se on siisti järjestelmä, mutta on yleiskustannuksia. Tiedoston lukemiseksi tiedostojärjestelmän on tehtävä kaikki seuraavat:

  • Etsi oikea hakemistorakenne
  • Lue inodinumero
  • Löydä oikea inode
  • Lue inoditiedot
  • Seuraa joko inode-linkkejä tai asianomaisten levylohkojen laajuuksia
  • Lue tiedostotiedot

Hieman enemmän hyppäämistä tarvitaan, jos tiedot eivät ole yhtäjaksoisia.

Kuvittele työ, joka on tehtävä  ls monien tiedostojen pitkäformaatisen tiedostoluettelon suorittamiseksi. Siellä on paljon edestakaisin vain lssaadakseen tiedot, joita se tarvitsee tuotoksensa luomiseen.

Tietysti tiedostojärjestelmän käytön nopeuttaminen on syy siihen, miksi Linux yrittää tehdä mahdollisimman paljon ennakoivaa tiedostojen välimuistia. Tämä auttaa suuresti, mutta joskus - kuten missä tahansa tiedostojärjestelmässä - yleiskustannukset voivat ilmetä.

Nyt tiedät miksi.