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

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
512NjĂ« 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-c898746ccd76Parametri 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: 1Si 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_imageNë 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\/wwwSi 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
