Tiştek li ser inode

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: ru.wikipedia.org/wiki/LBA)

Tiştek li ser inode

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

Add a comment