Segala Sesuatu yang Ingin Anda Ketahui Tentang inode di Linux

Sistem file Linux mengandalkan inode. Bagian penting dari cara kerja sistem file ini sering disalahpahami. Mari kita lihat dengan tepat apa itu, dan apa yang mereka lakukan.

Elemen Sistem File

Menurut definisi, sistem file perlu menyimpan file, dan file tersebut juga berisi direktori. File disimpan di dalam direktori, dan direktori ini dapat memiliki subdirektori. Sesuatu, di suatu tempat, harus merekam di mana semua file berada dalam sistem file, apa namanya, akun mana yang mereka miliki, izin mana yang mereka miliki, dan banyak lagi. Informasi ini disebut metadata karena datanya yang mendeskripsikan data lain.

Dalam sistem file ext4 Linux, struktur inode dan direktori bekerja sama untuk menyediakan kerangka kerja pendukung yang menyimpan semua metadata untuk setiap file dan direktori. Mereka membuat metadata yang tersedia untuk siapa saja yang membutuhkan itu, apakah itu kernel, aplikasi pengguna, atau utilitas Linux, seperti ls, stat, dan df.

Inode dan Ukuran Sistem File

Meskipun benar ada sepasang struktur, sistem file membutuhkan lebih dari itu. Ada ribuan dan ribuan dari setiap struktur. Setiap file dan direktori memerlukan inode, dan karena setiap file ada di dalam direktori, setiap file juga memerlukan struktur direktori. Struktur direktori juga disebut entri direktori, atau "dentries".

Setiap inode memiliki nomor inode, yang unik dalam sistem file. Nomor inode yang sama mungkin muncul di lebih dari satu sistem file. Namun, ID sistem file dan nomor inode digabungkan untuk membuat pengenal unik, terlepas dari berapa banyak sistem file yang dipasang di sistem Linux Anda.

Ingat, di Linux, Anda tidak memasang hard drive atau partisi. Anda memasang sistem file yang ada di partisi, sehingga mudah untuk memiliki banyak sistem file tanpa menyadarinya. Jika Anda memiliki beberapa hard drive atau partisi pada satu drive, Anda memiliki lebih dari satu sistem file. Mereka mungkin jenis yang sama — semua ext4, misalnya — tetapi mereka masih akan menjadi sistem file yang berbeda.

Semua inode disimpan dalam satu tabel. Dengan menggunakan nomor inode, sistem file dengan mudah menghitung offset ke dalam tabel inode di mana inode tersebut berada. Anda dapat melihat mengapa "i" dalam inode adalah singkatan dari index.

Variabel yang berisi nomor inode dideklarasikan dalam kode sumber sebagai integer panjang 32-bit yang tidak bertanda tangan. Ini berarti bilangan inode adalah nilai integer dengan ukuran maksimum 2 ^ 32, yang dihitung menjadi 4.294.967.295 — lebih dari 4 miliar inode.

Itu maksimum teoritis. Dalam praktiknya, jumlah inode dalam sistem file ext4 ditentukan ketika sistem file dibuat dengan rasio default satu inode per 16 KB kapasitas sistem file. Struktur direktori dibuat dengan cepat saat sistem file digunakan, karena file dan direktori dibuat di dalam sistem file.

Ada perintah yang dapat Anda gunakan untuk melihat berapa banyak inode yang ada dalam sistem file di komputer Anda. Opsi -i(inode) dari dfperintah memerintahkannya untuk menampilkan outputnya dalam jumlah inode.

Kami akan melihat sistem file di partisi pertama di hard drive pertama, jadi kami mengetik yang berikut:

df -i / dev / sda1

Outputnya memberi kita:

  • Sistem file : Sistem file yang dilaporkan.
  • Inode : Jumlah total inode dalam sistem file ini.
  • IUsed : Jumlah inode yang digunakan.
  • IFree : Jumlah inode tersisa yang tersedia untuk digunakan.
  • IUse% : Persentase inode yang digunakan.
  • Dipasang di : Titik pemasangan untuk sistem file ini.

