NÄgot om inode

Periodiskt, för att flytta till CRS, intervjuar jag i olika stora företag, frÀmst i St. Petersburg och Moskva för rollen som DevOps. Jag har lagt mÀrke till att mÄnga företag (mÄnga bra företag, till exempel Yandex) stÀller tvÄ liknande frÄgor:

  • vad Ă€r en inode;
  • av vilka skĂ€l kan man fĂ„ ett skrivfel pĂ„ disken (eller till exempel: varför kan det ta slut pĂ„ utrymme pĂ„ disken, essensen Ă€r densamma).

Som det ofta Ă€r, var jag sĂ€ker pĂ„ att jag kĂ€nde till detta Ă€mne vĂ€l, men sĂ„ fort jag började förklara — började kunskapsluckor att visa sig. För att systematisera min kunskap, fylla i luckorna och inte skĂ€mma ut mig igen, skriver jag denna artikel, kanske nĂ„gon annan har nytta av den.

Jag börjar "frÄn botten", det vill sÀga med hÄrddisken (usb-minnen, SSD och andra moderna enheter lÀmnar vi bort, för exemplet tar vi vilken gammal disk som helst pÄ 20 eller 80 gigabyte, eftersom blockstorleken dÀr Àr 512 byte).

HÄrddisken kan inte adressera sitt utrymme byte för byte, det Àr i grova drag uppdelat i block. Blocknumreringen börjar frÄn 0. (detta kallas LBA, detaljer hÀr: ru.wikipedia.org/wiki/LBA)

NÄgot om inode

Som man kan se frÄn bilden, har jag markerat LBA-blocken som nivÄn pÄ HDD. För att ta reda pÄ vilken blockstorlek din disk har kan man göra sÄ hÀr:

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

Ovanför Àr partitionen markerad, en för hela disken (Äterigen för enkelhetens skull). Oftast anvÀnds tvÄ typer av partitionering: msdos och gpt. DÀrmed Àr msdos ett gammalt format som stöder diskar upp till 2TB, medan gpt Àr ett nytt format som kan adressera upp till 1 zettabyte 512-byte block. I vÄrt fall har vi en partition av typen msdos, som man kan se frÄn bilden, börjar partitionen frÄn block nr 1, medan den nollte anvÀnds för MBR.

I den första partitionen skapade jag ett ext2 filsystem, med standard blockstorlek pÄ 4096 byte, vilket ocksÄ Äterspeglas pÄ bilden. För att se blockstorleken pÄ filsystemet kan man göra sÄ hÀr:

root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Filsystemvolymnamn:   
Senast monterad pÄ:          
Filssystem UUID:          a600bf40-f660-41f6-a3e6-96c303995479
Filssystem magisk nummer:  0xEF53
Filssystem revision #:    1 (dynamisk)
Filssystemfunktioner:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filssystemflaggor:         signed_directory_hash
Standardmonteringsalternativ:    user_xattr acl
FilssystemtillstÄnd:         rent
Felhantering:          FortsÀtt
Filssystemets operativsystemstyp:       Linux
Inodeantal:              65536
Blockantal:              261888
Reserverat blockantal:     13094
Fria block:              257445
Fria inoder:              65525
Första block:              0
Blockstorlek:               4096
Fragmentstorlek:            4096
Reserverade GDT-block:      63
Block per grupp:         32768
Fragment per grupp:      32768
Inoder per grupp:         8192
Inode-block per grupp:   512
Filssystem skapat:       fre 2 aug 15:02:13 2019
Senaste monterad tid:          n/a
Senaste skrivtid:          fre 2 aug 15:02:14 2019
Monteringsantal:              0
Max monteringsantal:      -1
Senast kontrollerad:             fre 2 aug 15:02:13 2019
Kontrollintervall:           0 ()
Reserverade block uid:      0 (anvÀndare root)
Reserverade block gid:      0 (grupp root)
Första inode:              11
Inode-storlek:               256
KrÀvd extra isize:     28
Önskad extra isize:      28
Standardkataloghash:   half_md4
Katalog Hash Seed:      c0155456-ad7d-421f-afd1-c898746ccd76

Den parameter vi behöver Àr "Blockstorlek".

Nu blir det intressant, hur lÀser man filen /home/serp/testfile? Filen bestÄr av en eller flera block i filsystemet dÀr dess data lagras. Med filnamnet, hur hittar man den? Vilka block ska lÀsas?

