Sesuatu tentang inode

Secara berkala, untuk pindah ke Central Distribution Center, saya melakukan wawancara di berbagai perusahaan besar, terutama di St. Petersburg dan Moskow, untuk posisi DevOps. Saya perhatikan bahwa banyak perusahaan (banyak perusahaan bagus, misalnya Yandex) menanyakan dua pertanyaan serupa:

  • apa itu inode;
  • untuk alasan apa Anda bisa mendapatkan kesalahan penulisan disk (atau misalnya: mengapa Anda mungkin kehabisan ruang disk, intinya sama).

Seperti yang sering terjadi, saya yakin bahwa saya mengetahui topik ini dengan baik, tetapi begitu saya mulai menjelaskannya, kesenjangan pengetahuan menjadi jelas. Untuk mensistematisasikan pengetahuan saya, mengisi kekosongan dan tidak lagi mempermalukan diri sendiri, saya menulis artikel ini, mungkin bermanfaat bagi orang lain.

Saya akan mulai dari bawah, yaitu. dari hard drive (kami akan membuang flash drive, SSD, dan perangkat modern lainnya; misalnya, pertimbangkan drive lama berukuran 20 atau 80 gigabyte, karena ukuran bloknya adalah 512 byte).

Hard drive tidak tahu bagaimana mengalamatkan ruangnya byte demi byte, hard drive secara kondisional dibagi menjadi beberapa blok. Penomoran blok dimulai dari 0. (Ini disebut LBA, detailnya di sini: ru.wikipedia.org/wiki/LBA)

Sesuatu tentang inode

Seperti dapat dilihat dari gambar, saya menetapkan blok LBA sebagai level HDD. Omong-omong, Anda dapat melihat ukuran blok disk Anda seperti ini:

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

Level di atas adalah partisi, satu untuk seluruh disk (sekali lagi untuk kesederhanaan). Paling sering, dua jenis markup partisi digunakan: msdos dan gpt. Oleh karena itu, msdos adalah format lama yang mendukung disk hingga 2Tb, gpt adalah format baru yang mampu menangani hingga 1 zettabyte dari blok 512 byte. Dalam kasus kami, kami memiliki partisi bertipe msdos, seperti terlihat dari gambar, partisi dimulai dengan blok No. 1, sedangkan nol digunakan untuk MBR.

Di partisi pertama saya membuat sistem file ext2, ukuran blok defaultnya adalah 4096 byte, yang juga tercermin pada gambar. Anda dapat melihat ukuran blok sistem file seperti ini:

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 yang kita butuhkan adalah “Ukuran blok”.

Nah yang menariknya bagaimana cara membaca file /home/serp/testfile? Sebuah file terdiri dari satu atau lebih blok sistem file tempat datanya disimpan. Mengetahui nama file, bagaimana cara menemukannya? Blok mana yang harus saya baca?

Di sinilah inode berguna. Sistem file ext2fs memiliki "tabel" yang berisi informasi untuk semua inode. Jumlah inode dalam kasus ext2fs diatur saat membuat sistem file. Kami melihat angka-angka yang diperlukan dalam parameter "Inode count" dari output tune2fs, yaitu. kami memiliki 65536 buah. Inode berisi informasi yang kita perlukan: daftar blok sistem file untuk file yang kita cari. Bagaimana cara menemukan nomor inode untuk file tertentu?

Nama dan nomor inode yang sesuai terdapat dalam direktori, dan direktori di ext2fs adalah jenis file khusus, yaitu. juga memiliki nomor inode sendiri. Untuk memutus lingkaran setan ini, nomor inode “tetap” “2” ditugaskan ke direktori root. Mari kita lihat isi inode nomor 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

Seperti yang Anda lihat, direktori yang kita butuhkan terdapat di blok nomor 579. Di dalamnya kita akan menemukan nomor node untuk folder home, dan seterusnya hingga di direktori serp kita melihat nomor node untuk file yang diminta. Jika tiba-tiba ada yang ingin mengecek apakah nomor tersebut benar dan apakah informasi yang diperlukan ada, tidaklah sulit. Kami melakukan:

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

Di output Anda dapat membaca nama file di direktori.

Jadi saya sampai pada pertanyaan utama: “untuk alasan apa kesalahan perekaman bisa terjadi?”

Secara alami, ini akan terjadi jika tidak ada blok bebas yang tersisa di sistem file. Apa yang bisa dilakukan dalam kasus ini? Selain "hapus apa pun yang tidak perlu" yang sudah jelas, Anda harus ingat bahwa dalam sistem file ext2,3 dan 4 ada yang namanya "Jumlah blok yang dicadangkan". Jika Anda melihat daftar di atas, kami memiliki “13094” blok seperti itu. Ini adalah blok yang hanya dapat ditulis oleh pengguna root. namun jika Anda perlu menyelesaikan masalah dengan cepat, sebagai solusi sementara Anda dapat menyediakannya untuk semua orang, sehingga menghasilkan beberapa 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)

Itu. secara default, Anda memiliki 5% ruang disk yang tidak tersedia untuk menulis, dan mengingat volume disk modern, jumlahnya bisa mencapai ratusan gigabyte.

Apa lagi yang bisa terjadi? Mungkin juga ada blok bebas, tetapi tidak ada lagi node. Ini biasanya terjadi jika Anda memiliki banyak file di sistem file Anda yang lebih kecil dari ukuran blok sistem file. Mengingat 1 inode dihabiskan untuk 1 file atau direktori, dan total yang kita miliki (untuk sistem file tertentu) 65536 - situasinya lebih dari realistis. Hal ini terlihat jelas dari 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

Seperti yang terlihat jelas pada partisi /var/www, jumlah blok bebas dalam sistem file dan jumlah node bebas sangat bervariasi.

Jika Anda kehabisan inode, saya tidak akan memberi tahu Anda mantra apa pun, karena... tidak ada (jika saya salah, beri tahu saya). Jadi untuk partisi yang memperbanyak file-file kecil, sebaiknya pilih sistem file dengan bijak. Misalnya, inode btrfs tidak dapat diakhiri, karena Yang baru dibuat secara dinamis jika perlu.

Sumber: www.habr.com

Tambah komentar