Kaut kas par inode

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: ru.wikipedia.org/wiki/LBA)

Kaut kas par inode

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
512

Augstā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-c898746ccd76

Mums 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Ā: 1

Kā 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_image

Izvadē 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\/www

Cik 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

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster