Disa informacione mbi inode

Periudhish, me qëllim që të kaloj në CRS, po intervistoj në kompani të mëdha, kryesisht nga Shën Petersburgu dhe Moska për pozitat DevOps. Vura re se shumë kompani (shumë kompani të mira, për shembull Yandex) bëjnë dy pyetje të ngjashme:

  • çfarĂ« Ă«shtĂ« inode;
  • pĂ«r cilat arsye mund tĂ« merrni njĂ« gabim nĂ« shkrimin nĂ« disk (ose pĂ«r shembull: pse mund tĂ« pĂ«rfundojĂ« hapĂ«sira nĂ« disk, thelbi Ă«shtĂ« i njĂ«jtĂ«).

Siç ndodh ndonjĂ«herĂ«, isha i sigurt se e dija mirĂ« kĂ«tĂ« temĂ«, por sapo fillova tĂ« shpjegoj — dolĂ«n disa hapĂ«sira nĂ« njohuritĂ« e mia. PĂ«r tĂ« sistematizuar njohuritĂ« e mia, pĂ«r tĂ« mbushur boshllĂ«qet dhe pĂ«r tĂ« mos u turpĂ«ruar mĂ«, po shkruaj kĂ«tĂ« artikull, ndoshta do t'i ndihmojĂ« edhe dikujt tjetĂ«r.

