Dem bi dem, ji bo ku ez biçim Navenda Belavkirina Navendî, ez bi gelek pargîdaniyên mezin re, nemaze li St. Min dît ku gelek pargîdan (gelek pargîdaniyên baş, mînakî Yandex) du pirsên wekhev dipirsin:
- inode çi ye;
- ji ber çi sedeman hûn dikarin xeletiyek nivîsandina dîskê bistînin (an mînakî: çima dibe ku hûn cîhê dîskê biqede, esas yek e).
Wekî ku gelek caran diqewime, ez bawer bûm ku min ev mijar baş dizanibû, lê gava ku min dest bi ravekirinê kir, kêmasiyên zanînê diyar bûn. Ji bo ku zanîna xwe sîstematîze bikim, valahiyan dagirim û êdî xwe şerm nekim, ez vê gotarê dinivîsim, belkî ji kesekî din re bikêr be.
Ez ê ji binî dest pê bikim, yanî. ji dîskêşek hişk (em ê ajokarên flash, SSD û tiştên din ên nûjen ji holê rakin; mînakî, ka em her ajokerek kevn a 20 an 80 gig bifikirin, ji ber ku mezinahiya blokê li wir 512 byte ye).
Dîska hişk nizane ka meriv çawa bit-byte cîhê xwe navnîş dike; ew bi şert li blokan tê dabeş kirin. Jimarkirina blokê ji 0 dest pê dike. (Ji vê re LBA tê gotin, hûrgulî li vir:
Wekî ku ji jimarê tê dîtin, min blokên LBA wekî asta HDD destnîşan kir. Bi awayê, hûn dikarin bibînin ka pîvana bloka dîska we bi vî rengî heye:
root@ubuntu:/home/serp# blockdev --getpbsz /dev/sdb
512
Asta li jor dabeşek e, yek ji bo tevahiya dîskê (dîsa ji bo sadebûnê). Bi gelemperî, du celeb nîşankirina dabeşkirinê têne bikar anîn: msdos û gpt. Li gorî vê yekê, msdos formatek kevn e ku dîskên heya 2Tb piştgirî dike, gpt formatek nû ye ku dikare heya 1 zettabyte blokên 512 byte navnîşan bike. Di doza me de, dabeşek me ya celebê msdos heye, wekî ku ji wêneyê tê dîtin, dabeşkirin bi bloka No. 1 dest pê dike, dema ku sifir ji bo MBR-ê tê bikar anîn.
Di beşa yekem de min pergalek pelê ext2 afirand, mezinahiya bloka wê ya xwerû 4096 byte ye, ku di jimarê de jî tê xuyang kirin. Hûn dikarin mezinahiya bloka pergala pelan bi vî rengî bibînin:
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
Parametreya ku em hewce ne "Mezinahiya blokê" ye.
Naha beşa balkêş ev e ku meriv pelê /home/serp/testfile çawa dixwîne? Pelek ji yek an çend blokên pergala pelan pêk tê ku daneyên wê tê de têne hilanîn. Dizanin navê pelê, meriv wê çawa bibîne? Divê ez kîjan blokan bixwînim?
Li vir inodes bi kêr tê. Pergala pelê ext2fs xwedan "tabloyek" e ku ji bo hemî inode agahdarî vedihewîne. Hejmara inode di doza ext2fs de dema afirandina pergala pelan tê danîn. Em li hejmarên pêwîst di parametreya "Hejmara Inode" ya derana tune2fs de, yanî. 65536 perçeyên me hene. Inode agahdariya ku em hewce ne dihewîne: navnîşek blokên pergala pelan ji bo pelê ku em lê digerin. Meriv çawa ji bo pelek diyar jimareya inode bibîne?
Navê peywendîdar û hejmara inode di pelrêçê de hene, û pelrêçek di ext2fs de celebek pelek taybetî ye, ango. di heman demê de jimareya xweya înode jî heye. Ji bo şikandina vê çembera xirab, jimareyek inode "2" ya "serast" ji pelrêça root re hate destnîşankirin. Ka em li naveroka hejmara inode 2 binêrin:
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
Wekî ku hûn dibînin, pelrêça ku em hewce ne di bloka jimareya 579-ê de heye. Di wê de em ê jimara girêka peldanka malê bibînin, û bi vî rengî li ser zincîrê heya ku di pelrêça serp de em jimareya girêka pelê ya daxwazkirî bibînin. Ger ji nişkê ve kesek bixwaze kontrol bike ka hejmar rast e û agahdariya pêwîst li wir heye, ne dijwar e. Em dikin:
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
Di encam de hûn dikarin navên pelên di pelrêçê de bixwînin.
Ji ber vê yekê ez têm ser pirsa sereke: "ji ber çi sedeman dibe ku xeletiyek tomarkirinê çêbibe?"
Bi xwezayî, heke di pergala pelê de blokên belaş nemînin, ev ê bibe. Di vê rewşê de çi dikare were kirin? Ji bilî eşkere "tiştek nepêwist jêbirin", divê hûn ji bîr mekin ku di pergalên pelan ext2,3 û 4 de tiştek wekî "Hejmarkirina blokên rezervkirî" heye. Ger hûn li navnîşa jorîn binêrin, me blokên weha "13094" hene. Ev blokên ku tenê ji hêla bikarhênerê root ve têne nivîsandin in. lê heke hûn hewce ne ku zû pirsgirêkê çareser bikin, wekî çareseriyek demkî hûn dikarin wan ji her kesî re peyda bikin, û di encamê de cîhek belaş peyda bike:
root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Setting reserved blocks percentage to 0% (0 blocks)
Ewan. ji hêla xwerû ve, we% 5 ji cîhê dîskê ji bo nivîsandinê peyda nabe, û ji ber qebareya dîskên nûjen, ev dikare bi sedan gigabayt be.
Wekî din çi dibe bila bibe? Di heman demê de mimkun e ku blokên belaş hebin, lê girêkek din tune. Ev bi gelemperî diqewime heke li ser pergala pelê we komek pelên ku ji mezinahiya bloka pergala pelan piçûktir in hebin. Bihesibînin ku 1 inode li ser 1 pel an pelrêçek tê xerc kirin, û bi tevahî me (ji bo pergalek pelê ya diyarkirî) 65536 heye - rewş ji realîst e. Ev bi zelalî ji derketina fermana df tê dîtin:
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
Wekî ku li ser dabeşkirina /var/www bi zelalî tê xuyang kirin, hejmara blokên belaş di pergala pelan de û hejmara girêkên belaş pir diguhere.
Ger hûn inode xilas bibin, ez ê ji we re nebêjim, ji ber ku ... tune ne (eger ez xelet im, bila ez dizanim). Ji ber vê yekê ji bo dabeşên ku pelên piçûk lê zêde dibin, divê hûn pergala pelan bi şehrezayî hilbijêrin. Mînakî, btrfs inodes nikare biqede, ji ber Ger hewce be yên nû bi dînamîk têne afirandin.
Source: www.habr.com