Sistem fail maya di Linux: mengapa ia diperlukan dan bagaimana ia berfungsi? Bahagian 1

Hai semua! Kami terus melancarkan aliran baharu untuk kursus yang anda telah jatuh cinta dan kini kami tergesa-gesa untuk mengumumkan bahawa kami memulakan set kursus baharu "Pentadbir Linux"yang akan dilancarkan pada penghujung April. Penerbitan baharu akan bertarikh untuk acara ini. Dengan material asal pun boleh baca di sini.

Sistem fail maya berfungsi sebagai sejenis abstraksi ajaib yang membolehkan falsafah Linux mengatakan bahawa "semuanya adalah fail."

Sistem fail maya di Linux: mengapa ia diperlukan dan bagaimana ia berfungsi? Bahagian 1

Apakah sistem fail? Berdasarkan kata-kata salah seorang penyumbang dan pengarang pertama Linux Roberta Lava, "Sistem fail ialah storan hierarki data yang dipasang mengikut struktur tertentu." Walau apa pun, definisi ini sama-sama sesuai untuk VFAT (Jadual Peruntukan Fail Maya), Git dan Cassandra (pangkalan data NoSQL). Jadi apa sebenarnya yang mentakrifkan perkara sedemikian sebagai "sistem fail"?

Asas Sistem Fail

Kernel Linux mempunyai keperluan tertentu untuk entiti yang boleh dianggap sebagai sistem fail. Ia mesti melaksanakan kaedah open(), read() ΠΈ write() untuk objek berterusan yang mempunyai nama. Dari sudut pandangan berorientasikan objek pengaturcaraan, kernel mentakrifkan sistem fail generik sebagai antara muka abstrak, dan ketiga-tiga fungsi besar ini dianggap "maya" dan tidak mempunyai definisi konkrit. Sehubungan itu, pelaksanaan sistem fail lalai dipanggil sistem fail maya (VFS).

Sistem fail maya di Linux: mengapa ia diperlukan dan bagaimana ia berfungsi? Bahagian 1

Jika kita boleh membuka, membaca dan menulis kepada entiti, maka entiti itu dianggap sebagai fail, seperti yang kita boleh lihat daripada contoh dalam konsol di atas.
Fenomena VFS hanya menggariskan pemerhatian seperti Unix bahawa "semuanya adalah fail". Fikirkan betapa peliknya contoh kecil /dev/console di atas menunjukkan cara konsol sebenarnya berfungsi. Gambar menunjukkan sesi Bash interaktif. Menghantar rentetan ke konsol (peranti konsol maya) memaparkannya pada skrin maya. VFS mempunyai sifat lain, malah lebih asing. Sebagai contoh, ia membolehkan anda mencari mengikut ia.

Sistem biasa seperti ext4, NFS, dan /proc mempunyai tiga fungsi penting dalam struktur data C yang dipanggil operasi_fail. Di samping itu, sistem fail tertentu memanjangkan dan mentakrifkan semula fungsi VFS dalam cara berorientasikan objek yang biasa. Seperti yang dinyatakan oleh Robert Love, abstraksi VFS membolehkan pengguna Linux menyalin fail ke atau dari sistem pengendalian pihak ketiga atau entiti abstrak seperti paip tanpa perlu risau tentang format data dalaman mereka. Di sisi pengguna (ruang pengguna), menggunakan panggilan sistem, proses boleh menyalin dari fail ke struktur data kernel menggunakan kaedah read() satu sistem fail dan kemudian gunakan kaedah tersebut write () sistem fail lain untuk output data.

Takrifan fungsi yang tergolong dalam jenis VFS asas terdapat dalam fail fs/*.c kod sumber kernel, manakala subdirektori fs/ mengandungi sistem fail tertentu. Teras juga mengandungi entiti seperti cgroups, /dev ΠΈ tmpfs, yang diperlukan semasa proses but dan oleh itu ditakrifkan dalam subdirektori kernel init/. Perhatikan itu cgroups, /dev ΠΈ tmpfs jangan panggil fungsi "tiga besar". file_operations, tetapi terus membaca dan menulis ke ingatan.
Rajah di bawah menunjukkan cara ruang pengguna mengakses pelbagai jenis sistem fail yang biasa dipasang pada sistem Linux. Struktur tidak ditunjukkan pipes, dmesg ΠΈ POSIX clocks, yang juga melaksanakan struktur file_operations, diakses melalui lapisan VFS.

Sistem fail maya di Linux: mengapa ia diperlukan dan bagaimana ia berfungsi? Bahagian 1

VFS ialah "lapisan pembungkus" antara panggilan sistem dan pelaksanaan tertentu file_operations, seperti ext4 ΠΈ procfs. Fungsi file_operations boleh berinteraksi dengan sama ada pemacu peranti atau peranti capaian memori. tmpfs, devtmpfs ΠΈ cgroups jangan guna file_operations, tetapi akses terus ke memori.
Kewujudan VFS memberi peluang untuk menggunakan semula kod, kerana kaedah asas yang dikaitkan dengan sistem fail tidak perlu dilaksanakan semula oleh setiap jenis sistem fail. Penggunaan semula kod adalah amalan biasa di kalangan jurutera perisian! Walau bagaimanapun, jika kod boleh guna semula mengandungi kesilapan yang serius, semua pelaksanaan yang mewarisi kaedah biasa mengalaminya.

/tmp: Petua mudah

Cara mudah untuk mengesan bahawa VFS terdapat pada sistem adalah dengan menaip mount | grep -v sd | grep -v :/, yang akan menunjukkan semua yang dipasang (mounted) sistem fail yang bukan pemastautin cakera dan bukan NFS, yang benar pada kebanyakan komputer. Salah satu pelekap yang disenaraikan (mounts) VFS sudah pasti akan /tmp, betul tak?

Sistem fail maya di Linux: mengapa ia diperlukan dan bagaimana ia berfungsi? Bahagian 1

Semua orang tahu storan itu / tmp pada medium fizikal - kegilaan! Source.

Mengapa tidak diingini untuk disimpan /tmp di media fizikal? Kerana fail dalam /tmp adalah sementara dan peranti storan lebih perlahan daripada memori tempat tmpfs dicipta. Selain itu, media fizikal lebih terdedah untuk dipakai apabila ditimpa daripada ingatan. Akhir sekali, fail dalam /tmp boleh mengandungi maklumat sensitif, jadi menjadikannya hilang pada setiap but semula adalah ciri penting.

Malangnya, sesetengah skrip pemasangan pengedaran Linux mencipta /tmp pada peranti storan secara lalai. Jangan putus asa jika ini berlaku kepada sistem anda juga. Ikuti beberapa arahan mudah dengan Wiki Archuntuk membetulkannya, dan sedar bahawa memori diperuntukkan untuk tmpfs menjadi tidak tersedia untuk tujuan lain. Dalam erti kata lain, sistem dengan tmpfs gergasi dan fail besar di atasnya boleh kehabisan memori dan ranap. Petua lain: semasa mengedit fail /etc/fstab, ingat bahawa ia mesti berakhir dengan baris baharu, jika tidak sistem anda tidak akan boot.

/proc dan /sys

Selain /tmp, VFS (sistem fail maya) yang paling biasa kepada pengguna Linux ialah /proc ΠΈ /sys. (/dev berada dalam ingatan bersama dan tidak mempunyai file_operations). Kenapa dua komponen ini? Mari kita lihat isu ini.

procfs mencipta syot kilat kernel dan proses yang dipantaunya userspace. Π’ /proc kernel mencetak maklumat tentang apa yang tersedia, seperti gangguan, memori maya dan penjadual. selain itu, /proc/sys ialah tempat di mana parameter dikonfigurasikan dengan arahan sysctl, boleh didapati untuk userspace. Status dan statistik proses individu dipaparkan dalam direktori /proc/.

Sistem fail maya di Linux: mengapa ia diperlukan dan bagaimana ia berfungsi? Bahagian 1

ia adalah /proc/meminfo ialah fail kosong yang bagaimanapun mengandungi maklumat berharga.

Kelakuan /proc fail menunjukkan betapa berbezanya sistem fail cakera VFS. Di satu pihak, /proc/meminfo mengandungi maklumat yang boleh dilihat dengan arahan free. Sebaliknya, ia kosong! Bagaimanakah ia berfungsi? Keadaan itu mengingatkan artikel terkenal bertajuk Adakah bulan wujud apabila tiada sesiapa yang melihatnya? Realiti dan Teori Kuantum"ditulis oleh profesor fizik Universiti Cornell David Mermin pada tahun 1985. Hakikatnya ialah kernel mengumpul statistik memori apabila permintaan dibuat untuk /proc, dan sebenarnya dalam fail /proc tiada apa-apa apabila tiada orang yang melihat. Seperti yang dikatakan Mermin, "Doktrin kuantum asas mengatakan bahawa pengukuran secara amnya tidak mendedahkan nilai sedia ada bagi harta yang diukur." (Dan pertimbangkan soalan tentang bulan sebagai kerja rumah!)
Nampak kekosongan procfs masuk akal kerana maklumat di sana adalah dinamik. Situasi yang sedikit berbeza dengan sysfs. Mari kita bandingkan berapa banyak fail yang mempunyai saiz sekurang-kurangnya satu bait /proc dan /sys.

Sistem fail maya di Linux: mengapa ia diperlukan dan bagaimana ia berfungsi? Bahagian 1

Procfs mempunyai satu fail, iaitu konfigurasi kernel yang dieksport, yang merupakan pengecualian kerana ia hanya perlu dijana sekali setiap but. Sebaliknya, dalam /sys terdapat banyak fail yang lebih besar, kebanyakannya menggunakan seluruh halaman memori. Biasanya fail sysfs mengandungi tepat satu nombor atau baris, tidak seperti jadual maklumat yang diperoleh daripada membaca fail seperti /proc/meminfo.

Matlamat sysfs - menyediakan sifat baca/tulis apa yang dipanggil kernel Β«kobjectsΒ» dalam ruang pengguna. Satu-satunya matlamat kobjects adalah pengiraan pautan: apabila pautan terakhir ke kobjek dialih keluar, sistem akan memulihkan sumber yang berkaitan dengannya. Namun begitu, /sys membentuk kebanyakan yang terkenal "ABI yang stabil untuk ruang pengguna" teras, yang tidak boleh dilakukan oleh sesiapa pun, dalam apa jua keadaan "rehat". Ini tidak bermakna bahawa fail dalam sysfs adalah statik, yang akan menjadi tidak konsisten dengan pengiraan rujukan objek tidak stabil.
ABI stabil kernel mengehadkan apa yang boleh muncul /sys, bukan apa yang sebenarnya ada pada masa tertentu itu. Keizinan fail penyenaraian dalam sysfs memberikan pandangan tentang cara tetapan boleh dikonfigurasikan untuk peranti, modul, sistem fail, dsb. boleh dikonfigurasikan atau dibaca. Kesimpulan logiknya ialah procfs juga merupakan sebahagian daripada ABI stabil kernel, walaupun ini tidak dinyatakan secara eksplisit dalam dokumentasi.

Sistem fail maya di Linux: mengapa ia diperlukan dan bagaimana ia berfungsi? Bahagian 1

Fail masuk sysfs huraikan satu sifat tertentu untuk setiap entiti dan boleh dibaca, boleh ditulis atau kedua-duanya. "0" dalam fail bermakna SSD tidak boleh dialih keluar.

Mari mulakan bahagian kedua terjemahan dengan cara memantau VFS menggunakan alat eBPF dan bcc, dan kini kami sedang menunggu ulasan anda dan secara tradisinya menjemput anda untuk webinar terbuka, yang akan diadakan oleh guru kami pada 9 April - Vladimir Drozdetsky.

Sumber: www.habr.com

Tambah komen