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:
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