Periodiski, ar mÄrÄ·i pÄrcelties uz datu centru, esmu veicis pÄrrunas dažÄdÄs lielÄs kompÄnijÄs, galvenokÄrt no SanktpÄterburgas un Maskavas, kÄ DevOps speciÄlists. PievÄrsu uzmanÄ«bu, ka daudzÄs uzÅÄmumÄ (Ä«paÅ”i labos uzÅÄmumos, piemÄram, Yandex) tiek uzdoti divi lÄ«dzÄ«gi jautÄjumi:
- Kas ir inode;
- KÄpÄc var rasties ieraksta kļūda diskÄ (vai, piemÄram: kÄpÄc diskÄ var beigties vieta, bÅ«tÄ«ba ir viena).
KÄ bieži notiek, es biju pÄrliecinÄts, ka Å”o tÄmu zinu labi, taÄu, tiklÄ«dz sÄku izskaidrot, atklÄjÄs zinÄÅ”anu trÅ«kumi. Lai sistematizÄtu savas zinÄÅ”anas, aizpildÄ«tu tukÅ”umus un vairs neapkaunotos, rakstu Å”o rakstu, varbÅ«t tas noderÄs arÄ« kÄdam citam.
SÄksim "no apakÅ”as", t.i., no cietÄ diska (noraidÄ«sim zibatmiÅas, SSD un citas mÅ«sdienÄ«gas lietas, jautÄjumu aplÅ«kosim, izmantojot jebkuru 20 vai 80 GB veco disku, jo tur bloka izmÄrs ir 512 baiti).
Cietais disks nemÄk adresÄt savu telpu pa baitu; nosacÄ«ti tÄ tiek sadalÄ«ta blokos. Bloku numurÄÅ”ana sÄkas ar 0. (to sauc par LBA, sÄ«kÄka informÄcija ir Å”eit: )

KÄ redzams attÄlÄ, LBA blokus esmu iezÄ«mÄjis kÄ HDD lÄ«meni. Starp citu, varat pÄrbaudÄ«t, kÄds ir jÅ«su diska bloka izmÄrs Å”Ädi:
root@ubuntu:/home/serp# blockdev --getpbsz /dev/sdb
512AugstÄk lÄ«menÄ« ir izveidots nodalÄ«jums, viens visam diskam (atkal vienkÄrŔības pÄc). VisbiežÄk izmanto divu veidu nodalÄ«jumu shÄmas: msdos un gpt. TÄdÄjÄdi msdos ir vecais formÄts, kas atbalsta diskus lÄ«dz 2TB, savukÄrt gpt ir jaunais formÄts, kas spÄj adresÄt lÄ«dz 1 zettabaitam 512 baitos. MÅ«su gadÄ«jumÄ ir msdos tipa nodalÄ«jums, kÄ redzams attÄlÄ, un tas sÄkas ar bloku ā1, bet nulle tiek izmantota MBR.
PirmajÄ nodalÄ«jumÄ es izveidoju ext2 failu sistÄmu, pÄc noklusÄjuma tÄs bloka izmÄrs ir 4096 baiti, kas arÄ« attÄlÄ atspoguļots. Failu sistÄmas bloka izmÄru var apskatÄ«t Å”Ädi:
root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
FailesistÄmas apjoma nosaukums:
PÄdÄjoreiz pievienots:
FailesistÄmas UUID: a600bf40-f660-41f6-a3e6-96c303995479
FailesistÄmas maÄ£iskais skaitlis: 0xEF53
FailesistÄmas versija #: 1 (dinamiska)
FailesistÄmas iezÄ«mes: ext_attr resize_inode dir_index filetype sparse_super large_file
FailesistÄmas karogi: signed_directory_hash
NoklusÄjuma montÄÅ”anas opcijas: user_xattr acl
FailesistÄmas stÄvoklis: clean
Kļūdu uzvedība: Continue
FailesistÄmas operÄtÄjsistÄmas veids: Linux
Inodžu skaits: 65536
Bloku skaits: 261888
RezervÄto bloku skaits: 13094
Brīvie bloki: 257445
Brīvie inodi: 65525
Pirmais bloks: 0
Bloku izmÄrs: 4096
Fragmenta izmÄrs: 4096
RezervÄtie GDT bloki: 63
Bloki grupÄ: 32768
Fragmenti grupÄ: 32768
Inodži grupÄ: 8192
Inodžu bloki grupÄ: 512
FailesistÄma izveidota: Fri Aug 2 15:02:13 2019
PÄdÄjÄ montÄÅ”anas laiks: n/a
PÄdÄjais rakstīŔanas laiks: Fri Aug 2 15:02:14 2019
MontÄÅ”anas skaits: 0
MaksimÄlais montÄÅ”anas skaits: -1
PÄdÄjÄ pÄrbaude: Fri Aug 2 15:02:13 2019
PÄrbaudes intervÄls: 0 ()
RezervÄto bloku uid: 0 (lietotÄjs root)
RezervÄto bloku gid: 0 (grupa root)
Pirmais inods: 11
Inodžu izmÄrs: 256
NepiecieÅ”amÄ papildu izmÄrs: 28
VÄlamÄ papildu izmÄrs: 28
NoklusÄjuma direktorijas haÅ”s: half_md4
Direktorijas haÅ”a sÄkla: c0155456-ad7d-421f-afd1-c898746ccd76Mums nepiecieÅ”amais parametrs ir "Bloku izmÄrs".
Tagad interesantÄ daļa: kÄ izlasÄ«t failu /home/serp/testfile? Fails sastÄv no viena vai vairÄkiem failesistÄmas blokiem, kuros tiek glabÄti tÄ dati. Zinot faila nosaukumu, kÄ to atrast? KÄdi bloki jÄlasa?
Å eit mums palÄ«dz inodi. FailesistÄmÄ ext2fs ir "tabula", kurÄ ir informÄcija par visiem inodiem. Inodu skaits ext2fs gadÄ«jumÄ tiek noteikts, izveidojot failesistÄmu. NepiecieÅ”amÄs skaitļus skatÄm parametrÄ "Inode count" tune2fs izvadÄ, t.i., mums ir 65536 vienÄ«bas. InodÄ ir nepiecieÅ”amÄ informÄcija: failesistÄmas bloku saraksts meklÄtajam failam. KÄ atrast inoda numuru noteiktam failam?
AtbilstÄ«ba starp nosaukumu un inoda numuru ir direktorijÄ, bet direktorija ext2fs ir Ä«paÅ”a faila tips, t.i., tai ir arÄ« savs inoda numurs. Lai pÄrtrauktu Å”o slÄgto loku, saknes direktorijai tika pieŔķirts "fiksÄts" inoda numurs "2". SkatÄm inoda 2 saturu:
root@ubuntu:/# debugfs /dev/sdb1
debugfs 1.42.9 (4-Feb-2014)
debugfs: stat
Inode: 2 Tips: direktorija Režīms: 0755 Karogi: 0x0
Paaudze: 0 Versija: 0x00000000:00000002
LietotÄjs: 0 Grupa: 0 IzmÄrs: 4096
Faila ACL: 0 Direktorijas ACL: 0
Saistības: 3 Bloku skaits: 8
Fragments: Adrese: 0 Numurs: 0 IzmÄrs: 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
Papildu inoda lauku izmÄrs: 28
BLOKI:
(0):579
KOPÄ: 1KÄ redzams, nepiecieÅ”amÄ direktorija ir 579. numura blokÄ. TajÄ mÄs atradÄ«sim mapi home un turpinÄsim Ä·ÄdÄ, lÄ«dz direktorijÄ serp redzÄsim pieprasÄ«tÄ faila numuru. Ja kÄds vÄlas pÄrbaudÄ«t, vai numurs ir pareizs un vai tur ir nepiecieÅ”amÄ informÄcija, tas nav grÅ«ti. Veicam:
root@ubuntu: /# dd if=/dev/sdb1 of=/home/serp/dd_image bs=4096 count=1 skip=579
1+0 ieraksti ienÄk
1+0 ieraksti izej
4096 baitus (4,1 kB) kopÄti, 0,000184088 s, 22,3 MB/s
root@ubuntu: /# hexdump -c /home/serp/dd_imageIzvadÄ var izlasÄ«t failu nosaukumus direktorijÄ.
LÅ«k, esmu nonÄcis pie galvenÄ jautÄjuma: Ā«kÄdi iemesli var radÄ«t rakstīŔanas kļūduĀ»?
Protams, tas var notikt, ja failu sistÄmÄ nav brÄ«vu bloku. Ko Å”ajÄ gadÄ«jumÄ var darÄ«t? Papildus acÄ«mredzamajam Ā«izdzÄst kaut ko nevajadzÄ«guĀ», jÄatceras, ka failu sistÄmÄs ext2,3 un 4 ir tÄda lieta kÄ Ā«rezervÄto bloku skaitsĀ». Ja paskatÄmies iepriekÅ”ÄjÄ izsniegumÄ, mums ir Å”Ädi bloki Ā«13094Ā». Tie ir bloki, kas pieejami rakstīŔanai tikai lietotÄjam root. Bet, ja jÄrisina problÄma steidzami, kÄ pagaidu risinÄjumu var padarÄ«t tos pieejamus visiem, tÄdÄjÄdi radot nedaudz brÄ«vas vietas:
root@ubuntu: /mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
IestatīŔana rezervÄto bloku procentuÄlÄ daļa 0% (0 bloki)T.i., pÄc noklusÄjuma jums nav pieejami rakstīŔanai 5% diska vietas, un Åemot vÄrÄ mÅ«sdienu disku apjomus, tas var bÅ«t simtiem gigabaitu.
Kas vÄl varÄtu bÅ«t? VÄl var rasties situÄcija, kad brÄ«vie bloki ir, bet noderÄ«gi noderi ir beiguÅ”ies. Tas parasti notiek, ja jÅ«su failu sistÄmÄ ir daudz failu, kuru izmÄrs ir mazÄks par failu sistÄmas bloka izmÄru. Å emot vÄrÄ, ka 1 failam vai direktorijai tiek tÄrÄts 1 inode, un to kopÄ ir (Å”ai failu sistÄmai) 65536 ā situÄcija ir vairÄk nekÄ reÄla. To vizuÄli var redzÄt no komandas df izvadÄm:
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\/wwwCik labi ir redzams sadaÄ¼Ä \/var\/www, brÄ«vo failu sistÄmas bloku un brÄ«vo inode skaits bÅ«tiski atŔķiras.
Ja gadÄ«jumÄ beidzas inode, nevaru ieteikt burvÄ«bu, jo to nav (ja kļūdos, lÅ«dzu dodiet ziÅu). TÄpÄc sadaļÄm, kurÄs vairojas mazi faili, vajadzÄtu gudri izvÄlÄties failu sistÄmu. PiemÄram, btrfs inode nevar izbeigties, jo tos dinamiski izveido jauni pÄc vajadzÄ«bas.
Avots: habr.com
