Мезгил-мезгили менен Борбордук бөлүштүрүү борборуна өтүү үчүн мен DevOps кызмат орду үчүн негизинен Санкт-Петербургдагы жана Москвадагы ар кандай ири компаниялардан интервью алып турам. Мен көптөгөн компаниялар (көптөгөн жакшы компаниялар, мисалы, Яндекс) эки окшош суроолорду беришерин байкадым:
- inode деген эмне;
- кандай себептерден улам диск жазуу катасын ала аласыз (же, мисалы: эмне үчүн сизде диск мейкиндиги түгөнүп калышы мүмкүн, маңызы бирдей).
Көбүнчө, мен бул теманы жакшы билгениме ишенчүмүн, бирок түшүндүрө баштаганда билимдеги боштуктар байкалып калды. Билимимди системалаштыруу, боштуктарды толтуруу жана мындан ары өзүмдү уятка калтырбоо үчүн, мен бул макаланы жазып жатам, балким, башка бирөө үчүн пайдалуу болот.
Мен түбүнөн баштайм, б.а. катуу дисктен (биз флэш-дисктерди, SSDди жана башка заманбап нерселерди жок кылабыз; мисалы, 20 же 80 гиг эски дискти карап көрөлү, анткени блоктун көлөмү 512 байт).
Катуу диск өзүнүн мейкиндигин байт боюнча кантип чечүүнү билбейт, ал шарттуу түрдө блокторго бөлүнгөн. Блоктун номери 0дөн башталат. (Бул LBA деп аталат, чоо-жайы бул жерде:
Сүрөттөн көрүнүп тургандай, мен 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