Usa ka butang mahitungod sa inode

Matag karon ug unya, aron makabalhin ngadto sa Central Distribution Center, interbyu ko sa nagkalain-laing dagkong kompanya, ilabina sa St. Petersburg ug Moscow, alang sa posisyon sa DevOps. Namatikdan nako nga daghang mga kompanya (daghang maayong mga kompanya, pananglitan Yandex) nangutana og duha ka parehas nga mga pangutana:

  • unsa ang inode;
  • alang sa unsa nga mga hinungdan nga makakuha ka usa ka sayup sa pagsulat sa disk (o pananglitan: kung ngano nga mahurot ka sa wanang sa disk, parehas ang esensya).

Sama sa kanunay nga mahitabo, sigurado ako nga nahibal-an nako kini nga hilisgutan, apan sa pagsugod nako sa pagpatin-aw, ang mga kal-ang sa kahibalo nahimong dayag. Aron ma-systematize ang akong kahibalo, pun-a ang mga kal-ang ug dili na maulawan ang akong kaugalingon, gisulat ko kini nga artikulo, tingali kini mapuslanon sa uban.

Magsugod ko sa ubos, i.e. gikan sa usa ka hard drive (atong isalikway ang mga flash drive, SSD ug uban pang modernong mga butang; pananglitan, atong tagdon ang bisan unsang 20 o 80 gig old drive, tungod kay ang block size adunay 512 bytes).

Ang hard drive wala mahibal-an kung giunsa pagtubag ang space byte pinaagi sa byte; kini gibahin sa kondisyon sa mga bloke. Ang block numbering magsugod sa 0. (Gitawag kini nga LBA, mga detalye dinhi: ru.wikipedia.org/wiki/LBA)

Usa ka butang mahitungod sa inode

Ingon sa makita gikan sa numero, gitudlo nako ang mga bloke sa LBA ingon ang lebel sa HDD. Pinaagi sa dalan, imong makita kung unsa nga block ang gidak-on sa imong disk sama niini:

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

Ang lebel sa ibabaw usa ka partisyon, usa para sa tibuok disk (pag-usab alang sa kayano). Kasagaran, duha ka klase sa partition markup ang gigamit: msdos ug gpt. Tungod niini, ang msdos usa ka karaan nga format nga nagsuporta sa mga disk hangtod sa 2Tb, ang gpt usa ka bag-ong format nga makahimo sa pagtubag hangtod sa 1 zettabyte sa 512 byte nga mga bloke. Sa among kaso, kami adunay usa ka partisyon sa tipo nga msdos, ingon sa makita gikan sa numero, ang partisyon nagsugod sa block No. 1, samtang ang zero gigamit alang sa MBR.

Sa una nga partisyon naghimo ako usa ka ext2 file system, ang default block size niini mao ang 4096 bytes, nga gipakita usab sa numero. Mahimo nimong tan-awon ang gidak-on sa block sa file system sama niini:

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 nga atong gikinahanglan mao ang "Block size".

Karon ang makapaikag nga bahin mao kung giunsa pagbasa ang /home/serp/testfile file? Ang usa ka file naglangkob sa usa o daghan pa nga mga bloke sa sistema sa file diin ang datos niini gitipigan. Nahibal-an ang ngalan sa file, unsaon pagpangita niini? Unsang mga bloke ang akong basahon?

Dinhi magamit ang mga inode. Ang ext2fs file system adunay "table" nga adunay impormasyon para sa tanang inode. Ang gidaghanon sa mga inode sa kaso sa ext2fs gitakda sa paghimo sa file system. Atong tan-awon ang gikinahanglan nga mga numero sa "Inode count" parameter sa tune2fs output, i.e. kami adunay 65536 ka piraso. Ang inode naglangkob sa kasayuran nga among gikinahanglan: usa ka lista sa mga bloke sa file system alang sa file nga among gipangita. Giunsa pagpangita ang numero sa inode alang sa usa ka gihatag nga file?

Ang katugbang nga ngalan ug numero sa inode naa sa direktoryo, ug ang usa ka direktoryo sa ext2fs usa ka espesyal nga tipo sa file, i.e. Adunay usab kaugalingon nga numero sa inode. Aron mabuak kining mapintas nga lingin, usa ka "fixed" inode number "2" ang gi-assign sa root directory. Atong tan-awon ang sulod sa 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

Sama sa imong makita, ang direktoryo nga atong gikinahanglan anaa sa block number 579. Diha niini atong makita ang node number alang sa home folder, ug uban pa sa kadena hangtud sa serp directory atong makita ang node number alang sa gihangyo nga file. Kung kalit nga adunay gusto nga susihon kung husto ba ang numero ug kung naa ba ang kinahanglan nga kasayuran, dili kini lisud. Atong buhaton:

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 mahimo nimong mabasa ang mga ngalan sa mga file sa direktoryo.

Mao nga nakaabut ako sa panguna nga pangutana: "sa unsang mga hinungdan nga mahimo’g mahitabo ang sayup sa pagrekord?"

Natural, kini mahitabo kung wala’y libre nga mga bloke nga nahabilin sa file system. Unsa ang mahimo niini nga kaso? Gawas sa klaro nga "pagtangtang sa bisan unsa nga wala kinahanglana", kinahanglan nimong hinumdoman nga sa ext2,3 ug 4 nga mga sistema sa file adunay usa ka butang sama sa "Reserved block count". Kung imong tan-awon ang listahan sa ibabaw, kami adunay "13094" nga mga bloke. Kini ang mga bloke nga masulat lamang sa root user. apan kung kinahanglan nimo nga dali nga masulbad ang isyu, ingon usa ka temporaryo nga solusyon mahimo nimo kini magamit sa tanan, nga moresulta sa pipila ka libre nga wanang:

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

Mga. sa kasagaran, ikaw adunay 5% sa disk space nga dili magamit sa pagsulat, ug tungod sa gidaghanon sa modernong mga disk, kini mahimong gatusan ka gigabytes.

Unsa pa kaha kini? Posible usab nga adunay libre nga mga bloke, apan wala nay mga node. Kini kasagaran mahitabo kon ikaw adunay usa ka hugpong sa mga file sa imong file system nga mas gamay kay sa file system block gidak-on. Giisip nga ang 1 inode gigasto sa 1 nga file o direktoryo, ug sa kinatibuk-an aduna kami (alang sa usa ka gihatag nga sistema sa file) 65536 - ang sitwasyon labaw pa sa realistiko. Kini klaro nga makita gikan sa output sa 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

Ingon sa tin-aw nga makita sa partition / var / www, ang gidaghanon sa mga libre nga bloke sa file system ug ang gidaghanon sa mga libre nga node magkalainlain.

Kung nahutdan ka sa mga inode, dili ko isulti kanimo ang bisan unsang mga spelling, tungod kay ... wala (kung nasayop ko, pahibaloa ko). Mao nga alang sa mga partisyon diin ang gagmay nga mga file modaghan, kinahanglan nimo nga pilion ang sistema sa file nga maalamon. Pananglitan, ang btrfs inodes dili matapos, tungod kay Ang mga bag-o dinamikong gibuhat kung gikinahanglan.

Source: www.habr.com

Idugang sa usa ka comment