Мерзімді түрде Орталық тарату орталығына ауысу үшін мен әртүрлі ірі компанияларда, негізінен Санкт-Петербург пен Мәскеуде, DevOps лауазымына сұхбат беремін. Мен көптеген компаниялар (көптеген жақсы компаниялар, мысалы, Яндекс) екі ұқсас сұрақ қоятынын байқадым:
- инод дегеніміз не;
- қандай себептермен дискіні жазу қатесін алуыңыз мүмкін (немесе мысалы: дискілік кеңістік неге таусылуы мүмкін, мәні бірдей).
Жиі болатындай, мен бұл тақырыпты жақсы білетініме сенімді болдым, бірақ түсіндіре бастағанда білімдегі олқылықтар байқалды. Білімімді жүйелеу, олқылықтарды толтыру және енді өзімді ұятқа қалдырмау үшін мен бұл мақаланы жазып отырмын, мүмкін бұл басқа біреуге пайдалы болар.
Мен төменнен бастаймын, яғни. қатты дискіден (біз флэш-дискілерді, 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 дана. Инод бізге қажетті ақпаратты қамтиды: біз іздеп жатқан файлға арналған файлдық жүйе блоктарының тізімі. Берілген файл үшін инод нөмірін қалай табуға болады?
Сәйкес атау мен инод нөмірі каталогта болады, ал 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-шы блокта орналасқан. Онда біз бастапқы қалта үшін түйін нөмірін табамыз және т. Егер кенеттен біреу нөмірдің дұрыс екенін және қажетті ақпарат бар-жоғын тексергісі келсе, бұл қиын емес. Біз жасаймыз:
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 инодтары аяқталмайды, өйткені Қажет болса, жаңалары динамикалық түрде жасалады.
Ақпарат көзі: www.habr.com