달력

3

« 2024/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2007. 5. 15. 17:33

Sun 서버 DNS 설정하기 그거/Tech2007. 5. 15. 17:33


01. /etc/nsswitch.dns 파일을 /etc/nsswitch.conf 파일로 copy 한다.
  $ cp /etc/nsswitch.dns /etc/nsswitch.conf

02. /etc/resolve.conf 파일을 vi로 열어서 nameserver <ip address> 를 적어준다.
  $ vi /etc/resolv.conf
     nameserver <ip address>

03. 제대로 설정되었는지 테스트 해본다.
  $ ping sunsolve.sun.com
    sunsolve.sun.com is alive

끝.


:
Posted by 뽀기
2007. 5. 4. 10:17

[펌] SUN 사용 설명서 그거/Tech2007. 5. 4. 10:17

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이 있어야 한다

출처 : Tong - [데이비드]님의 # Solaris통

:
Posted by 뽀기
2007. 4. 16. 14:37

SunOS5.9에 Mysql 설치하기 그거/Tech2007. 4. 16. 14:37

System Configuration:  Sun Microsystems  sun4u

SunOS 5.9
Generic_118558-38
sun4u sparc SUNW,
Ultra-Enterprise
E3500

2 CPU 64bit
Memory size: 4096 Megabytes

1. http://www.sunfreeware.com/programlistsparc9.html#mysql 사이트에서 mysql을 다운로드 받는다.
   ftp://ftp.sunfreeware.com/pub/freeware/sparc/9/mysql-5.0.27-sol9-sparc-local.gz

2. 위 페이지에서 잘 읽어 보면 libgcc-3.4.6 or gcc-3.4.6, ncurses, zlib, shutil 등도 설치해야 됨을 알 수 있다.
   해당 파일들도 같이 받는다.
   ncurses : ftp://ftp.sunfreeware.com/pub/freeware/sparc/9/ncurses-5.6-sol9-sparc-local.gz
   zlib    : ftp://ftp.sunfreeware.com/pub/freeware/sparc/9/zlib-1.2.3-sol9-sparc-local.gz
   libgcc  : ftp://ftp.sunfreeware.com/pub/freeware/sparc/9/libgcc-3.4.6-sol9-sparc-local.gz
   shutils : ftp://ftp.sunfreeware.com/pub/freeware/sparc/9/shutils-2.0.15-sol9-sparc-local.gz

   여기서 libgcc는 gcc 3.4.6이 이미 설치되어 있을 경우에 따로 설치하지 않아도 된다.

3. 위에서 다운로드 받은 파일들의 압축을 푼다.
   $ gzip -d *.gz
   $ ls
     zlib-1.2.3-sol9-sparc-local
     mysql-5.0.27-sol9-sparc-local
     shutils-2.0.15-sol9-sparc-local

    
4. 압축을 풀어서 나온 pkg 파일들을 pkgadd 명령어를 이용해서 설치한다.

   $ pkgadd -d zlib-1.2.3-sol9-sparc-local
   $ pkgadd -d mysql-5.0.27-sol9-sparc-local
   $ pkgadd -d shutils-2.0.15-sol9-sparc-local

   각 pkg를 설치할 때 설치할거냐고 물어보면 all 또는 enter를 치면 되고, 중간에 사용중인데 설치할거냐고 또 물어보면 y를 입력하면 된다.
   이제 기다리면 pkg의 설치가 끝난다.

5. mysql이 설치되었으면 /usr/local/mysql 디렉토리를 확인한다.
   $ls /usr/local/mysql
    bin/         info/        libexec/     mysql-test/  sql-bench/
    include/     lib/         man/         share/       var/

6. /usr/local/mysql/bin 디렉토리에 가서 "mysql_install_db" 명령어를 실행한다.
   $/usr/local/mysql/bin/mysql_install_db

   위 명령어를 실행하면 DB가 설치된다.

7. 위 명령어를 실행하다가 library 관련 오류가 발생하면 아래 명령어를 이용해 필요한 library를 확인하고 설치한다.
   $ ldd /usr/local/mysql/bin/mysql
        libncurses.so.5 =>       /usr/local/lib/libncurses.so.5
        libmysqlclient.so.15 =>  /usr/local/mysql/lib/mysql/libmysqlclient.so.15
        librt.so.1 =>    /usr/lib/librt.so.1
        libgen.so.1 =>   /usr/lib/libgen.so.1
        libsocket.so.1 =>        /usr/lib/libsocket.so.1
        libnsl.so.1 =>   /usr/lib/libnsl.so.1
        libssl.so.0.9.8 =>       /usr/lib/libssl.so.0.9.8  - 잘못된 ELF 클래스: ELFCLASS64
        libcrypto.so.0.9.8 =>    (파일이 없음)
        libz.so =>       /usr/local/lib/libz.so
        libstdc++.so.6 =>        /opt/gcc/lib/libstdc++.so.6
        libm.so.1 =>     /usr/lib/libm.so.1
        libgcc_s.so.1 =>         /opt/gcc/lib/libgcc_s.so.1
        libc.so.1 =>     /usr/lib/libc.so.1
        libssl.so.0.9.8 =>       /usr/lib/libssl.so.0.9.8  - 잘못된 ELF 클래스: ELFCLASS64
        libcrypto.so.0.9.8 =>    (파일이 없음)
        libaio.so.1 =>   /usr/lib/libaio.so.1
        libmd5.so.1 =>   /usr/lib/libmd5.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        libmp.so.2 =>    /usr/lib/libmp.so.2
        /usr/platform/SUNW,Ultra-Enterprise/lib/libc_psr.so.1
        /usr/platform/SUNW,Ultra-Enterprise/lib/libmd5_psr.so.1

     위와 같이 나왔다면
     "libgcrypt-1.2.2-sol9-sparc-local", "openssl-0.9.8e-sol9-sparc-local" 두가지 library가 없어서 발생한 오류이다.
  www.sunfreeware.com 에서 해당 library를 다운로드 받아서 설치한다.

8. 필요한 library를 다 설치하고 DB까지 설치한 후에 .profile을 열어서 PATH 정보를 수정한다.
   $ vi .profile
   export PATH=$PATH:/usr/local/mysql/bin

7. 환경설정 정보를 reload 한다.
   $ . .profile

8. mysql을 실행한다.
   $ nohup /usr/local/mysql/bin/mysqld_safe --user=mysql &

:
Posted by 뽀기
2007. 4. 16. 14:21

SunOS 5.9에 vim7.0 설치하기 그거/Tech2007. 4. 16. 14:21

System Configuration:  Sun Microsystems  sun4u

SunOS 5.9
Generic_118558-38
sun4u sparc SUNW,
Ultra-Enterprise
E3500

2 CPU 64bit
Memory size: 4096 Megabytes

1. www.sunfreeware.com 사이트에서 vim7.0 을 다운로드 받는다.
   ftp://ftp.sunfreeware.com/pub/freeware/sparc/9/vim-7.0-sol9-sparc-local.gz
2. 다운로드 받은 파일의 압축을 푼다.
   $ gzip -d vim-7.0-sol9-sparc-local.gz
3. 압축을 풀면 pkg 파일이 나온다.
   $ ls
     vim-7.0-sol9-sparc-local

4. 위의 pkg 파일을 pkgadd 명령어를 이용해서 설치한다.
   $ pkgadd -d vim-7.0-sol9-sparc-local
   위와 같이 실행하면 설치할거냐고 물어본다. 그러면, 그냥 enter 친다.
   그리고, 조금 있다가 /usr/bin, /usr/local/bin 등 사용하고 있는데 설치할거냐고 물어보면
   그냥 y 눌러준다.
   조금 기다리면 파일들 복사하고 혼자 설치 잘 하고 마지막에 "클래스 검증" 어쩌고 하면서 끝난다.
   설치가 완료됐다.
   설치는 "/usr/local/share/vim/vim70" 디렉토리에 된다.
5. vim(실행파일)은 /usr/local/bin 디렉토리 밑에 복사된다.
   vim 명령어를 실행해본다.
   $ /usr/local/bin/vim
6. 아래와 같이 빈 화면에 글씨가 나온다면 성공적으로 설치가 됐다.

                     VIM - Vi IMproved
   ~
   ~                     version 7.0
   ~                by Bram Moolenaar et al.
   ~      Vim is open source and freely distributable
   ~
   ~            Help poor children in Uganda!
   ~     type  :help iccf<Enter>       for information
   ~
   ~     type  :q<Enter>               to exit
   ~     type  :help<Enter>  or  <F1>  for on-line help
   ~     type  :help version7<Enter>   for version info
   ~
   ~             Running in Vi compatible mode
   ~     type  :set nocp<Enter>        for Vim defaults
   ~     type  :help cp-default<Enter> for info on this

   ~

7. 실행이 제대로 안될경우 아래 명령어를 통해서 필요한 library들이 뭐가 있는지 확인한 후에
   없는 library 들을 추가로 설치해준다.
   (library들은 www.sunfreeware.com 에서 다운로드 받을 수 있다.)
  
   $ ldd /usr/local/bin/vim
        libgtk-1.2.so.0 =>       /usr/local/lib/libgtk-1.2.so.0
        libgdk-1.2.so.0 =>       /usr/local/lib/libgdk-1.2.so.0
        libgmodule-1.2.so.0 =>   /usr/local/lib/libgmodule-1.2.so.0
        libglib-1.2.so.0 =>      /usr/local/lib/libglib-1.2.so.0
        libXext.so.0 =>  /usr/lib/libXext.so.0
        libm.so.1 =>     /usr/lib/libm.so.1
        libXt.so.4 =>    /usr/lib/libXt.so.4
        libX11.so.4 =>   /usr/lib/libX11.so.4
        libSM.so.6 =>    /usr/lib/libSM.so.6
        libICE.so.6 =>   /usr/lib/libICE.so.6
        libncurses.so.5 =>       /usr/local/lib/libncurses.so.5
        libnsl.so.1 =>   /usr/lib/libnsl.so.1
        libsocket.so.1 =>        /usr/lib/libsocket.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        libc.so.1 =>     /usr/lib/libc.so.1
        libmp.so.2 =>    /usr/lib/libmp.so.2
        /usr/platform/SUNW,Ultra-Enterprise/lib/libc_psr.so.1

 
 위 결과는 제대로 설치됐을 경우의 화면이다.
 제대로 설치가 안되면  "=>" 이거 오른쪽에 있는 so 파일들의 정보가 아래 처럼 제대로 보이지 않는다.
    libgtk-1.2.so.0 =>       잘못된 ELF 클래스: ELFCLASS64

:
Posted by 뽀기
2007. 4. 16. 14:07

SunOS 5.9에 gcc 설치하기 그거/Tech2007. 4. 16. 14:07

System Configuration:  Sun Microsystems  sun4u

SunOS 5.9
Generic_118558-38
sun4u sparc SUNW,
Ultra-Enterprise
E3500

2 CPU 64bit
Memory size: 4096 Megabytes

  1. internet에서 "Solaris 9-GCC-3.4.6.tar.zip" 파일을 찾아서 다운로드 받는다.
     (나도 어디서 받았는지 잊어버렸다.)
  2. 압축을 푼다.
     $ gzip -d Solaris 9-GCC-3.4.6.tar.zip
     $ tar -xvf Solaris 9-GCC-3.4.6.tar
     $ ls
       gcc

  3. 압축을 풀면 나온 "gcc" 디렉토리를 "/opt" 밑으로 복사한다.
     $ cp -rp gcc /opt

  4. .profile 파일을 열어서 아래 내용을 설정해준다.
     $vi .profile
     export PATH=/opt/gcc/bin:$PATH
     export LD_LIBRARY_PATH=/opt/gcc/lib:/opt/gcc/lib/sparcv9:$LD_LIBRARY_PATH

