Subject : 시스템장애분석(savecore,hangup,Panic,watchdog-reset)


Description :


1. Hangup
2. Panic
3. Watchdog Reset


 

  < 1. System Hangup>


1. What is a system hang ?


- System hangs 는 system admin 에게는 커다란 좌절이 될수가 있다.  잠시동한 모든 sysetm admin 은 하나의 시스템을 보고 그것이 살아있고  죽고, 상당히 속도가 늦어지는것을 보게되고 얼마후 "hung" system 을   보게된다.

System hang 은 매우 다양한 종류의 원인을 가지고 있지만

그들은  한가지 공통적인 징후를 드러낸다. 시스템은 더이상 완전하게 사용되지않는다.
항상 시스템이 완전하게 사용될수가 없게되는 panics 과는 달리 system hang 은 

system resources 를 천천히 잡아먹어 마침내 완전하게 useless system 이 된다.


- kernel errors 를 볼때에 당신은 모든시스템이 core dump 로써 panic 을 유발하는

문제를 일으키지는 않는다는것을 알게될것이다.

가끔은 시스템들은 hangup 이되고  우리는 memeory 의 내용을 조사하기위하여 core dump 를 일으켜서

hang 을 만들게된  원인을 알아보는것이 바랍직하다.


2. What conditions cause hangs ?


- system hang 의 일반적인 원인은 deadlock 또는 하나의 process 가 다른 process에 의해 lock 되어있는 무엇인가를 waiting 하며 다른 process 는 처음 process가 lock 해놓은 resource 를 기다리는 상황이다.

- System hangs can also occur when resources dry up and the system has to sit
  around waiting for more resources before it can continue doing what was
  asked of it.


- 가끔, system 은 hardware problems 에 의해 hang  이 된다. 예를 들면,
  디스크 드라이버에 붙어있는 data transfer cable 의 문제는 system 과
  disk driver 사이의 communication problem 을 일으킨다.  그 결과는 bus 를 hung 하게 만든다.


- application 이 loop 에 빠져 hangup 이 되었을때에 그 시스템의 다른 user 는영향을 받지않는다.

즉, 그 process 동안에 disk 를 먹거나 두개 또는 다른 kenel resource 를 먹지만 않는다면 hung program 이

그 system 의 나머지에게   영향을 주지않는다.


- Hangs 은 다양한 조건에의해서 발생하며 서로다른 특성을 가지고 있다.


* 우선 시스템은 hangup되어있는 시스템으로부터 하나의 low-level ICMP request를 보내게하는 명령어인

ping 에도  응답을 하지않는 시스템이 있을수 있다.
만약에 응답을 한다면 kernel 은 그 순간에도 network interrupts 에 대해 충분히인식하고

응답을 할수가 있다는것이다.


* 시스템은 keyboard 의 characters 에 echo 소리만 내거나 mouse movements 는 있지만 입력되는 command 나 abort sequence 에 조차도 응답을 하지 않는경우가있다. 이것은 process 가 계속수행전에 resources 에새해 availabel하게되기를기다리는 상황 , 즉 deadlocks 에 의한 hang up 일수 있다.

이경우에는 그process 들은 결코 ready 상태가 되지않는다. ps 의 output 은 아마 D wait state 에 많은 process 를 볼수가 있을것이다.

* 만약에 keyboard 의 echo 조차도 전혀없는 완벽한 hangup 인경우는 아마 STREAMS problems 일수가 있다.

가끔 L1-A 조차도 이 경우에는 소용이 없다.

* Server systems 에서는  CPU B/D 상의 LEDs 가 그 시스템의 상태를 나타낸다.

정상적인 경우는 bounce 또는 regular moving light 이다.

만약에 동작은 하지만 매우 속도가 늦을때에는 그 시스템은 매우 busy 상태이다.
이것은 kernel 이 loop 이거나 하나 또는 그 이상의 modem lines 과 같은 external device 로부터의

대량의 interrupt 때문이다. Frozon lights 는 H/W problem 을 나타낸다.


3. Capturing system hang information


- 대부분의 경우 hung system 의 crash dump 는 강제적일수가 있다.

그러나 이것은  모든 system hang conditions 에 대해 not guaranteed. 강제적으로 dump 를 하려면,

당신은 boot PROM monitor 로 내려야 한다.
Suspending all current program execution. It`s L1-A.
On systems using ASCII terminals for the console, usually the Break key can
be used to get to the boot PROM monitor.


- 모든 hang situations 이 interrupted 되지는 않는다.

만약, L1-A 가 작동을 하지 않는다면 가끔 console keyboard 를 뽑거나 몇분동안 terminal 을 뽑는다. 

이 모든것이 실패로 돌아가면 시스템을 power down 하는수밖에 없다.


4. Sun-4d

 

- psrinfo (print processor info) 와 psradm (processor admin)  command 는
  status display 와 multiprocessor system 의 control 에 유용함.


- sun4d system  ( SPARCserver 1000, SPARCcenter 2000) 은 시스템진단에 유용한
  특별한 H/W 특성외에 prtdiag 라는 새로운 command 가 있다.


- 두개의 서로다른 종류의 watchdog reset  이 있으나 보통 H/W problem 을 나타냄.
  시스템의 watch dog reset 은 보통 H/W error 에 의하므로 시스템을 reset 시킴.
 
- POST routines 은 watchdog reset 에 관한 information 을 저장하므로
  prtdiag -v 라는 command 로써  확인 할수가 있다.


- A local CPU watchdog reset occurs when a single processor is reset due to
  a trap occuring when traps are disabled ( a  "standard" watchdog).
  The system drops into the OBP.



  < 3. Panic >


1.What happened ?


- Computers crash. It's just a fact of life.
  Depending on the H/W and S/W. 일부는 자주발생하고 일부는 전혀발생하지 않는다.


- UNIX 가 존재한이래로 UNIX system crash dump 를 분석하려는 사람이 많고
  이 사람들은 UNIX system 이 crash 후의 만들어진 files 으로부터 원인을 분석할  수 있게 되었다.


2. What is a system crash ?


- UNIX  에 따르면 1970 1 월 1 일 자정으로부터 computer systems 은 crash 가 발생.
 
- System crash 는 종종 다음과 같은 조건에서 갑자기 system 이 사용할수 없게됨.
  ( System panics & bad traps, Watchdog resets, Dropping out to boot PROM)


3. What conditions cause panics ?


- 어떤이는 panics 을 혐오한다.그들은 아마 시스템과 data integrity 를 안전장치(safeguards) 로

생각하는것 같다.


- 시스템 panic messages  는 두가지중의 한가지의 원인이다.


   software consistency check, hardware fault.

 

- 훌륭한 O/S programmer 는 system resources 의 integrity 의 checking 을 할때에
  그 code 내에 panic() routine 을 끼워넣어 referencing 과 manipulating 을 한다.


예를들면,  시스템 프로그래머 의 program code 에서 지금현재 사용중이라고
알려진(marking) disk 의 한 block 을 이제 막 free up 시키려고 할때에 그는
먼저 그 디스크가 아직도 사용중인것으로 mark 되어있는지를 검증할것이다.


만약 그 block 이 갑자기 그가 free 하기전에 free 된것으로 mark 되어있고 그것을 알았을때

그의 code 는 그것을 freeing 하면 안된다.

그러나 어떻게 그 block 이 요술처럼 free 되었을까? 어떻게 , 어디에서, 무엇이 엄청나게 잘못되었는가?
이때 panic() 을 call 하면서 system programmer 는 그 system 을 갑자기 중지시킬수 있으며

이렇게 함으로써 시스템을 보호하고 그 problem 이 발견될때까지 추가적인 corruption 을 예방한다.


- panic() 은 오직 O/S 가 kernel mode 에 있을때만 call 된다.

그러나 O/S 에 있어서 bug 를 실험하는 어떠한 program 이라도 panic 을 일으킬수가 있다.

예를들면 debuggin 중인 새로운 device driver 를 사용하는 user program 에서 driver 가
사용될때마다 kernel mode 로 움직이게된다. 한번 kernel mode 에 있게되면,
panics 은 일어날수가 있다. 그의 program 이 panic 을 일으킨 것은 그 user 에게
나타나게되지만 실제 그의 프로그램은 단지 panic 으로 유도하게 되는 events 의
trigger 가 된것이다. 즉 간단히 말하면, 만약 시스템이 panics 이 나면
바로 시스템이 data 의 integrity or  data 의 corruption 이 의심되는 조건을
 감지했가 때문이다.

- data integrity concept 을 user level programming 의 관점에서 살펴보자.
  만약 당신이 하나의 화일을 open 하는 프로그램을 open() system call 을 사용하여
  프로그래밍한다면, 당신은 아마도 다음 단계를 넘어가기전에 실제로 open 이 성공
  했는가를 open() status 를 check 할것이다.만약 open() status 가 fail 이면
  당신의 program 은 아마 이 것을 report 하고 exit 하거나 새로운 file name 을
  위해 prompt 를 내거나 간단히 다음 course 의 action 을 취할것이다. 여기서
  만약 당신이 open() system call 로부터 넘어온 status 를  무시한다면 향후에 이
  line 에 와서는 어떠한 잠재적인 문제에 부딪힐것이다. 당신의 data integrity 는
  위험에 놓일것이다.

- 당신이 운전하는 자동차 는 panic() routine 과 비슷한 어떤것을 가지는가 ?
  만약 air bag 이 장착되어 있다면 답은 yes 이다. 당신의 차가  갑자기 앞 범퍼가
  high-speed collision 과 같은것을 감지했다면, air bag 이 부풀러져서 운전자를
  보호하게 될것이다.

-  Software(Kernel) 는 수많은 hardcoded validity tests 를 포함하고 있는데,
  이것은 invalid pointers 또는 impossible conditions before continuing 을
   checking 하게된다. panics 은 두가지 types  중에서 한가지가 될수있다.
   a regular panic messages, or an assertion 이다.
   - 이전부터의 panic messages 에 대해서는 당신이 보통 얻을수 있는것은
   messages 그 자체이다. 이것들은 unique 한 그 자체이며 정확히 그 문제를
   나타내 준다. 당신은 source code 내에서 그것을 한번 볼수가 있다.

- Assertion messages 는 "panic: assertion failed" 라는 messages 에 이어서
   erroneous condition을 나타내는 messages 를 console 에 prints 하는
   macro 로 부터 유래한다. 이 경우에, 관심있는 article 은 panic: 에 선행하는
   condition message 이며 이것은 test, file, 그리고 그 code 내에 line number
   를 나타낸다.

- 갑작스런 hardware traps  은 panics 을 일으킨다. 이것은 일반적으로
  kernel 로 부터의 invalid address 가 access 되는 경우이다.왜냐하면 OS 는
  page 되는것이 아니므로 kernel code 로 부터의 fault 는 즉각적인 죽음(immediate
  death) 의 원인이다. software panic messages 와 달리 hardware traps 은 정확한
  시스템의 상태를 나타내며 console 에 print 되는 traceback 으로 귀결된다.
  이것은 보통 또한 /var/adm/messages file 에 나타나게 된다.
 
- 보통 panics 는 hardware-related or detected fault 를 나타낸다.
   종류는.
    - trap : for any unexpected trap into or from kernel mode
    - bus error(Sun-3) : a kernle segmentation violation.
    - text fault : an attempt to fetch an instruction from a bad place.
    - data fault: generally an erroneous pointer
    - address alignment: also generally a bad pointer.
    - illegal instruction : possibly an attempt to execute "data"


4. A word about bad traps

- Computer system 은 H/W 에서 일어나지말아야 할 조건이 감지된다면 또한 crash
  를 낸다. UNIX system에서 이러한 종류의 crash 를 "bad trap " 이라고하며
  system admin 의 관점에서 본다면 bad traps 과 S/W panics 는 동일한 방법으로
  다루어져야 한다. UNIX systems 은 하루에 수백만의 traps 을 수행한ㄷ.
  그래서 당신이 trap 을 듣게된다면 panic  이라고 하지말라. 그러나 드문경우에
  당신은 bad trap 을 만날수가 있다. 당신의 UNIX system 이 그렇다면 그것은
  panic() 을 invoke 할것이다.


- SPARC terms 에 있어서 trap 이라는것은 kernel code 로의 즉각적인 분기를
  일으킨다. 즉 정상적인 instructions  의 수행을 중단(interruption).
  이러한 interruption은 user request(a system call) 또는 일부external
  event ( a page fault, a disk interrupt, a keystroke) 가 원인이 될수있다.
  어떤 경우에도 interrupt 는 H/W 와 very low-level sofrware 에 의해
  processing  된다. 그래서 어떻게 traps 이 수행되고 어떻게 처리되는지에 대한
  것은  그 시스템의 architecure 를 이해해야한다.
  CPU H/W 는 trap 의 type 을 인식하고 그것을  처리하기위해 정확한 위치를
  알려고 시도한다. kernel 은 적당한 trap handling code 가 미칠수 있도록
  확실히 하기위해 몇개의 control registers 를 setup 해야만 한다.
  한번 시스템이 구동되고 user processes 가 running 되면, 하나의 trap 은
  kernel 이 하나의  user program 으로부터 control 을 갖게될 유일한 방법이된다.
  trap 이라는것은 하나의 user request 가 process되고 ( kernel 은 user program
  위에서 running) 하나의 device 가 control(kernel 은 몇개의 external request
  때문에 running) 되는 수단(means) 이다.

5. Kinds of traps

- 두개의 기본적인 trap 이 일어날수가 있는데 synchronous 와 asynchronous 이다.
  Synchronous trap 은 opeation  이거나 instruction 중에의해 발생할수있다.
  이것은 실제 trap instruction 이 될수도 있고 또는 bad address alignment,
  bad address(bus timeouts), illegal instructions, floating-point coprocessor
  error 같은 H/W  error 일수도 있다. 이러한 traps 은 즉시 받아들여진다.
  즉, H/W 는 kernel space 을 위해 H/W 의 tracks 과 heads 내의  현재 instruction
  의 operation 을 중지시킨다.

- Asynchronous trap  은 processor 에서  어떤상태를 변경하기전에 발생한다.
  이리하여 그 trap 이 복구가능한 H/W fault 에 의해 일어났을때에는  그
  instruction 은 한번 그  trap handling 이 끝났을때 그 문제로부터 recovery
  하기위해 restart  한다. page faults 는 좋은예이다.
  Asynchronous trap 은 언제나 request 될수가 있으며 하나의 instruction 이
  완전히 끝났을경우에만 processing 될수가 있다.
  이러한 traps 은 interrupts 와 같은 external events 에 의해 일어남.
  이 traps 은 instruction 의 operation 에는 영향을 미치지 않으며 단지
  instruction stream 에서의 break(분기) 를 일으킨다. 이것은 마치
  kernel 에의 subroutine call 이  kernel 내에 눈에 보이지 않게 심어져 있는것
  과 같다. 

- 두가지traps 전부 user program  과 kernel 내부에서 수행될수가 있다.
  둘다  switch 를 kernle 또는 supervisor mode 로 분기시킬수가 있고 kernel trap
  code 로 controle 을 transfer 하며 여기서 software 가  그것에대해 할일을 결정.
  이리하여 user program 으로부터의 page fault 는 일반적으로 acceptable 하며
  kernel 은 적당한 page 를 load 할것이며 instruction 을 계속하게한다.
  kernel 로 부터의 page fault 는 그러나 bad news 이고 trap code 는 panic 으로서
  stop 하게 된다.

6. Trap sequence

- H/W 는 그 trap  이 synchronous fault 또는 asynchronous interrupt 이던간에
  operation 의 한 sequence 를 수행한다.
  interrupt requests, page faults, illegal instructions, or system calls 은
  모두 동일한 방법으로 handling 된다.
  trap recognition sequence 는 kernel 에게 control 을 전달하고 kernel 또는
  supervisor mode 로 trap 이 발생한 곳과 trap 의 종류에 관해서 save 된
  information 을 가지고 들어간다.

- trap sequence as performed by the H/W looks like:
  1) Recognize the trap
  2) Get to a new window ( an implicit save instruction)
  3) Set TBR according to the trap type
  4) Force a branch to the trap instructions. - the address in the TBR

- Enable Traps bit 를 turning off 하는것은 interrupt recognition을
  delay  시키기 때문에  가능하면 최대한 짧게 해야하며 그 code 는 매우 주의
  하여 writing 되어야하며 만약 하나의 trap 이 disalble 되었을때에 요청되면
  watchdog 이 일어날것이다.

- current window pointer(CWP, in the Processor Status Register) 는 현재
  사용되고 있는 register 를 가리킨다.  registers 는 circular buffer 처럼
  행동하므로  완전한 register set 을 통하여 원형으로 돌게된다.
  곧 그것은 overlap 이되고 new register window 가 가리키는것은 실제로
  사용하기위한 free 가 아니다. 이러한 경우가 바로 window overflow trap(or
  a window underflow,when moving in the other direction) 의 source 이다.
  그리고 이순간의 trap 은 watchdog reset 을 일으키므로  CWP 는 실제 바뀌어
  져서 invaild window 를 가리키는 point 가 된다. 이러한 이유를 위하여
  H/W 와 S/W (trap handling process)  는 단지 local(%l0-%l7) registers 을
  사용할수가 있다. 다른 registers 는 touch 되어지지않는다.
  이것은 stack  상에서 nonstandard stack frame 을 만들며 예를들면 return
  address (in %i7) 은 실제 valid pointer 가 아님.
  Trap Base Register 는 보통 시스템의 초기화 과정에서 한번 setup 이되며
  일부 page boundary 를 가리킨다.

          Trap Base Address           Trap Type   0000
             (20 bits)                 (8 bits)

  - lower bits 는 항상 0 이며 다음 8 bits 는 trap type field 로서 H/W 에서
   정의된  trap 의 type 에 근거하여 자동적으로 채워진다.

7. Trap frames

- trap frame 은 구조적으로  stack frame 의 다른 type 과 다르지 않다.
  trap frame 은 local register %l1 에 있는 trap 을 일으킨 instruction의
  주소를 가지며  local register %l2  에 next PC address 를 가진다.
  이것은 위에서도 말했지만  H/W 에 의해 행해진다.
  trap 을 handling 하는 S/W 의 기능은  registers 와 같이 다른일을 할지도
  모르며 그러나 보통, 최소한 PC address가  %l1 에 가능하다.
- Synchronous traps resulting from an instruction 은 보통 stack trace
  바로뒤에 trap fram 이 나타나는 fault function 또는 trap function 으로부터
  하나의 frame 을 갖는다.
- 보통 external device interrups 에 의해 발생하는 Asynchronous faults 는  
  interrupt-handling code 에 의해 인식될수가 있다. 이것은 hardclock 인
  clock function 이 될수도 있고 또는 하나의 특별한 interrupt level(level 10)에    전용인 특정한 code 가 될수도 있다. interrupt 나 fault handler 같은 이런
  functions 에 참조하는 stack 상의 address 로  return 하는것은 보통
  바로 앞의 trap frame 를 가리킨다. code address in %l1 과 같은 frame 을
  주의깊게 보면 보통 그 address 는 in %l2 더하기 4 가 된다.
  Device interrupts 는 보통 interrupt service routine 의 이름에 의해 인식되며
  이것들은 보통 int 로 끝난다. 예를들면 zsint() 는  ZS(serial keyboadr/moust)
  device 를 위한 service routine 이다.

8. Trap types

- 각 trap type 은 unique 한 number 를 가지며 이것은 Trap Base Register 를
  수정하는데 사용되며 그리고 CPU 를 정확한 trap-handling routine 으로 지시하는데
  사용된다. SPARC chip Specs 에 의해 할당된 types 는 보통 그들의  Priority 에
  대충 일치한다. trap priorities 는 단지 동시의 trap 또는 interrupt requests가
  나타날때에만 중요하다. 몇개의 Bad Trap panics 를 본후에는 이러한 것들이 당신
  에게는 익숙할것이다. (data fault 예를들면, trap tyep 9 )

- 가장 일반적인 trap types 과 의미
   1 : Illegal instruction access(text fault)
   2 : Illegal instruction
   3 : Privileged instruction
   4 : Floating-point disabled
   5 : Window overflow
   6 : window underfolw
   7 : Memory address alignment error
   8 : Floating-point exception
   9 : Data access exception ( data fault)
   17: Interrupt level 1
   18: Interrupt level 2 up to
   31: Interrupt level 15
   128: Software trap #0 up to
   255: Software trap #127

9. Retunring from traps

- 시스템은 interrupt 된 code 또는 trap 이 발생한 code 로  돌아갈수있어야만
  한다. 여기에 rett 라고하는 하나의 특별한 instruction 인 return from trap
  operation 을 수행하는 것이 있다. 이것은 H/W 가 trap 을 인식했을때 발생한
  events 의 sequence 를 원위치 시킨다.

10. panic() routine.

- panic() routine 은 갑자기 모든 정상적인 process scheduling 을 interrupt 함.
  user 의 관점에서 본다면 시스템은 죽은것이다. panic() 은 그 memory 의 내용을
  dump device 에 그대로 copy 하게된다. default 로, dump device 는 보통 primary
  swap device 이다. dumps 를 위해서 disk 의 분리된 chunk 를 사용하는것을 보기는
  힘들다. 그러나 그러한 방법으로 setup 도 가능하다. 대부분의 UNIX systems 에
  있어서 dump device 는 반드시 하나의 disk partition 이 되어야한다. 일부시스템은
  tape drive 가 명시되기도 한다.

- panic() 은 현재의 CPU 상태에 대한  critical information 을 기록한다.
  이러한 information  은 CPU registers, stack pointer, 그리고 다양한 state
  register 를 포함하고 있다.

- 한번 panic() 이 dumping memory 를 dump device 에 완성하게되면
  시스템을 reboot 한다.


11. Panic messages

- system programmer 와 현재의 operation 에 따라서 일부 panic messages 은 꽤
  간단해질수가 있다. 반면에 다른것들은 상당히 자세하게 messages 를 제공한다.
  즉, 가끔 당신은 calling program 의 name 이나 사용되고 있는 variables 뿐만
  아니라 그 source 의 line number 까지 보게될수도 있고 단지 programmer 만이
  알아볼수있는  다소 cryptic word 도 볼수있다.


12. Kernel Tracebacks

- panic 의 원인을 정확히 결정하기 위해서는 source code  가 필요하지만
  stack  을 봄으로써 가끔 문제의 본질로서의 실마리를 제공하는 흥미있는
  information 을 제공받을수가 있다.
  Sun-3 systems 은 function call 을 위하여 parameters 를 stack 상에
  push 하지만 Sun-4/SPARC systems 은 registers 를 사용한다.
  이리하여 Sun-3 stack traceback 은 다양한 parameters  를 보여줄것이다.
  그러나 SPARC stack 은 항상 정확히 six parameters 만 보여준다.
  이것들중의 일부는 registers  를 scratch(erase) 할수도 있지만 다른일부는
  유효하다. 즉, 얼마나 많은 parameters 가 pass 되었는가를 알기위해 그 code
  를 check 하지않고서는 알 방법이 없다.

- stack traceback 은 보통 그 code 가 죽었을때에 call 한 마지막 routine 을
  보여준다. 즉, H/W fault 에 대해서는 actual location 에서의 PC value.
  adb 의 ?i 는 real function 을 나타내준다. 사용해보라.또한,
  SPARC system 을 위해서 traps 은 erroneous traceback 과 같이 보이는
  다른 registers 에 PC value 를 저장하게된다, Sun-4 systems  의 많은경우
  당신은 trap function 의 바로 앞 address 를 무시하게되는데 왜냐하면
  반드시 유효하지는 않기 때문이다.
  비록, 실제로 parameter 가 무엇인지를 결정하는것이 쉽지는 않지만,
  첫번째 몇개의 registers 에 있는 여러개의 zeros, small constants, or odd
  numbers 는 chain 으로 내려오면서 전달된 bad parameters 를 나타낼수가 있다.

- Many times device drivers are involved.
  Check for these in the traceback.
  driver routines 은 일반적으로 2 or 3-letter abbreviation 으로 시작되며
  이것은 그 function 의  이름으로 수행되고 boot time 때 probe routine 에
  의해 device 의 이름으로 printed 된다.
  STREAMS-related 인 str 로서 xystrate,zsopen, stwrite 가 있다.
  또한 interrupt service routines 을 주목하라. 만약, xyintr 가 stack내에
  나타난다면, 그것은 일반적으로 traceback information 과 관련이 없다,
  panic or trap 은 interrupt code 내에서 발생하며 아마도 device 에 관련이
  있으며 현재 process context 에 관련이 없다.


  < 4. Watchdog Reset >


1. What is a watchdog ?

- 가끔 시스템은 "watchdog reset" 이라는 message 를 console 에 내고 PROM
  으로 내려간다. 이것은 panic 은 아니다. 그 시스템은 더이상 control 에
  있는것은 아니다.  그것은 memory 를 disk 로 dumping 하지않고
  CPU 가 reset 으로 된다.

- Watchdog resets 은 근본적인 원인은 H/W  에 연관될지도 모르지만 보통은
  S/W 문제이다. 직접적인 원인은 page fault 와 같은 trap 인데 다른 trap 을
  handling 하는중에 발생한다. Kernel 은 PSR(Processor Status Register) 내의
  Enable Traps bit  을 reset(turned off) 시킴으로써 trap 을 운용하는데
  이것은 최초에 처리되던 첫번째 trap 이 끝날때까지 다른 trap 을 CPU 가
  처리하는것을 방지한다. 이것은 즉 시스템이 첫번째 trap 을 완전히 처리할때
  까지 다른 trap 은 만들어지지 않는다는 의미이다. 만약에 이 기간 동안 에 
  어떤 이유때문에 하나의 trap 이 발생한다면 시스템은 trap 을 수행해야
  하는데 이것은 bit 가 off 되어서가 아니기 때문에 시스템은 그 즉시
  quit(중지)  한다. 이것이 바로 watchdog reset 이다. 즉, unrecoverable
  situation ( 근본적으로 CPU의 reset 상태로 강제로 만드는 것) 이다.
  Watchdog reset 후에 당신이 할수있는 유일한 일은 바로 reboot 이다.

- Watchog reset 의 특성때문에  kadb 조차도 watchdog 이 일어났으때의
  watchdog resets 을 잡을수가 없다.그러나 당신은 간단히 몇개의
  OpenBoot PROM commands 로서  reboot  하기전에 일보의 status informatin
  을 얻을수가 있다.

2. Can you get a core file ?

- Not usually, 이 watchdog 의 파괴적인 속성상 당신 이 boot PROM ok prompt 를
  보게된다고 하더라도  CPU registers  는 벌써 깨져있고 sync command 수행이
  fail or  쓸데없는 core dump 를 얻게될것이다. 이것은  unreadabl 또는 살펴볼
  좋은 data  가 남아있지 않다. 항상 try 해볼펄요는 있지만 그러나 당신이
  먼저해야할 다른일이 있다.

3.  What do you do next ?

- 한번 boot PROM ok prompt 를 가진다면 당신은 몇개의 중요한 PROM command
  를 사용할수가 있으며 시스템이 watchdog 을  받았을때  그 시스템의 상태에
  관한 information  을 dump out 하기위해 다음과 같은 명령이 있다.
* .registers : Display many of the kernel internal CPU registers.
* .locals - Dumps out the registers in the current register "window."
            These are the registers that were in use at the time of the ctash.
* .psr - prints the Processor Status Register contents in a readable format.
* ctrace - Displays the return stack(like $c in adb)
* wd-dump (sun4d only)
- 불행하게도 이순간에 kernel 은 running 이 되지않는 상태이므로 당신은
  이 information 을 file 로 받을수가 없다. 당신은 아마도 paper 에 기록.

4. Watchdog analysis.

- Watchdog reset 은 시스템이 traps 을 processing  할때에 발생하므로 actual PC
  변수는 크게 소용이 없다. 당신은  kernel trap handling code 를 분석해야하고
  trace information 은 가장 중요하고 유용한 output 이다. 당신이 PROM 을 이용할
  때 kernel 은 running 되지않으며 sysmbol table 은 PROM code 에 유용하지않다.
  즉, PROM command 로 부터의 output 은 전적으로 hexdecimal 이며 raw numeric
  address 이다. 그 system  이 reboot 되고 살아있는 시스템상에서 adb 를 가지고
  kernel 내의 functions 으로서 try 해볼수가 있다. addredd/i 는 stack trace 로
  로 부터 각 address 의 위치와 instruction  을 display 할수가 있다.

5. Summary

- Analyzing watchdog reset is not an easy task. 몇개의 PROM command 만이 사용
  할수가 있고  당신의 노력에 비애 유용한 information 을 항상 얻을수 있는것은
  아니다. 만약 다수의 watchdog resets 이 발생한다면 당신은 일관된 results 를
  얻을수가 있을것이고 관련된 functions 을 알게 될것이다.
  비록 watchdog resets 이 software 의 problem 이라고 할지라고 그것들은 종종
  특정한 H/W 의 부분(CPU,Memory,M/B...) 에 관련이 될수고 있다. 이것은
  stack trace 로 부터 운이좋으면 알수가 있다. watchdog resets 으로부터
  피해를 보고 있는 시스템을 처리할때에 전체적인 system 을 보도록해야한다.
  H/W 와 S/W 둘다문제가 있는곳을 말이다.

출처 : Tong - ♂반달♀나라님의 linux통

모든 소프트웨어에는 버그가 있다는 말이 있듯이 솔라리스도 예외는 아니다. 솔라리스도 가끔 응용프로그램이 실행중 "Bus Error" 또는 "core dumped" 라는 메시지만 딸랑 출력하고 비정상으로 응용프로그램이 종료되는 경우가 있다. 윈도우 패밀리와 다른 점이 있다면 응용프로그램에서 생긴 문제가 솔라리스 자체에는 영향을 미치지 않기 때문에 다른 응용프로그램들은 정상적으로 잘 작동한다는 것이다. 솔라리스에서는 이러한 소프트웨어의 잘못을 응용프로그램이 비정상적으로 종료가 되었는지, 시스템 자체가 비정상으로 종료가 되었느냐에 따라 두 가지로 구별한다. 시스템 자체가 비정상으로 종료가 되는 경우는 dumpadm 명령어를 사용해서 설정한 그대로 현재 시스템의 모든 정황을 파일에 저장하고 , 응용프로그램이 비정상을 종료될 경우에는 coreadm 명령어를 사용한 설정에 따라서 으용프로그램의 모든 정황을 파일로 저장한다.


* dumpadm

  : 솔라리스 자체에 이상이 발생하여 비정상적으로 종료될 경우

    dumpadm 으로 설정한 구성에 따라 현재 시스템의 메모리에

    있는  데이터등 현재 시스템의 모든 정황을 파일에 저장한다.

    저장하는 데이터는 순수하게 솔라리스 커널을 의미하는 커널

    데이터현재 시스템의 멤모리에 적재되어 있는 모든 데이터를

    의미하는 메모리 전체 데이터로 나눈다.


  - dumpadm을 사용해 설정할수 있는 내용

    : 비정상 종료시 데이터를 저장할것인지 여부, 저장할 데이터의

      선정과 저장 장소, 재부팅 후 파일로 생성할것인지 여부를 설정

      하며 파일 생성을 설정할경우 부팅시 savecore명령어가 동작

      하여 메모리의 정황을 파일로 변환한다. 메모리 정황은 vmcor

      e.n 파일에 저장하고, vmcore.n 파일에 필요한 부가적 데이터

      는 unix.n 파일에 저장한다. (vmcore와 unix 다음에 붙은 n은

      몇번째 파일인지 의미)


  - dumpadm 로 설정을 변경하면 /etc/dumpadm.conf 파일에 즉

     시 저장된다. 단, -m 옵션으로 명시한 여유공안은 /var/crash/

     `hostname`/minfree 파일에 저장된다.


  - ex >

    # dumpadm -c all -m 20% -y

         -c 옵션은 메모리 데이터중 커널데이터만 저장할것인지

         아니면 전체 데이터를 저장할것인지 명시한다. 커널 데이터

         만 저장할 경우 옵션 다음에 kernel 이라 명시하면 된다. 예

         제는 all 이므로 전체 데이터를 저장한다.

         -m 옵션은 하드디스크 여유공간을 조건으로 명시, 만족되는

         경우만 파일로 생성,단위는 k(kilo), m(mega)로 되며, 예제처

         럼 하드디스크의 퍼센테이지로도 명시할수 있다.

         -y 옵션(Default option)은 부팅시 savecore 프로그램이 하

         드디스크에 저장된 메모리에 데이터를 파일 형태로 변환하

         여 /var/crash/`hostname` 디렉토리나 -s 옵션으로 명시한

         디렉토리에 저장된다. -n 을 명시하면 부팅시 savecore가

         동작하지 않기 때문에 하드디스크에 저장된 메모리 데이터가

          파일로 변환되지 않는다.


     # cat /etc/dumpadm.conf

          - 설정 내용 확인

     # ls -ld /var/crash/`hostname`

          - 디렉토리가 소유주만 읽기,변경,실행의 권한을 갖고 생성

    # ls -l   /var/crash/`hostname`

          - minfree 파일에는 하드디스크에 저장된 메모리 데이터를

            파일로 변환할 조건이 저장되어 있다.

    # reboot -d

          - -d 옵션을 사용하면 강제로 메모리의 데이터를 하드디스

             크에 저장한다.

     # ls -al

          - /var/crash/`hostname` 밑에 변환된 파일들 확인

             (vmcore.0 unix.0)

          - bounds 파일은 다음에 저장할 파일들의 확장자를

             저장하고 있다.

    

* coreadm

  : 응용프로그램이 비정상적으로 종료될 경우 다른 다른 프로그램

    에는 영향을 미치지않고 자신만 실행을 중단하면서 "core dump

    ed" 나 "Bus error" 와 같은 메세지를 출력하다. 그리고  응용 프

    로그램이 실행된 디렉토리나 / 디릭토리에 자신이 시스템에서

    실행되는 현재 모습을 그대로 저장한 core파일을 생성한다. 생

    성된 core파일은 프로그램 개발회사에 보내어서 버그를 수정하

    도록 돕는것이 좋을것이다.

  - core 파일의 문제점

    : 어떤 프로그램이 비정상 종료가 되더라도 항상 파일이름이 cor

      e인 것이 생성되고 여러 프로그램이 한꺼번에 종료되더라도 한

      개의 파일만 생성된다. 이를 coreadm을 사용하여 생성되는 co

      re파일의 이름에 여라가지 추가정보를 포함하여 변경할수있다.

  - core 명령어 다음에 아무런 옵션이나 아규먼트를 넣지 않으면

    현재 설정값을 /etc/coremadm.conf 파일에 설정 내용을 출력한

    다.

  - ex>

     # coreadm -g /var/core.%f.%u.%m -e global

        - -g,-i,-p 옵션은 생성되는 파일 이름을 어떤 방식으로 결정

          할 것인지 나타내는 패턴을 명시한다.

          -g(global) : 시스템에서 실행되는 모든 프로세스에 대해서

                           비정상적으로 종료될때 생성되는 이름

          -i(init) : init 프로세스에 의해서 생성된 프로세스가 비정상

                     적으로 종료될때 생성되는 이름

          -p : 항상 PID를 함께 명시하는데 실행중인 프로세스의 PID

                나 PPID가 -p 옵션 다음에 명시한 PID와 같을 경우에만

                적용

        - -g,-i 옵션은 /etc/coreadm.conf 파일에 패턴을 저장하기

           때문에 반드시 root 사용자권한이 필요하며 리부팅하더라

           도 계속 유지된다.

        - 패턴 의미

            %p PID                %u EUID                 %g EGID

            %f 명령어 이름      %n 시스템의 이름     %m 기계의 종류

            %t 시간                %% %기호 자체

        - -d(disable)와 -e(enable) 옵션은 core파일의 생성 여부를

           설정하는 옵션, 기능은 다음과 같다.

           global : -g 옵션을 사용해서 명시한 패턴 사용

           process :  -i, -p 옵션을 사용해서 명시한 패턴 사용

           global-setid : setuid 권한이나 setgid 권한이 설정된 프로

                              세스도 -g 옵션을 사용해서 명시한 패턴을

                             사용한다.

           proc-setid : setuid 권한이나 setgid 권한이 설정된 프로

                              세스도 -i 이나 -p 옵션을 사용해서 명시한

                              패턴을 사용한다.

           log : -g 옵션을 사용해서 명시한 패턴에 따라서 core파일

                이 생성될 경우에 그 기록을 시스템에 파일로 남긴다.

        - global-setid와 proc-setid는 생성되지 않도록 하는 것이 좋

          다. 이 두개가 생성될 경우에는 setuid 권한이나 setgid 권한

          이 명시된 프로그램이 메모리에서 실해오디던 상태가 파일

          로 저장되어 일반 사용자들이 분석할 수 있게 된다. 이런 파

          일을 분석하여 어떤 경우에 core파일이 생성되는다는 것을

          비롯한 프로그램의 취약점을 발견할 가능성이 존재, 핵킹의

          위험이 될수 있다.

 

     # coreadm

        - 설정내용 /etc/coreadm.conf 에 출력

     # more /etc/coreadm.conf

        - 설정내용 출력

          

     # coreadm -p core.%f.%p.%t $$

        - $$ : 현재 사용중인 Shell의 PID

        - -p옵션으로 명시한 core파일의 이름은 설정내용이 파일에

           남지 않아서 쉘을 빠져나가거나 시스템을 리부팅하면 설정

           내용이 남지 않는다.

     # coreadm -e log

     # coreadm

        - -e옵션을 사용해서 기록을 남기도록 설정했으므로

           /var/adm/message 파일에 기록이 남게 된다.

1. Mirroring root disk step by step

1.1 <Preparation>
2disk상황에서는 root disk를 미러링할 경우 replica를 양쪽 디스크에 설정을 하지만
하나의 디스크가 fail시 quorum rule을 만족을 못하기 때문에 single user mode로 부
팅이 된다.
이를 방지하기 위해서는 /etc/system 파일에 다음을 설정한다.


# vi /etc/system
set md:mirrored_root_flag=1


양쪽 디스크의 파티션을 동일하게 한다.
# prtvtoc /dev/rdsk/c0t0d0s2 > disk0.txt
# fmthard -s disk0.txt /dev/rdsk/c0t1d0s2
or
# prtvtoc /dev/rdsk/c0t0d0s2 | fmthard -s - /dev/rdsk/c0t1d0s2


# metadb -a -f -c 2 /dev/rdsk/c0t0d0s7 /dev/rdsk/c0t1d0s7

1.2  3개 HDD 이상
각 HDD마다 2개의 replica 를 구성한다.
# metadb -a -c 2 -f /dev/rdsk/c0t0d0s7  /dev/rdsk/c0t1d0s7  /dev/rdsk/c0t2d0s7


1.3 <Create mirror for root and swap file system>
1.3.1 root file system
# metainit -f d10 1 1 c0t0d0s0 <--- the root partition
# metainit d20 1 1 c0t1d0s0 <--- the mirror partition
# metainit d30 -m d10
# metaroot d30


(metaroot 명령어에 의해 /etc/system, /etc/vfstab 파일이 수정된다. 하지만
/etc/vfstab 파일중에서 / 에 해당하는 디바이스만 /dev/md/dsk/d0 와 같이 바뀌기
때문에 다른 파일시스템이 있는 경우에는 수동으로 직접 수정해야 한다.)


1.3.2 swap file system
# metainit -f d11 1 1 c0t0d0s1
# metainit d21 1 1 c0t1d0s1
# metainit d31 -m d11


1.4 <Edit /etc/vfstab>
1.4.1 update vfstab file
#device device mount FS fsck mount mount
#to mount to fsck point type pass at boot options
#
#/dev/dsk/c1d0s2 /dev/rdsk/c1d0s2 /usr ufs 1 yes -
fd - /dev/fd fd - no -
/proc - /proc proc - no -
/dev/md/dsk/d31 - - swap - no -
/dev/md/dsk/d30 /dev/md/rdsk/d30 / ufs 1 no -
/dev/dsk/c0t0d0s3 /dev/rdsk/c0t0d0s3 /var ufs 1 no -
/dev/dsk/c0t0d0s5 /dev/rdsk/c0t0d0s5 /export/home ufs 2


1.5 <Reboot the system>
# lockfs -fa
# reboot
you must reboot with a one-way mirror : do not create a 2 way mirror before
rebooting otherwise the system will crash because of the round robin manner in
which data is read.


1.6 <Attach the second sub mirror to the mirror>
# metattach d30 d20 <-- root file system
# metattach d31 d21 <-- swap

 

SUN 사용 설명서 2005-11-24 22:54
 
 
카테고리 : 기본카테고리
http://blog.paran.com/hotpink/7118700
1장. SUN OS 의 이력 및 SUN Product

2장. Command사용법 및 기능설명

       2.1 Admin을 위한 일반 명령어

       2.2 System Information 확인 명령어

       2.3 중요한 시스템 환경 File들(Backup Key Files!)

3장. Quota 설정

4장. SunOS 4.x의 trace, Solaris의 truss

       4.1 SunOS 4.x 에 대한 추적(Trace)기능

       4.2 Solaris 2.x 에 대한 추적 기능

5장. Accounting & Permission

       5.1 User Accounts(command line에서)

       5.2 BSD Accounting Utilities

6장. Cron(명령어스케쥴링)

7장. NVRAM(PROM Phase)

       7.1 OK mode상에서 banner 및 logo변경

       7.2 NVRAM 값 변경

8장. SWAP

9장. MAIL

       9.1 일반적 mail 사용법

       9.2 메일 서버 센드 메일(Sendmail)

10장. POP Server

11장. DNS(Domain Name Service)

12장. NFS(Network File Service)

      12.1 NFS 설정

      12.2 일반적인 NFS Error의 유형과 해결 방법

13장. FTP(File Transfer Protocol)

      13.1 anonymous FTP install

14장. PPP(Point to Point Protocol)

      14.1 Sun-to-PC Dialup PPP(Async) on Solaris 2.x

      14.2 적용예제

15장. System Tuning(시스템최적화)

      15.1 성능 향상을 위한 일반론

      15.2 시스템 성능에 영향을 주는 요소들

      15.3 프로그램의 시간 체크하기

      15.4 시스템의 성능 측정하기

      15.5 현재 CPU 성능 측정

      15.6 평균부하

      15.7 페이징 알고리듬

      15.8 메모리 사용 분석하기

      15.9 디스크 I/O 분석하기

      15.10 파일시스템 튜닝하기

      15.11 무작위 통계 출력하기

      15.12 시스템 성능 체크의 단계

      15.13 Process 분석

16장. AWK

17장. SED

18장. C-SHELL PROGRAMMING 기법

19장. VI 편집기

20장. System Backup 및 주변장치(Device)

      20.1 DAT제어를 위한 mt 명령어

      20.2 tar명령어

      20.3 cpio명령어

      20.4 upsdump명령어

      20.5 Remote Backup

      20.6 Remote CD-ROM Mount

      20.7 DEVICE 관련된 사항

      20.8 DISK모델 관련 사항

      20.9 Addon DISK

      20.10 DEVICE설치

      20.11 DISK format Utilities

      20.12 SCSI DISK의 RPM 조정

      20.13 Floppy DISK 인식

      20.14 /(root) File System restore

21장. 시스템 ERROR 및 문제해결(Q&A)

      21.1 Emergency Keyboard Commands

      21.2 directory write problem

      21.3 root(super user) password를 잊어버리거나, 파일시스템 오류시

      21.4 File System이 손상된 경우(Boot block복구)

      21.5 Inode가 full인 경우 조치

      21.6 System Disk move

      21.7 Oracle용 DISK Addon

      21.8 프린터 관련

      21.9 FrameBuffer관련

      21.10 Sun H/W 장애(Q&A)

      21.11 Application 관련 Error

      21.12 MOD에서 media를 인식 못할 때

      21.13 rm Command로 지워지지 않는 File 지우는 방법

22장. 네트웍관련 테크닉(Tip)

      22.1 Tuning the system for a web server

      22.2 Linux Network Setup

      22.3 Snoop(Capture and Inspect Network Packets)명령어

      22.4 ARP(Address Resolution Protocol)

      22.5 Ifconfig(Configure Network Interface Parameters)명령어

      22.6 The startup script results in the following

      22.7 The route Command

      22.8 Router Configuration

      22.9 2'nd ethenet설치

      22.10 4.1.3 DNS setup for Client

      22.11 SLIP

      22.12 SUN ATM

      22.13 IP Aliasing

      22.14 Static-Routing example

      22.15 C class netmask방법

      22.16 NDD를 이용한 Tuning변수(Solaris 2.x)

      22.17 IP forwarding을 disable(Solaris 2.x)

      22.18 Routing 환경

      22.19 Auto FTP login

23장. 시스템관련 테크닉(&Tip)

      23.1 Large dummy file 생성 방법

      23.2 DOS file에서 ^M 문자 제거 방법

      23.3 2개의 모니터에 Openwindows 올릴때

      23.4 rdist사용하여 정해진 시간에 파일 transfer

      23.5 Prompt변경(HostName & CurrentPath Display)

      23.6 임시 host_name변경

      23.7 / file system 100%일 경우 유용한 command

      23.8 man page에 관한 몇가지

      23.9 Login User중 idle time check하여 자동 kill(Script)

      23.10 Login 보안 및 audit 관련 Tip

      23.11 시스템에 유저 접근 거부 시킬때

      23.12 RAID Level

      23.13 System의 재설정(Host_name 및 Network 정보)

      23.14 Network상에서 C-compile 하는 방법

      23.15 Solstice Compiller Install

      23.16 시스템 초기 설치시 참고

      23.17 특정유저의 파일실행할 때

      23.18 Remote로 Utilitie 실행

24장. NIS(YP)

      24.1 Server & Client의 효율적 운용

      24.2 Install 및 운용방법

      24.3 NIS Master Server 초기화

      24.4 NIS Slave Server 초기화

      24.5 NIS의 Administration

      24.6 NIS 장애 유형



* CDE

* SunNetManager

* SAMBA(PC NFS)

* 시스템보안



1장. SUN OS 이력 및 SUN Product



- OS

  SUN OS 4.1.1(OW2.0.1) ??

  SUN OS 4.1.2(OW2.0.2) ? BSD계열

  SUN OS 4.1.3(OW2.0.3) ?

  SUN OS 4.1.4(OW2.0.4) ??

  SUN OS 5.1(OW3.0.1) or Solaris 2.1 ??

  SUN OS 5.2(OW3.0.2) or Solaris 2.2 ? Unix-V 계열

  SUN OS 5.3(OW3.0.3) or Solaris 2.3 ?

  SUN OS 5.4(OW3.0.4) or Solaris 2.4 ?

  SUN OS 5.5(OW3.0.5) or Solaris 2.5 ?

  Solaris 2.5.1                      ?

  Solaris 2.6                        ?

  Solaris 7      : full 64bit 운영체제



- System Product

   SUN ULTRA 1 <1995,64bit>, Solaris 2.5  : Single CPU

   SUN ULTRA 2 <1996,64bit>, Solaris 2.5.1 : Max CPU 2

   SUN Ultra 5         : 개인용

   SUN Ultra 10        : 개인용desktop, developer

   SUN Ultra 60        : developer, desktop or 소규모 그룹서버

   SUN Enterprise 250  : 소규모 웍그룹 서버

   SUN Enterprise 450  : 중규모 웍그룹 서버

   SUN Enterprise 3500 : DB서버,넷서버,중규모

   SUN Enterprise 4500 : 확장성 및 고성능이 필요한 site용

   SUN Enterprise 5500 : 대규모 site 서버

   SUN Enterprise 6500 :         “

   SUN Enterprise 10000 : 메인프레임(cluster일 경우 슈퍼컴가능)




2장. Command사용법 및 기능설명



2.1 Admin을 위한 일반 명령어



▷ 현재 시스템의 Architecture를 확인

   # arch -k  

          : Display The kernel architecture

▷ Inode 삭제 명령어 clrl

   # clrl /dev/dsk/c0t1d0s7 231  

          : 231 inode를 삭제

▷ Text파일에서 특정 문자 추출해내는 명령 cut

   # cut -d":" -f1 /etc/passwd > /tmp/user

          : passwd file에서 유저부분만 추출해서 /tmp/user 파일로 저장

   # ypcat passwd | cut -d":" -f1 > /tmp/user

▷ Disk 사용량 계산

   # du -s .  : 현재 및 SUB-dir까지의 전체 Disk사용량 (du:disk use)

        -k .  : killo byte 단위로 확인

▷ Text file의 비교와 Directory간의 상이한 내용의 비교

   # diff /a /mnt  : /a, /mnt directory 를 비교

   # diff /a /b    : /a, /b Text file 의 비교

▷ EEPROM의 내용을 명령행 에서 변경

   # /usr/sbin/eeprom  : 상태확인

   # /usr/sbin/eeprom boot-device=disk3  : 값 변경

▷ File type을 확인 할때

   # file /etc/passwd

   /etc/passwd:   아스키 텍스트

   # file core

   core:          ELF 32-비트 MSB 코어 파일 SPARC 버전 1, 원인수행 'sleep'

          : 이건 core file 이 왜 생성됬는지 보고 하고 있다.

▷ File or Directory 을 지울때

   # rm file_name         ; 단일 파일을 지운다.

   # rm -r /dir_name      ; 디렉토리까지 전부 삭제한다.

   # rm -i file_name      ; "-i"옵션은 파일을 지우기 전에 한번 더 확인한다.

   # rm 'file name'      ; 중간에 공백이 있는 파일 지울때.

▷ File 검색을 위한 명령어

   # find ~ -name '*%' -print -exec rm {} \;

          : home 디렉토리 '%'로 끝나는 화일 탐색하여 보여주면서 삭제

            Option 분류(검색기능이 상당히 많다. man page로 확인)

            -atime n  ; accessed n days ago

            -ctime n  ; change n days ago

            -mtime n  ; midified n days ago

            -perm     ; 해당 되는 퍼미션 파일 검색

              ...

▷ Key input 제대로 안될 때 Remote에서 Key mode를 바꾼다.

   # kbd_mode -a

▷ Process를 강제 종료 시킬때

   # kill pid             : 통상 process 종료 시킬때

   # kill -9 pid          : 강제 종료 시킬때

   # kill -HUP pid        : process를 hangup

   # kill -SEGV pid       : process를 강제로 segmentation fault 시킬때

▷ Process관련 명령어

   /usr/proc/bin Directory에 다수가 있다.

   proc tools -

       proc, pflags, pcred, pmap, pldd, psig, pstack, pfiles, pwdx, pstop, prun, pwait,

       ptree, ptime

▷ File list를 표시한다.

   # ls -al   : 모든 file들을 long형태로 자세히 listing

   # ls -ald  : directory를 확인 할 때

   # ls -li   : inode number를 보고자 할 때

▷ NIS 의 기동 여부 확인

   # nisls -l  : 만일 서버가 다운되었다면 아래와 같은 메시지가 뿌려진다.

                  "NIS+ server unreachable"

▷ 특정 Disk partition 의 자세한 정보 획득

   # prtvtoc /dev/rdsk/c0t0d0s0  : volume Table 의 내용 볼 때

              위는 c0t0d0s0 slice에 대한 자세한 Information을 보여준다.

▷ 시스템의 상세 Configuration을 확인하는 명령어

   # prtconf  : System Configuration을 보여준다.

   # sysdef   : Current system definition을 출력

   # /usr/platform/`uname -i`/sbin/prtdiag   : H/W 정보 (sol 2.6)

         ; Display system diagnostic information

         ; SUN 장비에만 적용되고 Axil등에서는 안됨.

▷ CPU를 Enable 또는 Disable

   psrinfo , psradm

   # psrinfo [-v]   : CPU 정보확인

   # psradm -f 2 3  : 2,3번 CPU를 off_line

   # psradm -n 2 3  : 2,3번 CPU를 on_line

          : 대형 서버 등에서 CPU 수를 제한하여 성능 test할 때 유용하다.

▷ /etc/shadow 파일의 update

   # pwconv  : /etc/shadow file 생성 및 modify

▷ 실행된 명령어들 Display

   lastcomm 설정방법

   # touch /var/adm/pacct   ; 꼭 이렇게 하지 않아도 되며, 보안유지가 필요한 곳이라면,

                               다른 DIR에 다른file_name으로 숨겨도 된다.

                               그러나 볼때는 반드시 /var/adm/pacct 로 copy하여 놓은후 사용

                               해야 함.

   # /usr/lib/acct/accton /var/adm/pacct

   # lastcomm

▷ Sytem Reconfiguration BOOT

   # reboot -- -r :

▷ rlogin 접속

   # rlogin -l hong basic  : hong으로 basic시스템에 콘솔 접속

▷ Key-in을 위한 I/O setting

   # stty -a  : setting된 key 들을 보여준다

   # stty erase ?임의의키?  : erase 단축기능을 임의의 키로 바꿀 때.

▷ 현 유저소유의 비어있는 파일을 생성 시킨다.

   # touch cream

   # ls -al cream

   -rw-r--r--  1 storming staff         0 10월 21일 17:02 cream

▷ process,가상메모리,디스크,cpu Monitoring 통계치를 보여준다

   # vmstat 1 100  : 1은 interval이고, 100은 count이다.

▷ 현재 접속 사용자에게 메시지를 뿌린다.

   wall : write to all users --> /usr/sbin/wall [-a] [-g] [filename]

      - 기능  : Broadcast Message from ...

      - option : -a broadcast message to the console

                     and pseudo-terminals.

                  -g grpname broadcast to a specified group only.

   # wall -a text_file  : text_file의 내용이 터미널 에 뿌려진다.

▷ 접속 사용자 확인 명령어

   # who -a : 접속상태 의 자세한 정보

   # who -r : 현재 RUN Level 확인

▷ 프레임 버퍼의 상태 변경

   # /usr/platform/'uname -i'/sbin/cg14config

▷ 시스템 log file 들

  /var/adm/utmp , utmpx

  /var/adm/wtmp , wtmpx

  /var/log/syslog

  /var/adm/pacct

  설명 : last 등의 명령어로 위의 파일들의 내용을 볼수 있는데, 유저의 사용상황은

         위의 파일에 계속 쌓이게 된다.

         그런이유로 위 파일이 비대해지면, zero파일로 많들어 줄 필요가 있다.

         #cp /dev/null utmp         이런 식으로 ...

▷ C2 보안 레벨 이용 명령

 - /etc/security/bsmconv , bsmunconv

   위의파일 이용하여 특정 호스트 및 유저의 활동상황을 감시할수 있다.




2.2 System Information 확인 명령어



▷ 호스트 네임 확인

   # hostname

▷ aliase된 호스트 네임 확인

   # grep `hostname` /etc/hosts | awk '{print $3}'

▷ 호스트 네트웍 Address(IP address)

   # grep `hostname` /etc/hosts | awk '{print $1}'

▷ 호스트 id 확인

   # hostid

▷ OS, OS version, application architecture, kernel architecture, CPU type

 Kernel virsion

   # uname -a

▷ CPU의 상세정보, 메인메모리, Ethernet address, OS virsion등...

    시스템의 상세한 정보

   # dmesg

▷ Disk Configuration

   # df

   # df -a : 전체 file_system 각각 할당량 및 사용량(%) 을 Check. (df:disk free)

   # df . : 현재 file system에 대한 device명 확인



※ System 모델명, 시리얼넘버 H/W Product에 관한 내용은 시스템 후면이나,

   PROM상태에서 확인 할 수 있다.

※ 참고 : SysInfo home page

          www.MagniComp.com/sysinfo/




2.3 중요 시스템 환경 File(Backup Key Files!)

위치 : /etc

            ; /etc/를 전부 백업하는 것이 좋다.

hosts      ; 자신 및 Client들의 IP address/host-name이 저장된다.

              DNS나 NIS를 이용한다면, 단순히 자신의 정보만 갖게된다.

              IP_ADDRESS 가 바뀌었다면, 이 file을 편집해야 한다.

hostname ?? le0(이더넷-10Mbps)

networks  ? hme0(10/100Mbps autosensing기능의 network interface)

netmasks ??

defaultrouter

group     ; passwd file에 필요

passwd    ; 유저들의 계정이 등록되는 file

shadow    ; 2.x에서 나온보안강화용, password를 암호화하여 이 file에 저장

nodename  ; 호스트명이 저장된 file

vfstab    ; file system configuration

dfs/dfstab

inetd.conf

rc#.d DIR 안의 Script 들.



3장. Quota 설정


다음은 유저별 file_system사용 을 제한하기 위한 쿼터 설정 방법 이다. 클라이언트 서버 환경에서 서버의 리소스를 특정 유저가 전용하므로서 다른 유저의 피해가 우려될 경우 설정하는 것이 좋다.



  # cd /

  # touch quotas               <------ quota 데이터 파일 설정

  # edquota user_id

  fs / blocks (soft = 0, hard = 0) inodes (soft = 0,hard = 0)

    위와 같은 Default file이 에디터로 불려진다.

    아래 설명을 참조하여 edit 후에 저장한다.

     ※ 설명 : /     이건 마운트된 디스크 파티션의 디렉토리이름이다.

                      (파티션 별로 쿼타를 설정)

                      예: /a/b/c/user_id(s) 이럴때 실제 fs가 마운트된 디렉토리까지

                      써준다. df 명령으로 확인 해볼것.

               soft = xxx 이 값에 도달하면 경고 메시지를 내보낸다.

               hard = xxx 이 값에 도달하면 더이상 쓸 수 없다.

               inodes    파일 갯수라고 생각하면 된다.

                      위에서 xxx 는 block 값이고, 1 block은 512 byte 이므로

                      어떤 유저에게 50MB의 Disk공간을 할당하고 싶다면

                              97,656 = 50,000,000 / 512

                      이므로, soft = 97656을 해주면 된다.



  이 환경을 다른 유저에게도 같이 적용 하고 싶다면, 아래처럼 환경만 복사하면 됨.



? #edquota -p 처음id 복사할id-1 복사할id-2.....

  사용자 마다 다르게 쿼타를 준다면, 위 과정을 반복.


  다음, 디스크 정보를 생성

? #quotacheck -v 디렉토리명      <--- 갱신된 유저별 list를 보여 주면서 Check


  디렉토리는 위에서 말한 마운트된 디렉토리이름


  쿼타 적용

? #quotaon -v 디렉토리


? user별 quota현황 확인 : quota -v user_id

? 전체 quota현황 확인 : repquota -v /home (home에 대한 전체 quota 설정치 확인)



? 부팅시 자동으로 quota를 적용시킬 때 : /etc/rc2.d에 아래 스크립트 포함시킴

  

  if [ -x /usr/sbin/quotacheck ]

  then

        echo "Checking quotas. This may take some time."

        /usr/sbin/quotacheck -v /home2

        echo " Done."

  fi

  if [ -x /usr/sbin/quotaon ]

         then

                 echo "Turning on quota."

                 /usr/sbin/quotaon -v /home2

  fi


  (/dev/dsk/c0t1d0s6 가 /home2 에 마운트 되어 있다고 가정

  quotacheck를 해서 변동사항이 있는지 체크

  quotaon 으로 /home2에 계정을 가진 id들에 대해 quota를 적용)

- quot -af : 유저에게사용된 Kbyte, 파일갯수, User의 내용 보여준다.






4장. SunOS 4.x의 trace, Solaris의 truss기능



4.1 SunOS 4.x 에 대한 추적(Trace)기능



프로그램을 튜닝 또는 디버그할 때는 어떠한 시스템 콜을 사용하고 있는지, 또한 어떠한 패러미터를 교환하고 있는지 판단하면 도움이 된다. 그 정보들을 조사하기 위해서는 trace명령을 통하여 프로세스 마스크내에 특별 비트를 설정한다. 그렇게 하면 추적이 이루어지며 커널의 시스템 콜 인터페이스 루틴에 의해서 보고되는 정보가 출력된다. 추적은 실행전체를 대상으로 하여 사용할 수도 있고, 실행중인 프로세스에 임의의 시점에서도 적용할 수 있다. 특별한 컴파일러 옵션은 필요 없다.

Solaris 2에서 trace는 truss로 명칭이 변경되며 더욱 많은 기능을 갖추고 있다.



  이하에서 나타내고 있는 것은 추적 출력에 의미를 정확히 하기 위한 설명을 붙인 것이다.

이 출력에는 cp가 mmap콜을 사용하는 방법과 공유 라이브러리를 개시하는 방법도 나타내고 있다.



< trace 출력의 설명 >

-------------------------------------------------------------------------------------------------

트레이스 출력                                                              설명

-------------------------------------------------------------------------------------------------

% trace cp NewDocument Tunning                               명령에 대하여 trace를 사용

open ("/user/lib/Id so",0,04000000021 )=3                    공유 라이브러리 로더를 획득

read(3,""..,32)=32                                           a.out헤더를 읽어 동적링크 여부를 확인

mmap(0.40960,0x5, 0x80000002, 3, 0):0xf77e0000               코드를 메모리내에 맵핑

mmap(Oxf77e8000, 8192, 0x7, 0x80000012, 3, 32768)=0xf77e8000 데이타를 메모리내에 맵핑

open("/dev/zero",O,07)4                                      O으로 재설정한 페이지를 획득

getrlimit(3, Oxf7fff8bo)=O                                   제한정보 읽기

mmap(Oxf7800000, 8192, 0x3, 0x80000012, 4, 0)=0xf7800000     /dev/zero를 bss?로 맵핑

close (3)=0                                                  id so를 클로즈

getuid ()=1434                                               사용자 ID획득

getgid ()=10                                                 그룹ID획득

open('/etc/IdsO.cache" , 0, 05000000021)-3                   공유 라이브러리 캐시 오픈

fstat (3, Oxf7fff750)=0                                      캐시의 내용이 최신의 것인지 확인

mmap(0. 4096,Oxl, 0x80000001, 3, 0)=Oxf77c000                캐시를 맵핑하여 읽기

close (3)=O                                                  캐시 폐쇄

open ("/usr/openwin/lib", 0, 01010525)= 3

fstat(3, oxf7fff750)=0                                       LD LIBRARYPATH에 /usr/openwin/lib이 포함

mmap(Oxf7802O00,8192, 0x3, 0x80000012, 4, 0)=0xf7802000      되어 있어 그것을 먼저 본다

getdents (3, Oxfi78000d8, 8192) 1488                         올바른 버전의 라이브러리를 찾아서

getdents (3, oxf78000ds, 8192)= O                            디렉토리 엔트리를 몇가지 획득

close (3)=0                                                  /usr/openwin/lib close

open ("/usr/lib/-ibe so 1 6", 0, 032724)= 3                  공유 libc 획득

read (3,"".., 32)132                                         OK확인

mmap (0, 458764, 0x5, 0x80000002, 3, 0_)= Oxf7730000         메모리내에 코드 맵핑

mmap(oxf779ca00,16384,0x7,0x80000012,3,442368)= Oxf779c000   메모리내에 데이타 맵핑

close (3)=0                                                  libc 클로즈

close (4)=0                                                  /dev/zero클로즈

open ("NewDocument", 0, 03)=3                                드디어 입력 화일 오픈

fatat(3, Oxf7fff970)= O                                      사이즈의 통계정보 검색

stat ("Tuning",Oxf7fff930)=-1 ENOENT(No such file or directory)  출력화일의 통계정보 검색

stat ("Tuning",1Oxf7fff930)=-1 ENOENT(No such file or directory) 출력화일 없음

creat("Tuning" O644)=4                                           출력화일 작성

mmap(O, 82, OX1, 0x80000001, 3, 0)= Oxf7710000               입력화일 맵핑

mctl (oxf77100O0, 82, 4, Ox2)= O                             순차 액세스 통지

write(4,"This is a test file for my paper".., 82)=82         새로운 화일로 입 ,출력

mnmap(oxf7710000, 82)=O                                      입력화일의 맵핑 릴리스

close (3)=O                                                  입력화일 클로즈

close (4)=0                                                  출력화일 클로즈

close (O)=O                                                  stdin클로즈

close (1)=O                                                  stdout클로즈

close (2)=O                                                  stderr클로즈

exit (O)=?                                                   프로그램 종료

%




4.2 Solaris 2.x 에 대한 추적 기능



truss 명령에는 trace에는 없는 편리한 기능이 매우 많다. 자(子)프로세서를 추적하거나 시스템 콜과 시그날수(계산) 그리고 시간을 조사하는 기능이 있다. 또한 다른 옵션 기능을 사용하면 지정한 시스템 콜을 제외한 trace와 지정한 시스템 콜만을 추적하거나 그리고 데이타구조를 완전히 프린트 출력할 수도 있다.

이하의 표는 데이타 구조용의 장황한 모드를 설정하기 위해서 -v 옵션을 설정한 truss 명령의 출력 일부와 truss -c에서 시스템 콜의 수 (계산)을 표시한 예이다.

# truss -v all cp NewDocument Tuning

execve("/bin/cp", 0xEFFFF598, 0xEFFFF5A8) argc = 3

open("/dev/zero", O_RDONLY)                    = 3

mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xEF7F0000

open("/usr/lib/libintl.so.1", O_RDONLY)        = 4

fstat(4, 0xEFFFF254)                           = 0

  d=0x0080001E i=48439 m=0100755 l=1 u=2    g=2    sz=15720

      at = Nov 7 15:31:06 KST 1997 [ 878884266 ]

      mt = May 3 12:33:31 KST 1996 [ 831094411 ]

      ct = Jul 3 14:29:10 KST 1997 [ 867907750 ]

  bsz=8192 blks=32   fs=ufs

      .....

# truss -c cp NewDocument Tuning

syscall     seconds  calls errors

_exit           .00      1

read            .00      2

write           .00      1

open            .01     12     1

close           .00     11

creat           .00      1

brk             .00      2

stat            .00      5

lseek           .00      1

fstat           .00      7

access          .01      8     1

execve          .00      1

mmap            .01     20

munmap          .00      8

memcntl         .00      1

acl             .00      1

              ----    ---   ---

sys totals:     .03     82     2

usr time:       .03

elapsed:        .12



ex) #cd /usr/openwin/bin

  #cp openwin openwin.org

  #vi openwin.org

     "truss -fo /tmp/outputfile -t exec /usr/openwin/bin/openwin.org"를

     openwin.org 의 맨처음에 삽입

  #chmod 755 openwin.org

  #openwin.org --> 하면 openwin을 trace 하면서 내용은 /tmp/outputfile에 쌓인다.




5장. Accounting & Permission



5.1 User Accounts(command line에서)

2.x에서 의 user accounts

#groupadd -g 100 dct

#cat /etc/group

  dct::100:

#useradd -u 115 -g 100 -c "hong seong-chan" -d /user/hong -m -s /bin/csh hong

    ; UID 115, GID 100의 hong seong chan이라는 사람의 계정을 만드는데, 그 유저의

      HomeDIR은 /user/hong(-d /user/hong)으로 생성(-m) 하고, 그 유저가 사용하는

      쉘은 C-shell(-s /bin/csh)이고, login명은 hong일 것이다.

      1)passwd file 보면

        hong:x:115:100:hong seong chan:/user/hong:/bin/csh

      2)shadow file 보면

        hong:*LK*:::::::

#passwd hong ---> User "hong"의 패스워드를 지정해준다.



4.1.3에서 의 user accounts

#vi /etc/passwd

   추가: std99::999:20:student99:/home/std99:/bin/csh

         userID(8자이하소문자):password:UID:GID:full_name:home_dir:shell

#mkdir /home/std99    ; std99에 대한 홈디렉토리 작성

#cp .cshrc /home/std99 ; 다른 유저의 .cshrc 파일을 복사하는 것이 유리.

#ls -alg

#chown std99 /home/std99

#chgrp 20 /home/std99

#passwd std99   ; root가 유저의 pass를 부여한다.



소유권변경(super유저권한에서)

#ls -al /user

drwxr-xr-x    kim    dct     512    10월 6일 13:01 kim

drwxr-xr-x    root    other   512    10월 6일 12:55 kim2

#chown -f kim2 kim2

#chgrp -f dct kim2

#ls -al /user

drwxr-xr-x    kim    dct     512    10월 6일 13:01 kim

drwxr-xr-x    kim2   dct     512    10월 6일 12:55 kim2



특정유저에게 퍼미션 제한 할 때

/usr/bin/getfacl --> Access Control List (ACL) 볼 때

                      #getfacl * --> 모든 파일 확인

/usr/bin/setfacl --> ACL 수정 및 추가  

                      #setfacl -s ..... man_page확인

* /tmp 는 일반파일시스템이 아니기 때문에 퍼미션 변경이 안됨.




5.2 BSD Accounting Utilities

 - accounting system은 account command를 enable함으로서 가능하며

   /etc/rc file에 다음을 comment out

   /usr/lib/acct/accton /usr/adm/acct OR

   /usr/lib/acct/startup

 - /usr/acct가 있는 filesystem이 95%이하이면 accounting을 하고

   95%가 넘으면 자동적으로 accounting을 stop 한다

 - SunOS에서는 kernel에서 SYSACCT configuration option이 포함되어

   있어야 한다

 - sa command로 report할수 있으며 sa -s 로 /usr/adm/acct의 내용을

   compress하고 savacct file로 merge시킨다

/usr/etc/sa

 % sa

   1027  18063.15re     17.11cp     4078avio     4696k

     16   1537.32re      6.22cp     1057avio     6258k  cmdtool

     14     12.79re      3.14cp   265300avio     6377k  cp

      7     17.18re      1.47cp      618avio     5902k  suntetri

     51      5.47re      0.69cp        1avio     4373k  rm

      6    481.65re      0.63cp        0avio      586k  update*

     37     99.61re      0.56cp      276avio     3443k  vi

        - leftmost : Total number of times the command was execute

        - re  : Total real time spent excuting the command

   - cp  : Total CPU time  ,,     ,,       ,,

   - avio : Average number of I/O operations per invocation of the command

   - k   : Average physical memory usage, in Kbytes

관련 FILE

 - /var/adm/pacct     raw accounting

 - /var/adm/savacct   summary by command

 - /var/adm/usracct   summary by user ID

A Script to Collect Accounting Data

 #!/bin/sh

 filename=`date | awk '{print $2 $3 $6}' -`

 sa=/usr/etc/sa

 recorddir=/usr/adm/localacct

 if [ ! -d $recorddir ]

 then

          mkdir $recorddir

 fi

 pathname=$recorddir/$filename

 date > $pathname

 echo "Day's Activity (command summary)" >> $pathname

 $sa -i >> $pathname

 echo "Total activity (command summary)" >> $pathname

 $sa >> $pathname

 # this time, also compress reports into savacct

 echo "Per-user activity" >> $pathname

 $sa -ms >> $pathname

Day-to-Day Management

 - /usr/lib/acct/runacct

   Generates a set of five daily reports

   /usr/adm/acct/sum directory내에 rprtmmdd형의 file로 보관되며

   mm은 월, dd는 일을 나타냄

 - /usr/lib/acct/dodisk

   Gathers disk usage statistics, which are summarized by runacct

 - /usr/lib/acct/ckpacct

   시스템에 free block이 500이하일 경우 main accounting file

   (/usr/adm/acct/pacct)이 계속 증가못하게 함

 - /usr/lib/acct/monacct

   Convert all daily reports into a monthly report

   /usr/adm/acct/fiscal directory내에 fiscrptnn의 file name으로 저장

 - /usr/lib/acct/prdaily

   Get the accounting statistics for the current date and repoprt

 - /usr/lib/acct/shutacct

   To disable accounting cleanly, execute the shell script ~/shutacct

Accounting Reports & Management

 - login name별, application별 Accounting과 last login을 report

 % /usr/lib/acct/prdaily mmdd (예, 0908)

 - CPU(MINS) : total cpu time

 - KCORE-MINS : 분당 사용되는 physical memory

 - CONNECT   : The total amount of time the user was logged in

 - DISK BLOCKS:   ,,       ,,    disk storage that the user is occupying

 - #OF PROC  :   ,,       ,,    processes the user executed

 - #OF SESS  : The number of times the user logged in during the day

 - NUMBER CMDS : report된 기간동안 수행된 횟수

 - TOTAL KCOREMIN : 이 program에 의해 사용된 physical memory(KByte)

 - TOTAL CPU  : 이 program에 의해 사용된 total cpu time

 - TOTAL REAL : 이 program이 invoke된후 경과된 시간의 합

 - MEAN SIZE  : 이 program에 의해 사용된 평균 memory의 량

 - MEAN CPU   : 이 program이 실행하는데 소요된 평균CPU time(분)

 - HOG FACTOR : program의 CPU효율로 total CPU time을 total 수행시간

                 (TOTAL REAL)으로 나눈 값

 - CHARS TRANSFD : 이 program에 의해 transfer된 total character 수

 - BLOCKS READ : 이 command에 의해 read/write된 disk blocks

 # generate daily accounting reports (1 a.m)

 0 1 * * * /usr/lib/acct/runacct

 # update disk usage statistics weekly (2 a.m. Monday)

 0 2 * * 1 /usr/lib/acct/dodisk

 # manage accounting file size hourly (on the half-hour)

 30 * * * * /usr/lib/acct/ckpacct

 # generate monthly summaries (2 a.m. on the 1st of the month)

 0 2 1 * * /usr/lib/acct/monacct



6장. CRON

/etc/cron, /usr/spool/cron/crontabs/*

“/etc/cron" 프로그램 은 주기적으로 어떤 프로그램을 수행시키는데 사용된다.

이때 주기적으로 수행되어질 프로그램은 "/usr/spool/cron/crontabs" 디렉토리

밑에 각 사용자의 사용자명과 같은 이름으로 생성된다.

이 화일은 만드는 방법은 아래 명령을 사용하면 된다.

      % crontab -l root : /var/spool/cron/crontabs/root 내용 display

      % crontab -e root :

          이 명령을 root가 수행했으면 /var/spool/cron/crontabs/ DIR 하위에

          "root" 라는 이름의 화일이 생성된다)

         또는 vi 로 편집

--------------------------------------------------------------------------------

예)

# more /var/spool/cron/crontabs/root

# minute  hour  day  month  week

# 0~59    0~23  1~31 1~12   0~6 (0=sunday, 1=monday)

#

15,45 3 * * * find / -name .nfs\* -mtime +7 -exec rm -f {} \; -o -fstype nfs -prune

5 9 * * 6 /usr/lib/newsyslog >/dev/null 2>&1

15 0,8 16 * * find /var/preserve/ -mtime +7 -a -exec rm -f {} \;

--------------------------------------------------------------------------------

crontab 화일의 맨 앞의 5번째 칼럼까지에는 각 명령이 수행되어질 일시와 요일이다.

지정한 것들은 아래와 같은 의미를 갖는다.

      분 시간 날짜 달 요일 : 구분은 Space

      15,45 3 * * * : 매일 3시 15분관 45분에 수행

      5 9 * * 6     : 매주 금요일 9시 5분에 수행

      15 1,18 16 * * : 매달 16일 1시15분과 오후 6시 15분에 수행



1) /var/spool/cron/crontabs/root (root계정으로 가정할때..)

 위 파일을 편집하여 원하는 스케쥴을 설정/편집 한다.

2) ps -ef|grep cron     : 현재 cron deamon이 돌고 있는지 확인

3) kill -9 "pid of cron"  : cron deamon kill

4) rm /usr/lib/cron/FIFO : lock파일제거(/usr/lib/cron directory는 /etc/cron.d와 링크되어있음)

5) /usr/sbin/cron        : deamon 재실행(위 편집한 명령대로 수행함)



 예) vi /var/spool/cron/crontabs/root

     ###############################

     #Min Hour Day Month Day Command

     ###############################

     15 4 * * * find /var/preserve/ -mtime +7 -a -exec rm -f {} \;

     0 23 * * * sh `sed -n 1p /etc/Alis`/janitor

     0 * * * * /usr/lib/acct/ckpacct

     10 12 * * 1-6 /usr/lib/acct/dodisk

     20 12 1 * * /usr/lib/acct/monacct

     30 12 * * 1-6 /usr/lib/acct/runacct 2> /var/adm/acct/nite/fd2log



※ log는 /var/cron/..... 에 생성됨



7장. NVRAM(OK_mod Command)

printenv      ; 현재 설정되어 있는 시스템 환경치를 보여준다.

setenv        ; 환경설정

module-info   ; CPU Clock Speed

probe-scsi    ; 현재 접속되 있는 SCSI DEVICE들이 열거된다.

                 (probe-scsi-all)

words         ; ok 모드 에서의 명령어 열람

boot -a       ; Interactive boot option

help diag     ; 메모리,플로피드라이브,케쉬메모리 등. Test 명령어 사용법을 보여준다

    ok test-memory  ?> 메모리 이상 유무 확인 할때

    ok _            ?> 이상 없다면 prompt만 나타나고, 램의 배치에 문제가 있다면 align error

                        메시지 가 나타난다.

TOD 관련 ERROR ; F-E-Handbook Vol I --> CPU-131

                  ok copy-clock-tod-to-io-boards

                  ok (ioboard# in hex) copy-io-board-tod-to-clock-tod


* 화면 resolution 변경할 때 : setenv output-device screen:r1024x768x76

* Center2000에서 model-100_type array 상태에서의 BOOT_DEVICE 설정치

ok setenv boot-device /io-unit@f,e0200000/sbi@0,0/SUNW,soc@0,0/SUNW

     ,pln@a0000000,78c8d4/SUNW,ssd

                  ???????

                     ??> array의 serial_number

     ; array A tray 1 번째 disk




7.1 OK mode상에서 banner 및 logo변경

[banner변경]

예를 들어 bannner를 "This is my computer" 이라하자.

먼저 ok prompt mode 즉 forth command mode로 들어가서

  ok setenv oem-barner This is my computer

  oem-banner =         This is my computer banner

  ok setenv oem-banner? true

  oem-banner?=         true

  ok

또는 OS상에서

  test# eeprom "oem-banner=This is my computer"

  test# eeprom "oem-banner?=true"



[logo제작]

ok prompt mode to command를 이용하여 logo를 변경할 수 있으나,

보통 forth language가 익숙하지 않으므로 다음은 OS상에서 변경하는 예제만 살펴보자.

NVRAM상의 oem-logo값은 512 byte array(4096 bits 64x64)이다.

각 bit는 우측상단을 기준으로한 한 pixcel을 control한다.

array는 hexedicimal값으로 저장되고 printenv를 사용하는 것은 처음 8 byte를 보여줄 것이다.



1. openwindow에서icon editor를 이용하여 64x64 icon을 생성한 후 file로 save.

2. 예를 들어 만들어진 icon file이 my.logo라 하자.

   # eeprom "oem-logo=my.logo" /* my.logo를 NVRAM array에 save */

   # eeprom "oem-logo?=true"

3.system을 halt한 후 ok prompt에서 banner command를 수행하면 바꾸어진 logo를 확인할 수 있다.




7.2 NVRAM 값 변경

1) Host-ID란 시스템마다 각기 다른 Serial No.를 의미하는데, 이 Host-ID를 수정하는 이유는

 license를 요구하는 특정 S/W사용시 Host-ID를 Check하여 Host-ID가 서로 일치하여야만 비로소

 수행되기 때문이다.(호스트 마다 license를 check하는 deamon이 수행되고 있을 것이다)

2) Booting 도중에 break-key(STOP+A)를 누르고 n 을 쳐서 ok mode로 들어간다.

 이 상태가 NVRAM 수정가능상태 이다.

3) NVRAM의 내용을 살펴본다.

        ok .idprom

       

                  ? ?         ? ③ ? ? ? ?     ? ? ⓐ ⓑ

        Format/Type: 1 54 Ethernet: 8 0 20 2 8f 26 Date: 0 0 0 0

                 ⓒ ⓓ ⓔ          ⓕ

      Serial: 00 14 20 Checksum: ed Reserved: a5 a5 a5 a5 a5 a5 a5 a5 . . .



        여기서 현재의 Host-ID는 “54 00 14 20”이다. 즉 Type와 Serial의 값이다.

                               ?+ⓒ+ⓓ+ⓔ

4) 여기서 Host-ID의 값을 “5200fc7d”로 변경한다.



        ok 52 1 mkp   : 1번지의 내용 변경

        ok 00 c mkp   : c번지의 내용 변경

        ok fc d mkp   : d번지의 내용 변경

        ok 7d e mkp   : e번지의 내용 변경

        ok .idprom     : NVRAM의 변경 내용 확인



        Format/Type: 1 52 Ethernet: 8 0 20 2 8f 26 Date: 0 0 0 0

      Serial: 0 fc 7d Checksum: 04 Reserved: a5 a5 a5 a5 a5 a5 a5 a5 . . .



        ok 1 52 8 0 20 2 8f 26 0 0 0 0 0 fc 7d               : ?~ⓕ 까지 나열. ??Checksum

        ok xor xor xor xor xor xor xor xor xor xor xor xor xor xor (14개)  ??



        ok .s          : checksum값 확인

        ok xx          : checksum값

        ok xx f mkp    : ⓕ번지의 checksum값 변경

        ok .idprom     : NVRAM의 내용 변경여부 확인



        Format/Type: 1 52 Ethernet: 8 0 20 2 8f 26 Date: 0 0 0 0

      Serial: 0 fc 7d Checksum: xx Reserved: a5 a5 a5 a5 a5 a5 a5 a5 . . .



        ok reset

        rebooting......



* machine type 을 미리 알고 있어야 ?번지의 값을 올바로 변경할수 있다.

        ex) ss1+ 64XXXX

           ss2 72XXXX      72가 machine type 이 된다.




8장. Swap



시스템의 물리적인 partition을 변경하지 않고 swap size를 늘리고자 하는 방법.

* Sun OS(Solaris 1.x)

    # pstat -s                               ; swap space 확인

    # mkfile -nv 40m /home/swapfile          ; swap file 생성

    # /usr/etc/swapon /home/swapfile         ; swap space 확장

    # pstat -s or -T                         ; swap space 확인

  - booting시 자동 swap on 하려면 아래 file edit

    # vi /etc/fstab

           .

           .

    /home/swapfile  swap  swap  rw 0 0

  - swap_on 한 작업을 최소 하려면

    # rm /home/swapfile

    # vi /etc/fstab 하여 추가했던 entry 삭제



* Solaris 2.x

    # pstat -s                                 ; swap space 확인

    # /usr/sbin/mkfile -nv 40m /home/swapfile  ; swap file 생성

    # swap -a /home/swapfile                   ; swap 공간 확장

    # pstat -s or swap -s                     ; total swap_size 확인

  - booting시 자동 swap on 하려면 아래 file edit

    # vi /etc/vfstab

           .

           .

    /home/swapfile  - - swap - no -



* SWAP(참조)

    The swap command is used to display swap space usage, and to add or remove swap areas on

    disk;

      #swap -l               

    swapfile                  dev    swaplo blocks free

    /dev/dsk/c0t3d0s1 32,25      8 187912 127088

    Creating and Adding swap areas

      #mkfile 10m /exp/swap

      #swap -a /exp/swap

      #swap -l

    swapfile                  dev    swaplo blocks free

    /dev/dsk/c0t3d0s1 32,25      8 187912 127088

    /exp/swap         -          8   20472  20472

    Removing swap areas

      #swap -d /exp/swap




9장. MAIL



9.1 일반적 mail 사용법



Sending Mail:

example%      mail user               /* 동일 host에 계정을 가지고 있는 사용자

                                         에게 mail을 보낼 경우 */

^D                                     /* message를 끝내는 방법 */

example%      mail user@machine     /* host는 틀려도 network으로 연결 되어

                                         있는 사용자에게 mail을 보내는 방법 */

^C                                     /* message 편집을 포기하는 방법 */



Tilde Escapes:

message을 작성시 편리하게 작성할 수 있게 해주는 command이다.

이 tilde 명령은 mail user 명령을 입력한 후에 메일 내용을 작성중에

입력하는 명령이다.

                example% mail dove

                Subject: test

                test

                ~b user

                .

                example%



~b user                 /* Blind Carbon Copy(Bcc) 의 names을 추가 한다.*/

                      /* Bcc안의 name들은 mail message의 header에 나타나지

                         않는다. mail을 보낸 사람이 누구누구에게 mail을 보내는

                         지 모르게 된다.

                         Cc는 받는 이의 message의 header에 나타난다. */

~c user                 /* Carbon Copy(Cc)에 names을 추가 한다.      */

~f n                   /* mail spool의 n번째 저장되어있는 mail을 forward한다.*/

~h                     /* header field(To,Subject,Cc,Bcc)을 편집한다.*/

~m n                  /* mail spool의 n번째 저장되어 있는 mail을 읽어들인다.*/

~p                     /* 편집한 내용을 처음부터 more로 display해 준다.*/

~r                     /* letter을 편집중에 file을 삽입시킬 수 있다. */

~s subject text         /* subject를 바구거나 추가할 수 았게 한다. */

~t user1 user2         /* mail을 받을 주소을 추가시킨다.  */

~v                     /* text편집 도중에 vi editor로 편집할 수 있다.*/

~w file                 /* message을 file로 저장한다. */

|cmd                  /* 현재 입력한 내용을 shell command로 수행한다. */

~?                     /* 사용 가능한 command menu을 display 한다. */



Reading Mail :

example%      mail    /* mailbox에 쌓여 있는 message의 headers을 출력 */

        Mail version 2.18 5/19/83.      Type ? for help.

        "/usr/spool/mail/student": 2 messages 2 new

        >N 1 john Tue May 14 15:31 11/278 "letter"

         N 2 jane@universe tue May 14 15:33 13/437

&<cr>         /* '>'로 display될 message을 가르킨다. */

&n             /* 사용자가 원하는 message의 순번을 입력하면 그 번호에

                 해당하는 message가 display 된다     */

&d n           /* 사용자가 원하는 순번의 message가 삭제 된다. */

&h             /* 사용자가 볼 수 있는 message의 headers을 display한다.*/

&q             /* 종료 command이다. message들은 mbox에 저장된다. */

&r n           /* 순번 n에 대하여 응답을 하게다는 command이다.      */

&s n file       /* 순번 n의 message을 이름 file로 저장하는 command */

&x             /* mail을 수행하기 이전의 상태로 종료 한다. */

&?             /* 사용 가능한 command를 display한다.         */



example%  mail -f file         /* message을 저장해 놓은 이름이 file 인 file을

                                 mail로 볼 수 있다. */

example%  mail -f mbox              /* 위와 같은 경우로 mbox에 있는 message을 검색

                                 검색 한다. */

example%  mail -f folders     /* folders 안의 message을 검색 한다.   */

Collecting in Mail folders :

----------------------------

set folder=Directory             /* message만을 저장해 놓는 directory정의*/

&s +file                 /* '+' 뒤의 filename에 현제의 message가  

                                 추가된다. */

&folders                 /* 현재의 folder directory에 들어 있는 file들의

                                 list을 display한다. */



Forwarding Mail :

사용자가 login한 machine의 home directory에 .forward file을 만들어둔다. 여기에는

login한 machine으로 들러오는 mail을 다른 machine으로 보낼 수있게 다른 machine의

domain을 기록한다.  방법은 다음과 같다.

        student@sun   /* Entry in .forward file.         */



Customizing Mail :

사용자의 home directory에 .mailrc을 다음과 같이 생성하시오.

Set ask                 /* subject을 입력할 것인가 묻는다.      */

Set askcc              /* 'carbon copy' 을 지정할 겻인지 묻는다 */

Set crt=34              /* page당 message의 출력 line 수 정의  */

set record=-/Mail/outbox /* outbox에 mail을 recorde 단위로 보낸다.*/

alias ss student@sun    /* full name을 간단히 줄인 것이다.    */

alias group student1@pioneer student2@discovery student3@challenger \

         student4@mariner student5@columbia student6@mercury \

        student7@galieo student8 @voyager

/* 보내는 곳을 group으로만 하면 위의 모든 주소들로 보내준다. */



9.2 메일 서버 센드 메일(Sendmail)



1) 센드 메일 구성



센드 메일은 /usr/sbin/sendmail 데몬 프로그램과 /etc/sendmail.cf, /etc/sendmail.cw, /etc/aliases 파일 등의 설정 파일로 구성되어 있다. 센드 메일의 경우에는 현재 인터넷 사회에서 큰 문제로 떠오르고 있는 스팸(SPAM) 메일 문제에 대한 해결책의 하나로 아무나 여러분의 센드 메일 서버를 메일 중계기로 사용할 수 없도록 하는 설정 파일 디렉토리인 /etc/mail 디렉토리와 설정 파일이 추가되어 있기 때문에 주의해야 할 것이다. 그동안 잘 되다가 메일서버를 업그레이드하자마자 내부 네트웍의 다른 호스트에서 메일이 밖으로 나가지 않는다든지 하는 문제가 이 스팸 방지 / 중계 방지 기능 때문일수도 있으니 주의 해야 한다.



2) 센드 메일 설정 파일 /etc/sendmail.cf



센드 메일 설정 파일의 난해함은 악명높다. 사실, 인간을 위한 설정 파일이 아니라, 너무도 기계적인 측면에서 볼 때 편리한 방식을 사용하고 있기 때문이다.

그러나 센드 메일 설정 파일의 모든 내용을 이해할 필요가 없으며, 중요한 몇 가지 설정 내용만을 알아두는 것으로 충분하다. 기본 설정 파일만으로도 센드 메일은 잘 운영되므로 이해하지 못하는 부분은 건드리지 않는 것이 좋다. 센드 메일 설정 파일을 빈 상태에서 하나씩 만들어 가는 사람은 없으며, 모두들 필요한 그 부분만을 수정하여 잘 운용 하고 있다. 어렵게 보이는 것일수록 사실은 별로 다를 것이 없는게 일반적이다.



설정 파일에서 # 문자로 시작하는 줄은 유닉스 관례에 따라 설정 내용에 영향을 미치지 않는 주석이다. 설정 파일은 전형적으로 D,C,F와 같은 한 글자 명령 다음에 한 글자 변수가 나오고, 정의할 내용이 뒤따른다. 다음과 같은 모습을 띤다.

   # cat sendmail.cf

   # Level 7 config file format

    v7/Berkeley

    Cwlocalhost

    # file containing names of hosts for which we receive email

    Fw/etc/sendmail.cw

    #Dj$w.Foo.COM

    # who I send unqualified names to (null means deliver locally)

    DR

    # who gets all local email traffic ($R has precedence for unqualified names)

    DH

    # who I masquerade as (null for no masquerading) (see also $=M)

    DMalpha.sarang.net



주로 설정하여 사용하는 부분



Cw,Fw구문해석 : 어떤 호스트 이름에 대하여 메일을 받을 것인가?



Cw 명령은 w라는 클래스의 값을 하나씩 추가하는 명령이다.

Fw 명령은 w라는 클래스의 값에 파일 내용을 추가하는 명령이다.



위에서 Cwlocalhost라고 한 것은 센드 메일이 기본적으로 지역 호스트 localhost로 온 메일을 받아 처리하도록 하는 행으로서, 모든 센드 메일 설정에 기본으로 들어있다. 이 외에도 하나의 호스트에 여러 호스트 이름이 부여되어 있는 경우, 그 모든 이름에 대하여 메일을 받도록 하려면 이름 하나 하나 마다 Cw 명령을 계속 사용하면 된다.



Cwfoo0.bar.com

Cwfoo1.bar.com



foo0.bar.com과 fool.bar.com에 대하여 모두 메일을 받아들이도록 한 예이다.

Fw 명령은 그 뒤에 적은 파일에 들어 있는 호스트 이름에 대하여 모두 메일을 받도록 할 때 사용한다.

Fw/etc/sendmail.cw라는 기본 값이 설치 시에 들어 있으므로 /etc/sendmail.cw 파일에 받고자 하는,호스트 이름 들을 나열하여 적으면 된다.

네트웍상에 여러 대의 호스트가 있다 하더라도 한 대를 메일 게이트웨이로 사용하고자 할 때 유용하게 사용한다.



메일 호스트 이름 강제 설정 Dj



Dj 명령 다음에는 센드 메일 서버가 돌아가는 호스트 이름을 적는다. 일반적으로 Dj행은 주석 처리되어 있다. 보통의 경우 센드 메일 서버가 실행되면서 호스트 이름을 자동으로 알아내기 때문이다. 하지만, 어떤 이유로 인해 센드 메일이 자기가 실행되는 호스트 이름을 정확히 알아내지 못할 때는 Dj 명령 다음에 빈 칸없이 호스트 이름을 적는다.



메일 발신지를 속이는 DM

DM 다음에 호스트 이름을 적으면 메일 송신자 주소에 실제로 보낸 이름이 아니라, 적어준 그 이름이 사용된다. 주로 메일 게이트웨이를 자신의 센드 메일 서버가 아닌 중앙의 센드 메일 서버로 지정하는 경우 필요하다.



자신 이외의 다른 메일 서버를 메일 중계 서버로 사용하려는 클라이언트 호스트들에 대해서 메일 게이트웨이에서는 /etc/mail 디렉토리 설정을 해주어야 한다. 아무나 아무 메일 서버를 중계 서버로 사용할 수는 없다.



3) 사용자 별칭 테이블 /etc/aliases



/etc/aliases 파일에는 계정 이름 이외의 별칭을 만들어 사용할 수 있도록 해주고 있다.



   # General redirections for pseudo accounts.

   bin:        root

   daemon:     root

   games:      root

   ingres:     root

   nobody:     root

   system:     root

   toor:       root

   uucp:       root

   # Well-known aliases.

   manager:    root

   dumper:     root

   operator:   root

   # trap decode to catch security attacks

   decode:     root



설정 형식은 다음과 같다.



   name: name1, name2, ...

   name: include:fileName



위의 예에서 nobody라는 사용자에게 메일을 보내면 그 메일은 nobody: 오른쪽에 적힌 root라는 사용자에게 전달된다. operator라는 사용자에게 보내도 그 메일은 root에게로 전달된다.


메일은 계정 등록된 사용자에게만 갈 수 있으나, 이렇게 별칭 테이블을 사용하면 웹 마스터라든지, FTP 마스터와 같은 기능적인 이름의 계정에게 메일을 보내게 할 수 있다.


어떤 그룹에게 메일을 보내고 싶을 때 간단하게 별칭 테이블을 사용할 수 있다. 별칭 뒤에 실제 메일 주소를 여러 개 적어나가거나, :include: 다음에 메일 주소가 적힌 파일 이름을 적어줄 수 있다. 예를 들어, me: yong@foo.net, yong@bar.net이라고 적고, me에게 편지를 보내면 그 뒤에 적힌 두 개의 주소로 메일이 전송된다.



전문적인 메일링 리스트 기능은 Majormodo와 같은 프로그램을 사용한다.



별칭 테이블 내용을 바꾼 다음에는 newaliases라는 명령을 1회 내려주는 것이좋다.



   # newaliases

   /etc/aliases: 15 aliases, longest 18 bytes, 175 bytes total



센드 메일은 빠른 검색을 위해 실제로는 /etc/aliases.db라는 버클리 DB 파일을 사용하는데, 위 newaliases 명령이 그 DB 파일을 생성시키는 유틸리티 이다.



4) 메일 중계 기능 설정 /etc/mail



메일 중계 설정은 내부 네트웍에서 특정 메일 호스트를 중계 호스트로 지명할 때 매우 중요하다. 왜냐하면, /etc/mail 디렉토리 이하의 설정을 명확하게 해주지 않으면 기본적으로 메일 중계를 허락하지 않도록 되어 있기 때문이다.

이는 스페머(Spammer)라고 부르는 원하지 않는 광고성 메일을 무작위로 뿌려되는 것을 막아내기 위한 방책이다. 보통 스패머들은 남의 메일 서버를 중계 서버로 사용하여 메일을 마구 확산시키기 때문에 중계 기능은 철저히 관리되어야 한다.



access

센드 메일 8.9.x 버전에서 메일 서버에 대한 접근을 허용할 것인지 아닌지를 설정하는 파일이다.



파일 형식에 대해서는 파일 안에 주석으로 잘 설명되어 있을 것이다. 형식은 다음과 같다.



   # cyberspammer.com       REJECT

   # sendmail.org           OK

   # 128.32                 RELAY

   192.168.1                RELAY

   198.60                   REALY



설정 파일을 서버 환경에 맞게 수정후 access.db라는 버클리 DB 파일을 아래와 같이 생성 시킨다. 이렇게 하면 서버에 들어오는 메일을 신속하게 처리 할수 있게 된다.



   # cd /etc/mail

   # makemap hash /etc/mail/access < /etc/mail/access




sendmail command

The sendmail command is executed in the script /etc/rc2.d/S88sendmail when the machine is

started.

The default command is 아래

   # /usr/lib/sendmail -bd -q1h

     -bd     background daemon

     -q      quest the messages for retry when sendmail fails to deliver.

              The associated value 1h tells sendmail to process the

              queue every hour.




5) 센드메일 서버 설치하기



현재 센드메일은 8.9.10 버전이 베타 테스트 중이며, 사용해도 무방한 안정적인 최종 버전은 sendmail 8.9.3 으로서, 자원연구소의 서상용박사님 와 한글센드메일8.8.7을 만든 과학기술원의 노정석님의 노고로 sendmail-8.9.3H 버전으로 재구성 되어 리눅스와 솔라리스 환경에서 설치하기 쉬운 상태로 Package화 되어 배포 되고 있다.

솔라리스 환경에서 설치 운영해 본 결과 예전의 버전들에 비해 상당히 쉽게 설치할수 있도록 배려되어 있는 것을 확인 할수 있었고, 운용상에도 전혀 문제가 없는 것으로 나타났다.

sendmail 8.9.x의 가장 큰 특징은 SPAM메일을 차단하는 기능이라 할수 있는데, 이것 또한 몇 개의 파일에 의해 쉽게 구현할 수 있어 메일서버를 운영하는 관리자는 서버의 관리에 별 어려움이 없을걸로 판단된다.



센드메일 소스 다운로드 및 압축풀기



   ftp.kreonet.re.kr:/pub/people/sysuh/sendmail-8.9.3H-bin.tar.gz



 임의의 directory에 파일을 이동시켜 압축해제 한다. 여기서는 /tmp 디렉토리로 설명된다.

   % cd /tmp

   % gzip -dc sendmail-8.9.3H-bin.tar.gz | tar xvf -

 압축을 풀면 아래와 같은 directory가 생성되며 그곳에 설치관련 파일들이 생성된다.

 생성된 directory로 이동한다.

   % cd sendmail-8.9.3H-bin

 센드메일은 슈퍼유저 상태에서 설치되기 때문에 일반 유저계정이라면 슈퍼유저로 Switching.

   % su

 설치 Script를 실행한다.

   # ./install

 Script가 실행되면서 아래와 같은 메시지들이 보일 것이다.

   [www:/tmp/sendmail-8.9.3H-bin]# ./install

   Please enter your domain name [dct.co.kr]:

   saving old sendmail binaries in "sendmail.bck.19991028-154651.tar.gz"

   a /usr/lib/sendmail 665K

   a /usr/lib/smrsh 8K

   a /etc/mail/sendmail.hf 6K

   a /etc/mail/sendmail.st 1K

   a /usr/sbin/mailstats 10K

   a /usr/sbin/makemap 303K

   a /usr/sbin/praliases 290K

   /etc/sendmail.cf는 /etc/mail/sendmail.cf와 기호 링크됨

   a /etc/mail/sendmail.cf 32K

   backup done

   now installing sendmail-8.9.3H-Solaris-bin.tar

   x usr/lib/sendmail, 680892 bytes, 1330 테이프 블럭

   x usr/lib/smrsh, 7272 bytes, 15 테이프 블럭

   x etc/mail/sendmail.hf, 5342 bytes, 11 테이프 블럭

   x etc/mail/sendmail.st, 616 bytes, 2 테이프 블럭

   x usr/sbin/mailstats, 10168 bytes, 20 테이프 블럭

   x usr/sbin/makemap, 309272 bytes, 605 테이프 블럭

   x usr/sbin/praliases, 296548 bytes, 580 테이프 블럭

   installing sendmail.cf

   installing /etc/mail/sendmail.cw

   setting directory mode

   /etc/mail/aliases: 94 aliases, longest 10 bytes, 1033 bytes total

   killing old sendmail process...

   Starting new sendmail...

   All done.

   [www:/tmp/sendmail-8.9.3H-bin]#



 아무런 문제 없이 위처럼 Script가 실행 완료 됬다면, 설치가 잘 된 것이다.

 서버에 따라서 sendmail.cf, sendmail.cw, relay-domains, access, aliases... 등의 파일 설정이

 제대로 되 있는지 다시 확인하고 sendmail deamon을 start한다.

 설치 Script실행시 error가 발생했다면, 설치시에 아래처럼 하여 error 로그파일을 만들어

 아래의 메일주소로 메일링하면 정확한 해답을 얻을수 있을 것이다.

   # ./install -y >&! install.log

   # mail sysuh@kigam.re.kr < install.log



 ※ /etc/mail/access는 처음 설치시 없을 수가 있는데, 없다면 외부로 부터의 모든 mail_relay

    를 거부한다. 그러므로 허용 하고자 하는 IP나 domain을 앞서 설명한 룰에 따라 설정해준다.

10장. POP Server



Ⅰ. popserver의 개념



                Internet
 


                     |

           인터넷용 | 외부적 IP (203.240.159.34)

                DCT
 


                     | 내부적 IP (192.9.10.105)

                     |

    ---------------------------------------

     |   |   |    |   |   |  | | | |

                . . . ..




이 경우 각각의 단말기의 IP address가 192.~~이면 이 address로는 인터넷을 direct로 사용할 수

없다.따라서 이 경우에는 mail host이자 server인 dct에 proxy server나 popserver를 설정하면 각각의 단말기들도 Netscape, Eudora와 같은 프로그램을 통해 인터넷메일을 이용할 수 있다.



Ⅱ. popper 구해오기

ftp://sunsite.sut.ac.jp에서 다운로드 받는다.



대부분 OS별로 pakage되어 있는데 임의의 directory에서 pkgadd 명을 사용하여 설치한다.



Ⅲ. pop-3 setting

관련 파일 : /etc/inetd.conf

          /etc/services



㉠ /etc/inetd.conf file에서

pop3   stream   tcp   nowait   root   /usr/local/bin/popper   popper -s

위의 내용을 추가시킨다.

㉡ /etc/services file에서

pop3    110/tcp    #Post Ofice

와 같이 지정한다.



㉢ 위의 110번은 port 번호이므로 다음과 같은 예제 명령어로 setting의 여부를 확인할 수 있다.

이것을 확인하기 전에 inetd daemon을 kill한 후에 다음을 실행할 것.

# telnet loghost 110



※ 주의사항:

 /etc/inetd.conf file과 /etc/services file안에 있는 pop3의 이름이 pop3인지 아니면

 pop-3인지 확인할 것. 서로 이름이 같아야 된다.




11장. DNS(Domain name Service)



1) 도메인 서버의 구성절차

 1. /etc/named.boot 생성

 2. /var/named 디렉토리 생성

 3. /var/named/???.cache

 4. /var/named/???.zone

        ; host DB file 이며, 이 파일에 추가되는 host를 update 시켜야 한다.

 5. /var/named/???.rzon

        ; reverse 된 host DB file 이며, 이 파일에 추가되는 host를 update 시켜야 한다.

 6. /var/named/???.loop

        ; 루프백 파일

 7. /etc/resolv.conf

        ; Domain과 name_server_IP address를 기술하는 파일

 8. /etc/defaultrouter

        ; 시스템의 G/W

 9. /etc/defaultdomain

 10. /etc/nsswitch.conf 파일 Modified

        hosts: files dns <--- 추가

 11. 데몬 실행 : #in.named -b /etc/named.boot

 12. 서버 확인 : #nslookup 서버ip-addr

 13. 아래 예시는 각 설정 파일 내용이며, 부분별로 설명을 넣었다.

      *정보통신교육원(AIIT)에 적용된 실제 예이다.



2) PRIMARY SERVER 의 구성 예



; /etc/named.boot

;

directory      /var/named

cache          .                              aiit.cache

primary        aiit.or.kr.                    aiit.zone

primary        in-addr.arpa                   aiit.rev

primary        0.0.127.in-addr.arpa           aiit.loop



; /var/named/aiit.loop

;

@       IN SOA www.aiit.or.kr. root.www.aiit.or.kr. (

                            19980521 ; Serial

                              3600   ; Refresh

                              300    ; Retry

                              3600000 ; Expire

                              14400 ) ; Minimum

      IN     NS     www.aiit.or.kr.

1      IN     PTR    localhost.



; /var/named/aiit.zone

;

$ORIGIN  aiit.or.kr.

aiit.or.kr.    IN     SOA  www.aiit.or.kr. root.www.aiit.or.kr.

(

                19990930

                7200

                3600

                432000

                86400

)

aiit.or.kr.    IN     NS     www

localhosti       IN      A      127.0.0.1

;

; SEOUL

;

$ORIGIN or.kr.

aiit             IN      A      134.75.107.202

$ORIGIN aiit.or.kr.

www          IN     A     134.75.107.202

........... 중략 ............................................

infor07        IN     A     134.75.107.13

;

; PUSAN

;

pusan          IN     A     134.75.156.201

........... 중략 ............................................

kbe11          IN     A     134.75.156.211

;

; TAEGU

;

jboh           IN     A      134.75.142.111

........... 중략 ............................................

tk240          IN     A      134.75.142.240

;

;

;

; TAEJEON

;

cts            IN     A      210.119.58.6

tschang        IN     A      210.119.58.5

taejeon         IN      A      210.119.58.2

$ORIGIN taejeon.aiit.or.kr.

tjaiit         IN     A      210.119.58.2

www            IN     A     210.119.58.2

;

;

;

$ORIGIN aiit.or.kr.

kj             IN     A      210.119.59.3

........... 중략 ............................................

ts              IN      A      210.107.252.5

$ORIGIN ts.aiit.or.kr.

aiitfire  IN      A      210.107.253.20

aiitmain IN      A      210.107.252.5

$ORIGIN gis.aiit.or.kr.

gis141         IN     A      150.183.46.141

$ORIGIN mm.aiit.or.kr.

sun            IN     A      210.114.126.150

$ORIGIN aiit.or.kr.

multi           IN      A      210.114.126.150       

;

; EOF

;



; /var/named/aiit.rev

;

$ORIGIN  in-addr.arpa.

in-addr.arpa.  IN     SOA  www.aiit.or.kr. root.www.aiit.or.kr.

(

                19991026

                7200

                3600

                432000

                86400

)

in-addr.arpa.  IN     NS    www.aiit.or.kr.

1.0.0.127      IN      PTR    localhost.

;

; SEOUL

;

$ORIGIN        107.75.134.in-addr.arpa.

202            IN     PTR    aiit.or.kr.

........... 중략 ............................................

13             IN      PTR    infor07.aiit.or.kr.

;

; PUSAN

;

$ORIGIN        156.75.134.in-addr.arpa.

210           IN     PTR    kbe10.aiit.or.kr.

........... 중략 ............................................

211           IN     PTR    kbe11.aiit.or.kr.

;

; TAEGU

;

$ORIGIN        142.75.134.in-addr.arpa.

111            IN      PTR    jboh.aiit.or.kr.

........... 중략 ............................................

240           IN     PTR    tk240.aiit.or.kr.

;

;TAEJEON

;

$ORIGIN        58.119.210.in-addr.arpa.

6              IN     PTR    cts.aiit.or.kr.

........... 중략 ............................................

2             IN     PTR    www.taejeon.aiit.or.kr.

;

;

;

$ORIGIN        155.233.203.in-addr.arpa.

233.155.233.203 IN     PTR    handy.aiit.or.kr.

232.155.233.203 IN     PTR    cybus.aiit.or.kr.

214.155.233.203 IN     PTR    choi.aiit.or.kr.

$ORIGIN        59.119.210.in-addr.arpa.

3              IN      PTR    kj.aiit.or.kr.

;ts

$ORIGIN        253.107.210.in-addr.arpa.

22             IN      PTR    w3.aiit.or.kr.

20             IN      PTR    aiitfire.ts.aiit.or.kr.

$ORIGIN        252.107.210.in-addr.arpa.

5              IN      PTR    ts.aiit.or.kr.

5              IN      PTR    aiitmain.ts.aiit.or.kr.

$ORIGIN        46.183.150.in-addr.arpa.

141            IN      PTR    gis141.gis.aiit.or.kr.

$ORIGIN        126.114.210.in-addr.arpa.

150            IN      PTR    sun.mm.aiit.or.kr.

$ORIGIN         126.114.210.in-addr.arpa.

150            IN     PTR    multi.aiit.or.kr.

;

; EOF

;



; /var/named/aiit.cache

;

.                       3600000 IN NS   A.ROOT-SERVERS.NET.

A.ROOT-SERVERS.NET.     3600000     A    198.41.0.4

;

; formerly NS1.ISI.EDU

;

.                       3600000     NS   B.ROOT-SERVERS.NET.

B.ROOT-SERVERS.NET.     3600000     A    128.9.0.107

;

; formerly C.PSI.NET

;

.                       3600000     NS   C.ROOT-SERVERS.NET.

C.ROOT-SERVERS.NET.     3600000     A    192.33.4.12

;

................................ 중략 ..............................................

; temporarily housed at NSI (InterNIC)

;

.                       3600000     NS   K.ROOT-SERVERS.NET.

K.ROOT-SERVERS.NET.     3600000     A    198.41.0.11

.                       3600000     NS   www.

www.                    3600000     A    134.75.107.202

; End of File






3) SECONDARY SERVER



SECONDARY 에서는 /etc/named.boot , /var/named/loop.back , /var/named/cache 만 만들어 주고 /usr/sbin/in.named를 구동 하면 PRIMARY 서버에서 필요한 ???.zone ???.rev 파일을 가져온후, 서버가 준비 상태에 놓인다.



    # tail -5 /var/adm/messages

    .............

    Oct 27 11:56:19 tjaiit named[6427]: starting. named 4.9.3-P1

    Oct 27 11:56:19 tjaiit named[6428]: Ready to answer queries.



; /etc/named.boot

;

; type         domain                         source file

;

directory      /var/named     ; running directory for named

cache          .                              tj.cache

primary        0.0.127.IN-ADDR.ARPA           tj.loop

secondary      aiit.or.kr     134.75.107.202 tj.zone

secondary      in-addr.arpa   134.75.107.202 tj.rev

;

forwarders      134.75.107.202

slave




; /var/named/tj.loop

;

;

@      IN     SOA    taejeon.aiit.or.kr.     root.taejeon.aiit.or.kr. (

                                      980116 ; Serial

                                      7200   ; Refresh every 2 hours

                                      7200   ; Retry every 2 hour

                                      604800 ; Expire after a week

                                      86400 ) ; Minimum ttl of 1 day

      IN     NS     tjaiit.taejeon.aiit.or.kr.

1      IN      PTR    localhost.



; /var/named.tj.cache

;

.                       3600000 IN NS   A.ROOT-SERVERS.NET.

A.ROOT-SERVERS.NET.     3600000     A    198.41.0.4

;

; formerly NS1.ISI.EDU

;

.                       3600000     NS   B.ROOT-SERVERS.NET.

B.ROOT-SERVERS.NET.     3600000     A    128.9.0.107

;

............. 중략 ............................................

;

.                       3600000     NS   I.ROOT-SERVERS.NET.

I.ROOT-SERVERS.NET.     3600000     A    192.36.148.17

; End of File



; /var/named/tj.zone - /usr/sbin/in.named를 가동시키면 서버가 자동으로

;                             PRIMARY SERVER에서 Download하며, 바뀐 내용을 계속

;                             Update 하게 된다.

;                     

; BIND version named 4.9.3-P1

; zone 'aiit.or.kr'  last serial 0

; from 134.75.107.202  at Wed Oct 27 11:52:03 1999

$ORIGIN or.kr.

aiit             IN      SOA   www.aiit.or.kr. root.www.aiit.or.kr. (

                19990930 7200 3600 432000 86400 )

                IN      NS     www.aiit.or.kr.

$ORIGIN aiit.or.kr.

www           IN      A      134.75.107.202

$ORIGIN or.kr.

aiit             IN      A      134.75.107.202

$ORIGIN mm.aiit.or.kr.

sun            IN      A      210.114.126.150

$ORIGIN aiit.or.kr.

pusan          IN      A      134.75.156.201

tksun           IN      A      134.75.142.105

potato         IN      A      134.75.107.13

eagle5         IN      A      134.75.107.39

................ 이하생략 ..............................................



; /var/named/tj.rev - /usr/sbin/in.named를 가동시키면 서버가 자동으로

;                             PRIMARY SERVER에서 Download하며, 바뀐 내용을 계속

;                             Update 하게 된다.

;                     

; BIND version named 4.9.3-P1

; zone 'in-addr.arpa'  last serial 0

; from 134.75.107.202  at Wed Oct 27 11:52:03 1999

$ORIGIN arpa.

in-addr         IN      SOA   www.aiit.or.kr. root.www.aiit.or.kr. (

                19991026 7200 3600 432000 86400 )

                IN      NS     www.aiit.or.kr.

; Ignoring info about www.aiit.or.kr, not in zone in-addr.arpa.

; $ORIGIN aiit.or.kr.

; www         IN      A      134.75.107.202

$ORIGIN 0.127.in-addr.arpa.

0      14400  IN      NS     www.aiit.or.kr.

; Ignoring info about www.aiit.or.kr, not in zone in-addr.arpa.

; $ORIGIN aiit.or.kr.

; www         IN      A      134.75.107.202

$ORIGIN 155.233.203.155.233.203.in-addr.arpa.

214            IN      PTR    choi.aiit.or.kr.

232            IN      PTR    cybus.aiit.or.kr.

233            IN      PTR    handy.aiit.or.kr.

$ORIGIN 142.75.134.in-addr.arpa.

115            IN      PTR    shan.aiit.or.kr.

117            IN      PTR    wspark.aiit.or.kr.

118            IN      PTR    sbhong.aiit.or.kr.

119            IN      PTR    jtsung.aiit.or.kr.

201            IN      PTR    tk201.aiit.or.kr.

................ 이하생략 ..............................................



;

; /var/named/tj.cache - PRIMARY 서버의 것과 같다.

;

.                       3600000 IN NS   A.ROOT-SERVERS.NET.

A.ROOT-SERVERS.NET.     3600000     A    198.41.0.4

;

; formerly NS1.ISI.EDU

;

.                       3600000     NS   B.ROOT-SERVERS.NET.

B.ROOT-SERVERS.NET.     3600000     A    128.9.0.107

;

; formerly C.PSI.NET

;

.                       3600000     NS   C.ROOT-SERVERS.NET.

C.ROOT-SERVERS.NET.     3600000     A    192.33.4.12

;

.

................ 중략 ..................................................

;

.                       3600000     NS   I.ROOT-SERVERS.NET.

I.ROOT-SERVERS.NET.     3600000     A    192.36.148.17

; End of File




12장. NFS(Network File Service)



12.1 NFS 설정



[NFS Server 설정]

* /etc/rc2.d/S73nfs.client , /etc/rc3.d/S15nfs.server 참조.

1) /etc/dfs/dfstab을 편집해서 아래 예처럼 share할 영역을 지정.



   share -F nfs -o rw /disk1

   share -F nfs -o rw -d "Data Disk" /disk1

   share -F nfs -o root=Client1:Client2:ClientX...,rw=Client1:Client2:ClientX...

                   -d "UserHome" /HOME_DIR

       설명: Client1:Client2:ClientX...가 /HOME_DIR 에 대하여 root권한을 가지며

             또한 nobody 권한으로서 읽기와 쓰기가 가능함.

             ro=c1:c2:... --> c1:c2:..들에 대하여는 읽기만 가능.



2) shareall 명령으로 dfstab상의 영역을 share 한다.

   share 명령으로 실행됬는지 확인

3) unshare or unshareall

   # unshare /HOME_DIR

   # unshareall



[NFS Client 설정]

1) /etc/vfstab 에 아래내용을 추가한다.

   server:/disk1 - /disk1 nfs - yes -

   server:/disk2 - /disk2 nfs - yes -

2) 위 1)은 시스템 부팅시 자동으로 인식하게 할 경우고, 명령행에서 바로 할 경우는 아래

   mount server:/disk1 /disk1



[NFS Client 설정시 고려사항]

- 새로 인식된 NFS영역에 write가 안될 경우 서버쪽의 share된 디렉토리의 퍼미션을

  바꾸어 본다.

- /etc/hosts.equiv 와 /.rhosts 파일에 "+ +"기호가 있거나, 특정 Host_name가 있어야 된다.

  Syntax) user_name host_name

          ........

          +          +         --> 모든유저 및 모든 호스트에 RemoteLogin허용(rlogin...)

                                     보안에 문제됨.



12.2 일반적인 NFS Error의 유형과 해결 방법



대부분의 NFS 문제는 console 메시지 또는 Client의 증상을 통해서 알 수 있다.



* nfs mount : RPC : Name to address transllation

failed - n2a : hostname not found

이 메시지는 boot 중이나 mount request 시에 나타날 수 있으며, unknown server가 지정되었음.

; host database의 host 명이 정확한지 확인한다.



* NFS server mars not responding, still trying

이 메시지는 boot시에, 또는 mount request 시에 나타날 수 있으며 known server지만,

unreachable 함을 나타냄

; 1. server가 down 되었는가를 점검함.

  2. 운용 machine과 server 간의 network이 정상인지 server 측으로 pinging(ping server)하여

     점검함.



* nfs mount: mars: RPC: Program not registered

이 메시지는 boot 중에 또는 mount request 시에 나타날 수 있으며 server를 reachable 하지만

하나 또는 여러개의 필요 daemon이 running 되지 않는 상태임.

; 1. who -r 명령으로 run level이 3인지 확인하여, 아닐경우 init 명령으로 run level을 3으로함.

  2. ps -e 명령으로 mount daemon과 NFS server daemon이 running 중인가를 확인한다.

     /etc/init.d/nfs.server script를 start keyword를 이용하여 start 시킴.



* nfs mount: mars:/opr: No such file or directory

이 메시지는 boot 중에 또는 mount request 시에 나타날 수 있으며 server 상에 unknown file name

이 있음을 나타냄.

; server에 해당 directory가 있는지 확인하고 /etc/vfstab file의 경로명을 점검함.



* mount: mount-point /DS9 does not exist.

이 메시지는 boot 중에 또는 mount request시에 나타날 수 있으며 mount point가 존재하지 않음을

나타냄.

; Client 측에 mount point가 존재하는지를 확인하고, /etc/vfstab file의 경로명을 점검함.



* le0: No carrier - transceiver cable problem?

이 메시지는 boot 중에 또는 mount request시에 나타날 수 있으며 network 장애를 나타냄.

; 사용 장비와 server 간에 Terminator 등 physical network connection을 점검함.



* stale NFS file handle

이 메시지는 프로세스가 remote file 자원을 access 하고자 할 때 나타날 수 있으며 file handle

처리 일자가 지난 것임.

; file 자원이 server로 이동 되었을 수 있으므로 unmount하고 client에서 다시 mount 시킴.

  “nfs mount mars:/usr/share/man: No such file or directory." 메시지가 나올 경우에는 server

  관리자와 상의하고, 잃어버린 file 자원에 대하여 점검함.



* Client에서 마운트 시도할 때 “권한거부” 메세지

; /etc/hosts의 table에 해당 호스트가 등록이 되어 있는지 확인

13장. FTP



13.1 anonymous FTP install



* 쉽게 설치하기 위한 방법 : prompt상에서 "man ftpd"하면 FTPD의 설명과 함께 Example로 포함된

Script부분이 있다.

이 부분을 축출하여 실행Script로 만들고, man page 에 설명된 설치방법에 따라 수행하면,

간단히 Anonymous FTP를 설치 할 수가 있다.



!) ftp server를 설치해놓고, anonymous로 접속하면 ls,get..등 기본명령이 안된다.

 can't create data socket(0.0.0.0,20) : no such file or directory

- device or library 의 문제일 가능성



다음은 ~ftp아래에 있어야할 목록들이다.

ftpmgr은 ftp관리용 계정이고, 임의의 걸로 해도 됨.

각 directory 퍼미션에 주의할것.



~ftp/etc

>ls -al

drwxr-xr-x  9 ftpmgr  adm          512 Apr 19 09:58 ./

drwxr-xr-x  5 root    root         512 Mar 31 15:08 ../

d--x--x--x  2 root    root         512 Apr 19 09:56 bin/

dr-xr-xr-x  2 root    root         512 Apr 19 09:49 dev/

dr-xr-xr-x  2 root    root         512 Apr 19 09:45 etc/

drwxrwxrwt  3 ftpmgr  adm          512 Apr 16 09:57 incoming/

drwxr-xr-x  2 root    root         512 Apr 19 09:58 outgoing/

drwxr-xr-x  9 ftpmgr  adm          512 Apr 17 16:33 pub/

drwxr-xr-x  4 root    root         512 Apr 19 09:51 usr/



> ls -al bin

d--x--x--x  2 root    root         512 Apr 19 09:56 ./

drwxr-xr-x  9 ftpmgr  adm          512 Apr 19 09:58 ../

lrwxrwxrwx  1 root    root          13 Apr 19 09:56 ls -> ../usr/bin/ls*



> ls -al dev

dr-xr-xr-x  2 root    root         512 Apr 19 09:49 ./

drwxr-xr-x  9 ftpmgr  adm          512 Apr 19 09:58 ../

crw-r--r--  1 root    root     11, 42 Apr 19 09:47 tcp

crw-r--r--  1 root    root     99,  1 Apr 19 09:49 ticotsord

crw-r--r--  1 root    root     11, 41 Apr 19 09:47 udp

crw-r--r--  1 root    root     13, 12 Apr 19 09:47 zero



위는 device 파일들이고, 아래처럼 mknod 명령으로 만들어준다.



mknod [파일명] [type] [major] [minor]



예) mknod zero c 13 12

  mknod tcp c 11 42

  ....



>ls -al usr

drwxr-xr-x  4 root    root         512 Apr 19 09:51 ./

drwxr-xr-x  9 ftpmgr  adm          512 Apr 19 09:58 ../

d--x--x--x  2 root    root         512 Apr 19 09:51 bin/

dr-xr-xr-x  2 root    root         512 Apr 19 09:54 lib/



> ls -al usr/bin

total 16

d--x--x--x  2 root    root         512 Apr 19 09:51 ./

drwxr-xr-x  4 root    root         512 Apr 19 09:51 ../

-r-xr-xr-x  1 root    root       13400 Apr 19 09:51 ls*



/usr/bin/ls를 cp하면 되고, 보다 엄밀하게는 새로 컴파일 하는게 좋다.

만약 컴파일시 CFLAGS 와 LDFLAGS 옵션에 -Bstatic (or -static in gcc) 로 한다.

ls 외에도 gzip, gtar,,, 등의 유틸리티 도 있으면 준비해 놓을것.



> ls -al usr/lib

total 2652

dr-xr-xr-x  2 root    root         512 Apr 19 09:54 ./

drwxr-xr-x  4 root    root         512 Apr 19 09:51 ../

-rwxr-xr-x  1 root    root      112104 Apr 19 09:52 ld.so.1*

-rwxr-xr-x  1 root    root      621576 Apr 19 09:52 libc.so*

-rwxr-xr-x  1 root    root      621576 Apr 19 09:52 libc.so.1*

-rwxr-xr-x  1 root    root        2644 Apr 19 09:52 libdl.so*

-rwxr-xr-x  1 root    root        2644 Apr 19 09:52 libdl.so.1*

-rwxr-xr-x  1 root    root       14060 Apr 19 09:52 libintl.so*

-rwxr-xr-x  1 root    root       14060 Apr 19 09:52 libintl.so.1*

-rwxr-xr-x  1 root    root      473140 Apr 19 09:53 libnsl.so*

-rwxr-xr-x  1 root    root      473140 Apr 19 09:53 libnsl.so.1*

-rwxr-xr-x  1 root    root       67928 Apr 19 09:53 libsocket.so*

-rwxr-xr-x  1 root    root       67928 Apr 19 09:53 libsocket.so.1*

-rwxr-xr-x  1 root    root       44848 Apr 19 09:53 libw.so*

-rwxr-xr-x  1 root    root       44848 Apr 19 09:53 libw.so.1*

-rwxr-xr-x  1 root    root       10492 Apr 19 09:53 nss_dns.so.1*

-rwxr-xr-x  1 root    root       20980 Apr 19 09:53 nss_files.so.1*

-rwxr-xr-x  1 root    root       23344 Apr 19 09:54 nss_nis.so.1*

-rwxr-xr-x  1 root    root       26680 Apr 19 09:54 nss_nisplus.so.1*

-rwxr-xr-x  1 root    root        8068 Apr 19 09:54 straddr.so*

-rwxr-xr-x  1 root    root        8068 Apr 19 09:54 straddr.so.2*



lib에는 시스템에서 제공하는 loader, shared library를 복사하면 됨.

기본적으로 /usr/lib 아래에 있고, cp 하면 된다.



파일퍼미션에 특히 주의하고, incoming 서비스를 한다면, "chmod 1777 incoming" 로

스티키비트를 사용하면 anonymous로 올릴수는 있되 지우지는 못하도록 할 수 있다.



파일과 디렉토리 소유권도 중요.

ftp가 소유권을 가지게 되면,, 운없으면(퍼미션 설정 잘못하면)

어느날 ftp가 안되는 사태가 올 수도 있다.



마지막으로, ftpd는 /etc/inetd.conf에서 정의되니, 설치후 inetd daemon를 restart해야 함.




14장. PPP (Point to Point Protocol)



14.1 Sun-to-PC Dialup PPP(Async) on Solaris 2.x



** 다음 설명은 Serial port "a"를 PPP에 사용하는 것을 전제로 한다. **

1. PPP 구성전 준비사항

- PPP 와 UUCP가 설치 되어 있는지 확인한다.

        # pkginfo | egrep "PPP|UUCP"

        system     SUNWapppr

        system     SUNWapppu

        system     SUNWbnur

        system     SUNWbnuu

        system     SUNWpppk

- 설치되어 있지 않다면 pkgadd또는 swmtool을 사용하여 설치한다.

     

  . OS CD를 CDROM Driver에 넣은후 /cdrom이 mount되었는지 확인하고

    mount가 되어 있으면 "/cdrom/cdrom0/s0/Solaris_2.4" 디렉토리로

    가서 아래 명령을 실행한다.

      # mount

        (cdrom이 mount되어 있지 않으면 아래와 같이 mount한다)

        # mount -F hsfs -o ro /dev/dsk/c0t6d0s0 /cdrom

        # pkgadd -d $cwd SUNWpppk SUNWapppr SUNWapppu SUNWbnur SUNWbnuu

  . 설치가 끝나면 시스템을 리부팅한다.

  . 주의할 사항은 pkgadd 명령 수행시 package의 설치순서를 위와 같이 하여야

    한다. 순서가 바뀌면 설치후 ipdptp0 등의 interface가 생성되지 않을 수 있다.

- 사용할 Serial Port를 admintool을 이용하여 "Bidirectional" 으로 셋팅한다.

  . speed = 19200

  . 모뎀 사용중 disconnect 되고, 재 연결시 접속이 안될 때 서버에서 Admintool

    로 해당 포트에 대해 재 설정후 사용해 볼것

- EEPROM의 지정값을 확인한다. 아래와 같이 값을 지정한다.

        # eeprom | grep ttya

        ttya-rts-dtr-off=true

        ttya-ignore-cd=false

        ttya-mode=9600,8,n,1,-

      (결과가 위와 같지 않으면 아래명령을 실행한다)

        # eeprom ttya-rts-dtr-off=true

        # eeprom ttya-ignore-cd=false

        # eeprom ttya-mode=9600,8,n,1,-

  . eeprom의 speed값과 실제 모뎀속도의 상관관계는 없는 것 같다?

- EEPROM의 값이 변경되었으면 시스템을 리부팅 한다.

- Dial-Out을 할수 있도록 /etc/remote 화일에 아래 내용을 추가한다.

        cuaa:dv=/dev/cua/a:br#9600

- 모뎀이 hardward flow control을 사용하도록 지정 한다.

        # tip cuaa

      ats0=1            ; answer mode - 벨이 1번 울리면 자동응답

        at&w0&w1

        ~.                ; 타이핑문자는 화면에 안보임

- 외부에서 일반 통신프로그램으로 PPP Server에 연결하여 Login 메세지가

 떨어지는지 확인한다.



2. Setting PPP as Point-to-point Dial-In Server

- 현재 사용하는 Primary Ethernet address와 같은 Subnet의 IP address중 2개를

 선택하여 하나는 PPP Server에 다른 하나는 remote PC에 지정한다.

       예) 147.6.9.9   ppp_server

           147.6.9.10 ppp_pc

- 위의 내용을 /etc/hosts화일과 DNS(If you use) 에 각각 등록한다.

- PPP 사용자 ID를 만든다.

 예)  /etc/passwd

        

          pppuser:x:13:60001:PPP User:/:/usr/sbin/aspppls

        /etc/shadow

          pppuser:RITzeWAL73UWQ:9321::::::

- /etc/asppp.cf 화일에 아래와 같은 내용을 추가한다.

        ifconfig ipdptp0 plumb ppp_server ppp_pc netmask + up

        ifconfig ipdptp0 mtu 1500

        path

                ipcp_async_map 0

                inactivity_timeout 90000

                interface ipdptp0

                peer_system_name pppuser

- 새로운 interface에 대하여 "arp" 값을 지정한다.

 현재 사용하는 Ethernet Address를 찾아서 remote PC의 이름에 아래와 같이

 지정한다.

        # ifconfig -a | grep ether

                ether 8:0:20:12:90:be

        # /usr/sbin/arp -s ppp_pc 8:0:20:12:90:be pub

        # /usr/sbin/arp -a

        le0   mong              255.255.255.255 SP   08:00:20:12:90:be

        le0   ppp_pc              255.255.255.255 SP   08:00:20:12:90:be

 위와 같이해야 ppp_pc로 부터 ppp_server를 통해 외부의 다른 시스템으로 연결

 이 가능하다.

- 시스템 부팅시 위의 내용이 인식되도록 /etc/rc3.d에 화일을 만들어 아래의

 내용을 지정한다.

    # echo "/usr/sbin/arp -s ppp_pc 8:0:20:12:90:be pub" > /etc/rc3.d/Sarp_ppp

    # chown root /etc/rc3.d/Sarp_ppp

    # chmod 755 /etc/rc3.d/Sarp_ppp

- PPP Server 시스템에 "in.routed" daemon이 돌고 있다면, rip routing 정보가

 ipdptp0 쪽으로 뿌려지지 않도록 아래 내용을 /etc/gateways 화일에 넣는다.

        norip   ipdptp0

* 만약 ROUTING Deamon이 없는 상태면 "in.routed -s"를 실행시켜 줘야 한다.

- PPP process를 start 한다(시스템 부팅시에는 자동으로 start된다.)

        # /etc/init.d/asppp start

- 다음 사항들을 확인해 본다.

        # ps -ef |grep asppp

        # tail /var/adm/log/asppp.log

        # arp -a

        # ifconfig -a

        # netstat -rn |grep ipdptp0



- PC 에서 trumpet Winsock 이나 netmanage's Chameleon_Sampler를 이용하여

 ppp_server에 연결해 본다. PC에 자신의 IP 주소는 ppp_server에 지정된

 값(147.6.9.10)으로 정한다.

 PC에서 Dial-Out을 하여 ppp_server에 connected되면 PPP User ID로 login한후

 [Esc] Key를 치면 PPP Enable 된다.



* routing daemon 이 돌고 있는지 꼭 확인하고, 없으면, 실행할것

* pc쪽에서 해줘야 할부분

gateway를 ppp_server로 하고, DNS서버는 기존 것을 그대로 설정해주면 된다.



3. Setting PPP as a Multipoint Dial-In Server

- 다음 설명은 아래와 같은 네트웍 구성을 전제로 한다.

     pc1  pc2   pc3  W/s ????????????

        |           |            |             |        147.6.9.123 Ethernet

    147.6.33.1  147.6.33.2   147.6.33.3   147.6.33.100(ppp_server)

         \          |           /              |

                          

             \      |        /                 |

              -------------------|

                  전화망

      

- 현재 사용하지 않는 네트웍 주소를 PPP 용으로 할당하여 각 PC와 PPP Server에

 할당한다.

       예) 147.6.33.100       ppp_server

           147.6.33.1         pc1

           147.6.33.2         pc2

           147.6.33.3         pc3

- 위의 내용을 /etc/hosts화일과 DNS(If you use) 에 각각 등록한다.

- PPP 사용자 ID를 만든다.

 예)  /etc/passwd

          pppuser:x:13:60001:PPP User:/:/usr/sbin/aspppls

        /etc/shadow

          pppuser:RITzeWAL73UWQ:9321::::::

- /etc/asppp.cf 화일에 아래와 같은 내용을 추가한다.

        ifconfig ipd0 plumb ppp_server netmask + up

        ifconfig ipd0 mtu 1500

        #

        Path

                interface ipd0

                peer_system_name pppuser

                peer_ip_address pc1

                ipcp_async_map 0x000a0000

                default_route

        Path

                interface ipd0

                peer_system_name pppuser

                peer_ip_address pc2

                ipcp_async_map 0x000a0000

                default_route

        Path

                interface ipd0

                peer_system_name pppuser

                peer_ip_address pc3

                ipcp_async_map 0x000a0000

                default_route

- PPP Server에서 새로운 네트웍에 대한 라우팅 정보가 다른 호스트들에게

 broadcast 되도록 라우팅 daemon을 살린다.

      # in.routed

- rip routing 정보가 ipdptp0 쪽으로 뿌려지지 않도록 아래 내용을

 /etc/gateways 화일에 넣는다.

        norip   ipdptp0

- PPP process를 start 한다(시스템 부팅시에는 자동으로 start된다.)

        # /etc/init.d/asppp start

- 다음 사항들을 확인해 본다.

        # ps -ef |grep asppp

        # tail /var/adm/log/asppp.log

        # ifconfig -a

        # netstat -rn |grep ipd0

- PC 에서 trumpet Winsock 이나 netmanage's Chameleon_Sampler를 이용하여

 ppp_server에 연결해 본다. PC에 자신의 IP 주소는 ppp_server에 지정된

 값(147.6.33.1 ~ 3) 중 하나로 정한다.

 PC에서 Dial-Out을 하여 ppp_server에 connected되면 PPP User ID로 login한후

 [Esc] Key를 치면 PPP Enable 된다.



※ Q&A

Q) PPP User로 login후 기존 server(PPPserver/해당host)외 다른 Host로의 네트웍이

  안이루어진다.

A) #ndd -set /dev/ip ip_forwarding 1  --->  ip의 forwarding Setting

  #ndd -get /dev/ip ip_forwarding    --->  ip forwarding 확인(“1”로set되어야함)







14.2 적용예제



환경 : E3000, 56K모뎀(US_Robotics)x2을 Serial A/B Port에 접속

     Server domainname/IP : munhwa.kongju-c.ac.kr/203.232.160.5

   

1. 서버에 모뎀 접속 - 38400bps

2. IP 할당(3개) 및 전화번호할당(2개)

 PPP서버 name/IP  : pppserver/203.232.160.7

 Remote PC name/IP : pc1/203.232.160.8

 Remote PC name/IP : pc2/203.232.160.9

 전화번호1 : 000-0000

 전화번호2 : 000-0000

3. PPP 등록 - /etc/hosts & DNS_table

4. PPP user 등록 (/etc/passwd & /etc/shadow)

 pppuser1:x:1001:10::/:/usr/sbin/aspppls  <--- /etc/passwd

 pppuser2:x:1002:10::/:/usr/sbin/aspppls  <--- /etc/passwd

 ex) password는 sunsun

5. /etc/asppp.cf 편집

 ifconfig ipdptp0 plumb pppserver pc1 netmask + up

 ifconfig ipdptp0 mtu 1500

 path

         ipcp_async_map 0

         inactivity_timeout 90000

         interface ipdptp0

         peer_system_name pppuser1

 ifconfig ipdptp1 plumb pppserver pc2 netmask + up

 ifconfig ipdptp1 mtu 1500

 path

         ipcp_async_map 0

         inactivity_timeout 90000

         interface ipdptp1

         peer_system_name pppuser2

6. arp값 지정

 # ifconfig -a | grep ether

     ether 8:0:20:79:a9:8d

 # /usr/sbin/arp -s pc1 8:0:20:79:a9:8d pub ①

 # /usr/sbin/arp -s pc2 8:0:20:79:a9:8d pub ②

 # /usr/sbin/arp -a

    hme0  munhwa.kongju-c.ac.kr 255.255.255.255 SP   08:00:20:79:a9:8d

    hme0  pc2.kongju-c.ac.kr  255.255.255.255 SP   08:00:20:79:a9:8d

    hme0  pc1.kongju-c.ac.kr  255.255.255.255 SP   08:00:20:79:a9:8d

7. arp값 지정의 ① & ② 줄을 /etc/rc3.d/Sarp_ppp 에 넣는다.

 만들고 난후,

 # chown root /etc/rc3.d/Sarp_ppp

 # chmod 755 /etc/rc3.d/Sarp_ppp

8. rip routing 정보가 ipdptp0 과 ipdptp1 에 뿌려지지 않도록 아래파일 편집

 # more /etc/gateways

 norip  ipdptp0

 norip  ipdptp1

9. routing daemon이 없다면 "in.routed -s"를 실행

10. PPP process를 start

 # /etc/init.d/asppp start

11. 다음과 같이 확인

 # ps -ef|grep asppp

 # tail /var/adm/log/asppp.log

 # arp -a

 # ifconfig -a

 # netstat -nr | grep ipdptp0 or 1

12. pc1에서 새로 부여된 자신의 ip 등록하고 gateway 는 pppserver의 IP를 등록

  DNS는 기존DNS인 munwha(203.232.160.5)를 설정후,

  PC에서 dial-out 하여 pppserver에 connected되면 pppuser 로 login하고,

  패스워드에서 이미정한 sunsun으로 입력하고, login후 [ESC]를 누르면

  PPP가 Enable상태.







15장. 시스템튜닝




∴ 시스템이나 네트워크에 너무 많은 부하가 걸리지 않도록 한다. 부하가 많이 걸리게 되면 자원을 기다리는 프로세스들이 많아지게 되고 그러면 점점 누적되어 시스템의 성능이 급격히 저하되기 때문이다.



∴ 불필요한 기능이나 쓸모없는 일을 위해 시스템 여분의 성능을 낭비하지 않는다. 예를 들면 시스템의 쿼터(용량제한)나 CPU 사용계산(Accounting) 등이 별로 필요 없는 경우 이에 대한 시스템의 불필요한 사용은 시스템의 성능저하의 한 몫만을 할뿐이다.



추가적으로 고려할 사항은 프로그램을 만들 때는 시스템 성능을 고려한 프로그램의 작성이 요구되며 필요한 시스템 작업이 요구되는 경우 부하가 적은 야간을 이용해 cron을 돌려놓으면 좋다.




15.1 성능 향상을 위한 일반론



다음은 시스템의 성능을 향상시키기 위해서 필요한 것들이다. 이것은 유닉스 시스템뿐만 아니라 다른 운영체계의 시스템에도 해당되는 것이다.



1) 시스템이 충분한 메모리 크기를 가지도록 하자. 일반적으로 운영체계에서 요구하는 기본 메모리 양이 있다. 이를 충분히 수용할 수 있어야만 그 시스템은 기대되는 성능을 낼 수 있는 것이다.



2) 프로그램의 잘못된 사용을 바로잡는다. 앞서도 언급하였지만 시스템의 성능을 고려하지 않고 프로그램을 짜서 수행시키는 경우나 한꺼번에 많은 프로그램들을 불필요하게 수행시키는 등의 일은 시스템의 성능을 떨어뜨리는 결과를 초래한다. 또한 불필요한 데몬의 수행도 마찬가지의 결과를 가져오는 것이다.



3) 시스템의 하드 디스크나 파일 시스템을 정리한다. 이는 파일 시스템의 여러 가지 옵션을 조정하는 것과 쓸모 없는 디렉토리나 파일의 정리도 포함한다.



4) 항상 네트워크 상태를 모니터링 한다. 특히 에러율이 낮은지를 netstat 명령을 통해 체크한다.



5) 커널 재조정을 통해 필요없는 드라이버와 옵션 등을 제거한다. 예를 들면 자신의 시스템에 정착되어 있는 하드웨어를 제외한 다른 회사의 드라이버들은 제거해도 아무 지장이 없다. 다만 만일의 경우를 고려해 기존의 드라이버들이 모두 있는 커널의 백업은 받은 후에 제거한다.




15.2 시스템 성능에 영향을 주는 요소들



시스템 성능에 영향을 주는 요소들은 다양하게 존재한다. 이 요소들은 여러 가지로 파악될 수 있지만 그 중에서도 시스템의 프로그램들이 사용하는 리소스의 측면에서 파악하는 것이 일반적이다. 시스템의 성능에 영향을 주는 요소들을 리소스 측면에서 파악하면 다음과 같다.



? cpu 사용 시간

? 메모리

? 하드 디스크 I/O 양

? 네트워크 I/O 양



모든 프로세스는 시스템 리소스의 일부를 사용한다. 이러한 리소스들을 여유있게 프로세스들이 사용한다면 시스템의 성능은 양호한 것이다. 하지만 그렇지 않고 리소스가 없어 프로세스들이 기다리는 경우가 늘어날수록 그 시스템의 성능은 감소되는 것이다. 프로세스들이 기다리는 시간을 시스템 성능의 척도로 사용하는 경우도 이러한 이유 때문이다. 리소스 측정에 대하여 이제부터 설명하도록 하겠다. 참고로 메모리에 대해서 간단히 설명하자면 유닉스 시스템에서는 가상 메모리를 사용한다. 요즘은 다른 운영체계에서도 기본으로 되었지만 이것이 모두 유닉스의 가상 메모리 개념을 가져다 변형한 것으로 보아도 무방하다. 이러한 가상 메모리는 실제 메모리의 부족을 하드 디스크를 통해 보완하는 개념이다. 사용하지 않는 하드 디스크 저장 공간을 메모리처럼 사용하는 것이다. 여기에는 한계가 발생하게 된다. 만약 시스템에서 사용하려는 메모리 공간이 실제 메모리에 있지 않고 하드 디스크에 있는 경우 하드 디스크의 내용을 읽어 메모리로 적재하고 기존의 메모리 공간은 하드 디스크로 옮기는 것이 필수적이다. 이 과정을 페이징(Paging)이라 한다. 페이징이 일어나는 메모리 블록을 일반적으로 페이지(Page)라고 한다. 페이지는 보통 4K 이상으로 구성되며 이는 일반적인 디스크 입출력 단위인 디스크 블록(1K 혹은 512byte)이 여러 개 모인 것이다. 하드 디스크에 있던 메모리 페이지가 메모리로 적재되는 것을 페이지 인(Page In)이라 하고 메모리에 적재되어 있던 것을 페이지 아웃(Page Out)이라 한다. 이 페이징의 과정이 많이 일어날수록 시스템의 성능은 감소한다. 하드 디스크의 접근 속도가 메모리의 접근 속도에 비해 떨어지는 것은 당연하기 때문이다. 같은 시스템 환경에서 페이징을 줄이기 위한 노력도 많이 이루어졌는데 그 중의 하나가 지역성(Iocality)과 캐시이다. 캐시나 지역성 모두 가능하면 페이징을 줄이도록 페이징이 가장 적게 일어날 확률을 가진 페이지들을 메모리에 유지하는 것을 목표로 한다. 가상 메모리에 대한 자세한 내용은 전산학의 운영체계에 관련된 도서를 참고하기 바란다.




15.3 프로그램의 시간 체크하기



프로그램의 시간을 측정해야 하는 경우가 발생한다. 이러한 경우 ‘/bin/time'명령어를 사용한다. 주의할 점은 C 셸에 내장되어 있는 time 명령과는 다르다는 점이다. 그러므로 사용할 때는 디렉토리도 함께 명시한다. 다음은 그 사용예이다.



% /bin/time vmstat

procs    memory      page         disk     faults    cpu

r b w avm  fre  re  at  pi  po  fr  de  sr  d0  d1  d2  d3  in  sy  cs  us  sy  id

1 0 0   0  7584   0   3  0   0  0    0  0   1   0   0   0  14   4   2   0   0   99

      0.6 real           0.5 user            0.1 sys



위에서 보면 전체 0.6초가 걸렸고 그 중 0.5초는 사용자 코드이며 0.1초가 시스템 호출 등의 커널 관련 경과 시간을 나타낸다. 자신이 만든 프로그램이 얼마나 시스템 콜 등의 커널관련 작업을 수행하는지 파악하고자 할 때 매우 유용한 명령인 것이다.




15.4 시스템의 성능 측정하기



위에서 성능을 측정하는 데는 일반적으로 ATT 계열이 BSD 계열보다 모니터링 도구가 좋은 평가를 받는다. 실제로 ATT 계열은 sar 명령어를 이용하면 모든 요소를 측정할 수 있지만 BSD 시스템의 경우는 각 요소마다 다른 명령어를 사용해야 하므로 일단 ATT 게열의 사용이 편리(?)하다는 생각이 든다.




15.5 현재 CPU 성능 측정



CPU 의 성능을 측정하기 위해서는 다음의 3가지를 체크해야 한다.



? 전체 사용정도

? 평균 부하

? 프로세스별 CPU 사용정도



이러한 모든 정보는 ATT 계열의 경우는 ‘sar-u' 명령을 사용하여 알아내며 BSD 계열의 경우는 vmstat 명령을 이용한다. 하지만 필자가 여러 시스템을 테스트해 본 결과 많은 ATT계열의 시스템들이 vmstat명령을 지원하는 것으로 나타났다. 독자들은 어찌되었건 두 가지 명령어 모두 알아두도록 하자. 두 명령어 모두 2개의 인자를 가지는데 하나는 ’측정 시간 간격‘이고 다른 하나는 ’통계를 낼 횟수‘ 즉 몇 번 측정하고 통계 기록을 보여줄지를 지정하는 것이다.

다음은 ATT계열의 사용예이다.



% sar -u 5 5

23:12:30      %usr    %sys    %wio      %idle

23:12:35        4        58       27        11

23:12:45        7        83        9         0

23:12:50        6        76        6         0

23:12:55        4        73        8         0

23:12:00        4        85        4         0



'%usr'는 사용자 코드를 수행하는데 사용되는 CPU 시간의 백분율이며 ‘%sys'는 시스템 커널의 코드를 수행하는데 사용되는 CPU 시간의 백분율이다. 그리고 ’%wio'와 ‘%idle'은 CPU의 Idle 시간을 나타내는 백분율인데 원인이 디스크 I/O 때문이면 ’%wio'에 나타나고 그 이외의 이유라면 ‘%idle'에 속하게 된다. 위의 시스템의 경우 많은 부분을 커널이 사용하고 있는데 이는 어찌 보면 당연한 결과이다. 우리가 주목해야 할 부분은 Idle 비율로 위의 경우는 CPU가 리소스를 기다리는 시간이 얼마 안되므로 시스템에는 큰 부하 없이 잘 돌아감을 의미한다.

 ‘vmstat' 명령도 여러 정보를 제공해 주는데 다음은 그 사용 예이다.



% vmstat 5 5

procs                  page                 faults          cpu

r b w   re  mf  pi  po fr  de  sr  in   sy  cs  us  sy  id

0 0 0    0   0   0   0  0   0   0   4   22  19   2   1  97

1 0 0    67  2   0   0  0   0   0  26  751  52  53  47   0

0 0 0    96  0   0   0  0   0   0  39 1330  42  22  71   7

0 0 0    16  0   0   0  0   0   0  84 1626  99   7  74  19

0 0 0     1  0   0   0  0   0   0  11  216  20   1  11  88



‘sar-u' 명령에 나왔던 항목들이 여기서는 cpu 필드의 us, sy, id 열에 나타난다. 위 시스템의 경우는 시스템의 Idle time 이 부분적으로 높게 나타나므로 현재 부하가 어느 정도 걸리고 있음을 알 수 있다. 수치가 일정치 않음은 여러 요인에 의한 것이므로 좀 더 오랫동안 모니터링 하여 확인해야 할 것이다. 다음 표는 두 명령에서의 항목을 나타내었다.

sar명령

(u 옵션)
 vmstat명령

(cpu 항목)
 설명
 
%usr
 us
 사용자 코드를 수행하는                     cpu 시간에 대한 백분율
 
%sys
 sy
 시스템 커널 코드를 수행하는                 cpu 시간에 대한 백분율
 
%wio
 id
 디스크 I/O에 의해 CPU가 기다리는         시간(idle time)에 대한 백분율
 
%idle
 
 디스크 I/O 이외의 이유로 인해 CPU가   기다리는 시간에 대한 백분율
 


   * 참조 : "vmstat -S"를 사용 check시 CPU의 idle time이 50%선이면 안정



부가적으로 fault 필드의 in은 초당 디바이스 인터럽트 횟수, sy 항목은 초당 시스템콜의 횟수를 나타내며 cs 항목은 일정 시간동안(보통 초당)의 context switching, 즉 프로세스의 제어권의 변경 횟수를 나타낸다. 다른 항목은 조금 후에 알아보도록 하겠다.



vmstat명령(fault 항목)
 설명
 
in
 초당 디바이스 인터럽트 횟수
 
sy
 초당 시스템콜 수
 
cs
 초당 컨텍스트 스위칭(context switching) 횟수
 


참고로 솔라리스의 경우는 위의 sar와 vmstat 명령을 모두 제공한다.

사실, CPU의 상태는 순간순간 급격히 변하기 때문에 짧은 시간동안의 모니터링은 그다지 정확한 정보를 나타내지는 않는다. 그러므로 되도록 오랜 시간동안 모니터링을 하여야 정확한 정보를 알 수 있다.




15.6 평균 부하(load average)



또 하나의 유용한 CPU 통계정보로 평균 부하가 있다. 일반적으로 평균 부하는 디스크나 I/O의 대기 시간도 포함하므로 순수한 CPU 사용에 대한 척도를 나타내는 것은 아니다. 하지만 CPU가 얼마나 골고루 사용되는지를 나타내는 좋은 척도임은 사실이다. 실제로 이 평균 부하 수치는 일정 시간동안 수행 대기 큐에서 기다리는 작업의 수에 대한 평균을 내는 것이다.

평균 부하는 uptime 명령을 통해 얻을 수 있다.

% uptmie

- last 1분, 5분, 15분간의 system load average를 report

- System V의 sar -q와 유사



12:24am up 2 hrs, 1 user, load average: 1.34, 2.28, 2.51



- 15분간의 load average보다 1분간의 load average가 작은것을 falling이라고

  하며, 만약 system이 느리지만 load average가 falling이면 시간이 지남에

  따라 problem이 해결되는지를 확인하는것이 좋다



% uptime

2:07pm up 4:02, 5 users, load average: 0.95, 0.38, 0.31



위에서 보면 3가지 수치가 나오는데 이는 각각 5분, 10분, 15분의 평균을 나타낸 것이다. 이 시스템의 경우는 평균적으로 대기중인 작업이 1개가 채 안되므로 부하가 별로 없음을 의미한다. 이 수치가 5이상 되면 어느 정도 부하가 걸리고 있다고 생각하면 무방할 것이다. 하지만 이런 경우 디스크 I/O 위주의 프로그램이 많아서 수치가 높게 나타나는 경우도 있으므로 vmstat나 sar 명령으로 다시 한번 확인해 보기 바란다.




15.7 페이징 알고리듬



유닉스 시스템에서는 가상 메모리에 대한 페이징을 수행한다고 하였다. 이를 위해서는 시스템이 어떠한 페이지를 교체, 스왑핑(swapping)할 것인가를 결정하여야 한다. 일반적으로 가장 최근에 사용하지 않은 페이지를 선택해 교체하는 LRU(Least Recently Used)알고리듬이 좋은 것으로 알려져 있으나 사실 각 페이지마다 참조 카운터(reference counter)를 유지하는 것은 많은 CPU 시스템 자원이 소모된다. 그래서 유닉스에서는 간단히 시계(clock) 알고리듬을 사용한다.

커널은 페이징 아웃되는 메모리 페이지들을 가리키는 Free List를 유지한다. 그리고 페이징 아웃될 페이지에 대한 지정 순서는 어느 메모리 페이지나 동일하게 순차적으로 지정된다. 그래서 시계의 시침이 돌아가듯 순차적이란 의미에서 시계 알고리듬이라고 한 것이다. 하지만 메모리의 상태에 다라 시침이 돌아가는 속도는 변경된다는 점이 일반 시계와는 다른 점일 것이다.




15.8 메모리 사용 분석하기



워크스테이션의 경우 가장 좋은 메모리 분석 도구는 사람의 귀이다. 많은 페이징이 일어나는 경우 하드 디스크를 스왑핑(swapping)하는 소리를 직접 확인할수 있다. 페이징을 위한 스왑 공간의 확인은 BSD 시스템의 경우는 ‘pstat-s' 명령, ATT의 경우 ’swap-1' 명령을 이용한다. ATT의 경우 ‘sar-r' 명령도 사용할 수 있다. 사용예는 다음과 같다.

pstat명령의 경우는 kbytes단위로 나타내고 다른 명령들은 512bytes 단위이다.



% pstat -s

110224k allocated  +  13556k reserved = 123780k used, 163000k available



% swap -1

swapfile           dev   seapl   blocks  free

/dev/dsk/c0t0d0s1  32, 1,   16   164400 162960



% sar -r 5

17:58:52  freemem   freeswap

17:58:57       361    179616



HP-UX 시스템의 경우 스왑 영역에 대한 정보를 얻기 위해 swapinfo 명령을 사용한다.

OSF/1 시스템의 경우 sar 명령은 옵셥으로 설치하기 때문에 대부분 없는 경우가 많다. 하지만 스왑 상태를 확인하기 위해서는 'swapon-s'명령을 사용하면 된다.



% swapon -s

Swap partition /dev/rz24b (default swap) :

    Allocated space:     98205 pages (767MB)

    In-use space:         6320 pages (  6%)

    Free space          91885 pages ( 93%)



Total swap allocation:

 Allocated space:     98205 pages (767MB)

 Reserved space:       9736 pages (  9%)

 In-use space:         6320 pages ( 6%)

 Available space:       88469 pages ( 90%)



다음, BSD 시스템과 HP-UX 에서의 페이징 상태는 vmstat 명령을 사용하여 확인한다.



% vmstat 5 5

procs    memory               page                disk        faults       cpu

r b w  avm   fre  re at pi po fr de sr d0 d1 d2 d3 in sy cs us sy id

0 0 0     0  2300  0  3  0  0 0  0  0  1  0  0   0 14  4  2  0  0 99

0 0 0     0  2116  0  9 24  0 12 0 10  1  0  0   0 17 104  8  0  0 100

0 0 0     0  2064  0  2  0  0 0  0  2  0  0  0   0 10 39  3  0  0 100

0 0 0     0  2048  0  0  0  0 0  0  0  0  0  0   0  7 15  0  0  0 100

0 0 0     0  2048  0  0  0  0 0 16  0 13  1  0   0 33 13  8  1  1 98



procs 항목은 현재 수행을 기다리는 작업 수(r)와 I/O 블록된 프로세스(b), 현재 스왑핑중인 프로세스(w) 수를 나타낸다. 스왑핑중인 프로세스(w) 수를 나타낸다. 스왑핑중인 프로세스의 수가 0이 아닌 경우 현재의 부하에 비해 메모리가 부족함을 의미한 것이다.

memory 항목에서는 메모리의 상태를 보여주는데 최근 20초 안에 수행된 프로세스에 속하는 가상 메모리의 kbytes 수(avm)와 여유 메모리 kbytes량(fre)을 확인할 수 있다.

page 항목은 페이징 활동에 대한 경고를 제공한다. 모든열은 초당 평균값을 나타내는데 그 의미는 다음과 같다.

필드
 항목
 의미
 
procs
 r
 현재 수행을 기다리는 작업수
 
 
 b
 I/O 블록된 프로세스 수
 
 
 w
 현재 스왑핑중인 프로세스 수
 
memory
 avm
 최근 20초 안에 수행된 프로세스에 속하는    가상 메모리의 kbytes 수(avm)
 
 
 fre
 Free List에 있는 메모리의 kbytes 수
 
page
 re
 사용중인 페이지 수
 
 
 at
 Free List에 있는 페이지 수
 
 
 pi
 페이지 인된 kbyte
 
 
 po
 페이지 아웃된 kbyte
 
 
 fr
 Free List에 있는 kbytes
 
 
 de
 메모리 부족이 예상되는 페이지 수
 
 
 sr
 clock 알고리듬에 의해 체크된 페이지 수
 


이 가운데 de 항목이 100을 넘어서면 메모리가 상당히 부족함을 의미한다. 하지만 불행히도 많은 시스템들이 이 항목을 보여주지 않는다. ‘vmstat-S'와 같이 사용하면 페이지의 인, 아웃 대신 컨텍스트 스위치(context switch)에 대한 항목을 보여준다. 다음과 같다.



% vmstat -s 5 5

procs memory                  page               disk         faults      cpu

r b w  avm   fre  re at pi po fr de sr d0 d1 d2 d3 in  sy cs us sy id

0 0 0     0  7608  61  0  0  0 0 16  0  1  0  0  0 14  4  2   0  0 99

0 0 0     0  7584  25  0  0  0 0  0  0  0  0  0  0 13 38  4   0  0 100

0 0 0     0  7520   0  0  0  0 0  0  0  0  0  0  0  4 15  0   0  0 100

0 0 0     0  7504   0  0  0  0 0  0  0  0  0  0  0  1  6  0   0  0 100

0 0 0     0  7504   0  0  0  0 0  0  0  0  0  0  0  5 11  3   0  0 100



솔라리스의 경우는 ‘sar-g' 옵션을 통해 페이지 아웃에 대한 정보를 확인하며 페이지 인에 대한 정보는 ’sar-p'명령을 사용한다.




15.9 디스크 I/O 분석하기



대부분의 시스템들은 iostat 명령을 통해 디스크 I/O 양을 모니터링 할 수 있다. vmstat 명령과 같이 시간간격과 요약 횟수를 인자로 지정한다.

사실 iostat 명령에 대한 출력 결과는 시스템에 따라 다소 차이를 보인다.



- provides a measure of the CPU's idle time

- System V의 sar -u 와 유사



% iostat 5 5

tty               wd0                   sd0               cpu

tin tout    sps  tps   msps     sps    tps  msps   us   ni  sy  id

2  129     2     0    0.5         3     0     20.3   0    0   0  99

1  252     0     0    0.0       614    40     16.9  27    0  14  59

1  321     0     0    0.0       511    45     16.7  17    0  12  71

0   15     0     0    0.0       419    27     19.9  11    0   8  80

1  191     0     0    0.0         3     0     25.0   0    0   0  99


하지만 일반적인 위의 출력 결과에 대해 설명하도록 하겠다. tty 필드는 터미널과 가상 터미널에 대한 데이터를 나타낸다. 모드 터미널의 문자 입출력에 대한 초당 횟수를 나타내는데 실제 시스템의 성능과는 별 연관이 없으며 특별한 목적에만 유용하다. 각 하드 디스크는 sps, tps, msps 항목을 가진다. 각각 초당 전송 섹터, 초당 전송 횟수, 탐색속도(밀리초)를 나타낸다. sps와 tps의 비는 한번에 얼마나 큰 사이즈의 블록이 전송되는지를 나타내게 된다. 이 경우 크면 클수록 성능 면에서는 효과적인 것이다.

항목
 설명
 
tty
 tin
 터미널에서의 초당 문자 입력 횟수
 
 
 tout
 터미널에서의 초당 문자 출력 횟수
 
sd, wd
 sps
 초당 전송 섹터 수
 
 
 tps
 초당 전송 횟수
 
 
 msps
 탐색 속도(seek time: ms)
 


- us : user 상태에서 running하는 process들에 의해 사용된 CPU %

       ( default scheduling priority 이상)

- ni : user 상태에서 running하는 process들에 의해 사용된 CPU %

       ( low scheduling priority )

- sy : system상태에서 사용된 CPU %

       (executing system calls, UNIX kernel code, scheduling onerhead등)

- id : percentage of the system spent idle



SunOS 4.1의 경우 이 비율도 나타내도록 'iostat-D' 옵션을 줄 수 있다.



% iostat -D 5 5

rps   wps   util   rps   wps  util   rps  wps  util

0      0    1.3    0     0    0.3    0     0   0.5

9      8   41.1    1     0    1.8    1     0   2.4

11      4   48.4    0     1    2.0    0     0   0.0

8      0   15.6    0     0    0.0    0     0   0.0

0      0    0.0    0     0    0.0    0     0   0.0



iostat로 디스크부하량 분석하는 방법.

# iostat -tDc 5

   tty            fd0             sd1             sd3            cpu

tin tout rps wps util rps wps util rps wps util us sy wt id

0   13   0   0   0.0  0   0  0.4  0   0   0.1  5  2  0  92

0   13   0   0   0.0  0   0  0.0  0   0   0.0  0  1  0  99



%로 나타내는 until필드는 더욱 유용하다. 디바이스 드라이버는 드라이브에 대하여 명령을 발행하고 응답까지 걸리는 시간 및 다음 명령까지의 디스크 유혹시간을 측정하여 사용률(%)을 산출하고 있다. 사용률이 100% 디스크라는 것은 다음 명령이 발생될 때까지 유휴시간이 없는 디스크이다. 5초간에 최고 사용률 50%를 넘는 디스크는 성능에 문제가 발생하고 있다고 할 수 있다.



# iostat -txc 5

                               extended disk statistics       tty              cpu

disk   r/s  w/s  Kr/s  Kw/s wait actv svc_t %w %b tin tout us sy wt id

fd0    0.0  0.0  0.0   0.0  0.0  0.0  523.3  0  0  0   13   5  2  0  92

sd1    0.1  0.2  0.4   1.6  0.0  0.0  117.3  0  0  

sd3    0.0  0.0  0.1   0.4  0.0  0.0   37.6  0  0

                               extended disk statistics       tty              cpu

disk   r/s  w/s  Kr/s  Kw/s wait actv svc_t %w %b tin tout us sy wt id

fd0    0.0  0.0  0.0   0.0  0.0  0.0   0.0  0  0  0   73   1  1  0  98

sd1    0.0  0.0  0.0   0.0  0.0  0.0   0.0  0  0  

sd3    0.0  0.0  0.0   0.0  0.0  0.0   0.0  0  0

디스크의 과부하를 판별하는 방법 --> 주의해야할 중요한 값은 서비스시간(svc_t)임.

이것은 이 드라이브에 대한 입,출력 요구의 서비스에 소요된 시간이다.

이 시간에는 다른 요구가 처리중에 있기 때문에 큐에서 대기하는 시간도 포함된다.

30초간의 평균사용률이 30%를 넘는 디스크는 서비스 시간을 점검할 필요가 있다.




15.10 파일 시스템 튜닝하기



tunefs 명령어가 파일 시스템의 여러 옵션을 조정하는데 사용된다는 것은 디스크 공간 관리에 대한 연재에서 설명하였다. 다시 부연 설명하자면 tunefs 명령어는 특정 파일 시스템의 전체적인 파라미터를 변경하는 일을 수행한다. 해당되는 파라미터는 다음과 같은 것들이 있다.



? 파일에서의 블록 그룹간의 rotational delay

? 하나의 입.출력동안 전송되는 최대 블록 수

? 하나의 실린더 그룹에서 사용 가능한 블록 수

? 만약을 위해 준비하는 디스크 용량



가끔은 이 명령을 이용한 튜닝이 상당한 성능 개선 효과를 가져오는 경우가 있다. 하지만 적절한 옵션의 조절을 위해서는 여러 번의 시도가 이루어져야 하며 항상 성능 개선 효과를 가져다 주는 것도 아니므로 각 시스템들의 매뉴얼을 참조하기 바란다.




15.11 pstat: 무작위 통계 출력하기(BSD)



BSD 계열에서 또 한 가지 유용한 명령어가 pstat 명령이다. 이 명령은 여러 가지 커널의 테이블의 데이터들을 사람이 읽기 쉬운 형태로 덤프해 준다.

다음은 BSD 시스템에서 사용하는 디스플레이 옵션을 나타낸 것이다. 다른 시스템에서는 이보다 적은 옵션을 가지는 것이 일반적이다.



옵션
 내 용
 
-i
 inode 테이블의 덤프
 
-x
 텍스트(context swtich table) 테이블의 덤프
 
-P
 프로세스 테이블의 덤프, ps 명령보다 자세하다.
 
-f
 개방된 파일 테이블의 덤프
 
-t
 모든 터미널에 대한 정보를 나타냄
 
-u
 특정 프로세스에 대한 정보를 나타냄
 
-s
 스왑 공간에 대한 정보를 나타냄
 
-T
 커널 테이블이 얼마나 차 있는지를 나타냄
 



이 중에서 가장 유용한 것이 -T 옵션으로 테이블의 사용 정보를 나타낸 것으로 사용하면 다음과 같은 결과를 출력할 것이다.



% pstat -T

121/364  files

85/158   inodes

34/74    processes

21/38    texts

70/169   00k swap



물론 ‘현재 사용정도/전체 사용량’을 나타낸다. 이 옵션은 커널을 재구축하는 경우 maxusers 옵션의 적절한 값을 지정하는데 도움을 준다.




15.12 시스템 성능 체크의 단계



시스템은 일시적으로 갑자기 느린 동작을 보이는 경우가 있다. 이러한 경우는 일반적으로 시간이 약간 경과하면 다시 원상태로 회복되지만 만약 이런 현상이 지속적으로 나타나면 다음과 같은 단계로 시스템을 체크해 보자.



1) ps 혹은 top 명령을 통해 zombie 프로세스나 혹은 시스템 자원을 굉장히 많이 소비하는 프로세스가 없는지 확인한다. cpu 사용율 50% 이상 사용하는 프로세스를 처리하고 만약 이러한 프로세스가 없을 경우는 10% 미만의 프로세스가 여러개(3개이상) 있는지 검사한다. 검사는 uptime 명령을 사용해 평균 부하를 체크하고 cpu가 계속 대기 상태인지를 vmstat 나 'sar -u' 명령을 통해 확인한다.



2) cpu 사용상태에 문제가 없는 경우는 얼마나 많은 가상 메모리의 교체(Paging)가 일어나는지 vmstat나 ‘sar -g' 명령을 통해 확인한다. 많은 수의 교체가 일어난다는 것은 메모리에 대한 경쟁이 치열함을 의미하는 것이다. 만약 페이징 없이 디스크 사용정도가 높게 나타나면 이는 하나의 프로세스가 파일 입.출력을 하면서 디스크를 독점함을 의미하는 것이다. 이런 경우 그 프로세스를 찾는 것은 사실 뾰족한 방법이 없는데 일반적으로 디스크 사용이 많은 프로세스는 cpu 사용도 많다는 정도가 도움이 될 것이다.



3) 문제가 되는 프로세스를 찾았을 때 우선은 그 프로세스의 소유자에게 확인한 후 그 프로세스의 우선 순위를 낮게 조정한다거나 혹은 제거하는 방법을 사용해야 할 것이다. 물론 여기에는 사용자와의 인간적인 대화가 먼저 요구된다. 물론 불법적인 프로세스인 경우는 물어볼 필요없이 제거하면 된다. 참고로 BSD 시스템의 경우는 setrlimit() 시스템 콜을 이용한 limit 명령을 통해 물리적 메모리의 사용량을 제한 할 수 있다. 사용예는 다음과 같다.



% limit memoyues 2m



위의 예는 2MByte로 메모리 사용량을 제한하는 것이다.



4) 시스템 성능저하의 원인이 프로세스 때문이 아니라면 다른 이유로 인해 발생한 것으로 보면 되는데 첫 번째가 네트워크의 부하가 큰 경우이다. 두 번째가 서버-클라이언트 관련된 프로그램에 의한 연결지연이 그 원인인데 이는 서버가 다운된 경우 이를 접속하려는 클라이언트가 계속 연결지연을 하는것이 그 원인인 것이다. 이러한 문제들은 네트워크 상태를 체크해 파악한 후 해결한다.




15.13 Process 분석



% ps -au

 USER      PID %CPU %MEM  SZ RSS TT STAT START TIME COMMAND

 hjh       327 0.0 2.0 456 896 p0 R   10:31  0:00 ps -au

 hjh       306 0.0 0.8 152 336 p0 S   10:24  0:00 -csh (csh)



 - USER : The user who started the process

 - PID  : The process ID number assigned by the system

 - %CPU : The percentage of the CPU time used by this process

 - %MEM :      ,,             system's physical memory used by

           this process

 - SZ   : The amount of nonshered virtual memory, in KByte

 - RSS  : Real memory (resident set) size of the process (in kilobytes)

 - TT   : tty name

 - STAT : process's status

           . R : runnable

           . T : currently stopped

           . P : waiting for a page-in

           . D :    ,,     disk I/O

              . S : sleeping for less than 20 seconds

           . I : idle (sleeping for more then 20 seconds)

           . Z : terminated but has not died



 - TIME : The total amount of CPU time that the program has consumed




16장. AWK




1. awk의 기본 개념



1) awk란?

; awk란 이름은 이 유틸리티를 작성한 A.V.Aho, P.J. Weinberger, B. Kernigham의 머리글자를 따온 것

① awk는 일종의 프로그래밍 언어지만 일반적인 언어라기 보다는 주로 패턴의 검색과 조작을 주목적으로 만들어진 것이다.

② 파일의 각 라인에서 필드(field)를 인식할 수 있는 패턴 매칭 기능을 가지고 이들 필드를 자유자재로 조작 가능한 유틸리티를 작성하고자

만든 것이다.



2) awk의 응용분야

데이터 프로세싱, 리포트 작성, 간단한 데이터베이스 구축, 등



3) awk를 이용한 작업

① 프로그래머가 자신이 작성한 프로그램의 입력 화일이 특정한 형식에 들어 맞게 이루어져 있는지 검사.

② 출력화일을 처리하여 리포트를 만들어 냄.

③ 다른 프로그램의 입력 형식에 맞게 변환하는 작업에 이용.



2. awk 프로그램의 구조 및 실행



(1) awk 프로그램의 구조



  1) awk ' pattern {action}

      

      pattern {action}

      .

      .

      .

      ' filenames <-----------------입력화일(예제 : students)

  

  2) awk -f parttern-action-file filenames <----- 입력화일

      awk실행 action을 가진 프로그램 file



(2) awk의 pattern



패 턴                내     용

================================================================================================

BEGIN             입력화일을 읽어들이기 전에 옆에 제시되는 문자을 실행시키도록 한다.

END               awk가 모든 입력을 처리한 후, 옆에 제시되는 문장을 실행시키도록 한다.

expression        식을 평가한 후 이 식이 참, 즉 non-zero이거나 non-null인 경우 문장을

                  실행한다.

/re/              정규식과 일치하는 문자열을 포함하고 있는 라인에서 문장을 실행한다.

compound-pattern  복합패턴이라는 것으로 &&(and), ||(or) , !(not) 그리고 괄호에 의해 연결시킨

                  것이다. expression의 경우와 마찬가지로 복합 패턴도 참인 경우의 문장을 실행

                  시킨다.

pattern1,pattern2 이러한 패턴을 범위 패턴이라한다. 현재 처리되고 있는 라인이 pattern1과 일치

                  되고, 다음에 따라오 는 라인 중 임의의 라인이 pattern2와 일치할 때, 범위

                  패턴은 두 라인 사이의 각 라인과 일치한다.



(3) awk의 연산자

연 산 자               내     용

================================================================================================

= += -= *= /= %=      배정(assignment)연산자

+ - * / % ++ --       산술 연산자

|| && !               논리 연산자(|| = OR, && = AND, ! = NOT)

> >= < <= == !=       비교 연산자

v ~p                  변수 V가 패턴 P에 부합되면 참

v !~p                 변수 V가 패턴 P에 부합되지 않으면 참



(4) 액션(Actions)

액션은 문장(statements)으로 이루어져 있다. 액션은 간단하게 상수 하나로 이루어질 수도 있고, 개행 문자나 세미콜론(;)에 의해 분리된 몇 개의 문장의 연속으로 구성될 수도 있다.

  ① expressions

  ② print expression-list

  ③ printf(format, expression-list)

  ④ if (expression) statement

  ⑤ if (expression) statement else statement

  ⑥ while (expression) statement

  ⑦ for (expression; expression; expression) statement

  ⑧ for (variable in array) statement

  ⑨ do statement while (expression)

  ⑩ break

  ⑪ continue

  ⑫ next

  ⑬ exit

  ⑭ exit expression

  ⑮ {statement}



(5) awk에서 미리 정의된 몇가지 변수들

변 수             내     용

================================================================================================

FILENAME          현재 처리되고 있는 입력 파일의 이름

FS                입력 필드 분리문자

NR                현재 레코드(행)의 번호

NF                현재 레코드(행)의 필드의 갯수

OFS               출력되는 필드의 분리문자



3. awk의 기본예제

(1) 예제 입력 파일 소개

  ① 입력화일의 이름은 students

  ② 이 파일의 각 라인은 3개의 필드로 구성(학생 성명, 학과명, 나이)

  ③ 각 필드는 공백에 의해서 분리(공백을 필드 분리자로 간주함.)

  < awk는 각 라인에서 필드를 추출해 내는 데 필드 분리자(field separator)를 사용, 필드 분리자는

    보통 하나 이상의 공백 문자이다.>

  

1) 입력화일 예제 students

  % cat students

  John,P Physics 20

  Rick,L Mechanical 21

  Jack,T electrical 23

  Larry,M Chemical 22

  Phil,R Electrical 21

  Mike,T mechanical 22

  Paul,R Chemical 23

  John,T Chemical 23

  Tony,N Chemical 22

  James,R Electrical 21



예 1) 식(expression)에 맞는 field 프린트하기

  % awk '$3 > 22 {print $1}' students

  Jack,T

  Paul,R

  John,T

  

예 2) if 문을 사용하여 조건에 맞는 line 분리하기(각 파일에 저장)

  

  step 1 : if문을 사용하는 프로그램을 awkprog1이라는 파일로 만든다.

      

      % cat awkprog1

      { if ($1 ~ /^J/) printf "%s\n", $0 > "Jfile"

      if ($1 ~ /^P/) printf "%s\n", $0 > "Pfile"}

  

  step 2 : students 입력화일에 awkpog1 프로그램 화일을 적용한다.

      

      % awk -f awkprog1 students

  

  step 3 : 결과 보기

      % cat Jfile

      John,P Physics 20

      Jack,T electrical 23

      John,T Chemical 23

      James,R Electrical 21

      

      % cat Pfile

      Phil,R Electrical 21

      Paul,R Chemical 23



예 3) 평균값 구하기

  

  <프로그램 awkprog2, awkprog3>

  

  % cat awkprog2

  {sum += $3}

  END {printf "The average of the ages is %.2f\n", sum/NR}

  

  % cat awkprog3

  {sum += $3

  ++no}

  END {printf "The average of the ages is %.2f\n", sum/no}

  

  <결 과>

  % awk -f awkprog3 students

  The average of the ages is 21.80

  

예 4) while 과 do문을 이용하여 평균값 구하기

  

  <프로그램 awkprog4>

  % cat awkprog4

  {if (NF > 0) {

  sum = 0

  n = 1

  while (n <= NF) {

  sum = sum + $n

  n = n+1

  }

  printf "Average is %d\n", sum/NF

  }

  else

  print}

  

  <예 제>

  % awk -f awkprog4 test

  Average is 17

  Average is 3

  Average is 25

  Average is 0



17장. Sed



1. sed란?



(1) 개념

  sed는 Stream Editor의 약자로서 파일의 수정을 주 목적으로 한다.

  이는 파일을 순방향으로 읽는 동안 연산을 수행하며 텍스트 화일에서의 반복 수정에 용이하다.



(2) 기능

  주어진 텍스트 패턴을 갖는 모든 행을 delete

  특정 행에서 어떤 텍스트 패턴을 다른 패턴으로 바꿈

  하나의 파일을 다른 곳의 파일로 복사

  입력화일의 특정부분을 출력화일로 보냄

  

2.sed의 수행방법

  sed는 순환적으로 동작하며, 아래와 같은 순서로 실행된다.

  

  (1) 실행순서

      ① 입력행을 읽어 패턴 공백으로 옮긴다.

      <패턴 공백? ed와 같이 sed도 편집할 텍스트를 편집버퍼에 저정하는데, 이 버퍼를 패턴 공백

       이라고 한다.

          ed : 파일전체를 버퍼에 저장

          sed : 한 행의 텍스트만 패턴 버퍼에 저장>

      ② 편집대본(수정할 내용들)을 실행

      ③ 패턴 공백을 출력값으로 복사

  

  (2) sed 구조

          1) sed의 명령행 옵션

              옵션
    명령행
     내       용
 
-n
 sed -n
 -n 옵션이 주어지면 print 명령 주의 하나를 만나야만 출력이 생성된다.
 
-e
 sed -e [command]
 -e 다음의 command는 편집 대본이다. 여기서는 여러 개의 편집 대본을 하나의 명랭행에 지정가능하다.
 
-f
 sed -f [file]
 -f 다음에 오는 파일은 편집대본을 포함한 파일이다.
 


    2) sed 명령

              옵션
            내   용
 
s
 하나의 문자열을 다른 문자열로 대치한다.
 
a
 다음 입력 행을 읽기 전에 파일에 새로운 행을 추가한다.
 
i
 지정한 행에 문자열을 삽입한다.
 
d
 지정한 라인을 삭제한다.
 
c
 주소가 지정된 각 행을 user가 기술한 행으로 바꾼다.

(변경(c)명령은 행 전체를 변경하는 것이고, 대치(s)명령은 행의 일부분에 변경, 적용될 수 있다.)
 
p
 출력
 
w
 선택된 라인을 write
 
      



3. sed의 기본예제



  <기본 예제>

      

      % cat remind

      Janet today at 4.

      Call DEC

      add serial line for Brad

      Home at five sharp

      

  예제 1) 대치(s)명령, 삽입(i)명령, 삭제(d)명령 사용 예제

      

      <편집대본(파일명) : script>

      

      % cat script

      s/DEC/Dept. Environ. Cons./

      s/today/tomorrow/

      1i\

      Werner and Raquel this weekend\

      Feed polly for adam

      4d

      

      <결과>

      

      % sed -f script remind

      Werner and Raquel this weekend

      Feed polly for adam

      Janet tomorrow at 4.

      Call Dept. Environ. Cons.

      add serial line for Brad

      

  

  예제 2) 변경(c) 명령 사용 예제

      

      % cat script1

      2c\

      Dept. Environ. Cons

      

      <결과>

      % sed -f script1 remind

      Janet today at 4.

      Dept. Environ. Cons

      add serial line for Brad

      Home at five sharp

  

  예제 3) write명령을 사용한 예제

  

  % cat script2

  1,2w firstfile

  s/DEC/Dept. Environ. Cons./w rewrite

  4d

  w delfile

      

  <결 과>

  % sed -f script2 remind

  Janet today at 4.

  Call Dept. Environ. Cons.

  add serial line for Brad

  

  % cat rewrite

  Call Dept. Environ. Cons.

      

  % cat firstfile

  Janet today at 4.

  Call DEC

  

  % cat delfile

  Janet today at 4.

  Call Dept. Environ. Cons.

  add serial line for Brad

      

  예제 4) g옵션의 사용

  

  <기본예제>

  % cat file1

  It follows, then, that the divine, being good,

  is not, as most people say

  for the food things in human lige are far fewer than

  the evil, and, whereas the good must be ascribed to heaven only,

  

  <s옵션을 이용하여 문자열 바꾸기>

  

  % sed -e s/the// -e /for/d file1

  It follows, n, that the divine, being good,

  is not, as most people say

  evil, and, whereas the good must be ascribed to heaven only,

      

  <g옵션을 이용하여 문자열 바꾸기>

  % sed -e s/the//g -e/for/d file1

  It follows, n, that divine, being good,

  is not, as most people say

  evil, and, whereas good must be ascribed to heaven only,




18장. UNIX C-SHELL PROGRAMMING 기법



1. C-SHEEL이란

2. UNIX SHEEL의 주요 특성

3. C-SHEEL의 용도

4. SHELL의 종류

5. SHELL 명령어와 명령어 FILE

6. SHELL SCRIPT작성시 주의 사항

7. SHELL SCRIPT의 수행

8. shell script 변수

9. temporary file의 사용

10. shell script 제어문

11. 반복 제어문의 종류

12. 인수 list 처리

13. 환경 변수의 사용(변수명은 대문자)

14. 기정 변수의 사용 (set으로 내용 검색)

15. shell 변수의 특성

16. 문자 single(') 와 double(") 와 backword apostroples(') 사이의 차이점

17. shell 변수를 사용한 산술 연산

18. shell script의 debugging

19. 명령어의 대체

20. 명령어 집단화에 유용한 문자및 명령

21. BACKGROUND 상태에서 PROCESS수행

22. 사용자 process의 실행 순위의 조정

23. 수행중인 process의 정지와 재 수행

24. C-SHELL를 이용한 PROGRAM 예




1. C-SHEEL이란

 . 사용자 interface이다.

 . 어떤 특정한 상태가없다.

 . C-PROGRAM언어와 유사한 구문을 갖는 강력한 명령언어를 제공한다.

 . UNIX의 사용을 휠씬 쉽게 해준다.

 . utility, 특정 사용자 interface와 process FILE, 심지어는 범용 program 마저도

   신속하게 개발할 수 있도록 한다.




2. UNIX SHEEL의 주요 특성



(1) .cshrc .login .logout같은 특수FILE을 사용하여 자신의 session을 취향에 맞도록 수정할수

     있다.

(2) HISTORY기능을 쓰면 명령을 다시 실행할 수 있으며 ALIAS를 쓰면 연속된 명령을 다른 이름

    으로 사용할수있다.

(3) SHEEL변수를 쓰면 연속되는 명령에서 긴문자를 재사용 할 수 있도록 저장할 수있다.

    입출력 방향전환, 명령GROUP, 명령 치환 등은 명령을 구성하기 위한 C-SHEEL의

    기본요소다.

(4) UNIX의FILE SYSTEM은 계층적 구조를 가지고있다. FILE을 지정하는 것은 현재 DIRECTORY나

    ROOT DIRECTIRY로 시작하는 경로이름을 사용한다.

(5) C-SHEEL은 프로그램 언어이다. 새로운 도구를 창조해 내는것은 C-SHEEL SCRIPT,C-SHEEL

    명령, PROGRAM구조, ERROR검사, 입출력 명시등을 포함하는 TEXT FILE의 작성을 통해서

    이루어진다.



3. C-SHEEL의 용도

  다음 3가지 방법으로 사용할 수있다.

(1) 대화적으로 UNIX명령을 실용하기 위해

(2) 개인화에서 작업 환경을 정의하기위해

(3) PROGRAM에서 C-SHEEL PROGRAM같은 새로운 도구를 생성하기위해



4. SHELL의 종류

(1) C-SHELL(csh) : C PROGRAM언어로 부터 그구조와 이름이 유래됨

(2) UNIX 표준 BOURNE SHEEL (sh)

(3) UNIX V BOURNE SHELL (sh5)

(4) KORN SHELL (ksh) : BOURNE SHELL로 부터 유래된 최근의 SHELL



5. SHELL 명령어와 명령어 FILE



(1) PROFILE과 .profile 명령 FILE

  모든 사용자에게 적용되는 SHELL명령 FILE은 /etc/profile인데 사용자가 login하여 사용자의

  directory의 명령 file을 수행하기 전에 실행하도록 system 관리자가 기본적으로 설정한 명령

  file이다.각 사용자는 etc/profile을 수행한후 자신이 설정한 명령 file을 login한후 바로 실행

  시킬수 있는데 .profile에 명령을 설정하면 된다.



    (예) .profile FILE



    tty -s

    if test $? = 0

    then

            stty dec crt

    fi

    PATH=.:$HOME/bin:/usr/ucb:/bin:/usr/bin:/usr/local:/usr/new:/usr/hosts

    MAIL=/usr/spool/mail/$USER

    tset -n -I

    export TERM MAIL PATH

    biff n



(2) .cshrc 명령어 file (c-shell만 사용)

  다양한 경로의 변경이나 전체에 영향을 미치는 alias값등의 설정을 변경하려는 명령을 지정하는

  데 사용하는 file이다.

  .cshrc file은 HOME DIRECTORY에 존재하여 C-SHELL에 의해 해석된다. 이 FILE은 SHELL SCRIPT를

  효율적으로 사용 할 수 있도록 변수 할당, ERROR CODE와 같은 진보된 기능을 위해 이용된다.



  (예) .cshrc FILE

    if ($?prompt) then

            set prompt = "csh> "

            set notify

            set history = 50

            set term = vt100

            alias h history

            alias gc setenv GKS3Dconid basic002:0.0

            alias ung unsetenv GKS3Dconid

            alias unws unsetenv GKS3Dwstype

            alias gpr setenv GKS3Dconid /dev/tty01

            alias gp setenv GKS3Dwstype %x10500033

            alias gl setenv GKS3Dwstype %x00500033

            alias isl4 setenv GKS3Dwstype %x0070003d

            alias l "pwd;ls -F"

            alias pd pushd

            alias pop popd

            alias help apropos

            alias vt52 "set term = vt52"

            alias ti745 "set term = ti745 ; stty -tabs"

            alias ti785 "set term = ti745 ; stty -tabs"

            alias vt100 "set term = vt100"

            alias _dry cd /usr/skb/dry_source

            alias _opti cd /usr/skb/dry_source/opti

            alias _daed cd /usr/skb/dry_source/contact

            alias _marpol cd $HOME/sd9112/marpol

            alias _source cd $HOME/../source/sikob_source

            alias dryrun /usr/skb/dry_source/rev3/dryrun

            alias gendat /usr/skb/dry_source/rev3/gendat

            alias profile /usr/skb/dry_source/rev1/profile

            alias prelikon cd /usr/sbdd1.users/sikob/source/prelikon

            alias pkdata cd /usr/sbdd1.users/pkdata

            alias hpgl "echo '||e5' > /dev/tty01;setenv GKS3Dconid /dev/tty01"

            alias lo 'echo -n "From> ";set w = $<; find> "'

            alias cd 'cd \!*;set prompt="SIKOB [`dirs`]>"'

    endif



(3) .login 명령어 file (c-shell만 사용)

  만약 login shell이 c-shell이면 HOME DIRECTORY 내에 존재하는 .login FILE을 읽은후 그내용을

  순서대로 실행시킨다.



  .login FILE에는 많은 명령이 있으나 특히, SHELL 자체에 대한 설정 명령 SET가 많이 있다.

    (예) .login FILE



    stty dec new cr0

    tset -I -Q

    umask 022

    setenv MAIL /usr/spool/mail/$USER

    set mail=$MAIL

    set  path=(. $HOME/bin  /usr/ucb /bin  /usr/bin /usr/local  /usr/new  /usr/hosts

    /usr/users/sikob/bin/skcpl)

    set prompt="SIKOB > "

    setenv EXINIT 'set redraw wm=8'

    setenv DECFORT_FFRLIB "T"

    biff n

    date



(4) .logout 명령어 file (c-shell만 사용)



  logout명령을 수행 시키면 file logout에 저장된 명령을 실행 시킨다.

    (예) .logout FILE

    #

    # default cadds user logout script

    #

    # 24-Jun-86 HPS; 'oplog off' is commented out

    # 25-mar-86 jaf; moved

    # 11-mar-86 aws; created

    ######################################################################

    #

    #oplog off

    #clear

    cal



6. SHELL SCRIPT작성시 주의 사항



(1) 첫번째 LINE 첫 COLUME은 #! 로시작하며 그내용을 읽는 사람이 알기 쉽도록 SHELL SCRIPT를

    수행하는 SHELL의 경로명을 적는다.

(2) SHELL SCRIPT는 보통 작성자가 쉽게 간과해버는 주석에 대해 강조하여 작성한다.

(3) 주석은 #으로 시작하며 SHELL에 의해 명령어로 해석되지 않는다. 하지만 만일의 경우

    명령어로 해석되것을 방지 하기 위해 # 다음에 QUOTATION MARK로 문자을 열고 닫는다.

(4) 명령어를 적은후 동일 LINE에 #으로 시작하는 주석을 IN LINE COMEND라고 하며 명령어의

    마지막에 ;을 사용하여 명령어와 IN-LINE COMEND와 분리 한다.

(5) ECHO 명령은 ECHO 명령 다음의 명령과 함께 출력하는데 유용하게 사용된다.



7. SHELL SCRIPT의 수행

① SUB-SHELL을 수행 시킨다.

② 사용자의 현재 SHELL내에서 SCRIPT를 수행 시킨다.

③ SCRIPT를 수행 가능하게 만든다.



(1) SUB-SHELL의 수행

      BOURNE SHELL의 경우 : sh

      C-SHELL 의 경우 : csh

(2) 사용자의 현재 shell내에서 script 수행

      source

8. shell script 변수

(1) 변수명 부여시 주의 사항

  ① 변수의 이름은 문자로 시작한다.

  ② 변수는 문자, 숫자, 밑줄로 구성한다.

  ③ 길이는 20자까지 제한한다.

(2) 변수에 값할당/해제

  변수에 값을 할당하는 문자 = 를 사용하고 앞뒤에 공백이 없어야한다.

설정

      set <변수명> = <값>

        * 값이 문자열인 경우 " " double quotation 사용

해제

      $ unset <변수명>

(3) 변수값 출력

 echo $ <변수명>

 echo " "

 echo <단어>

(4) read문장을 이용한 값할당

  표준 입력 (key board)로 입력을 받아 변수에 값을 직접 할당



9. temporary file의 사용

현재 사용 directory에 임시 file을 작성 하는것은 매우 안전하지만 다음과 같은 이유로 피하는것

이 좋다.

  (1) 현재의 directory 에 TEMP라는 file이 이미 존재할 경우 shell script를 수행 시키면

      temp file이 새로운 file로 대체되어 원하지 않는 부작용이 생길수 있다.

  (2) 한 사용자가 작성한 명령 shell file을 다른 사용자가 공유하려는 경우 명령을 수행한 결과

      생성되는 임시 file이 다른 사용자에게 사용될수 있는지는 확실 하지 않다.



ㅇ대체 방안

  (1) 임시 file만을 저장하는 directory에 shell script file과 수행되는 PID번호를 연결한

      이름으로 저장하게 한다.



10. shell script 제어문



(1) 조건문의 사용

  명령을 연속으로 수행하지 않고 조건을 부여 수행 순서를 변경하고자 할때 사용



       korn shell의 경우

          if <조건이나 명령 표현식> ;

              then

                  참인 경우 - 명령 수행

                          :

                          :

          else

                  거짓인 경우 - 명령 수행

                          :

                          :

          fi



       c-shell의 경우



          if {<조건식/명령 표현식>} then

                  참인 경우 - 명령 수행

                          :

                          :

          else

                  거짓인 경우 - 명령 수행

                          :

                          :

          endif



ㅇ주의 사항

  ① then의 위치

     korn shell : if 명령과 다른 line, 즉 다음 line

     c-shell   : if와 같은 line상에 명령

  ② c-shell에서는 <조건식/명령 표현식>은 { }에 표현

  ③ <조건식/명령 표현식>의 거짓에 대한 처리가 필요치 않은 else이하는 생략

  ④ 명령 표현식의 참/거짓의 명령어 종료 상태 변수에 값을 할당한다.

     정상적인 경우 변수 값은 0(zero)가 저장되며 실패인 경우 다른 값이 저장되며 아래의

     값에 의해 결정된다.

      korn shell의 경우 : $status

       c-shell의 경우 : $?



ㅇ조건 대상

  ① 명령어가 조건 비교 판단

  ② 변수에 저장된 값과 숫자의 비교 판단 - 산술 연산자 사용

  ③ 변수에 저장된 문자열과의 비교 판단

  ④ file의 종류 비교 판단

  ⑤ file이나 변수의 형태를 비교 판단



 ㅇ 문자열 비교 연산자

      표현식                        설            명

==============================================================================================

<문자열1> == <문자열2>             두문자열이 같으면 참

<문자열1> != <문자열2>             두문자열이 다르면 참

<문자열1> =~ <문자열2>             <문자열1>과<문자열2>에 지정한 패턴이 일치 하면 참

<문자열1> !~ <문자열2>             <문자열1>과<문자열2>에 지정한 패턴이 일치 하지 않으면 참



ㅇfile의 접근권한, 존재유무, 종류 비교 조건

       조 건               설                 명

==============================================================================================

        -r             접근권한 읽기(r)로 설정 되면 참

        -w             접근권한 쓰기(w)로 설정 되면 참

        -x             접근권한 실행(x)로 설정 되면 참

        -e             존재하면 참

        -o             소유자가 명령 실행자면 참

        -O             소유자가 명령 실행자면 참

        -z             지정한 file의 내용이 없으면 참, 즉 file size 0(zero)면 참

        -f             directory 가 아니면 참

        -d             directory 이면 참



ㅇ산술 연산자

연산자       설  명

========================================

   +          덧셈

   -          뺄셈

   *          곱셈

   /          나눌셈

   %          나눌셈의 정수 나머지

   ^          승수



ㅇ논리 연산자

연산자        표   현                설       명

=========================================================================

  NOT         ! <표현식>              <표현식>이 참이면 거짓

  OR          <표현식1>||<표현식2>    표현식 1,2중 하나가 참이면 참

  AND         <표현식1>&&<표현식2>    표현식 1,2가 모두 참일때 참



(2)중첩 if문

  if ~ else ~ endif문 내에 if ~ else ~ endif문이 있는 경우



(3) 반복 (LOOPING)



11. 반복 제어문의 종류

(1) interative 반복문

   지정된 숫자만큼 반복하여 수행

    [korn shell의 경우]

      for <제어변수> in (<항목의 list>)

        do <명령문>

      done

    [c-shell의 경우]

      foreach<제어변수> (<항목 list>)

         <명령문>

      end



* 문장내에 항목 list를 기술하기 보다는 명령어 인수 list로 대체하는것이 일반적이다.



ㅇ항목 list를 명령어의 list로 대체 경우

     korn shell의 경우                c-shell의 경우

     for <반복 횟수> in $@            foreach <반복횟수> in ($argv[*])



(2) conditional 반복문



   조건이 만족하면 계속 수행 만족하지 않으면 정지

    [korn shell의 경우]

      while<조건>

           do

             <명령어들>

        done

    [c-shell의 경우]

        while (<조건>)

           do

             <명령어들>

        end

  * <조건>은 if ~ else ~ endif문에서 사용했던 조건 표현식과 같다.



ㅇ주의 사항

  ① <조건>이 참이면 일련의 명령을 수행한후 다시 <조건> 조사

  ② <조건>이 참이면 명령 수행, 거짓이면 반복문을 끝낸다.

  ③ <조건>이 참만 있으면 무한 loop처리로 program 오류 발생

  ④ 무한 loop로 판단되면 Ctrl+C로 정지

  ⑤ 무한 loop의 반복 원인을 찾아 수정


 set noglob : 입력되는 문자 ?가 if문에서의 패턴 사용 문자로 사용되는것을 방지한다.



12. 인수 list 처리

$# - positional parameter 라고 부르며, 인수의 갯수를 저장하며, 공백에 의해 분리되어 위치를

나눈다. 보통 $1 ~ $9까지의 변수를 사용하며 그이상일때는 { }를 사용하여 표시한다.



13. 환경 변수의 사용(변수명은 대문자)

① 이미 정의되어 사용자가 이름을 만들지 않아도 system에서 자동적으로 변수에 값을 저장하거나

   사용자가 필요로 할때 이용 할 수 있다.

② 사용자 환경에서 제어 된다.



 ㅇ환경 변수에 대한 설명 (env명령으로 내용 검색)

변수명        설               명

================================================================================

TERM          TERMINAL 유형을 정의하는 CODE로 설정

HOME          사용자의 HOME DIRECTORY정의, 절대 경로명을 가진다.

PATH          명령어 검색 경로

USER          모든 사용자의 LOGIN명을 가진다.

SHELL         사용자의 LOGIN SHELL, 절대 경로명을 가진다.

MAIL          사용자의 우편물을 저장하는 DIRECTORY로 경로명을 가진다.

EXINT         ex, vi편집기에 사용하는 OPTION들을 초기화한다.(40개)

TERMCAP       개인 DATA BASE를 사용하도록 한다. (DEFAULT는 etc/termcap)

TTYLINE       TERMONAL DEVICE PROGRAM을 사용할수 있도록 하기위해서 선언




14. 기정 변수의 사용 (set으로 내용 검색)

set 변수 = 문자열



기정 변수명     설                   명

================================================================================

path           명령어 검색 경로 directory명의 list를 가진다.

cdpath         unix 계층적 file system의 특성을 살려 작업영역을 독립된

               directory로 구분 할때 사용, 절대 경로명의 단어list

home           HOME DIR.의 절대 경로명을 포함하고 있다.

               LOGIN PROGRAM으로 부터 받은 값으로 초기화 한다.

shell          default c-shell은 shell을 /bin/csh로 초기화

               대개의 경우는 바꾸지 않는것이 좋다.

mail           MAIL BOX가 있는곳 설정, set mail = (60 /usr/sara)

history        history에 저장된 명령의 갯수 정의

histchars      history명령을 수행시키는데 사용하기를 원하는 수개의 문자

               로 설정, .cshrc file내에서 정의 할수 있다.

savehist       login session간의 history list를 연결하고 싶을때 사용

prompt         prompt 정의, 사건번호를 보이기 위해 history 문자 ! 를

               포함 시킬수 있다.

ignoreeof      실수로 Ctrl+D를 typing했을때 logout방지

noclobber      출력 방지 전환시 이에 존재하는 file에 겹쳐 쓰는것을 방지

time           주어진 시간 이상의 CPU시간을 소요하는 모든 명령에 대해

               지원 사용 통계치를 보여 준다.

cwd            사용자의 현재 사용 directory




15. shell 변수의 특성



① shell script에서 정의되어 생성된 변수는 shell script가 수행되는 동안만 존재하므로 명령어

   입력 line에서 대화식으로 참조하거나 다른 shell script에서 사용할 수 없다.

② terminal에서 keyboard 입력으로 변수를 설정한 경우 shell script내에서 대화식으로 사용한

   변수를 사용할 수 없게 된다.

③ 지역 변수다.



1)변수값 공유

       korn shell의 경우                 c-shell 의 경우

====================================================================================

typeset <변수명> = <할당할 값>           setenv <변수명> <할당값>

export <변수명>

export <변수명> = <할당값>

export 명령 : shell script와 명령 입력 line에서 공유하여 사용



* 상위 shell에서 공유한 변수는 하위 shell에서 참조 가능 하지만 하위 shell에서 공유한 변수는

  상위 shell에서 참조 할수 없다.




16. 문자 single(') 와 double(") 와 backword apostroples(') 사이의 차이점



표식문자       설                 명

=======================================================================

   '          무조건 문자열 해석하여 출력

               변수,명령어,문자 패턴 모두 인식 하지 못함

   "          명령어와 변수를 해석하여 문자열과 출력

               명령어 '<수행 명령어>'

               변수는 $<변수명> 형식으로 사용

   `          명령어나 변수로 해석




17. shell 변수를 사용한 산술 연산

            korn shell의 경우



      ((<변수> = <변수나값> <산술연산자><변수나값>

      let <변수> = <변수나값><산술연산자><변수나값>



            c-shell의 경우



      @변수=<변수나값><산술연산자><변수나값>




18. shell script의 debugging



1) shell tracing

   set verbose - shell script program에 set verbose의 명령을 추가하여 명령을 추적

                 조사 할수있다.



       korn shell의 경우           c-shell의 경우

=======================================================================

ksh -v <실행 shell script명>       csh -v <실행 shell script명>

ksh -x <실행 shell script명>       csh -x <실행 shell script명>




19. 명령어의 대체



1) 명령어의 변수 할당

      korn shell의 경우                c-shell의 경우

typeset <변수명> = $(<명령어>)       set <변수명> = <'명령어'>



2) 명령어의 대체

  명령어를 변수에 할당하여 명령어의 인수로 사용하는 것이 아니라 명령어의 인수로 명령어를

  사용하여 대체하여 해석된후 수행한다.




20. 명령어 집단화에 유용한 문자및 명령



문자및  명령          결과 및 설명

========================================================================================

ECHO <명령열>           출력에 <문자열>이 표시

    ;                 명령어와 명령어 구분

    \                 명령이 한 LINE을 초과할경우 연결

   ( )                명령어 GROUP을 표시

   " "                ()와 같이 C-SHELL에 명령어 GROUP을 표시하여 해석하도록함




21. BACKGROUND 상태에서 PROCESS수행



1) BACKGROUND 상태에서 입력되는 보통의 명령어와 관계 없이 PROCESS를 수행 시키는 곳을

   말한다.



      <수행시킬 명령어> &



    * 수행후 "[작업번호] PROCESS번호 " 의형식으로 MESSAGE가출력된다.



2) login shell의 종료

   init process 는 system을 시작했을때 수행이 시작되며 system관리자나 consol에 의해 관리되

   고 책임을 갖게된다.

   사용자가 logout하면 login shell과 함께 background에서 수행되는 process가 종료되는 것이

   아니라 background process의 부모 process를 login shell에서 init process로 옮겨 할당된다.



3) background작업의 표준 입력

   .login file에서 set notify로 설정하면 backgound 작업중에 system에서 대화식으로 요구되는

   입력을 할 수 있게된다. 즉, background작업중 표준 입력 (key board)로 부터 입력을 해야 할

   경우 system에서 message를 출력하여 입력을 요구하며 입력이 되면 계속 수행된다.



      fg <작업 번호>



4) sleep명령어

   지정한 시간동안 명령어의 수행을 일시 정지 시키는 명령어



       sleep <시간 : 숫자>; <수행 명령어> &




22. 사용자 process의 실행 순위의 조정



보통의 명령보다 낮은 실행 순위로 명령을 수행 시키면 긴 처리 시간후에 완료된다. 보통의

process는 0의 실행 순위를 갖으며, -20~20까지의 범위에서 설정 할 수 있다.



       nice <실행순위> <수행명령어> &



다음은 유용하게 사용되는 실행 순위이다.



 실행 순위        설        명

===========================================================================================

    +19         process가 매우 느리게 수행된다.

    +10         nice명령어의 실행 순위를 지정하지 않을때 기본 실행 순위

     0          보통 작업의 실행 순위

 -1 ~ -20       system관리자만 설정 할수있는 실행순서로 process를 빠르게

                 수행시킨다.




23. 수행중인 process의 정지와 재 수행



jobs명령은 작업 번호에 의해서 작업의 list를 출력 시킨다.

작업 제어 명령어



     명령어               설                명

============================================================================================

      <명령어> &        background에서 명령어나 작업을 수행

      jobs              정지상태나 수행중인 작업 번호를 활동 상태의 작업

                         list 출력

      stop<작업번호>    지정한 background작업의 정지

      Ctrl+Z            현재 수행중인 foreground작업의 정지

      Kill PID          PID번호에 의해 작업을 TERM/sjg로 이름지어진 번호를

                         보내면서 정지

      Kill-l            작업 정지 신호의 list

      bg <작업번호>     background작업을 계속 수행

      fg <작업번호>     foreground 작업을 계속 수행




24. C-SHELL를 이용한 PROGRAM 예



   (cadds file backup용)

#

# default backsrc script

#

     set io = "tar: read error: I/O error"

     while(1)

     set d = `date`

     echo ' '

     echo ' '

     echo " DATE : "$d[6]. $d[2]. $d[3].

     echo " TIME : "$d[4]

     echo ''

     echo ' ******************************************************'

     echo '   CREATE TAPE ARCHIVES, AND ADD OR EXTRACT FILES'

     echo ' ******************************************************'

     echo ''

     echo '  ************************************************'

     echo '  *     1. file list for m.t                   *'

     echo '  *     2. back up (work station ===> m.t)     *'

     echo '  *     3. restore (m.t ===> work station)     *'

     echo '  *     4. exit                                *'

     echo '  ************************************************'

     echo ''

     echo -n '    WHAT DO YOU WANT TO EXECUTE ? ---- NO. : '

     set test = $<

     echo ''

if ($test) then

   if($test == 1) then

     mt -f /dev/rst0 rewind

     while(1)

     echo ' ******************************************************'

     echo ' *     Display table of contents of the archive     *'

     echo ' ******************************************************'

     echo ''

     tar -tvf /dev/nrst0

     echo -n '    Continue ("y"/"n") ....................: '

     set cont = $<

     if($cont == n) break

     end

   else if ($test == 2) then

     while(1)

     echo ''

     echo ' *******************************************'

     echo ' *              BACKUP MODE              *'

     echo ' *******************************************'

     echo ''

     echo -n '    INPUT (file & directory) ............. : '

     set fldir = $<

     tar -cvf /dev/nrst0 $fldir

     echo -n '    Continue ("y"/"n") ....................: '

     set cont = $<

     if($cont == n) break

     end


   else if ($test == 3) then

     mt -f /dev/rst0 rewind

     while(1)

     echo ''

     echo ' *******************************************'

     echo ' *             RESTORE MODE              *'

     echo ' *******************************************'

     echo ''

     echo -n '    INPUT (skip over the end of file).... : '

     set skip = $<

     mt -f /dev/nrst0 fsf $skip

     echo -n '    INPUT (file & directory) ............. : '

     set fldir = $<

     tar -xvf /dev/nrst0 $fldir

     echo -n '    Continue ("y"/"n") ....................: '

     set cont = $<

     if($cont == n) break

     end

   else if ($test == 4) then

     break

endif

end

mt -f /dev/rst0 rewind

     echo '    ***** END OF BACKUP/RESTORE C-SHEEL ***** '






19장. VI 편집기



* Cursor를 옮기는 여러가지 방법

                k(-)

                 /\

                 ||

   h(bs) <-----     ----->  l(sp)

                 ||

                 \/

                j(+)


  h,j,k 와 i 를 이용하영 간단히 키보를 누르면 cursor의 위치가 변경됩니다.

  ()에 있는 키를 선택하여도 됩니다.

  ※ bs : BackSpace , sp : SPace bar



* 화면을 옮기는 여러가지 방법

  ^f   - (FORWARD) 화면을 one page 앞으로 옮김

  ^b   - (BACKWARD) 화면을 one page 뒤으로 옮김

  ^d   - (DOWN) 화면을 반 page 앞으로 옮김

  ^u   - (UP) 화면을 반 page 뒤으로 옮김

           ※ ^ 는 키보드의 <Cntl>를 나타내는 것입니다.



* 한 화면 안에서 cursor를 옮기는 방법

  H   - HOME, 한 화면의 top line으로 옮긴다.

  M   - MIDDLE, 한 화면의 중간으로 옮긴다.

  L   - LAST, 한 화면의 마지막 line으로 옮긴다.

  G   - GOTO, 화일의 마지막 line으로 옮긴다.

  nG  - GOTO nth line the file (or :n)

  ^G  - GIVES file status



* 한 line 안에서 cursor를 옮기는 방법

  w   - WORD, 한단어 앞으로

  b   - BACKWARD, 한단어 뒤로

  e   - END, 현재 cursor가 위치한 맨 뒤로

  o   - zero, line의 맨 앞으로 (or ^)

  $   - end, line의 맨뒤로



* 검색

  /pattern - scan (/) 'pattern'이라는 글자를 현재 cursor가

              위치한 곳의 다음 단어를 검색

  ?pattern - scan (?) 'pattern'이라는 글자를 현재 cursor가

              위치한 곳의 앞 단어를 검색

  n       - 앞쪽에서 입력했었던 문자 'pattern' 의 다음단어를 검색

  N       - 앞쪽에서 입력했었던 문자 'pattern' 의 다음 앞 단어를 검색



* vi를 빠져나가는 방법

  :q!     - 화일의 내용을 저장하지 않고 exit

  :w      - WRITE, vi를 빠져나가지 않으면서 내용을 저장

  :wq     - WRITE and QUIT, vi를 빠져나가면서 내용을 저장

  ZZ      - :wq의 명령과 같다.



* 삽입 mode

  Note : ESC (escape key) 는 삽입(insert)를 중지 시키고 명령어 mode로

         돌아가는 키이다.

  i   - INSERT, cursor 위치 부터 문자 삽입

  I   - INSERT, line의 맨 앞부터 문자 삽입

  a  - APPEND, cursor 다음 위치 부터 문자 삽입

  A  - APPEND, cursor 위치한 line의 끝부터 문자 삽입

  o  - OPEN line, 현재의 line 다음에 line 삽입

  O  - OPEN line, 현재의 line 앞에 line 삽입

  r   - REPLACE, 한 문자만을 대치 (does not require ESC)

  R  - REPLACE, ESC 키가 입력될때 까지 대치

  cw - CHANGE word, cursor가 위치한 곳의 단어 끝까지 대치

         (cnw - change n number of words)

  C  - CHANGE, cursor가 위치한 곳에서 line 끝까지 대치

  u  - UNDOES, 마지막 명령의 취소

  U  - UNDOES, line전체를 원 상태로 복구

  Note : INSERT mode 를 만든는 모든 문자(i, a, o, r, c, s <대문자 포함>)

         를 사용하는 경우 insert mode에서 입력 한 내용을 취소하고자

         하면, ESC 를 누르고 undo를 수행하는 u를 입력하면 된다.



* Yanking : (Copying)

  Y  - YANKS (copies) line을 사용자가 보이지 않는 buffer에 저장

  nY - YANKS n , n line을 사용자가 보이지 않는 buffer에 저장

* Deleting :

  x  - deletes, 문자 하나를 삭제 (also 'd sp')

  dw - DELETES words, 문자 하나를 삭제

  D  - DELETES, cursor가 있는 곳에서 부터 line끝 까지 삭제

  dd - DELETES lines, line하나를 삭제 하고 보이지 않는 buffer에 저장

  ndd - DELETES n, n line을 삭제 하고 보이지 않는 buffer에 저장

                  (i.e., 10dd deletes 10 lines)

* Putting :

  p  - PUTS, cursor가 위치한 다음 line에 보이지 않는 buffer의

         내용을 삽입

  P  - PUTS, cursor가 위치한 앞 line에 보이지 않는 buffer의

         내용을 삽입

  xp - cursor 가 위치한 문자와 다음 문자를 교환

* Interactive edit : (search and replace)

  /pattern - find pattern to be replaced (as above)

  cw      - use a replacement comand (cw, dw, r, s, etc.)

  n       - find next occurrence of 'pattern'

           - repeat command



앞의 내용 참고

* Global replacement :

  :1,$s/string1/string2/g

          1 line부터 끝까지 string1 를 string2 로 대치

         e.g., :1,$s/sun/SUN/g

* Global delete :

          :g/pattern/d

          1 line부터 끝까지 pattern 을 제거

        e.g.,   :g/###/d (to delete lines inserted by cc file.c | & error-v)

* Reading in files :

        :r file2 - cursor가 위치한 다음 line에 file2를 삽입

* Editing between files : (not needed for SUN system users)

        :w     - 다른 화일을 읽기전에 현재의 화일을 저장 (file1)

        :e file2 - 두번째 file을 edit하기 위해 load (file2)

        :w     - 두번째 화일을 저장 (file2)

        :e #   - original file 을 수정하기 위해 load (file1)

        example :w             /* file1을 빠져 나가기전에 저장*/

                :e file2 /* file2 load    */

                        "x4Y   /* buffer 'x'에 file2의 top 4 line을 저장 */

                :e #           /* file1 을 load (no changes) */

                        "xP    /* buffer 'x'에 저장 되어 있는 내용을 put */



* Miscellancenous commands :

        :! cmd - editor안에서 shell command를 수행 하고자 할때

        ~      - (tilde or 'wavy'), 대문자를 소문자로 소문자를 대문자로 교환

        %      - 한 line안에서 (,),{,},[,]를 검색

        mx     - 문자 x에 현재 위치를 표시

      d'x    - 문자 x에 표시된 위치 부터 현재 cursor 위치 까지 삭제

        ^V     - allows for insertion of control characters (e.g., ^L)

        ?string - scan (/) backward for 'pattern'

        :n,m w file - n line에서 m line까지 내용을 file 이라는 이름으록

                      (e.g., 15,25 w file)

        J       - JOINS, cusor가 있는 line과 다음 line을 join

        :set ai - editor 가 자동적으로 insert tabs을 삽입

        :set list - special characters 를 보여줌

                    (i.e., non-printable characters)

        :set nows - stop wraparound search

        :set ts=n - set tab stops to be other than the default (8)

        :set wm=n - set wrap margin (automatic carriage return insert at n)

example :      setenv EXINIT 'set ai wm=8 ts=4|map F W|map @ :w^M:e#^M'






20장. System Backup 및 주변장치(Device)



20.1 DAT제어를 위한 mt명령어



      - 테이프드라이브에 메세지를 보낸다.

      - TAPE환경 변수에 설정된 TAPE드라이브에 메세지를 전달하며,TAPE환경변수가 설정되어

        있지 않거나, 혹은 다른 TAPE드라이브에 메시지를 전달하려면 -f 옵션을 사용.

      - TAPE의 위치 조정이나, 되감기 등이 가능하다.

        fsf # TAPE를 앞쪽으로 skip

        bsf # TAPE를 뒤로 skip (1/2"테이프드라이브만 가능)

        rewind TAPE를 되감는다.

        offline TAPE를 되감고 unit를 offline 시킨다.

        status TAPE UNIT의 현재 상태및 다른 정보를 보여준다.

  예) 디폴트 테잎드라이브 설정

      #setenv TAPE /dev/nrst5

      #mt command

      특정 DRIVE에서의 메세지 전달

      #mt -f /dev/nrst5 command

      #mt fsf 1  : 테이프 앞쪽으로 1번 skip

      #mt rewind : 테이프 되감기

      #mt erase  : 테이프 내용 지우기

      #mt status : 테이프드라이브의 정보 보기

      #mt offline : 테이프드라이브 offline



  예) #ls -al /dev/rst5 하면 rst5가 link된 /dev/rmt/xxx 가 보여진다.



※ backup 사용시 자신의 dir 포함유무 확인



20.2 tar 명령어



    특정 화일이나, 디렉토리를 복사하거나 재저장한다.

    옵션 x : 화일을 restore 한다. ??

          c : 화일을 creat 한다.   ? 셋중 하나를 반드시 첫옵션으로 사용.

          t : 화일을 test 한다.   ??

          f device : 테이프 디바이스 명시

          v       : verbose mode

          b size  : block size 명시

          r       : tar file 마지막에 추가 (1/4" 테입드라이브에서는 사용불가)

        - remote 테이프드라이브를 이용해서 테이프에 화일을 복사

         #tar cvbf - 126 files |rsh goldstar dd of=/dev/rst0 obs=1266

        - remote 테이프드라이브를 이용해서 현재디렉토리로 화일을 복사.

        #tar goldstar ss if=/dev/rst0 bs=64b | tar xvBbf - 126 files



        #tar tvf /dev/rst0 /etc    ; /etc를 Backup

            ?       ?

            ?       ??>2.x는 rst4 or 5, rst는 rewind해서 다시 쓰므로 nrst0

            ???>t:test, x:restore, c:creat

                * mt명령을 쓸려면

                        #ls -al /dev/rst5 하면 rst5가 어디에 link되있는지 확인할수 있다.

                      #mt -f /dev/rmt/



        예)어떤 미디어의 OPENWIN을 원래의 /usr에 copy 할때.

         #tar cvf - openwin|(cd /usr/;tar xvf -)

          설명 : 현재 디렉토리 하위에 opnewin디렉토리가 있을경우, tar로 openwin및

                 하위 디렉토리 전체를 묶은뒤 /usr 디렉토리에 openwin을 생성하면서

                 묶었던 디렉토리 모두를 푼다.

          * openwin이 수행되기 위해서는 /.cshrc파일에 아래 내용을 포함 시켜야 한다.

            setenv LANG ko

            setenv OPENWINHOME /usr/openwin

            set path=(/openwin/bin....추가)

            setenv LD_LIBRARY_PATH $OPENWINHOME/lib




20.3 cpio 명령어



      한 번에 두 개 명령 不 ==> error 유발함.

        예)사용법

        #cpio -itv [file or dir name] < /dev/rst5         : test

        #cpio -idumv [file or dir name] < /dev/rst5       : extract

        #cpio -ocvB [file or dir name] > /dev/rst5        : create



       ex) /usr/openwin/ "all"

        #cd /usr/openwin

        #find . -print | cpio -ocvB > /dev/rst5

             |---->상대path : restore시 현재 dir밑에 write

                  절대path로 정하면 무조건 /usr/openwin 에 write

        #cpio -ocvB /usr/openwin > /dev/rst5

        #cd /usr

        #find openwin -print |cpio -ocvB > /dev/rst5



        * File단위 Backup

        #find . -print | cpio -pdv /home/etc ; 현재 내용을 /home/etc로 옮길때.




20.4 ufsdump 명령어



  2.x ; 파일시스템 단위 백업.

  ※ 참고 : dump / restore (SunOS 4.1.3)

            ufsdump /ufsrestore (Solaris 2.x)

      #ufsdump 0uf /dev/rst4 /dev/rdsk/c0t0d0s0   : create

      #ufsdump 0uf /dev/nrst4 /dev/rdsk/c0t0d0s0   : create

        #ufsrestore xvf /dev/rst4    : extract

        #ufsrestore tvf /dev/rst4    : test

        #ufsrestore ivf /dev/rst4    : information mode - 단일file

         $>ls or cd or ...

         $>add file-name

         $>setmod

            ......? n

         $>extract     ;

  ※ 특정 FILE RESTORE시

        #ufsrestore ivf /dev/rst4

        ufsrestore>add file_name ; 받고자하는 파일

        ufsrestore>ls ; 하면 받고자하는 파일에 "*"표시가 되있음.

        ufsrestore>extract ; 파일이 있는 volume_number를 묻는다.

                            만약, 첫번째 volume에 있으면, Mount volume에 “1”을 입력.



  ※ 예 : /(ROOT)파일 시스템을 /home 에 백업.

        #ufsdump 0uf - /dev/rdsk/c0t3d0s0 | (cd /home;ufsrestore xvf -)

                      ; 특정 파티션 받을때, disk대disk복사시 root 받을때 유용

      #tar cvf - . | (cd todir;tar xvfBP -) ; 특정 디렉토리 받을 때




20.5 Remote Backup



제한사항 ; /.rhosts 와 /etc/hosts.equiv 두파일에 REMOTE HOST_NAME을 포함하면 등록호스트를

           허락 한다는 의미, “+” 기호가 있으면 모든 호스트에 대하여 개방한다는 의미이다.

           “[host_name] [username]" ; "sun schong" or "sun +" or "+ schong"

           /.cshrc 파일에 stty function이 없어야 한다.

  

#tar cvf - .|(rsh avante dd of=/dev/rst5) ; 현재 DIR을 avante의 테잎드라이브에 백업

                                            restore시에는 of 대신 if.

REMOTE COPY

  #rsh sun dd if=/dev/nrst0 | dd of=/dev/nrst1

    ; 원격 호스트 "sun" 의 DAT 내용을 현재 내 DAT 에

  #rsh sun tar cvpf - filename | dd of=/dev/nrst1

    ; 현재 내 DAT에 원격호스트“sun"의 filename을 저장

CREATE A TAR FILE ON A REMOTE TAPE DRIVE

  #tar cvf - filename | rsh remotehostname dd of=/dev/nrst0

    ; SUN의 /usr/sbin을 SUN2의 /export/sbin에 생성시킬 때

      SUN#tar cvf - /usr/sbin | rsh SUN2 dd of=/export/sbin/sbin.tar

  #rsh sun dd if=/dev/nrst4 | tar xvf -

    ; dd 는 표준출력이므로 “|”을 하고, 출력을 지정하지 않으면 위의 리모트 호스트

      에 해당하는“sun"에 직접 풀어 버린다.

      ※ 주의 ; 원격 호스트의 DAT에서 현재 시스템으로 Restore할 경우 “|”에 유의!




20.6 Remote CD-ROM Mount



1. remote_machine : CD Drive가 연결된 system

   local_machine : CD Drive 없는 system

2. local_system and remote_system 공통

   # vi /.rhosts

     +

   # vi /etc/hosts.equiv

     +

3. local and remote system에 OS가 Solaris 2.x 일때

    a. remote# mkdir -p /cdrom/unnamed_cdrom

    b. remote# mount -F ufs -r /dev/dsk/c0t6d0s2 /cdrom/unnamed-cdrom

    c. remote # vi /etc/dfs/dfstab file에 다음을 삽입

                share -F nfs -o ro /cdrom/unnamed_cdrom

    d. system reboot

    e. remote# shareall

    f. remote# rlogin local_machine -l root   

    g. local# mkdir -p /cdrom/unnamed_cdrom

    h. local# mount -r remote_machine:/cdrom/unnamed_cdrom /cdrom/unnamed_cdrom

4. remote system : Solaris 2.x

   local system : Solaris 1.x (Sun OS 4.1.x)

    a. ~ f.  까지 3번과 같음

    g. mkdir /cdrom

    h. mount -r remote_machine:/cdrom/unnamed_cdrom /cdrom

5. remote and local system : Solaris 1.x 일때

    a. remote# mkdir /cdrom

    b. remote# mount -r /dev/sr0 /cdrom

    c. remote# vi /etc/exports file에 다음을 삽입

       /cdrom -ro

    d. system reboot

       - export file modify 했을경우는 system rebooting 하지않고

       /usr/etc/exportfs -a command로 확인하면 됨

    e. remote# rlogin local_machine -l root

    f. local# mkdir /cdrom

    g. local# mount -r remote_machine:/cdrom /cdrom




20.7 DEVICE 관련된 사항



파일시스템분류

0 sd0                               c0t0d0s0

1 sd1                               c0 - scsi controller number

2 sd2                               t0 - target number

3 sd0 ---> default                  do - disk number

4 st ?? Tape                        s0 - partition(slice) number

5 st ??

6 cdrom

7 scsi

   

1. CD-ROM

 * 4.1.3 에서는 /dev/sr0 or /dev/sr1

   2.x 에서는 /dev/sr5 or /dev/sr6

2. Tape-Drive

   1) /dev/rst4 or 5        <---- boot -r 로 부팅이 이루어 졌을때.

     * 4.1.3에서는 rst0 or rst1     Reconfiguration옵션(boot -r)없이 부팅된 상태라면

                                   명령라인에서 "drvconfig", "disks" or "tapes" ...

   2) /dev/rmt/0nm or 1nm <---- drvconfig , tapes 명령으로 임시접속 시켰을 때의

                                   Device_name


20.8 DISK 모델 관련 사항


1. Seagate ST410800N 일때.

   ST: Seagate (회사명) , 4: Form-Factor , 10800: Mbyte , N: Interface

   Form-Factor

      1 = 3.5-inch, half-height (41mm)

      3 = 3.5-inch, 1-inch height (25mm)

      4 = 5.25-inch, full-height (82mm)

      5 = 3.5-inch, 0.75-inch height (19mm)

      7 = 1.8-inch

      9 = 2.5-inch

   Mbytes

        Unformatted capacity (approx)

   Interface

       A = AT(IDE)

       AD = 50pin 1.3inch AT

       FC = Fibre Channel

       N = SCSI, 8-bit

       NC = Single Connector SCSI, 8-bit

       ND = Differential SCSI, 8-bit

       W = SCSI, 16bit

       WC = Single Connector SCSI, 16-bit

       WD = Differential SCSI, 16-bit

       P5 = PCMCIA, 5V

       G = SafeRiteTM

       K = IPI-2

       ※ 99년인 요즘은 N 타입 후속인 LW 와 WC 후속인 LC 타입이 주류를 이루고 있다.

          속도(RPM) 도 많이 증가하여 현재는 10,000RPM 에 달하고 있다.



20.9 Addon DISK(추가 디바이스 설치)


  1) ok probe-scsi                          ; PROM상에서 물리적으로 디스크가 Addon됬는지 확인

     ok boot -r                             ; 확인이 되었다면 Reconfiguration부팅

     #format -> partition(print,label,q)    ; 파티션 설정후 labeling 및 backup 한다음 quit

  2) #newfs /dev/rsd1g                      ; 2.x에서는 “/dev/rdsk/c0t1d0s6” 처럼 표현

     #mount /dev/sd1g /usr                  ; 만들어진 파일시스템을 mount_point에 마운트

     #vi /etc/fstab                         ; 부팅시 인식시키기위한 마운트

                                               테이블 편집(2.x일 경우는 /etc/vfstab 파일)

  3) #fsck /dev/rsd1g                       ; 최종적으로 파티션 check

     또는 "fack /dev/rdsk/c0t1d0s6" (2.x일경우)



20.10 DEVICE 설치



  1. 시스템을 shutdown하지 않고 잠시 OK 모드로 나가 device를 붙일때.

     #STOP+A: 시스템 잠시 멈추기 위함.      

        - device를 붙이고, "go"명령으로 복귀후 다음 실행

        - 위험하므로, 특별한 경우가 아니면 power off 후에 하는게 좋다.

     #drvconfig                             

     #disks ------> tapedrive이면 "tapes"   

   #format                                

  2. 시스템을 shutdown 하고 boot -r으로 재부팅하면, 위의 예처럼 device를 인식할수 있다.

     ※ vfstab(/etc)에 디바이스 명을 기입해주면 부팅시 자동으로 디바이스 인식.

        4.x에서는 fstab.

  * therd-party SCSI interface 설치(아답텍Controller을 SUN PCI 에 설치시)

    Installing The Device Driver (Version 2.0 or Later)

    For Solaris SPARC 2.5.1 / 2.6

    

    Installing from a floppy Disk

    

    1. Log on to The Solaris Operation System as root.

    

  2. At the superuser prompt(#), type the following command and press Enter;

    # mkdir floppy

    # /etc/init.d/volmgt stop

    # /etc/init.d/volmgt start

    # volcheck

    # cd /floppy/floppy0

    # cp 780fv200.dd.Z /tmp

    

  3. Then type the following and press displayed;

    # cd /tmp

    # uncompress 780fv200.dd.Z

    # pkgadd -d 780fv200.dd

    

  The following software package is displayed;

  1. ADPadp Adaptec 294X(U)W/394X(U)W/4944(U)W SCSI

             Host Adapter Driver

             (Ultra Sparc) release v2.00

  Press Y to answer yes to each question that follows.

  

  4. When the following messages is displayed, type q to quit the installation;

    Installation of <ADPadp>was successful.

  

  5. Reboot the system to enable the new device driver to take effect.

  



20.11 DISK format Utilities(Partition설정시)



  p,p해서 partition메뉴로 들어간다.

  파티션 설정후

label하고 Q로 나온다.             ※ defect, backup은 추후/etc/format.dat에 파티션내용이

defect로 list잡은후                                                              저장된다.

commit실행후 Q로 나온다.

backup실행후 label을 다시한 후 Q로 나온다.




20.12 SCSI Disk의 RPM조정



  스카시 디스크의 서로 다른 RPM 때문에 System의 문제시 조치 방법

  - Single Boot

    # adb -w /kernel/unix

      SCSI_options? W 58

      $q

    # boot -r

  - 4.1.x에서

    # adb -w /vmunix

      SCSI_options? W 58

    # boot -r

  



20.13 Floppy DISK인식



  ※ 시스템 인식여부 테스트

    ok test-floppy      ; floppy디스크 test .. 이상 없다면, System booting 진행.

    ok boot -r          ; boot sd(0,1,0) -r --> SunOS일 경우

    로긴하고,...

    sun#volcheck  ???> Floppy드라이브를 시스템이 자동마운트 한다.

                        대게는 /floppy/no_name.. 이렇게 마운트 될것이다.



  ※ tar포멧으로 data가 저장 되어있을 때는 Floppy가 mount 안되므로, 이때는 vold 데몬을

     kill 하고 tar를 사용하면 된다.

     #ps -ef|grep vold           ; 자동마운트 데몬을 찾는다.

     #kill -9 vold_pid           ; 데몬을 kill 한다.

     #tar xvf /dev/floppy        ; data를 down_load 한다.

     #eject fd                   ; 디스켓을 꺼낸다.



20.14 /(루트) file System restore



  아래는 /(루트) 파일시스템의 restore 방법이다.


  ok boot cdrom -s

  Boot device: /sbus/esp@0,8000000/sd@6,0:c File and args: -sw

  SunOS Release 5.1 Version Generic [UNIX(R) System V Release 4.0]

  INIT: SINGLE USER MODE

  # newfs /dev/rdsk/c0t3d0s0

  newfs: construct a new file system /dev/rdsk/c0t3d0s0: (y/n)? y

  /dev/rdsk/c0t3d0s0: 59760 sectors in 83 cylinders of 9 tracks, 80 sectors

  30.6MB in 6 cyl groups (16 c/g, 5.90MB/g, 2688 i/g)

  super-block backups (for fsck -F ufs -o b=#) at:

   32, 11632, 23232, 34832, 46432, 58032,

  # fsck /dev/rdsk/c0t3d0s0

  ** /dev/rdsk/c0t3d0s0

  ** Last Mounted on

  ** Phase 1 - Check Blocks and Sizes

  ** Phase 2 - Check Pathnames

  ** Phase 3 - Check Connectivity

  ** Phase 4 - Check Reference Counts

  ** Phase 5 - Check Cyl groups

  2 files, 9 used, 27742 free (14 frags, 3466 blocks, 0.1% fragmentation)

  # mount /dev/dsk/c0t3d0s0 /a

  # cd /a

  # ufsrestore rvf /dev/rmt/0

  # rm restoresymtable

  # cd /

  # umount /a

  # fsck /dev/rdsk/c0t3d0s0

  ** /dev/rdsk/c0t3d0s0

  ** Last Mounted on /a

  ** Phast 1 - Check Blocks and Sizes

  ** Phast 2 - Check Pathnames

  ** Phast 3 - Check Connectivity

  ** Phast 4 - Check Reference Counts

  ** Phase 5 - Check Cyl groups

  1779 files, 12509 used, 15242 free (34 frags, 1901 blocks, 0.1% fragmentation)

  # cd /usr/lib/fs/ufs                         2.x일 경우

  # installboot bootblk /dev/rdsk/c0t3d0s0   sol 2.6일 경우

  # reboot                                     /usr/platform/sun 4x/lib/fs/ufs/bootblk

  

  * 참고

  /에 “ufsboot" file이 존재하는지 확인 없으면 CD에서 Copy

  없을 경우 다음과 같은 error 발생     ⇒ error message : boot loader fast

21장. 시스템 ERROR 및 문제해결(Q&A)




21.1 Emergency Keyboard Commands



        Command                Description

-------------------------------------------------------------------------------

   STOP
 
-A(frmom keyboard)     Redirect Input to Come from Keyboard(CRASH)

   STOP
 
-F(from keyboard)      Output to ttya(Press/Hold during Power-Cycle)

   STOP
 
-D(from keyboard)      Set System to Diag Mode(diag-switch? ture)

   STOP
 
-N(from keyboard)      Reset all NVRAM parameters to default value

                                (Press/Hold during Power-Cycle)




21.2 directory write problem-/home & /net ( Solaris2.x )



Q) /home & /net directory 의 permition 이 555 로 되어있으며, permition 을 변경해도 root 조차

   write 할 수 없음.

A) /home 과 /net directory는 특별한 directory 로써 automounter 를 위한 mount points 이다.

   automounter 를 disable 하려면 /etc/rc2.d/S74autofs 를 /etc/rc2.d/s74autofs 로 rename 하면

   되고, autofs 을 다른 file system 을 사용하여 configuration 하고 /net 이나 /home directory

   는 autofs 에서 제외 하려면 /etc/auto_master file에서 /net 이나 /home 을 comment out 시키면

   일반적인 file system으로 쓸 수 있다.



  보기  : /etc/auto_master

           # Master map for automounter

           #

            +auto_master

            /net           -hosts         -nosuid

            /home          auto_home

            /xfn           -xfn




21.3 ROOT 패스워드 잊어버렸거나, 중요시스템화일 오류시



(2.x Admin 2장4-19)

* 패스워드 파일에 오류가 있을 때 조치 순서 Single모드로 boot 한다.

1. Solaris 2.x O/S CD-ROM으로 boot한다.

2. 화일 시스템을 mount하여 화일을 수정한다.

3. 화일 시스템을 umount한다.

4. 시스템을 Reboot한다.

      

   ok boot cdrom -s  혹은 boot sd(0,0,0) -s

        :

        :

      INIT: SINGLE USER MODE

     #mount /dev/dsk/cot3d0s0 /mnt

     #TERM=sun          ???? * 중요부분

     #export TERM       ????

     #setenv TERM sun

     #cd /mnt/etc           

     #vi passwd

     #cd /

     #umount /mnt

     #reboot




21.4 FileSystem이 손상된경우(BootBlock 복구)



(1.x Admin 5-147참고)

1. OS installation 테이프나 CD로 부터 MINIUNIX를 로드 하여 시스템을 부팅 하고,



   1) Boot block을 생성한다.

      #mount /dev/sd0a /a

      #cd /usr/mdec

      #installboot /a/boot bootsd /dev/rsd0a

   2) 시스템을 재부팅한다.

      #cd /

      #umount /a

      #fsck /dev/rsd0a

      #[stop]+[a] or sync;sync;halt

      >b

(2.x Admin 22-24참고)




21.5 Inode 가 full인 경우 조치



  # umount /user

  # newfs -i 1024 /dev/rid000h

  # fsck

  # mount /dev/rid000h /user

  # df -i




21.6 System DISK 옮길때


  1) 기존 disk로 부팅

  2) newfs 로 새로운 disk의 파일system 생성

  3) mkdir /a

  4) mount /dev/sd3a /a

  5) dump 0uf - /dev/rsd0a | (cd /a; restore xvf -)

  6) installboot 실행해서 새로운 disk에 boot_block 생성

  7) fstab에 새로운 target_ID로 수정

  8) 새로운 disk로 REBOOT




21.7 ORACLE용 DISK Addon


  ※ format 명령에서 partition 잡고, labelling만 하고,newfs는 하지 않는다.(lowformat상태)

     새로운 ORACLE-partition이 c0t0d0s5 라고 했을때,

     #chown oracle /dev/dsk/c0t0d0s5

     #chgrp dba(?) /dev/dsk/c0t0d0s5

     #chown oracle /dev/rdsk/c0t0d0s5

     #chgrp dba(?) /dev/rdsk/c0t0d0s5

       오너와 그룹을 오라클 용으로 바꾼후 오라클용 파티션으로 생성 시킨다.

    ※ 오라클에서 시스템 REBOOT후 오라클용 파티션의 퍼미션이 바뀌는 경우, 오라클의 STARTUP이

     이루어 지지 않을 경우가 있으므로 주의!

     -----> rc2.d 에 자동으로 퍼미션 변경해주는 파일 포함시켜 해결.




21.8 프린터관련



  ※ Ultra 5,10,30,60 계열 parallel device_name

     /dev/ecpp0




21.9 FrameBuffer관련



  ※ MGX Framebuffer : 현대 Ultima 계열들의 기본 그래픽 Device

     - 컬러수 조정 : /usr/openwin/server/etc/OWconfig를 아래 내용으로 편집후 저장.

                     내용중 depth부분을 기본 8bit로 되어있는데, 이를 24bit로 조정한다.



21.10 Sun H/W 장애 Q&A



Q) 디스크가 기존에 존재했던 타입을 인식하지 못하는데 어떻게 조치해야 하나요?

    즉, format 명령어 사용시 “drive type unknown" 이라고 출력하는데 만약 여기서 파티션 작업을

    하면 기존의 데이터를 잃어버릴 것으로 생각되는데 기존의 데이터를 살릴 수 있는 방법이 무엇

    인지? 파티션 정보를 다시 만들어서 라벨링을 다시 하였을 경우 그냥 newfs 안하고 사용가능

    한지요?

A) 기존의 블록을 정확히 안다면 별 문제 없이 라벨링 가능하다.

   물론 데이터에도 별 영향 없다.

   fsck를 실행시켜서 정확한 에러 부분을 확인하여야 한다.

   fsck를 실행시켜 보면 어떠한 조치를 해야 하는지에 대하여 알수 있다.

   fsck 명령 사용시 script 명령을 사용해서 정확한 내용을 알아둘 것.

   format 명령중에서 partition 명령 중 la 명령을 사용할 때

   “current disk unformatted" 라는 메시지가 나오는데 이런 경우는 기존에 사용했던 내용과

   일치하지 않기 때문인데 이때 /var/adm/message 파일을 참조해서 실행하면 된다.



Q) Network 장애 발생시 check 사항

A) > ifconfig hme0 plumb<enter>

   ---- H/W 적으로 이상이 없을 시에는 아무런 반응이 없음.

   ---- H/W 적으로 이상이 있을 시에는 error code값을 return 함.

   > ifconfig hme0 ipaddress netmask 255.255.255.0 up<enter>

   > ifconfig -a 로 확인



Q) 100BaseT hme0 interface check

A) ndd /dev/hme link_status          0 = link down

                                      1 = link up

   ndd /dev/hme link_speed           0 = 10 Mbit/sec

                                      1 = 100 Mbit/sec

   ndd /dev/hme link_mode            0 = half duplex

                                      1 = full duplex

Q) 시스템 Booting시 갑자기 화면이 오동작(사라졌다가 나타나는등..)하면서,

   화면에 "watchdog reset"

   메시지가 뜨면서 Booting이 이루어지지 않을 때.

A) ok test-memory 해서 메모리의 이상 유무를 확인한다.


Q) TFTP open of file /tftpboot/sgsce.abs

   TFTP open of file /tftpboot/sgsce.abs.Z

   위 두file failed 시

A) dir내에 두file존재유무 확인 없으면 , find / -name "sgs*" -print 로 찾아서

   dir내에 copy 한후, 터미널 재부팅

   ※ sgsce.abs.4.1.1 , sgsme.abs.4.1.1.Z 같은 형태로 시스템에 존재할것임.



Q) PROM MODE에서 부팅진행중 아래 메시지가 뜰 경우

   "Fast Data Access MMU Misc" 메시지 나오면서, 부팅이 안된다.

A) boot block 의 손상일 경우 CD-ROM을 통한 싱글모드 부팅한후 boot block

   복구



Q) E4000 ; CPU Board #2에서 service led가 flash되면서 진행이 멈추는현상

   CPU Board #1을 제거후 다시 Power ON 할 것

A) 원인 ; system이동시 진동에 의한 충격 의심



!) Netra i,j 초기 설치시 유의사항

  - 초기 인스톨시에는 기존 파티션을 지우고 설치 진행한다.

    Netra 가 스스로 파티션 생성하며 설치를 하게 된다.

  - Netra 설치 매뉴얼에 따라 모든 Package들이 설치 되도록 한다.

    setup으로 login후 S/W설치시 Cluster,Package,Patch... 모두설치.

  - ATM(FORE Sbus 카드)사용시 모든 Package가 인스톨 안되면 문제 될 수 있음.

    ATM카드의 S/W인스톨시 진행이 안되고 Killd 메시지 뿌리면서 중단되는 현상



!) Netra j에서의 한글문제



   * 네트라 j모델은 기본적으로 한글화가 되지 않았기 때문에 한글을 사용키 위해서는

     한글 관련 Package를 추가 설치 해야 된다.



   한글Package설치 방법.

   1) 한글 솔리리스 OS Media를 CD드라이브에 넣고 마운트 한다.

      이때 설치하려는 Netra OS 와 동일한 Version 이어야한다.

   2) #cd cdrom; cd ko_*; cd s0

      #pkgadd -d .

   3) Package 중에서 20개 ALE를 add 한다.

      ALE_number : 14,15,16,68,73,74,75,76,77,78,79,80,81,82,83,89,90,91,92,93

   4) System reboot !




21.11 Application 관련 ERROR



!) 컴파일러 설치후 HOST_NAME이 바뀌었을 경우

   아래 파일들을 확인 및 새 HOST_NAME으로 조정 해줄 것

   /etc/opt/licenses/licenses_combined    

   /etc/opt/licenses/LIC_CONFIG_SCRIPT

   /opt/SUNWspro/license_dir/sunpro.lic,1

   호스트 네임을 조정후 LIC_CONFIG_SCRIPT 다시 실행하고,

   #ps -ef|grep lmgrd 데몬 확인후

   #source /.cshrc 하고, test 해볼 것


!) OPENWIN에서 한글 입력서버 안뜰 경우

   /.openwin.init file을 삭제후 openwin을 실행

   /.openwin.init file의 내용중

   * "toolwait /usr/openwin/bin/htt -root-geom 410x32+734+860"

     부분이 없기 때문에 입력서버가 안나타남.



!) 컴파일러ERROR

   * Host-name이 바뀌었을경우

     /etc/opt/licenses/licenses_combined

     /opt/SUNWspro/license_dir/sunpro.lic.1

     위 두 파일에서 host_name이 틀리면 컴파일러 실행시 license error가 발생한다.

     호스트 네임 변경시 이 파일을 고쳐줘야 한다.

  * 컴파일시 ERROR

    - License Error : Cannot connect to the license server(vines)..

            for product(SPARCompiler C).

            (License server may not have been started)

       Cannot connect to license server(-15,12:146)Connection refused

       cc:acomp failed for test.c

  

    - /tmp/license_log 파일이 아래 메시지 뿌리면서 lmgrd 가 잘 가동 안될 때

      12:12:56(lmgrd)FLEXlm(v4.1)started on vines(Sun)(7/19/97)

      12:12:56(lmgrd)FLEXlm Copyright 1988-1994, Globetrotter Software,Inc.

      12:12:56(lmgrd)License file: "/etc/opt/licenses/licenses_combines"

      12:12:56(lmgrd)Starting vendor daemons ...

      12:12:56(lmgrd)Started suntechd

      12:12:56(suntechd)Not logging IN messages

      12:12:56(suntechd)Not logging OUT messages

      12:12:56(suntechd)Not logging QUEUED messages

      12:12:56(suntechd)FEATURE sunpro.c LICENSE LINGER set to 300 seconds

      12:12:56(suntechd)FEATURE sunpro.sparcworks.tools INACTIVITY TIMEOUT set to

         3600 seconds

      12:12:56(suntechd)FEATURE sunpro.common INACTIVITY TIMEOUT set to 3600 seconds

      12:12:56(suntechd)Vendor daemon can't talk to lmgrd(Cannot read data from

         license server(-16,15:9) Bad file number)

      12:12:56(lmgrd)Vendor daemon died with status 240

      12:12:56(lmgrd)Since this is an unknown status,lmgrd will

      12:12:56(lmgrd)attempt to re-start the vendor daemon.

      12:12:56(lmgrd)REStarted suntechd(internet tcp_port 32920 pid 928)

               :

               :

               :

      위의 내용을 만들면서 lmgrd가 start가 안되는 경우

    - /etc/rc2.d/S85lmgrd 내용중 맨윗줄에 아래 내용을 삽입한다.

      "ulimit -n -1024"

    - lmgrd서버를 다운 시킨다.

      /etc/opt/License/lmdown -c license_combined -q

    - /tmp/license_log & license_error 두파일 삭제후 재 가동.

    - 원인 : license server가 열려는 port갯수가 모자란다.



!) Exeed

   * Exeed 실행이 안될 때 확인 사항.

     - 사용자 홈디렉토리의 ~/.cshrc 파일에서 xdm 실행파일이 있는 DIR이 PATH에 등록되어

       있는지 확인(일반사용자가 Exeed사용시 PATH문제로 실행이 안되는 경우가 있다.)



!) Netscape

   * Solaris 2.x 에서 Netscape 운용시 Library 관련 파일문제로 error 화면 발생시

     .cshrc 파일의 setenv LANG ko 에서 ko 대신 “C” 로 대체



!) Sendmail queuename : Cannot create~error

    - Sendmail을 다시 install 한 후에 메일을 보낸후 다음과 같은 에러가 생겼다.

      queuename : Cannot create "qfRAA07462" in "/var/spool/mqueue" (euid=115):Permission denied

      이 경우 다시 테스트 해보니 Super User의 권한으로 메일이 가고, 일반사용자의 메일 전송시

      위와 같은 에러가 생김을 알 수 있었다.

      ;  /usr/lib/sendmail의 mode를 맞추어 준다.

          에러가 생길 당시의 mode는 751이었는데, 정상적인 sendmail의 mode는 4551이다.

          따라서, 다음과 같은 명령어로 sendmail의 mode를 Change 시킨후에 sendmail daemon을

          다시 시작 하면 sendmail이 잘 실행된다.



          #chmod 4551 /usr/lib/sendmail

          #ls /usr/lib/sendmail

          -r-sr-x--x     1     root     sys     295544 12월 8일 08:49     sendmail *




21.12 MOD에서 media를 인식못할때



특별한 문제가 없는걸로 판단되는데, 인식이 안되면

media의 SECTOR당 BYTE수를 확인하라.

  Solaris File System : 512bytes/sector

  이보다 크다면, 인식 못할 것이다.




21.13 rm command로 지워지지않는 file 지우는 방법



. su root             /* 먼저 Super mode로 들어간다. */

. ls -li filename     /* indode number를 확인한다. */

  82 -rw-r--r-- 1 kumars       0 Jun 26 09:13 filename

. df .                /* 현재 filesystem의 device file을 확인한다. */

  /home  (/dev/dsk/c0t3d0s7 ): 104682 블럭  236066 파일

                                         /* Solaris 2.x 예. */

. clri /dev/dsk/c0t3d0s7 82             /* inode를 지운다. */

. Reboot if it's on root or else:

  A. sync ; sync ; sync

  B. kill -i5 1 or shutdown now         /* for single user */

  C. umount filesystem

  D. fsck -y /dev/xxxxx -y

  E. ^D to multiuser

. fsck                /* fsck를 하는동안 remove할것인지를 물으면 "y"로 답한다. */






22장. 네트웍관련 테크닉(&Tip)




22.1 Tuning the system for a web server



System 의 netscape server 를 tuning 한다는 것은 특별히 시스템이 non web 관련된 작업에 사용될 경우에 critical 할 수가 있다.

다음은 Sun system 에서의 web server 를 구축시에 고려해야할 것들이다.



Example of Common settings for Web servers:



/usr/sbin/ndd -set /dev/tcp tcp_rexmit_interval_max 10000

/usr/sbin/ndd -set /dev/tcp tcp_ip_abort_interval 60000

/usr/sbin/ndd -set /dev/tcp tcp_close_wait_intercal 60000

/usr/sbin/ndd -set /dev/tcp tcp_keepalive_intercal 300000



/usr/sbin/ndd -set /dev/tcp tcp_conn_req_max 128

*reboot system, or restart httpd.




22.2 Linux Network setup



- 커널 모듈을 올릴 때

# modprobe de4x5



- 자동화를 위한 설정 파일 conf.modules ( /etc/conf.modules)

alias   eth0    de4x5

alias   eth1    de4x5



- 네트웍 인터페이스에 주소 붙이기

# ifconfig eth0 xxx.xxx.xxx.xxx(시스템 IP 주소)



- 네트웍 인터페이스 확인하기

# ifconfig eth0



- 네트웍 인터페이스 죽이기

# ifconfig eth0 down



- 라우팅 테이블 만들기

# route add -net xxx.xxx.xxx.0 eth0 또는

# route add -net xxx.xxx.xxx.0



- 라우팅 테이블 지우기

# route del -net xxx.xxx.xxx.0



- 게이트웨이 입력하기

# route add default gw xxx.xxx.xxx.xxx(게이트웨이 IP 주소)




22.3 Snoop



패킷을 모니터링 하기 위한 유틸리티 이며, 아래는 사용방법 이다.

   # snoop -o /tmp/packet_file

          ; packets capture, packet_file 로 저장된다.

   # snoop -i /tmp/packet_file

          ; read packets, 저장된 packet_file을 볼 때 사용.

   # snoop broadcast packets

          ; examine broadcast packets.

   # snoop -v broadcast

          ; print verbose broadcast packet header information

   # snoop -v arp

          ; print verbose ARP packet header information.

   -s 120 ; 패킷 헤더부분 120 byte만 잡을 때

   -c 100 ; 100개의 패킷만 잡을 때




22.4 Address Resolution Protocol(ARP)



ARP is the process that builds an address link between the Internet(IP) and

network interface/hardware layer(Ethernet) layers. It is used by a host to prepare

a unit of information for network transmission.


#arp -a

- examine all entries in the ARP table.

#arp hostname

- examine a specific ARP table entry.

#arp -s hostname ether_address

- Add apermanent ARP table entry.

#arp -s hostname ether_address temp

- Add a temporary ARP table entry.

  This entry will expire after 20 min.

#arp -s hostname ether_address pub

- Add published ARP table entry.


Troubleshooting the in.rarpd Server

- If a diskless client refuses to boot, use the following system startup script to restart

  any missing processes.

#/etc/init.d/nfs.server start




22.5 ifconfig



#ifconfig -a

- examin the status of all network interface.

#ifconfig interface

where interface is the name le[0-9], ie[0-9], etc.

#ifconfig -a

lo0: flags=849<UP, LOOPBACK, RUNNING, MULTICAST> mtu 8232

      inet 127.0.0.1 netmask ff000000

le0: flags=863<UP, BROADCAST, NOTRAILERS, RUNNING, MULTICAST> mtu 1500

      inet 129.150.182.5 netmask ffffff00 broadcast 129.150.182.255

      ether 8:0:20:b:18:0

* The fields are:

- Interface name

        - Loopback interface (lo0)

         The loopback is used for testing purpose and whenever a host needs to

        send packet to itself.

        - Other interface names may be le[0-9] or io[0-9].

- Flags

      - UP   : This flag indicates that the interface is marked "up" and will send and

                  receive packets through the interface.

      - DOWN (not shown)

              : Conversely, the interface may be marked "down." When an interface

                  is marked "down," the interface will not pass or forward packet to the host.

      - NOTRAILERS

              : This flag indicates no support for non-standard encapsulation of IP packets

                  on certain link levels.

      - RUNNING

              : The flag means the interface is recognized by the host.

      - MULTICAST

              : This flag indicates the interface supports a multicast address.

      - BROADCAST

                : This flag indicates that the interface supports a broadcast address.

- Maximum transfer unit (MTU)

      For example, mtu 8232, and mtu 1500. The MTU determines packet fragmentation at the

        network layer.

- Internet address

      For example, inet 129.150.182.5. The internet address is used to respond to and

        create ARP queries.

- Netmask

      For example, netmask ffffff00. The netmask is applied to incoming and outgoing packets

        at the network layer.

- Broadcast address

      For example, broadcast 129.150.182.255. The broadcast address is used to send messages

        to all hosts.

- Ethernet address

      For example, and ether 8:0:20:b:18:0. The Ethernet address is used to respond to and

      create ARP queries.


22.6 The startup script results in the following



#/usr/sbin/in.routed [-gqsStv] [logfile]

- in.routed is invoked at boot time by the /etc/init.d/inetinit script. It is used to

  update routing tables. On routers, by default, it broadcasts the routes every 30 second.

#in.routed -q                         

        To start in.routed in quiet mode with the -q option to keep from broadcasting.

      (router가 아닌 경우)

#in.routed -s

      To make an non-router broadcast as if it were a router

      Software적으로 router기능을 setting하고자 하는 경우.

#in.routed -v /var/adm/routelog

      To log the actions of in.routed



- Routers start

      - in.routed -s

      - in.rdisc -r

/etc/init.d/inetsvc

This script initializes the multicast route for address 244.0.0.0. The script executes

the command

route to add a path to this destination. The route command is covered later in this lesson.


#netstat -r                 ; 현재 routing table을 보여준다.

Routing Table :

Destination   Gateway Flags  Ref    Use    Interface

---------   ---------     -----  ----   ------------

localhost     local host      UH     0      2272   lo0

192.9.50.1.0 chesapeake    U      3      562    le0

195.200.200.0 yogi-r          UG     10     1562   le0

193.253.253.0 potato-r UG     3      562    le0

224.0.0.0    chesapeake    U      3      0      le0


The fields are :

Destination   The destinaton network or host. This field refercences the file

/etc/inet/networks or /etc/inet/hosts.

Gateway      The host that delivers or forwards the packet.

Flags        The status of this route. This field uses the following flags :

              U      The interface up.

              H      The destination is a host not a network.

              G      The delivery host is another host(an indirect path).

              D      The path is an ICMP redirect entry.

Ref          The reference count indicating the current number of active uses of the route.

Use          The number of packets sent using this route. For the localhost entry it is the

                number of packets received.

Interface     The interface used to that destination.



22.7 The route Command



The route command allows manual manipulation of the routing table.

# route [-fn] add|delete [host|net] destination [gateway[metric]]

# route add net 195.200.200.0 yogi-r 1      To add a route

# route add net Marketing yogi-r 1          To add a route suing a network name

# route delete net 195.200.200.0 yogi-r      To delete net 195.200.200.0 yogi-r

# route -r                                   To flush the routing table

# route add 224.0.0.0 `uname -n` 0          Add the multicast path for 224.0.0.0

# netstat -r 했을 때



Routing Table:

   Destination         Gateway         Flags Ref  Use   Interface

-----------------------------------------------------------------------

localhost             localhost               UH     0   139   lo0

203.252.9.25         sun.dct.co.kr           UH     4   635   sl0

129.254.10.0        sun.dct.co.kr           U      2    43   le0

default               203.252.9.25          UG     0   635   


위에서 default 부분이 없으면, 밑처럼 route add 해준다.

“route add default 203.252.9.25 1”




22.8 Router Configuration



1. Edit the file /etc/hostname.le1(this is assuming device le1) and add a single line entry

   with the host name on this interface.

      hostname-for-le1

2. Edit the file /etc/inet/hosts and add the new IP address and host name.

      IP-address     hostname-for-le1

3. Perform a reconfigure boot and halt the system to add the second Ethernet card

      #halt

      ok boot -r

4. After the system reboots, verify the new interface parameters.

        #ifconfig -a



in.named daemon is started on the server in the system startup script /etc/init.d/inetsvc.

This daemon is started only if the in.named configuration file exists.




22.9 2'nd ethenet설치



 * 카드 설치시 변경 및 등록해주어야 할 File

      /etc/hostname.le1 새로 생성된 화일 편집해서 리부팅

      /etc/hosts

      /etc/networks

      /etc/netmasks


  1. Vi로 hostname.le1 화일에 2nd Ethenet Card 의 이름을 등록해 준다.

  

  2. 위에서 등록시킨 이름 및 IP_Addr 를 호스트 파일에 추가시켜 준다.


  3. networks, netmasks 파일에 추가시켜 준다.


  4. #kill -1 1

     #ping 등록명

      등록명 is alive.

    

     #ifconfig -a : le0, le1 확인.


* 4.1.3에서 onboard 상의 le0를 DOWN하고, le1을 기본으로 구성할 때.

    1) /etc/hosts, hostname.le0~? 요구파일 생성 or 편집

    2) 기존 le0는 #ifconfig le0 down 하고, 아래와 같이 추가되는 port 셋팅.

       ifconfig le1 . . . . broadcast . . .

    3) /etc/rc.boot 파일의 hostname.* 으로 test 하는 부분을 hostname.le1으로

      고정하면, system booting 시에 le1만 Check 한다.




22.10 4.1.3 DNS setup Client



1. vi /etc/resolv.conf

   DOMAIN kaeri.re.kr

   nameserver 134.75.97.26 (nanum system IP address 등록)

2. mkdir /var/yp

3. cp /usr/lib/nis.Makefile /var/yp/Makefile

        or

   (CD에서 Makefile 생성)

      mkdir /var/yp

      cd /tmp

      /usr/etc/install/extract_files sr0 root -f ./var/yp/Makefile

      mv ./var/yp/Makefile /var/yp

4. vi /var/yp/Makefile

   #B=-b  #을 제거

   B=     #을 삽입

5. vi /etc/rc.local

   ypxrd line # 삭제

6. /usr/etc/yp/ypinit -m




22.11 SLIP



* slip 띄울때.

        #cd /etc/rc2.d

        #ls *slip 찾아서 아래file이 있으면,

        #sh -x /S69slip  이라고 typying

        #ifconfig -a  로 sl0가 떴는지 확인




22.12 SUN ATM 설치시



/etc/atmconfig   ??

/etc/laneconfig   ? 편집, 초기설치시 예제 참조

/etc/aarconfig(?) ??

* IPV값을 Switch 와 같게 ...




22.13 IP Aliasing



① hosts file edit

  1.1.1.7  dct.dct.co.kr   dct loghost → 기존

  1.1.1.8  dct1.dct.co.kr  dct1??     

  1.1.1.9  dct2.dct.co.kr  dct2?? 추가 IP

② hostname.le0

   hostname.le0:1 → dct1

   hostname.le0:2 → dct2

③ ifcomfig le0:1 inet 1.1.1.8 netmask 0xffffff00 broadcast 1.1.1.255

   ifconfig le0:1 ap

    * le0:2 도 마찬가지로 해줌.

④ Reboot(option)

   boot 하면서 Interface 에 le0, le0:1, le0:2 가 보인다.

   웹 호스팅은 → IP Aliasing 후에 Apache 웹서버 설치후 http.conf 편집하면 Virtual host 등록

   부분이 있다.


DNS 등록 → Aliase 된 IP 에 대하여 DNS Server에서 웹호스팅에 필요한 Domain을 등록한다.




22.14 Static-Routing example



MEANING OF THIS MEMO:

"제 1회 연구 전산망 워크샵/튜토리얼 자료집" p229를 재구성함.

복잡한 network에서의 실제 static route를 잡는 예제로 유용할 것임.



순서: Network 구성도 , "werner"의 static routing , "larry"의 static routing



0. Network 구성도



                                     Hill-subnet

    |--------------------------------| 128.20.6

         |①       |②        |③               +-------+ +-------+

    +--------+ +--------+ +-------+             | ceo | | cfo |

    | Hill  | | senate | | house |             +-------+ +-------+

    | router | +--------+ +-------+                 |②       |③

    +--------+                        |------------------------------| 128.20.5

         |                                  |①               Directors-subnet

    +--------+                        +-----------+

    | DC    | +--------+            | Directors |

    | router | | netman |            | router   |

    +--------+ +--------+            +-----------+

         |⑥       |①                     |⑤                                Backbone

  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ 128.20.1

                                 |③                       |②         |⑦

                           +-----------+              +--------+   le1 |

    +-------+ +-------+  | Marketing |              | R & D |   +--------+

    | moe | | larry |  | router   |              | router |   | werner |

    +-------+ +-------+  +-----------+              +--------+   +--------+

        |③        |②         |①                       |①     le0 |②

    |-----------------------------------| 128.20.3    |--------------------------| 128.20.2

        |                        Marketing-subnet             |④         |③   R&D-subnet

    +--------+                                             +--------+ +---------+

    |////|                                             | wilbur | | orville |

    | Bridge |      +-------+                             +--------+ +---------+

    |////|      | curly |

    +--------+      +-------+

        |              | ②

    |---------------------------| 128.20.4

                    Marketing Annex subnet



1. "werner"의 static routing



 (1) route add

              ┬         ┬ Basic   ┬ route add 127.0.0.1 127.0.0.1 (lo0를 잡음)

              │ Simple │ routing │ route add 128.20.2  127.20.2.2 (le0를 잡음)

              │ routing │          ┴ route add 128.20.1  127.20.1.7 (le1을 잡음)

              │         │

     Full    │         ┴              route add default   128.20.2.1 1 (le0를 잡음)

     routing │

              │                          route add 128.20.3.0 128.20.1.3 1 (le1을 잡음)

              │                          route add 128.20.4.0 128.20.1.3 1 (le1을 잡음)

              │                          route add 128.20.5.0 128.20.1.5 1 (le1을 잡음)

              ┴                          route add 128.20.6.0 128.20.1.6 1 (le1을 잡음)

  (2) routing table

      % netstat -nr

       Destination      Gateway       Flags Refcnt Use    Interface

        127.0.0.1        127.0.0.1     UH    3      0      lo0

        128.20.2         128.20.2.2    U     4      95778  le0

        default          128.20.2.1    UG    0      0      le0

        128.20.1         128.20.1.7    U     4      95778  le1

        128.20.3         128.20.1.3    UG    0      0      le1

        128.20.4         128.20.1.3    UG    0      0      le1

        128.20.5         128.20.1.5    UG    0      0      le1

        128.20.6         128.20.1.6    UG    0      0      le1



2. "larry"의 static routing

   route add default    128.20.3.1

   route add 128.20.4.0 larry 0 (Bridge를 다루기 위한 routing)




22.15 C-class netmask 방법



203.240.159.X을 8개 정도의 network으로 subneting할 경우



참고) 16개는 256/16=16  netmask number는 240 (256-16) 즉, 255.255.255.240

       8개는 256/8=32   netmask number는 224 (256-32) 즉, 255.255.255.224

       4개는 256/4=64   netmask number는 192 (256-64) 즉, 255.255.255.192

       2개는 256/2=128  netmask number는 128 (256-128) 즉, 255.255.255.128

       1개는 256/1=256  netmask number는 0  (256-256) 즉, 255.255.255.0



     8개의 subnet인 경우

                   0 -----------31

                   32-----------63

                   64-----------95

                   96----------127

                   128---------159

                   160---------191

                   192---------223

                   224---------255

                    |          |

              loopback NO   broadcast NO



mymy# ifconfig -a

lo0: flags=849 mtu 8232

      inet 127.0.0.1 netmask ff000000

le0: flags=863 mtu 1500

      inet 203.240.159.36 netmask ffffffe0 broadcast 203.240.159.63

                                         |                       |

                               netmask가 224이기때문    host NO에 따라 변함

                                                        (36은 32-63사이에 있음)




22.16 NDD를 이용한 Tuning변수(Solaris2.x)



. 대부분의 TCP, IP, UDP와 ARP tuning은 ndd 명령을 이용한다.

해당 Driver들에 대한 적절한 변수의 열람을 보려면 다음예와 같다.

% ndd /dev/arp \?

% ndd /dev/ip \?

% ndd /dev/tcp \?

% ndd /dev/udp \?



. 실제 변수를 Setting하기 위해선 다음예와 같다.

% ndd -set /dev/ip ip_forwarding 0



. 만약 당신이 매번 Booting시 Setting하기를 원한다면

% cat /etc/rc2.d/S69inet

...

#

# Set configurable parameters.

#

ndd -set /dev/tcp tcp_old_urp_interpretation 1



. 많은 변수들은 다음 2개의 Option을 갖음 : 1 (True) and 0 (False).

 # ndd device variable



I.e.:

# ndd /dev/ip ip_debug

0



. 다음은 변수들의 목록과 설명을 기술하였다.



IP Variables

------------

ip_def_ttl

Determines the default Time To Live value for standard IP packets.

The default value is 255.



ip_forwarding

Determines if the workstation will route packets. This variable can be

one of three selections:

  0    Never forward

  1    Always forward

  2    Only forward when two or more interfaces are up

The default value is 2.



ip_send_redirects

Determines whether the host should send ICMP redirects when it routes

packets. The default value is 1 (True).



TCP Variables

-------------

tcp_close_wait_interval

Despite the misleading name, this variable actually sets the time

wait interval (the 2MSL value). The default value is 240000 ms (4 minutes).



tcp_ip_ttl

Determines the default Time To Live for TCP/IP packets. The default

value is 255.



tcp_keepalive_interval

Determines how frequently to test if an idle connection is still

alive. The default value is 7200000 ms (2 hours).



tcp_mss_def

Determines the Maximum Segment Size for nonlocal packets (i.e.,

packets to be sent to different networks or subnets). The default

value is 536 bytes.



tcp_recv_hiwat

Determines the maximum value of the TCP receive window. The default

value is 8192 (8k).



tcp_smallest_anon_port

Determines the smallest TCP port number that may be used for an

anonymous connection. The default value is 32768.



tcp_xmit_hiwat

Determines the maximum value of the TCP transmit window. The default

value is 8192 (8k).



tcp_xmit_lowat

Determines the minimum value of the TCP transmit window. The default

value is 2048 (2k).



UDP Variables

-------------

udp_def_ttl   

Determines the default Time To Live for UDP packets. The default

value is 255.



udp_do_checksum

Determines whether checksums should be done for UDP packets. The

default value is 1 (True).



udp_recv_hiwat

Determines the maximum value of the UDP receive window. The default

value is 8192 (8k).



udp_smallest_anon_port

Determines the smallest UDP port number that may be used for an

anonymous connection. The default value is 32768.



udp_xmit_hiwat

Determines the maximum value of the UDP transmit window. The default

value is 8192 (8k).



udp_xmit_lowat

Determines the minimum value of the UDP transmit window. The default

value is 1024 (1k).




22.17 IP forwarding을 disable(solaris2.x)



DETAIL DESCRIPTION:

ndd parameter중 ip_forwarding에 대해서 이해하여라.



Solaris 2.4 system에서 2개의 network card가 있다고 하자,

하나는 ethernet이고 다른 하나는 fddi card라고 하자. 2개의 network간에

ip forwarding을 disable하기를 원한다.



ndd parameter중 ip_forwarding의 값을 알아보자, ndd /dev/ip ip_forwarding를

수행하면 값이 나온다.



다음은 Solaris Machine을 Router로 작동안되게 하는지를 기술하였다.

------------------------------------------------------------------

. Solaris 2.4 이하 version의 경우

당신의 장비를 multiple-interface machine로 Router로 운용하고 싶지 않다면

/etc/init.d/inetinit을 수정할 필요가 있다. 다음 두 line을 찾아 보아라.

numifs=`ifconfig -au | grep inet | wc -l`

numptptifs=`ifconfig -au | grep inet | egrep -e '-->' | wc -l`

그리고 다음 line에 다음과 같이 추가하라.

numifs=2

numptptifs=0

Reboot하라. 그러면 다음부턴 Packet을 route하지 않을 것이다.



. Solaris 2.5 이상 version의 경우

한결 더 간단하다. 다음과 같이 한다음 reboot 하라.

% touch /etc/notrouter



. 이상은 2개 이상의 Network card가 있는 Solaris 2.4, Solaris 2.5 에서

각각 Packet을 route하지 않는 장비로 settig 하는법을 기술하였다.

실제로 이상에서 기술하였던 방법은 rc script에서 예를들면 다음과 같은

예를 수행하기 위한 것이다.

ndd -set /dev/ip ip_forwarding 0

ip_forwarding의 setting 값을 알아보자.

0       Never Forward

1       Always Forward

2       Only forward when two or more interfaces are up



결과적으로 위의 예에서 묘사한 내용은 ip_forwarding의 값을 1에서 0으로

바꿈으로서 routing을 억제하는 것이다.




22.18 Routing 환경



1. 공통 Routing 환경

Routing과 Routing Protocol사이엔 차이점이 있다. 모든 File System이 Data를 Route 하지만 모든 시스템이 Routing Protocols를 수행하지는 않는다.

Routing이란 Routing Table에 내포된 정보에 기초하여 Datagrams를 Forwording 하는 것이다.

Routing Protocols는 Routing Tables를 만들때 사용되어지는 정보를 교환하는 Programs를 말한다.



Minimal Routing - 모든 다른 TCP/IP Network으로 부터 완전히 고립된 Network만이

                 Minimal Routing Table은 Network Interface가 구성될때"ifconfig"

                 에 의해만들어진다.만약 Network이 다른 TCP/IP Network와 직접

                 직접적인 접근을 하지않고 Subnetting을 사용하지 않는다면 이

                 Minimal Routing Table만이 유일하게 필요하지만 이같은 고립된

                 Network은 Unix환경에서 생각보다 드물다.



Static Routing - 다른 TCP/IP Network과 제한된숫자의 Gateway를 가지는 Network

                 은 Static Routing 으로 구성할수 있다. 이Static Routing 은

                 "route" 명령어를 사용하여 Manually하게 구성된다. Static

                 Routing Table은 Network변경에 대하여 적응되지 않으므로 Route

                 가 바뀌지않는 곳에 사용되어 야한다.

                 그러나 원격 목적지가 오직 하나의 Route로만 닿을수 있을때

                 Static Route가 가장좋은 선택이다.



Dynamic Routeing - 같은 목적지에 하나 이상의 Route가 가능할때 Dynamic Routing

                  을 사용해야 할것이다.

                  Dynamic Routing Table은 Route Protocol에 의해 바뀌어진 정보

                  로 부터 만들어진다. 이 Protocol들은 바뀌는 Network상태를 반

                  영하여 Route를 동적으로 적응시킬수 있는 정보를 분배하기 위해

                  설계되어 있다. Routeing Protocol복잡한 Routing 상황에 시스템

                  관리자 가 할수 있는것보다 정확하고 빠르게 다룰수 있으며

                  Primary Route 가 동작하지 않을 경우의 Back-up Route로의 교체

                  뿐만아니라 목적지로의 최선의 Route를 결정할수 있도록 설계되

                  어있다. 같은 목적지에 대하여 다중의 Path가 있는 어떠한

                  Network에서도 Routing Protocol이 사용되어진다.



Route는 ifconfig, route 명령어에 의한 수작업, Routing Protocol에 의한 동적Routing 중의 어떤

방법을 사용하더라도 Route가 들어가면 모두 Routing Table이 됨.



2. Minimal Routing Table

----------------------------------------------------------------------------

| % netstat -rn                                                            |

| Routing tables                                                           |

| Destination          Gateway         Flags          Refcnt    Use      |

| Interface                                                                |

| 127.0.0.1           127.0.0.1      UH             1           132  lo0 |

| 128.66.12.0         128.66.12.2    U              26         49041 le0 |

----------------------------------------------------------------------------

"ifconfig"에 의해 구성된 Routing Table의 첫번째의 Entry는 lo0가 바치될때 만들어 진 localhost

대한 loopback route이다.

또다른 network 128.66.12.0에 대한 route는 le0 interface를 통한다. 128.66.12.2 는 원격 gateway

address가 아니고 system의 le0 interface에 할당된 주소이다.

두개의 entry 모두 "U" (UP)라는 flag를 가진다. 이것은 사용할수 있는 준비가 되어 있다는 것이다.

또한 entry 모두 flag에 "G"(gateway) flag 가없는데 "G" flag는 remote gateway 를 사용하는 것을

의미한다. "G" flag가 없는것은 외부 gateway를 통하지않고 local interface 를 통한 직접적인

route를 의미한다.



loopback route는 "H" (host)flag set도 가지고 있다. 이것은 이 route를 통해서 오직 하나의 host

에만 도달할수 있다는 것을 의미한다. loopback entry의 destination field를 보면 network 주소

가 아닌 것을 알수있다. loopback의 network주소는 127.0.0.0이며, 127.0.0.1은 개별적 host인 모든

host table에는 특별한 host route 가 있다. 비록 모든 host table이 이러한 host-specific route를

가진다해도 대부분의 route는 network을 route한다. 이것은 routing table의 size를 줄이는데

한 이유가 있다.



위의 sample table을 보면 오직 하나의 network route 128.66.12.0만이 존재 하므로 해당 시스템은

128.66.12.0 network상의 host들 에게만 통신할스 있다. 이러한 제한된 routing table은 "ping"

명령어로 쉽게 검증할수 있다.

"ping"은 ICMP를 이용하여 Echo message를 remote host로 강제적으로 보내고 local host 사이의

통신이 성공임을 나타낸다.



3. Building a Static Routing Table

외부 gateway를 통해 remote host로 도달하려면 routing table에 route가 반드시 더 해져야 한다.

"route" 명령어는 routing table에 entry를 수동으로 더하거나 삭제 할 수 있다.

----------------------------------------------

| #route add 26.0.0.0 128.66.12.1.1         |

| add net 26.0.0.0 : gateway almond         |

----------------------------------------------

cf) #route add destination gateway metric

destination address는 IP address, /etc/networks file의 network name 또한

/etc/hosts file의 host name, 그리고 "default" 로 명시된다.

대부분의 route가 startup 이전에 추가되므로 IP address가 name보다 많이 사용한다.

name service가 없다는 가정하에 routing configuration에 필요한 file은 더이상없다

항상 4byte numeric IP address를 사용하며 4byte보다 작으면 "route"가 address를

확장시킨다. 이결과 우리의 의도와 틀릴수 있다.

"26"이라고 주어질경우 어떤 "route"의 구현은 26.0.0.0 이라 확장하며 어떤것은

0.0.0.26 이라 할수 있다. "default"가 destination address에 쓰이면 route는

default route를 만듬. default route에 연관된 network address는 0.0.0.0 이며

default route는 destination으로 명시된 route가 없을경우에 항상 사용된다.

그리고 이것이 우리에게 필요한 유일의 route를 가질수 있다.

만약 network이 하나의 gateway 만을 가진다면 default route를 사용하여 해당

gateway 를 통하여 remote network을 향한 모든 traffic을 직접적으로 route한다.



route 명령어의 다음 field는 gateway address이다. 이것은 목적지 address로 보내는 data들이

경유할 external gateway의 address이다.

이것은 반드시 직접적으로 network에 연결된 gateway의 address이어야 한다.



route의 마지막 argument는 routing metric이다. 이것은 route를 delete할때는 사용 되지않으며

added될때는 항상 필요하다. 만약 route가 local interface를 통하여 G flag가 setting 되어있지

않으면 metric 이 0 이 되며 metric value가 0 보다 크고 G flag가 setting 되어 route가 설치되어

있으면 해당 gateway address는 external gateway 로 여겨진다. static routing에서 metric의 쓰임은

다른용도는 없으며 다양한 metric value 의 사용은 dynamic routing에서만 필요하다.




22.19 Auto FTP login



- man netrc 참조.

- www 에서 sun 으로 auto ftp setup

1)sun 시스템에 lsh 라는 account 가 lsh0708 이라는 password 로 계정을 가지고 있다.

2) www 의 자기의 home directory 밑에 .netrc 를 chmod 600 으로 작성

ex)more /home/lsh/.netrc

machine sun login lsh password lsh0708

3) www% ftp sun

Connected to sun.

220 sun FTP server (UNIX(r) System V Release 4.0) ready.

331 Password required for lsh.

230 User lsh logged in.

ftp> quit

23장. 시스템관련 테크닉(&Tip)




23.1 Large dummy file 생성 방법



dd를 이용한 Create large files

Systax :

dd if=file of=file bs=n count=n

examples : 아래의 예는 100Mbyte의 dummy file을 만든다.

  [dct:/tmp]# dd if=/dev/zero of=100megs bs=10000 count=10000

  10000+0 records in

  10000+0 records out

  [dct:/tmp]# ls -al 100megs

  -rw-r--r--  1 root    other   100000000 10월 20일 17:34 100megs

  [sun:/tmp]#

  ; bs - 버퍼에 확보될 block size

    count - bs에서 설정된 size의 buffer를 dummy file로 copy할 횟수

    위의 예는 10000block을 10000번 copy하여 100Mbyte의 bummy file을 생성한다.




23.2 DOS file에서 ^M 문자 제거 방법



아래 예는 간혹 DOS에서 편집된 텍스트 파일을 유닉스 machine에서 열 경우 각 line 끝에 ^M를 볼수 있는데, 이를 제거할수 있는 방법 3가지를 보여준다

1) tr을 이용한 제거 방법

  Syntax : tr -d string < infile > outfile

  dct# tr -d "\015" < /tmp/hosts.dos > /tmp/hosts.unix

2) sed을 이용한 제거 방법

  Syntax : sed 's/[regular expression]/[Replacement]/[flags]/g' infile > outfile

  dct# sed 's/^V^M//g' /tmp/hosts.dos > /tmp/hosts.unix

3) vi 편집기를 이용한 방법

  dct# vi /tmp/hosts.dos  열리면, vi command line상에서 아래와 같이 한다.

  :%s/^V^M//g




23.3 두 개의 모니터에 Openwindows 올릴때



openwin -dev /dev/fbb/?? -dev /dev/fbb/??  

또는 ?? openwin -dev /dev/fbb/??

     ?? openwin -dev /dev/fbb/??




23.4 rdist사용하여 정해진 시간에 화일 transfer



rdist - remote file distribution program

rdist 명령어를 사용하기 위해서는 /etc/hosts.equiv file과 /.rhosts file을 원하는 host와 사용자에 맞게 editing하여 주어야 한다.

remote file transfer를 위해서는 각각의 시스템에 /etc/hosts.equiv file을 만들어 각각의 시스템을 명명하여 주거나, +라고 써주어 모든 시스템에서 수행하는 r명령어 (rcp, rsh, rlogin, rdist...)에 대해 open을 시켜주어야 한다.

또는 각각의 사용자 홈디렉토리에 .rhosts file을 만들어야 한다.



rdist에는 여러가지 option이 있다.

이러한 option들은 "man rdist"를 수행하면 살펴볼수 있는데, 정해진 시간에 파일을 전송하면서

세부적인 사항을 미리 선택하기 위해서는 '-f' option을 사용하는 것이 좋다.



여기에서는 실제로 rdist command를 사용하여 file transfer하는 예를 보기로 하겠다.



source host     = TECH

destination host = sun



1. 먼저 TECH의 /etc/hosts.equiv file을 편집.

        www

        cello   

        mymy

        sun      (여기에서는 기존의 entry에 hyundai2를 추가함.

                                         다른 것 없이 그냥 +만 써넣어도 됨 )



2. /.rhosts file등에도 다음과 같이 하여준다.

+

+ sms



3. 그리고 만일 eng라는 디렉토리를 transfer하려고 할 때, 막상 transfer하고 보면

 eng라는 parent directory는 보이지 않고 그 안의 sub directory만이 보이게 된다.

 즉 나는 /eng라는 이름과 함께 그 밑의 sub directory인 words, toeic, read등을 transfer하려

 한다면 targer이 되는 시스템의 원하는 위치에 eng라는 이름의 디렉토리를 만들어 두는 것이

 편하다는 것이다.



4. description file을 작성한다.

 다음은 sms라는 사용자가 remote system상의 sms에게 file을 transfer하는 것이다.

 이 화일의 이름은 사용자 임의로 주어도 된다.

 이 예에서 description file의 이름은 distfile이다.



        HOSTS = ( sms@sun ) --> hostname만 써넣어도 된다.

        FILES = (/user1/sms/eng) --> transfer하기 원하는 화일의 위치

        ${FILES} -> ${HOSTS}     

        install -R ~sms/eng;    --> transfer된 화일을 install하기 원하는 위치

        except (/user1/sms/eng/toeic); --> transfer를 원하지 않는 화일이나 directory

                                         있다면 이를 지정할 수 있다.

        ${FILES} :: /bin/time --> transfered time을 파악하여 notify sms@sun;

                                메일로 알려줌.



5. 이 상태에서

        # rdist -f distfile 을 수행하면 바로 원하는 화일이 description file에

 정해진 대로 전송된다.

 이 명령어를 수행하면 다음의 예와 같은 내용이 화면에 출력된다.



tech /tmp> rdist -f distfile

updating host sun

/tmp: Warning: remote mode 1777 != local mode 755

installing: /user1/sms/eng/read

installing: /user1/sms/eng/read/1.txt

installing: /user1/sms/eng/read/2.txt

installing: /user1/sms/eng/read/3.txt

installing: /user1/sms/eng/read/4.txt

installing: /user1/sms/eng/read/5.txt

installing: /user1/sms/eng/read/6.txt

installing: /user1/sms/eng/read/7.txt

installing: /user1/sms/eng/read/ab1.txt

installing: /user1/sms/eng/read/ab2.txt

installing: /user1/sms/eng/read/ab3.txt

installing: /user1/sms/eng/read/ab4.txt

installing: /user1/sms/eng/read/ab5.txt

installing: /user1/sms/eng/toeic

installing: /user1/sms/eng/toeic/f1

installing: /user1/sms/eng/toeic/f2

installing: /user1/sms/eng/toeic/f3

installing: /user1/sms/eng/toeic/f4

installing: /user1/sms/eng/toeic/f5

installing: /user1/sms/eng/toeic/f6

installing: /user1/sms/eng/toeic/e1

installing: /user1/sms/eng/toeic/e2

installing: /user1/sms/eng/toeic/e3

installing: /user1/sms/eng/toeic/e4

notify ( sms@sun )



 정해진 시간에 전송하려면 결국 crontab을 사용하여야 한다.

 /var/spool/cron/crontabs 밑에 사용자별로 있는 화일을 문법에 맞게 setting한다.


 다음 예는 화요일 14시 16분에 이 명령어를 수행하라는 예이다.

        16 14 * * 2  /bin/rdist -f /user1/sms/distfile



6. 일단 crontabs에 등록, cron daemon kill, /etc/cron.d/FIFO delete, /usr/sbin/cron 수행

 하고나면 변경된 crontabs내용이 실행된다.                                        



7. 주의 할것은 source file의 permission과 destination directory의 permission.

 만일 source는 root permission인데, destination directory가 일반 사용자 permission

 이라면 명령어 수행도중 permission error 생길 수 있다.




23.5 Prompt변경(HostName & CurrentPath Display)



1) korn shell인 경우

(1) dir function만들기

 dir()

 {

     cd $1

     PS1="<'uname -n'><'pwd'>

  }

(2) alias시키기

 alias cd=dir



2) C Shell인 경우

alias cd 'cd \!*;set prompt="`hostname`:`pwd`>"'

or

?? alias  setprompt  'set prompt="[`hostname`:$cwd]# "'

? alias  cd         'cd \!*; setprompt'

?? setprompt




23.6 임시Host_name변경



# hostname sun;source /.cshrc

임시로 호스트명이 sun으로 바뀌고, /etc/nodename도 sun으로 바뀌고,

prompt에 나타난 host_name도 sun으로 바꾼다.




23.7 /file system 100% 일 경우 유용한 command.



/tmp: If several large files are here, reboot and they will be cleaned out.

/dev: Large files may appear here when trying to write to a device andusing the

          incorrect device name (i.e. /dev/rsto instead of /dev/rst0)

/:   Look for core files

/var: If var is part of the root partition, check for large administration files in

        /var/adm. Also, some spool files may be left in the /var/spool directories.

    Check for other large files (over 1mb) with the command:

    find / -size +1000000c -xdev -print



tape 작업시 누군가 /dev/rst0 를 주었음. 2.x 에서는 /dev/rst0 가 존재하지않음. 따라서 이것이

약 9 M 정도의 file 이 되어 system full 이됨.




23.8 man page에 관한 몇가지



man은 Solaris의 명령어의 문법과 자세한 설명을 볼수 있는 일종의 manual이다. 이러한 man을 통하여 명령어의 적절한 사용법과 예제, 관련된 다른 명령어까지도 참조 할 수 있다.

이러한 man을 사용하다 겪는 몇가지 문제점과 man을 더욱 잘 사용하기 위해 만들어지는 windex에 대해서 몇가지를 간단히 정리해보려 한다.



1. Solaris install후에 man page만 따로 install하는 경우



    volume manager는 SUNWman package에 있다.따라서 O/S CD를 먼저 mount 시킨후에 pkgadd시킨다.

    만일 Solaris 2.4에서 cdrom이 /cdrom/cdrom0에 mount되어있다면 다음과 같이 하면 된다.



    # cd /cdrom/cdrom0

    # cd Solaris_2.4

    # pkgadd -d . SUNWman



2. "XXXX에 대한 메뉴얼 항목이 없음.“ error

MANPATH에 manual page가 setting되어있음에도 불구하고 ‘man 명령어’하면 이와 같은 오류

메시지를 띄우면서 실행이 되지 않는 경우가 종종 있다. 이러한 경우에는 windex file에 대한

오류를 생각해 볼수 있다.



/windex file은 man page의 검색 속도를 높여주는데 사용된다.

만일 windex file이 존재하지만 찾고자 하는 entry가 빠져 있거나하면 위와 같은 오류메세지를

내면서 manual을 찾는데 실패한다.

각각의 MANPATH에 windex file이 있을수도 있다.

windex file은 다음의 몇가지 이유로 corrupt되어질 수 있다.



1) windex size = 0

 : 이 경우에는 이 windex file을 지워주거나, man page를 더하기 위해



2) windex file에 몇가지 man page가 누락되었다.

 : windex file이 만들어진 후에 man page가 추가되는 경우도 많다.

   catman -w를 실행하여 파일을 다시 만든다.



3) windex entry들이 alphabetical order를 따르지 않는다.

 : 수동으로 (by hand)로 editing한 경우에 발생.

   windex file을 sort하거나 catman -w를 실행한다.



4) windex file의 시작 부분에 additional characters가 있을 때 이러한 문제가 생길수 있다.

 일반적으로 troff나 nroff characters가 삽입되어 있는 경우가 많다.

 : 예제>

잘된 예  ==> ypbind         ypbind(1m)       -NIS binder process

잘못된 예 ==> /f4ypbind      ypbind(1m)       -NIS binder process



3. "sh: less not found" error가 나오는 경우

/usr/ucb/man command가 내는 error:

     Reformatting page. Wait...done

     sh: less: not found

man command는 man page를 화면에 맞추기 위해 reformat을 하게 되는데 이때 nroff를 부른다. 또한 연이어서 nroff에서 나오는 output이 more command와 연계되어진다.

하지만 만일 PAGER라는 환경변수가 “less:로 setting되어 있다면 이와 같은 오류가 생길수 있다.

“less" command는 Sun에서는 지원되지 않는 것으로 more command와 비슷한 command이다. 만일 시스템이 less command찾기를 실패하면 man command또한 오류를 일으킨다.



1) less command가 상주하고 있는 directory를 PATH 변수에 설정해준다.



2) PAGER변수를 “more"로 setting해주거나, ” unsetenv PAGER "로 변수를 제거해준다.



4. “ nroff: 임시 파일을 생성할 수 없음. ” error가 나오는 경우

   (reformatting page. wait...nroff: cannot create temp file

     sh: /dev/null: cannot create)

이러한 경우 /var/tmp의 permission이 1777인지 확인한다.

정상적인 경우는 다음과 같이 보인다.

     drwxrwxrwt   2 sys     sys       1536 11월 29일 16:47 tmp

이 permission이 맞지 않으면 일반 사용자 모드에서 man 사용시 이런 오류가 발생한다. SunOS5.x의 nroff는 임시 파일을 쓰기 위해 /var/tmp를 사용한다. 하지만, SunOS 5.1과 SunOS 5.2는 /var/tmp가 아니라 var/tmp가 아니라 /tmp를 사용한다.

SunOS 4.x에서도 /tmp 의 permission을 확인해야 한다.



5. man page를 간단히 프린트 할수 있는 방법

        man에 -t option을 사용한다.

-t option은 default printer상에 manual page를 reformat하고 display하는데 사용된다.

다음의 세가지 환경 변수가 output을 customizing하는데 사용된다.



PRINTER : to set a new default printer

TROFF  : to change the format utility

        Usually changed to nroff on non-newsprint printers.

TCAT   : the display program. Defaults to lpr -t




23.9 Login User중 idle time check하여 자동 kill(script)



내용은 host 로 Login한 User중 Idle time이 10분 이상 초과한 User를

자동으로 Kill하는 Procedure 한것이다.



# SunOS 4.1.3

finger | grep -v root | grep -v oracle |grep svc | cut -c32-38 > /tmp/_list

cat /tmp/_list |cut -c1-2 > /tmp/col1;cat /tmp/_list |cut -c3-7 > /tmp/col2

_tab=`paste -d" " /tmp/col2 /tmp/col1 |\

grep -v "     " |grep -v "   [1-9]"|cut -c7-8`

for i in $_tab

do

/etc/fuser -k /dev/tty$i

done



# Solaris 2.5

finger | grep -v root |grep -v oracle |grep svc | cut -c32-47 > /tmp/_list

cat /tmp/_list | cut -c1-7 > /tmp/col1;cat /tmp/_list | cut -c8-16 > /tmp/col2

_tab=`paste -d" " /tmp/col2 /tmp/col1 |\

grep -v "         " |grep -v "       [1-9]"| cut -c11-17`

for i in $_tab

do

fuser -k /dev/$i

done



이상의 Script를 crontab에 등록하여 1분 간격으로 돌려준다.




23.10 login 보안 및 audit관련 Tip



/etc/default/login 변수...

- CONSOLE 변수는 root로 login가능한 device지정

예제)

워크스테이션의 콘솔을 지정하는 경우 또는 배제

CONSOLE=/dev/console

#CONSOLE=/dev/console

콘솔에서조차 login불능

CONSOLE=/dev/null

- PASSREQ=YES (PASSWD를 꼭 필요로 함, default NO)

예제)

MAXWEEKS=15 /* 15주 이상이면 유효기간 만료 */

MINWEEKS=3 /* 최소한 3주는 사용하여야 함 */

PASSLENGTH=6 /* Passwd의 최대의 길이 */

INACTIVE=30 /* 30주 이상 안쓰면 account locking */

EXPIRATE_DATE=1997.12.31 /* Passwd 소멸일자 */

- SYSLOG=YES ( root login 및 fail에 대한 audit자료 수집 허용여부 ,

audit는 /etc/syslog.conf에 지정된 file에 저장된다. )

/etc/default/passwd file은 default로 password aging관련 파일이다.

/etc/default/su file은 SULOG=/var/adm/sulog등으로 log파일을 지정할 수 있다.

- /etc/ftpuser file에 등록된 host들은 ftp service 불허

- ftp auditing setting

www% vi /etc/inetd.conf   /* 수정 */

...

#ftp    stream tcp    nowait root   /usr/local/etc/ftpd    ftpd

ftp   stream tcp    nowait root   /usr/sbin/in.ftpd      in.ftpd -l

...



www% vi /etc/syslog.conf

...

daemon.info    ifdef(`LOGHOST', /var/adm/ftp.log, @loghost)

...



syslogd daemon restart



- /var/adm/loginlog file을 만들어 놓으면 5번의 login log fail를

기록할 수 있게 된다.



- /etc/nologin file을 생성하면 모든 사용자 login을 불가능하게 한다.

물론 root user를 제외하고는...

그러므로 더이상의 login을 허용하고자 하지 않을 때 사용한다.

nologin file은 rebooting할 때 없어지므로 manual하게 만들든지 또는

crontab에 등록할 수 있다.



- logins -d ( 중복된 user check )

- logins -p ( null passwd user check )




23.11 시스템에 유저 접근 거부 시킬때



시스템 점검등에 유용할 것이다.

일반 계정의 유저는 접근이 거부되고, 슈퍼유저는 접속 가능하다.

# touch /etc/nologin

# vi ... 왜 접근을 거부하는지 에 대한 내용을 포함 시킨다.

# cat /etc/nologin

            The system is down right now for routine maintenancee

                    and should be back inline by 23:00.

                      Please check back at this time.

                    Thank you for your understanding,

                            the SYSTEM Admins




23.12 RAID Level



각 RAID 별 장단점

구 분
 장 점
 단 점
 
RAID 0
 Large Volumes or Drivers
 No Fault Tolerance

No Data 보전
 
RAID 1

(Enhanced)
 Large Volumes or Drivers(n/2)성능

Fault Tolerance (n-1)

Data 보전
 Extra lost (n/2)성능 (전체)

용량의 감소 (1/2)
 
RAID 5
 Large Volumes or Drivers (n-1)성능

Fault Tolerance (n-1)

Data 보전
 Extra lost (n-1)성능

(Overhead)

용량의 감소 (n-1)
 


RAID 란?

. RAID (Redundant Array of Independent Disks) 개요

- 1987년 버클리 대학에서 여러 개의 디스크를 사용함에 있어서 용량, 성능, 가격, 안전성 등을

  감안하여 디스크를 사용하는 방안으로 발전된 표준 규격으로 8개의 RAID Level이 있으나 주로

  RAID 0~5까지 사용한다.

- 그러나 RAID 5라고 해서 RAID 1 혹은 RAID 4가 RAID 3에 비해 항상 더 우수한 것은 아니다.

. RAID 1 (Transparent Mirroring)

- 두개의 다른 디스크에 동시에 Data를 Write 함.

- Single drive보다 빠른 성능을 제공한다.

- Cost에 있어서 두배의 비용이 필요하다.

- 디스크 Mirroring은 1개의 Controller에 두개의 디스크가 연결되며 Duplexing은 각각

  의 Controller를 갖고 독립적으로 동작한다.

. Enhanced RAID 1

- Mirroring와 Data Striping가 결합된 방식으로 두가지 Data가 모든 디스크에 교차하면서 저장된다.

- 디스크의 수가 홀수가 Mirroring.

- 모든 LG-IBM RAID Adapter 에서 이용이 가능함.

- 두개의 디스크를 사용하는 것에 비해 성능 및 Flexibility 하게 디스크를 사용할 수 있다.

. RAID 0 (Striping)

- Data 가 모든 드라이브에 짝수로 교차하여 분포됨.

- 중복이나 Error Correction 이 되지 않음.

- 동시에 수행되는 도구에 대해 빠른 성능을 발휘함.

- 특히 큰 Size 의 File을 Access 할 때 성능이 좋다.

- 하나의 디스크가 Fail 일 경우 전체적인 System 이 중단된다.

. RAID 5 (Data Striping With Skewed Parity)

- 데이터와 Checksun 이 드라이브에 균일하게 펼쳐짐.

- Random한 처리에 우수한 성능.

- 드라이브는 독자적으로 운영 (Sync 가 불필요)

- RAID 2,3,4에 비해 더 높은 성능을 나타냄.

- 1개의 드라이브 용량의 Cost 가 낮아 경제적임.

- 디스크의 수가 3개 이상으로 구성되며 같은 용량으로 구성될 경우에 최적의 구성이 사용 가능

  용량은 N-1 이 된다.




23.13 System의 재설정(Host_name 및 Network 정보)



   # sys-unconfig  

          ; host-name , IP-Address , Network관련하여 OS인스톨과 무관하게 재 설정할 수 있다.

            시스템을 운용하다. 필요에 의해 Host 정보를 System Default상태로 바꾸기 위해

            사용된다.

   sys-unconfig performs the following tasks:

       1.Restore the default /etc/inet/hosts files.

       2.Removes the default host name in /etc/hostname.??[0-9] and /etc/nodename.

       3.Removes the default domain name in /etc/defaultdomain.

       4.Restores the time zone to PST8PDT in /etc/TIMEZONE.

       5.Disables the Network Information Service(NIS) and Network Information Service Plus

         (NIS+) if either NIS or NIS+ was configured.

       6.Removes the entries for this host in /etc/net/*/hosts.

       7.Removes the file /etc/inet/netmasks.

       8.Removes the password set for root in /etc/shadow.

   Host-name만 변경

       /etc의 nodename,hosts,hostname.???(??? is Net_Interface=le0 or hme0)을 변경.

       이 경우 Host_name을 참조 하는 licensed S/W 가 있다면, 이것도 바꿀것.




23.14 NETWORK상에서 C-COMPILE하는 방법



*** COMPILE LICENSE가 1 user일 때 NETWORK를 통해서 COMPILE 하는 방법임. ***

1. 먼저 각 SYSTEM에 COMPILE S/W, LICENSE S/W를 설치한다.

2. LICENSE SERVER 에 LICENSE PASSWORD를 입력한다.

3. LICENSE SERVER SYSTEM

# setenv LM_LICENSE_FILE /opt/SUNWspro/license_dir/sunpro.lic,1:$LM_LICENSE_FILE      ( .cshrc 에 첨가함)

4. NETWORK 상에 연결된 SYSTEM

가) # setenv LM_LICENSE_FILE port@hostname  -->hostname은 license server system name     ( .cshrc 에 첨가함)

  (ex. # setenv LM_LICENSE_FILE 7558@axil)

나) # setenv LD_LIBRARY_PATH $OPENWINHOMW/lib:/usr/lib ( .cshrc에 첨가함)



** Solaris 2.x 일 경우 /etc/opt/licenses/licenses_combined 에서 port number를 확인.



** Network 에 연결된 system 를 license demo 구동 or system rebooting 함




23.15 Solstice Compiller Install



Install과정

1. CD에서 lit(License Installation Tools) 파일로 인스톨 (CD에 lit파일이 존재함.)

   cd#spro-install-tool

   1)좌측상단의 인스톨 하고자 하는 Product를 선택

   2)License Install란에 check-sign을 하고, 상단 중앙부의 Install 버튼을 click한다.

     *SPARCworks같은 경우, 아래의 3가지 모두 한번에 설치 됨.

        ??SPARCworks Common Tools

        ? SPARCworks

        ??SPARCompiler


2. License 양식 작성해서 팩스 보낸후 라이선스가 도착하면 인스톨 진행

3. /etc/opt/licenses/lit 실행

4. 예) C 4.0 인스톨시

      1) SparcCompiler C, 4.0부터 인스톨 RTU(Right To Use:유저수) , PASSWORD 입력

         * PC(Password Checksum),DC(Data Checksum)을 확인, 여기서 PC는 License의 것과

           반드시 일치하는지 확인.

      2) Sparcworks 3.1 , Common Tools , exit 순으로 진행

      3) /etc/opt/licenses/LIC_CONFIG_SCRIPT 실행


5. vi /.cshrc 편집 (path에 추가)

      set path=(/bin /usr/bin /usr/sbin /usr/ucb /etc /opt/SUNWspro/bin /usr/openwin/bin .)

      setenv OPENWINHOME /usr/openwin

      setenv LD_LIBLARY_PATH /opt/SUNWspro/lib:/usr/lib

        setenv MANPATH /usr/man:/opt/SUNWspro/man

       * 위 내용처럼 path, lib, man 추가설정




23.16 시스템 초기 설치시 참고



* 시스템 설치후(&유저등록시) 초기 Configure File 들의 위치

; 유저등록시에 skel DIR을 지정해 주면, 자동으로 유저의 홈DIR에 아래 초기설정파일이 copy된다.

[/etc/skel/] : 2.x

  local.cshrc ??? 일반 유저들이 사용할 path 라던지, 필요한 부분을 적절히 수정해서

  local.login   ? 이런 이름으로 넣어 놓으면, 유저 생성시 자동으로 유저의 home에 copy됨.

  local.profile ??



[/usr/lib/] : 4.1.3

  cshrc , login




4.1.3 OS 인스톨시 참고. (96.5.25)

ex)단국대 Axil245 설치(6set)

   Mem 32M, OS 4.1.3 , Compiler (C,C++,fortran,cobol,pascal)

   << HDD 1G >>

         Start Cyl.
      Block
        UFS
     Capacity(M)
 
      0
     120960
       /
       60
 
    120
     200592
       swap
      101
 
    319
     900144
       /usr
      420
 
   1212
     830592
       /home
      380
 



* 파티션 나눌때 - 70*2000=?cyl : 70(나누고자하는 M수)에 2000을 곱하면 대략적 값이

                                 나온다.

  위의 계산법으로 실린더 수를 계산하여 그 값만 써주고, 다시 설정하여 “?/” 이런식

  으로, 짜투리 값을 없앤다. 겹치는 부분이 없게 하기 위해서!

  다음 cly수 계산시는 처음부터의 바로 전까지의 cyl수를 모두 합한 값이다



* 호스트명 및 IP-ADDR 다시 설정할때

   #sys-unconfig : 호스트 명 및 IP-ADDR은 알아서 잘 넣고, TimeZone설정시는 "ROK"라고

                   할것.

* .cshrc 화일 편하게 setting 하는법 !

   #cp /usr/lib/Cshrc /.cshrc 하여 .cshrc를 편집.

       2.x일 경우 : #cp /etc/skel/local.cshrc /.cshrc

                    #cp /etc/skel/local.profile /.profile

                    #cp /etc/skel/local.login /.login




23.17 특정유저의 파일실행할 때



- single command 일 때

  #su - oracle -c /home/dir/dir/실행할_file_name

- multi command or argument가 있을 때

  #su - oracle -c '/home/dir/dir/실행할파일|다른명령|다른명령'




23.18 리모트 유틸리티 실행


X환경의 Application을 Client에서 실행하게 한다.

#xhost +           <-- 모든 Client에 대해서 접근을 허가한다.

#telnet sun

...login....

#xhost +

#setenv DISPLAY 현host_name:0

#netscape &



24장. NIS(YP)




24.1 Server & Client의 효율적 운용



구축사례 ⇒ Server & 이기종Client Model

NIS(YP) + NFS

① Server(master)집중 유저(&host)정보관리 및 Network 정보관리.

② 분산화된 다수의 client

③ 허가된 사용자는 어떤 Client에서든 자신의 계정으로 login하여 사용하고자 하는 한정된

 licensed_S/W개발tool을 편리 하게 운용한다.

 각host들은 NIS Client로 등록되었고 또한, MasterServer의 FTP영역을 사용하게된다.



          

         Server(NIS&NFS)             High Capacity : Shared of Client(NFS)

                                           Disk(or Array)

                                             



 







             다수의 이기종 Client



④ Client는 OS 외 별도의 저장영역이 불필요 서버의 Client로 share된 영역을 사용함.

 또, 이영역을 특정 유저의 전용을 막기 위해 quota를 적용 관리함이 유리하다.

⑤ 이 기종간 호환성 탁월 : 어떤 OS(vendor간)든 yp는 지원, linux도 지원함.

⑥ 다수의 Licensed Application을 NFS로 : 고가의 S/W를 저비용 측면에서 효율적운용.

⑦ IDEC 의 NFS

 서버에서 /chipfarm을 share 하고 클라이언트에서 /chipfarm 을 마운트 하는 개념.

 서버의 /chipfarm/admin/env/... 에 시스템설정 파일들을 미리설정해놓고,

 클라이언트에서는 마운트된 /chipfarm/admin/env/...의 시스템설정 파일들을 자신의

 호스트에 링크하여 사용.

 클라이언트쪽의 사용 예)



 # ln -s /chipfarm/admin/env/motd /etc/motd

 # ln -s /chipfarm/admin/env/issue /etc/issue

 .............




24.2 install 및 운용방법



- NIS는 설치 운용시 이기종간의 OS 특성에 대한 불편함이 없고, 다수의 Unix계열 OS를 지원한다.

- NIS설치는 OS install시 setting하는 것이 가장좋고, 현재 운용결과 솔라리스 2.6 환경에서의

Master Server 설치 및 다수의 이기종 Client 간의 관리가 좋은 것으로 나타났다.



? 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만 수행함



* master는 OS install시 full_package로 설치하고,

/etc/defaultdomain을 생성 서버에 맞는 domainname기입한다.

# cd /var/yp

# /usr/etc/yp/ypinit -m 하여 물어보는 질문에 대해 모두 Yes함.

  아래 ypinit -m을 참조




24.3 NIS Master Server 초기화



① domain name을 설정함

    # domainname sunse

② /etc/defaultdomain file을 수정 혹은 생성

    NIS domain name을 부가함

③ /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 시킴

④ NIS database상에 포함된 ASCII file들을 수정함

    이런 화일들은 passwd, hosts, ethers, group, aliases, netgroup, networks, netgroup,

    protocols, bootparams, services 임

    passwd와 group화일들에서 + entry들을 제거함 ( 공백 netgroup은 빈 netgroup map을 만듬)

⑤ 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가 될지 안다면 여기서 이름을 입력함

⑥ fastboot를 사용하여 reboot함

    모든 daemon들을 올바르게 가동시키기 위해서는 reboot하는 것이 쉽다.




24.4 NIS Slave Server 초기화



① domain name을 설정함

② /etc/defaultdomain file을 수정 혹은 생성

    NIS domain name을 부가함

③ /etc/rc.local 화일을 수정함

   . ypbind startup line들이 풀려져 있는가를 확인함

④ ypbind daemon을 가동시킴

     # /usr/etc/ypbind

⑤ /usr/etc/yp directory로 변경후 slave server mode상에서 ypinit를 가동하여 master로부터

   database를 모은다.

     # cd /usc/etc/yp

     # ypinit -s master  /* master 는 마스터 서버네임

          quit on non-fatal errors [y/n:] y

   (slave는 master처럼 물어보는 것이 없음. 바로 YP환경을 create함.

    master server상의 /var/yp/"domainname" 밑에 있는 db화일들을

    자기 local의 /var/yp/"domainname"밑에 그대로 copy함.)

⑥ NIS server daemon을 reboot하여 가동시킴

위의 과정은 slave server가 master server install동안에 언급이 되었을 경우에 사용된다.




24.5 NIS Administration



* master server만은 /etc/passwd에 user account 정보 모두 가지고 있음.

slave server의 /etc/passwd에는 일반 client처럼 최소한의 것이 있음.



* make

master server상에서만 수행 가능.

master server의 /var/yp/Makefile을 참조하여 수행하는데 이는 master server만 있음.

# cd /var/yp

# make : YP에서 관리하는 모든 db정보를 양자 비교하여 최신의 것으로 update시킴

         변경된 정보의 Update



* yppasswd

- master에서 slave로 passwd정보를 transfer함

  ┌ 일반 사용자는 yppasswd

  └ root는        /bin/passwd

  /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에

  의뢰 한다.



* ypxfrd

- transfer daemon

- master에서 running되며 master의 db정보를 slave에 전달해서 update 시킴



* ypserv

- master나 slave가 information db를 service함



* ypbind

- master, slave, client들 모두에 running됨.

- master나 slave에서 db information 가져오는 daemon

- master나 slave는 자기가 infor 가지고 있어도

  network에서 가져오도록 설계 --> 구현 용이



* client

- suninstall시 client에 대해서는 두가지만 하면 된다.

- client

  Domain Name : cs.postech

- client booting시

  Starting NIS service

  ypbind ......

- error:

  "NIS server not responding for domain 'cs.postech'

   Still trying ....."

  network이 죽어 master나 slave중 어느 것 하나 살아 있지 않아

  service를 받지 못하는 경우 booting시 발생하는 error message.



* 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에서 합법적임.



* 관련 daemon

- ypserv : server process

- ypbind : binding process

- ypxfrd : map transfer daemon

- rpc.ypupdated : map entry들을 change하기 위한 server

- rpc.yppasswdd: NIS passwd file을 modify하기 위한 server

- in.named : option 사항



* Utility들

- ypcat : map에서 data를 list하기 위해

   # ypcat hosts

   # ypcat passwd

   # ypcat -m hosts (hosts map을 service해 주는 master server가 어느것인지)

- ypwhich : NIS server name을 list

   # /usr/bin/ypwhich    --> NIS server가 누군지를 보여줌

   # /usr/bin/ypwhich -m --> 어떤 map들의 master가 어느 server machine인지를 보여줌

   # /usr/bin/ypwhich clientname --> 어떤 ypserver가 NIS client machine으로 service를

                                      제공 하는지를 보여줌

- ypmatch : map값과 match시키기 위해서

   # ypmatch key0 key1 map --> NIS map안에 있는 특정한 key들의 값을 보여줌

- ypinit : NIS database를 build함

- yppoll: server로부터 map의 order number를 얻기 위해

- yppush : master에서 slave로 data를 전달

   # /usr/etc/yp/yppush --> NIS master server에서 수행하며 master NIS server에서

                             slave NIS server로 NIS map의 새로운 version을 copy함.

- ypset : 특정 server에 binding set

   # /usr/etc/yp/ypset host --> 특정한 NIS server로 bind를 시도함

- ypxfr : master에서 slave에 data transfer

- makedbm : NIS map을 위한 dbm file을 create



* 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를 사용할것.



* NIS Database를 Updating

. NIS master machine상에서 적당한 ASCII file를 변경한다.

. local map을 update하기위해 make 명령어를 실행시킨다. 이 작업은 update된 version을

  NIS slave server들로 보낸다.

. 예를 들면, /etc/passwd file를 update한다.

      # vi /etc/passwd file 를 수정하여 변경함

      # cd /var/yp

      # make

. make는 변화된 map들만 다시만든다.

  변화들이 끝났을때, make는 NIS slave server들의 map들을 update하기 위해 yppush 를 야기

  시킨다.

ex) network에 system attach시키는 경우

    - master server의 hosts file을 edit하고

    - master server에서 make를 수행하면 됨.

      자동적으로 hosts.byname과 hosts.byaddr map을 update함

      이 map들은 다른 server들로 전파되고 모든 client가 이를 사용할 수 있게 됨.



* slave server상에서 make하지 말 것

/var/yp 밑에 Makefile 있음.

make 돌리면 default NIS map을 create하기 위해 makedbm에 줌

# makedbm -u group.byaddr하면

makedbm이 /etc의 화일들을 읽어서 NIS map set을 create함.

map은 각 db file 단위로 보관하고 있음.



* 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시킨다.



* 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들을 수행한다.



* OS install한 상태에서 NIS setting하는 방법

1) master server

   - /etc/defaultdomain에 domainname을 등록함

   - /var/yp에 가서

     # /usr/etc/yp/ypinit -m

     (만약 error 발생하면, /usr/lib/NIS.Makefile을 copy하여 다시 수행)

   - # ypserv

   - /etc/rc.local의 ypxfrd를 열어줌.

   - # sh -x /etc/rc.local or reboot

2) slave server

   - /etc/defaultdomain에 domainname을 등록함

   - # ypbind

   - # /usr/etc/yp/ypinit -s "master_server"

     (ypinit 수행 전에 master server의 ypxfrd가 수행되고 있는지 확인)

3) client

   - /etc/defaultdomain에 domainname을 등록함

   - # sh -x /etc/rc.local or # ypbind



* 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를 포함함.




24.6 NIS 장애유형 / 유의할점



* 현재 NIS가 running중인지 보려면

# ps ax | grep ypbind --> 있으면 running중임.



* slave server가 2개 이상인 경우 어느 slave server가 update하려고

계속 try하여 hangup됨

--> 이 경우 한 후 ypinit를 다시 수행하여 slave를 다시 지정해야 함.



* slave는 make 못 돌린다. 즉 db update는 못하고 단지 제공하는 기능만 가짐.



* master나 slave server중 어느 것이든 먼저 service해 줄 수 있는 것이

service 제공해 줌. yp client의 요구를 먼저 catch한 것이 service를 함.

그러므로 master server가 down 되더라도 slave가 있으면 service 가능한 것.



* domain name이 noname이면 YP가 안됨

/etc/defaultdomain에 domainname이 있어야 한다

앞선 연재에서 소개한 것처럼 오라클 리얼 애플리케이션 클러스터의 핵심 기능은 캐시 퓨전이다. 이 캐시 퓨전은 각 노드 간의 버퍼 캐시의 내용을 교환해, 필요 없는 디스크 액세스를 줄이고 각각의 노드를 동기화해 사용자가 어떤 데이터베이스 서버에 접속해도 똑같은 하나의 서버에 접속하는 것 같은 느낌을 준다.
현행시스템 오픈시스템 마이그레이션 전략
㈜케미스 CMO
박현수 상무

註. 본 자료는 공기업의 IT부서나 공기업 IT 사업을 하시는 대형SI업체 담당자를 위하여 작성한
자료입니다.

1. 현행(AS-IS)시스템 정의 및 현황 ?

AS-IS시스템은 기존에 사용하고 있는 시스템으로 일반적으로 Legacy System이라고 부르기
도 합니다. 그 의미를 Wikipedia의 정의를 살펴보면 다음과 같습니다.
“A legacy system is an existing computer system or application program which
continues to be used because the user (typically an organization) does not want to
replace or redesign it.
즉, 사용자가 현재 사용하고 있는 컴퓨터시스템과 어플리케이션 프로그램에 대하여 교체하거
나 새롭게 구축할 필요가 있는 시스템을 의미합니다. 필자는 이를 아래 표와 같이 정리를 하여
이해를 돕고자 합니다.

하드웨어 운영체제 프로그램언어 데이터베이스 미들웨어
IBM HP SUN TENDOMFujitsu Hitachi 등 모든 하드웨어 시스템 DOS MVS UNIX
Linux RS6000 OS400 ….. COBOL PL/I Assembler VB PB Delphi Centura Magnax
C C# C++ Java ASP HTML XML 등 모든 프로그램언어 HDB NDB RDBISAM VSAM KSAM
모든 DB및 파일 Tuxeudo Topend CICS WeblogicWebsphereTmax ZEUS COM+
<표1> AS-IS 시스템의 범위

위 표처럼 AS-IS시스템은 사용자가 현재 사용하고 있는 시스템이나 구축하고자 하는 대상시스
템(TO-BE) 등 모두가 그 대상이 됩니다.

다음은 현행시스템의 현황을 살펴 보기로 하겠습니다.

필자는 지난 2000년도에 Y2K(밀레니엄버그) 사업을 하면서 느낀 점이 우리나라 공공기관에 이
렇게 다양한 컴퓨터시스템과 어플리케이션 프로그램이 있는지 몰랐습니다.
모 공공기관은 프로그램언어만 무려 30여 가지를 사용하고 있었고, 현황 조차도 파악이 안된 부
분이 너무도 많았다는 것입니다.
참고로, 전세계적으로 작성된 프로그램언어만 150여 종에 이르고 있으며, 우리 한국은 60여 종
의 프로그램 언어가 활동 중에 있습니다.
IT역사가 오래 된 기업일수록 많은 프로그램언어와 데이터베이스 그리고 다양한 운영체제를 담
은 컴퓨터 시스템으로 구성되어 있습니다. 이를 통합하거나 정리를 한다 하여도 쉽게 전략이 나
오지 않은 것이 현실입니다.

이웃 일본은 우리나라와 달리 메인프레임 컴퓨터시스템에서 현대 오픈시스템으로 전환
(Migration)하기 위한 작업에 한창입니다. 그러나 우리는 대부분 메인프레임 컴퓨터시스템을 다
운사이징을 하였지만, 아직도 공공기관이나 금융권은 사용하고 있다는 점입니다. 이러한 환경
을 어떠한 전략을 세우고 있으며, 제안하려는 전략이 있는지요 ?

필자 회사는 기존 컴퓨터시스템을 오픈시스템으로 마이그레이션을 전문으로 하는 기업이며, 국
내에서는 가장 많은 성공사례를 가지고 있는 기업입니다.

2. 마이그레이션 전략과 사례소개

이러한 문제를 국내 사례와 저희 회사가 가장 강점으로 여기는 일본의 대기업 마이그레이션 사
업을 여러분에게 시원한 해결책을 드리고 싶습니다.

다음은 마이그레이션의 전략을 소개하고자 합니다.

첫째, 기존시스템을 버리고 새롭게 구축하는 전략입니다.

이 방법은 가장 쉽고, 사용자나 개발업체에게도 부담도 없고 가장 선호하는 방법일 것입니다.
그러나 여기에 많은 문제점과 해결해야 하는 부분이 생기게 마련이지요.

² 엄청난 개발비용이 들어간 다는 점입니다.
² 기존 시스템의 많은 지적재산과 경험 등이 재활용이 되지 않습니다.
² 새롭게 개발된 시스템을 정상운영하려면 많은 시간과 위험요소를 안고 있습니다.
² 새로운 시스템 개발에 따른 사용자의 새로운 변신이 반드시 필요합니다.

대부분 컨설팅업체, SI개발업테는 이 방법을 가장 선호하는 방법입니다. 여기에 새로운 기술이
나 비즈니스 프로세스 등의 기대효과가 있기 때문입니다. 그러나 모든 것이 새롭게 구축한다고
모든 문제가 풀리는 것만은 아니라는 점을 명심할 필요가 있습니다.

둘째, ERP시스템으로 교체하는 것입니다.

이 방법 또한 새롭게 구축하는 일보다 전략을 결정하는데 어렵지 않을 것입니다. 최근에 가장
최고의 비즈니스 프로세스가 담긴 ERP시스템을 도입하고 나아가 이를 보완하는 자체시스템을
통하여 성공한 사례가 얼마든지 많습니다. 과연 ERP시스템의 프로세스가 사용자의 비즈니스
모델과 일치하느냐를 엄밀하게 따져야 하는 부분일 것입니다.

² 마찬가지로 많은 도입비용이 들어간 다는 점입니다.
² 기존 시스템의 많은 지적재산과 경험 등이 재활용이 되지 않습니다.
² 새로운 비즈니스 프로세스 부분에 적응 하는데 많은 시간이 소요됩니다.

셋째, 기존 시스템을 활용하여 새롭게 구축하는 전략입니다.

신규구축이나 ERP시스템을 도입하는 전략은 모두 많은 비용이 지출이 된다는 점과 기존시스템
의 지적경험과 프로세스가 전혀 활용이 되지 않고 있다는 점에서 “레거시시스템을 마이그레이
션 전략(이하 LM, Legacy Migration)은 새로운 방법이자 사용자에게는 다양한 방법을 생각할
수 있다는 것입니다.

LM전략은 다음과 같은 장점만을 가지고 있습니다.

² 개발비용이 기존 비용보다 50% 이상 절감이 가능합니다.
² 개발기간도 1/3 정도 감축됩니다.
² 기존시스템을 활용하고 보완하는 전략이므로, 업무 진행에 대한 위험도가 전혀 없
습니다.

몇가지 사례를 소개하고자 합니다.

사례1 : 모 기업은 최근에 다양한 업종의 회사를 인수합병하면서 다양한 컴퓨터시스템과 어플리
케이션 프로그램전시장이 되어 버렸습니다. 프로그램 언어만 30여종, 현황 조차도 파악이 안되
는 상황입니다. 나아가 이를 유지보수하는데도 많은 어려움을 겪고 있습니다. 그래서 새로운 고
객의 요구가 오면 새롭게 개발하는 방법으로 땜질 방법 밖에 없었다는 점이죠. 이러한 상황에
처한 기업에 저희는 다음과 같은 전략과 솔루션을 제안하였습니다.

² 다양한 컴퓨터시스템안에 있는 어플리케이션 프로그램을 통합하고 현황분석이 가
능하도록 지원하는 솔루션(제품명 : SmartDocu™)을 제공하였고, 이를 통해 정확한 현황파악
과 자동으로 문서를 출력하여 문제점을 정확하게 파악하는 환경을 구축하였습니다.
² 다양항 프로그램언어를 자동을 분석하고 이를 언제나 쉽게 검색하고 관리 할 수 있
도록 표준 메타데이타를 구축하였습니다.
² 다음으로 사용자가 원하는 Java, C# 혹은 오픈환경의 COBOL 프로그램언어로 자
동으로 변환하는 솔루션(제품명 : SmartArch™)을 제공하였습니다.

사례2 : 모 철강회사인데 이 회사는 컴퓨터환경은 매우 드문 시스템이었고 프로그램언어도 거
의 처음 들을 정도로 생소한 프로그램 언어였습니다. 즉, MagnaX, HPS/COBOL, Natural 등
이러한 언어는 아마 여러분도 생소 할 것입니다. 모든 컴퓨터시스템을 사용자의 개발전략에는
차질이 없는데, 생소한 프로그램언어를 어떻게 처리 할 것인가에 무척이나 고민을 하고 있었습
니다. 여기에 저희는 다음과 같은 자문과 솔루션을 제공하였습니다.

² 저희 회사는 30여종의 다양한 프로그램언어를 자동으로 변환(conversion)이 가능
하도록 모든 프로그램 문법 저장소를 10여년간 많은 시행착오를 거치면서 데이터베이스로 구축
하였습니다. 이를 바탕으로 사용자의 프로그램언어를 자동으로 분석하고 이를 지원하는 솔루션
(제품명 : Chameleon™)을 제공하였습니다.

사례3 : 일본의 모 금융사인데, 이 기업은 오픈시스템으로 모든 시스템을 구축하였는데, 그 동
안 구형시스템에서 유지보수를 하는데 많은 어려움을 겪었던 터라 새로운 오픈시스템에서는 이
를 해결하여 향후 유지보수 문제에서 찰피하고자 하는 방법을 모색하였습니다.
그 회사는 Unix, Java 환경으로 신기술로 무장을 하였지만, 이를 관리하는 방법에 대하여 저희
는 다음과 같은 자문과 솔루션을 제공하였습니다.

² 개발회사에서 인수 받은 컴퓨터시스템과 어플리케이션 프로그램을 체계적으로 관
리하고 유지보수 할 수 있는 어플리케이션 거버넌스 솔루션(제품명 : SmartDocuXT™)을 제공
하였습니다.
² 어플리케이션 거버넌스 솔루션은 다음과 같은 기능을 제공합니다.
어플리케이션 프로그램 자산관리, 변경관리, 자동문서관리, 영향분석관리, 형상관리, 기능점수
(function point)관리, 감시(monitoring)관리, 비즈니스 룰 관리, 메타데이타관리, 컴포넌트
(UML) 자동문서관리, Pseudo code 관리, 표준화를 중심으로 품질관리 등 다양한 기능을 제공
하고 있습니다.




3. 마이그레이션 전략 결론

세계 여러곳을 방문하다 보면, 역사와 전통이 있는 나리일수록 선조들의 유산이 고스란히 보존
되고 있는 것을 보게됩니다. 우리는 유구한 역사를 가지고 단일민족의 우수성도 있지만, 수 많
은 외침과 강대국 사이에서 어려움을 겪다보니 모든 문화유산이 파괴되는 아픔을 겪었지만 이
제 우리는 강대구에 합류하면서 우리의 잊혀진 문화유산 복구에 힘쓰는 모습을 봅니다.

마치 우리 IT산업도 마찬가지란 생각을 합니다.
우리는 소프트웨어를 생산성향상, 조기 시장진입, 치열한 기업간의 경쟁력, 비용절감, 신속 등
수 많은 과제앞에 우리는 마구잡이 식으로 소프트웨어 개발에 치중을 하였던 것이 사실입니다.
그러다 보니 국적도 없는 소프트웨어도 많고, 이기종의 컴퓨터시스템도 많고, 문서관리도 잘 안
되었던 것이 모두가 이러한 사실에 입각하였다고 필자는 생각하고 있습니다.

필자는 글을 맺으면서 다음과 같은 제안을 하고자 합니다.

&uuml; 기존의 어플리케이션 프로그램을 재활용하자는 것입니다.
&uuml; 이를 위해 재활용이 가능한지 철저하게 분석하는 과정을 거치도록 합시다.
&uuml; 언젠가는 새로운 시스템도 마찬가지로 문제투성이가 될 수 있습니다.
&uuml; 더 이상 버리고 새롭게 구축하는 반복을 멈추고, 새로운 전략을 도입합시다.

이를 위해 저희 케미스는 다양한 성공사례와 가장 적합한 솔루션(제품)을 보유하고 있습니다.
이러한 경험과 전략을 여러분에게 소개하고 싶습니다.

여러분의 비즈니스 전략에 도움이 되신다면, 언제든지 연락을 주시면, 최선을 다하여 지원하겠
습니다.
 
----------------------------------------------------------------
 
결론적으로는 회사 홍보내용이군요..
 
대형업체에서는 Legacy Migration이 효율적인것 같은데...
중소형 업체에는 시스템 규모가 적다면 새롭게 구축하는것도 괜찮지 않을까요?
Sun Solaris 멀티 쓰레드의 개념
 
<표 1>은 이 글에서 사용되는 몇 가지 용어를 소개하고 있다.
 
표 1 > 멀티 쓰레딩 용어
용어 정의
 
프로세스(process)

프로그램을 실행하기 위해 설정된 fork (2) 시스템 호출을 통해 생성된 UNIX 환경(파일 기술자, 사용자 ID 등)

쓰레드(thread) 프로세스 컨텍스트 내에서 실행되는 명령어 시퀀스
p쓰레드(POSIX 쓰레드) POSIX 1003.1c 호환 쓰레드 인터페이스
Solaris 쓰레드(Solaris thread) POSIX와 호환되지 않는 썬 마이크로시스템즈 쓰레드 인터페이스
단일 쓰레딩(single-threaded) 단일 쓰레드 액세스로 제한
멀티 쓰레딩(multithreaded)

2개 이상의 쓰레드에 대한 액세스 지원. 사용자(커널에 반대되는) 공간의 쓰레드

사용자 또는 애플리케이션 레벨 쓰레드
(User- or Application-level thread)
라이브러리 루틴에 의해 관리되는 쓰레드
경량형 프로세스(lightweight process)

커널 코드 및 시스템 호출을 실행하는 커널의 쓰레드 (LWP라고도 불림)

바운드 쓰레드(bound thread) LWP에 영구적으로 연결되는 쓰레드
언바운드 쓰레드(unbound thread)

커널 지원 없이 매우 빠르게 컨텍스트 스위칭을 수행하는 디폴트 Solaris 쓰레드

속성 객체(attribute object)

POSIX 쓰레드, 상호 배제 락(mutual exclusion lock, mutexe) 및 조건 변수의 구성 가능한 측면을 표준화하기 위해 사용되는 데이터 타입 및 관련 조작 기능 포함

상호 배제 로크(mutual exclusion lock)

공유 데이터에 대한 액세스 락(lock) 및 언락(unlock)을 지원하는
기능

조건 변수(condition variables) 상태 변화 때까지 쓰레드를 차단(blocking) 하는 기능
카운팅 세마포어(counting semaphore) 메모리 기반의 동기화 메커니즘
패러럴리즘(parallelism) 최소 2개의 쓰레드가 동시에 실행되고 있을 때 발생하는 상황
동시성(concurrency)

최소 2개의 쓰레드가 진행될 때 존재하는 상황. 가상 패러럴리즘의 한 형태인 시간 분할(time slicing) 기능을 포함하고 있는 보다 일반적인 형태의 패러럴리즘.

 

멀티 쓰레딩 프로그래밍의 개념은 최소한 1960년 대로 거슬러 올라간다. UNIX 시스템 상에서의 멀티 쓰레딩 프로그램 개발은 1980년대 중반부터 시작됐다. 멀티 쓰레딩에 대한 정의와 이를 지원하는데 필요한 기능에 대한 합의가 이루어졌지만, 멀티 쓰레딩 구현에 사용되는 인터페이스는 매우 다양했다.
수년 간 POSIX(Portable Operating System Interface) 1003.4a라 불리는 그룹이 멀티 쓰레딩 프로그래밍을 위한 표준 개발에 주력했다. 현재, 이 표준은 승인을 받은 상태이다. 이 글은 POSIX 표준인 P1003.1b 최종 드래프트 14(실시간) 및 P1003.1c 최종 표준 10(멀티 쓰레딩)을 기초로 작성됐다.
또 여기서는 POSIX 쓰레드(p쓰레드라고도 불림) 및 Solaris 쓰레드를 모두 다루고 있다. Solaris 쓰레드는 Solaris 2.4 버전부터 지원되며, POSIX 쓰레드와 기능 측면에서 크게 차이나지 않는다. 한편, 이 글에서는 POSIX 쓰레드가 Solaris 쓰레드에 비해 이식성이 훨씬 뛰어나다는 사실을 감안, POSIX 관점에서 멀티 쓰레딩에 대해 알아보고자 한다.

 

> 애플리케이션 응답성 개선
많은 작업이 상호 의존적으로 수행되지 않는 프로그램의 경우, 이를 재설계해, 각 활동을 쓰레드로 정의할 수 있다. 예를 들어, 멀티 쓰레딩 GUI 사용자는 하나의 작업이 완료될 때까지, 다른 작업에 착수하는 것을 미룰 필요가 없다.

 

> 효율적인 멀티프로세서 활용
일반적으로, 쓰레드 실행시 동시성을 요구하는 애플리케이션은 가용 프로세서의 수를 고려할 필요가 없다. 애플리케이션 성능은 프로세서 추가를 통해 투명하게 개선된다.
행렬 곱셈(matrix multiplication)과 같이 패러럴리즘의 수준이 높은 수치 알고리즘 및 애플리케이션은 멀티프로세서 상의 쓰레드로 구현될 때, 훨씬 빠르게 실행될 수 있다.

 

> 프로그램 구조 개선
많은 프로그램을 단일 모놀리식(monolithic) 쓰레드가 아니라 여러 개의 독립적 또는 중간 독립적(semi-independent) 실행 유닛으로 구성함으로써 효율성을 높일 수 있다. 멀티 쓰레딩 프로그램은 단일 쓰레딩 프로그램보다 다양한 사용자 요구에 대한 보다 뛰어난 적응성을 갖게 된다.

 

> 최소한의 시스템 자원 활용
공유 메모리를 통해 공통의 데이터에 액세스하는 2개 이상의 프로세스를 사용하는 프로그램은 1개 이상의 제어 쓰레드를 적용하고 있다.
그러나, 각 프로세스는 완벽한 어드레스 공간 및 운영 환경 상태를 보유하고 있다. 대용량의 상태 정보를 작성 및 유지보수 하는데 소요되는 비용 때문에, 각 프로세스는 시간 및 공간 측면에서 쓰레드 보다 많은 비용을 소모하게 된다.
뿐만 아니라,프로세스 간의 구분 속성 때문에 프로그래머들은 서로 다른 프로세스 내 쓰레드 간 통신이나 그 실행을 동기화하는데 상당한 노력을 기울여야 한다.

> 쓰레드와 RPC의 결합
쓰레드와 RPC(Remote Procedure Call) 패키지를 결합함으로써, 비공유 메모리 멀티프로세서(예를 들면 워크스테이션 컬렉션과 같은)의 이점을 활용할 수 있다. 이러한 결합을 통해, 비교적 손쉽게 애플리케이션을 배포하는 것은 물론, 워크스테이션 컬렉션을 멀티프로세서로서 다룰 수 있게 된다.
예를 들면, 하나의 쓰레드로 하위(child) 쓰레드를 생성할 수 있다. 이들 각각의 하위 쓰레드는 원격 프로시저를 요청해, 다른 워크스테이션 상에서 프로시저를 호출하게 된다. 오리지널 쓰레드는 현재 병렬로 실행되고 있는 쓰레드만을 생성하지만, 다른 컴퓨터에서도 패러럴리즘이 구현된다.

 

> 동시성 및 패러럴리즘
단일 프로세서 상의 멀티 쓰레딩 프로세스의 경우, 해당 프로세서는 쓰레드 간의 실행 자원을 교환할 수 있기 때문에, 동시 실행이 이루어지게 된다.
공유 메모리 멀티프로세서 환경 내 동일한 멀티 쓰레딩 프로세스의 경우, 해당 프로세스 내에서 각 쓰레드는 별도의 프로세서 상에서 동시에 실행됨으로써 병렬 실행이 이루어지게 된다. 해당 프로세스에서 쓰레드 수가 프로세서 수와 같거나 이보다 적을 경우, 해당 운영 환경과 함께 쓰레드 지원 시스템은 각 쓰레드가 서로 다른 프로세서 상에서 작동할 수 있도록 보장하게 된다. 예를 들면, 쓰레드와 프로세서 수가 동일한 행렬 곱셈에서 각 쓰레드(및 각 프로세서)는 결과의 1 행(row)을 계산하게 된다.

 

> 멀티 쓰레딩 구조의 이해
기존의 UNIX도 이미 쓰레드 개념을 지원하고 있다. 즉 각 프로세스는 하나의 쓰레드를 포함하고 있기 때문에, 멀티프로세스를 이용한 프로그래밍은 멀티 쓰레드를 통해 수행된다. 그러나, 하나의 프로세스는 하나의 어드레스 공간을 의미하기 때문에, 하나의 프로세스를 구축한다는 것은, 하나의 새로운 어드레스 공간을 생성하는 것이 된다.
새롭게 생성된 쓰레드는 기존의 프로세스 어드레스 공간을 사용하기 때문에, 쓰레드를 만드는 것이 새로운 프로세스를 만드는 것보다 훨씬 저렴하다. 쓰레드 간 스위칭의 경우, 어드레스 공간의 스위칭을 포함하지 않기 때문에 쓰레드 간의 스위칭에 소요되는 시간은 프로세스 스위칭에 소요되는 시간보다 훨씬 적다.
쓰레드는 모든 것, 특히 어드레스 공간을 공유하기 때문에 단일 프로세스 내 쓰레드간 통신은 간단하다. 따라서, 하나의 쓰레드가 생성한 데이터는 다른 모든 쓰레드에서 즉시 사용할 수 있게 된다.
멀티 쓰레딩에 대한 인터페이스 지원은 POSIX 쓰레드의 경우 libpthread, Solaris 쓰레드의 경우 libthread 같은 서브루틴 라이브러리를 통해 이루어진다. 멀티 쓰레딩은 커널 레벨 및 사용자 레벨 자원을 분리함으로써 유연성을 부여하게 된다.

 

> 사용자 레벨 쓰레드
쓰레드는 멀티 쓰레딩 프로그래밍의 주요 프로그래밍 인터페이스이다. 사용자 레벨 쓰레드1는 사용자 공간에서 처리되며, 커널 컨텍스트 스위칭 과정을 배제하게 된다. 하나의 애플리케이션이 수백 개의 쓰레드를 가질 수 있으며, 여전히 많은 커널 자원을 소비하지 않는다. 애플리케이션이 사용하는 커널 자원의 크기는 주로 애플리케이션에 의해 결정된다.
쓰레드는 어드레스 공간, 개방된 파일 등과 같은 모든 프로세스 자원을 공유하고 있는 프로세스 내에서만 볼 수 있다. 아래와 같은 상태는 각 쓰레드에 따라 고유하게 지정된다.

 
쓰레드 ID
레지스터 상태 (PC 및 스택 포인터 포함)
스택
시그널 마스크(signal mask)
우선 순위
쓰레드 전용(thread-private) 스토리지
 

쓰레드는 프로세스 명령어와 프로세스 데이터의 대부분을 공유하기 때문에 한 쓰레드에 의해 공유 데이터 내에 변경이 이루어질 경우, 해당 프로세스 내의 다른 쓰레드가 이를 확인할 수 있다. 한 쓰레드가 동일한 프로세스 내의 다른 쓰레드와 상호 작용해야 할 경우, 운영 환경의 개입없이 이를 수행할 수 있다.
쓰레드는 기본값으로 초경량(lightweight)으로 설정되어 있다. 그러나, 쓰레드를 보다 완벽하게 제어하기 위해(예를들어, 스케줄링 정책을 보다 완벽하게 제어하기 위해) 애플리케이션은 이 쓰레드를 연결(binding)할 수 있다. 애플리케이션이 쓰레드를 실행 자원에 연결하면 쓰레드는 커널 자원이 된다.
사용자 레벨 쓰레드에 대한 내용을 요약하면 다음과 같다.

 

고유한 어드레스 공간을 생성할 필요가 없기 때문에, 보다 저렴한 비용으로 개발할 수 있다. 이는 런타임 시 어

 

드레스 공간에서 할당되는 가상 메모리이다.

커널 레벨이 아니라 애플리케이션 레벨에서 수행되기 때문에 신속하게 동기화할 수 있다.
libpthread 또는 libthread와 같은 쓰레드 라이브러리를 통해 손쉽게 관리할 수 있다.
 

> 경량형 프로세스
쓰레드 라이브러리는 커널에 의해 지원되는 경량형 프로세스라고 불리는 기본 제어 쓰레드를 사용한다. 이러한 LWP는 코드나 시스템 요청을 실행하는 가상 CPU로서 간주할 수 있다.
쓰레드를 이용해 프로그래밍하는데 있어, LWP 때문에 고민할 필요는 없다.


주 - Solaris 2, Solaris 7 및 Solaris 8 운영 환경의 LWP는 Solaris 2, Solaris 7 및 Solaris 8 운영 환경에서 지원되지 않는 SunOS 4.0 LWP 라이브러리의 LWP와는 다른 것이다.

 

fopen() 및 fread() 같은 studio 라이브러리 루틴이 open() 및 read() 함수를 사용하는 것처럼, 상당 부분 같은 이유로 쓰레드 인터페이스도 LWP 인터페이스를 사용하고 있다.
LWP(Lightweight Process)는 사용자 레벨과 커널 레벨을 잇는 가교 역할을 한다. 각 프로세스는 1개 이상의 LWP와 바인딩을 포함하고 있으며, 각 LWP는 1개 이상의 사용자 쓰레드를 실행하고 있다(<그림 1> 참조). 쓰레드를 생성하기 위해서는 일부 사용자 컨텍스트의 작성이 이루어져야 하지만, LWP의 생성과는 전혀 관계가 없다.

각 LWP는 커널 풀(pool) 내 커널 자원으로서, 각 쓰레드 단위로 할당(attached) 또는 해제(detached) 된다. 이는 쓰레드가 스케줄링 및 소멸될 때 발생하게 된다.

> 스케줄링
POSIX는 FIFO(first-in-first-out)(SCHED_FIFO), 라

운드 로빈(round-robin)(SCHED_RR) 및 맞춤형(SCHED_OTHER) 등 3가지 스케줄링 정책에 대해 구체적으로 명시하고 있다. SCHED_FIFO는 각 우선순위 레벨에 따라 서로 다른 대기 행렬을 가진 대기 행렬 기반의 스케줄러이다. SCHED_RR은 각 쓰레드가 할당된 실행 시간을 가지고 있다는 점을 제외하고는 FIFO와 유사하다.
SCHED_FIFO 및 SCHED_RR 모두 POSIX Realtime 익스텐션이다. SCHED_OTHER는 기본값으로 설정된 스케줄링 정책이다.
언바운드 쓰레드를 위한 프로세스 범위와 바운드 쓰레드를 위한 시스템 범위 등 2가지 스케줄링 범위가 지원된다. 서로 다른 범위 상태를 지닌 여러 쓰레드들이 동일한 시스템 상은 물론, 심지어 동일한 프로세스 상에 공존할 수 있다. 일반적으로 범위는 쓰레드 스케줄링 정책이 유효한 범위를 설정하게 된다.

 

> 프로세스 범위(언바운드 쓰레드)
언바운드 쓰레드는 PTHREAD_SCOPE_PROCESS으로 생성된다. 이들 쓰레드는 LWP 풀의 가용 LWP로부터의 연결 및 해제되도록 사용자 공간 내에서 스케줄링된다. LWP는 프로세스의 쓰레드에서만 이용할 수 있다. 즉, 쓰레드는 이들 LWP 상에서 스케줄링되는 것이다.
대부분의 경우, 쓰레드는 PTHREAD_SCOPE_PROCESS가 된다. 따라서, 쓰레드는 LWP 간을 이동할 수 있으며, 이를 통해 쓰레드 성능이 개선된다(이는 THR_UNBOUND 상태에서 Solaris 쓰레드를 생성하는 것과 동일하다). 쓰레드 라이브러리는 다른 쓰레드 중 해당 커널을 통해 지원받게 되는 쓰레드를 결정하게 된다.

> 시스템 범위(바운드 쓰레드)
바운드 쓰레드는 PTHREAD_SCOPE_SYSTEM으로 생성된다. 바운드 쓰레드는 LWP에 영구적으로 연결된다. 각 바운드 쓰레드는 쓰레드의 수명이 다할 때까지 LWP에 연결된다. 이는 THR_BOUND 상태에서 Solaris 쓰레드를 생성하는 것과 마찬가지이다. 대체 시그널 스택을 제공하기 위해, 또는 Realtime 스케줄링과 함께 특수 스케줄링 속성을 사용하기 위해 쓰레드를 연결할 수 있다. 모든 스케줄링은 운영 환경에 의해 수행된다.

 

> 취소 (cancellation)
쓰레드 취소 기능을 통해 쓰레드는 해당 프로세스에서 여타 다른 쓰레드의 실행을 종료시킬 수 있다. 타깃 쓰레드(취소 대상)는 취소 요청을 보류시키고, 취소 통보 시 실행되는 애플리케이션별 삭제(cleanup) 작업을 수행하게 된다.
pthread 취소 기능은 비동기식 또는 유예식(deferred) 쓰레드 종료가 지원된다. 비동기식 취소는 언제든지 실행될 수 있지만, 유예식 취소는 지정된 시점에서만 실행된다. 유예식 취소가 기본 타입으로 설정된다.

 

> 동기화
동기화는 동시적으로 실행되는 쓰레드를 위해 공유 데이터에 대한 프로그램 플로우 및 액세스를 제어할 수 있도록 지원한다.
상호 배제 락(mutex lock), 읽기 · 쓰기 락(read · write lock), 조건 변수(condition variables), 세마포어(semaphore) 등 4가지 동기화 모델이 제공된다.

 

상호 배제 락(mutex)은 한번에 1개의 쓰레드만 특정 코드 섹션을 실행하거나 특정 데이터에 액세스하도록 허용한다.

읽기 · 쓰기 락은 보호되는 공유 자원에 대해 동시 읽기 및 배타적 쓰기를 허용한다. 자원을 변경하기 위해, 쓰레드는 먼저 배타적 쓰기 락을 확보해야 한다. 배타적 쓰기 락은 모든 읽기 락이 해제되기 전까지는 허용되지 않는다.

 

조건 변수는 특정 조건이 true가 될 때까지 쓰레드를 차단한다.

카운팅 세마포어는 일반적으로 자원에 대한 액세스를 조정한다. 카운트는 세마포어에 액세스할 수 있는 쓰레드 수에 대한 제한 값이다. 카운트에 도달하면 세마포어는 차단된다

애플리케이션 개발자들에게 있어, Solaris 64비트와 32비트 운영 환경 간의 가장 큰 차이점은 사용되는 C-언어 데이터 타입 모델이다. 64비트 데이터 타입은 long 및 포인터가 64비트폭인 LP64 모델을 사용한다. 기타 모든 기본 데이터 타입은 32비트 구현을 그대로 유지하고 있다. 32비트 데이터 타입은 int, long 및 포인터가32비트인 ILP32 모델을 사용한다.

 
다음은 64비트 환경의 주요 특징과 사용 시 고려사항에 대해 간략하게 설명한 것이다.
 
대형 가상 어드레스 공간
 

64비트 환경의 경우, 프로세스는 최고 64비트의 가상 어드레스 공간 또는 18exabyte를 가질 수 있다. 이는 현재 32비트 프로세스의 최대값인 4GB의 40억 배에 해당한다. 그러나, 일부 플랫폼들은 하드웨어 제한으로 인해 풀 64비트 어드레스 공간을 지원하지 못할 수도 있다. 대형 어드레스 공간으로 기본 설정된 스택 크기(32비트의 경우 1MB, 64비트의 경우 2MB)에서 생성할 수 있는 쓰레드 수도 증가하게 된다. 기본 설정된 스택 크기에서 쓰레드 수는 32비트 시스템의 경우 약 2,000개, 64비트 시스템의 경우 약 8조 개에 달한다.

 
커널 메모리 리더
 

커널은 내부적으로 64비트 데이터 구조를 사용하는 LP64 객체이기 때문에 libkvm, /dev/mem 또는 /dev/kmem을 사용하는 기존 32비트 애플리케이션은 제대로 작동할 수 없으며 64비트 프로그램으로 전환해야 한다.

 
/proc 제약 조건
 

/proc을 사용하는 32비트 프로그램은 32비트 프로세스를 볼 수 있지만 64비트 프로세스를 이해할 수는 없다. 따라서, 프로세스를 설명한 기존 인터페이스 및 데이터 구조는 관련 64비트 프로세스를 포함할 수 있는 충분한 크기를 가지고 있지 않다. 이러한 프로그램들은 32비트 및 64비트 프로세스 모두에서 작동할 수 있도록 64비트 프로그램으로 재컴파일 되어야 한다.

 
64비트 라이브러리
 

32비트 애플리케이션은 32비트 라이브러리와 연결되어야 하며, 64비트 애플리케이션은 64비트 라이브러리와 연결되어야 한다. 노후된 라이브러리를 제외한 모든 시스템 라이브러리는 32비트 및 64비트 버전으로 제공된다. 그러나 그 어떤 64비트 라이브러리도 정적인 형태로 제공되지는 않는다.

 
64비트 계산
 

64비트 계산 방식은 과거의 32비트 Solaris 버전에서도 오랫동안 사용되어 왔지만, 64비트 구현은 정수 연산 및 파라미터 전달(parameter passing)을 위해 완전 64비트 머신 레지스터를 제공한다.

 
대용량 파일(Large File)
 

애플리케이션이 대용량 파일 지원 만을 요구하는 경우, 32비트를 그대로 유지하면서 Large File 인터페이스를 사용할 수도 있다. 그러나, 64비트 기능을 완전히 활용하기 위해서는 애플리케이션을 64비트로 변환하는 것이 효과적이다

오라클의 물리적인 백업 방법의 하나인 Hot Backup은 열린 백업(Open Backup) 이라고 불리며 사용중인 오라클 서버를 중단하지 않은 상태에서 각각의 테이블스페이스 별로 데이터파일을 백업 받는 방법 입니다.

이를 위해서는 두 가지 조건이 충족되어야 하는데 Archive Mode로 DB가 운용되어야 하며 ARCH Background Process가 활성화 되어 있어야 합니다.

Hot Backup을 실행하는 동안 많은 Redo log가 발생할 수 있는데 LGWR가 백업하는 동안 데이터 파일의 변경된 블록 이미지를 Redo log File에 기록하기 때문에 발생 합니다. 그러므로 DBA는 적절한 크기의 Redo Log나 Redo Log Buffer 크기를 지정해야 합니다.

---------------------------------------------------------------------------------------------------

●델타 백업

PC 데이터의 풀 백업은 최초 설치 후 단 한 차례만 수행된다. 그 이후에는 ‘델타 백업(Delta Backup)’이라 불리는 블록 단위의 인크리멘털 백업 기술을 사용한다. 델타 백업을 사용하는 경우 변경된 파일 전체를 백업하는 것이 아니라 파일 안에서 변경된(또는 추가된) 페이지 블록만을 백업하기 때문에 백업 시간과 저장공간을 극단적으로 절약할 수 있다. 약 3GB의 데이터가 저장된 PC 환경에서 평균적인 일일 단위 델타 백업 데이터량은 약 800KB에 불과하다. 이는 100Mbps LAN 환경에서 불과 0.2초의 짧은 시간에 백업이 가능한 분량이다.

그림 4는 델타 백업의 원리와 그 효과를 설명하고 있다. 그림에서 확인할 수 있는 것처럼 매일마다 업데이트되는 파일을 전체 백업 또는 증분 백업을 사용하는 경우 파일 전체를 반복적으로 백업할 수밖에 없는데 반해, 델타 백업을 사용하는 경우 1회 전체 백업 이후로는 변경된 블록만을 백업하기 때문에 백업 속도를 향상시키고 스토리지 사용량도 대폭 절감할 수 있다.


한번 클릭으로 백업과 복구
: 윈도탐색기에 통합된 백업 메뉴를 사용하여 사용자가 백업된 데이터를 확인하고 특정 파일 또는 폴더를 간편하게 백업/복구할 수 있는 기능이 추가적으로 제공된다.

●적용을 위한 용량 및 백업 소요시간 산정

지금까지 설명한 여러 가지 기술을 적용하는 경우 백업에 소요되는 자원을 얼마나 절감할 수 있는지 가상의 구성사례를 통해 확인해 보기로 하자. 평균 데이터 크기가 3GB인 200대의 PC 클라이언트를 백업하고자 하는 경우의 예상 디스크 용량과 백업 소요시간을 산정한 사례는 그림 7과 같다. 싱글 인스턴스 스토리지를 사용한 최초 백업은 단 한 차례만 수행되며, 그 이후로는 델타 백업을 사용하여 백업이 수행된다.

·최초 백업

넷백업 프로페셔널 구성 후 최초 백업을 수행하는 경우 각 PC의 데이터가 전체 백업의 형태로 백업 서버에 전달된다. 이때 싱글 인스턴스 스토리지가 동작하며 일반적인 구성의 경우 그림 7에서 볼 수 있는 것과 같이 약 80%의 디스크 공간과 백업 시간을 절감해 주는 효과가 있다. 결과적으로 약 200대의 PC를 백업하는 환경에서도 약 120GB의 디스크 공간과 10시간 이내의 백업 시간으로 충분히 전체 백업이 가능하다.

·일일 백업

전체 백업은 최초에 단 한 차례만 수행된다. 그 이후에는 백업 보관 기간에 상관없이 델타 백업만을 사용한 백업이 수행된다. 앞에서 설명한 바와 마찬가지로, 3GB 데이터를 가진 일반적인 PC에서 일별로 델타 백업 기술을 사용하여 백업되는 데이터 사이즈는 평균 800KB에 불과하다. 약 200대의 PC를 백업하는 환경에서는 일일 백업 데이터 증가량이 약 160MB로 충분하며, PC별로 백업되는 시간은 전송시간이 약 0.2초에 불과할 정도로 매우 짧다.

·백업 서버 용량

약 200대의 PC를 백업하고자 하는 경우에도 1, 2개의 CPU와 200GB 미만의 하드디스크가 장착된 1대의 서버만으로 데이터 보호가 가능하다.

결론

넷백업 프로페셔널은 기업 단위의 데스크톱 백업 솔루션으로서, 관리대상 PC 대수에 관계없이 관리자와 사용자의 관리비용을 최소화할 수 있도록 설계되었다는 점에서 클라이언트 지향적인 다른 기업 솔루션들과 차별성을 갖는다.

·IT 지원 비용의 최소화: 넷백업 프로페셔널은 설치가 매우 간단할 뿐 아니라 사용자들을 대상으로 하는 교육이나 기술지원이 전혀 필요 없을 정도로 쉽게 사용할 수 있다. 사용자들은 사무실 환경이든 이동 환경이든 백업에 대해 전혀 개인적인 관리를 하지 않아도 무방하며, 중앙의 관리자 역시 최소한의 리소스만으로도 그룹 단위, 정책 기반의 관리가 가능하다.

·하드웨어 비용의 최소화/백업 시간의 최소화: 싱글 인스턴스 스토리지, 델타 백업 등의 기술을 사용함으로써 데스크톱 백업에 필요한 디스크 사용량과 백업 시간을 혁신적으로 절감하게 해 준다.

·데이터 복구 비용의 최소화: 넷백업 프로페셔널의 PC 자동복구 기능을 사용함으로써 PC 장애 발생 시 복구에 사용되는 관리 리소스와 시간을 최소한으로 절감할 수 있다.

다양한 옵션을 통한 관리 유연성 제공: 오픈 파일 백업, 다이얼업 유저를 위한 프로파일 제공, 암호화, 압축 기능, 다양한 리포트, PC 이벤트와 연동한 스케줄링, 캘린더 형태의 인터페이스를 사용한 스케줄링 기능 등 사용자 환경에 최적화된 관리를 위한 다양한 옵션을 제공한다.


다양한 옵션을 통한 관리 유연성 제공: 오픈 파일 백업, 다이얼업 유저를 위한 프로파일 제공, 암호화, 압축 기능, 다양한 리포트, PC 이벤트와 연동한 스케줄링, 캘린더 형태의 인터페이스를 사용한 스케줄링 기능 등 사용자 환경에 최적화된 관리를 위한 다양한 옵션을 제공한다.


+ Recent posts