Do të filloj "nga poshtë", dmth, nga disku i fortë (do t'i përjashtojmë flash diskët, SSD dhe gjërat e tjera moderne, për shembull do të shqyrtojmë një disk të vjetër 20 ose 80 gigabyte, sepse atje madhësia e bllokut është 512 byte).

Disku i fortë nuk i adresa hapësirat e tij për byte, në mënyrë të kushtëzuar e ndan atë në blloqe. Numerimi i bllokeve fillon nga 0. (kjo quhet LBA, detaje këtu: ru.wikipedia.org/wiki/LBA)

Disa informacione mbi inode

Siç duket nga figura, blloqet LBA i kam shënuar si nivel HDD. Për t'u thënë ndryshe, mund të shihni se cili është madhësia e bllokut të diskut tuaj kështu:

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

NjĂ« nivel mĂ« lart Ă«shtĂ« ndarĂ« njĂ« particion, njĂ« pĂ«r tĂ« gjithĂ« disku (pĂ«rsĂ«ri pĂ«r lehtĂ«si). MĂ« sĂ« shpeshti pĂ«rdoren dy lloje ndarjesh: msdos dhe gpt. Prandaj, msdos — formati i vjetĂ«r, qĂ« mbĂ«shtet disqet deri nĂ« 2Tb, gpt — formati i ri, qĂ« mund tĂ« adresojĂ« deri nĂ« 1 zettabajt blloqe prej 512 byte. NĂ« rastin tonĂ« kemi njĂ« particion tĂ« tipit msdos, siç duket nga figura, particioni fillon me bllokun nr. 1, ndĂ«rsa blloku zero pĂ«rdoret pĂ«r MBR.

Në particionin e parë krijova sistemin e skedarëve ext2, siç është e zakonshme madhësia e bllokut të tij është 4096 byte, e cila gjithashtu reflektohet në figurë. Të shikoni madhësinë e bllokut të sistemit të skedarëve mund ta bëni kështu:

root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:   
Last mounted on:          
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 ()
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

Parametri i nevojshëm është «Block size».

Tani, pjesa më interesante, si ta lexojmë skedarin /home/serp/testfile? Skedari përbëhet nga një ose disa blloqe të sistemit të skedarëve, ku ruhen të dhënat e tij. Duke e ditur emrin e skedarit, si ta gjejmë atë? Cilat blloqe duhet të lexojmë?

Këtu na duheshin inode. Në sistemin e skedarëve ext2fs ka një «tabelë», e cila përmban informacion për të gjitha inode. Numri i inode-ve në rastin e ext2fs përcaktohet gjatë krijimit të sistemit të skedarëve. Shikojmë numrat e nevojshëm në parametrin «Inode count» të daljes tune2fs, dmth. kemi 65536 copë. Në inode përmban informacionin e nevojshëm: lista e blloqeve të sistemit të skedarëve për skedarin e kërkuar. Si ta gjejmë numrin e inode për skedarin e caktuar?

Përputhja midis emrit dhe numrit të inode gjendet në drejtorinë, dhe drejtoritë në ext2fs janë skedarë të një lloji të veçantë, dmth. gjithashtu kanë numrin e vet të inode. Për të thyer këtë qark të keq, numri i inode për drejtorinë rrënjësore është caktuar «fiks» si «2». Shikojmë përmbajtjen e inode me numrin 2:

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

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

Si e kuptueshme, drejtorinë që na nevojitet e kemi në bllokun me numër 579. Në të do të gjejmë numrin e nodit për dosjen home, dhe kështu me radhë, derisa në drejtorinë serp të shohim numrin e nodit për skedarin e kërkuar. Nëse dikujt do t'i duhej të kontrollonte nëse numri është i saktë dhe nëse ka informacionin e nevojshëm, kjo nuk është e vështirë. Bëni:

root@ubuntu:\/ # dd if=\/dev\/sdb1 of=\/home\/serp\/dd_image bs=4096 count=1 skip=579
1+0 të dhëna në
1+0 të dhëna jashtë
4096 bytes (4,1 kB) u kopjua, 0,000184088 s, 22,3 MB\/s
root@ubuntu:\/ # hexdump -c \/home\/serp\/dd_image

Në daljen mund të lexoni emrat e skedarëve në drejtorinë.

Këtu arrita te pyetja kryesore: «çfarë arsyesh mund të shkaktojë një gabim shkrimi»?

Natyrisht, kjo ndodh kur nuk ka mĂ« bllokĂ« tĂ« lirĂ« nĂ« sistemin e skedarĂ«ve. ÇfarĂ« mund tĂ« bĂ«jmĂ« nĂ« kĂ«tĂ« rast? PĂ«rveç faktit tĂ« qartĂ« «tĂ« fshijmĂ« diçka tĂ« panevojshme», duhet tĂ« mbani mend se nĂ« sistemet e skedarĂ«ve ext2,3 dhe 4 ekziston njĂ« funksion i tillĂ« si «Reserved block count». NĂ« listimin mĂ« sipĂ«r, ne kemi 13094 nga kĂ«to bllokĂ«. KĂ«to janĂ« bllokĂ« tĂ« disponueshĂ«m pĂ«r shkrim vetĂ«m pĂ«r pĂ«rdoruesin root. Por nĂ«se duhet tĂ« zgjidhni njĂ« problem menjĂ«herĂ«, si njĂ« zgjidhje tĂ« pĂ«rkohshme, mund t'i bĂ«ni tĂ« disponueshĂ«m pĂ«r tĂ« gjithĂ«, duke rezultuar nĂ« pak hapĂ«sirĂ« tĂ« lirĂ«:

root@ubuntu:\/mnt# tune2fs -m 0 \/dev\/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Caktimi i përqindjes së blloqeve të rezervuara në 0% (0 bllokë)

Pra, në mënyrë default, 5% e hapësirës diskore nuk është e disponueshme për shkrim, dhe duke pasur parasysh kapacitetet e diskëve të sotëm, kjo mund të jetë qindra gigabajt.

ÇfarĂ« tjetĂ«r mund tĂ« ndodhĂ«? NjĂ« situatĂ« e mundshme Ă«shtĂ« kur keni bllokĂ« tĂ« lirĂ«, por nodet kanĂ« mbaruar. Kjo ndodh zakonisht nĂ«se keni shumĂ« skedarĂ« nĂ« sistemin e skedarĂ«ve qĂ« janĂ« mĂ« tĂ« vegjĂ«l se madhĂ«sia e bllokut tĂ« sistemit tĂ« skedarĂ«ve. Duke marrĂ« parasysh se pĂ«r çdo skedar ose drejtorinĂ« shpenzohet 1 inode, dhe gjithsej kemi (pĂ«r kĂ«tĂ« sistem skedarĂ«sh) 65536 — situatĂ« Ă«shtĂ« mĂ« shumĂ« se reale. KĂ«tĂ« mund ta shihni qartĂ« nga dalja e komandĂ«s 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

Si e dukshëm në seksionin \/var\/www, numri i blloqeve të lirë të sistemit të skedarëve dhe numri i nodave të lirë dallojnë në mënyrë të madhe.

Në rast se përfundojnë inode, nuk kam këshilla për magji, sepse nuk ka (nëse gaboj, më njoftoni). Pra, për ndarjet ku krijohen skedarë të vegjël, duhet zgjedhur me kujdes sistemin e skedarëve. Për shembull, te btrfs, inode nuk mund të përfundojnë, sepse krijohen dinamikisht të reja sipas nevojës.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster