Inode haqida biror narsa

Vaqti-vaqti bilan, Markaziy tarqatish markaziga o'tish uchun men DevOps lavozimi uchun turli yirik kompaniyalarda, asosan, Sankt-Peterburg va Moskvada suhbatlashaman. Ko'p kompaniyalar (ko'plab yaxshi kompaniyalar, masalan, Yandex) ikkita shunga o'xshash savol berishlarini payqadim:

  • inode nima;
  • qanday sabablarga ko'ra diskda yozish xatosi paydo bo'lishi mumkin (yoki masalan: nima uchun diskda bo'sh joy tugashi mumkin, mohiyati bir xil).

Har doimgidek, men bu mavzuni yaxshi bilganimga amin edim, lekin tushuntirishni boshlaganimdan so'ng, bilimdagi bo'shliqlar aniq bo'ldi. Mening bilimlarimni tizimlashtirish, bo'shliqlarni to'ldirish va endi o'zimni xijolat qilmaslik uchun men ushbu maqolani yozyapman, ehtimol bu boshqa birovga foydali bo'ladi.

Men pastdan boshlayman, ya'ni. qattiq diskdan (biz flesh-disklarni, SSD-larni va boshqa zamonaviy narsalarni olib tashlaymiz; masalan, har qanday 20 yoki 80 gig eski diskni ko'rib chiqaylik, chunki blok hajmi 512 baytni tashkil qiladi).

Qattiq disk o'zining bo'sh joyini bayt bo'yicha qanday hal qilishni bilmaydi, u shartli ravishda bloklarga bo'linadi. Bloklarni raqamlash 0 dan boshlanadi. (Bu LBA deb ataladi, batafsil ma'lumot bu erda: ru.wikipedia.org/wiki/LBA)

Inode haqida biror narsa

Rasmdan ko'rinib turibdiki, men LBA bloklarini HDD darajasi sifatida belgiladim. Aytgancha, diskingiz qanday blok hajmiga ega ekanligini ko'rishingiz mumkin:

root@ubuntu:/home/serp# blockdev --getpbsz /dev/sdb
512

Yuqoridagi daraja butun disk uchun bo'lim (yana soddalik uchun). Ko'pincha ikki turdagi bo'lim belgilari qo'llaniladi: msdos va gpt. Shunga ko'ra, msdos - 2 Tb gacha bo'lgan disklarni qo'llab-quvvatlaydigan eski format, gpt - 1 bayt blokdan 512 zettabaytgacha bo'lgan manzilni ko'rsatishga qodir yangi format. Bizning holatda, bizda msdos tipidagi bo'lim mavjud, rasmdan ko'rinib turibdiki, bo'lim 1-blokdan boshlanadi, MBR uchun esa nol ishlatiladi.

Birinchi bo'limda men ext2 fayl tizimini yaratdim, uning standart blok hajmi 4096 baytni tashkil etadi, bu rasmda ham aks ettirilgan. Fayl tizimi blokining hajmini quyidagicha ko'rishingiz mumkin:

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

Bizga kerak bo'lgan parametr "Blok hajmi".

Endi qiziqarli qism /home/serp/testfile faylini qanday o'qish kerak? Fayl bir yoki bir nechta fayl tizimi bloklaridan iborat bo'lib, unda uning ma'lumotlari saqlanadi. Fayl nomini bilish, uni qanday topish mumkin? Qaysi bloklarni o'qishim kerak?

Bu erda inodelar yordam beradi. ext2fs fayl tizimida barcha inodelar uchun ma'lumotlarni o'z ichiga olgan "jadval" mavjud. Ext2fs holatidagi inodelar soni fayl tizimini yaratishda o'rnatiladi. Tune2fs chiqishining "Inode count" parametrida kerakli raqamlarni ko'rib chiqamiz, ya'ni. Bizda 65536 dona bor. Inode bizga kerakli ma'lumotlarni o'z ichiga oladi: biz izlayotgan fayl uchun fayl tizimi bloklari ro'yxati. Berilgan fayl uchun inode raqamini qanday topish mumkin?

Tegishli nom va inode raqami katalogda joylashgan va ext2fs-dagi katalog maxsus fayl turi, ya'ni. ham o'z inode raqamiga ega. Ushbu shafqatsiz doirani buzish uchun ildiz katalogiga "sobit" inode raqami "2" tayinlandi. Keling, 2-sonli inode tarkibini ko'rib chiqaylik:

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

Ko'rib turganingizdek, bizga kerak bo'lgan katalog 579-sonli blokda joylashgan. Unda biz uy papkasi uchun tugun raqamini topamiz va shunga o'xshash zanjir bo'ylab serp katalogida so'ralgan fayl uchun tugun raqamini ko'rmagunimizcha. Agar to'satdan kimdir raqamning to'g'riligini va kerakli ma'lumotlar mavjudligini tekshirmoqchi bo'lsa, bu qiyin emas. Biz bajaramiz:

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

Chiqishda siz katalogdagi fayllar nomlarini o'qishingiz mumkin.

Shunday qilib, men asosiy savolga kelaman: "qaysi sabablarga ko'ra yozuv xatosi paydo bo'lishi mumkin?"

Tabiiyki, bu fayl tizimida bo'sh bloklar qolmasa sodir bo'ladi. Bu holatda nima qilish mumkin? Aniq "keraksiz narsalarni o'chirish" dan tashqari, ext2,3 va 4 fayl tizimlarida "Zaxiralangan bloklar soni" kabi narsa mavjudligini yodda tutishingiz kerak. Agar siz yuqoridagi ro'yxatga qarasangiz, bizda "13094" bunday bloklar mavjud. Bu faqat ildiz foydalanuvchi tomonidan yozilishi mumkin bo'lgan bloklar. ammo agar siz muammoni tezda hal qilishingiz kerak bo'lsa, vaqtinchalik yechim sifatida siz ularni hamma uchun ochiq qilishingiz mumkin, natijada bo'sh joy bo'ladi:

root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Setting reserved blocks percentage to 0% (0 blocks)

Bular. sukut bo'yicha, sizda yozish uchun mavjud bo'lmagan disk maydonining 5% mavjud va zamonaviy disklarning hajmini hisobga olgan holda, bu yuzlab gigabayt bo'lishi mumkin.

Yana nima bo'lishi mumkin? Bundan tashqari, bepul bloklar bo'lishi mumkin, ammo boshqa tugunlar yo'q. Bu, odatda, fayl tizimingizda fayl tizimi blokining o'lchamidan kichikroq fayllar to'plami bo'lsa sodir bo'ladi. 1 ta fayl yoki katalogga 1 inode sarflanganini hisobga olsak va jami bizda (ma'lum fayl tizimi uchun) 65536 bor - vaziyat haqiqatdan ham ko'proq. Buni df buyrug'ining chiqishidan aniq ko'rish mumkin:

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 bo'limida aniq ko'rinib turganidek, fayl tizimidagi bo'sh bloklar soni va bo'sh tugunlar soni juda katta farq qiladi.

Agar inodelaringiz tugasa, men sizga hech qanday afsun aytmayman, chunki... yo'q (agar men noto'g'ri bo'lsam, menga xabar bering). Shunday qilib, kichik fayllar ko'payadigan bo'limlar uchun fayl tizimini oqilona tanlashingiz kerak. Misol uchun, btrfs inodes tugamaydi, chunki Agar kerak bo'lsa, yangilari dinamik ravishda yaratiladi.

Manba: www.habr.com

a Izoh qo'shish