Qualcosa nantu à inode

Periòdicamente, per passà à u Centru di Distribuzione Centrale, aghju entrevista in parechje grande cumpagnie, principarmenti in San Petruburgu è Mosca, per una pusizioni DevOps. Aghju nutatu chì parechje cumpagnie (assai boni cumpagnie, per esempiu Yandex) facenu duie dumande simili:

  • ciò chì hè inode;
  • per quale ragiuni pudete avè un errore di scrittura di discu (o per esempiu: perchè puderebbe scappà u spaziu di discu, l'essenza hè a stessa).

Cum'è spessu succede, eru sicuru chì cunnosci bè stu tema, ma appena cuminciò à spiegà, i lacune in a cunniscenza diventenu evidenti. Per sistematizà a mo cunniscenza, riempie e lacune è ùn mi vergogna più, scrivu stu articulu, forse serà utile à un altru.

Cuminciaraghju da u fondu, i.e. da un discu duru (scarteremu i flash drives, SSD è altre cose muderni; per esempiu, cunsideremu qualsiasi 20 o 80 gig vechji drive, postu chì a dimensione di bloccu ci hè 512 bytes).

U discu duru ùn sapi micca cumu indirizzà u so spaziu byte per byte; hè divisu in cundizzioni in blocchi. A numerazione di blocchi principia da 0. (Questu hè chjamatu LBA, dettagli quì: ru.wikipedia.org/wiki/LBA)

Qualcosa nantu à inode

Comu pò esse vistu da a figura, aghju designatu blocchi LBA cum'è u livellu HDD. A propositu, pudete vede quale grandezza di bloccu hà u vostru discu cusì:

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

U livellu sopra hè una partizione, una per u discu sanu (di novu per simplicità). A maiò spessu, dui tipi di marcatura di partizioni sò usati: msdos è gpt. In cunsiquenza, msdos hè un vechju formatu chì sustene dischi finu à 2Tb, gpt hè un novu formatu capace di indirizzà finu à 1 zettabyte di blocchi di 512 byte. In u nostru casu, avemu una particione di tipu msdos, cum'è si pò vede da a figura, a particione principia cù u bloccu N ° 1, mentri cero hè utilizatu per u MBR.

In a prima partizione aghju creatu un sistema di schedariu ext2, a so dimensione di bloccu predeterminata hè 4096 bytes, chì hè ancu riflessu in a figura. Pudete vede a dimensione di bloccu di u sistema di fugliale cusì:

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

U paràmetru chì avemu bisognu hè "Block size".

Avà a parte interessante hè cumu leghje u schedariu /home/serp/testfile? Un schedariu hè custituitu da unu o più blocchi di u sistema di fugliale in quale i so dati sò almacenati. Sapendu u nome di u schedariu, cumu truvà? Chì blocchi duverebbe leghje?

Questu hè induve l'inodi sò utili. U sistema di schedari ext2fs hà una "tavula" chì cuntene infurmazioni per tutti l'inode. U numaru di inodes in u casu di ext2fs hè stabilitu quandu crea u sistema di fugliale. Fighjemu i numeri richiesti in u paràmetru "Inode count" di l'output tune2fs, i.e. avemu 65536 pezzi. L'inode cuntene l'infurmazioni chì avemu bisognu: una lista di blocchi di u sistema di fugliale per u schedariu chì avemu cercatu. Cumu truvà u numeru inode per un schedariu datu?

U nome currispundente è u numeru inode sò cuntenuti in u cartulare, è un repertoriu in ext2fs hè un tipu speciale di schedariu, i.e. hà ancu u so propiu numeru inode. Per rompe stu circhiu vicious, un numeru di inode "fissu" "2" hè statu assignatu à u repertoriu radicali. Fighjemu u cuntenutu di l'inode numeru 2:

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

Comu pudete vede, u repertoriu chì avemu bisognu hè cuntenutu in u bloccu numaru 579. In questu truvemu u numeru di node per u cartulare di casa, è cusì in a catena finu à chì in u repertoriu serp vedemu u numeru di node per u schedariu dumandatu. Sè di colpu qualcunu vole à verificà s'ellu u numeru hè currettu è s'ellu ci hè l 'infurmazione necessaria, ùn hè micca difficiule. Facemu:

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

In u output pudete leghje i nomi di i schedari in u cartulare.

Allora vengu à a quistione principale: "per chì ragioni pò accade un errore di registrazione?"

Naturalmente, questu succede s'ellu ùn ci sò micca blocchi gratuiti in u sistema di fugliale. Chì pò esse fattu in stu casu? In più di l'evidente "sguassate tuttu ciò chì ùn hè micca necessariu", duvete ricurdà chì in i sistemi di schedari ext2,3 è 4 ci hè una cosa cum'è "Conte di blocchi riservati". Se guardate a lista sopra, avemu "13094" tali blocchi. Quessi sò blocchi scrivibili solu da l'utilizatori root. ma s'è vo avete bisognu di risolve rapidamente u prublema, cum'è una suluzione tempuranee, pudete mette à dispunibuli per tutti, risultatu in qualchì spaziu liberu:

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

Quelli. per difettu, avete 5% di u spaziu di discu ùn hè micca dispunibule per scrive, è datu u voluminu di discu muderni, questu pò esse centinaie di gigabytes.

Chì altru puderia esse ? Hè ancu pussibule chì ci sò blocchi gratuiti, ma ùn ci sò più nodi. Questu succede di solitu s'è vo avete una mansa di schedari nantu à u vostru sistema di schedari chì sò più chjuchi di a dimensione di bloccu di u sistema di schedari. Cunsiderendu chì 1 inode hè spentu in 1 file or directory, è in u tutale avemu (per un sistema di schedariu datu) 65536 - a situazione hè più realistica. Questu pò esse chjaramente vistu da l'output di u cumandamentu 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

Cumu hè chjaramente visibile nantu à a partizione /var/www, u numeru di blocchi gratuiti in u sistema di fugliale è u numeru di nodi liberi varianu assai.

In casu di scappari di inodi, ùn vi dicu micca incantesimi, perchè... ùn ci hè nimu (se mi sbagliu, fatemi sapè). Allora per i partizioni in i quali i schedarii chjuchi si multiplicanu, duvete sceglie u sistema di fugliale cun prudenza. Per esempiu, btrfs inodes ùn pò micca finisce, perchè I novi sò creati dinamicamente se ne necessariu.

Source: www.habr.com

Add a comment