Rhywbeth am inode

O bryd i'w gilydd, er mwyn symud i'r Ganolfan Ddosbarthu Ganolog, rwy'n cyfweld ag amrywiol gwmnïau mawr, yn bennaf yn St Petersburg a Moscow, ar gyfer swydd DevOps. Sylwais fod llawer o gwmnïau (llawer o gwmnïau da, er enghraifft Yandex) yn gofyn dau gwestiwn tebyg:

  • beth yw inod;
  • am ba resymau allwch chi gael gwall ysgrifennu disg (neu er enghraifft: pam y gallech redeg allan o ofod disg, mae'r hanfod yr un peth).

Fel sy'n digwydd yn aml, roeddwn yn siŵr fy mod yn gwybod y pwnc hwn yn dda, ond cyn gynted ag y dechreuais egluro, daeth bylchau mewn gwybodaeth i'r amlwg. Er mwyn systemateiddio fy ngwybodaeth, llenwi'r bylchau a pheidio â chodi cywilydd arnaf fy hun, rwy'n ysgrifennu'r erthygl hon, efallai y bydd yn ddefnyddiol i rywun arall.

Dechreuaf o’r gwaelod, h.y. o yriant caled (byddwn yn taflu gyriannau fflach, SSDs a phethau modern eraill; er enghraifft, gadewch i ni ystyried unrhyw hen yriant 20 neu 80 gig, gan fod maint y bloc yna 512 bytes).

Nid yw'r gyriant caled yn gwybod sut i fynd i'r afael â'i beit gofod fesul beit; mae wedi'i rannu'n flociau yn amodol. Mae rhifo bloc yn dechrau o 0. (Gelwir hyn yn LBA, manylion yma: ru.wikipedia.org/wiki/LBA)

Rhywbeth am inode

Fel y gwelir o'r ffigur, dynodais flociau LBA fel y lefel HDD. Gyda llaw, gallwch weld pa faint bloc sydd gan eich disg fel hyn:

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

Rhaniad yw'r lefel uchod, un ar gyfer y ddisg gyfan (eto er mwyn symlrwydd). Yn fwyaf aml, defnyddir dau fath o farcio rhaniad: msdos a gpt. Yn unol â hynny, mae msdos yn hen fformat sy'n cefnogi disgiau hyd at 2Tb, mae gpt yn fformat newydd sy'n gallu mynd i'r afael â hyd at 1 zettabyte o 512 bloc beit. Yn ein hachos ni, mae gennym raniad o msdos math, fel y gwelir o'r ffigur, mae'r rhaniad yn dechrau gyda bloc Rhif 1, tra bod sero yn cael ei ddefnyddio ar gyfer y MBR.

Yn y rhaniad cyntaf, creais system ffeiliau ext2, ei faint bloc rhagosodedig yw 4096 bytes, sydd hefyd yn cael ei adlewyrchu yn y ffigur. Gallwch weld maint bloc y system ffeiliau fel hyn:

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

Y paramedr sydd ei angen arnom yw “Maint bloc”.

Nawr y rhan ddiddorol yw sut i ddarllen y ffeil /home/serp/testfile? Mae ffeil yn cynnwys un neu fwy o flociau system ffeiliau lle mae ei data'n cael ei storio. Yn gwybod enw'r ffeil, sut i ddod o hyd iddo? Pa flociau ddylwn i eu darllen?

Dyma lle mae inodes yn dod yn ddefnyddiol. Mae gan y system ffeiliau ext2fs "tabl" sy'n cynnwys gwybodaeth ar gyfer pob inod. Mae nifer yr inodes yn achos ext2fs yn cael ei osod wrth greu'r system ffeiliau. Edrychwn ar y niferoedd gofynnol ym mharamedr “cyfrif Inode” allbwn tune2fs, h.y. mae gennym 65536 o ddarnau. Mae'r inod yn cynnwys y wybodaeth sydd ei hangen arnom: rhestr o flociau system ffeiliau ar gyfer y ffeil yr ydym yn chwilio amdani. Sut i ddod o hyd i'r rhif inod ar gyfer ffeil benodol?

Mae'r enw cyfatebol a'r rhif inod wedi'u cynnwys yn y cyfeiriadur, ac mae cyfeiriadur yn ext2fs yn fath arbennig o ffeil, h.y. hefyd ei rif inod ei hun. I dorri'r cylch dieflig hwn, neilltuwyd rhif inod “sefydlog” “2” i'r cyfeiriadur gwraidd. Edrychwn ar gynnwys inod rhif 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

Fel y gwelwch, mae'r cyfeiriadur sydd ei angen arnom wedi'i gynnwys yn rhif bloc 579. Ynddo fe welwn y rhif nod ar gyfer y ffolder cartref, ac yn y blaen i lawr y gadwyn nes yn y cyfeiriadur serp gwelwn y rhif nod ar gyfer y ffeil y gofynnwyd amdani. Os yn sydyn mae rhywun eisiau gwirio a yw'r rhif yn gywir ac a yw'r wybodaeth angenrheidiol yno, nid yw'n anodd. Rydym yn gwneud:

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

Yn yr allbwn gallwch ddarllen enwau'r ffeiliau yn y cyfeiriadur.

Felly dof at y prif gwestiwn: “am ba resymau y gall gwall recordio ddigwydd?”

Yn naturiol, bydd hyn yn digwydd os nad oes unrhyw flociau am ddim ar ôl yn y system ffeiliau. Beth ellir ei wneud yn yr achos hwn? Heblaw am yr amlwg “dileu unrhyw beth diangen”, dylech gofio bod y fath beth â “Cyfrif blociau a gadwyd yn ôl” mewn systemau ffeiliau ext2,3 a 4. Os edrychwch ar y rhestriad uchod, mae gennym “13094” o flociau o'r fath. Mae'r rhain yn flociau y gellir eu hysgrifennu gan y defnyddiwr gwraidd yn unig. ond os oes angen i chi ddatrys y mater yn gyflym, fel ateb dros dro gallwch sicrhau eu bod ar gael i bawb, gan arwain at rywfaint o le am ddim:

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

Y rhai. yn ddiofyn, mae gennych 5% o'r gofod disg nad yw ar gael ar gyfer ysgrifennu, ac o ystyried nifer y disgiau modern, gall hyn fod yn gannoedd o gigabeit.

Beth arall allai fod? Mae hefyd yn bosibl bod blociau rhad ac am ddim, ond nid oes mwy o nodau. Mae hyn fel arfer yn digwydd os oes gennych griw o ffeiliau ar eich system ffeiliau sy'n llai na maint bloc y system ffeiliau. O ystyried bod 1 inode yn cael ei wario ar 1 ffeil neu gyfeiriadur, ac yn gyfan gwbl mae gennym (ar gyfer system ffeiliau benodol) 65536 - mae'r sefyllfa'n fwy na realistig. Gellir gweld hyn yn glir o allbwn y gorchymyn 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/www

Fel y gwelir yn glir ar y rhaniad /var/www, mae nifer y blociau rhad ac am ddim yn y system ffeiliau a nifer y nodau rhad ac am ddim yn amrywio'n fawr.

Rhag ofn i chi redeg allan o inodes, ni fyddaf yn dweud unrhyw swynion wrthych, oherwydd ... does dim (os ydw i'n anghywir, gadewch i mi wybod). Felly ar gyfer rhaniadau lle mae ffeiliau bach yn lluosi, dylech ddewis y system ffeiliau yn ddoeth. Er enghraifft, ni all inodes btrfs ddod i ben, oherwydd Mae rhai newydd yn cael eu creu'n ddeinamig os oes angen.

Ffynhonnell: hab.com

Ychwanegu sylw