Fitur systemd-bsod (Blue Screen of Death) diperkenalkan pada systemd versi 255 untuk menampilkan pesan kesalahan layar penuh ketika sistem mendapati kegagalan fatal saat proses inisialisasi boot. Layar ini secara otomatis menangkap pesan log dengan prioritas LOG_EMERG (level 0) dari systemd-journald dan merender pesan tersebut beserta kode QR ke framebuffer atau DRM device agar teknisi dapat mendiagnosis masalah tanpa perlu masuk ke mode darurat shell terlebih dahulu.
Mekanisme Kerja systemd-bsod dan LOG_EMERG
Komponen systemd-bsod.service berjalan sebagai unit one-shot yang menunggu sinyal kegagalan. Komponen ini membaca ring-buffer log dari journald, memfilter entri dengan prioritas LOG_EMERG (emerg), dan menampilkan output ke layar konsol aktif. Ketika service backend menulis langsung ke /dev/kmsg atau mengirim log syslog dengan severity LOG_EMERG tanpa penanganan error yang baik, systemd mendeteksi kondisi tidak dapat pulih (unrecoverable state) lalu menghentikan proses boot normal.
Studi Kasus: Kegagalan Inisialisasi Daemon Database
Sebuah backend database daemon lokal dikonfigurasi untuk start saat boot melalui systemd unit. Di dalam kode daemon (C/Go/Rust), terdapat pengecekan dependensi penyimpanan. Jika filesystem mount gagal atau berkas konfigurasi korup, daemon memanggil fungsi logger sistem dengan tingkat keparahan darurat:
/* cuplikan implementasi logger pada daemon */
#include <syslog.h>
void init_storage(const char *path) {
if (mount_data_partition(path) != 0) {
/* Kesalahan: Mengirim log emergency ke syslog/journald */
syslog(LOG_EMERG, "FATAL: Data partition corrupt or missing at %s", path);
exit(1);
}
}Pesan di atas diteruskan oleh systemd-journald dengan field PRIORITY=0. Akibatnya, systemd-bsod langsung terpicu, mengunci tampilan konsol, dan menampilkan teks error beserta QR code payload URL diagnostic.
Investigasi Menggunakan Journalctl
Untuk memverifikasi log pemicu dari lingkungan recovery atau SSH, gunakan perintah journalctl dengan filter prioritas emergency:
journalctl -b 0 -p 0..0 -o verboseOutput akan menunjukkan entri persis yang memicu BSOD, termasuk unit sistem pengirimnya:
PRIORITY=0
_SYSTEMD_UNIT=core-db.service
MESSAGE=FATAL: Data partition corrupt or missing at /var/lib/data
_COMM=core-db-daemonMitigasi pada Service Unit
Untuk mencegah service non-kernel memicu systemd-bsod yang memblokir booting sistem operasi secara keseluruhan, lakukan mitigasi pada berkas unit systemd terkait.
1. Isolasi Log Level dengan LogLevelMax
Batasi batas log level maksimum yang diizinkan masuk ke journald dari unit tersebut. Dengan menetapkan LogLevelMax=alert, setiap pesan LOG_EMERG dari aplikasi akan diturunkan atau ditolak sehingga tidak memenuhi syarat pemicu BSOD:
[Unit]
Description=Core Database Daemon
After=network.target local-fs.target
Requires=local-fs.target
[Service]
Type=notify
ExecStart=/usr/local/bin/core-db-daemon --config /etc/core-db.conf
Restart=on-failure
RestartSec=5s
LogLevelMax=alert
StandardError=journal
[Install]
WantedBy=multi-user.target2. Penyesuaian Dependency Ordering
Pastikan unit memiliki dependensi mount yang eksplisit menggunakan direktif RequiresMountsFor= agar daemon tidak dieksekusi sebelum partisi siap, menghindari eksekusi kode error handler darurat:
[Unit]
Description=Core Database Daemon
RequiresMountsFor=/var/lib/data
After=local-fs.targetMenonaktifkan systemd-bsod
Jika lingkungan server headless atau VM production tidak memerlukan antarmuka layar penuh darurat, unit dapat dinonaktifkan sepenuhnya:
systemctl mask systemd-bsod.serviceMasking memastikan service tidak dapat dipanggil oleh generator boot systemd maupun socket trigger, mengembalikan perilaku fallback boot error ke kernel dmesg standar.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!