Bagaimana cara / proc / * bekerja?

62

Ada banyak file dalam /proc, seperti /proc/cpuinfo, /proc/meminfo, /proc/devicesdan sebagainya, yang, ketika dibuka, sistem informasi kembali.

File-file ini tampaknya tidak memiliki keberadaan dalam kenyataan, karena menjalankannya filehanya memberitahu mereka kosong.

$ file /proc/cpuinfo
/proc/cpuinfo: empty

Bagaimana cara kerja file-file ini?

pengguna2064000
sumber

Jawaban:

72

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 /procbiasanya 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 ext3sistem 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 procfsmenyediakan antarmuka yang bersih dan nyaman untuk mengaksesnya. Perlu diingat bahwa pemasangan proc di /prochanyalah 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 filekembali emptyadalah 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, filepertama-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 -satau --special-filespada filepemanggilan, 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 -sopsi 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.

sebuah CVn
sumber
5
Ketika Anda melihatnya dengan strace file /proc/versionatau ltrace -S /proc/version, pengoptimalannya agak kecil. Itu melakukan stat()panggilan pertama dan menemukan bahwa ukurannya adalah 0, sehingga melewatkan open()- tetapi sebelum itu memuat beberapa file ajaib.
ott--
2
@ ott-- Itu memang urutan kejadian yang aneh, tetapi mungkin terkait dengan fakta bahwa Anda dapat meneruskan beberapa nama file 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. Memanggil stat()dan bertindak berdasarkan nilai pengembaliannya pada dasarnya tidak berbahaya; menambah kompleksitas dalam melacak tambahan risiko internal yang menimbulkan bug.
CVn
@ ott-- Sebenarnya, alasan filemelaporkan "file kosong" adalah karena panggilan statuntuk mendeteksi file khusus (bernama pipa, perangkat, ...), dan dibutuhkan kesempatan ini untuk berhenti memproses file kosong. file -s /proc/versionmelaporkan "teks ASCII".
Gilles 'SO- berhenti bersikap jahat'
4
@Gilles -sseharusnya untuk perangkat khusus blok / char. Akhirnya saya melihat filesumbernya, dan pada akhir fsmagic.c saya melihat penjelasan ini mengapa ia kembali ASCII textsebagai ganti empty: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.
ott--
15

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 /procdirektori 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 /procsistem file adalah sistem file virtual dan berada di memori, /procsistem 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 /procdirektori, Anda melihat langsung pada berbagai memori di kernel Linux dan melihat apa yang bisa dilihatnya.

Lapisan-lapisan dalam sistem file

Masukkan deskripsi gambar di sini

Contoh:

  • Di dalam /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:
    • jumlah waktu sejak kernel dimulai.
    • jumlah waktu yang telah di-idle oleh kernel.
  • /proc/interrupts: Untuk informasi yang terkait dengan interupsi.
  • /proc/modules: Untuk daftar modul.

Untuk informasi lebih lanjut, lihat man proc atau kernel.org .

stderr
sumber
"Jika Anda mem-boot dari CD boot dan melihat direktori itu pada hard drive Anda, Anda akan melihatnya kosong." Itu tidak spesifik untuk / proc, itu umum untuk setiap titik mount di mana sistem file yang mendasarinya belum dipasang. Jika Anda boot dari CD boot yang sama dan melakukan sesuatu seperti mount -t procfs procfs /mnt/proc, Anda akan melihat kernel / proc yang saat ini berjalan.
CVn
5

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 /procdalamnya 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 /devsebenarnya bukan file dalam arti tradisional (meskipun pada beberapa sistem file /devmungkin 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 kerang

LawrenceC
sumber
1
Lebih seperti * nix bahwa hanya file yang dapat diamankan. Karena daftar kontrol akses tetap ada dalam sistem file, akan lebih mudah untuk mengamankan sumber daya istimewa menggunakan mekanisme umum yang sudah disediakan oleh driver sistem file. Ini menyederhanakan implementasi alat yang mengakses struktur kernel dan memungkinkannya berjalan tanpa izin yang lebih tinggi dengan membaca dari file virtual sistem file proc.
Pekka
3

Di dalam /procdirektori, ada dua jenis konten, direktori bernomor pertama dan yang kedua adalah file informasi sistem.

/procadalah sistem file virtual. Misalnya, jika Anda melakukannya ls -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 /procfile - file ini dan menampilkannya. Misalnya, perintah bebas , membaca informasi memori dari /proc/meminfofile, memformatnya, dan menampilkannya.

Untuk mempelajari lebih lanjut tentang masing-masing /procfile, lakukan “man 5 FILENAME”.

/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.
Shailesh
sumber
2
Bagi saya ini lebih seperti "bagaimana menggunakan apa yang ada di / proc?" daripada "bagaimana cara kerja / proc?". Informasi yang berguna, tetapi tidak harus menjawab pertanyaan khusus ini .
CVn
Setiap file di / proc adalah informasi runtime, yang berarti bahwa ketika Anda menjalankan bagian dari kernel menjalankan fungsi yang menghasilkan konten file.
Shailesh
3

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

#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h> /* seq_read, seq_lseek, single_open, single_release */
#include <uapi/linux/stat.h> /* S_IRUSR */

static const char *filename = "lkmc_procfs";

static int show(struct seq_file *m, void *v)
{
    seq_printf(m, "abcd\n");
    return 0;
}

static int open(struct inode *inode, struct  file *file)
{
    return single_open(file, show, NULL);
}

static const struct file_operations fops = {
    .llseek = seq_lseek,
    .open = open,
    .owner = THIS_MODULE,
    .read = seq_read,
    .release = single_release,
};

static int myinit(void)
{
    proc_create(filename, 0, NULL, &fops);
    return 0;
}

static void myexit(void)
{
    remove_proc_entry(filename, NULL);
}

module_init(myinit)
module_exit(myexit)
MODULE_LICENSE("GPL");

dan kemudian kita berinteraksi dengannya sebagai:

insmod procfs.ko
cat /proc/lkmc_procfs

dan yang menghasilkan output:

abcd

Dari contoh ini, kita melihat dengan jelas bahwa procfile memungkinkan kita untuk mengimplementasikan "panggilan sistem terkait file" seperti open, readdan llseek.

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 readselalu kembali abcd\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:

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber