Ini sebenarnya cukup sederhana, setidaknya jika Anda tidak memerlukan detail implementasi.
Pertama, di Linux semua sistem file (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) diimplementasikan dalam kernel. Beberapa mungkin membongkar pekerjaan ke kode tanah pengguna melalui FUSE, dan beberapa datang hanya dalam bentuk modul kernel ( ZFS asli adalah contoh penting dari yang terakhir karena pembatasan lisensi), tetapi bagaimanapun juga tetap ada komponen kernel. Ini adalah dasar yang penting.
Ketika sebuah program ingin membaca dari sebuah file, maka akan mengeluarkan berbagai panggilan sistem perpustakaan yang akhirnya berakhir di kernel dalam bentuk open()
, read()
, close()
urutan (mungkin dengan seek()
dilemparkan untuk mengukur baik). Kernel mengambil path dan nama file yang disediakan, dan melalui sistem file dan perangkat I / O layer menerjemahkannya ke permintaan baca fisik (dan dalam banyak kasus juga menulis permintaan - pikirkan misalnya pembaruan atime) ke beberapa penyimpanan yang mendasarinya.
Namun, itu tidak harus menerjemahkan permintaan tersebut secara khusus ke penyimpanan fisik yang persisten . Kontrak kernel adalah bahwa mengeluarkan seperangkat panggilan sistem tertentu akan menyediakan konten file yang dimaksud . Di mana tepatnya di ranah fisik kita "file" ada adalah sekunder untuk ini.
Aktif /proc
biasanya dipasang apa yang dikenal sebagai procfs
. Itu adalah jenis sistem file khusus, tetapi karena ini adalah sistem file, itu benar-benar tidak berbeda dari misalnya ext3
sistem file yang dipasang di suatu tempat. Jadi permintaan diteruskan ke kode driver sistem file procfs, yang mengetahui semua file dan direktori ini dan mengembalikan potongan informasi tertentu dari struktur data kernel .
"Lapisan penyimpanan" dalam hal ini adalah struktur data kernel, dan procfs
menyediakan antarmuka yang bersih dan nyaman untuk mengaksesnya. Perlu diingat bahwa pemasangan proc di /proc
hanyalah konvensi; Anda bisa dengan mudah memasangnya di tempat lain. Bahkan, itu kadang-kadang dilakukan, misalnya di chroot jail ketika proses yang berjalan di sana membutuhkan akses ke / proc untuk beberapa alasan.
Ini bekerja dengan cara yang sama jika Anda menulis nilai ke beberapa file; di tingkat kernel, yang diterjemahkan menjadi serangkaian open()
, seek()
, write()
, close()
panggilan yang lagi bisa diteruskan ke driver sistem file; sekali lagi, dalam kasus khusus ini, kode procfs.
Alasan khusus mengapa Anda melihat file
kembali empty
adalah bahwa banyak file yang terpapar oleh procfs terpapar dengan ukuran 0 byte. Ukuran 0 byte kemungkinan merupakan optimasi pada sisi kernel (banyak file di / proc bersifat dinamis dan dapat dengan mudah bervariasi panjangnya, mungkin bahkan dari satu baca ke yang berikutnya, dan menghitung panjang setiap file pada setiap direktori yang dibaca akan berpotensi menjadi sangat mahal). Pergi dengan komentar untuk jawaban ini, yang dapat Anda verifikasi pada sistem Anda sendiri dengan menjalankan melalui strace atau alat serupa, file
pertama-tama mengeluarkan stat()
panggilan untuk mendeteksi file khusus, dan kemudian mengambil kesempatan untuk, jika ukuran file dilaporkan sebagai 0 , batalkan, dan laporkan file tersebut sebagai kosong.
Perilaku ini sebenarnya didokumentasikan dan dapat diganti dengan menentukan -s
atau --special-files
pada file
pemanggilan, meskipun sebagaimana dinyatakan dalam halaman buku panduan yang mungkin memiliki efek samping. Kutipan di bawah ini berasal dari halaman manual file BSD 5.11, tertanggal 17 Oktober 2011.
Biasanya, file hanya mencoba untuk membaca dan menentukan jenis file argumen yang laporan stat (2) adalah file biasa. Ini mencegah masalah, karena membaca file khusus mungkin memiliki konsekuensi aneh. Menentukan -s
opsi menyebabkan file juga membaca file argumen yang merupakan file khusus blok atau karakter. Ini berguna untuk menentukan tipe sistem file dari data di partisi disk mentah, yang memblokir file-file khusus. Opsi ini juga menyebabkan file mengabaikan ukuran file seperti yang dilaporkan oleh stat (2) karena pada beberapa sistem ia melaporkan ukuran nol untuk partisi disk mentah.
strace file /proc/version
ataultrace -S /proc/version
, pengoptimalannya agak kecil. Itu melakukanstat()
panggilan pertama dan menemukan bahwa ukurannya adalah 0, sehingga melewatkanopen()
- tetapi sebelum itu memuat beberapa file ajaib.file
. Dengan cara ini, file pramuat file ajaib, kemudian proses parameter baris perintah dengan parameter; bukannya memindahkan loading file sihir ke dalam "melakukan hal ini sebelum mencoba untuk menentukan jenis file ini satu tertentu adalah" bagian dari kode, yang akan meningkatkan kompleksitas. Memanggilstat()
dan bertindak berdasarkan nilai pengembaliannya pada dasarnya tidak berbahaya; menambah kompleksitas dalam melacak tambahan risiko internal yang menimbulkan bug.file
melaporkan "file kosong" adalah karena panggilanstat
untuk mendeteksi file khusus (bernama pipa, perangkat, ...), dan dibutuhkan kesempatan ini untuk berhenti memproses file kosong.file -s /proc/version
melaporkan "teks ASCII".-s
seharusnya untuk perangkat khusus blok / char. Akhirnya saya melihatfile
sumbernya, dan pada akhir fsmagic.c saya melihat penjelasan ini mengapa ia kembaliASCII text
sebagai gantiempty
:If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
Dalam direktori ini, Anda dapat mengontrol bagaimana kernel melihat perangkat, menyesuaikan pengaturan kernel, menambahkan perangkat ke kernel dan menghapusnya lagi. Dalam direktori ini Anda dapat langsung melihat penggunaan memori dan statistik I / O.
Anda dapat melihat disk mana yang dipasang dan sistem file apa yang digunakan. Singkatnya, setiap aspek sistem Linux Anda dapat diperiksa dari direktori ini, jika Anda tahu apa yang harus dicari.
The
/proc
direktori bukan direktori normal. Jika Anda mem-boot dari CD boot dan melihat direktori itu di hard drive Anda, Anda akan melihatnya kosong. Ketika Anda melihatnya di bawah sistem operasi normal Anda, itu bisa sangat besar. Namun, sepertinya tidak menggunakan ruang hard disk. Ini karena ini adalah sistem file virtual.Karena
/proc
sistem file adalah sistem file virtual dan berada di memori,/proc
sistem file baru dibuat setiap kali mesin Linux Anda reboot.Dengan kata lain, ini hanyalah cara untuk mengintip dan menyodok isi sistem Linux dengan mudah melalui antarmuka tipe file dan direktori. Ketika Anda melihat file di
/proc
direktori, Anda melihat langsung pada berbagai memori di kernel Linux dan melihat apa yang bisa dilihatnya.Lapisan-lapisan dalam sistem file
Contoh:
/proc
, ada direktori untuk setiap proses yang berjalan, dinamai dengan ID prosesnya. Direktori ini berisi file yang memiliki informasi berguna tentang proses, seperti:exe
: yang merupakan tautan simbolis ke file pada disk tempat proses dimulai.cwd
: yang merupakan tautan simbolis ke direktori kerja proses.wchan
: yang ketika dibaca, mengembalikan saluran tunggu proses sedang aktif.maps
: yang, ketika dibaca, mengembalikan peta memori dari proses./proc/uptime
mengembalikan waktu kerja sebagai dua nilai desimal dalam detik, dipisahkan oleh spasi:/proc/interrupts
: Untuk informasi yang terkait dengan interupsi./proc/modules
: Untuk daftar modul.Untuk informasi lebih lanjut, lihat man proc atau kernel.org .
sumber
mount -t procfs procfs /mnt/proc
, Anda akan melihat kernel / proc yang saat ini berjalan.Anda benar, mereka bukan file nyata.
Dalam istilah yang paling sederhana, ini adalah cara untuk berbicara dengan kernel menggunakan metode normal membaca dan menulis file, daripada memanggil kernel secara langsung. Ini sejalan dengan filosofi "semuanya adalah file" Unix.
File-file di
/proc
dalamnya tidak ada secara fisik di mana pun, tetapi kernel bereaksi terhadap file yang Anda baca dan tulis di dalamnya, dan alih-alih menulis ke penyimpanan, ia melaporkan informasi atau melakukan sesuatu.Demikian pula, file dalam
/dev
sebenarnya bukan file dalam arti tradisional (meskipun pada beberapa sistem file/dev
mungkin sebenarnya ada pada disk, mereka tidak akan memiliki banyak untuk mereka selain dari perangkat apa yang mereka rujuk) - mereka memungkinkan Anda untuk berbicara ke perangkat yang menggunakan API I / O file Unix yang normal - atau apa pun yang menggunakannya, seperti kerangsumber
Di dalam
/proc
direktori, ada dua jenis konten, direktori bernomor pertama dan yang kedua adalah file informasi sistem./proc
adalah sistem file virtual. Misalnya, jika Anda melakukannyals -l /proc/stat
, Anda akan melihat bahwa itu memiliki ukuran 0 byte, tetapi jika Anda melakukan "cat / proc / stat", Anda akan melihat beberapa konten di dalam file.Lakukan
ls -l /proc
, dan Anda akan melihat banyak direktori hanya dengan angka. Angka-angka ini mewakili ID proses (PID). File di dalam direktori bernomor ini berhubungan dengan proses dengan PID tertentu.Beberapa file yang tersedia di bawah
/proc
, berisi informasi sistem seperti cpuinfo, meminfo, dan loadavg.Beberapa perintah Linux membaca informasi dari
/proc
file - file ini dan menampilkannya. Misalnya, perintah bebas , membaca informasi memori dari/proc/meminfo
file, memformatnya, dan menampilkannya.Untuk mempelajari lebih lanjut tentang masing-masing
/proc
file, lakukan “man 5 FILENAME”.sumber
Contoh runnable minimal
Cara terbaik untuk memahami hal-hal ini menurut saya adalah benar-benar bermain-main dengan mereka, jadi di sini adalah modul kernel yang membuat entri procfs:
myprocfs.c
dan kemudian kita berinteraksi dengannya sebagai:
dan yang menghasilkan output:
Dari contoh ini, kita melihat dengan jelas bahwa
proc
file memungkinkan kita untuk mengimplementasikan "panggilan sistem terkait file" sepertiopen
,read
danllseek
.Panggilan sistem itu kemudian dapat digunakan untuk komunikasi sewenang-wenang dengan kernel.
Oleh karena itu, file-file itu tidak perlu ada hubungannya dengan file aktual dalam sistem file, dan itulah yang terjadi pada hampir semua dari mereka.
Dalam contoh kecil kita misalnya, kita hanya membuat file tidak berguna yang
read
selalu kembaliabcd\n
.Ini adalah pengaturan QEMU + Buildroot saya yang sepenuhnya otomatis untuk membangun dan bermain dengan modul kernel ini dengan mudah dan aman:
Beberapa antarmuka serupa lainnya meliputi:
debugfs pada dasarnya menawarkan antarmuka yang sama persis tetapi menunjukkan API yang kurang stabil, berikut adalah contohnya .
perangkat karakter juga sangat mirip, tetapi file dibuat dengan
mknod
, misalnya: https://unix.stackexchange.com/questions/37829/how-do-character-device- atau- character-special-files- work/ 371758# 371758sysfs adalah pilihan lain yang lebih terbatas, lihat jawaban ini untuk lebih jelasnya: https://unix.stackexchange.com/questions/4884/what-is-the-difference-between-procfs-and-sysfs/382315#382315
sumber