Sesuatu tentang inode

Dari waktu ke waktu, dengan tujuan pindah ke sistem saraf Pusat, saya akan mewawancarai berbagai perusahaan besar, terutama St. Petersburg dan Moskow, untuk posisi DevOps. Saya perhatikan bahwa di banyak perusahaan (di banyak perusahaan bagus, misalnya Yandex) mereka mengajukan dua pertanyaan serupa:

  • apa yang inode;
  • untuk alasan apa dimungkinkan untuk mendapatkan kesalahan penulisan ke disk (atau misalnya: mengapa ruang disk dapat habis, satu esensi).

Seperti yang sering terjadi, saya yakin bahwa saya tahu topik ini dengan baik, tetapi segera setelah saya mulai menjelaskan, kesenjangan pengetahuan menjadi jelas. Untuk mensistematisasikan pengetahuan saya, mengisi kekosongan dan tidak lagi memalukan, saya menulis artikel ini, mungkin masih berguna.

Saya akan mulai "dari bawah", yaitu dari hard drive (flash drive, SSD, dan hal-hal modern lainnya, kami membuang, misalnya, mempertimbangkan drive lama 20 atau 80 gigabyte, karena ukuran bloknya adalah 512 byte).

Hard drive tidak tahu cara mengatasi ruangnya dengan byte, dengan syarat ia dibagi menjadi beberapa blok. Penomoran blok dimulai dengan 0. (ini disebut LBA, detailnya di sini: en.wikipedia.org/wiki/LBA )



Seperti yang Anda lihat dari gambar, saya menunjuk blok LBA sebagai level HDD. Omong-omong, Anda dapat melihat ukuran blok apa yang dimiliki disk Anda:

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

Level di atas menandai partisi, satu untuk seluruh disk (sekali lagi, untuk kesederhanaan). Paling sering, dua jenis markup partisi digunakan: msdos dan gpt. Dengan demikian, msdos adalah format lama yang mendukung disk hingga 2TB, gpt adalah format baru yang dapat menangani hingga 1 zettabyte blok 512 byte. Dalam kasus kami, kami memiliki bagian dari tipe msdos, seperti dapat dilihat dari gambar, bagian dalam kasus ini dimulai dengan blok No. 1, sedangkan bagian nol digunakan untuk MBR.

Pada bagian pertama, saya membuat sistem file ext2, secara default ukuran blok adalah 4096 byte, yang juga ditunjukkan 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".

Sekarang yang paling menarik adalah bagaimana membaca file / home / serp / testfile? File terdiri dari satu atau beberapa blok sistem file tempat datanya disimpan. Mengetahui nama file, bagaimana cara menemukannya? Blok apa yang harus dibaca?

Di sinilah inode berguna. Sistem file ext2fs memiliki "tabel" yang berisi informasi tentang semua inode. Jumlah inode dalam kasus ext2fs diatur saat membuat sistem file. Kami melihat angka-angka yang diperlukan dalam parameter “jumlah inode” dari output tune2fs, yaitu. kami memiliki 65536 buah. Inode berisi informasi yang kami butuhkan: daftar blok sistem file untuk file yang Anda cari. Bagaimana menemukan nomor inode untuk file yang ditentukan?

Korespondensi nama dan nomor inode terdapat dalam direktori, dan direktori di ext2fs adalah file dengan tipe khusus, mis. juga memiliki nomor inode sendiri. Untuk memutus lingkaran setan ini, nomor inode “2” “tetap” ditugaskan ke direktori root. Kami melihat isi nomor inode 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 ada di blok dengan nomor 579. Di dalamnya kita akan menemukan nomor node untuk folder home, dan seterusnya sepanjang rantai sampai kita melihat nomor node untuk file yang diminta di direktori ular. Jika tiba-tiba seseorang ingin memeriksa apakah nomornya benar, dan jika ada info yang benar di sana, itu tidak sulit. Kami lakukan:

 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 

Dalam output, Anda dapat membaca nama file di direktori.

Jadi saya sampai pada pertanyaan utama: "untuk alasan apa bisa ada kesalahan tulis"?

Tentu, ini akan terjadi jika tidak ada blok gratis di sistem file. Apa yang bisa dilakukan dalam kasus ini? Selain "hapus sesuatu yang tidak perlu" yang jelas, harus diingat bahwa dalam sistem file ext2,3 dan 4 ada yang namanya "Cadangan blok cadangan". Jika Anda melihat daftar di atas, maka kami memiliki blok "13094". Ini adalah blok yang bisa ditulis hanya untuk pengguna root. tetapi jika Anda perlu menyelesaikan masalah dengan cepat, bagaimana solusi sementara dapat tersedia untuk semua orang, menghasilkan sedikit 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) 

Yaitu secara default, Anda tidak memiliki 5% dari ruang disk yang tersedia untuk menulis, dan mengingat volume disk modern, itu bisa ratusan gigabyte.

Apa lagi yang bisa? Situasi mungkin terjadi ketika ada blok gratis, tetapi node sudah selesai. Ini biasanya terjadi jika Anda memiliki banyak file di sistem file yang lebih kecil dari ukuran blok sistem file. Menimbang bahwa 1 inode dihabiskan untuk 1 file atau direktori, dan secara total kami memilikinya (untuk sistem file ini) 65536 - situasinya lebih dari nyata. Ini dapat dilihat dengan jelas dari output dari 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 di bagian / var / www, jumlah blok gratis dalam sistem file dan jumlah node gratis sangat bervariasi.

Jika saya kehabisan inode, saya tidak akan memberi tahu Anda mantra, karena mereka tidak (jika tidak benar, beri tahu saya). Jadi untuk bagian di mana file kecil berlipat ganda, Anda harus memilih sistem file dengan benar. Jadi misalnya dalam btrfs inode tidak dapat berakhir, karena secara dinamis buat yang baru jika perlu.

Source: https://habr.com/ru/post/id462849/


All Articles