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:
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