rc-update add sshd default mendaftarkan SSH ke runlevel default. Perintah itu tidak langsung menjalankan daemon SSH. Sebaliknya, rc-service sshd start bisa menjalankan daemon saat ini tanpa mengaktifkannya untuk boot berikutnya.
Pemisahan ini merupakan bagian penting dari cara kerja OpenRC. Sebuah service memiliki keanggotaan dalam konfigurasi boot dan status runtime yang sedang berlangsung. Keduanya tidak selalu sama. Jika tertukar, service bisa berjalan sampai sistem reboot lalu tidak aktif lagi, atau sudah terdaftar untuk boot tetapi masih berhenti sekarang.
Runlevel menentukan service yang termasuk dalam kondisi sistem
OpenRC mengelompokkan service ke dalam runlevel bernama. Pada instalasi Linux yang umum, startup melewati sysinit, boot, lalu default. Dua runlevel pertama menangani inisialisasi awal sistem; default biasanya memuat service yang dipilih administrator untuk penggunaan normal.
Keanggotaan runlevel direpresentasikan oleh symbolic link di bawah /etc/runlevels/ yang menunjuk ke script service. Misalnya, mengaktifkan sshd pada runlevel default membentuk hubungan seperti ini:
/etc/runlevels/default/sshd
-> /etc/init.d/sshdLink tersebut menyatakan pilihan saat boot, bukan proses daemon. Keberadaannya juga tidak menunjukkan apakah SSH sedang menerima koneksi.
OpenRC mendukung runlevel buatan sendiri dan stacked runlevels. Saat berpindah ke runlevel tertentu, OpenRC menghitung service yang perlu aktif beserta dependensinya. Panduan pengguna OpenRC menjelaskan model ini dan urutan boot yang lazim digunakan.
Mendaftarkan service berbeda dari menjalankannya
Pada sistem yang sudah memiliki service OpenRC bernama sshd, dua perintah berikut mengatur startup berikutnya sekaligus mengaktifkan SSH sekarang:
rc-update add sshd default
rc-service sshd startEfeknya tetap terpisah. Service dapat berstatus enabled tetapi sedang berhenti. Sebaliknya, service juga dapat berjalan tanpa terdaftar pada runlevel default.
Untuk memeriksa keduanya:
rc-update show
rc-status
rc-service sshd statusrc-update show menampilkan keanggotaan runlevel. rc-status memperlihatkan status service pada runlevel aktif, sedangkan rc-service sshd status memeriksa satu service secara langsung.
Menghapus pendaftaran saat boot juga tidak otomatis mengirim perintah stop:
rc-update delete sshd default
rc-service sshd stopPerintah pertama menghapus sshd dari default; perintah kedua menghentikan service yang sedang berjalan. Pada perpindahan runlevel berikutnya, OpenRC dapat menghentikan service yang tidak lagi diperlukan, dengan tetap mempertimbangkan hubungan dependensi.
Konsep ini mirip dengan perbedaan systemctl enable dan systemctl start. Namun, OpenRC menyatakan keanggotaan startup melalui runlevel dan script service berbasis shell, bukan aturan pemasangan unit milik systemd.
Dependensi dapat menjalankan service yang tidak didaftarkan
Daftar service dalam runlevel bukan berarti daftar lengkap semua proses yang akan dijalankan. OpenRC membangun dependency graph dari deklarasi di script service, yang biasanya berada di /etc/init.d/.
Perhatikan bagian dependensi dari contoh service aplikasi berikut:
depend() {
need localmount
use net
after bootmisc
}Setiap deklarasi memiliki konsekuensi berbeda:
need localmountmerupakan dependensi wajib. OpenRC berusaha menjalankannya walaupun service tersebut tidak terdaftar pada runlevel aktif, dan aplikasi harus menunggu hingga dependensi berhasil aktif.use netmerupakan dependensi opsional. OpenRC berusaha menggunakannya jika tersedia dalam runlevel yang berlaku, tetapi aplikasi tidak mensyaratkannya.after bootmiscmengatur urutan jika service tersebut ikut dijalankan. Deklarasi ini tidak memaksabootmiscuntuk ikut aktif.
Ada pula want untuk dependensi opsional yang tetap dicoba dijalankan meskipun tidak terdaftar pada runlevel. Perbedaan ini lebih menentukan daripada urutan nama file dalam direktori service.
Untuk service jaringan, need net tidak seharusnya ditambahkan tanpa mempertimbangkan perilaku aplikasinya. Daemon yang mendengarkan semua interface mungkin dapat aktif sebelum interface eksternal siap. Dependensi wajib pada net justru bisa menghambat startup. Penjelasan lengkap mengenai deklarasi dependensi dan kondisi jaringan tersedia di panduan script service OpenRC.
OpenRC tidak selalu berjalan sebagai proses PID 1
Pada banyak sistem OpenRC, program init terpisah seperti SysVinit berjalan sebagai PID 1 dan memanggil OpenRC ketika boot atau runlevel berubah. OpenRC menentukan tindakan yang diperlukan, menjalankannya, lalu selesai. Ia tidak harus tetap berjalan sebagai manager sentral.
OpenRC juga menyediakan implementasi openrc-init opsional yang bisa menjadi PID 1 di Linux. Jadi, anggapan bahwa OpenRC tidak mungkin menjadi PID 1 juga keliru. Kedua susunan ini memiliki tanggung jawab berbeda meskipun memakai konfigurasi service dan runlevel OpenRC yang sama. Rinciannya ada dalam panduan proses init upstream.
Pencatatan status service oleh OpenRC juga bukan jaminan bahwa seluruh proses diawasi secara terus-menerus. Daemon yang berhenti mendadak tidak otomatis dijamin hidup kembali hanya karena telah ditambahkan ke runlevel. Jika memerlukan restart otomatis, gunakan supervisor yang sesuai atau mekanisme khusus pada service tersebut.
Ketika service sudah enabled tetapi tidak berjalan
Diagnosis sebaiknya dimulai dengan membedakan masalah pendaftaran dari masalah eksekusi.
Jika rc-update show mencantumkan sshd dalam default tetapi rc-service sshd status menyatakan stopped, berarti pendaftarannya ada tetapi prosesnya tidak aktif. Menjalankan service secara eksplisit dapat memperlihatkan masalah pada executable, konfigurasi, izin akses, atau dependensinya. Sebaliknya, jika daemon berjalan tetapi tidak tercantum dalam rc-update show, mungkin ia dijalankan manual atau ditarik oleh dependensi service lain.
Saat membandingkan OpenRC dengan systemd, pemisahan ini lebih berguna daripada langsung menganggap salah satunya selalu lebih ringan atau lebih cepat. Waktu boot dan penggunaan memori dipengaruhi oleh service yang dipilih, dependensi, mekanisme startup, serta komponen supervision dan logging yang digunakan.
Aturan operasionalnya jelas: gunakan rc-update untuk mengubah service yang dipilih runlevel, rc-service untuk mengubah status service saat ini, dan deklarasi dependensi untuk menjelaskan mengapa service lain ikut dijalankan atau dihentikan.