Solaris 9-GCC-3.4.6.tar.zip
이 파일만 찾아라 그러면 쉽다!!

:
Posted by 뽀기
2007. 4. 16. 13:57

SunOS 5.9에 64bit JDK 1.5.0.11 설치 그거/Tech2007. 4. 16. 13:57

# 시스템 환경#
System Configuration:  Sun Microsystems  sun4u
SunOS 5.9
Generic_118558-38
sun4u sparc SUNW,
Ultra-Enterprise
E3500
2 CPU 64bit
Memory size: 4096 Megabytes

  1. http://java.sun.com/javase/downloads/index_jdk5.jsp 이 페이지에서
     JDK 5.0 Update 11 이 항목에 대해서 "Download" 페이지로 이동한다.
  (https://sdlc2b.sun.com/ECom/EComActionServlet;jsessionid=BFB2B91425F47264276E3456F4BB5B03 여기로 이동하면 된다.)

  2. 위에서 이동한 페이지에서 license 동의할 거냐고 물어보는 곳에서 "Accept"를 선택해준다.
     그러면 화면이 또 이동한다.
  (https://sdlc2b.sun.com/ECom/EComActionServlet/DownloadPage:~:com.sun.sunit.sdlc.content.DownloadPageInfo;jsessionid=BFB2B91425F47264276E3456F4BB5B03;jsessionid=BFB2B91425F47264276E3456F4BB5B03 여기로 이동)

  3. 위에서 이동한 페이지에서 세번째에 있는 "Solaris SPARC Platform - J2SE(TM) Development Kit 5.0 Update 11)" 에서
     "Solaris SPARC 32-bit self-extracting file" 이 파일과 " Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support)" 이 파일을 다운로드 받는다.

  4. 위에서 다운 받은 "jdk-1_5_0_11-solaris-sparc.sh", "jdk-1_5_0_11-solaris-sparcv9.sh" 파일 중에서
     "jdk-1_5_0_11-solaris-sparc.sh" 파일을 먼저 설치하고, "jdk-1_5_0_11-solaris-sparcv9.sh" 파일을 나중에 설치해준다.
  (다운받는 페이지에서 나왔듯이 self-extracting 파일이므로 아래와 같이 실행하면 알아서 설치해준다.)
  $ sh jdk-1_5_0_11-solaris-sparc.sh
  $ sh jdk-1_5_0_11-solaris-sparcv9.sh

  5. 위 두 파일을 설치하고 나면 64bit 용 jdk 1.5가 설치완료된다.

  6. 설치가 끝났으면 PATH에 위에서 설치한 JDK 1.5의 실행파일이 있는 bin 디렉토리를 추가해준다.
     $ vi ~/.profile
      export JAVA_HOME=/usr/jdk1.5.0_11
      export PATH=$JAVA_HOME/bin:$PATH

  7. .profile 파일을 저장하고 환경을 reload 해준다.
     $ . .profile

  8. 위에서 $JAVA_HOME/bin 을 해준 후에 설치된 jdk 의 버전을 확인한다.
     $ java -version
     java version "1.5.0_11"
     Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
     Java HotSpot(TM) Server VM (build 1.5.0_11-b03, mixed mode)
     HIT-TEST@root[/usr/jdk1.5.0_11/bin]# echo $PATH

  9. 64bit용 JDK를 사용하고 싶다면 PATH에 아래와 같이 추가해주면 된다.
     $ vi ~/.profile
     export JAVA_HOME=/usr/jdk1.5.0_11
     export PATH=$JAVA_HOME/bin/sparcv9:$PATH

  10. 위와 같이 추가한 후에 JDK의 버전을 확인해본다.
     $ java -version
     java version "1.5.0_11"
     Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
     Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_11-b03, mixed mode)

:
Posted by 뽀기