HÀr kommer inoder vÀl till pass. I filsystemet ext2fs finns en "tabell" som innehÄller information om alla inoder. Antalet inoder i fallet med ext2fs faststÀlls vid skapandet av filsystemet. De siffror vi behöver ser vi i parametern "Inodeantal" i utskriften av tune2fs, vi har 65536 stycken. I inoden finns den information vi behöver: listan över filsystemblock för den fil som söks. Hur hittar man inode-nummer för den angivna filen?

ÖverensstĂ€mmelsen mellan namn och inode-nummer finns i katalogen, och en katalog i ext2fs Ă€r en speciell typ av fil, dvs den har ocksĂ„ sitt eget inode-nummer. För att bryta denna onda cirkel har den rotkatalogen tilldelats ett "fast" inode-nummer, nĂ€mligen "2". LĂ„t oss se innehĂ„llet i inode nummer 2:

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

Inode: 2   Typ: katalog    LĂ€ge:  0755   Flaggor: 0x0
Generation: 0    Version: 0x00000000:00000002
AnvÀndare:     0   Grupp:     0   Storlek: 4096
Fil ACL: 0    Katalog ACL: 0
LĂ€nkar: 3   Blockantal: 8
Fragment:  Adress: 0    Nummer: 0    Storlek: 0
 ctime: 0x5d43cb51:16b61bcc -- fre 2 aug 16:34:09 2019
 atime: 0x5d43c247:b704301c -- fre 2 aug 15:55:35 2019
 mtime: 0x5d43cb51:16b61bcc -- fre 2 aug 16:34:09 2019
crtime: 0x5d43b5c6:00000000 -- fre 2 aug 15:02:14 2019
Storlek pÄ extra inode-fÀlt: 28
BLOCKS:
(0):579
TOTAL: 1

Som man kan se, finns den nödvÀndiga katalogen i blocket med numret 579. DÀr hittar vi nodnumret för mappen home, och sÄ vidare i kedjan, tills vi i katalogen serp ser nodnumret för den begÀrda filen. Om nÄgon vill kontrollera om numret Àr korrekt och om det finns nödvÀndig information dÀr, Àr det inte svÄrt. Gör sÄ hÀr:

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

I utskriften kan man lÀsa filnamn i katalogen.

HÀr kommer jag till huvudfrÄgan: "av vilka skÀl kan det uppstÄ ett skrivfel"?

Det Àr uppenbart att detta kan hÀnda om det inte finns nÄgra lediga block i filsystemet. Vad kan man göra i detta fall? Förutom det uppenbara "ta bort nÄgot onödigt" bör man minnas att i ext2, 3 och 4 filsystem finns nÄgot som kallas "Reserved block count". Om vi tittar pÄ utskriften ovan har vi sÄdana block "13094". Dessa block Àr endast tillgÀngliga för skrivande av anvÀndaren root. Men om man snabbt vill lösa problemet kan man göra dem tillgÀngliga för alla, vilket resulterar i lite ledigt utrymme:

root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
SĂ€tter reservblockens procentandel till 0% (0 block)

Det vill sÀga, som standard Àr 5% av diskrymden inte tillgÀnglig för skrivning, och med tanke pÄ storleken pÄ moderna diskar kan detta handla om hundratals gigabyte.

Vad mer kan det vara? En annan möjlig situation Ă€r att det finns lediga block, men nodernas utrymme Ă€r slut. Detta hĂ€nder vanligtvis om du har ett stort antal filer i filsystemet vars storlek Ă€r mindre Ă€n blockstorleken för filsystemet. Med tanke pĂ„ att 1 inode anvĂ€nds per fil eller katalog och vi totalt har (för detta filsystem) 65536 — en sĂ„dan situation Ă€r mer Ă€n verklig. Detta kan tydligt ses frĂ„n utskriften av kommandot df:

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

Som bra syns i partitionen /var/www, varierar antalet lediga block i filsystemet och antalet lediga inoder kraftigt.

Om inoderna tar slut, kan jag tyvÀrr inte ge nÄgra tips, eftersom det inte finns nÄgra (hör av dig om jag har fel). SÄ nÀr det kommer till partitioner dÀr smÄ filer produceras mÄste filsystemet vÀljas noggrant. Till exempel kan inoder i btrfs inte ta slut, eftersom nya skapas dynamiskt vid behov.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster