Kitu kuhusu ingizo

Mara kwa mara, ili kuhamia Kituo Kikuu cha Usambazaji, ninahojiana na makampuni mbalimbali makubwa, hasa huko St. Petersburg na Moscow, kwa nafasi ya DevOps. Niligundua kuwa kampuni nyingi (kampuni nyingi nzuri, kwa mfano Yandex) zinauliza maswali mawili sawa:

  • ingizo ni nini;
  • kwa sababu gani unaweza kupata hitilafu ya kuandika disk (au kwa mfano: kwa nini unaweza kukimbia nafasi ya disk, kiini ni sawa).

Kama inavyotokea mara nyingi, nilikuwa na hakika kuwa nilijua mada hii vizuri, lakini mara tu nilipoanza kuelezea, mapungufu katika maarifa yalionekana wazi. Ili kupanga ujuzi wangu, kujaza mapengo na usijitie aibu tena, ninaandika makala hii, labda itakuwa na manufaa kwa mtu mwingine.

Nitaanza kutoka chini, i.e. kutoka kwa gari ngumu (tutatupa anatoa za flash, SSD na vitu vingine vya kisasa; kwa mfano, hebu tuzingatie gari la zamani la gig 20 au 80, kwani saizi ya kuzuia kuna ka 512).

Hifadhi ngumu haijui jinsi ya kushughulikia nafasi yake kwa byte; imegawanywa kwa masharti katika vizuizi. Kuweka nambari za vitalu huanza kutoka 0. (Hii inaitwa LBA, maelezo hapa: ru.wikipedia.org/wiki/LBA)

Kitu kuhusu ingizo

Kama inavyoonekana kutoka kwa takwimu, niliteua vizuizi vya LBA kama kiwango cha HDD. Kwa njia, unaweza kuona ni ukubwa gani wa kuzuia diski yako ina kama hii:

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

Kiwango hapo juu ni kizigeu, moja kwa diski nzima (tena kwa unyenyekevu). Mara nyingi, aina mbili za markup ya kizigeu hutumiwa: msdos na gpt. Ipasavyo, msdos ni umbizo la zamani linaloauni diski hadi 2Tb, gpt ni umbizo jipya linaloweza kushughulikia hadi zettabyte 1 ya vizuizi vya baiti 512. Kwa upande wetu, tuna kizigeu cha aina ya msdos, kama inavyoonekana kutoka kwa takwimu, kizigeu huanza na block No. 1, wakati sifuri hutumiwa kwa MBR.

Katika kizigeu cha kwanza niliunda mfumo wa faili wa ext2, saizi yake ya kuzuia chaguo-msingi ni ka 4096, ambayo pia inaonekana kwenye takwimu. Unaweza kutazama saizi ya kizuizi cha mfumo wa faili kama hii:

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

Kigezo tunachohitaji ni "Ukubwa wa kuzuia".

Sasa sehemu ya kufurahisha ni jinsi ya kusoma /home/serp/testfile faili? Faili ina kizuizi kimoja au zaidi cha mfumo wa faili ambamo data yake huhifadhiwa. Kujua jina la faili, jinsi ya kuipata? Ni vizuizi gani ninapaswa kusoma?

Hapa ndipo ingizo huja kwa manufaa. Mfumo wa faili wa ext2fs una "meza" ambayo ina habari kwa ingizo zote. Idadi ya ingizo katika kesi ya ext2fs imewekwa wakati wa kuunda mfumo wa faili. Tunaangalia nambari zinazohitajika katika parameter ya "Inode count" ya pato la tune2fs, i.e. tuna vipande 65536. Ingizo lina habari tunayohitaji: orodha ya vizuizi vya mfumo wa faili kwa faili tunayotafuta. Jinsi ya kupata nambari ya ingizo kwa faili fulani?

Jina linalolingana na nambari ya ingizo ziko kwenye saraka, na saraka katika ext2fs ni aina maalum ya faili, i.e. pia ina nambari yake ya ingizo. Ili kuvunja mduara huu mbaya, nambari ya ingizo "iliyowekwa" "2" ilipewa saraka ya mizizi. Wacha tuangalie yaliyomo kwenye nambari ya nambari ya 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

Kama unaweza kuona, saraka tunayohitaji iko katika nambari ya kuzuia 579. Ndani yake tutapata nambari ya nodi ya folda ya nyumbani, na kadhalika chini ya mlolongo hadi kwenye saraka ya serp tunaona nambari ya node ya faili iliyoombwa. Ikiwa ghafla mtu anataka kuangalia ikiwa nambari ni sahihi na ikiwa habari muhimu iko, sio ngumu. Tunafanya:

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

Katika pato unaweza kusoma majina ya faili kwenye saraka.

Kwa hivyo ninakuja kwa swali kuu: "kwa sababu gani kosa la kurekodi linaweza kutokea?"

Kwa kawaida, hii itatokea ikiwa hakuna vitalu vya bure vilivyobaki kwenye mfumo wa faili. Nini kifanyike katika kesi hii? Kando na "kufuta chochote kisichohitajika", unapaswa kukumbuka kuwa katika mifumo ya faili ya ext2,3 na 4 kuna kitu kama "Hesabu ya kizuizi kilichohifadhiwa". Ukiangalia tangazo hapo juu, tuna "13094" vitalu kama hivyo. Hizi ni vizuizi vinavyoweza kuandikwa na mtumiaji wa mizizi pekee. lakini ikiwa unahitaji kusuluhisha suala hilo haraka, kama suluhisho la muda unaweza kuzifanya zipatikane kwa kila mtu, na hivyo kusababisha nafasi ya bure:

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

Wale. kwa default, una 5% ya nafasi ya disk haipatikani kwa kuandika, na kutokana na kiasi cha disks za kisasa, hii inaweza kuwa mamia ya gigabytes.

Nini kingine inaweza kuwa? Inawezekana pia kuwa kuna vitalu vya bure, lakini hakuna nodes zaidi. Hii kawaida hufanyika ikiwa una rundo la faili kwenye mfumo wako wa faili ambazo ni ndogo kuliko saizi ya kizuizi cha mfumo wa faili. Kwa kuzingatia kwamba ingizo 1 hutumiwa kwenye faili 1 au saraka, na kwa jumla tunayo (kwa mfumo wa faili uliopewa) 65536 - hali ni zaidi ya kweli. Hii inaweza kuonekana wazi kutoka kwa matokeo ya df amri:

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

Kama inavyoonekana wazi kwenye /var/www kizigeu, idadi ya vizuizi vya bure kwenye mfumo wa faili na idadi ya nodi za bure hutofautiana sana.

Iwapo utaishiwa na viingilio, sitakuambia miiko yoyote, kwa sababu... hakuna (kama nimekosea, nijulishe). Kwa hivyo kwa sehemu ambazo faili ndogo huzidisha, unapaswa kuchagua mfumo wa faili kwa busara. Kwa mfano, ingizo za btrfs haziwezi kumaliza, kwa sababu Mpya zinaundwa kwa nguvu ikiwa ni lazima.

Chanzo: mapenzi.com

Kuongeza maoni