Alles wat U Ooit Wilde Weten Over inodes op Linux

0
430
Fatmawati Achmad Zaenuri/Shutterstock

Het Linux bestandssysteem is gebaseerd op inodes. Deze belangrijke stukken van het bestandssysteem van de innerlijke werking worden vaak verkeerd begrepen. Laten we eens zien wat ze zijn en wat ze doen.

De Elementen van een Systeem van het Dossier

Per definitie is een bestand systeem nodig heeft om bestanden op te slaan, en ze bevatten ook directories. De bestanden worden opgeslagen in de mappen, en deze mappen kunnen submappen. Iets, ergens, heeft te nemen waarin alle bestanden die zijn gelegen binnen het bestandssysteem, wat ze heten, welke accounts ze horen, welke bevoegdheden zij hebben en nog veel meer. Deze informatie wordt metadata genoemd omdat het gegevens die beschrijft andere gegevens.

In de Linux ext4-bestandssysteem, de inode en map structuren werken samen om een onderbouwing van het kader waarin de metagegevens voor elk bestand en elke map. Ze maken de metagegevens beschikbaar voor iedereen die vereist is, of dat de kernel, programma-of Linux-programma ‘ s zoals ls, stat, en df.

Inodes en bestandssysteem Grootte

Hoewel het waar is dat er een paar van structuren, een bestandssysteem vereist veel meer dan dat. Er zijn duizenden en duizenden van elke structuur. Elk bestand en elke directory vereist een inode, en omdat elk bestand in een directory, elk bestand dat vereist ook een directory structuur. Directory-structuren worden ook wel directory inzendingen, of “dentries.”

Elke inode is een inode nummer, dat uniek is binnen een bestandssysteem. Dezelfde inode-nummer zou verschijnen in meer dan één bestandssysteem. Echter, het file systeem-ID en het inode nummer combineren tot een unieke id, ongeacht hoe veel bestand systemen worden gemonteerd op uw Linux-systeem.

Vergeet niet, in Linux, als je het niet monteren van een harde schijf of partitie. U koppelt het bestandssysteem dat in de partitie, dus het is gemakkelijk om meerdere bestandssystemen, zonder het te beseffen. Als u meerdere harde schijven of partities op een enkele schijf heb je meer dan één bestand systeem. Ze kunnen van hetzelfde type zijn—alle ext4, bijvoorbeeld—maar ze zullen nog steeds worden verschillende bestandssystemen.

Alle inodes worden gehouden in één tabel. Met behulp van een inode-nummer, het file systeem eenvoudig berekent de offset van de inode tabel die inode is gelegen. U kunt zien waarom het “ik” in de inode staat voor index.

De variabele met de inode nummer is verklaard in de broncode als een 32-bits unsigned long integer. Dit betekent dat de inode nummer is een geheel getal met een maximale grootte van 2^32, die berekent uit tot 4.294.967.295—ruim 4 miljard inodes.

Dat is de theoretische maximum. In de praktijk is het aantal inodes in een ext4 bestandssysteem is bepaald als de bestandssysteem wordt gemaakt op een standaard verhouding van een inode per 16 MB bestand van de capaciteit van het systeem. Directory-structuren worden gemaakt op de vlieg als de bestandssysteem in gebruik, zoals bestanden en mappen worden aangemaakt binnen het bestandssysteem.

Er is een commando dat je kunt gebruiken om te zien hoe veel inodes in het bestandssysteem op uw computer. De -i (inodes) optie van het df commando instrueert om de output in aantal inodes.

We gaan kijken naar het bestandssysteem op de eerste partitie op de eerste harde schijf, dus typen we het volgende:

df -i /dev/sda1

De output geeft ons:

  • Bestand systeem: Het bestandssysteem dat wordt gemeld op.
  • Inodes: Het totaal aantal inodes in het bestandssysteem.
  • IUsed: Het aantal inodes in gebruik.
  • IFree: Het resterende aantal inodes beschikbaar voor gebruik.
  • IUse%: het percentage van De gebruikte inodes.
  • Gemonteerd op: Het mountpunt voor dat bestandssysteem.

We hebben gebruikt 10 procent van de inodes in het bestandssysteem. Bestanden worden opgeslagen op de harde schijf in blokken. Elke inode punten op de schijf blokkeert dat het opslaan van de inhoud van het bestand die ze vertegenwoordigen. Als je miljoenen kleine bestanden, kunt u van de inodes voordat u opraken van de ruimte op de harde schijf. Dat is echter een zeer moeilijk probleem om op te rennen.

In het verleden, sommige mail-servers die opgeslagen e-mail berichten als aparte bestanden (die al snel leidde tot grote verzamelingen van kleine bestanden) had dit probleem. Wanneer deze toepassingen veranderen de achterkant van de databanken, dit loste het probleem op, dat wel. De gemiddelde home-systeem zal niet opraken van inodes, dat is maar goed ook, want met het ext4-bestandssysteem, kunt u niet meer toevoegen inodes zonder het opnieuw installeren van het bestand op het systeem.

Om de grootte van de blokken op het bestand van uw systeem, kunt u gebruik maken van de blockdev commando met de –getbsz (blok grootte) optie:

sudo blockdev –getbsz /dev/sda

De grootte van het blok 4096 bytes.

Laten we gebruik maken van de -B (blok grootte) optie voor het specificeren van een blokgrootte van 4096 bytes en controleer de reguliere schijf gebruik:

df -B 4096 /dev/sda1

Deze uitvoer toont ons:

  • Bestand systeem: Het bestand systeem op basis waarvan we de rapportage.
  • 4K blokken: Het totale aantal van 4 KB blokken in dit bestand systeem.
  • Gebruikt: hoeveel 4K blokken zijn in gebruik.
  • Beschikbaar: Het aantal resterende 4 KB blokken die beschikbaar zijn voor gebruik.
  • Gebruik%: Het percentage van 4 KB blokken die gebruikt zijn.
  • Gemonteerd op: Het mountpunt voor dat bestandssysteem.

In ons voorbeeld is de opslag van bestanden (en de opslag van de inodes en map structuren) heeft gebruikt 28 procent van de ruimte op het bestandssysteem, niet in de kosten van 10 procent van de inodes, we zijn dus in goede vorm.

Inode Metadata

Om de inode nummer van een bestand, kunnen we gebruik maken van ls-i (inode) optie:

ls -i geek.txt

De inode nummer van dit bestand is 1441801, zodat deze inode bevat de metagegevens voor dit bestand en, traditioneel, de verwijzingen naar de blokken waar het bestand zich bevindt op de harde schijf. Als het bestand is gefragmenteerd, erg groot is, of beide, een aantal van de blokken de inode punten te kunnen houden verder verwijzingen naar andere blokken. En sommige van die andere blokken kan houden ook verwijzingen naar andere blokken. Dit ondervangt het probleem van de inode een vaste grootte en in staat tot het houden van een eindig aantal tips om te blokken.

Die methode werd vervangen door een nieuwe regeling die gebruik maakt van “extents.” Deze record het begin en einde blok van elke reeks aaneengesloten blokken gebruikt voor het opslaan van het bestand. Als het bestand is ongefragmenteerd, u hoeft alleen voor het opslaan van het eerste blok en lengte. Als het bestand is gefragmenteerd, je hebt om op te slaan van de eerste en de laatste regel van elk deel van het bestand. Deze methode is (uiteraard) efficiënter.

Als u wilt zien of uw bestandssysteem gebruikt schijf blok verwijzingen of mate, kun je kijken in een inode. Om dit te doen, zullen we gebruik maken van de debugfs opdracht met de -R (aanvraag) optie, en geef het de inode van het dossier van belang. Dit vraagt debugfs gebruik van de interne “stat” commando om de inhoud van de inode. Omdat de inode-nummers zijn alleen uniek zijn binnen het bestand systeem, moeten we ook vertellen debugfs het bestandssysteem op die de inode zich bevindt.

Hier is wat deze opdracht zou er als volgt uitzien:

sudo debugfs -R “stat <1441801>” /dev/sda1

Zoals hieronder weergegeven, de debugfs commando haalt de informatie uit de inode en presenteert het aan ons minder:

We zien de volgende informatie:

  • Inode: het nummer van De inode we naar kijken.
  • Type: is Dit een reguliere bestand niet in een map of symbolische link.
  • Modus: Het bestand machtigingen in een octaal getal.
  • Vlaggen: Indicatoren die staan voor verschillende functies of functionaliteit. De 0x80000 is de “mate” van de vlag (meer hierover hieronder).
  • Generatie: Een Network File System (NFS) maakt gebruik dit wanneer iemand toegang tot remote file systems via een netwerkverbinding alsof ze waren gemonteerd op de lokale machine. De inode en generatie getallen worden gebruikt als een vorm van het handvat van het dossier.
  • Versie: De inode versie.
  • Gebruiker: De eigenaar van het bestand.
  • Groep: De groep van de eigenaar van het bestand.
  • Project: Moet altijd nul.
  • Grootte: De grootte van het bestand.
  • Het ACL-bestand: Het bestand access control list. Deze waren bedoeld om u te geven gecontroleerde toegang tot mensen die niet in de groep eigenaar.
  • Links: Het aantal hard links naar het bestand.
  • Blockcount: De hoeveelheid ruimte op de harde schijf aan dit bestand in 512-byte blokken. Ons bestand is toegewezen acht van deze, die is 4096 bytes. Dus, onze 98-byte bestand zit binnen één in 4096 byte schijf te blokkeren.
  • Fragment: Dit bestand is niet gefragmenteerd. (Dit is een verouderde vlag.)
  • Ctime: De tijd waarop het bestand is gemaakt.
  • Tijd: De tijd waarin het bestand voor het laatst is geopend.
  • Mtime: Het moment waarop dit bestand is voor het laatst gewijzigd.
  • Crtime: De tijd waarop het bestand is gemaakt.
  • Grootte van extra inode velden: Het ext4 bestandssysteem is de mogelijkheid geïntroduceerd voor het toewijzen van een grotere schijf inode bij indeling. Deze waarde is het aantal extra bytes aan de inode is gebruikt. Deze extra ruimte kan ook worden gebruikt om te voldoen aan toekomstige eisen voor nieuwe kernels of op te slaan uitgebreide attributen.
  • De Inode-checksum: Een checksum voor deze inode, die het mogelijk maakt om te detecteren of de inode is beschadigd.
  • Zwaartekracht: Als de zwaartekracht worden gebruikt (op ext4, worden ze standaard), de metadata over de schijf blokkeren van het gebruik van de bestanden heeft twee cijfers die aangeven dat het begin en het einde blokken van elk gedeelte van een gefragmenteerd bestand. Dit is efficiënter dan het opslaan van elke schijf blok genomen door elk deel van een bestand. We hebben een mate omdat onze kleine bestand zit in een schijf blok in dit blok offset.

Waar is het Bestand?

We hebben nu veel informatie over het bestand, maar, zoals je misschien hebt gemerkt, we hebben niet de naam van het bestand. Dit is waar de directory structuur in het spel komt. In Linux is, net als een bestand, een directory heeft een inode. In plaats van te wijzen naar de schijf blokken bevatten de data van een bestand, maar een directory-inode punten te blokken bevatten directory structuren.

In vergelijking met een inode, een directory structuur bevat een beperkte hoeveelheid van de informatie over een bestand. Het bevat alleen de file inode-nummer, de naam en de lengte van de naam.

De inode en de directory structuur bevatten alles wat u (of een toepassing) moet weten over een bestand of een map. De directory-structuur is in een directory schijf te blokkeren, zo kennen we de map met het bestand. De directory structuur geeft ons de naam van het bestand en de inode-nummer. De inode vertelt ons alles over het bestand, zoals de tijdstempels, machtigingen en waar vindt u de gegevens van het bestand in het bestandssysteem.

Map Inodes

U kunt zien dat de inode nummer van een directory net zo gemakkelijk als u ze kunt zien voor bestanden.

In het volgende voorbeeld gebruiken we het ls-l (lange-formaat), -i (inode), en -d (directory) opties en kijk in de map work van:

ls -klep werk/

Omdat we met de -d (directory) optie, ls rapporten op de map zelf, niet voor de inhoud. De inode voor deze map is 1443016.

Herhaal dat voor de home directory, typen we het volgende:

ls -deksel ~

De inode voor de home directory is 1447510, en het werk is een map in de home map. Nu, laten we eens kijken naar de inhoud van het werk directory. In plaats van de -d (directory) optie, gebruiken we de-a (alle) optie. Dit zal ons de vermeldingen die meestal verborgen.

We typt u het volgende:

ls -lia werk/

Omdat we gebruikt u de-a (alle) optie, de één (.) en de dubbele-punt (..) vermeldingen worden weergegeven. Deze vermeldingen geven aan de map zelf (één punt) en de bovenliggende map (dubbele punt).

Als je kijkt naar de inode-nummer voor de één-stip-vermelding, dat het’s1443016—dezelfde inode nummer kregen we toen we ontdekten het inode-nummer voor de werk-directory. Ook de inode-nummer voor de dubbele-punt item is hetzelfde als het inode-nummer voor de home directory.

Dat is waarom u kunt de cd gebruiken .. opdracht om een niveau omhoog gaan in de directory-boom. Ook wanneer u aan een toepassing of script naam met ./, u laat de schil uit om de toepassing te starten of in een script.

Inodes en Links

Zoals we hebben besproken, de drie componenten zijn nodig om een goed gevormd en toegankelijk bestand in het systeem: het bestand, de map structuur en de inode. Het bestand is opgeslagen gegevens op de harde schijf, de directory-structuur bevat de naam van het bestand en de inode-nummer, en de inode bevat de metagegevens van het bestand.

Symbolische koppelingen zijn bestand systeem entries die eruit bestanden, maar ze zijn echt snelkoppelingen die verwijzen naar een bestaand bestand of directory. Laten we eens kijken hoe zij beheren deze, en hoe de drie elementen zijn gebruikt om dit te bereiken.

Laten we zeggen we hebben een map met twee bestanden: één is het een script is, en de andere is een toepassing, zoals hieronder weergegeven.

We kunnen gebruik maken van het ln commando en de -s (symbolische) optie voor het maken van een soft link naar het script-bestand, als volgt:

ls -s my_script geek.sh

We hebben een koppeling gemaakt naar my_script.sh genoemd geek.sh. We kunnen het volgende te typen en gebruik ls om te kijken naar de twee script bestanden:

ls -li *.sh

De inschrijving voor geek.sh wordt weergegeven in het blauw. Het eerste teken van de machtigingen vlaggen is een “l” voor de link, en de -> punten my_script.sh . Dit alles geeft aan dat geek.sh is een link.

Zoals je waarschijnlijk wel verwacht, de twee script bestanden hebben verschillende inode nummers. Wat misschien meer verrassend is echter de zachte link, geek.sh, niet dezelfde gebruikersrechten als het originele script bestand. In feite, kunnen de machtigingen voor geek.sh zijn veel meer liberaal—alle gebruikers hebben volledige rechten.

De directory-structuur voor geek.sh bevat de naam van de link en de inode. Als u probeert om het gebruik van de link, de inode is waarnaar verwezen wordt, net zoals een gewoon bestand. De link inode zal verwijzen naar een schijf te blokkeren, maar in plaats van met de inhoud van het bestand gegevens, de schijf blok bevat de naam van het originele bestand. Het bestandssysteem wordt omgeleid naar het oorspronkelijke bestand.

We zullen het verwijderen van het oorspronkelijke bestand, en zien wat er gebeurt als wij typ het volgende om de inhoud van geek.sh:

rm my_script.sh
kat geek.sh

De symbolische link is gebroken, en de redirect mislukt.

Wij typ nu het volgende een vaste koppeling te maken naar de toepassing bestand:

ln speciale app geek-app

Om te kijken naar de inodes voor deze twee bestanden, typen we het volgende:

ls -li

Beide zien eruit als normale bestanden. Niets over geek-app geeft aan dat het een link in de manier waarop de ls-notering voor geek.sh dat deed. Plus, geek-app heeft de gebruiker rechten als het originele bestand. Echter, wat misschien verrassend is beide applicaties dezelfde inode-nummer: 1441797.

De directory-entry voor geek-app met de naam “geek-app” en een inode nummer, maar het is hetzelfde als het inode-nummer van het oorspronkelijke bestand. Dus, we hebben twee bestandssysteem-items met verschillende namen, die beide verwijzen naar dezelfde inode. In feite, een aantal items kan verwijzen naar dezelfde inode.

We zullen het volgende te typen en het gebruik van het statistische programma om te kijken naar het doel-bestand:

stat speciale-app

We zien dat er twee harde koppelingen naar dit bestand. Dit wordt opgeslagen in de inode.

In het volgende voorbeeld verwijderen we het originele bestand en probeer het te gebruiken voor de koppeling met een geheim, veilig wachtwoord:

rm speciale-app
./geek-app correcthorsebatterystaple

Verrassend is dat de toepassing wordt uitgevoerd zoals verwacht, maar hoe? Het werkt omdat, wanneer u een bestand verwijdert, de inode is gratis om te worden hergebruikt. De directory-structuur is gemarkeerd als een inode nummer van nul, en de blokken zijn dan beschikbaar voor andere bestand te worden opgeslagen in de ruimte.

Als het aantal hard links naar de inode is groter dan één, echter de harde koppeling aantal is verminderd door de ene, en de inode nummer van de directory-structuur van het verwijderde bestand is ingesteld op nul. De inhoud van het bestand op de vaste schijf van de inode zijn nog steeds beschikbaar voor de bestaande harde links.

We zullen het volgende te typen en gebruik stat nog eens, dit keer op geek-app:

stat geek-app

Deze gegevens zijn afkomstig uit dezelfde inode (1441797) als de vorige stat opdracht. Het aantal koppelingen is verminderd met één.

Omdat we neer op een harde link naar deze inode, als wij verwijderen geek-app, het zou echt het verwijderen van het bestand. Het bestand systeem vrij te maken van de inode en markeer de directory structuur van een inode van nul. Een nieuw bestand kan vervolgens met het overschrijven van de gegevens opslagruimte op de harde schijf.

GERELATEERD: Hoe Gebruik je het Commando stat op Linux

Inode Overheadkosten

het is een leuk systeem, maar er zijn de overheadkosten. Om een bestand te lezen, het file systeem moet het volgende doen:

  • Het vinden van de juiste directory structuur
  • Lees de inode nummer
  • Het vinden van de juiste inode
  • Lees de inode informatie
  • Volg de inode links of de omvang van de relevante blokken
  • Lees de gegevens van het bestand

Een beetje meer heen en weer springen is noodzakelijk als de gegevens niet-aaneengesloten.

Stel je voor het werk dat moet worden gedaan voor ls voor het uitvoeren van een lange formaat listing van vele bestanden. Er is veel heen en weer gewoon voor de ls te krijgen van de informatie die nodig is voor het genereren van de output.

Natuurlijk, het versnellen van toegang tot bestanden is de reden waarom Linux probeert te doen zo veel preventieve bestand caching mogelijk. Dit helpt enorm, maar soms—zoals bij elk bestandssysteem—de overhead kan worden aangetoond.

Nu je weet waarom.

LEES VERDER

  • “Wi-Fi-6E: Wat Is Het, en Hoe Verschilt Deze Van de Wi-Fi-6?
  • “Het Toevoegen van Aangepaste Beltonen op een iPhone van macOS Catalina
  • “De Ultieme Gids voor het Schoonmaken van Uw Icky AirPods
  • “Microsoft Is het Testen van Advertenties in WordPad in Windows 10
  • “Wat Is een Internet Troll? (en Hoe om te gaan Trollen)