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 учурда иноддордун саны файлдык системаны түзүүдө белгиленет. Биз tune2fs чыгаруунун "Inode count" параметринде керектүү сандарды карайбыз, б.а. бизде 65536 даана бар. Инод бизге керектүү маалыматты камтыйт: биз издеп жаткан файл үчүн файл тутумунун блокторунун тизмеси. Берилген файл үчүн inode номерин кантип тапса болот?

Тиешелүү аталыш жана инод номери каталогдо камтылган, ал эми ext2fsдеги каталог файлдын өзгөчө түрү, б.а. ошондой эле өзүнүн инод номери бар. Бул катаал чөйрөнү бузуу үчүн, түпкү каталогго "бекемделген" инод номери "2" дайындалган. №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 инод 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 иноддору бүтө албайт, анткени Зарыл болсо, жаңылары динамикалык түрдө түзүлөт.

Source: www.habr.com

Комментарий кошуу