Watchdog Timer: Membuat Sistem Tetap ON

Jika kita punya satu sistem yang remote (misalnya server embedded berbasis Linux), tentunya kita berharap sistem tersebut dapat menjalankan fungsinya dengan baik secara terus menerus. Tapi bagaimana jika sistem mengalami kegagalan yang berakibat fatal (hang) yang disebabkan misalnya oleh harddisk crash, error memori atau lainnya? Jika kondisi ini terjadi, sistem pasti tidak akan dapat berfungsi sama sekali (dan termasuk network), dan satu-satunya jalan adalah dengan meresetnya. Tapi sistem kan ada di remote? Masak kita harus datang ke lokasi remote dan memencet tombol reset untuk mereboot sistem? Watchdog timer dapat mengatasi problem ini.

Watchdog Timer (WDT) merupakan hardware (atau emulasi hardware) yang dapat mereset sistem secara otomatis jika terjadi software fault. Terdapat 2 jenis watchdog yang di support oleh kernel driver: hardware dan software watchdog (softdog). Hardware watchdog dimiliki salah satunya oleh board yang menggunakan prosesor EP93XX, misalnya board Technologic System TS72XX, sehingga watchdog inilah yang akan digunakan, karena board inilah yang kami miliki.

flow watchdog

flow watchdog

Untuk mengaktifkan watchdog diperlukan daemon userspace yang akan membuka node device /dev/watchdog dan memberitahu driver watchdog kernel secara berkala bahwa userspace/sistem masih hidup, dan driver ini selanjutnya akan memberitahu hardware watchdog bahwa sistem OK dan watchdog harus menunggu notifikasi berikutnya dalam timeout yang telah ditentukan. Jika userspace gagal (misalnya RAM error, kernel bug, atau lainnya), notifikasi tidak terkirim, dan watchdog akan mereset sistem (reboot) setelah lewat timeout.

Mengaktifkan Watchdog

Langkah-langkah yang perlu dilakukan untuk mengaktifkan watchdog di Linux:

  1. Instalasi kernel atau modul kernel
    Aktifkan konfigurasi kernel:
    Drivers->char->watchdog:
    [Y] Watchdog Timer Support [CONFIG_WATCHDOG=y]
    [Y] Disable watchdog shutdown on close [CONFIG_WATCHDOG_NOWAYOUT=y]
    [Y] EP93xx Watchdog [CONFIG_EP93XX_WATCHDOG=y]

    Konfigurasi ini akan menginstall ep93xx_wdt ke dalam kernel, sehingga saat kernel dijalankan, akan terasosiasi ke node device /dev/watchdog
  2. Kernel option yang bisa diberikan oleh EP93XX watchdog driver ada 2, yaitu
    • nowayout: watchdog tidak dapat distop ketika sudah dijalankan
      nilai default tergantung dari setting konfigurasi CONFIG_WATCHDOG_NOWAYOUT (1: tidak dapat distop, 0(default): dapat distop). Ini penting jika daemon watchdog crash, maka device akan close dan sistem tidak akan reboot. Dengan mengaktifkan option ini, watchdog akan reboot setelah timeout terlampau walaupun daemon watchdog crash
    • timeout: watchdog timeout dalam detik
      nilai default 30 detik

    Untuk mengubah nilai option ini dari defaultnya, dapat dilakukan dengan menambah option di parameter kernel,misalnya: ‘ep93xx_wdt.timeout=60’ atau ‘ep93xx_wdt.nowayout=1’

  3. Watchdog akan diload saat kernel dijalankan, namun belum aktif. Diperlukan software user untuk mengaktifkannya. Busybox mempunyai applet watchdog yang mengambil source dari Documentation/watchdog/src/watchdog-simple.c
    • Watchdog akan diaktifkan saat node device /dev/watchdog dibuka
    • Watchdog akan reboot sistem, kecuali ia di-ping oleh applet watchdog sebelum timeout

    Jadi, jika timeoutnya diset 30 detik, maka, program watchdog harus bisa melakukan ping ke device kurang dari 30 detik (misalnya 25 detik). Di watchdog busybox hal ini dapat dilakukan dengan:

         # /sbin/watchdog -t 25 /dev/watchdog

    Sehingga, jika sistem crash maka daemon watchdog tidak bisa menulis ke device node /dev/watchdog sampai timeout 30 detik terlampuai. Kernel driver menganggap sistem telah fail, dan memberitahu device watchdog untuk mereboot sistem.

Menengok Daemon Watchdog

Contoh daemon watchdog untuk mengaktifkan watchdog timer dapat dilihat di dokumentasi kernel (Documentation/watchdog/src/watchdog-simple.c). Template ini yang digunakan oleh applet watchdog di busybox.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, const char *argv[]) {
   int fd = open("/dev/watchdog", O_WRONLY); /*Activate watchdog*/
   if (fd == -1) {
	perror("watchdog");
	exit(1);
  }
  while (1) {
       write(fd, "", 1); /*Notify watchdog driver that system is OK*/
	fsync(fd);
	sleep(10); /*Notification interval,  */
                       /*should be less than watchdog timeout*/
   }
}

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: