Eitthvað um inode

Reglulega, til þess að flytjast yfir í miðlæga dreifingarstöðina, tek ég viðtal við ýmis stór fyrirtæki, aðallega í St. Pétursborg og Moskvu, fyrir DevOps stöðu. Ég tók eftir því að mörg fyrirtæki (mörg góð fyrirtæki, til dæmis Yandex) spyrja tveggja svipaðra spurninga:

  • hvað er inode;
  • af hvaða ástæðum geturðu fengið skrifvillu á diski (eða til dæmis: hvers vegna þú gætir orðið uppiskroppa með diskapláss, kjarninn er sá sami).

Eins og oft vill verða var ég viss um að ég þekkti þetta efni vel, en um leið og ég fór að útskýra kom í ljós gjá í þekkingu. Til að setja þekkingu mína í kerfi, fylla í eyðurnar og skamma mig ekki lengur, er ég að skrifa þessa grein, kannski nýtist hún einhverjum öðrum.

Ég ætla að byrja frá botninum, þ.e. af harða diskinum (við munum henda flassdrifum, SSD diskum og öðrum nútímalegum hlutum; til dæmis skulum við íhuga hvaða 20 eða 80 gig gamla drif sem er, þar sem blokkastærðin þar er 512 bæti).

Harði diskurinn veit ekki hvernig á að taka á plássi sínu bæti fyrir bæti; honum er skilyrt skipt í blokkir. Númer blokkar byrjar frá 0. (Þetta er kallað LBA, upplýsingar hér: ru.wikipedia.org/wiki/LBA)

Eitthvað um inode

Eins og sést á myndinni, tilnefndi ég LBA-kubba sem HDD-stigið. Við the vegur, þú getur séð hvaða blokkastærð diskurinn þinn hefur svona:

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

Stigið fyrir ofan er skipting, ein fyrir allan diskinn (aftur til einföldunar). Oftast eru tvenns konar skiptingarmerkingar notaðar: msdos og gpt. Samkvæmt því er msdos gamalt snið sem styður allt að 2Tb diska, gpt er nýtt snið sem getur tekið á allt að 1 zettabæta af 512 bæta blokkum. Í okkar tilviki erum við með skipting af gerðinni msdos, eins og sést á myndinni, byrjar skiptingin á blokk nr. 1, en núll er notað fyrir MBR.

Í fyrstu skiptingunni bjó ég til ext2 skráarkerfi, sjálfgefin blokkastærð þess er 4096 bæti, sem endurspeglast einnig á myndinni. Þú getur skoðað blokkastærð skráarkerfisins svona:

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

Færibreytan sem við þurfum er „Blokkastærð“.

Nú er áhugaverður hluti hvernig á að lesa /home/serp/testfile skrána? Skrá samanstendur af einum eða fleiri skráarkerfisblokkum þar sem gögn hennar eru geymd. Að þekkja skráarnafnið, hvernig á að finna það? Hvaða blokkir ætti ég að lesa?

Þetta er þar sem inódar koma sér vel. ext2fs skráarkerfið er með "töflu" sem inniheldur upplýsingar fyrir alla inóda. Fjöldi inóta þegar um er að ræða ext2fs er stilltur þegar skráarkerfið er búið til. Við skoðum nauðsynlegar tölur í „Inode count“ færibreytunni í tune2fs úttakinu, þ.e. við erum með 65536 stykki. Inode inniheldur upplýsingarnar sem við þurfum: lista yfir skráarkerfisblokkir fyrir skrána sem við erum að leita að. Hvernig á að finna inode númerið fyrir tiltekna skrá?

Samsvarandi nafn og inode númer eru í skránni og skrá í ext2fs er sérstök skráartegund, þ.e. hefur líka sitt eigið inode númer. Til að rjúfa þennan vítahring var „fast“ inode númer „2“ úthlutað á rótarskrána. Við skulum skoða innihald inode númer 2:

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

Eins og þú sérð er skráin sem við þurfum í blokk númer 579. Í henni finnum við hnútnúmerið fyrir heimamöppuna og svo framvegis neðar í keðjunni þar til við sjáum hnútnúmerið fyrir umbeðna skrá í serp skránni. Ef einhver vill skyndilega athuga hvort númerið sé rétt og hvort nauðsynlegar upplýsingar séu til staðar er það ekki erfitt. Við gerum:

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

Í úttakinu geturðu lesið nöfn skráanna í möppunni.

Svo ég kem að aðalspurningunni: "af hvaða ástæðum getur upptökuvilla átt sér stað?"

Auðvitað mun þetta gerast ef engar lausar blokkir eru eftir í skráarkerfinu. Hvað er hægt að gera í þessu tilfelli? Fyrir utan hið augljósa „eyddu öllu óþarfa“, þá ættirðu að muna að í ext2,3 og 4 skráarkerfum er til eitthvað sem heitir „Frátekinn blokkafjöldi“. Ef þú skoðar skráninguna hér að ofan höfum við „13094“ slíka kubba. Þetta eru blokkir sem aðeins rótarnotandinn getur skrifað. en ef þú þarft að leysa málið fljótt, sem tímabundin lausn geturðu gert þau aðgengileg öllum, sem leiðir til laust pláss:

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

Þeir. Sjálfgefið er að þú hafir 5% af diskplássinu ekki tiltækt til að skrifa og miðað við rúmmál nútíma diska getur þetta verið hundruð gígabæta.

Hvað annað gæti það verið? Það er líka mögulegt að það séu ókeypis blokkir, en það eru ekki fleiri hnútar. Þetta gerist venjulega ef þú ert með fullt af skrám á skráarkerfinu þínu sem eru minni en skráarkerfisblokkastærðin. Miðað við að 1 inode er eytt í 1 skrá eða möppu, og samtals höfum við (fyrir tiltekið skráarkerfi) 65536 - staðan er meira en raunhæf. Þetta má greinilega sjá af úttakinu af df skipuninni:

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

Eins og sést vel á /var/www skiptingunni er fjöldi ókeypis blokka í skráarkerfinu og fjöldi ókeypis hnúta mjög mismunandi.

Ef þú verður uppiskroppa með inodes, mun ég ekki segja þér neina galdra, vegna þess að... það eru engar (ef ég hef rangt fyrir mér, láttu mig vita). Svo fyrir skipting þar sem litlar skrár margfaldast, ættir þú að velja skráarkerfið skynsamlega. Til dæmis, btrfs inodes geta ekki endað, vegna þess að Nýjar eru búnar til á kraftmikinn hátt ef þörf krefur.

Heimild: www.habr.com

Bæta við athugasemd