Tot el que heu volgut saber sobre els inodes a Linux

El sistema de fitxers Linux es basa en inodes. Sovint s’entenen malament aquestes peces vitals del funcionament intern del sistema de fitxers. Vegem exactament què són i què fan.

Els elements d’un sistema de fitxers

Per definició, un sistema de fitxers necessita emmagatzemar fitxers i també contenen directoris. Els fitxers s’emmagatzemen dins dels directoris i aquests directoris poden tenir subdirectoris. Alguna cosa, en algun lloc, ha de registrar on es troben tots els fitxers del sistema de fitxers, com s’anomenen, a quins comptes pertanyen, a quins permisos tenen i molt més. Aquesta informació s’anomena metadades perquè són dades que descriuen altres dades.

Al sistema de fitxers Linux ext4, les estructures inode i directori treballen juntes per proporcionar un marc de suport que emmagatzema totes les metadades de cada fitxer i directori. Permeten que les metadades estiguin disponibles per a tothom qui ho requereixi, ja sigui el nucli, les aplicacions d’usuari o les utilitats Linux, com ara ls, estadística, i df.

Inodes i mida del sistema de fitxers

Tot i que és cert que hi ha un parell d’estructures, un sistema de fitxers en requereix moltes més. Hi ha milers i milers de cada estructures. Cada fitxer i directori requereix un inode i, com que cada fitxer es troba en un directori, cada fitxer també requereix una estructura de directori. Les estructures de directoris també s'anomenen entrades de directori o "dentals".

Cada inode té un número d’inode, que és únic dins d’un sistema de fitxers. És possible que aparegui el mateix número d’inode en més d’un sistema de fitxers. Tanmateix, l'identificador del sistema de fitxers i el número d'inode es combinen per crear un identificador únic, independentment del nombre de sistemes de fitxers muntats al vostre sistema Linux.

Recordeu, a Linux, que no munteu un disc dur ni una partició. Munteu el sistema de fitxers que hi ha a la partició, de manera que és fàcil tenir diversos sistemes de fitxers sense adonar-vos-en. Si teniu diverses unitats de disc dur o particions en una sola unitat, teniu més d’un sistema de fitxers. Podrien ser del mateix tipus (tots els ext4, per exemple), però continuaran sent sistemes de fitxers diferents.

Tots els inodes es mantenen en una taula. Mitjançant un número d’inode, el sistema de fitxers calcula fàcilment el desplaçament a la taula d’inodes on es troba aquest inode. Podeu veure per què la “i” de l’inode significa índex.

La variable que conté el número d’inode es declara al codi font com un enter llarg de 32 bits sense signar. Això significa que el nombre d’inodes és un valor enter amb una mida màxima de 2 ^ 32, que es calcula a 4.294.967.295, més de 4.000 milions d’inodes.

Aquest és el màxim teòric. A la pràctica, el nombre d’inodes d’un sistema de fitxers ext4 es determina quan el sistema de fitxers es crea amb una proporció predeterminada d’un inode per 16 KB de capacitat del sistema de fitxers. Les estructures de directoris es creen sobre la marxa quan s’utilitza el sistema de fitxers, ja que els fitxers i directoris es creen dins del sistema de fitxers.

Hi ha una ordre que podeu utilitzar per veure quants inodes hi ha en un sistema de fitxers de l’ordinador. El -i (inodes) de l'opció df L'ordre li indica que mostri la seva sortida en nombre d'inodes.

Veurem el sistema de fitxers de la primera partició del primer disc dur, de manera que escrivim el següent:

df -i / dev / sda1

La sortida ens dóna:

  • Sistema de fitxers: S'ha informat del sistema de fitxers.
  • Inodes: El nombre total d’inodes d’aquest sistema de fitxers.
  • Jo solia: El nombre d’inodes en ús.
  • IFree: El nombre d’inodes restants disponibles per utilitzar.
  • Jo utilitzo%: Percentatge d’inodes utilitzats.
  • Muntat a sobre: El punt de muntatge d'aquest sistema de fitxers.

Hem fet servir el 10 per cent dels inodes d’aquest sistema de fitxers. Els fitxers s’emmagatzemen al disc dur en blocs de disc. Cada inode apunta als blocs de disc que emmagatzemen el contingut del fitxer que representen. Si teniu milions de petits fitxers, podeu quedar-vos sense inodes abans que us quedeu sense espai al disc dur. Tot i això, és un problema molt difícil de trobar.

En el passat, alguns servidors de correu que emmagatzemaven missatges de correu electrònic com a fitxers discrets (que van conduir ràpidament a grans col·leccions de fitxers petits) tenien aquest problema. Quan aquestes aplicacions van canviar els seus extrems posteriors a bases de dades, això va resoldre el problema. El sistema domèstic mitjà no es quedarà sense inodes, cosa que és igual perquè, amb el sistema de fitxers ext4, no es poden afegir més inodes sense reinstal·lar-lo.

Per veure la mida dels blocs de disc al vostre sistema de fitxers, podeu utilitzar el fitxer blockdev ordre amb el fitxer --getbsz (obtenir la mida del bloc) opció:

sudo blockdev --getbsz / dev / sda

La mida del bloc és de 4096 bytes.

Utilitzem el -B (mida del bloc) opció per especificar una mida de bloc de 4096 bytes i comprovar l'ús normal del disc:

df -B 4096 / dev / sda1

Aquesta sortida ens mostra:

  • Sistema de fitxers: El sistema de fitxers sobre el qual informem.
  • Blocs 4K: El nombre total de blocs de 4 KB en aquest sistema de fitxers.
  • Usat: Quants blocs 4K s’utilitzen.
  • Disponible: El nombre de blocs restants de 4 KB disponibles per al seu ús.
  • Utilitza%: Percentatge de blocs de 4 KB que s'han utilitzat.
  • Muntat a sobre: El punt de muntatge d'aquest sistema de fitxers.

En el nostre exemple, l’emmagatzematge de fitxers (i l’emmagatzematge dels inodes i les estructures de directoris) ha utilitzat el 28 per cent de l’espai d’aquest sistema de fitxers, al preu del 10 per cent dels inodes, de manera que estem en bona forma.

Metadades Inode

Per veure el número d’inode d’un fitxer, podem utilitzar-lo ls amb el -i opció (inode):

ls -i geek.txt

El número d’inode d’aquest fitxer és 1441801, de manera que aquest inode conté les metadades d’aquest fitxer i, tradicionalment, els indicadors dels blocs de disc on resideix el fitxer al disc dur. Si el fitxer està fragmentat, molt gran o tots dos, alguns dels blocs als quals apunta l’inode poden contenir altres indicadors a altres blocs de disc. I alguns d’aquests altres blocs de disc també poden contenir indicadors a un altre conjunt de blocs de disc. Això supera el problema de que l’inode és de mida fixa i pot contenir un nombre finit de punteres als blocs de disc.

Aquest mètode va ser substituït per un nou esquema que fa ús de les "extensions". Aquests registren el bloc inicial i final de cada conjunt de blocs contigus que s’utilitzen per emmagatzemar el fitxer. Si el fitxer no està fragmentat, només haureu d'emmagatzemar el primer bloc i la longitud del fitxer. Si el fitxer està fragmentat, haureu d'emmagatzemar el primer i l'últim bloc de cada part del fitxer. Aquest mètode (òbviament) és més eficient.

Si voleu veure si el vostre sistema de fitxers utilitza punters o extensions de bloc de disc, podeu mirar dins d’un inode. Per fer-ho, utilitzarem el fitxer depuracions ordre amb el fitxer -R (sol·licitud) i passar-li l'inode del fitxer d'interès. Això preguntadepuracions utilitzar la seva comanda interna "stat" per mostrar el contingut de l'inode. Com que els números d’inode només són únics dins d’un sistema de fitxers, també ho hem de dir depuracions el sistema de fitxers on resideix l’inode.

A continuació, es mostra l'ordre d'aquest exemple:

sudo debugfs -R "stat" / dev / sda1

Com es mostra a continuació, el fitxer depuracions L'ordre extreu la informació de l'inode i ens la presenta a menys:

Se'ns mostra la informació següent:

  • Inode: El número de l’inode que estem mirant.
  • Tipus: Es tracta d'un fitxer normal, no d'un directori ni d'un enllaç simbòlic.
  • Mode: Els permisos del fitxer en octal.
  • Banderes: Indicadors que representen diferents funcions o funcionalitats. El 0x80000 és el senyalador "extents" (més informació a continuació).
  • Generació: Un sistema de fitxers de xarxa (NFS) ho fa servir quan algú accedeix a sistemes de fitxers remots mitjançant una connexió de xarxa com si estiguessin muntats a la màquina local. Els nodes d’inode i de generació s’utilitzen com a forma de control de fitxers.
  • Versió: La versió inode.
  • Usuari: El propietari del fitxer.
  • Grup: Propietari del grup del fitxer.
  • Projecte: Ha de ser sempre zero.
  • Mida: La mida del fitxer.
  • Arxiu ACL: La llista de control d'accés a fitxers. Es van dissenyar per permetre l'accés controlat a les persones que no formen part del grup de propietaris.
  • Enllaços: El nombre d'enllaços durs al fitxer.
  • Recompte de blocs: La quantitat d'espai del disc dur assignat a aquest fitxer, indicat en trossos de 512 bytes. Al nostre fitxer se li han assignat vuit, que són 4.096 bytes. Per tant, el nostre fitxer de 98 bytes es troba dins d’un bloc de disc de 4.096 bytes.
  • Fragment: Aquest fitxer no està fragmentat. (Aquesta és una bandera obsoleta.)
  • Ctime: L'hora en què es va crear el fitxer.
  • Un temps de: Hora en què es va accedir per última vegada a aquest fitxer.
  • Mtime: Hora en què es va modificar per última vegada aquest fitxer.
  • Crtime: Hora en què es va crear el fitxer.
  • Mida dels camps d’inode addicionals: El sistema de fitxers ext4 va introduir la possibilitat d'assignar un inode més gran al disc a l'hora del format. Aquest valor és el nombre de bytes addicionals que utilitza l'inode. Aquest espai addicional també es pot utilitzar per acomodar els requisits futurs de nous nuclis o per emmagatzemar atributs ampliats.
  • Inode checksum: Una suma de comprovació d’aquest inode, que permet detectar si l’inode està malmès.
  • Extensions: Si s’utilitzen extensions (a ext4, per defecte), les metadades sobre l’ús de fitxers en blocs de disc tenen dos números que indiquen els blocs inicial i final de cada porció d’un fitxer fragmentat. Això és més eficient que emmagatzemar tots els blocs de disc que ocupa cada part d'un fitxer. Tenim una mesura perquè el nostre petit fitxer es troba en un bloc de disc en aquest desplaçament de blocs.

On és el nom del fitxer?

Ara tenim molta informació sobre el fitxer, però, com és possible que hàgiu notat, no vam obtenir el nom del fitxer. Aquí és on entra en joc l’estructura de directoris. A Linux, igual que un fitxer, un directori té un inode. En lloc d’assenyalar blocs de disc que contenen dades de fitxers, un inode de directori apunta a blocs de disc que contenen estructures de directori.

En comparació amb un inode, una estructura de directoris conté una quantitat limitada d'informació sobre un fitxer. Només conté el número d’inode, el nom i la longitud del nom del fitxer.

L'inode i l'estructura de directoris contenen tot el que (o una aplicació) necessiteu saber sobre un fitxer o directori. L'estructura de directoris es troba en un bloc de disc de directori, de manera que sabem el directori on es troba el fitxer. L'estructura de directoris ens proporciona el nom del fitxer i el número d'inode. L'inode ens indica tota la resta del fitxer, incloses les marques de temps, els permisos i on trobar les dades del fitxer al sistema de fitxers.

Inodes de directori

Podeu veure el número d’inode d’un directori amb la mateixa facilitat que podeu veure per als fitxers.

A l'exemple següent, utilitzarem ls amb el -l (format llarg), -i (inode) i -d (directori) i mireu les opcions treballar directori:

ls -tapa de treball /

Perquè hem utilitzat el -d (directori) opció,ls informa al directori en si, no al seu contingut. L'inode d'aquest directori és 1443016.

Repetir això per al a casa directori, escrivim el següent:

ls -lid ~

L'inode per al a casa directori és 1447510 i el fitxer treballar directori es troba al directori inicial. Ara, vegem el contingut del treballar directori. En lloc de-d (directori), utilitzarem l’opció -a (totes) opció. Això ens mostrarà les entrades del directori que solen estar amagades.

Escrivim el següent:

ls -lia treballa /

Perquè hem utilitzat el -a (totes), es mostren les entrades d'un sol punt (.) i de doble punt (..). Aquestes entrades representen el propi directori (punt únic) i el seu directori pare (punt doble).

Si mireu el número d’inode per a l’entrada de punt únic, esteu indicant que és 1443016, el mateix número d’inode que vam obtenir quan vam descobrir el número d’inode per al treballar directori. A més, el número d’inode per a l’entrada de doble punt és el mateix que el número d’inode per a a casa directori.

És per això que podeu utilitzar el cd .. ordre per pujar un nivell a l'arbre de directoris. De la mateixa manera, quan precediu una aplicació o un nom de script amb./, feu saber a l'intèrpret d'ordres des d'on iniciar l'aplicació o l'script.

Inodes i enllaços

Tal com hem explicat, es requereixen tres components per tenir un fitxer ben format i accessible al sistema de fitxers: el fitxer, l’estructura de directoris i l’inode. El fitxer és les dades emmagatzemades al disc dur, l’estructura de directoris conté el nom del fitxer i el seu número d’inode i l’inode conté totes les metadades del fitxer.

Els enllaços simbòlics són entrades del sistema de fitxers que semblen fitxers, però són realment dreceres que apunten a un fitxer o directori existent. Vegem com gestionen això i com s’utilitzen els tres elements per aconseguir-ho.

Suposem que tenim un directori amb dos fitxers: un és un script i l’altre és una aplicació, com es mostra a continuació.

Podem utilitzar l'ordre ln i el fitxer -s opció (simbòlica) per crear un enllaç suau al fitxer de seqüència, com ara:

ls -s my_script geek.sh

Hem creat un enllaç a my_script.sh va trucar geek.sh. Podem escriure el següent i utilitzar-lols per mirar els dos fitxers de script:

ls -li * .sh

L'entrada de geek.sh apareix en blau. El primer caràcter dels indicadors de permisos és una "l" per a l'enllaç i el fitxer-> assenyala my_script.sh . Tot això ho indica geek.sh és un enllaç.

Com és probable que espereu, els dos fitxers de script tenen números d’inodes diferents. El que podria ser més sorprenent, però, és l’enllaç suau, geek.sh, no té els mateixos permisos d'usuari que el fitxer de script original. De fet, els permisos per ageek.sh són molt més liberals: tots els usuaris tenen permisos complets.

L'estructura de directoris per a geek.sh conté el nom de l'enllaç i el seu inode. Quan intenteu utilitzar l'enllaç, es fa referència al seu inode, igual que un fitxer normal. L'inode d'enllaç apuntarà a un bloc de disc, però en lloc de contenir dades de contingut de fitxer, el bloc de disc conté el nom del fitxer original. El sistema de fitxers redirigeix ​​al fitxer original.

