Inod туралы бір нәрсе

Мерзімді түрде Орталық тарату орталығына ауысу үшін мен әртүрлі ірі компанияларда, негізінен Санкт-Петербург пен Мәскеуде, DevOps лауазымына сұхбат беремін. Мен көптеген компаниялар (көптеген жақсы компаниялар, мысалы, Яндекс) екі ұқсас сұрақ қоятынын байқадым:

  • инод дегеніміз не;
  • қандай себептермен дискіні жазу қатесін алуыңыз мүмкін (немесе мысалы: дискілік кеңістік неге таусылуы мүмкін, мәні бірдей).

Жиі болатындай, мен бұл тақырыпты жақсы білетініме сенімді болдым, бірақ түсіндіре бастағанда білімдегі олқылықтар байқалды. Білімімді жүйелеу, олқылықтарды толтыру және енді өзімді ұятқа қалдырмау үшін мен бұл мақаланы жазып отырмын, мүмкін бұл басқа біреуге пайдалы болар.

Мен төменнен бастаймын, яғни. қатты дискіден (біз флэш-дискілерді, SSD дискілерін және басқа заманауи заттарды тастаймыз; мысалы, кез келген 20 немесе 80 гиг ескі дискіні қарастырайық, өйткені блок өлшемі 512 байт).

Қатты диск өзінің кеңістігін байт бойынша қалай шешу керектігін білмейді, ол шартты түрде блоктарға бөлінеді. Блокты нөмірлеу 0-ден басталады. (Бұл LBA деп аталады, толығырақ мына жерде: ru.wikipedia.org/wiki/LBA)

Inod туралы бір нәрсе

Суреттен көрініп тұрғандай, мен 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

пікір қалдыру