· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linuxdoc Sgml/Ups-KLDP

UPS mini HOWTO

UPS mini HOWTO

김규랑, krkim@epilab.snu.ac.kr

v1.0, 18 June 1998
컴퓨터와 연결하기 위한 릴레이 신호 출력이 없는 UPS를 위한 전원이상 센서만들기와 이 센서 신호를 이용한 리눅스 서버의 셧다운 자동 제어

1. 소개

UPS를 컴퓨터 전원라인에 설치하는 일은 그렇게 어려운 일은 아니지만, 전원이 나갔을 경우 이를 감지하고 적절히 처리(배터리가 완전히 방전되기 전에 셧다운) 하는 일은 UPS에 적절한 출력 포트가 있고 이를 제대로 사용할 수 있는 프로그램이 필요하다. 본 문서에서는 UPS가 어떠한 전원이상 신호도 출력하지 않을 경우에도 최소한의 비용과 노력으로 안전하게 리눅스 서버를 셧다운 시킬 수 있는 방법을 기술하고자 한다.

2. 작업의 개요

  1. UPS에 의해 컴퓨터들(1대 또는 그 이상)은 정전시에도 계속 켜져 있음(최소 2분 이상)
  2. UPS로 입력되는 전원에 일반 DC어댑터를 연결하고 이 어댑터에서 나오는 전기를 이용하여 평소에는 릴레이가 떨어져 있고 정전시에는 붙는 회로를 만듬
  3. 위의 회로를 컴퓨터 직렬포트로 감지할 수 있도록 직렬포트에 몇개의 저항과 위 신호선을 연결함
  4. 신호를 컴퓨터 OS에서 감시하고 정전시를 대비함

3. 필요 물품

릴레이

5V 용이나 12V 용이 구하기 쉽다. 어떤 모양이거나 상관 없고 전기가 들어올 때는 열려있다가 전기가 나가면 닫히는 회로만 있으면 된다. 필자는 못쓰게된 외장형 모뎀에서 억지로 뜯어내었다. 보통 외장형 모뎀에는 5V용 릴레이가 2개씩 달려있다.

DC어댑터

위의 릴레이의 구동용으로 쓸수 있는 전압이 출력되어야 한다.

10K 0hm짜리 저항

색깔로 말하자면 갈,흑,등,(금) 이다. 릴레이를 사용하려고 외장형 모뎀을 박살 내었다면 같은 기판에서 여러개 찾을 수 있을 것이다.

시리얼 포트 잭

외장형 모뎀을 박살 내었다면 이것 역시 하나 있을 것이다.

전선

얇은 것으로 약간 (한 20cm) 시리얼 포트를 박살 낸 후 그 안에 들어있는 전선을 사용하면 될 것이다.

기타

땜납, 납땜인두, 니퍼, 절연테이프(까만테이프), 멀티테스터 등

프로그램

Alessandro Rubini의 powerd 2.0을 이용하였다. sunsite등에서 쉽게 찾을 수 있을 것이다.

4. 하드웨어 만들기

  1. 릴레이의 옆면이나 윗면을 자세히 보면 코일 모양의 그림이 연결되어 있는 핀 두개가 있을 것이다. 이 두 핀에 어댑터의 두 선을 납땜한다. +, -를 신경 쓸 필요는 없다.
  2. 시리얼 포트 잭을 완전히 분해해서 납땜을 할 수 있는 면이 밖으로 나오도록 꺼내 놓은 후 DTR과 DSR을 전선을 사용해서 연결하고 DTR과 DCD를 10K Ohm짜리 저항으로 연결한다. 시리얼 포트의 핀 번호는 다음 섹션을 참고한다.
  3. 릴레이에서 정전일 경우에만 연결되는 핀이 어느 것인지를 확인한다. 멀티테스터의 저항값 확인 기능과 어댑터에 실제로 전기를 공급 함으로써 쉽게 할 수 있을 것이다.
  4. 3번의 두 핀을 하나는 DCD에 다른 하나는 GND에 연결한다.
  5. 마지막으로 지저분한 것들이 보이지 않도록 절연테이프로 잘 감아준다.

5. 시리얼 포트의 핀 번호

우리가 표준으로 시리얼 포트는 두가지 종류가 있는데 9pin과 25pin이 그것이다. 본 문서에서 필요로 하는 핀의 이름과 번호는 다음과 같다. 핀의 번호는 시리얼 포트 잭에 깨알만한 글짜로 씌여 있다. 자세히 살펴보기 바란다.

           9      25(pin)
DTR    4      20
DSR    6      6
DCD    1      8
GND    5      7

다른 핀들의 번호까지 알고 싶으시다면 UPS HOWTO를 찾아보기 바란다.

6. 프로그램 설정

  • powerd 2.0을 한 디렉토리에 풀어놓은 다음 컴파일하고 /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"라고 프롬프트에서 입력하면 자동으로 프로그램이 패치될 것이다. 이런 후 다시 컴파일하고 실행해 보기 바란다.

7. 배터리의 능력 알아내기

배터리의 용량은 UPS의 성능에 아주 큰 영향을 끼친다. 필자의 UPS는 태일자동제어시스템의 UX210S로 1.1KW급이다. 내부 배터리 만으로 최대 용량으로 사용할 경우 매뉴얼 상에는 4분간 사용할 수 있다고 씌여 있다. 현재 컴퓨터 4대와 모니터 2대를 UPS에 연결하여 약 450W정도를 쓰고 있는데 이 경우 배터리 저전압 경고가 나기 전 약 14분 정도를 사용할 수 있다. 경고 후에 2분이면 배터리 보호를 위해 UPS가 셧다운 된다. 따라서 최대 사용할 수 있는 시간 이내에 시스템을 셧다운 시켜야 한다. 시스템의 셧다운 시간은 리눅스의 경우 최소 2분 이상이어야 안전하다. 외부 배터리를 병렬로 연결하였을 경우에도 마찬가지로 용량 테스트를 해 보아야 하는데, 방법은 배터리 저전압 경고가 날 때까지의 시간을 기록해 놓으면 된다. 이때 한가지 주의점은 처음 배터리를 구입하였을 경우에는 배터리가 완전히 충전되어있지 않기 때문에 3일 이상 충분히 충전을 한 다음 시험을 해 보아야 한다는 점이다. 배터리가 완전히 방전된 후의 충전시간은 수시간 - 수일로 이것 역시 테스트 해 보아야 한다. 일반적으로 UPS의 12V짜리 배터리의 전압은 무부하 대기 상태에서 13.75V이다.

8. 기타 다른 가능한 것들

한 UPS에 두 대 이상의 컴퓨터가 연결되었을 경우에도 powerd를 사용하면 전원의 이상을 감시하는 서버와 나머지 클라이언트 컴퓨터로 전원 이상을 중앙관리를 할 수 있다. powerd의 readme를 읽어보기 바란다. 한편 윈도 엔티의 경우에도 리눅스와 마찬가지로 전원 관리를 할 수있는데, 핀의 배열이 조금 바뀌어야 한다. 이 내용은 UPS-Howto에 잘 나와있다.

9. 참고문헌

  • Rubin, A. 1995, powerd 2.0 README
  • Stein, H. J. 1997, UPS HOWTO v 2.02


ID
Password
Join
Promptness is its own reward, if one lives by the clock instead of the sword.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2003-08-10 11:52:30
Processing time 0.0022 sec