Soko babagan inode

Secara periodik, kanggo pindhah menyang Pusat Distribusi Pusat, aku wawancara ing macem-macem perusahaan gedhe, utamane ing St. Petersburg lan Moskow, kanggo posisi DevOps. Aku weruh manawa akeh perusahaan (akeh perusahaan apik, contone Yandex) takon rong pitakonan sing padha:

  • apa inode;
  • apa alasan sampeyan bisa njaluk kesalahan nulis disk (utawa contone: apa sampeyan bisa mbukak metu saka papan disk, intine padha).

Kaya sing asring kedadeyan, aku yakin manawa aku ngerti topik iki kanthi apik, nanging nalika aku wiwit nerangake, kesenjangan ing kawruh dadi katon. Kanggo sistematis kawruh, ngisi celah-celah lan ora nggawe isin maneh, aku nulis artikel iki, mbok menawa bisa migunani kanggo wong liya.

Aku bakal miwiti saka ngisor, i.e. saka hard drive (kita bakal discard flash drive, SSDs lan liyane modern, contone,, ayo nimbang sembarang 20 utawa 80 gig drive lawas, wiwit ukuran pemblokiran ana 512 bait).

Hard drive ora ngerti carane ngatasi byte spasi kanthi byte; iki dipΓ©rang dadi blok. Nomer blok diwiwiti saka 0. (Iki diarani LBA, rincian ing kene: ru.wikipedia.org/wiki/LBA)

Soko babagan inode

Kaya sing bisa dideleng saka gambar kasebut, aku nemtokake blok LBA minangka level HDD. Miturut cara, sampeyan bisa ndeleng ukuran blok apa disk sampeyan kaya iki:

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

Tingkat ing ndhuwur minangka partisi, siji kanggo kabeh disk (maneh kanggo kesederhanaan). Paling asring, rong jinis markup partisi digunakake: msdos lan gpt. Mulane, msdos minangka format lawas sing ndhukung disk nganti 2Tb, gpt minangka format anyar sing bisa ngatasi nganti 1 zettabyte saka blok 512 byte. Ing kasus kita, kita duwe partisi jinis msdos, kaya sing bisa dideleng saka gambar kasebut, partisi kasebut diwiwiti kanthi blok No.. 1, nalika nol digunakake kanggo MBR.

Ing partisi pisanan aku nggawe sistem file ext2, ukuran blok standar yaiku 4096 bait, sing uga dibayangke ing gambar kasebut. Sampeyan bisa ndeleng ukuran blok sistem file kaya iki:

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

Parameter sing kita butuhake yaiku "Ukuran blok".

Saiki sing menarik yaiku carane maca file /home/serp/testfile? File kasusun saka siji utawa luwih blok sistem file ing ngendi data kasebut disimpen. Ngerti jeneng file, carane nemokake? pamblokiran kang aku kudu maca?

Iki ngendi inodes teka ing Handy. Sistem file ext2fs nduweni "tabel" sing ngemot informasi kanggo kabeh inode. Jumlah inode ing kasus ext2fs disetel nalika nggawe sistem file. We katon ing nomer dibutuhake ing parameter "Inode count" saka output tune2fs, i.e. kita duwe 65536 bΓͺsik. Inode ngemot informasi sing dibutuhake: dhaptar blok sistem file kanggo file sing kita goleki. Kepiye carane nemokake nomer inode kanggo file sing diwenehake?

Jeneng lan nomer inode sing cocog ana ing direktori kasebut, lan direktori ing ext2fs minangka jinis file khusus, yaiku. uga duwe nomer inode dhewe. Kanggo ngilangi bunder ganas iki, nomer inode "tetep" "2" ditugasake menyang direktori root. Ayo ndeleng isi inode nomer 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

Kaya sing sampeyan ngerteni, direktori sing dibutuhake ana ing nomer blok 579. Ing kono kita bakal nemokake nomer simpul kanggo folder ngarep, lan sateruse mudhun rantai nganti ing direktori serp ndeleng nomer simpul kanggo file sing dijaluk. Yen dumadakan ana sing pengin mriksa apa nomer kasebut bener lan apa informasi sing dibutuhake ana, ora angel. Kita nindakake:

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

Ing output sampeyan bisa maca jeneng file ing direktori.

Dadi, aku teka menyang pitakonan utama: "Apa sebabe kesalahan rekaman bisa kedadeyan?"

Alami, iki bakal kedadeyan yen ora ana blok gratis sing isih ana ing sistem file. Apa sing bisa ditindakake ing kasus iki? Kejabi sing jelas "mbusak apa wae sing ora perlu", sampeyan kudu ngelingi yen ing sistem file ext2,3 lan 4 ana sing kaya "Cacah pemblokiran sing dilindhungi". Yen sampeyan ndeleng dhaptar ing ndhuwur, kita duwe "13094" blok kasebut. Iki minangka blok sing bisa ditulis mung dening pangguna root. nanging yen sampeyan kudu ngrampungake masalah kasebut kanthi cepet, minangka solusi sauntara, sampeyan bisa nggawe kasedhiya kanggo kabeh wong, nyebabake sawetara ruang kosong:

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

Sing. minangka standar, sampeyan duwe 5% saka papan disk ora kasedhiya kanggo nulis, lan diwenehi volume disk modern, iki bisa atusan gigabyte.

Apa maneh bisa dadi? Sampeyan uga bisa uga ana blok gratis, nanging ora ana simpul maneh. Iki biasane kedadeyan yen sampeyan duwe akeh file ing sistem file sing luwih cilik tinimbang ukuran blok sistem file. Ngelingi yen 1 inode digunakake ing 1 file utawa direktori, lan total kita duwe (kanggo sistem file sing diwenehake) 65536 - kahanan kasebut luwih realistis. Iki bisa dideleng kanthi jelas saka output perintah 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

Kaya sing katon kanthi jelas ing partisi / var / www, jumlah blok gratis ing sistem file lan jumlah simpul gratis beda-beda.

Yen sampeyan kehabisan inode, aku ora bakal ngandhani mantra, amarga ... ora ana (yen aku salah, kabari aku). Dadi kanggo partisi sing file cilik multiply, sampeyan kudu milih sistem file wisely. Contone, btrfs inodes ora bisa mungkasi, amarga Sing anyar digawe kanthi dinamis yen perlu.

Source: www.habr.com

Add a comment