Inode haqqında bir şey

Dövri olaraq, Mərkəzi Paylama Mərkəzinə keçmək üçün DevOps vəzifəsi üçün müxtəlif böyük şirkətlərdə, əsasən Sankt-Peterburq və Moskvada müsahibə alıram. Bir çox şirkətlərin (bir çox yaxşı şirkətlər, məsələn, Yandex) iki oxşar sual verdiyini gördüm:

  • inode nədir;
  • hansı səbəblərə görə disk yazma xətası ala bilərsiniz (və ya məsələn: niyə diskdə boş yer tükənə bilər, mahiyyət eynidir).

Tez-tez olduğu kimi, bu mövzunu yaxşı bildiyimə əmin idim, amma izah etməyə başlayan kimi biliklərdə boşluqlar göründü. Biliklərimi sistemləşdirmək, boşluqları doldurmaq və artıq özümü utandırmamaq üçün bu yazını yazıram, bəlkə başqasına faydalı olar.

Mən aşağıdan başlayacağam, yəni. sabit diskdən (flash sürücüləri, SSD-ləri və digər müasir əşyaları atacağıq; məsələn, hər hansı 20 və ya 80 giq köhnə diski nəzərdən keçirək, çünki blokun ölçüsü 512 baytdır).

Sərt disk öz boşluğunu baytla necə ünvanlayacağını bilmir, o, şərti olaraq bloklara bölünür. Blokların nömrələnməsi 0-dan başlayır. (Bu, LBA adlanır, ətraflı burada: ru.wikipedia.org/wiki/LBA)

Inode haqqında bir şey

Şəkildən göründüyü kimi, mən LBA bloklarını HDD səviyyəsi olaraq təyin etdim. Yeri gəlmişkən, diskinizin hansı blok ölçüsünə malik olduğunu belə görə bilərsiniz:

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

Yuxarıdakı səviyyə bütün disk üçün bir bölmədir (yenə sadəlik üçün). Çox vaxt iki növ bölmə işarələməsi istifadə olunur: msdos və gpt. Müvafiq olaraq, msdos 2Tb-a qədər diskləri dəstəkləyən köhnə formatdır, gpt 1 bayt blokun 512 zettabayta qədər ünvanını çatdıra bilən yeni formatdır. Bizim vəziyyətimizdə msdos tipli bölməmiz var, şəkildən göründüyü kimi bölmə 1 nömrəli blokdan başlayır, MBR üçün isə sıfırdan istifadə olunur.

Birinci bölmədə mən ext2 fayl sistemi yaratdım, onun standart blok ölçüsü 4096 baytdır ki, bu da şəkildə öz əksini tapıb. Fayl sistemi blokunun ölçüsünə belə baxa bilərsiniz:

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

Bizə lazım olan parametr "Blok ölçüsü"dür.

İndi maraqlı hissə /home/serp/testfile faylını necə oxumaq olar? Fayl məlumatların saxlandığı bir və ya bir neçə fayl sistemi blokundan ibarətdir. Fayl adını bilmək, onu necə tapmaq olar? Hansı blokları oxumalıyam?

Inodların lazımlı olduğu yer budur. ext2fs fayl sistemində bütün inodlar üçün məlumatları ehtiva edən "cədvəl" var. Ext2fs vəziyyətində inodların sayı fayl sistemi yaradılarkən təyin olunur. Tune2fs çıxışının "Inode count" parametrində tələb olunan nömrələrə baxırıq, yəni. bizdə 65536 ədəd var. İnode bizə lazım olan məlumatları ehtiva edir: axtardığımız fayl üçün fayl sistemi bloklarının siyahısı. Verilmiş fayl üçün inode nömrəsini necə tapmaq olar?

Müvafiq ad və inode nömrəsi kataloqda var və ext2fs-də bir kataloq xüsusi bir fayl növüdür, yəni. həm də öz inode nömrəsinə malikdir. Bu pis dairəni qırmaq üçün kök qovluğuna “sabit” inod nömrəsi “2” təyin edildi. 2 nömrəli inode məzmununa baxaq:

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

Gördüyünüz kimi, bizə lazım olan kataloq 579 nömrəli blokda yerləşir. Orada biz ev qovluğu üçün qovşaq nömrəsini tapacağıq və zəncirvari olaraq serp kataloqunda tələb olunan fayl üçün qovşaq nömrəsini görənə qədər. Birdən kimsə nömrənin düzgün olub-olmadığını, lazımi məlumatın olub-olmadığını yoxlamaq istəsə, çətin deyil. Biz edirik:

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

Çıxışda kataloqdakı faylların adlarını oxuya bilərsiniz.

Beləliklə, mən əsas suala gəlirəm: "yazma xətası hansı səbəblərdən baş verə bilər?"

Təbii ki, bu, fayl sistemində heç bir pulsuz blok qalmadıqda baş verəcəkdir. Bu halda nə etmək olar? Aşkar "lazımsız hər şeyi silmək" ilə yanaşı, yadda saxlamalısınız ki, ext2,3 və 4 fayl sistemlərində "Reserved block count" kimi bir şey var. Yuxarıdakı siyahıya baxsanız, "13094" belə bloklarımız var. Bunlar yalnız kök istifadəçi tərəfindən yazıla bilən bloklardır. lakin problemi tez bir zamanda həll etmək lazımdırsa, müvəqqəti həll yolu kimi onları hamı üçün əlçatan edə bilərsiniz, nəticədə bir qədər boş yer yaranır:

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

Bunlar. Varsayılan olaraq, disk sahəsinin 5% -i yazı üçün əlçatmazdır və müasir disklərin həcmini nəzərə alsaq, bu, yüzlərlə gigabayt ola bilər.

Başqa nə ola bilərdi? Pulsuz blokların olması da mümkündür, lakin artıq qovşaqlar yoxdur. Bu, adətən fayl sisteminizdə fayl sistemi blokunun ölçüsündən kiçik olan bir dəstə faylınız olduqda baş verir. Nəzərə alsaq ki, 1 inode 1 fayl və ya kataloqa sərf olunur və ümumilikdə bizdə (müəyyən bir fayl sistemi üçün) 65536 var - vəziyyət daha realdır. Bunu df əmrinin çıxışından aydın görmək olar:

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 bölməsində aydın göründüyü kimi, fayl sistemindəki pulsuz blokların sayı və pulsuz qovşaqların sayı çox dəyişir.

İnodlarınız bitərsə, sizə heç bir sehr deməyəcəyəm, çünki... heç biri yoxdur (səhv edirəmsə, mənə bildirin). Beləliklə, kiçik faylların çoxaldığı bölmələr üçün fayl sistemini ağıllı şəkildə seçməlisiniz. Məsələn, btrfs inodları bitə bilməz, çünki Lazım gələrsə, yeniləri dinamik şəkildə yaradılır.

Mənbə: www.habr.com

Добавить комментарий