Eliminarem el fitxer original i veurem què passa quan escrivim el següent per visualitzar-ne el contingutgeek.sh:

rm my_script.sh
gat geek.sh

L'enllaç simbòlic està trencat i la redirecció falla.

Ara escrivim el següent per crear un enllaç dur al fitxer de l’aplicació:

En una aplicació especial friki

Per mirar els inodes d’aquests dos fitxers, escrivim el següent:

ls -li

Tots dos semblen fitxers normals. Res de res aplicació geek indica que és un enllaç en la forma en què ls llistat per a geek.sh va fer. Més,aplicació geek té els mateixos permisos d'usuari que el fitxer original. Tot i això, el que podria sorprendre és que les dues aplicacions tinguin el mateix número d’inode: 1441797.

L'entrada del directori per a aplicació geek conté el nom "geek-app" i un número d'inode, però és el mateix que el número d'inode del fitxer original. Per tant, tenim dues entrades del sistema de fitxers amb noms diferents que apunten cap al mateix inode. De fet, qualsevol nombre d’elements pot apuntar al mateix inode.

Escriurem el següent i utilitzarem el fitxer estadística programa per mirar el fitxer de destinació:

stat app especial

Veiem que dos enllaços durs apunten a aquest fitxer. Això s’emmagatzema a l’inode.

A l'exemple següent, suprimim el fitxer original i intentem utilitzar l'enllaç amb una contrasenya segura i secreta:

rm app especial
./geek-app correcthorsebatterystaple

Sorprenentment, l'aplicació funciona com s'esperava, però com? Funciona perquè, quan suprimiu un fitxer, l’inode es pot reutilitzar de forma gratuïta. L'estructura de directoris es marca com a un número inode de zero i els blocs de disc estan disponibles per a un altre fitxer que s'emmagatzemi en aquest espai.

Tanmateix, si el nombre d’enllaços durs a l’inode és superior a un, el recompte d’enllaços durs es redueix en un i el nombre d’inodes de l’estructura de directoris del fitxer suprimit es posa a zero. El contingut del fitxer al disc dur i a l’inode encara està disponible per als enllaços durs existents.

Escriurem el següent i utilitzarem stat una vegada més, aquesta vegada aplicació geek:

stat geek-app

Aquests detalls s’extreuen del mateix inode (1441797) que l’anterior estadística comandament. El recompte d'enllaços es va reduir en un.

Perquè només eliminem un enllaç dur a aquest inodeaplicació geek, realment esborraria el fitxer. El sistema de fitxers alliberarà l’inode i marcarà l’estructura de directoris amb un inode de zero. Un fitxer nou pot sobreescriure l’emmagatzematge de dades al disc dur.

RELACIONATS:Com s'utilitza l'ordre stat a Linux

Inode Overheads

és un sistema ordenat, però hi ha despeses generals. Per llegir un fitxer, el sistema de fitxers ha de fer tot el següent:

  • Cerqueu l’estructura de directoris adequada
  • Llegiu el número d’inode
  • Cerqueu l’inode adequat
  • Llegiu la informació de l’inode
  • Seguiu els enllaços d'inode o les extensions dels blocs de disc corresponents
  • Llegiu les dades del fitxer

Es necessita una mica més de saltar si les dades no són contigües.

Imagineu-vos la feina que s’ha de ferls per realitzar una llista de fitxers de format llarg de molts fitxers. Hi ha molt d’anada i tornada només per ls per obtenir la informació que necessita per generar la seva producció.

Per descomptat, accelerar l'accés al sistema de fitxers és per això que Linux intenta fer la memòria cau de fitxers el més preventiva possible. Això ajuda molt, però de vegades, com passa amb qualsevol sistema de fitxers, les despeses generals es poden fer evidents.

Ara sabràs per què.


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