Kami telah menggunakan 10 persen dari inode dalam sistem file ini. File disimpan di hard drive di blok disk. Setiap inode menunjuk ke blok disk yang menyimpan konten file yang mereka wakili. Jika Anda memiliki jutaan file kecil, Anda dapat kehabisan inode sebelum Anda kehabisan ruang hard drive. Namun, itu adalah masalah yang sangat sulit untuk dihadapi.

Di masa lalu, beberapa server email yang menyimpan pesan email sebagai file terpisah (yang dengan cepat mengarah ke kumpulan besar file kecil) mengalami masalah ini. Ketika aplikasi tersebut mengubah ujung belakangnya menjadi database, ini menyelesaikan masalah. Sistem rumah rata-rata tidak akan kehabisan inode, yang sama baiknya karena, dengan sistem file ext4, Anda tidak dapat menambahkan lebih banyak inode tanpa menginstal ulang sistem file.

Untuk melihat ukuran blok disk pada sistem file Anda, Anda dapat menggunakan blockdevperintah dengan opsi --getbsz(dapatkan ukuran blok):

sudo blockdev --getbsz / dev / sda

Ukuran blok adalah 4096 byte.

Mari gunakan opsi -B(ukuran blok) untuk menentukan ukuran blok 4096 byte dan periksa penggunaan disk biasa:

df -B 4096 / dev / sda1

Output ini menunjukkan kepada kita:

  • Sistem file : Sistem file yang kami laporkan.
  • 4K-blok : Jumlah total 4 KB blok dalam sistem file ini.
  • Digunakan : Berapa banyak blok 4K yang digunakan.
  • Tersedia : Jumlah sisa 4 KB blok yang tersedia untuk digunakan.
  • Gunakan% : Persentase blok 4 KB yang telah digunakan.
  • Dipasang di : Titik pemasangan untuk sistem file ini.

Dalam contoh kami, penyimpanan file (dan penyimpanan inode dan struktur direktori) telah menggunakan 28 persen ruang pada sistem file ini, dengan biaya 10 persen dari inode, jadi kami dalam kondisi yang baik.

Metadata Inode

Untuk melihat nomor inode suatu file, kita dapat menggunakan lsopsi -i(inode):

ls -i geek.txt

Nomor inode untuk file ini adalah 1441801, jadi inode ini menyimpan metadata untuk file ini dan, secara tradisional, penunjuk ke blok disk tempat file tersebut berada di hard drive. Jika file terfragmentasi, sangat besar, atau keduanya, beberapa blok yang ditunjuk inode mungkin menyimpan petunjuk lebih lanjut ke blok disk lain. Dan beberapa dari blok disk lainnya mungkin juga menyimpan penunjuk ke kumpulan blok disk lainnya. Ini mengatasi masalah inode menjadi ukuran tetap dan mampu menahan sejumlah pointer ke blok disk.

Metode itu digantikan oleh skema baru yang menggunakan "luasan". Ini merekam blok awal dan akhir dari setiap set blok berdekatan yang digunakan untuk menyimpan file. Jika file tidak terfragmentasi, Anda hanya perlu menyimpan blok pertama dan panjang file. Jika file terfragmentasi, Anda harus menyimpan blok pertama dan terakhir dari setiap bagian file. Cara ini (jelas) lebih efisien.

Jika Anda ingin melihat apakah sistem file Anda menggunakan penunjuk atau luasan blok disk, Anda dapat melihat ke dalam inode. Untuk melakukannya, kita akan menggunakan debugfsperintah dengan opsi -R(request), dan meneruskannya ke inode file yang diinginkan. Ini meminta  debugfs untuk menggunakan perintah "stat" internalnya untuk menampilkan konten inode. Karena nomor inode hanya unik di dalam sistem file, kita juga harus memberi tahu debugfs sistem file tempat inode berada.

Seperti inilah contoh perintah ini:

sudo debugfs -R "stat" / dev / sda1

Seperti yang ditunjukkan di bawah ini, debugfsperintah mengekstrak informasi dari inode dan menyajikannya kepada kami di less:

Kami menunjukkan informasi berikut:

  • Inode : Jumlah inode yang kita lihat.
  • Jenis : Ini adalah file biasa, bukan direktori atau tautan simbolik.
  • Mode : Izin file dalam oktal.
  • Bendera : Indikator yang mewakili fitur atau fungsionalitas berbeda. 0x80000 adalah flag "luasan" (lebih lanjut tentang ini di bawah).
  • Generasi : Sistem File Jaringan (NFS) menggunakan ini ketika seseorang mengakses sistem file jarak jauh melalui koneksi jaringan seolah-olah mereka dipasang pada mesin lokal. Nomor inode dan generasi digunakan sebagai bentuk pegangan file.
  • Versi : Versi inode.
  • Pengguna : Pemilik file.
  • Grup : Pemilik grup file.
  • Proyek : Harus selalu nol.
  • Ukuran : Ukuran file.
  • File ACL : Daftar kontrol akses file. Ini dirancang untuk memungkinkan Anda memberikan akses terkontrol kepada orang-orang yang tidak berada dalam grup pemilik.
  • Tautan : Jumlah tautan keras ke file.
  • Blockcount : Jumlah ruang hard drive yang dialokasikan untuk file ini, diberikan dalam potongan 512-byte. File kami telah dialokasikan delapan di antaranya, yaitu 4.096 byte. Jadi, file 98-byte kami berada dalam satu blok disk 4.096-byte.
  • Fragmen : File ini tidak terfragmentasi. (Ini adalah bendera usang.)
  • Ctime : Waktu saat file dibuat.
  • Atime : Waktu terakhir kali file ini diakses.
  • Mtime : Waktu saat file ini terakhir diubah.
  • Crtime : Waktu saat file dibuat.
  • Ukuran bidang inode tambahan : Sistem file ext4 memperkenalkan kemampuan untuk mengalokasikan inode dalam disk yang lebih besar pada waktu format. Nilai ini adalah jumlah byte tambahan yang digunakan inode. Ruang ekstra ini juga dapat digunakan untuk mengakomodasi kebutuhan kernel baru di masa mendatang atau untuk menyimpan atribut tambahan.
  • Inode checksum : Sebuah checksum untuk inode ini, yang memungkinkan untuk mendeteksi jika inode rusak.
  • Extents : Jika extents digunakan (pada ext4, secara default), metadata mengenai penggunaan blok disk file memiliki dua angka yang menunjukkan blok awal dan akhir dari setiap bagian file yang terfragmentasi. Ini lebih efisien daripada menyimpan setiap blok disk yang digunakan oleh setiap bagian file. Kami memiliki satu tingkat karena file kecil kami berada dalam satu blok disk pada offset blok ini.

Dimana Nama File?

Kami sekarang memiliki banyak informasi tentang file tersebut, tetapi, seperti yang mungkin Anda ketahui, kami tidak mendapatkan nama file tersebut. Di sinilah struktur direktori berperan. Di Linux, seperti file, direktori memiliki inode. Alih-alih menunjuk ke blok disk yang berisi data file, inode direktori menunjuk ke blok disk yang berisi struktur direktori.

Dibandingkan dengan inode, struktur direktori berisi informasi dalam jumlah terbatas tentang file. Ini hanya menyimpan nomor inode file, nama, dan panjang nama.

Inode dan struktur direktori berisi semua yang Anda (atau aplikasi) perlu ketahui tentang file atau direktori. Struktur direktori ada dalam blok disk direktori, jadi kita tahu direktori tempat file itu berada. Struktur direktori memberi kita nama file dan nomor inode. Inode memberi tahu kita semua hal lain tentang file tersebut, termasuk stempel waktu, izin, dan di mana menemukan data file di sistem file.

