Eppes iwwer Inode

Periodesch, fir an d'Zentralverdeelungszentrum ze plënneren, Interview ech bei verschiddene grousse Firmen, haaptsächlech zu St Petersburg a Moskau, fir eng DevOps Positioun. Ech hu gemierkt datt vill Firmen (vill gutt Firmen, zum Beispill Yandex) zwou ähnlech Froen stellen:

  • wat ass Inode;
  • aus wéi enge Grënn kënnt Dir e Scheif Schreiffehler kréien (oder zum Beispill: firwat Dir keng Disk Space lafe kënnt, d'Essenz ass d'selwecht).

Wéi oft geschitt, war ech sécher datt ech dëst Thema gutt kennen, awer soubal ech ugefaang hunn ze erklären, goufen d'Lücken am Wëssen offensichtlech. Fir mäi Wëssen ze systematiséieren, d'Lücken auszefëllen an mech net méi ze schummen, schreiwen ech dësen Artikel, vläicht ass et nëtzlech fir een aneren.

Ech fänke vun ënnen un, d.h. vun enger Festplack (mir werfen Flash-Laufwerke, SSDs an aner modern Saachen of; zum Beispill, loosst eis all 20 oder 80 Gig alen Drive betruechten, well d'Blockgréisst do ass 512 Bytes).

D'Festplack weess net wéi säi Raum Byte fir Byte adresséiert; et ass bedingt a Blocken opgedeelt. Blocknummeréierung fänkt vun 0 un. (Dëst gëtt LBA genannt, Detailer hei: ru.wikipedia.org/wiki/LBA)

Eppes iwwer Inode

Wéi kann aus der Figur gesi ginn, hunn ech LBA Blocks als HDD Niveau bezeechent. Iwwregens, kënnt Dir gesinn wéi eng Blockgréisst Är Disk esou huet:

root@ubuntu:/home/serp# blockdev --getpbsz /dev/sdb
512

Den Niveau uewen ass eng Partition, eng fir de ganzen Disk (erëm fir Einfachheet). Déi meescht Oft ginn zwou Zorte vu Partitionsmarkup benotzt: msdos a gpt. Deementspriechend ass msdos en aalt Format dat Disks bis zu 2Tb ënnerstëtzt, gpt ass en neit Format dat fäeg ass bis zu 1 Zettabyte vu 512 Byte Blocken ze adresséieren. An eisem Fall hu mir eng Partitur vum Typ msdos, wéi et aus der Figur gesi kann, fänkt d'Partition mam Block Nr 1 un, während Null fir den MBR benotzt gëtt.

An der éischter Partition hunn ech en ext2 Dateisystem erstallt, seng Standardblockgréisst ass 4096 Bytes, wat och an der Figur reflektéiert gëtt. Dir kënnt d'Dateisystemblockgréisst esou gesinn:

root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          a600bf40-f660-41f6-a3e6-96c303995479
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65536
Block count:              261888
Reserved block count:     13094
Free blocks:              257445
Free inodes:              65525
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      63
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Fri Aug  2 15:02:13 2019
Last mount time:          n/a
Last write time:          Fri Aug  2 15:02:14 2019
Mount count:              0
Maximum mount count:      -1
Last checked:             Fri Aug  2 15:02:13 2019
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      c0155456-ad7d-421f-afd1-c898746ccd76

De Parameter dee mir brauchen ass "Blockgréisst".

Elo ass den interessanten Deel wéi Dir d' /home/serp/testfile Datei liest? E Fichier besteet aus engem oder méi Dateiesystemblocken an deenen seng Donnéeën gespäichert sinn. Wësse de Dateinumm, wéi fannt Dir en? Wéi eng Blocks soll ech liesen?

Dëst ass wou d'Inoden praktesch kommen. Den ext2fs Dateisystem huet en "Table" deen Informatioun fir all Inoden enthält. D'Zuel vun Inoden am Fall vun ext2fs gëtt festgeluegt wann Dir de Dateiesystem erstellt. Mir kucken déi erfuerderlech Zuelen am Parameter "Inode count" vum tune2fs Output, d.h. mir hunn 65536 Stécker. D'Inode enthält d'Informatioun déi mir brauchen: eng Lëscht vun Dateiesystemblocken fir déi Datei déi mir sichen. Wéi fannt Dir d'Inode Nummer fir eng bestëmmte Datei?

Den entspriechende Numm an d'Inode Nummer sinn am Verzeechnes enthale, an e Verzeechnes an ext2fs ass eng speziell Dateityp, d.h. huet och seng eege Inode Nummer. Fir dëse Béiser Krees ze briechen, gouf eng "fix" Inode Nummer "2" dem Root Verzeichnis zougewisen. Loosst eis den Inhalt vun der Inode Nummer 2 kucken:

root@ubuntu:/# debugfs /dev/sdb1
debugfs 1.42.9 (4-Feb-2014)
debugfs:  stat <2>

Inode: 2   Type: directory    Mode:  0755   Flags: 0x0
Generation: 0    Version: 0x00000000:00000002
User:     0   Group:     0   Size: 4096
File ACL: 0    Directory ACL: 0
Links: 3   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x5d43cb51:16b61bcc -- Fri Aug  2 16:34:09 2019
 atime: 0x5d43c247:b704301c -- Fri Aug  2 15:55:35 2019
 mtime: 0x5d43cb51:16b61bcc -- Fri Aug  2 16:34:09 2019
crtime: 0x5d43b5c6:00000000 -- Fri Aug  2 15:02:14 2019
Size of extra inode fields: 28
BLOCKS:
(0):579
TOTAL: 1

Wéi Dir gesitt, ass de Verzeichnis dee mir brauchen an der Blocknummer 579 enthale sinn. An et fanne mir d'Nodenummer fir den Dossier doheem, a sou weider an d'Kette bis an de Serp Verzeichnis mir d'Nodenummer fir déi ugefrote Datei gesinn. Wann op eemol ee wëll kucken ob d'Zuel richteg ass an ob déi néideg Informatioun do ass, ass et net schwéier. Mir maachen:

root@ubuntu:/# dd if=/dev/sdb1 of=/home/serp/dd_image bs=4096 count=1 skip=579
1+0 records in
1+0 records out
4096 bytes (4,1 kB) copied, 0,000184088 s, 22,3 MB/s
root@ubuntu:/# hexdump -c /home/serp/dd_image

Am Output kënnt Dir d'Nimm vun de Dateien am Verzeechnes liesen.

Also ech kommen op d'Haaptfro: "aus wéi enge Grënn kann en Opnamfehler optrieden?"

Natierlech wäert dëst geschéien wann et keng gratis Blocks am Dateiesystem bleiwen. Wat kann an dësem Fall gemaach ginn? Nieft dem offensichtleche "läschen alles onnéideg", sollt Dir drun erënneren datt an ext2,3 a 4 Dateisystemer sou eppes wéi "Reservéiert Blockzuel" gëtt. Wann Dir d'Lëscht hei uewen kuckt, hu mir "13094" sou Blocks. Dëst sinn Blocks déi nëmme vum Root Benotzer schreiwen. awer wann Dir d'Thema séier léise musst, als temporär Léisung kënnt Dir se fir jiddereen zur Verfügung stellen, wat zu e puer fräie Raum resultéiert:

root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Setting reserved blocks percentage to 0% (0 blocks)

Déi. par défaut, Dir hutt 5% vun der Plaatz Plaatz net sinn fir schrëftlech, a gëtt de Volume vun modern Scheif, dëst kann honnerte vu gigabytes ginn.

Wat soss kéint et sinn? Et ass och méiglech datt et gratis Blocks gëtt, awer et gi keng Node méi. Dëst geschitt normalerweis wann Dir eng Rëtsch Dateien op Ärem Dateiesystem hutt, déi méi kleng sinn wéi d'Dateisystemblockgréisst. Bedenkt datt 1 Inode op 1 Datei oder Verzeechnes ausginn ass, an am Ganzen hu mir (fir e bestëmmten Dateiesystem) 65536 - d'Situatioun ass méi wéi realistesch. Dëst kann kloer aus dem Output vum df Kommando gesi ginn:

serp@ubuntu:~$ df -hi
Filesystem     Inodes IUsed IFree IUse% Mounted on
udev             493K   480  492K    1% /dev
tmpfs            493K   425  493K    1% /run
/dev/xvda1       512K  240K  273K   47% /
none             493K     2  493K    1% /sys/fs/cgroup
none             493K     2  493K    1% /run/lock
none             493K     1  493K    1% /run/shm
none             493K     2  493K    1% /run/user
/dev/xvdc1       320K  4,1K  316K    2% /var
/dev/xvdb1        64K   195   64K    1% /home
/dev/xvdh1       4,0M  3,1M  940K   78% /var/www
serp@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2,0G  4,0K  2,0G   1% /dev
tmpfs           395M  620K  394M   1% /run
/dev/xvda1      7,8G  2,9G  4,6G  39% /
none            4,0K     0  4,0K   0% /sys/fs/cgroup
none            5,0M     0  5,0M   0% /run/lock
none            2,0G     0  2,0G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/xvdc1      4,8G  2,6G  2,0G  57% /var
/dev/xvdb1      990M  4,0M  919M   1% /home
/dev/xvdh1       63G   35G   25G  59% /var/www

Wéi kloer op der /var/www Partition sichtbar ass, variéieren d'Zuel vun de fräie Blocken am Dateiesystem an d'Zuel vun de gratis Noden immens.

Am Fall wou Dir keng Inoden hutt, wäert ech Iech keng Zauber soen, well ... et gi keng (wann ech falsch, Loosst mech wëssen). Also fir Partitionen an deenen kleng Dateien multiplizéieren, sollt Dir de Dateiesystem clever auswielen. Zum Beispill, btrfs Inoden kann net Enn, well Nei ginn dynamesch erstallt wann néideg.

Source: will.com

Setzt e Commentaire