Inode-ийн талаар ямар нэг зүйл

Үе үе Төв түгээлтийн төвд шилжихийн тулд би янз бүрийн томоохон компаниудад, ялангуяа Санкт-Петербург, Москвад DevOps-ийн албан тушаалд ярилцлага өгдөг. Олон компаниуд (олон сайн компаниуд, жишээ нь Yandex) ижил төстэй хоёр асуулт асууж байгааг би анзаарсан.

  • inode гэж юу вэ;
  • ямар шалтгааны улмаас диск бичих алдаа гарч болох вэ (эсвэл жишээ нь: яагаад дискний зай дуусч магадгүй, мөн чанар нь адилхан).

Ихэнхдээ би энэ сэдвийг сайн мэддэг гэдэгтээ итгэлтэй байсан ч тайлбарлаж эхэлмэгц мэдлэгийн цоорхой гарч ирэв. Мэдлэгээ системчилж, дутуугаа нөхөж, өөрийгөө ичээхгүйн тулд би энэ нийтлэлийг бичиж байна, магадгүй энэ нь хэн нэгэнд хэрэг болох байх.

Би доороос нь эхлэх болно, өөрөөр хэлбэл. хатуу дискнээс (бид флаш диск, SSD болон бусад орчин үеийн зүйлсийг хаях болно; жишээлбэл, блокийн хэмжээ 20 байт тул 80 эсвэл 512 гиг хуучин дискийг авч үзье).

Хатуу диск нь орон зайгаа байтаар хэрхэн хаяглахаа мэддэггүй бөгөөд энэ нь нөхцөлт блокуудад хуваагддаг. Блок дугаарлалт 0-ээс эхэлнэ. (Үүнийг LBA гэж нэрлэдэг, энд дэлгэрэнгүй: ru.wikipedia.org/wiki/LBA)

Inode-ийн талаар ямар нэг зүйл

Зургаас харахад би LBA блокуудыг HDD түвшин гэж тодорхойлсон. Дашрамд хэлэхэд, таны дискний блок ямар хэмжээтэй байгааг та дараах байдлаар харж болно.

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

Дээрх түвшин нь бүхэл бүтэн дискэнд зориулагдсан хуваалт юм (дахин хялбар болгох үүднээс). Ихэнхдээ хоёр төрлийн хуваалтын тэмдэглэгээг ашигладаг: msdos болон gpt. Үүний дагуу msdos нь 2Тб хүртэлх дискийг дэмждэг хуучин формат бол gpt нь 1 байт блокийн 512 zettabyte хүртэл хаяглах чадвартай шинэ формат юм. Манай тохиолдолд msdos төрлийн хуваалт байгаа бөгөөд зурагнаас харахад хуваалт нь 1-р блокоос эхэлдэг бол MBR-д тэгийг ашигладаг.

Эхний хуваалт дээр би ext2 файлын системийг үүсгэсэн бөгөөд түүний анхдагч блокийн хэмжээ нь 4096 байт бөгөөд энэ нь мөн зурагт харагдаж байна. Та файлын системийн блокийн хэмжээг дараах байдлаар харж болно.

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

Бидэнд хэрэгтэй параметр бол "Блокны хэмжээ" юм.

Одоо сонирхолтой хэсэг нь /home/serp/testfile файлыг хэрхэн унших вэ? Файл нь өгөгдөл хадгалагддаг нэг буюу хэд хэдэн файлын системийн блокуудаас бүрдэнэ. Файлын нэрийг мэдэж байгаа тул яаж олох вэ? Би аль блокуудыг унших ёстой вэ?

Энд инодууд хэрэгтэй болно. Ext2fs файлын систем нь бүх инодын мэдээллийг агуулсан "хүснэгттэй". Ext2fs тохиолдолд инодын тоог файлын системийг үүсгэх үед тохируулдаг. Бид tune2fs гаралтын "Inode count" параметрт шаардлагатай тоонуудыг хардаг, i.e. Бидэнд 65536 ширхэг байна. Инод нь бидэнд хэрэгтэй мэдээллийг агуулдаг: бидний хайж буй файлын файлын системийн блокуудын жагсаалт. Өгөгдсөн файлын inode дугаарыг хэрхэн олох вэ?

Холбогдох нэр болон inode дугаар нь лавлахад агуулагдах бөгөөд ext2fs дахь лавлах нь тусгай төрлийн файл, i.e. мөн өөрийн инодын дугаартай. Энэхүү харгис тойргийг эвдэхийн тулд үндсэн директорт "тогтмол" инод дугаар "2" оноогдсон. 2-р inode-ийн агуулгыг харцгаая:

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

Таны харж байгаагаар бидэнд хэрэгтэй лавлах нь 579-р блокт агуулагдаж байна. Эндээс бид үндсэн хавтасны зангилааны дугаарыг олох болно, мөн гинжин хэлхээнээс доош serp лавлахаас бид хүссэн файлын зангилааны дугаарыг харах болно. Гэнэт хэн нэгэн дугаар зөв эсэх, шаардлагатай мэдээлэл байгаа эсэхийг шалгахыг хүсвэл энэ нь тийм ч хэцүү биш юм. Бид хийдэг:

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

Гаралтаас та лавлах дахь файлуудын нэрийг уншиж болно.

Тиймээс би "ямар шалтгааны улмаас бичлэгийн алдаа гарч болох вэ?" гэсэн гол асуултанд ирлээ.

Мэдээжийн хэрэг, файлын системд чөлөөт блок үлдэхгүй бол энэ нь тохиолдох болно. Энэ тохиолдолд юу хийж болох вэ? "Шаардлагагүй бүх зүйлийг устгах" -аас гадна ext2,3, 4, 13094 файлын системд "Нөөцлөгдсөн блокийн тоо" гэсэн зүйл байдаг гэдгийг санах хэрэгтэй. Хэрэв та дээрх жагсаалтыг харвал бидэнд "XNUMX" ийм блок байна. Эдгээр нь зөвхөн үндсэн хэрэглэгч бичих боломжтой блокууд юм. Гэхдээ хэрэв та асуудлыг хурдан шийдвэрлэх шаардлагатай бол түр зуурын шийдэл болгон тэдгээрийг хүн бүрт ашиглах боломжтой болгож, бага зэрэг сул зай гаргаж болно:

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

Тэдгээр. Анхдагч байдлаар, танд дискний зайны 5% нь бичих боломжгүй бөгөөд орчин үеийн дискний эзэлхүүнийг харгалзан үзвэл энэ нь хэдэн зуун гигабайт байж болно.

Өөр юу байж болох вэ? Мөн чөлөөт блокууд байж болох ч зангилаа байхгүй байна. Хэрэв таны файлын системд файлын системийн блокийн хэмжээнээс бага олон тооны файл байгаа бол энэ нь ихэвчлэн тохиолддог. 1 inode нь 1 файл эсвэл лавлахад зарцуулагддаг бөгөөд нийтдээ (өгөгдсөн файлын системийн хувьд) 65536 байна гэж үзвэл нөхцөл байдал бодитой биш юм. Үүнийг df командын гаралтаас тодорхой харж болно.

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

/var/www хуваалтаас тодорхой харагдаж байгаа тул файлын систем дэх чөлөөт блокуудын тоо болон чөлөөт зангилааны тоо ихээхэн ялгаатай байна.

Хэрэв таны инод дуусвал би чамд ямар ч шившлэг хэлэхгүй, учир нь... байхгүй (хэрэв миний буруу бол надад мэдэгдээрэй). Тиймээс жижиг файлууд үрждэг хуваалтуудын хувьд та файлын системийг ухаалгаар сонгох хэрэгтэй. Жишээ нь btrfs inodes дуусах боломжгүй, учир нь Шаардлагатай бол шинийг динамикаар бий болгодог.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх