1993.1.19

SUBJECT: "vipw"에 대하여

DESCRIPTION:
0. "vipw" 등장의 배경
   * /etc/passwd file이 edit되는 동안 machine이 crash 나는 경우를 상정해 보자.
     물론 대개의 경우 system이 rebooting한 뒤 "vi -r"로서 recovery가 되지만
     예를 들어, tape 작업을 하다 root full이 나는 경우는 edit하던 file의 내용이
     몽땅 날라가 버리고 size가 0가 되는 것과 같은 경우에는 어떻게 대처할 것인가.
   * password file은 user가 system으로 login하는데 필요한 정보를 포함하고 있기 때문에
     system operation에 있어 매우 중요한 file이다.
     이처럼 중요한 file을 직접 edit한다는 것은 결코 좋은 방법이 아닐 것이다.
   * 이런 문제를 해결코자 몇몇 BSD 계열의 system에서는 "vipw"를 사용하여
     /etc/passwd file을 edit한다.
   
1. "vipw"란 ?
   * "vipw"는 /etc/passwd를 copy하여 /etc/ptmp라는 file을 만든다. 
     그리고 (default로) vi editor를 사용하여 /etc/ptmp를 open한다.
     edit가 끝나면 변경된 사항을 /etc/passwd에 write하고 /etc/ptmp를 지운다.
     따라서 /etc/ptmp가 edit되는 동안 
     /etc/passwd는 disk에 원래 상태 그대로 잘 보존되어 있을 것이다.
     앞서 password file edit시 system crash로 인해 password file 자체에 문제가 생기는
     현상 따위에서는 충분히 보호가 되는 것이다. 
   * 또 "vipw"를 사용하고 있는 동안 다른 window/terminal에서 "vipw"를 사용하여
     password file을 edit할 수는 없다.
     "vipw: password file busy"라는 message가 나올 것이다.
     물론 "vipw"를 사용하고 있더라도 다른 쪽에서 "vi"로 /etc/passwd를 열어 놓고 있다가
     "vipw"보다 나중에 save한다면 "vipw"를 사용하여 작업했던 것이 도로아미타불 될 것이다. 
     "vipw"는 /etc/passwd file이 아니라 /etc/ptmp file을  locking하는 것이다.
     그러므로 "vipw"는 "vi"가 /etc/passwd file을 어찌하는 것까지 막을 수 없는 것.
   * "vipw"가 사용하는 default editor는 vi이지만
     환경변수 "EDITOR"에 다른 editor를 setting하여 "vipw"에서 불러 쓸 수도 있다.

2. "vipw"와 /etc/rc file의 관계   
   * /etc/rc file에 보면 아래와 같은 script이 있다.
   +-------------------------------------------------------------------------------+
   |  # attempt to rationally recover the passwd file if needed                    |
   |  if [ -s /etc/ptmp ]; then                                                    |
   |          if [ -s /etc/passwd ]; then                                          |
   |                  ls -l /etc/passwd /etc/ptmp                                  |
   |                  rm -f /etc/ptmp         # should really remove the shorter   |
   |          else                                                                 |
   |                  echo 'passwd file recovered from ptmp'                       |
   |                  mv /etc/ptmp /etc/passwd                                     |
   |          fi                                                                   |
   |  elif [ -r /etc/ptmp ]; then                                                  |
   |          echo 'removing passwd lock file'                                     |
   |          rm -f /etc/ptmp                                                      |
   |  fi                                                                           |
   +-------------------------------------------------------------------------------+
   * system이 crash 났을 당시 "vipw"를 사용하고 있었다면
     /etc/ptmp file이 delete되지 않고 남아 있을 수 있고
     가능하다면 이를 통해 /etc/passwd를 recovery하도록 하는 routine이다.




Revision History
Created        on Jan. 19 ,1993