/sbin/
에 powerd
실행파일을 복사해 놓는다.
/etc/powerd.conf
를 적당히 수정한다. 필자는 다음과 같이 수정하였다. (2번째 시리얼 포트에 연결)
serialline /dev/cua1
monitor DCD
failwhen low
asserthigh DTR
즉, 프로그램이 시작되면 DTR에 전압이 들어가고 10K Ohm짜리 저항으로 연결되어있는 DCD도 역시 전압이 인가(high)된다. 정전이 되면 DCD와 GND가 릴레이에 의해서 닫히게 되는데 이에따라 DCD는 전압이 0V가 되고 신호는 low가 되며 이를 powerd에서 감지하는 것이다.
/etc/rc.d/rc.local
파일(아니면 동등한 역할을 하는 다른 파일)에 다음 라인을 추가한다.
if [ -f /sbin/powerd ]; then
echo "Running powerd"
/sbin/powerd &
fi
/etc/inittab
수정 - 필자는 다음과 같은 라인을 삽입하였다.
pf::powerfail:/sbin/shutdown -f -h +300 "Power Failure; System Shutting Down"
pr::powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
첫번째 라인은 정전이 되었을 경우 모든사람들에게 이를 알리고 300분(5시간)
후에 셧다운을 하도록 하는 라인이고 다음 라인은 전원이 복구되었을 때
셧다운을 취소하는 라인이다. 정전후 몇분 후에 셧다운을 시켜야 하는지는 다음
섹션에서 설명한다. inittab을 수정하였을 경우 그 사항이 반영되도록 하려면
재부팅을 하던지 아니면 루트 프롬프트에서 "telinit Q"라고 입력하면 된다.
루트 권한으로 "telinit Q"를 입력하고 powerd를 실행한다. 그런 다음 어댑터를 빼서 10초 를 기다리면 셧다운이 300분 후에 시작될 것이라고 나올 것이다. 이 상태에서 어댑터를 다시 연결한 다음 10초간 기다리면 셧다운이 취소되었다는 메시지가 나온다. 이로써 모든 거의 모든 작업이 끝난 셈이다.
혹시 필자가 사용하였던 powerd 2.0과 같은 버전의 프로그램을 사용한 경우에 프로그램의 버그에 의해 셧다운 취소가 안 될 수 있다. 이 경우 침착하게 "shutdown -c"명령으로 셧다운을 취소한 다음 powerd.c를 수정한다. 필자가 수정한 곳은 다음과 같은데(diff 결과) 전체 소스코드를 다 뜯어본 후 한 것이 아니므로 잘못 하였을 지도 모른다. 아뭏든 필자는 원하는 결과를 얻을 수 있었으므로 이렇게 고쳐서 사용중이다.
일단 다음을 powerd.patch로 저장을 한다.
--------------- powerd.patch start! ----------------
1127,1145d
1098a
/* Create an info file for init. */
unlink(PWRSTAT);
fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644);
if (fd<0)
{
PERROR(PWRSTAT);
return 1; /* maybe next time... */
}
if (action==ACT_OK)
write(fd, "OK\n", 3);
else
write(fd, "FAIL\n", 5);
close(fd);
MESSAGE("Telling init about...");
kill(1, SIGPWR);
.
1,$wq
--------------- powerd.patch end! ----------------
그런 다음 "ed powerd.c < powerd.patch"
라고 프롬프트에서 입력하면 자동으로
프로그램이 패치될 것이다. 이런 후 다시 컴파일하고 실행해 보기 바란다.