Direktori Inode

Anda dapat melihat nomor inode sebuah direktori semudah Anda melihatnya untuk file.

Dalam contoh berikut, kita akan menggunakan ls dengan opsi -l(format panjang), -i(inode), dan -d(direktori), dan melihat workdirektori:

ls -lid pekerjaan /

Karena kami menggunakan opsi -d(direktori),  lsmelaporkan direktori itu sendiri, bukan isinya. Inode untuk direktori ini adalah 1443016.

Untuk mengulanginya untuk homedirektori, kami mengetik yang berikut ini:

ls -lid ~

Inode untuk homedirektori tersebut adalah 1447510, dan workdirektorinya ada di direktori home. Sekarang, mari kita lihat isi dari workdirektori tersebut. Alih-alih opsi  -d(direktori), kami akan menggunakan opsi -a(semua). Ini akan menunjukkan kepada kita entri direktori yang biasanya tersembunyi.

Kami mengetik berikut ini:

ls -lia work /

Karena kami menggunakan opsi -a(semua), entri titik tunggal (.) Dan titik ganda (..) ditampilkan. Entri ini mewakili direktori itu sendiri (titik tunggal), dan direktori induknya (titik ganda.)

Jika Anda melihat nomor inode untuk entri titik tunggal, Anda mengetahui bahwa nomor inode itu1443016 — nomor inode yang sama yang kami dapatkan ketika kami menemukan nomor inode untuk workdirektori. Selain itu, nomor inode untuk entri titik ganda sama dengan nomor inode untuk homedirektori.

Itulah mengapa Anda dapat menggunakan cd ..perintah untuk naik level di pohon direktori. Demikian juga, saat Anda mendahului aplikasi atau nama skrip dengan   ./, Anda memberi tahu shell dari mana harus meluncurkan aplikasi atau skrip.

Inode dan Tautan

Seperti yang telah kita bahas, tiga komponen diperlukan untuk memiliki file yang terbentuk dengan baik dan dapat diakses di sistem file: file, struktur direktori, dan inode. File adalah data yang disimpan di hard drive, struktur direktori berisi nama file dan nomor inode, dan inode berisi semua metadata untuk file tersebut.

Tautan simbolik adalah entri sistem file yang terlihat seperti file, tetapi sebenarnya merupakan pintasan yang mengarah ke file atau direktori yang ada. Mari kita lihat bagaimana mereka mengaturnya, dan bagaimana tiga elemen digunakan untuk mencapai ini.

Katakanlah kita memiliki direktori dengan dua file di dalamnya: satu adalah skrip, dan yang lainnya adalah aplikasi, seperti yang ditunjukkan di bawah ini.

Kita dapat menggunakan perintah ln dan opsi -s(simbolik) untuk membuat tautan lunak ke file skrip, seperti:

ls -s my_script geek.sh

Kami telah membuat tautan untuk my_script.shmenelepon geek.sh. Kita dapat mengetik berikut ini dan menggunakan  ls untuk melihat dua file skrip:

ls -li * .sh

Entri untuk geek.sh muncul dengan warna biru. Karakter pertama dari tanda perizinan adalah “l” untuk tautan, dan  ->menunjuk ke my_script.sh. Semua ini menunjukkan bahwa itu geek.shadalah tautan.

Seperti yang mungkin Anda duga, kedua file skrip tersebut memiliki nomor inode yang berbeda. Yang mungkin lebih mengejutkan, adalah tautan lunak geek.sh,, tidak memiliki izin pengguna yang sama dengan file skrip asli. Faktanya, izin untuk  geek.shjauh lebih liberal — semua pengguna memiliki izin penuh.

Struktur direktori geek.shberisi nama tautan dan inode-nya. Saat Anda mencoba menggunakan tautan, inode-nya direferensikan, seperti file biasa. Tautan inode akan mengarah ke blok disk, tetapi bukannya berisi data konten file, blok disk berisi nama file asli. Sistem file mengarahkan ke file asli.

Kami akan menghapus file asli, dan melihat apa yang terjadi saat kami mengetik berikut ini untuk melihat konten  geek.sh:

rm my_script.sh
kucing geek.sh

Tautan simbolis rusak, dan pengalihan gagal.

Kami sekarang mengetik yang berikut ini untuk membuat tautan keras ke file aplikasi:

Dalam aplikasi khusus geek-app

Untuk melihat inode untuk kedua file ini, kami mengetik berikut ini:

ls -li

Keduanya terlihat seperti file biasa. Tidak ada tentang yang geek-appmenunjukkan itu adalah tautan dengan cara lsdaftar untuk geek.shmelakukannya. Plus,  geek-app memiliki izin pengguna yang sama dengan file aslinya. Namun, yang mungkin mengejutkan adalah kedua aplikasi tersebut memiliki nomor inode yang sama: 1441797.

Entri direktori untuk geek-appberisi nama "geek-app" dan nomor inode, tetapi sama dengan nomor inode dari file asli. Jadi, kami memiliki dua entri sistem file dengan nama berbeda yang keduanya mengarah ke inode yang sama. Faktanya, sejumlah item dapat menunjuk ke inode yang sama.

Kami akan mengetik yang berikut ini dan menggunakan statprogram untuk melihat file target:

stat aplikasi khusus

Kami melihat bahwa dua tautan keras mengarah ke file ini. Ini disimpan di inode.

Pada contoh berikut, kami menghapus file asli dan mencoba menggunakan tautan dengan kata sandi rahasia dan aman:

rm aplikasi khusus
./geek-app correcthorsebatterystaple

Anehnya, aplikasinya berjalan seperti yang diharapkan, tapi bagaimana caranya? Ini berfungsi karena, ketika Anda menghapus file, inode bebas untuk digunakan kembali. Struktur direktori ditandai dengan nomor inode nol, dan blok disk kemudian tersedia untuk file lain untuk disimpan di ruang itu.

Namun, jika jumlah tautan keras ke inode lebih besar dari satu, jumlah tautan keras dikurangi satu, dan jumlah inode dari struktur direktori dari file yang dihapus disetel ke nol. Isi file pada hard drive dan inode masih tersedia untuk hard link yang ada.

Kami akan mengetik berikut ini dan menggunakan stat sekali lagi — kali ini pada geek-app:

stat geek-app

Rincian ini ditarik dari inode yang sama (1441797) seperti statperintah sebelumnya . Jumlah tautan dikurangi satu.

Karena kita hanya memiliki satu tautan keras ke inode ini, jika kita menghapus  geek-app, itu benar-benar akan menghapus file. Sistem file akan membebaskan inode dan menandai struktur direktori dengan inode nol. File baru kemudian dapat menimpa penyimpanan data di hard drive.

TERKAIT: Cara Menggunakan Perintah stat di Linux

Overhead Inode

ini adalah sistem yang rapi, tetapi ada biaya tambahan. Untuk membaca file, sistem file harus melakukan semua hal berikut:

  • Temukan struktur direktori yang tepat
  • Baca nomor inode
  • Temukan inode yang tepat
  • Baca informasi inode
  • Ikuti baik tautan inode atau luasan ke blok disk yang relevan
  • Baca data file

Sedikit melompat-lompat diperlukan jika datanya tidak bersebelahan.

Bayangkan pekerjaan yang harus dilakukan untuk  ls melakukan daftar file format panjang dari banyak file. Ada banyak bolak-balik hanya untuk lsmendapatkan informasi yang dibutuhkan untuk menghasilkan keluarannya.

Tentu saja, mempercepat akses sistem file adalah alasan Linux mencoba melakukan cache file preemptive sebanyak mungkin. Ini sangat membantu, tetapi terkadang — seperti pada sistem file mana pun — biaya tambahan dapat terlihat.

Sekarang Anda akan tahu mengapa.