GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana /proc/* bekerja?

Ini sebenarnya cukup sederhana, setidaknya jika Anda tidak memerlukan detail penerapannya.

Pertama, di Linux semua sistem file (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) diimplementasikan di kernel. Beberapa mungkin membongkar pekerjaan ke kode userland 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, ia akan mengeluarkan berbagai panggilan pustaka sistem yang akhirnya berakhir di kernel dalam bentuk open() , read() , close() urutan (mungkin dengan seek() dilemparkan untuk ukuran yang baik). Kernel mengambil jalur dan nama file yang disediakan, dan melalui sistem file dan lapisan I/O perangkat menerjemahkannya menjadi permintaan baca fisik (dan dalam banyak kasus juga permintaan tulis -- pikirkan misalnya pembaruan waktu) ke beberapa penyimpanan yang mendasarinya.

Namun, tidak harus menerjemahkan permintaan tersebut secara khusus ke fisik, persisten penyimpanan . Kontrak kernel adalah mengeluarkan kumpulan panggilan sistem tertentu akan menyediakan konten file yang dimaksud . Di mana tepatnya di dunia fisik kita, "file" itu berada di urutan kedua.

Pada /proc biasanya dipasang apa yang dikenal sebagai procfs . Itu adalah tipe sistem file khusus, tetapi karena ini adalah sistem file, itu benar-benar tidak berbeda dari mis. sebuah ext3 sistem file terpasang di suatu tempat. Jadi permintaan diteruskan ke kode driver sistem file procfs, yang mengetahui tentang 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 memasang procfs di /proc hanyalah konvensi; Anda dapat dengan mudah memasangnya di tempat lain. Faktanya, hal itu terkadang dilakukan, misalnya di chroot jails ketika proses yang berjalan di sana memerlukan akses ke /proc karena beberapa alasan.

Ini bekerja dengan cara yang sama jika Anda menulis nilai ke beberapa file; pada tingkat kernel, yang diterjemahkan menjadi serangkaian open() , seek() , write() , close() panggilan yang sekali lagi diteruskan ke driver sistem file; sekali lagi, dalam kasus khusus ini, kode procfs.

Alasan khusus mengapa Anda melihat file mengembalikan empty adalah banyak file yang diekspos oleh procfs diekspos dengan ukuran 0 byte. Ukuran 0 byte kemungkinan merupakan pengoptimalan di sisi kernel (banyak file di / proc bersifat dinamis dan dapat dengan mudah bervariasi panjangnya, bahkan mungkin dari satu pembacaan ke pembacaan berikutnya, dan menghitung panjang setiap file pada setiap pembacaan direktori akan berpotensi menjadi sangat mahal). Mengikuti komentar untuk jawaban ini, yang dapat Anda verifikasi di sistem Anda sendiri dengan menjalankan strace atau alat serupa, file pertama mengeluarkan stat() panggilan untuk mendeteksi file khusus apa pun, lalu mengambil kesempatan untuk, jika ukuran file dilaporkan sebagai 0, batalkan dan laporkan file sebagai kosong.

Perilaku ini sebenarnya didokumentasikan dan dapat diganti dengan menentukan -s atau --special-files pada file doa, meskipun seperti yang tertera di halaman manual yang mungkin memiliki efek samping. Kutipan di bawah ini dari halaman manual file BSD 5.11, tertanggal 17 Oktober 2011.

Biasanya, file hanya mencoba membaca dan menentukan jenis file argumen yang stat(2) laporkan adalah file biasa. Ini mencegah masalah, karena membaca file khusus mungkin memiliki konsekuensi yang aneh. Menentukan -s opsi menyebabkan file juga membaca file argumen yang merupakan file khusus blok atau karakter. Ini berguna untuk menentukan jenis sistem file dari data di partisi disk mentah, yang merupakan file khusus blok. Opsi ini juga menyebabkan file mengabaikan ukuran file seperti yang dilaporkan oleh stat(2) karena pada beberapa sistem melaporkan ukuran nol untuk partisi disk mentah.


Di direktori ini, Anda dapat mengontrol bagaimana kernel melihat perangkat, menyesuaikan pengaturan kernel, menambahkan perangkat ke kernel dan menghapusnya lagi. Di 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.

/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 berjalan normal Anda, itu bisa sangat besar. Namun, sepertinya tidak menggunakan ruang hard disk. Ini karena ini adalah sistem file virtual.

Sejak /proc sistem file adalah sistem file virtual dan berada di memori, /proc baru sistem file dibuat setiap kali mesin Linux Anda melakukan boot ulang.

Dengan kata lain, ini hanyalah sarana untuk dengan mudah mengintip dan menyodok nyali sistem Linux melalui antarmuka tipe file dan direktori. Saat Anda melihat file di /proc direktori, Anda melihat langsung ke rentang memori di kernel Linux dan melihat apa yang dapat dilihatnya.

Lapisan dalam sistem file

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, saat dibaca, mengembalikan saluran menunggu proses sedang berlangsung.
    • maps :yang, ketika dibaca, mengembalikan peta memori dari proses tersebut.
  • /proc/uptime mengembalikan waktu aktif sebagai dua nilai desimal dalam detik, dipisahkan dengan spasi:
    • jumlah waktu sejak kernel dimulai.
    • jumlah waktu kernel menganggur.
  • /proc/interrupts :Untuk informasi terkait interupsi.
  • /proc/modules :Untuk daftar modul.

Untuk informasi lebih detail lihat man proc atau kernel.org.


Anda benar, itu bukan file asli.

Dalam istilah yang paling sederhana, ini adalah cara untuk berbicara dengan kernel menggunakan metode membaca dan menulis file yang normal, alih-alih memanggil kernel secara langsung. Ini sejalan dengan filosofi "semuanya adalah file" Unix.

File di /proc 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, kernel melaporkan informasi atau melakukan sesuatu.

Begitu pula dengan file di /dev sebenarnya bukan file dalam pengertian tradisional (walaupun pada beberapa sistem file dalam /dev mungkin benar-benar ada di disk, mereka tidak akan memiliki banyak hal selain perangkat apa yang mereka rujuk) - mereka memungkinkan Anda untuk berbicara dengan perangkat menggunakan API I/O file Unix normal - atau apa pun yang menggunakannya, seperti shell


Linux
  1. Mengapa find -exec mv {} ./target/ + tidak berfungsi?

  2. Bagaimana cara kerja copy_from_user dari kernel Linux secara internal?

  3. Bagaimana cara mengetahui dari folder mana suatu proses sedang berjalan?

  1. Apa itu NGINX? Bagaimana cara kerjanya?

  2. Bagaimana Cara Kerja Awk ‘!a[$0]++’?

  3. Bagaimana Cara Kerja Sticky Bit?

  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Linux – Menautkan /proc/mnt Ke /proc/mounts?

  3. Ssh – Bagaimana Tcp-keepalive Bekerja Di Ssh?