Ini adalah pertanyaan tingkat rendah, dan saya mengerti bahwa itu mungkin bukan tempat terbaik untuk bertanya. Tapi, sepertinya lebih tepat daripada situs SE lainnya, jadi begini.
Saya tahu bahwa pada sistem file Linux, beberapa file benar - benar ada , misalnya: /usr/bin/bash
adalah salah satu yang ada. Namun, (sejauh yang saya mengerti), beberapa juga tidak benar-benar ada seperti itu dan lebih maya file, misalnya: /dev/sda
, /proc/cpuinfo
, dll Pertanyaan saya adalah (mereka adalah dua, tapi terlalu erat kaitannya dengan menjadi pertanyaan terpisah):
- Bagaimana cara kerja kernel Linux apakah file-file ini asli (dan karena itu membacanya dari disk) atau tidak ketika perintah baca (atau semacamnya) dikeluarkan?
- Jika file tidak nyata: sebagai contoh, membaca dari
/dev/random
akan mengembalikan data acak, dan membaca dari/dev/null
akan kembaliEOF
. Bagaimana cara kerjanya data apa yang harus dibaca dari file virtual ini (dan karenanya apa yang harus dilakukan ketika / jika data ditulis ke file virtual juga) - apakah ada semacam peta dengan pointer untuk memisahkan perintah baca / tulis yang sesuai untuk setiap file, atau bahkan untuk direktori virtual itu sendiri? Jadi, entri untuk/dev/null
hanya dapat mengembalikanEOF
.
Jawaban:
Jadi pada dasarnya ada dua jenis hal di sini:
/proc
dan/sys
merupakan contoh di sini, seperti halnya filesystem khusus FUSE sepertisshfs
atauifuse
. Ada jauh lebih beragam dalam hal ini, karena sebenarnya mereka hanya merujuk pada sistem file dengan semantik yang dalam beberapa hal 'custom'. Jadi, ketika Anda membaca dari file di bawah/proc
, Anda sebenarnya tidak mengakses sepotong data tertentu yang telah disimpan oleh orang lain yang menulisnya sebelumnya, seperti di bawah sistem file normal. Anda pada dasarnya melakukan panggilan kernel, meminta beberapa informasi yang dihasilkan saat itu juga. Dan kode ini dapat melakukan apa saja yang disukainya, karena itu hanya beberapa fungsi yang mengimplementasikanread
semantik. Dengan demikian, Anda memiliki perilaku aneh file di bawah/proc
, seperti misalnya berpura-pura menjadi symlink ketika mereka tidakKuncinya adalah yang
/dev
sebenarnya, biasanya, adalah yang pertama. Itu normal dalam distribusi modern untuk memiliki/dev
sesuatu seperti tmpfs, tetapi dalam sistem yang lebih tua, itu normal untuk memilikinya menjadi direktori polos pada disk, tanpa atribut khusus. Kuncinya adalah bahwa file-file di bawahnya/dev
adalah node perangkat, sejenis file khusus yang mirip dengan FIFO atau soket Unix; simpul perangkat memiliki nomor utama dan kecil, dan membaca atau menulisnya sedang melakukan panggilan ke driver kernel, seperti membaca atau menulis FIFO memanggil kernel untuk buffer output Anda dalam pipa. Driver ini dapat melakukan apa saja yang diinginkan, tetapi biasanya menyentuh perangkat keras entah bagaimana, misalnya untuk mengakses hard disk atau memutar suara di speaker.Untuk menjawab pertanyaan awal:
Ada dua pertanyaan yang relevan dengan apakah 'file itu ada' atau tidak; ini adalah apakah file node perangkat benar-benar ada, dan apakah kode kernel yang mendukungnya bermakna. Yang pertama diselesaikan seperti apa pun pada sistem file normal. Sistem modern menggunakan
udev
atau sesuatu seperti itu untuk menonton acara perangkat keras dan secara otomatis membuat dan menghancurkan node perangkat di bawahnya/dev
. Tetapi sistem yang lebih lama, atau custom light builds, dapat memiliki semua node perangkat mereka secara harfiah pada disk, dibuat sebelumnya. Sementara itu, ketika Anda membaca file-file ini, Anda melakukan panggilan ke kode kernel yang ditentukan oleh nomor perangkat utama dan minor; jika ini tidak masuk akal (misalnya, Anda mencoba membaca perangkat blok yang tidak ada), Anda hanya akan mendapatkan beberapa jenis kesalahan I / O.Cara kerjanya apa kode kernel untuk memanggil file perangkat yang bervariasi. Untuk sistem file virtual seperti
/proc
, mereka mengimplementasikan sendiriread
danwrite
fungsinya; kernel hanya memanggil kode itu tergantung pada titik mount yang mana, dan implementasi sistem file menangani sisanya. Untuk file perangkat, ini dikirim berdasarkan nomor perangkat utama dan kecil.sumber
/dev
dalamnya masih ada, tapi saya kira mereka akan dihapus ketika sistem dinyalakan?tmpfs
akan secara dinamis membuat dan menghapusnya sesuai kebutuhan, misalnya: bootup dan shutdown?devtmpfs
, sistem/dev
file di Linux modern, mirip dengantmpfs
, tetapi memiliki beberapa perbedaan untuk didukungudev
. (Kernel melakukan beberapa pembuatan simpul otomatis sendiri sebelum menyerahkannyaudev
, untuk membuat boot tidak terlalu rumit.) Dalam semua kasus ini, node perangkat hanya hidup dalam RAM dan dibuat dan dihancurkan secara dinamis sebagaimana perangkat keras membutuhkannya. Mungkin Anda juga bisa menggunakanudev
pada-disk biasa/dev
, tapi saya belum pernah melihat ini dilakukan dan sepertinya tidak ada alasan bagus untuk itu.Berikut adalah daftar file
/dev/sda1
pada server Arch Linux saya yang hampir terbaru:Jadi entri direktori
/dev/
untuksda
memiliki nomor inode, 1294. Ini adalah file nyata pada disk.Lihatlah di mana ukuran file biasanya muncul. "8, 1" muncul sebagai gantinya. Ini adalah nomor perangkat utama dan kecil. Perhatikan juga 'b' dalam izin file.
File
/usr/include/ext2fs/ext2_fs.h
ini berisi struct (fragmen) C ini:Struct yang menunjukkan kepada kita struktur on-disk dari inode file. Banyak hal menarik dalam struct itu; lihatlah itu.
The
i_mode
unsurstruct ext2_inode
memiliki 16 bit, dan menggunakan hanya 9 untuk user / group / lainnya, membaca / menulis / mengeksekusi hak akses, dan 3 lain untuk setuid, setgid, dan lengket. Itu punya 4 bit untuk membedakan antara jenis-jenis seperti "file biasa", "tautan", "direktori", "pipa bernama", "soket keluarga Unix", dan "blok perangkat".Kernel Linux dapat mengikuti algoritma pencarian direktori yang biasa, kemudian membuat keputusan berdasarkan izin dan tanda pada
i_mode
elemen. Untuk 'b', blokir file perangkat, ia dapat menemukan nomor perangkat utama dan minor, dan secara tradisional, menggunakan nomor perangkat utama untuk mencari penunjuk ke beberapa fungsi kernel (driver perangkat) yang berhubungan dengan disk. Nomor perangkat kecil biasanya digunakan sebagai katakanlah, nomor perangkat bus SCSI, atau nomor perangkat EIDE atau semacamnya.Beberapa keputusan lain tentang cara menangani file seperti
/proc/cpuinfo
dibuat berdasarkan tipe sistem file. Jika Anda melakukan:Anda dapat melihat bahwa
/proc
memiliki jenis sistem file "proc". Membaca dari suatu file/proc
menyebabkan kernel melakukan sesuatu yang berbeda berdasarkan pada jenis sistem file, seperti halnya membuka file pada sistem file ReiserFS atau DOS akan menyebabkan kernel menggunakan fungsi yang berbeda untuk mencari file, dan mencari data dari file.sumber
4026531975 -r--r--r-- 1 root root 0 Nov 14 18:41 /proc/mdstat
yang jelas bukan "file nyata".Pada akhirnya mereka semua adalah file untuk Unix, itulah keindahan dari abstraksi.
Cara file ditangani oleh kernel, sekarang itu adalah cerita yang berbeda.
/ proc dan saat ini / dev dan / run (alias / var / run) adalah filesystem virtual dalam RAM. / proc adalah antarmuka / windows untuk variabel dan struktur kernel.
Saya sarankan membaca Kernel Linux http://tldp.org/LDP/tlk/tlk.html dan Linux Device Drivers, Edisi Ketiga https://lwn.net/Kernel/LDD3/ .
Saya juga menikmati Desain dan Implementasi Sistem Operasi FreeBSD http://www.amazon.com/Design-Implementation-FreeBSD-Operating-System/dp/0321968972/ref=sr_1_1
Lihatlah halaman yang relevan yang berkaitan dengan pertanyaan Anda.
http://www.tldp.org/LDP/tlk/dd/drivers.html
sumber
Selain jawaban @ RuiFRibeiro dan @ BruceEdiger, perbedaan yang Anda buat bukanlah perbedaan yang dibuat oleh kernel. Sebenarnya, Anda memiliki berbagai jenis file: file biasa, direktori, tautan simbolik, perangkat, soket (dan saya selalu lupa beberapa sehingga saya tidak akan mencoba membuat daftar lengkap). Anda dapat memiliki informasi tentang jenis file dengan
ls
: itu adalah karakter pertama di telepon. Sebagai contoh:Tanda 'b' di bagian paling awal menandakan bahwa file ini adalah perangkat blok. Tanda hubung, berarti file biasa, 'l' tautan simbolik dan sebagainya. Informasi ini disimpan dalam metadata file, dan dapat diakses melalui system call
stat
misalnya, sehingga kernel dapat membaca file yang berbeda dan tautan simbolik misalnya.Kemudian, Anda membuat perbedaan lain antara "file nyata" seperti
/bin/bash
dan "file virtual" seperti/proc/cpuinfo
tetapils
melaporkan keduanya sebagai file biasa sehingga perbedaannya dari jenis lain:Apa yang terjadi adalah mereka berasal dari sistem file yang berbeda.
/proc
adalah titik pemasangan sistem file pseudoprocfs
sedangkan/bin/bash
pada sistem file disk biasa. Ketika Linux membuka file (itu berbeda tergantung pada filesystem), itu mengisi struktur datafile
yang memiliki, antara lain atribut struktur beberapa fungsi pointer yang menjelaskan cara menggunakan file ini. Oleh karena itu, ia dapat mengimplementasikan perilaku berbeda untuk berbagai jenis file.Misalnya, ini adalah operasi yang diiklankan oleh
/proc/meminfo
:Jika Anda melihat definisi
meminfo_proc_open
, Anda dapat melihat bahwa fungsi ini mengisi buffer dalam memori dengan informasi yang dikembalikan oleh fungsimeminfo_proc_show
, yang tugasnya adalah mengumpulkan data tentang penggunaan memori. Informasi ini kemudian dapat dibaca secara normal. Setiap kali Anda membuka file, fungsinyameminfo_proc_open
dipanggil dan informasi tentang memori di-refresh.sumber
Semua file dalam sistem file "nyata" dalam arti bahwa mereka memungkinkan file I / O. Ketika Anda membuka file, kernel membuat deskriptor file, yang merupakan objek (dalam arti pemrograman berorientasi objek) yang bertindak seperti file. Jika Anda membaca file, deskriptor file menjalankan metode baca, yang pada gilirannya akan meminta sistem file (sysfs, ext4, nfs, dll.) Untuk data dari file. Sistem file menyajikan antarmuka yang seragam ke userspace, dan tahu apa yang harus dilakukan untuk menangani membaca dan menulis. Sistem file pada gilirannya meminta lapisan lain untuk menangani permintaan mereka. Untuk file biasa di katakan sistem file ext4, ini akan melibatkan mencari dalam struktur data sistem file (yang mungkin melibatkan membaca disk), dan akhirnya membaca dari disk (atau cache) untuk menyalin data ke buffer baca. Untuk file di say sysfs, umumnya hanya sprintf () sesuatu ke buffer. Untuk node dev blok, ia akan meminta driver disk untuk membaca beberapa blok dan menyalinnya ke buffer (nomor utama dan kecil memberi tahu sistem file yang driver untuk membuat permintaan ke).
sumber