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
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
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:/
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:/
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
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.