Axil S/E-ljs004
                                1993.5.6
                               Lee Jin-Soo


SUBJECT:   NIS (YP) 정리 1




  - NIS 정의

     NIS는 Sun에서 배포된 network lookup service이며, 몇개의 master node들로 완전히 복사하는
     database를 가지고 있다. 각 master mode는 database를 위한 server process를 수행하며 이것은
     NIS server로 나타내어진다. muntiple server는 database 일치를 보장하기 위해 그들 스스로
     수정된 database를 퍼트린다. 안정된 상태에서 , 어느 server process가 client request에 
     답할것인지는 문제가 되지 않는다. 그 이유는 server들의 대답이 동일하기 때문이다.
     이것은 network당 multiple server가 높은 유효성과 신뢰성의 NIS service를 주게된다.
     NIS Domain은 동일한 NIS database를 사용하는 하나의 network상에서의 node들의 집합이다.
     NIS domain들은 internet domain들과 sendmail domain들로 부터 다르게 설정될수도 있다.
     NIS domainname directory는 map집합들을 포함하는 /var/yp안의 directory이다.
     NIS server는 /var/yp의 subdirectory안에 있는 NIS domain의 모든 map들을 유지한다.
     예를들면, sunse domain을 위한 map들은 /var/yp/sunse안에 존재한다. 
     domain name은 NIS database로부터 data를 검색하기 위해 요구된다. 
     network상에서의 각 machine은 /etc/defaultdomain로 설정된 default domain에 속하고
     /etc/rc.local를 booting시 참조한다. domain name은 server와 client들 모두에 설정되야 한다.
     각 NIS map은 일련의 값들과 그들의 연관된 key들을 포함하고 있으며, 프로그램들은 이런 값들을
     조사한다. 대부분 현재 map들은 전통적으로 /etc directory에서 발견되는 ASCII file들로 부터
     추출된다. NIS map의 정보는 ASCII file안의 data와 유사하지만 dbm format으로 유지된다.
     모든 dbm file들에서, 하나의 NIS map은 구분할수 있는 mapname을 가지고 있고, 두개의 화일인
     mapname.dir과 mapname.pag를 보충한다. 
     예를들면, hosts.byname은 internet address를 찾기 위해 machine들에 의해 참조된다.
     hosts.byname database를 위한 정보는 hosts.byname.pag와 hosts.byname.dir인 두화일안에 저장된다.
     .pag로 끝나는 화일은 실제적인 map entry들을 포함하고 있다.


  - NIS Servers 와 Clients 

     NIS server는 일련의 NIS map들을 저장하고 있는 disk를 가진 machine이다.
     NIS server에는 master와 slave 두종류가 있다.
     Master server는 slave server들의 database를 update한다. 변화한 내용들은 master server에서
     NIS slave server들로 전달된다. 만약 NIS database들이 master server machine들 대신에 slave server
     상에서 만들어지거나 수정이된다면 NIS의 update algorithm은 파괴될것이다. 
     database 수정과 생성은 반드시 master server machine상에서만 이루어진다.
     Sun은 single domain상에서 만들어지는 모든 map들을 위해 single server master를 만들도록 요구하고
     있다.  다른 SunOS version에서도 NIS 환경을 지원하고 있다.
     Sun에서의 master server는 release 4.1이상에서 수행하도록 권장하고 있다. 그 이유는 좀더 빠른
     map transterring때문이다.

     . NIS Master Server
       1) master map들을 가짐
       2) master map들을 update함
       3) NIS slave server들로 master map들을 전달함
       4) NIS domain상에서 NIS client들에게 NIS service를 제공함
       5) ypserv 와 ypbind를 수행함

     . NIS Slave Server
       1) master NIS map들의 copy본을 가짐
       2) NIS master server로부터 copy본들을 받음
       3) NIS domain상에서 NIS client들로 NIS service를 제공
       4) ypserv 와 ypbind를 수행함

     . NIS client
       1) NIS network service를 사용하는 host
       2) server들의 map들로부터 data를 요구하는 process들을 수행함
       3) ypbind만 수행함


 
  - ypbind 와 ypserv

     NIS clinet들은 binding process를 통해 NIS server로부터 정보를 얻는다. 
     ypbind가 기억하는 정보를 binding이라 불린다. 
     binding은 NIS server의 internet address를 가진 domain name과 연류되있다.
     이런 정보는 domainname.version filename을 사용하는 /var/yp/binding diretory안에 저장되있다.
     binding process는 client request들에 의해 가동된다. binding이 broadcast에 의해 설정됨으로
     모든 net상에서 적어도 하나의 ypserv process가 있어야 한다.     
     일단 domain이 특정한 ypbind에 의해 bind되면 같은 binding이 그 node상의 모든 client process에게
     주어진다.
     binding과 rebinding들은 C 라이브러리 루틴에 의해 다루어진다. 만약 ypbind가 bind되어야할 
     ypserv에게 말할수 없을때 , unbound된 상태로서 domain을 형성하고 client process에게 그 domain은
     unbound상태라고 말하고, 다시 한번 domain을 bind한다.
     만약 file /var/yp/ypserv.log가 ypserv구동시 존재한다면, log information은 error 조건발생시
     이 file에 저장한다.
     file /var/yp/binding/domainname.version은 binding process 가속화를 위해 만들어진다.  
     이런 file들은 주어진 domain을 위해 생성된 최종 성공한 binding을 저장하고 , binding이 요청될때
     이 file들이 타당성을 위해 검사된후 사용된다.
     만약 /usr/etc/yp/ypset이 ypbind -ypset(option) 나오기전에 사용된다면, 그 명령어는 다음과 같은
     messages를 보이며 실패할것이다.

          Sorry, ypbind on host xx has rejected your request

     . NIS client는 booting시 NIS binding daemon (usr/etc/ypbind)를 수행함
     . ypbind는 NIS server를 bind하기 위해 request를 local area network로 broadcast함
     . NIS server는 NIS server daemon (/usr/etc/ypserv)를 수행함. 이것은 request를 만드는 client로
       binding함
     . client에 의해 만들어진 모든 NIS lookup request들은 ypbind에 의해 server machine상의 
       ypserv로 보냄
     . 만약 NIS server가 연속적인 binding후에도 반응하지 않는다면, ypbind는 다른 server로 bind하기
       broadcast mode로 돌아감
     . /usr/etc/ypset (ypbind에게 특정한 domain으로 bind하라고 알려줌)은 NIS 문제들을 debugging하는데
       도움을 줌. ypset을 사용하기전에, -ypset option을 가진 ypbind를 사용할것.
 
  - yppasswd 와 yppasswdd

     /usr/etc/rpc.passwdd는 NIS password daemon이다. 
     이 daemon은 NIS master server에서만 수행이되고 , NIS password change request들을 위해
     봉사한다. 이것은 모든 slave server들이 password 수정되었을때 그들의 변화된 database를 가지는
     형태로 수행된다.
     yppasswd는 NIS password들을 변화시키는 명령어이다. 이 명령어는 마치 password처럼 실행되지만,
     local /etc/passwd file대신에 NIS master server안의 password를 다룬다. 
     NIS client에 의한 yppasswd 명령어는 NIS master server상에서 수행하는 rpc.passwdd에 의뢰한다.

  - NIS에 의해 영향을 받는 화일들

     . /etc/passwd file은 NIS가 수행될때 처음 국부적으로 참조된다. local passwd안의 data는 
       NIS database보다 우선권을 가진다. 
       local passwd file안의 entry들은 root와 어떤 다른 local user들을 위해 존재해야 한다.
       /etc/passwd를 call하는 program들은 처음에 local password를 참조한후 NIS database를 참조한다.
     . /etc/group file도 우선 참조된다. 역시 NIS database보다 우선권을 가진다.
     . NIS 수행시 /etc/hosts file은 booting시만 참조된다.
       그것은 boogin시만 참조되기때문에 그 화일은 local host name과 모든 machine들을 위한 entry를
       가지고 있어야 하며, local loopback를 위한 entry는 localhost임.
              127.0.0.1     localhost
              192.9.10.101  sparc
       일단 host가 boot되면 host address를 분석할때 NIS host database만이 참조된다.
     . Mail aliases도 local machine /etc/aliases file을 먼저 점검한후 NIS aliases database를 
       참조한다.
     . NIS 수행시 부가적인 mail aliases는 NIS server들상의 mail.aliases map안에 위치한다.
       local /etc/bootparams file은 동일한 NIS map이 참조되기 이전에 client의 boot 정보를 위해 
       참조된다. 




  - /etc/passwd

     +::0:0:::  --> 모든 NIS password database entry들은 이 host에서 합법적임.
                        이 항목은 /etc/passwd안에서 마지막에 존재해야 한다.
                        이 표시는 /etc/passwd를 call하는 program은 처음 여기 password file을 조사할
                        것이다. 만약 user가 여기 passwd file에 없으면 NIS password database가
                        조사될 것임. 
     +ljs:      --> ljs는 이 host에서 합법적이며 여기의 password data는 NIS database안에 있음.
     +ljs:::::/home/ljs:  --> ljs는 이 host에서 합법적이며,빠진 password항목은 NIS database안에
                                   있다. local password entry안에 나타난 data는 NIS password data를
                                   무시한다. 만약 NIS password database상에서 home directory가
                                   /usr/ljs라면, login후 ljs의 home directory는 /home/ljs가 됨.
   
  - /etc/group

     +source:  --> NIS group database에서 정의된 source group은 이 host에서 합법적임.
     +:            --> NIS group database에서 정의된 모든 group들은 이 host에서 합법적임. 

  - NIS에 의해 교체되는 화일들

    이런 화일들은 NIS 수행시 local machine상에서 결코 참조되지는 않는다.
    비록 원하는 정보가 local file들에 존재한다 하더라도 이런 화일들에 포함된 정보를 조사하기 위해선 
    NIS database만 참조된다.
    
    . /etc/ethers  --> local domain상의 모든 machine들의 ethernet address와 host name을 포함함.
    . /etc/netgroup  --> machine들의 network group들을 나타냄.
    . /etc/netmasks  --> IP stanadard subneting를 실행키위한 default netmask를 포함함.
    . /etc/networks  --> 여러분의 internetwork상의 모든 network들의 이름과 번호를 나타냄. 
    . /etc/protocols --> 알려진 IP protocol 이름들과 번호들을 포함하고 있음.
    . /etc/services  --> 그 system에 유용한 각 TCP/IP network service를 위한 entry를 포함함. 

  - NIS Master Server 초기화

    1) domain name을 설정함
        
        # domainname  sunse
    
    2) /etc/defaultdomain file을 수정 혹은 생성
        NIS domain name을 부가함
    
    3) /etc/rc.local 화일을 수정함
       . ypbind startup line들이 풀려져 있는가를 확인함
       . bootup시 /usr/etc/rpc.yppasswdd를 가동시키기 위해 다음과 같은 라인들을 첨가시킴
         다음 라인들은 ypserv daemon 정보다음에 삽입시킴

          if [ -f /usr/etc/rpc.yppasswdd -a -d /var/yp/`domainname` ] ;
                  then /usr/etc/rpc.yppasswdd /etc/passwd -m;
                  echo -n ' rcp.passwdd '
          fi
    
         위의 -m flag는 /var/yp안에서 발견되는 NIS map들을 정정하고 그 변화들을 slave server들로
         push하기 위해 열거했음.
       . 여러분은 NIS master 상의 user들을 위한 /etc/passwd와 모든 NIS user들을 위한 /etc/passwd.yp
         를 원할지도 모른다. 이런 경우는 다음과 같은 절차를 거치면 된다. 
           첫째   /var/yp/Makefile에서 $(DIR)/passwd를 $(DIR)/passwd.yp로 수정함 
           둘째   /etc/rc.local의 yppasswdd상에서 /etc/passwd를 /etc/passwd.yp로 수정함 
       . 고속 transfer daemon을 가동시키기 위해 ypxfrd startup line들을 comment out 시킴

    4) NIS database상에 포함된 ASCII file들을 수정함
        이런 화일들은 passwd , hosts , ethers , group , aliases , netgroup , networks , netgroup ,
        protocols , bootparams , services 임
        passwd와 group화일들에서 + entry들을 제거함 ( 공백 netgroup은 빈 netgroup map을 만듬)





    5) database를 만듬
       
         #  mkdir  /var/yp
         #  cp  /export/exec/proto.root.sunos.4.1.x/var/yp/Makefile  /var/yp
             (이 작업은 suninstall과정에서 NIS master를 설정하지 않았을시 /var/yp가 없기때문임)
         #  cd  /usr/etc/yp
         #  ypinit -m   (여기서 m은 master server)
              quit on non-fatal errors [y/n:]  y
              next host to add : master    /* mastername
              next host to add : slave     /* slavename --> 만약 여러분이 어떤 server가 NIS slave 
              next host to add : ^D                      server가 될지 안다면 여기서 이름을 입력함 

    6) fastboot를 사용하여 reboot함 
        모든 daemon들을 올바르게 가동시키기 위해서는 reboot하는 것이 쉽다. 
       

  - NIS Slave Server 초기화  

    1) domain name을 설정함
  
    2) /etc/defaultdomain file을 수정 혹은 생성
        NIS domain name을 부가함

    3) /etc/rc.local 화일을 수정함
       . ypbind startup line들이 풀려져 있는가를 확인함

    4) ypbind daemon을 가동시킴
        
         # /usr/etc/ypbind

    5) /usr/etc/yp directory로 변경후 slave server mode상에서 ypinit를 가동하여 master로부터
       database를 모은다. 

         #  cd  /usc/etc/yp
         #  ypinit -s  master   /* mastername
              quit on non-fatal errors [y/n:] y  
 
    6) NIS server daemon을 reboot하여 가동시킴
    위의 과정은 slave server가 master server install동안에 언급이 되었을 경우에 사용된다.
    
  - NIS client 초기화

    1) domain name을 설정함
          
         #  domainname  sunse

    2) /etc/defaultdomain file을 수정 혹은 생성
       NIS domain name을 부가함

    3) /etc/rc.local 화일을 수정함
       . ypbind startup line들이 풀려져 있는가를 확인함

    4) /var/yp directory가 존재하는가를 확인함. 없으면 만들어줌

    5) NIS binding daemon을 가동시킴

         #  fastboot









  - Master NIS Server Database에 Slave Server 첨가
    
    slave server가 현존 NIS domain에 부가될때, NIS master는 첫째 new slave에 대해 알아야 한다.
    만약 그렇지 못하다면, master는 모든 다른 NIS server들과 더불어 sync상태에서 new slave를 
    유지할 수가 없다.
    그래서 new slave server의 첨가는 다음과 같이 행해져야 한다.

    1) ypinit -m 과정을 사용하여 NIS master를 재초기화함

        mastername#  cd  /usr/etc/yp
        mastername#  ypinit -m 

    2) 새로운 slave의 이름을 master가 아는 NIS slave들의 list(NIS domain)로 등록함
       
    3) 다른 slave server들 처럼 같은 방법으로 new slave server를 초기화함
        
  - Sync상에서 Slave Server들 보존

    최근의 slave server map들을 유지하기 위해 /usr/etc/yp/ypxfr 명령어가 slave server들상에서
    수행된다. 어떤 map들을 전달하기 위해 이 명령어를 이용하는 shell script들이 존재한다.
     (예 : ypxfr_1perday , ypxfr_1perhour , ypxfr_2perday)
    site상황에 맞추어 적당하게 script들을 수정해라.
    이런 script들은 /var/spool/cron/crontab/root entry에 의해 항상 수행된다.  
    ypxfr의 transfer 시도와 결과는 ypxfr.log라는 log file안에 나타난다.
    다음과 같은 명령어를 사용하여 log file를 만든다.

          #  touch  /var/yp/ypxfr.log

    logging을 없애기 위해선 단순히 ypxfr.log file을 제거하면 된다.

    . master에서 slave로 map을 전달하기 위해선 slave server상에서 다음과 같은 명령을 사용해야 한다.
          
          #  /usr/etc/yp/ypxfr  desiredmap

    . /usr/etc/yp/ypxfr_1perday는 다음 map들을 변화시킨다.
         group , protocols , networks , services , ypservers
    . /usr/etc/yp/ypxfr_2perday는 역시 다음 map들을 변화시킨다.
         hosts , ethers , netgroup , mail aliases
    . /usr/etc/yp/ypxfr_1perhour 다음 map들을 변화시킨다.
         passwd
    . slave server들로부터 이런 script들을 수행한다.

  - NIS 환경에서 Diskless Client 초기화

    NIS 환경에서 diskless client첨가를 위한 작업은 NIS없이 사용되는 과정과 유사하다. 
    그러나, /etc/host 와 /etc/ethers정보는 중심위치에 저장되기 때문에 우선 NIS master server상에서
    이런 data를 입력할 필요가 있다.
    그때 NIS map들을 다시만든다. 그래서 diskless client server는 그런 정보를 얻을수 있을 것이다.
    만약 그 client를 위한 /etc/ethers와 /etc/hosts정보를 얻지 못한다면 add_client수행시 실패할 것이다. 
    . NIS master server로 client 정보를 첨가시킨다.
       /etc/hosts    
       /etc/ethers
    . NIS map들을 다시만들어 push시킨다.
    . client의 server상에서 add_client 를 수행시킨다.
    . NIS master server상에서 bootparams를 다시만들어 push시킨다.
    . diskless client의 server에서, client의 /etc directory안에 있는 entry들을 확인한다.
    . directory들을 /export/root/client/etc로 바꾼다.
      hosts 화일이 정확한지를 확인한다.
      defaultdomain안의 domain name을 설정한다.
      /etc/rc.local에서 ypbind startup line들이 commentout되있는지를 확인한다. 
    . diskless client를 boot시킨다.






  - NIS Database를 Updating

    . NIS master machine상에서 적당한 ASCII file를 변경한다.
    . local map을 update하기위해 make 명령어를 실행시킨다. 이 작업은 update된 version을 
      NIS slave server들로 보낸다.
    . 예를 들면, /etc/passwd file를 update한다.
       단지 NIS machine상에서만 --
       
          mastername#  vipw     file를 수정하여 변경함 
          mastername#  cd  /var/yp
          mastername#  make 
    . make는 변화된 map들만 다시만든다. 
      변화들이 끝났을때, make는 NIS slave server들의 map들을 update하기 위해 yppush 를 야기시킨다. 

  - NIS 명령어

    . /usr/bin/ypwhich     --> 여러분의 NIS server가 누군지를 보여줌
    . /usr/bin/ypwhich -m  --> 어떤 map들의 master가 어느 server machine인지를 보여줌  
    . /usr/bin/ypwhich clientname  --> 어떤 ypserver가 NIS client machine으로 service를 제공하는지를
                                        보여줌
    . /usr/etc/yp/yppush   --> NIS master server에서 수행하며 master NIS server에서 slave NIS
                               server로 NIS map의 새로운 version을 copy함
    . /usr/etc/yp/ypset host  --> 특정한 NIS server로 bind를 시도함
    . /usr/bin/ypcat map   --> NIS map의 내용을 보여줌
    . ypmatch key0 key1 map  --> NIS map안에 있는 특정한 key들의 값을 보여줌