Kaut kas par inode

Periodiski, lai pārietu uz Centrālo sadales centru, veicu intervijas dažādos lielos uzņēmumos, galvenokārt Sanktpēterburgā un Maskavā, DevOps amatam. Es pamanīju, ka daudzi uzņēmumi (daudzi labi uzņēmumi, piemēram, Yandex) uzdod divus līdzīgus jautājumus:

  • kas ir inode;
  • Kādu iemeslu dēļ var rasties diska rakstÄ«Å”anas kļūda (vai piemēram: kāpēc diskā var pietrÅ«kt vietas, bÅ«tÄ«ba ir tāda pati).

Kā jau tas bieži notiek, biju pārliecināta, ka labi pārzinu Å”o tēmu, taču, tiklÄ«dz sāku skaidrot, atklājās nepilnÄ«bas zināŔanās. Lai sistematizētu savas zināŔanas, aizpildÄ«tu robus un vairs sevi neapmulsinātu, rakstu Å”o rakstu, varbÅ«t vēl kādam noderēs.

SākÅ”u no apakÅ”as, t.i. no cietā diska (atmetÄ«sim zibatmiņas diskus, SSD un citas modernas lietas; piemēram, ņemsim vērā jebkuru 20 vai 80 giga vecu disku, jo bloka izmērs ir 512 baiti).

Cietais disks nezina, kā uzrunāt savu vietu baitu pa baitam, tas ir nosacīti sadalīts blokos. Bloku numerācija sākas no 0. (To sauc par LBA, sīkāka informācija Ŕeit: ru.wikipedia.org/wiki/LBA)

Kaut kas par inode

Kā redzams attēlā, es norādīju LBA blokus kā HDD līmeni. Starp citu, jūs varat redzēt, kāds bloka lielums ir jūsu diskā, piemēram:

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

IepriekÅ” minētais lÄ«menis ir nodalÄ«jums, viens visam diskam (atkal vienkārŔības labad). Visbiežāk tiek izmantoti divu veidu nodalÄ«jumu iezÄ«mÄ“Å”anas veidi: msdos un gpt. AttiecÄ«gi msdos ir vecs formāts, kas atbalsta diskus lÄ«dz 2Tb, gpt ir jauns formāts, kas spēj adresēt lÄ«dz 1 zettabaitu no 512 baitu blokiem. MÅ«su gadÄ«jumā mums ir msdos tipa nodalÄ«jums, kā redzams attēlā, nodalÄ«jums sākas ar bloku Nr. 1, savukārt MBR tiek izmantota nulle.

Pirmajā nodalÄ«jumā izveidoju ext2 failu sistēmu, tās noklusējuma bloka izmērs ir 4096 baiti, kas arÄ« ir atspoguļots attēlā. Failu sistēmas bloka lielumu varat skatÄ«t Ŕādi:

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

Mums nepiecieÅ”amais parametrs ir ā€œBloka izmērsā€.

Tagad interesantā daļa ir, kā lasīt /home/serp/testfile failu? Fails sastāv no viena vai vairākiem failu sistēmas blokiem, kuros tiek glabāti tā dati. Zinot faila nosaukumu, kā to atrast? Kurus blokus man vajadzētu lasīt?

Å eit noder inodes. Ext2fs failu sistēmai ir "tabula", kurā ir informācija par visām inodes. Inodes skaits ext2fs gadÄ«jumā tiek iestatÄ«ts, veidojot failu sistēmu. Apskatām vajadzÄ«gos skaitļus tune2fs izvades parametrā ā€œInode countā€, t.i. mums ir 65536 gab. Inode satur mums nepiecieÅ”amo informāciju: failu sistēmas bloku sarakstu failam, kuru mēs meklējam. Kā atrast inode numuru konkrētam failam?

AttiecÄ«gais nosaukums un inode numurs ir ietverts direktorijā, un direktorijs ext2fs ir Ä«paÅ”s faila veids, t.i. ir arÄ« savs inodes numurs. Lai pārtrauktu Å”o apburto loku, saknes direktorijam tika pieŔķirts "fiksēts" inodes numurs "2". ApskatÄ«sim 2. inodes saturu:

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

Kā redzat, mums nepiecieÅ”amais direktorijs atrodas blokā ar numuru 579. Tajā mēs atradÄ«sim mājas mapes mezgla numuru un tā tālāk pa ķēdi, lÄ«dz serp direktorijā mēs redzēsim pieprasÄ«tā faila mezgla numuru. Ja pēkŔņi kāds vēlas pārbaudÄ«t, vai numurs ir pareizs un vai ir vajadzÄ«gā informācija, tas nav grÅ«ti. Mēs darām:

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

Izvadē var izlasÄ«t direktorijā esoÅ”o failu nosaukumus.

Tāpēc es nonāku pie galvenā jautājuma: "kādu iemeslu dēļ var rasties ierakstÄ«Å”anas kļūda?"

Protams, tas notiks, ja failu sistēmā nav palicis neviens brÄ«vs bloks. Ko Å”ajā gadÄ«jumā var darÄ«t? Papildus acÄ«mredzamajam ā€œizdzēsiet visu nevajadzÄ«goā€, jums jāatceras, ka ext2,3, 4 un 13094 failu sistēmās ir tāda lieta kā ā€œRezervēto bloku skaitsā€. Ja paskatās uz iepriekÅ” minēto sarakstu, mums ir Ŕādi bloki ā€œXNUMXā€. Tie ir bloki, kurus var rakstÄ«t tikai saknes lietotājs. bet, ja problēma ir ātri jāatrisina, kā pagaidu risinājumu varat tos padarÄ«t pieejamus ikvienam, tādējādi radot brÄ«vu vietu:

root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Setting reserved blocks percentage to 0% (0 blocks)

Tie. pēc noklusējuma jums ir 5% no diska vietas, kas nav pieejama rakstÄ«Å”anai, un, ņemot vērā mÅ«sdienu disku apjomu, tas var bÅ«t simtiem gigabaitu.

Kas gan cits tas varētu būt? Iespējams arī, ka ir brīvi bloki, bet mezglu vairs nav. Tas parasti notiek, ja jūsu failu sistēmā ir daudz failu, kas ir mazāki par failu sistēmas bloka lielumu. Ņemot vērā, ka 1 inode tiek iztērēta 1 failam vai direktorijam, un kopā mums ir (attiecīgai failu sistēmai) 65536 - situācija ir vairāk nekā reāla. To var skaidri redzēt no komandas df izvades:

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

Kā skaidri redzams /var/www nodalÄ«jumā, brÄ«vo bloku skaits failu sistēmā un brÄ«vo mezglu skaits ir ļoti atŔķirÄ«gs.

GadÄ«jumā, ja jums beigsies inodes, es jums nestāstÄ«Å”u nekādas burvestÄ«bas, jo... tādu nav (ja kļūdos, dariet man zināmu). Tāpēc starpsienām, kurās vairojas mazi faili, jums vajadzētu saprātÄ«gi izvēlēties failu sistēmu. Piemēram, btrfs inodes nevar beigties, jo Ja nepiecieÅ”ams, tiek dinamiski izveidoti jauni.

Avots: www.habr.com

Pievieno komentāru