Чизе дар бораи inode

Давра ба давра, барои гузаштан ба Маркази Тақсимоти Марказӣ, ман дар ширкатҳои гуногуни бузург, асосан дар Санкт-Петербург ва Маскав, барои вазифаи DevOps мусоҳиба мекунам. Ман пайхас кардам, ки бисёр ширкатҳо (бисёр ширкатҳои хуб, масалан Яндекс) ду саволи шабеҳ медиҳанд:

  • 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 байтро ҳал кунад. Дар ҳолати мо, мо қисмати навъи 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 ҳангоми сохтани системаи файлӣ муқаррар карда мешавад. Мо ба рақамҳои зарурӣ дар параметри "count Inode" -и баромади tune2fs назар мекунем, яъне. мо 65536 дона дорем. Инод дорои маълумоти ба мо лозим аст: рӯйхати блокҳои системаи файлӣ барои файле, ки мо меҷӯем. Рақами inode барои файли додашударо чӣ гуна бояд ёфт?

Номи мувофиқ ва рақами inode дар директория мавҷуд аст ва директория дар ext2fs як навъи махсуси файл аст, яъне. инчунин рақами инодии худро дорад. Барои шикастани ин доираи ваҳшӣ, ба директорияи реша рақами иноди "собит" "2" таъин карда шуд. Биёед ба мундариҷаи inode рақами 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

Тавре ки шумо мебинед, директорияе, ки ба мо лозим аст, дар блоки рақами 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" дорем. Ин блокҳое мебошанд, ки танҳо аз ҷониби корбари реша навиштан мумкин аст. аммо агар ба шумо лозим ояд, ки масъаларо зуд ҳал кунед, шумо метавонед онҳоро барои ҳама дастрас кунед, ки дар натиҷа фазои холӣ пайдо мешавад:

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 наметавонад хотима ёбад, зеро Дар ҳолати зарурӣ навҳои нав ба таври динамикӣ эҷод карда мешаванд.

Манбаъ: will.com

Илова Эзоҳ