Pada chapter sebelumnya kita melihat bahwa program berbicara dengan kernel lewat system call. Namun ada arah komunikasi sebaliknya yang sama pentingnya: bagaimana kita, dari user space, mengintip keadaan ribuan proses dan perangkat keras yang dikelola kernel? Jawabannya adalah dua pseudo filesystem — /proc dan /sys — yang tampak berisi file biasa padahal seluruh isinya dibangkitkan kernel saat kita membacanya. Pada chapter ini kita menjelajahi keduanya: /proc untuk proses dan parameter runtime kernel, lalu /sys untuk peta perangkat keras sistem.

procfs: Pseudo Filesystem untuk Proses dan Sistem #

Direktori /proc tidak menyimpan satu byte pun di disk. Ketika kita menjalankan cat /proc/self/status, syscall read dari chapter syscall mendarat di procfs, dan kernel menyusun isi filenya saat itu juga dari struktur data internalnya. Karena itulah ukuran file di /proc selalu tampak 0 bila dilihat dengan ls -l, meskipun isinya bisa dibaca. Seluruh alat monitoring standar bekerja di atas sumber ini: ps, top, dan free tidak lebih daripada pembaca /proc yang rapi — kita bisa membuktikannya sendiri dengan strace ps dan melihat deretan openat("/proc/...").

Setiap proses punya direktori sendiri bernama nomor PID: /proc/841/ berisi segala hal tentang proses nomor 841. Trik yang menyenangkan adalah symlink /proc/self yang selalu menunjuk proses yang sedang membacanya — kita tidak perlu tahu PID kita sendiri untuk mengintip diri sendiri:

bash
echo "== comm: nama proses =="
cat /proc/self/comm
echo "== cmdline: argumen proses =="
cat /proc/self/cmdline | tr '\0' '\n'
echo "== jumlah fd terbuka =="
ls /proc/self/fd | wc -l

Output yang Dihasilkan:

text
== comm: nama proses ==
cat
== cmdline: argumen proses ==
cat
/proc/self/cmdline
== jumlah fd terbuka ==
4

Mari kita bedah blok di atas baris-per-baris:

  1. Baris 2 (cat /proc/self/comm): file comm berisi nama program; karena cat-lah yang membacanya, /proc/self menunjuk ke proses cat itu sendiri sehingga hasilnya cat.
  2. Baris 4 (cat /proc/self/cmdline | tr ...): cmdline menyimpan argumen proses dipisah byte NUL, khas string bahasa C — tr '\0' '\n' menggantinya jadi baris agar terbaca: cat dan /proc/self/cmdline.
  3. Baris 6 (ls /proc/self/fd | wc -l): direktori fd/ berisi satu symlink per file descriptor terbuka — di sini empat: stdin (0), stdout (1), stderr (2), ditambah fd 3 yang dibuka ls sendiri untuk membaca isi direktori tersebut.

File lain yang layak dikenal di /proc/<pid>/: status (identitas dan status proses, dibaca program baca-proc pada chapter sebelumnya), environ (variabel lingkungan awal proses, juga berformat NUL-terminated), maps (wilayah memori yang dipetakan), dan cwd (symlink ke direktori kerja proses). File environ menarik untuk diamati karena memperlihatkan proses membawa “koper” lingkungannya sendiri:

bash
cat /proc/self/environ | tr '\0' '\n' | grep -E '^(PATH|HOME|TERM|LANG|LC_ALL)=' | sort

Output yang Dihasilkan:

text
HOME=/home/budi
LANG=C.UTF-8
LC_ALL=C.UTF-8
PATH=/usr/local/bin:/usr/bin:/bin
TERM=dumb

Output di lingkungan latihan menampilkan lima variabel dasar sesi terminal; di komputer Anda daftarnya lebih panjang karena mencakup semua variabel yang diwariskan shell saat program dijalankan.

Parameter Runtime di /proc/sys #

Subdirektori penting berikutnya adalah /proc/sys — kumpulan kenop yang mengubah perilaku kernel tanpa reboot. Sebagian besar file di sini berisi satu nilai: batas jumlah PID, kebijakan swappiness memori, sampai enable/disable IP forwarding. Contoh yang paling sering dikutip adalah batas atas nomor PID:

bash
cat /proc/sys/kernel/pid_max

Output yang Dihasilkan:

text
32768

Angka pada output adalah nilai bawaan di sistem latihan; nilainya bisa berbeda di komputer lain. Nilai ini menandakan PID tertinggi yang boleh dialokasikan kernel sebelum berputar kembali ke angka kecil yang sudah bebas. Mengubahnya semudah menulis ke file — echo 4194304 > /proc/sys/kernel/pid_max — dan kernel langsung menerapkannya; perintah sysctl kernel.pid_max membaca nilai yang sama dari sisi lain. Dokumentasi lengkap isi /proc tersedia di halaman manual proc(5) .

sysfs: Peta Perangkat Keras Sistem #

Sejak kernel 2.6, perangkat keras dimodelkan dalam satu pohon objek kernel (kobject) yang diekspor ke /sys. Berbeda dengan /proc yang berorientasi proses, sysfs berorientasi perangkat: setiap NIC, disk, dan USB device punya direktori berisi atributnya — alamat MAC, kecepatan, status. Dua cabang yang paling sering dikunjungi adalah /sys/class (perangkat dikelompokkan per fungsi) dan /sys/block (perangkat blok):

bash
echo "== class/net =="
ls /sys/class/net
echo "== block =="
ls /sys/block

Output yang Dihasilkan:

text
== class/net ==
dummy0
eth0
lo
== block ==
pmem0
vda
zram0

Baris pertama mencantumkan antarmuka jaringan yang dikenali kernel — di mesin latihan: lo (loopback), eth0, dan dummy0; baris kedua mencantumkan perangkat blok seperti vda. Nama perangkat di komputer Anda hampir pasti berbeda karena mengikuti hardware yang terpasang. Setiap nama tersebut adalah direktori: /sys/class/net/eth0/ berisi file address, mtu, speed, dan tetangganya — inilah sumber data yang sama yang dibaca ip dan udev. Device manager udev bahkan membangun seluruh aturan /dev berdasarkan event yang muncul dari sysfs, sebagaimana dibahas pada chapter udev dan device rules .

Membandingkan procfs dan sysfs #

Kedua filesystem ini sering tertukar peran karena sama-sama “file tentang kernel”, tetapi desainnya berbeda:

Aspekprocfs (/proc)sysfs (/sys)
Fokusproses dan informasi sistemperangkat keras dan modul
Satuan utamadirektori per PID, plus /proc/sysobjek perangkat (kobject)
Isi khasstatus, cmdline, fd/, mapsclass/, block/, module/
Diubah lewatkebanyakan baca-saja; /proc/sys via sysctlatribut perangkat via echo (perlu root)
Turunan penting/proc/self, /proc/sys//sys/class/, /sys/fs/cgroup/

Satu cabang sysfs pada baris terakhir tabel patut dicatat: /sys/fs/cgroup adalah rumah dari mekanisme pembatasan resource yang kita bedah tiga chapter lagi. Format atribut sysfs untuk tiap jenis perangkat terdokumentasi di dokumentasi kernel .

Sekarang kita punya jendela untuk melihat keadaan kernel yang sedang berjalan. Pertanyaan berikutnya: bagaimana jika kita ingin mengubah bentuk kernel itu sendiri — membuang driver yang tak terpakai, atau menyalakan opsi debugging? Perjalanan itu dimulai dari satu file bernama .config, yang kita bahas pada chapter berikutnya tentang konfigurasi kernel.