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