Sistem file virtual Linux: mengapa mereka diperlukan dan bagaimana cara kerjanya? Bagian 1

Halo semuanya! Kami terus meluncurkan utas baru di kursus yang sudah Anda sukai dan sedang terburu-buru untuk memberi tahu Anda bahwa kami sedang memulai set baru di kursus Administrator Linux , yang akan dimulai pada akhir April. Publikasi baru akan bertepatan dengan acara ini. Bahan aslinya dapat ditemukan di sini .

Sistem file virtual bertindak sebagai semacam abstraksi magis yang memungkinkan filosofi Linux untuk mengatakan bahwa "semuanya adalah file".



Apa itu sistem file? Berdasarkan kata-kata dari salah satu kontributor dan penulis Linux pertama, Robert Love , "Sistem file adalah gudang data hierarkis, dirakit sesuai dengan struktur tertentu." Bagaimanapun, definisi ini sama-sama cocok untuk VFAT (Tabel Alokasi File Virtual), Git, dan Cassandra ( Database NoSQL ). Jadi apa sebenarnya yang mendefinisikan konsep seperti "sistem file"?

Dasar-dasar Sistem File

Kernel Linux memiliki persyaratan khusus untuk suatu entitas yang dapat dianggap sebagai sistem file. Ini harus mengimplementasikan metode open() , read() dan write() untuk objek persisten yang memiliki nama. Dari sudut pandang pemrograman berorientasi objek , kernel mendefinisikan sistem file generik (generic filesystem) sebagai antarmuka abstrak, dan ketiga fungsi besar ini dianggap "virtual" dan tidak memiliki definisi khusus. Dengan demikian, implementasi standar sistem file disebut sistem file virtual (VFS).



Jika kita dapat membuka, membaca, dan menulis ke suatu entitas, maka entitas ini dianggap sebagai file, seperti yang kita lihat dari contoh di konsol di atas.
Fenomena VFS hanya menggarisbawahi karakteristik pengamatan sistem mirip Unix, yang menyatakan bahwa "semuanya adalah file." Pikirkan betapa anehnya bahwa contoh kecil di atas dengan / dev / console menunjukkan cara kerja konsol sebenarnya. Gambar menunjukkan sesi Bash interaktif. Mengirim string ke konsol (perangkat konsol virtual) menampilkannya di layar virtual. VFS memiliki properti lain yang bahkan lebih aneh. Misalnya, memungkinkan untuk mencari melalui mereka .

Sistem yang familier seperti ext4, NFS, dan / proc memiliki tiga fungsi penting dalam struktur data C yang disebut operasi file_ . Selain itu, sistem file tertentu memperluas dan mendefinisikan kembali fungsi VFS dengan cara yang akrab, berorientasi objek. Seperti yang dicatat oleh Robert Love, abstraksi VFS memungkinkan pengguna Linux untuk menyalin file ke atau dari sistem operasi pihak ketiga atau entitas abstrak seperti pipa, tanpa khawatir tentang format data internal mereka. Di sisi pengguna (userspace), menggunakan panggilan sistem, suatu proses dapat menyalin dari file ke struktur data kernel menggunakan metode read() dari satu sistem file, dan kemudian menggunakan metode write() dari sistem file lain untuk menghasilkan data.

Definisi fungsi yang termasuk dalam tipe VFS dasar ditemukan dalam file fs / *. C dari sumber kernel, sedangkan fs/ subdirektori berisi sistem file tertentu. Kernel juga berisi entitas, seperti cgroups , /dev dan tmpfs , yang diperlukan selama proses boot dan oleh karena itu didefinisikan dalam subdirektori init/ kernel. Perhatikan bahwa cgroups , /dev dan tmpfs tidak memanggil fungsi Tiga Besar operasi file_operations , tetapi langsung membaca dan menulis ke memori.
Diagram di bawah ini menunjukkan bagaimana userspace mengakses berbagai jenis sistem file yang biasanya dipasang pada sistem Linux. Konstruksi seperti pipes , POSIX clocks dmesg dan POSIX clocks , yang juga menerapkan struktur file_operations , akses yang melewati lapisan VFS, tidak ditampilkan.



VFS adalah "lapisan shell" antara panggilan sistem dan implementasi procfs tertentu, seperti ext4 dan procfs . Fungsi file_operations dapat berinteraksi dengan driver perangkat atau perangkat akses memori. tmpfs , devtmpfs , dan cgroups tidak menggunakan cgroups , tetapi mengakses memori secara langsung.
Keberadaan VFS menyediakan kemampuan untuk menggunakan kembali kode, karena metode dasar yang terkait dengan sistem file tidak perlu diimplementasikan kembali oleh setiap jenis sistem file. Menggunakan kembali kode adalah praktik yang diterima secara luas untuk insinyur perangkat lunak! Namun, jika kode yang dapat digunakan kembali berisi kesalahan serius , semua implementasi yang mewarisi metode umum menderita karenanya.

/ tmp: Petunjuk sederhana

Cara mudah untuk mendeteksi bahwa VFS hadir pada sistem adalah dengan memasukkan mount | grep -v sd | grep -v :/ mount | grep -v sd | grep -v :/ mount | grep -v sd | grep -v :/ , yang akan menampilkan semua sistem file yang dipasang yang tidak ada pada disk dan bukan NFS, yang berlaku pada sebagian besar komputer. Salah satu mount VFS yang tercantum di atas tidak diragukan lagi adalah /tmp , kan?



Semua orang tahu bahwa menyimpan /tmp pada media fisik itu gila! Sumber

Mengapa menyimpan /tmp di media fisik tidak diinginkan? Karena file di /tmp bersifat sementara dan perangkat penyimpanan lebih lambat daripada memori tempat tmpfs dibuat. Selain itu, media fisik lebih rentan untuk menimpa keausan daripada memori. Akhirnya, file-file di / tmp mungkin berisi informasi sensitif, sehingga hilangnya mereka dengan setiap reboot adalah fungsi yang tidak terpisahkan.

Sayangnya, beberapa skrip instalasi distribusi Linux membuat / tmp pada perangkat penyimpanan default. Jangan putus asa jika ini terjadi pada sistem Anda. Ikuti beberapa instruksi sederhana dari Arch Wiki untuk memperbaikinya, dan ingat bahwa memori yang dialokasikan untuk tmpfs menjadi tidak dapat diakses untuk keperluan lain. Dengan kata lain, sistem dengan tmpfs raksasa dan file besar di dalamnya dapat kehabisan memori dan crash. Petunjuk lain: saat mengedit file /etc/fstab , ingat bahwa itu harus diakhiri dengan baris baru, jika tidak, sistem Anda tidak akan boot.

/ proc dan / sys

Selain /tmp , VFS (sistem file virtual) yang paling dikenal pengguna Linux adalah /proc dan /sys . ( /dev terletak di memori bersama dan tidak memiliki file_operations ). Mengapa persis dua komponen ini? Mari kita bahas masalah ini.

procfs mengambil snapshot dari kernel dan proses yang procfs untuk userspace . Di /proc kernel menampilkan informasi tentang alat apa yang dimilikinya, misalnya, interupsi, memori virtual, dan penjadwal. Selain itu, /proc/sys adalah tempat di mana opsi yang dikonfigurasikan dengan perintah sysctl tersedia untuk userspace . Status dan statistik masing-masing proses ditampilkan di direktori /proc/ .



Di sini /proc/meminfo adalah file kosong yang tetap mengandung informasi berharga.

Perilaku file /proc menunjukkan bagaimana sistem file disk VFS berbeda. Di satu sisi, /proc/meminfo berisi informasi yang dapat dilihat dengan perintah free . Di sisi lain, itu kosong di sana! Bagaimana itu? Situasinya menyerupai sebuah artikel terkenal yang berjudul, "Apakah bulan ada ketika tidak ada yang melihatnya?" Teori Realitas dan Kuantum, ” ditulis oleh profesor fisika Universitas Cornell David Mermin pada tahun 1985. Faktanya adalah bahwa kernel mengumpulkan statistik memori ketika permintaan dibuat ke /proc , dan pada kenyataannya tidak ada dalam file /proc ketika tidak ada yang melihat ke sana. Seperti yang dikatakan Mermin , "Doktrin kuantum mendasar menyatakan bahwa pengukuran, sebagai suatu peraturan, tidak mengungkapkan nilai yang sudah ada sebelumnya dari properti yang diukur." (Pikirkan pertanyaan bulan sebagai pekerjaan rumah!)
Kekosongan yang tampak dari akal masuk akal, karena informasi di sana dinamis. Situasi yang sedikit berbeda dengan sysfs . Mari kita bandingkan berapa banyak file setidaknya satu byte di /proc dan /sys .



Procfs memiliki satu file, yaitu konfigurasi kernel yang diekspor, yang merupakan pengecualian karena hanya perlu dihasilkan satu kali per boot. /sys di sisi lain, mengandung lebih banyak file yang banyak, banyak di antaranya menempati seluruh halaman memori. Biasanya, file sysfs persis mengandung satu angka atau baris, tidak seperti tabel informasi yang diperoleh dengan membaca file seperti /proc/meminfo .

Tujuan dari sysfs adalah untuk menyediakan properti yang «kobjects» dibaca dan «kobjects» dari apa yang disebut kernel «kobjects» di userspace. Satu-satunya tujuan kobjects adalah untuk menghitung tautan: ketika tautan terakhir ke kobject dihapus, sistem akan mengembalikan sumber daya yang terkait dengannya. Namun, /sys membuat sebagian besar kernel "stable ABI for userspace" yang terkenal , yang tidak dapat dipecahkan oleh siapa pun, dalam keadaan apa pun. Ini tidak berarti bahwa file dalam sysfs adalah statis, yang akan bertentangan dengan penghitungan tautan ke objek yang tidak stabil.
Antarmuka aplikasi kernel yang stabil (ABI stable kernel) membatasi apa yang mungkin muncul di /sys , bukan apa yang sebenarnya ada pada saat ini. Mendaftarkan izin file di sysfs memberikan pemahaman tentang bagaimana pengaturan yang dapat dikonfigurasi untuk perangkat, modul, sistem file, dll. dapat disesuaikan atau dibaca. Kami menyimpulkan bahwa procfs juga merupakan bagian dari kernel ABI yang stabil, meskipun ini tidak secara eksplisit dinyatakan dalam dokumentasi .



File dalam sysfs menggambarkan satu properti spesifik untuk setiap entitas dan dapat dibaca, ditulis ulang, atau keduanya sekaligus. "0" dalam file menunjukkan bahwa SSD tidak dapat dihapus.

Kami memulai bagian kedua dari terjemahan dengan cara mengamati VFS menggunakan alat eBPF dan bcc, dan sekarang kami menunggu komentar Anda dan secara tradisional mengundang Anda ke webinar terbuka , yang akan diadakan oleh guru kami Vladimir Drozdetsky pada 9 April.

Bagian kedua.

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


All Articles