Isang bagay tungkol sa inode

Paminsan-minsan, upang lumipat sa Central Distribution Center, nakikipanayam ako sa iba't ibang malalaking kumpanya, pangunahin sa St. Petersburg at Moscow, para sa isang posisyon sa DevOps. Napansin ko na maraming kumpanya (maraming magagandang kumpanya, halimbawa Yandex) ang nagtatanong ng dalawang magkatulad na tanong:

  • ano ang inode;
  • para sa kung anong mga dahilan maaari kang makakuha ng isang disk write error (o halimbawa: kung bakit maaari kang maubusan ng puwang sa disk, ang kakanyahan ay pareho).

Tulad ng madalas na nangyayari, sigurado akong alam ko ang paksang ito, ngunit sa sandaling nagsimula akong magpaliwanag, naging maliwanag ang mga gaps sa kaalaman. Upang ma-systematize ang aking kaalaman, punan ang mga puwang at hindi na mapahiya ang aking sarili, isinusulat ko ang artikulong ito, marahil ito ay kapaki-pakinabang sa ibang tao.

Magsisimula ako sa ibaba, i.e. mula sa isang hard drive (itatapon namin ang mga flash drive, SSD at iba pang modernong bagay; halimbawa, isaalang-alang natin ang anumang 20 o 80 gig na lumang drive, dahil ang laki ng block ay 512 bytes).

Ang hard drive ay hindi alam kung paano tugunan ang space byte nito sa pamamagitan ng byte; ito ay may kondisyon na nahahati sa mga bloke. Ang block numbering ay nagsisimula sa 0. (Tinatawag itong LBA, mga detalye dito: ru.wikipedia.org/wiki/LBA)

Isang bagay tungkol sa inode

Tulad ng makikita mula sa figure, itinalaga ko ang mga bloke ng LBA bilang antas ng HDD. Siyanga pala, makikita mo kung anong laki ng block ang mayroon ang iyong disk tulad nito:

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

Ang antas sa itaas ay isang partition, isa para sa buong disk (muli para sa pagiging simple). Kadalasan, dalawang uri ng partition markup ang ginagamit: msdos at gpt. Alinsunod dito, ang msdos ay isang lumang format na sumusuporta sa mga disk hanggang 2Tb, ang gpt ay isang bagong format na may kakayahang tumugon sa hanggang 1 zettabyte ng 512 byte na mga bloke. Sa aming kaso, mayroon kaming isang partition ng uri ng msdos, tulad ng makikita mula sa figure, ang partisyon ay nagsisimula sa block No. 1, habang ang zero ay ginagamit para sa MBR.

Sa unang partition gumawa ako ng ext2 file system, ang default na laki ng block nito ay 4096 bytes, na makikita rin sa figure. Maaari mong tingnan ang laki ng block ng file system tulad nito:

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

Ang parameter na kailangan namin ay "Laki ng bloke".

Ngayon ang kawili-wiling bahagi ay kung paano basahin ang /home/serp/testfile file? Ang isang file ay binubuo ng isa o higit pang mga bloke ng file system kung saan nakaimbak ang data nito. Alam ang pangalan ng file, paano ito mahahanap? Aling mga bloke ang dapat kong basahin?

Ito ay kung saan magagamit ang mga inode. Ang ext2fs file system ay may "talahanayan" na naglalaman ng impormasyon para sa lahat ng inode. Ang bilang ng mga inode sa kaso ng ext2fs ay itinakda kapag lumilikha ng file system. Tinitingnan namin ang mga kinakailangang numero sa parameter na "Inode count" ng output ng tune2fs, i.e. mayroon kaming 65536 piraso. Ang inode ay naglalaman ng impormasyong kailangan namin: isang listahan ng mga bloke ng file system para sa file na hinahanap namin. Paano mahahanap ang numero ng inode para sa isang naibigay na file?

Ang kaukulang pangalan at numero ng inode ay nakapaloob sa direktoryo, at ang isang direktoryo sa ext2fs ay isang espesyal na uri ng file, i.e. ay mayroon ding sariling numero ng inode. Upang masira ang mabisyo na bilog na ito, isang "fixed" na numero ng inode na "2" ang itinalaga sa root directory. Tingnan natin ang mga nilalaman ng inode number 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

Tulad ng nakikita mo, ang direktoryo na kailangan namin ay nakapaloob sa block number 579. Dito makikita namin ang numero ng node para sa home folder, at iba pa pababa sa chain hanggang sa direktoryo ng serp nakita namin ang numero ng node para sa hiniling na file. Kung biglang may gustong suriin kung tama ang numero at kung naroon ang kinakailangang impormasyon, hindi ito mahirap. ginagawa namin:

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

Sa output maaari mong basahin ang mga pangalan ng mga file sa direktoryo.

Kaya't dumating ako sa pangunahing tanong: "para sa anong mga kadahilanan maaaring mangyari ang isang error sa pag-record?"

Naturally, ito ay mangyayari kung walang libreng mga bloke na natitira sa file system. Ano ang maaaring gawin sa kasong ito? Bukod sa halatang "tanggalin ang anumang hindi kailangan", dapat mong tandaan na sa ext2,3 at 4 na mga file system mayroong isang bagay bilang "Reserved block count". Kung titingnan mo ang listahan sa itaas, mayroon kaming "13094" na mga bloke. Ang mga ito ay mga bloke na maisusulat lamang ng root user. ngunit kung kailangan mong mabilis na lutasin ang isyu, bilang isang pansamantalang solusyon maaari mong gawing available ang mga ito sa lahat, na nagreresulta sa ilang libreng espasyo:

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

Yung. bilang default, mayroon kang 5% ng espasyo sa disk na hindi magagamit para sa pagsusulat, at dahil sa dami ng mga modernong disk, maaari itong maging daan-daang gigabytes.

Ano pa kaya ito? Posible rin na may mga libreng bloke, ngunit wala nang mga node. Karaniwan itong nangyayari kung mayroon kang isang bungkos ng mga file sa iyong file system na mas maliit kaysa sa laki ng block ng file system. Isinasaalang-alang na ang 1 inode ay ginugol sa 1 file o direktoryo, at sa kabuuan mayroon kaming (para sa isang naibigay na file system) 65536 - ang sitwasyon ay higit pa sa makatotohanan. Ito ay malinaw na makikita mula sa output ng df command:

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

Tulad ng malinaw na nakikita sa partisyon /var/www, ang bilang ng mga libreng bloke sa file system at ang bilang ng mga libreng node ay malaki ang pagkakaiba-iba.

Kung sakaling maubusan ka ng inode, hindi ko sasabihin sa iyo ang anumang mga spell, dahil... wala (kung mali ako, let me know). Kaya para sa mga partisyon kung saan dumarami ang maliliit na file, dapat mong piliin nang matalino ang file system. Halimbawa, ang mga inode ng btrfs ay hindi maaaring magtapos, dahil Ang mga bago ay dynamic na nilikha kung kinakailangan.

Pinagmulan: www.habr.com

Magdagdag ng komento