Solaris

시스템 관리 / 솔라리스 백업 복구

알 수 없는 사용자 2008. 3. 10.
728x90
1] 디스크의 백업 및 복구

가. 백업의 필요성


여러분의 시스템에는 거의 매일 많은 양의 새로운 데이터가 생성되고 있을 것이다. 이 데이터들은 무슨 이유에서든지 전부 가치 있는 것들이다. 만일 이 데이터들의 일부 혹은 전부를 잃어버렸다면 이 데이터를 살리기 위해서는 노력과 시간 혹은 돈을 들여야 할 것이다. 어떤 경우에는 잃어버린 데이터는 영영 복구 불가능한 것일 수도 있다. 어떤 데이터든지 생성된 순간부터 그것을 잃지 않도록 준비를 해야만 한다.

따라서 시스템 관리자의 가장 중요한 임무중의 하나는 시스템의 데이터를 시스템 장애, 자연적으로 발생하는 재난 그리고 우발적으로 일어날 손실로부터 시스템을 보호하는 것이다.

기본적으로 데이터를 잃어버리게 되는 요인은 다음과 같다.
  • 우연한 파일 삭제
  • 시스템 내부 장애
  • 시스템 외부 장애

사람은 언제나 믿을 수 없는 존재이다. 언제 실수를 저지를 지 모를 뿐 아니라 고의로 데이터를 망치려는 경우 또한 많이 있을 것이다. 하드웨어 또한 완전히 믿을만한 것은 아니다. 중요한 데이터가 보관되는 하드웨어중 가장 핵심적인 것은 하드 디스크일 것이다. 그렇지만 하드디스크 드라이브에는 움직이는 부분이 있어, 가끔 이런 부분에서 장애가 발생한다. 이런 시스템 내부 문제뿐 아니라 화재, 정전 등 우리의 외부에는 언제 어떤 재앙이 있을지 알 수 없는 일이다.

백업이란 보통 파일이 이동되거나 제거되었을 때 원본을 손실하게 될 경우를 대비하여 복사해 두는 것을 의미한다. 이런 재앙에 대해 미리미리 대비를 하기 위해 주기적으로 데이터를 여러 개 복사해 둔다면 시스템의 갑작스런 재앙에 대해 당황하지 않아도 될 것이다.

나. 일반적인 백업 및 복구 이론

1) 백업 매체 선택

현재 가장 많이 쓰이는 백업 매체는 테이프, 디스크 드라이브, 플로피 디스켓, Zip 드라이브, 다시 쓸 수 있는 CD 등이 있다.

어떤 매체를 선택할 것인지에 대해서는 고려해야 할 많은 사항들이 있는데, 먼저 비용면을 고려해 보면 같은 비용으로 더 많은 양의 데이터를 저장할 수 있는 쪽이 백업에는 유리 할 것이다. 이유는 물론 저장할 데이터의 양이 많은 것도 문제가 되지만 보통 백업은 일주일에 한번씩 전체 백업을 하고 하루에 한번씩 새로 추가된 부분만 백업을 하는 것이 보통이다. 그래서 평균 6개 정도의 매체를 가지고 일주일의 분량을 백업하는데 사용하고 다음주에 새로 그 위에 덮어 씌우는 식으로 백업을 수행한다. 만약 6개 이상의 매체가 있다면 더 오래된 시점의 백업 자료를 보관할 수 있기 때문에 최근의 전체 백업 자료가 파손이 되어도 많은 데이터의 손실은 피할 수 있을 것이다.

이 외에도 매체를 선택하는데 고려해야 할 사항은 이식성, 사용의 편의성, 전송속도 등이 있고 무엇보다도 가장 중요한 것은 신뢰성을 고려해야 한다. 백업 데이터가 다른 시스템에서는 사용가능하지 않다면 문제가 있을 것이다. 또한 백업을 하는데 얼마나 쉽게 할 수 있는 지도 문제가 될 것이다. 백업하기가 지겨울 정도로 쓰기 불편하다면 곤란 할 것이다.

이런 사항들을 고려해 볼 때 가장 많이 사용되는 매체로 테이프가 있다. 테이프는 값이 적당하고 상당히 신뢰성이 좋으며 속도도 상당히 빠르며 편리하기까지 하다.

2) Standard Solaris 툴

솔라리스에서 백업을 수행하는 데에 가장 많이 사용되는 tool로는 tar, dd, cpio. ufsdump와 ufsrestore 가 있다

① tar 사용하기
tar는 tape archive를 만들거나 tape archive에 포함된 파일을 뽑아내는데 사용된다. tar를 사용하면 단일 혹은 다중 파일을 한 디렉토리 구조에 백업 할 수 있다. tar 에는 다양한 많은 옵션들이 있다. 옵션에 대한 설명을 보려면 ?man tar?하여 알아보면 된다.

다음은 /opt/totalnet package의 file 들을 tar 로 만드는 예이다. 먼저 du 명령어를 사용해서 만들어질 tar 파일의 잠재적인 size를 체크 한다.
   server% cd /opt/totalnet
   server% du
   4395              ./bin
   367               ./lib/charset
   744               ./lib/drv
   434               ./lib/pcbin
   777               ./lib/tds
   5731              ./lib
   5373              ./sbin
   145               ./man/man1
   135               ./man/man1m
   281               ./man
   53                ./docs/images
   56                ./docs
   15387             .

tar 로 만들어질 파일의 크기는 15,387 블록이다. du -s 를 사용하면 세부 디렉토리를 제외한 전체의 크기만을 볼 수 있다. 이제 opt/totalnet 의 모든 서브디렉토리의 내용을 /tmp/로 tar 파일을 만들어 넣어보자.
   server% tar  -cvf  /tmp/tolnet.tar  * 

여기서 옵션을 사용할때는 ?-?를 사용하지 않아도 된다. ?c?는 새로운 저장 파일을 만든다는 의미이고 ?v?는 백업이 되고있는 파일의 목록을 보여주는 역할을 하고, ?f?는 그 다음의 인자가 생성할 저장 파일(또는 장치)의 이름이라는 것을 나타낸다.

tar 파일에서부터 내용을 다시 꺼내오기 위해서는 ?c? 옵션 대신 ?x?(extract 의미) 를 사용하면 된다.
   server% cd /tmp 
   server% tar -xvf totalnet.tar 

솔라리스에서 tar 파일은 디폴트로 압축이 되지 않는다. 압축을 하기 위해서는 solaris에서는 compress 명령어를 사용한다.
   server% compress file.tar 

위와같이 실행하고 나면 file.tar.Z 이라는 압축된 tar 파일이 생성된다. compress 대신 GNU gzip 을 사용 하면 종종 더 좋은 압축율을 얻을 수도 있다. gzip을 사용하면 file.tar.gz 이라는 압축파일이 생긴다.
   server% gzip file.tar 

Solaris 에 tar가 있지만 GNU tar 를 다운받아 설치하면 tar 파일을 압축하는데 훨씬 편리하게 될 수 있다. GNU tar 를 설치하면 다음과 같이 ?z? 옵션을 써서 한번에 tar.gz파일을 만들수 있다.
   server% tar zcvf file.tar * 

file.tar.gz 파일을 다시 풀기 위해서는 다음과 같이 실행한다.
   server% tar zxvf file.tar.gz 

그러나 백업에 있어 압축을 사용하는 것은 그다지 좋은 일이 아니다. 압축한 파일의 한 비트만 못쓰게 되면 전체 파일을 모두 잃게 된다. 따라서 압축을 하려면 파일을 몇 개로 분할해서 백업을 해 주는 것이 좋다.

② cpio 사용하기
cpio는 표준 입력으로부터 파일의 이름을 구하고, 표준 출력으로 목록명을 얻어서 하나 또는 복수개의 파일을 압축하는데 사용된다. cpio 는 3개의 다른 모드로 사용될 수 있다.
 
   copy-in   : cpio -i , 표준 입력으로 들어온 파일들을 extract 한다. 
   copy-out  : cpio -o, 표준 입력으로부터 파일을 얻어서 이들 파일을 가지고 그들의 pathname 과 함께,
              새로운 파일을 생성한다. 
   copy-pass : cpio -p, copy-out 모드와 같다. 다만 새로운 파일이 생기는 것이 아니라 디렉토리 구조를
              그대로 copy 한다는 것만 다르다. 
그 외의 옵션으로는 B - 입력/출력 레코드 블록을 5120bytes로 정하지만, 이는 -p 옵션을 사용할 때는 지원되지 않는다. c - 다른 플랫폼으로 이식할 수 있는 아스키 문자 형식으로 헤더 정보를 읽거나 쓴다. t - cpio의 내용에 관한 테이블 목록. v - 파일명 목록을 출력한다. t 옵션과 함께 사용하면 ?ls -l? 과 그 출력 양식이 같다.
cpio를 사용 예를 보면 아래와 같다.
   server% find . -print | cpio -o[aBcv] > a.list 
위의 명령어는 현재 디렉토리의 모든 파일의 이름을 표준출력으로 받아 a.list 하나로 묶인다. 여기서 a.list 파일 대신 /dev/rmt/0 같은 백업을 위한 이름을 주어도 된다.
   server% cpio -ivt < a.list 

위를 실행하면 a.list 에 묶인 파일의 목록들이 ?ls -l?결과처럼 출력된다. 다음은 a.list로 묶인 파일을 다시 복구 시켜준다.
   server% cpio -i[cdlmv] < a.list 

아래 명령은 현재 디렉토리의 내용을 디렉토리구조 그대로 directory 라는 곳의 아래에 복사한다.
   server% find . -print | cpio -p[adlmuv] directory 

③ dd 사용하기
dd명령은 가장 낮은 레벨의 데이터복사 명령어로서, 복사뿐 아니라 물리적인 레벨의 장치의 데이터 처리가 가능하다. (섹터, 블록, 트랙, 실린더, 장치 전체) dd를 사용하기 위해서는 필요한 옵션들이 있다. 이 옵션들은 '옵션=값'의 짝으로 주어진다. if 는 입력 파일을 명시하기위한 옵션이고, of 는 출력파일 명시, bs 는 입력과 출력 블록 크기를 설정한다(기본은 모두 512bytes).

예를들어 /dev/dsk/c1t0d0s0의 '/' 파티션을 /dev/dsk/c1t4d0s0 로 복사하기 위해서는 dd의 또 다른 사용은 하나의 tape 에서 다른 tape 으로 data를 백업하는 것이다. 이것은 백업 테이프를 재 생성하는데 유용할 것이다.
   server% dd if=/dev/dsk/c1t0d0s0 of=/dev/dsk/c1t4d0s0 bs=128k 

예를 들어 테이프 drive 0(dev/rmt/0) 에서 drive 2(/dev/rmt/2)로 copy 하기 위해서는 다음과 같은 명령어를 사용한다.
   server% dd if=/dev/rmt/0 of=/dev/rmt/2 

④ ufsdump 와 ufsrestore 사용하기
ufsdump 와 ufsrestore 는 Unix 파일 시스템을 백업하고 복구하기위한 표준 application이다. 백업은 파일시스템 전체나 개별적인 파일과 디렉토리의 전체 또는 추가 백업으로 할 수 있다. 기본적으로 ufsdump 는 mount 된 파일시스템을 백업할 수 있지만, 백업하고자 하는 파일 시스템을 unmount 시키고 사용하는 것이 현명할 것이다. 파일시스템을 fsck를 사용해서 check 한후 백업을 수행 하도록 한다.

ufsrestore 는 시스템이 붕괴된 후 single-user-mode 에서 사용한다.

ufsdump의 기본적인 개념은 레벨별로 구별해서 백업을 할 수 있다는 점이다.

ufsdump에서 full backup은 레벨 0 로 표현한다. 그리고 1에서 9까지는 마음대로 incremental backup 레벨로 할당해서 사용할 수 있다. 다만 한가지 제한은 높은 숫자는 매일 정상적인 incremental backup 을 수행하고 백업처리의 프로세스가 재시작 한다는 것을 명시하기 위해 한 주에 한번은 낮은 숫자를 놓는다.

예를 들면 일요일의 backup은 레벨 0을 수행하고, 월요일에서 금요일까지는 각각 5,6,7,8,9의 레벨을 가지고 백업을 수행하고, 백업 사이클의 끝을 알리기 위해 토요일에는 1부터 4까지의 숫자 중 하나를 이용한다.

ufsdump는 종종 cron 을 사용해서 시스템의 부하가 적은 저녁에 수행될 수 있도록 예약해서 사용된다. cron의 사용은 프로세스관리부분을 참조하라.

시스템의 부하가 적은 일요일쯤에 전체 백업(full backup)을 수행하고, 나머지 주중에는 증가부분에 대해서만 백업(incremental backup)을 수행하면 백업의 속도면에서도 이익을 볼 수 있고, 하나의 테이프에 각각의 날들의 작업을 분리시켜 저장할 수 있게 되므로, 원하는 날의 백업파일을 다시 복구 시킬 수 있다.

실제로 백업을 수행하기 전에 백업을 하고자 하는 파일 시스템의 size를 체크할 필요가 있다. 실제 테이프의 남은 양과 비교해서 백업이 안전하게 수행 될 수 있는 지 점검해야 할 것이다.
   server% ufsdump S /dev/rdsk/c0t0d0s4 
   50765536 

위와 같은 경우 백업을 위해서 대략 테이프에 49Mbyte 의 공간이 필요하다
   server% ufsdump 0cu /dev/rmt/0 /dev/rdsk/c0d0s0

   Dump: Writing 63 Kilobyte records
   Dump: Date of this level 0 dump: Mon Nov 20 13:26:33 2000
   Dump: Date of last level 0 dump: the epoch
   Dump: Dumping /dev/rdsk/c0d0s0 (solaris: /) to /dev/rmt/0).
   Dump: Mapping (Pass I) [regular files]
   Dump: Mapping (Pass II) [directories]
   Dump: Estimated 40998 blocks (22.95MB).
   Dump: Dumping (pass III) [directories]
   Dump: Dumping (pass IV) [regular files]
   Dump: 46996 blocks (22.95MB) on 1 volume at 1167 KB/sec
   Dump: DUMP IS DONE
   Dump: Level 0 dump on Mon Nov 20 13:26:33 2000

실제로 x86의 파티션(/dev/rdsk/c0d0s0)를 레벨 0으로 전체백업을 수행하기 위해서는 ufsdump 의 파라미터 ?0?은 레벨 0을 나타내고, ?c?는 모든 카트리지 테이프 드라이브의 블로킹 인수를 126으로 설정한다. ?u?는 /etc/dumpdates 의 파일에 dump record를 update 하라는 옵션이다. 이 dump record는 각각의 파일 시스템의 마지막 dump날짜를 유지하고 있다.

ufsdump는 멀리 떨어진 테이프 장치로 백업이나 복구를 수행할 때도 사용할 수 있다. 원격 백업을 수행하기 위해서는 /.rhosts 파일의 엔트리를 가진 시스템에(테이프 장치를 가진) 접근할 수 있는 권한이 있어야 하고, ufsdump나 ufsrestore 명령어 라인에서 server:tatp_drive를 명시한다.

예를 들어 카트리지 테이프를 사용하여 멀리 떨어진 host1의 테이프 장치에 /export/home 파일 시스템을 전체백업(레벨 0)을 하려면 아래와 같이 한다.
   server% ufsdump 0uf host1:/dev/rmt/0 /export/home 

ufsdump 를 사용해서 백업을 한 후에 ufsrestore 를 사용하여 백업한 데이터를 다시 복구할 수 있다.

/dev/rmt/0의 테이프에서 다시 데이터를 복구하기 위해서는 다음과 같이 한다.
   server% ufsrestore xf /dev/rmt/0 

   You have not read any volumes yet. 
   Unless you know which volume your file(s) are on you should start 
   with the last volume and work towards the first. 
   Specify next volume #: 1 
   set owner/mode for ?.?? [yn] 

'y'를 입력하면 모든 파일들을 복원할 수 있다. 만약 복원되는 리스트를 보기위해서는 아래와 같이 입력한다
   server% ufsrestore tf /dev/rmt/0 

ufsrestore 는 대화식 모드로 사용할 수 있다.
   Server% ufsrestore i 
   ufsrestore> 

위와 같은 상태에서 help를 입력하면 사용 가능한 commend를 볼 수 있다. 여기서 ls를 하면 덤프의 디렉토리들이 나열된다. cd 를 이용해서 덤프안의 디렉토리를 자유롭게 이동 할 수 있고, add 를 사용해 복원할 파일의 목록을 추가하고, delete 를 사용해서 목록에서 다시 삭제를 한다

그리고 extract 를 치고 엔터를 치고 나면 add로 추가한 목록들이 모두 복원이 된다. 모든 복원을 끝마치고 나서 quit를 사용해서 ufsrestore 의 대화식 모드를 빠져나간다.

위의 과정을 예를 들면 아래와 같다
   ufsrestore> ls
   2     *./            39       devices/        60847           net/
   2     *../           5122     etc/            15360           opt/
   161   .Xauthority   5120     export/         25611           proc/
   160   .rhosts       10240    home/          15831           sbin/
   ufsrestore> add .rhosts .Xauthority
   ufsrestore> delete .rhosts
   ufsrestore> extract

위와 같이 하면 선택한 .Xauthority 가 복원된다.

그외 유용한 툴

⑤ AMANDA( Advanced Maryland Automatic Network Disk Archiver)
AMANDA는 multiple client를 위해 서버가 중앙에서 백업하도록 지원을 해주는 freesoftware 백업 시스템이다.

이 시스템에서는 기본적으로 단일 테이프 드라이브를 사용하도록 하고 있으나, multiple tape 이나 다른 디바이스를 사용하도록 configuration이 가능하다. AMANDA를 사용함으로써 백업에서 얻을 수 있는 이점은 기존의 솔라리스 백업과 복구 명령으로 관리를 할수 있다는 점이다. 즉 AMANDA로 백업한 파일들은 일반 tar로 볼 수 있는 tar 파일이다. 이것은 AMANDA가 어떤 이유로 사용 불가하거나, 설치되지 않은 서버에서도 복구가 가능하다는 이점을 가져온다.

http://amanda.org에서 다운받아 설치할 수 있으며, FAQ 는 http://www.ic.unicamp.br/~oliva/snapshots/amanda/FAQ 에서 찾을 수 있다.

이 시스템에서는 데이터를 백업 디바이스로 직접 전송하지 않고 백업준비파일형태로 존재하여 실제로 기록하는 프로세스가 따로 이것을 기록한다. 이것은 CD-R 테크닉을 쓸 때 유리하다. CD-R 디바이스는 쓸 준비를 빠르게 하지 못한다. 따라서 write track 이 잘못되었을 경우 새로운 디스크를 사용해야 하기 때문에 백업준비파일과 실제 기록 프로세스와의 분리는 이런 디스크의 낭비를 막아 줄 수 있다.

AMANDA의 또 다른 이점은 효율적인 dump 스케줄링을 제공한다는 점이다. 'dump cycle'이란 개념을 사용했는데, 특정 파일을 dump 하는데 드는 시간을 평가해서, dump의 전체 횟수를 최소화 한다. 지난 백업을 기반으로 해서 서로 다른 백업들의 시간의 균형을 맞추어서 백업을 실행한다.

이외에 AMANDA는 제한점도 가지고 있다. 이것은 단일 백업 매체보다 더 큰 양의 파일시스템을 할 수 없다. 이것은 즉, 큰 디스크만(최신의 DAT 나 DLP 테이프 같은)을 사용해서 백업을 해야 한다는 단점이 된다.


[2] 시스템 프로세스 관리

유닉스 시스템 사용자라면 누구나 현재 수행되고 있는 프로세스들이 무엇이고 어떤 상태인지 보고 싶은 적이 있을 것이다. 여기서는 수행되고있는 프로세스들을 어떻게 볼 수 있으며, 이들을 제어하는 방법에 대해 설명하고, 이러한 반복적인 작업을 자동화하는 방법에 대해서 설명한다.

가. 프로세스 보기와 끝내기

프로세스들의 속성을 보기 위한 명령어로는 ps 와 pgrep 을 사용하고, 프로세스를 끝내는데 사용되는 명령어로는 kill 과 pkill 이 있다

1) ps와 kill 사용하기

ps는 현재 활동하고 있는 프로세스들의 정보를 보여주는데 사용된다. 많은 관리자들은 kill 을 사용해 프로세스를 죽이기 위해서는 프로세스의 id(PID)를 알아야 하기 때문에 ps 를 사용해서 PID를 알아낸다.

ps에는 많은 옵션들이 있어 프로세스의 정보를 여러 원하는 형태로 출력되도록 사용이 가능하다. 사용 가능한 옵션들은 아래와 같다.

   -A와 -e 는 모든 프로세스를 출력 
   -a는 터미널과 관련되지 않은 프로세스와 프로세스 그룹 리더를 제외한 모든 프로세스를 출력 
   -g프로세스그룹ID 는 특정 프로세스그룹의 프로세스들을 출력 
   -G그룹ID 는 특정 그룹에 속한 user 들의 프로세스만 출력 
   -f 는 full 리스트 형식으로 출력 
   -l 는 long 리스트 형식으로 출력 
   -j 는 프로세스의 세션ID 와 프로세스 그룹ID 를 출력 
   -t 터미널디바이스패스 는 특정 터미널 디바이스 패스와 연관된 프로세스들만 출력 
   -u USER ID 는 특정 user 의 프로세스만 출력 

ps 사용 예를 보자. 옵션 없이 ps명령어만 사용한 기본 출력형태는 아래와 같다.
   $ ps
     PID  TTY      TIME CMD
    10071 pts/5      0:00 bash

여기서 나타나는 PID 는 프로세스의 ID 를 나타내고 TTY는 터미널 디바이스를, TIME 는 수행시간을 CMD 는 프로세스가 수행하는 프로그램이나 명령어를 나타낸다. 몇 가지 사용 예를 더 살펴보자.
   $ps -t  pts/3
      PID TTY      TIME CMD
      441 pts/3    0:01 dtsessio
      431 pts/3    0:00 bash
      440 pts/3    0:00 ttsessio
      428 pts/3    0:00 sdt_shel

위의 명령은 터미널 디바이스 pts/5 에 관련된 프로세스들의 목록을 보여준다.
   $ps -f -tpts/3
        UID   PID  PPID  C    STIME TTY      TIME CMD
       root   441   431  0   Nov 20 pts/3    0:01 /usr/dt/bin/dtsession
       root   431   428  0   Nov 20 pts/3    0:00 -bash -c
       root   440     1  0   Nov 20 pts/3    0:00 /usr/dt/bin/ttsession
       root   428   384  0   Nov 20 pts/3    0:00 /usr/dt/bin/sdt_shell

-f 옵션을 사용한 full 리스트는 위와 같이 출력되며 여기서의 UID는 user ID 이고, PPID 는 parent PID 를, C는 소모한 프로세서의 이용시간을 나타내고 STIME 은 프로세스 시작날짜를 나타내 준다.

kill 명령어를 사용하면 ps를 통해서 알아낸 PID 를 가지고 프로세스에게 시그널을 보내 프로세스를 중지시킬 수 있다. 사용 방법은 kill ?signal값 PID 와 같이 사용한다.

kill 명령어를 사용해서 프로세스에게 보낼 수 있는 시그널의 종류는 다음과 같고, 모든 시그널을 받았을 때 프로세스는 기본적으로 프로세스를 끝내는 것으로서 시그널에 응답한다.
     Symbol           Value     Description
     SIGHUP             1         Hangup
     SIGINT             2         Interrupt
     SIGKILL            9         kill
     SIGTERM           15         Terminate
     SIGUSR1           16         User signal 1
     SIGUSR2           17         User signal 2

kill 명령어로 프로세스에게 시그널을 보낼 때는 시그널의 symbol 이나 Value 둘 다 사용 가능하다. 아래의 예는 둘 다 같은 결과를 가진다.
   $ kill -SIGKILL 4220 4224 4229 
   4229 Killed 
   4224 Killed 
   4220 Killed 

   $kill -9 4220 4224 4229 
   4229 Killed 
   4224 Killed 
   4220 Killed 

2) pgrep 과 pkill 사용하기

ps 와 kill 외에 프로세스를 보고 프로세스에게 시그널을 보내는 명령어로 pgrep 과 pkill 이 있다. 이 명령어 들은 UID 나 GID 같은 특정 attribute 들에 속하는 프로세스들의 목록을 볼 수 있을 뿐 아니라 regular expression을 사용해서 특정패턴을 가지고 특정 프로세스들을 보거나 종료 시킬 수 있다.

예를 들면 ps를 사용해서 adimintool 을 실행하고 있는 프로세스를 찾기 위해서는 다음과 같이 한다.
   $ ps -eaf | grep admintool 
   root 2898 1096 0 Sep 04 pts/7 0:02 admintool 

이것을 pgrep을 사용하면 아래 같이 간단하다.
   $ pgrep adm* 
   2898 

다만 pgrep 을 사용하면 PID 만이 출력된다. 프로그램의 이름까지 출력하고자 할 경우 -l 옵션을 사용하면 PID 와 프로그램이름을 같이 볼 수 있다.

이 외에도 pgrep 에서 사용되는 옵션으로는 -f 하면 패턴을 프로그램의 이름에서만 매치시키는 것이 아니라 모든 argument 에서 패턴과 매치되는 프로세스들을 출력시켜준다.

-n은 매치되는 프로세스들 중에서 가장 최근에 생긴 프로세스 하나만을 보여주고, -x는 패턴과 정확히 매치된 프로세스만 보여준다.

특정 ID 를 가진 프로세스를 찾기 위해서 사용하는 옵션들은 ?g(Process Group ID), -G(Real Group ID), -P(Parent Process ID), -s(Process Session ID), -t(Terminal Device Path), -U(Real User ID) 등이 있다.

그리고 pgrep 이 PID를 출력할 때는 디폴트로 한 줄에 하나의 PID 를 출력한다. 많은 프로세스들이 출력될 때는 한꺼번에 화면이 빠르게 넘어가기 때문에 보기가 불편할 것이다. 이럴때 -d 옵션을 사용하면 유용하다. d옵션 뒤에 표시된 것을 구분자로 해서 PID 가 출력된다.
   $ pgrep -d ',' -u dla 
   781, 782, 910, 913 

pkill 명령어도 pgrep 명령어와 사용법이 유사하다. 다만 PID 를 출력해주는 대신에 매치되는 프로세스들을 SIGTERM(15) 를 사용해서 종료시켜 준다. SIGTERM 대신에 특정 signal을 명시해서 사용해도 무방하다.

사용되는 옵션들은 pgrep 과 같다. 다음은 user ID 가 dla 인 프로세스들을 종료시켜준다.
   $ pkill -KILL -u dla 

나. 프로세스 Scheduling

1) cron 사용하기

시스템 관리자와 사용자들은 주기적으로 일어나는 작업에 대해서 매일매일 수동으로 수행하기 보다는 때가 되면 자동으로 원하는 작업이 정기적으로 실행되길 원한적이 있을 것이다.

cron 은 미래에 실행할 작업을 주기적으로 수행하도록 스케줄할 수 있게 해준다. cron은 시스템이 부팅될 때 시작되는 데몬이다. cron 데몬은 crontab 파일을 참조해서 파일 안에 명시된 작업을 규정된 시간에 수행한다. crontab 파일은 /var/spool/cron/crontabs 디렉토리에서 읽어서 수행한다. 다른 시스템과 마찬가지로 cron 의 행위를 setting 할 수 있는데, 이들 setting 들은 /etc/default/cron 파일에 명시되어 있다.

cron 명령은 디폴트로 로그파일을 기록하도록 아래와 같이 /etc/default/cron 파일에 설정되어 있다.
   CRONLOG=YES 

이것이 설정되어 있으면 cron 의 모든 활동에 대한 로그를 /var/cron/log 파일안에 저장한다. log를 기록하고 싶지 않으면 YES 를 NO로 변경하면 된다.

이 외에도 /etc/default/cron 파일에 설정할 수 있는 내용은 cron 작업들의 PATH 와 SUPATH 를 아래와 같이 setting 시킬 수 있다.
   PATH=/usr/bin:/usr/ucb: 
   SUPATH=/usr/sbin:/usr/bin: 

cron 데몬은 /var/spool/cron/crontabs/ 아래의 파일들을 읽어서 예약해놓은 작업들을 실행한다. 이 디렉토리에는 시스템과 유저의 파일들을 포함하고 있는데, 파일의 이름은 유저의 이름과 동일하게 생성된다.

다음은 default 로 생성된 root 의 crontab 파일이다.
   10 3 * * 0,4 /etc/cron.d/logchecker 
   10 3 * * 0 /usr/lib/newsyslog 
   15 3 * * 0 /usr/lib/fs/nfs/nfsfind 
   1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1 
   30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean 

파일 안에는 space 또는 tab으로 분리된 6개의 엔트리를 가진다. 각 엔트리와 해당 값은 다음과 같다.
       분(0-59), 시간(0-23), 일(1-31), 달(1-12), 요일(0-6: 일요일=0), 명령어 

하나의 엔트리에는 2개 이상의 값을 표현할 수가 있다. 만약 1,2,3 월에 계속 하고 싶은 작업이라면 달에 해당 하는 값을 1-3으로 표시하거나, 컴마로 구분해서 1,2,3 과 같이 표현하는 것도 가능하다. * 는 모든 값에 다 해당한다는 표현이다.

그럼 이제부터 자신의 작업을 스케쥴링 해보자. 만약 guest 라는 user account 를 가진 사람이 일요일마다 12시 정각에 자신의 홈 디렉토리에 있는 test 명령을 실행 하도록 나의 crontab 파일을 만들어보자.
   $crontab -l 

하고 입력하면 현재 세팅되어 있는 나의 crontab 파일의 내용이 출력된다. 물론 아무 내용이 없다면 출력되지 않을 것이다. 그럼 위의 작업을 스케쥴하려면
   $crontab 

 을 하고 나면 입력이 가능 하도록 되며 여기에 작업내용을 입력한다. 
 
   0 12 * * 0 /home/guest/test 

라고 입력하고 Ctrl+D를 입력하면 나의 /var/spool/cron/crontabs/guest 파일이 생성된다.

이 파일은 root 만이 볼 수 있고 수정할 수 있다. 내 crontab 파일을 수정하기 위해서는 아래와 같이 한다.
   $EDITOR=vi 
   $export EDITOR 
   $crontab -e 

위와 같이 실행하고나면 사용자의 crontab 파일이 vi 편집기로 열린다. 여기서 수정을 하면 된다.

이렇게 작업을 예약하고 나면 알아서 cron 데몬이 해당되는 시간에 예약된 작업들을 수행시켜 준다. 만약 수행할 결과의 output 이 있다면 사용자에게 메일로 전달된다.

-r 옵션을 사용하면 사용자의 crontab 파일이 삭제된다.

crontab 파일에 접근허가는 /etc/cron.d/ 아래에 있는 cron.allow 와 cron.deny 2개의 파일로 컨트롤할 수 있다. 각 파일들에는 접근을 허락하기위한 또는 거절하기 위한 user account 이름을 한 줄에 하나씩 열거한 텍스트가 들어있다.

처음 시스템을 설정하고 나면 기본적으로 cron.allow 파일은 없고 cron.deny 파일만 존재한다.

2) at 사용하기

이 명령어는 특정시간에 명령 혹은 스크립트를 수행하게 하며, 단지 한번 수행된다는 점이 crontab 파일과는 다르다.
     $ at [-m] [-r 작업] 시각 [날짜] 

-m 옵션을 사용하면 작업이 끝난후에 사용자에게 메일을 보내준다. -r 옵션은 at명령어로 예약해 놓은 작업큐에서 작업을 삭제하기 위해 사용한다. 시각은 아래와 같이 여러 방법으로 규정될 수 있다.
   $at now 
   $at 10am 
   $at 2pm 
   $at noon 
   $at 3pm + 1 week 
   $at 2am jan 24 
   $at 1400 tomorrow 

간단한 예로 12시에 ls 를 수행하도록 작업을 예약하기 위해서는
   $at 12:00 
   at> ls 
   at> Ctrl +D 입력 #at 종료 
   commands will be executed using /bin/bash 
   job 975034800.a at Fri Nov 24 12:00:00 2000 

이렇게 하면 975034800.a 라는 작업이 큐에 쌓이게 된다. 만일 오늘이 12시가 지났다면 다음날 12시에 수행하도록 작업이 설정된다. 큐의 내용을 확인하려면 atq 명령어를 사용한다.
   $atq
   Rank     Execution Date     Owner     Job         Queue   Job Name
     1st   Nov 24, 2000 12:00   smdoo   975034800.a     a     stdin

큐의 작업을 삭제하려면 at -r 작업번호를 입력한다.
   $at -r 975034800.a 

at 명령어도 역시 /usr/lib/cron/at.allow 와 /usr/lib/cron/at.deny 파일들에 의해서 접근을 컨트롤 할 수 있다.

다. 프로세스의 자세한 정보 보기

솔라리스 프로세스의 핵심적인 특징중의 하나는 /proc 파일시스템으로 마운트되는 프로세스 파일 시스템이다. /proc 파일 시스템에는 PID를 이름으로 가진 현재 활동중인 프로세스의 이미지를 담고 있다. 예를 들면, 먼저 guest 라는 사용자의 프로세스에서 현재 shell 프로세스의 이미지를 살펴보자.
   $ps -aef |grep guest
   guest 25909 25904  0 10:55:48 pts/1    0:00 -bash
   guest 25991 25909  0 11:18:56 pts/1    0:00 grep guest

여기서 bash 의 PID 는 25909 이다. 이 프로세스의 이미지를 보기위해서는 /proc/25909 디렉토리로 가면 볼 수 있다.
   $cd /proc/25909
   $ls -l 
   total 5003
   -rw-------   1 guest    staff    2531328 Nov 24 10:55 as
   -r--------   1 guest    staff        152 Nov 24 10:55 auxv
   -r--------   1 guest    staff         32 Nov 24 10:55 cred
   --w-------   1 guest    staff          0 Nov 24 10:55 ctl
   lr-x------   1 guest    staff          0 Nov 24 10:55 cwd ->
   dr-x------   2 guest    staff       8208 Nov 24 10:55 fd
   -r--r--r--   1 guest    staff        120 Nov 24 10:55 lpsinfo
   -r--------   1 guest    staff        912 Nov 24 10:55 lstatus
   -r--r--r--   1 guest    staff        536 Nov 24 10:55 lusage
   dr-xr-xr-x   3 guest    staff         48 Nov 24 10:55 lwp
   -r--------   1 guest    staff       2304 Nov 24 10:55 map
   dr-x------   2 guest    staff        544 Nov 24 10:55 object
   -r--------   1 guest    staff       2752 Nov 24 10:55 pagedata
   -r--r--r--   1 guest    staff        336 Nov 24 10:55 psinfo
   -r--------   1 guest    staff       2304 Nov 24 10:55 rmap
   lr-x------   1 guest    staff          0 Nov 24 10:55 root ->
   -r--------   1 guest    staff       1440 Nov 24 10:55 sigact
   -r--------   1 guest    staff       1232 Nov 24 10:55 status
   -r--r--r--   1 guest    staff        256 Nov 24 10:55 usage
   -r--------   1 guest    staff          0 Nov 24 10:55 watch
   -r--------   1 guest    staff       3648 Nov 24 10:55 xmap
 

이 디렉토리에는 프로세스의 상태 정보 등을 포함하고 있는 서브디렉토리들을 포함하고 있다. 서브디렉토리안에 있는 정보를 해석하기위한 tool 로 proc tool이 있다. 이것은 각 프로세스의 특징들을 출력시켜주는 역할을 한다.

1) proc tool 사용하기

proc tool들은 /proc 파일시스템 안에 있는 데이터들을 다루기 위한 것이다. 이 툴에 있는 유틸리티들로는 pflags, pcred, pfiles, pldd, pmap, psig, pstack, pstop, ptime, ptree, pwait, pwdx 가 있고, 모든 유틸리티들은 argument로 PID 를 사용한다. 각각이 하는 일이 무엇인지 하나씩 살펴보도록 하자. pflags는 해당 PID 의 자세한 데이터 모델과, flag에 대한 정보를 보여준다.

위의 bash 쉘에 대한 사용 예를 보면 아래와 같다.
   $ pflags 25909
   25909:  -bash
           data model = _ILP32  flags = PR_ORPHAN
     /1:   flags = PR_PCINVAL
   sigmask = 0x00020002,0x00000000
   $pcred 25909
   26838:  e/r/suid=3001  e/r/sgid=10

pcred 는 수행되는 프로세스의 effective, real, saved UID 와 GID 를 보여준다. pmap 은 프로세스의 메모리 세그먼트 사이즈와 address space 를 보여준다. 그리고 pldd 명령어는 각 프로세스에 링크된 dynamic libraries 를 보여준다.
   $pmap 25909
    25909:  -bash
   00010000    432K read/exec         /usr/bin/bash
   0008A000     80K read/write/exec   /usr/bin/bash
   0009E000    152K read/write/exec     [ heap ]
   FF150000     16K read/exec         /usr/lib/locale/en_US.ISO8859-1/en_US.ISO8852
   FF162000     16K read/write/exec   /usr/lib/locale/en_US.ISO8859-1/en_US.ISO8852
   FF170000     16K read/exec         /usr/platform/sun4u/lib/libc_psr.so.1
   FF180000    664K read/exec         /usr/lib/libc.so.1
   FF236000     24K read/write/exec   /usr/lib/libc.so.1

   
   $pldd 25909
   26838:  -bash
   /usr/lib/libcurses.so.1
   /usr/lib/libsocket.so.1
   /usr/lib/libnsl.so.1
   /usr/lib/libdl.so.1
   /usr/lib/libc.so.1
   /usr/lib/libmp.so.2
   /usr/platform/sun4u/lib/libc_psr.so.1
   /usr/lib/locale/en_US.ISO8859-1/en_US.ISO8859-1.so.2

pfile은 proc tool 중에 많이 쓰이는 명령어 중 하나이다. 이것의 역할은 각 프로세스의 모든 open 파일들을 출력해 준다. 출력내용은 파일이 저장되어 있는 파티션의 inode 번호, UID, GID, 접근허가 정보 등이다.
   $pfiles 25909
   25909:  -bash
     Current rlimit: 256 file descriptors
      0: S_IFCHR mode:0620 dev:32,0 ino:320235 uid:3001 gid:7 rdev:24,1
         O_RDWR
      1: S_IFCHR mode:0620 dev:32,0 ino:320235 uid:3001 gid:7 rdev:24,1
         O_RDWR
      2: S_IFCHR mode:0620 dev:32,0 ino:320235 uid:3001 gid:7 rdev:24,1
         O_RDWR
      3: S_IFDOOR mode:0444 dev:188,0 ino:1793 uid:0 gid:0 size:0
         O_RDONLY|O_LARGEFILE FD_CLOEXEC  door to nscd[225]
    255: S_IFCHR mode:0620 dev:32,0 ino:320235 uid:3001 gid:7 rdev:24,1
         O_RDWR FD_CLOEXEC

이 외에도 psig 는 각 프로세스의 signal action 리스트를 보여주고, pgrep 과 pkill 은 앞에서 언급했던 것처럼 프로세스의 목록을 보고 프로세스에게 시그널을 보내는 역할을 해준다. prun 은 process 를 running 시키고, pstop 은 kill 명령어와 같은 유사한 방법으로 프로세스를 중지시켜준다.

pstack 은 프로세스 thread 의 stack trace 를 보여주고, ptree 는 프로세스가 생성된 tree 를 process ID 를 통해 나타내준다.

프로세스의 시간 정보를 보기위해 사용되는 명령어로는 ptime 이 있고, pwait 는 프로세스가 끝나기를 기다리도록 하는 명령어이고, pwdx 는 프로세스의 working directory를 보여준다.

2) lsof 사용하기

lsof 는 ?list open file?을 나타낸다. 이 명령어는 프로세스에 의해 현재 open된 파일들의 정보를 보여준다. 이 명렁어는 Solaris에 포함되어 있지는 않으나, ftp://vic.cc.purdue.edu/pub/tools/unix/lsof에서 최신 버전을 다운 받아서 사용할 수 있다. lsof 가 얼마나 유용한지에 관한 것은 얼마나 파일과 프로세스에 관련된 문제들에 많이 직면하는지에 달려 있다.

관리자들은 프로세스가 현재 사용하고 있는 파일이 무엇이고, 특정 디렉토리에서 어떤 파일들을 사용하는지 알고 싶을 때가 있을 것이다. 만약 어떤 파일이 다른 프로세스에 의해 사용되고 있어서 lock 되었을 경우, 그 파일을 사용하는 다른 프로세스는 파일을 사용할 수 없을 것이다. 후자의 프로세스를 수행시키고자 할 경우 전자의 프로세스의 PID 를 찾아서 이를 중지시킨 후 파일을 사용할 수 있을 것이다.

lsof 를 사용하면 디렉토리안에 파일들이 어떤 프로세스에 의해 사용되고 있는지 알 수 있다. 다음과 같이하면 /tmp 파일시스템에 있는 파일들이 어떤 프로세스에 의해 사용되는지 볼 수 있다.
   $ lsof /tmp 

파일시스템을 마운트하는 제한사항 중에 하나는 만일 파일시스템에 open 된 파일이 존재한다면 이 파일시스템은 unmount 시킬 수 없을 것이다. 그 이유는 파일시스템이 unmount 된다면 파일에 대한 변화된 정보를 기록할 수 없기 때문이다.

파일시스템을 unmount 하려고 했다가 실패를 한 경우, lsof 를 사용해 파일시스템 안의 파일중 open 된 파일의 리스트를 얻어서 해당 프로세스를 중지시키면 파일시스템을 무사히 unmount 시킬 수 있다.


[3] 디스크 관리

Windows 에 너무 익숙해져 있는 사람들은 앞부분부터 차근차근 읽도록 하고, 어느 정도 유닉스 파일 시스템(ufs)을 다뤄본 사람이라면, 앞부분은 대충 읽어나가도록 하자. 본 내용은 solaris x86를 기준으로 설명할 것이다. Disk 관리에 잇어서는 SPARC과 별다른 차이가 없으니, 모든 경우에 적용된다고 보아도 좋겠다.

솔라리스에서의 디스크 이름

솔라리스에서는 논리적 디바이스 이름(logical device name)으로 물리적 디바이스 이름(physical device name)에 링크를 걸어 사용을 한다. 아마도 리눅스의 hda1, sda1 등에 익숙한 사람들은 약간 어색할 것이며, freebsd 사용자의 경우는 그래도 조금 친근할 것이다.

가. Logical device names

Logical device name 은 우리가 알아보기 쉽도록 표시한 것을 말하며, 디스크의 경우 대부분 ?c0t0d0s7?처럼 영문과 숫자의 조합으로 표시된다. 그럼 그 영문과 숫자의 의미를 알아보자.

   - c0 : controller number가 0번임을 의미한다. 숫자는 OS에서 할당하기 때문에 
         우리는 그냥 쓰기만 하면 된다. 
   - t0 : target number가 0번임을 의미한다. IDE 에는 존재하지 않으며, SCSI의 
         경우는 id 번호가 된다. 
   - d0 : disk number가 0번이다. 
   - s7 : slice number가 7번이다. 슬라이스란 일반적으로 우리가 일컫는 파티션을 
         말하며, 이 숫자까지 와서야 비로소 우리가 정할 수 있다. Format 명령으로 
         파티션을 조직할 때 1부터 7번까지의 슬라이스 번호를 매길 수 있는데 그 중에 
         우리가 7번을 사용하고 있는 것이다. 

Logical name 은 /dev/dsk(block device names) 와 /dev/rdsk(raw device names) 디렉토리에 존재하며, 실제로는 /devices 디렉토리의 복잡한 디바이스 이름에 링크되어 있다.

나. Physical device names

우리가 부팅을 할 때, kernel은 시스템에 부착된 디스크를 인식하고, /devices 디렉토리에 여러 문자로 이루어진 노드로 표현된다. 노드라 불리는 이 full device pathname 은 속성, 데이터 종류, 디스크 연결 방식에 관한 여러가지 정보를 담고 있다. 그 full device pathname 의 형식은 다음과 같이 이루어진다.
   driver-name@unit-address:device arguments

driver-name 은 device name 을 나타낸다.

@unit-address는 device 의 physical address를 나타내는데, 부모 주소 공간 안에서 부여가 된다.

:device arguments 에는 각 device 에 해당하는 소프트웨어를 위한 추가적인 정보가 정의된다.

예를 들어 다음의 device 명을 살펴 보면 SPARC 시스템의 스카시 드라이버의 한 슬라이스를 나타낸다는 것을 알 수 있다.

/sbus@1f,0/esp@0,4000/sd@3,0:a

위의 내용을 보면, 1f,0 의 메인 시스템 버스 주소를 가지고 sbus 에 연결되어 있다. 그리고 esp 장치(scsi bus)에 0번 슬롯, 4000번 옵셋에 부착되어 있으며, SCSI target 번호가 3, 논리적 유닛 번호가 0인 sd 장치(scsi disk)라는 것을 알 수 있다. 조금 골치 아픈 얘기이기는 하지만 공부해 두도록 하자.

다. 유용한 명령어들 '백견이 불여일타' 라고, 백번 읽어 봤자 소용없다. 직접 솔라리스 시스템에 앉아(또는 접속하여) 직접 다음의 명령어들을 수행해 보도록 하자.

1) 디스크 마운트하기 - mount

디스크의 마운트 부분은 다른 부분을 참고하기 바란다.

2) 디스크의 이용 상태 보기 - df

df 명령은 각 파일 시스템에 기초하여, 여분의 블록과 파일의 수를 리스트로 보여주는 명령이다. df를 실행시켰을 경우 다음과 같이 나타난다.
   # df 
   / (/dev/dsk/c0d0s0 ): 1267006 blocks 295158 files 
   /usr (/dev/dsk/c0d0s3 ): 6972950 blocks 480285 files 
   /proc (/proc ): 0 blocks 1899 files 
   /dev/fd (fd ): 0 blocks 0 files 
   /etc/mnttab (mnttab ): 0 blocks 0 files 
   /var (/dev/dsk/c0d0s4 ): 2987074 blocks 383809 files 
   /var/run (swap ): 2243560 blocks 21080 files 
   /tmp (swap ): 2243560 blocks 21080 files 
   /export/home (/dev/dsk/c0d0s7 ): 3921682 blocks 495568 files 

3) 디스크 사용량 보기 - du

du 도 df와 마찬가지로 disk useage 를 보여주는 명령어인데, df가 마운트를 기준으로 보여준다고 하면, du 는 원하는 위치의 사용량을 알 수 있다.
   # du -k /usr/sbin 
   235 /usr/sbin/i86 
   1 /usr/sbin/install.d/dynamic_test 
   502 /usr/sbin/install.d 
   1425 /usr/sbin/static 
   9325 /usr/sbin 
 

우리는 주로 ?k 옵션을 사용하는데, 이것은 읽기 쉽게 kilo 단위로 표현해 주기 때문이다.

4) 파일시스템 체크 - fsck

파일 시스템은 내부, 외부의 악조건으로 인해, 에러가 생기거나, 꼬이거나, 부서질 수 있다. fsck 는 filesystem check 를 위한 명령어로서, 아주 유용하게 쓰이는 유틸리티이다. 다음의 내용은 fsck 를 실행 시켜본 결과이다.
   # fsck -F ufs /dev/rdsk/c0d1s0 
   ** /dev/rdsk/c0d1s0 
   ** Last Mounted on /packages 
   ** Phase 1 - Check Blocks and Sizes 
   ** Phase 2 - Check Pathnames 
   ** Phase 3 - Check Connectivity 
   ** Phase 4 - Check Reference Counts 
   ** Phase 5 - Check Cyl groups 
   9463 files, 541567 used, 4496887 free (10031 frags, 560857 blocks, 0.1% fragmentation) 
 
위에서 보인 예는 아무런 문제가 없는 파일 시스템 체크를 보여준 것이다. 5가지의 과정을 거치면서 하나하나 검사해 나간다. ** 참고로 검사를 원하는 슬라이스는 꼭 마운트를 풀어준 후 실행해야 한다. 그렇지 않다면 yes, no 를 묻는 경고가 나오겠지만, 꼭 마운트를 풀고 하도록 하자. fsck 는 일반적으로 시스템이 부팅되면서 실행이 되며, 관리자가 살펴봐야 할 정도로 심각한 이상이 보이면, single mode 로 들어가 fsck 를 실행해 볼 것을 권장하는 글이 출력된다.

라. 새 디스크 추가하기 1

하드 디스크가 비싸던 그 옛날 옛적에는 필요하다고 무턱대고 구입하여 늘일 수 없었지만 지금은 필요하다면 raid로 묶어 몇 백 기가 바이트씩 사용하는 시대이다. 그만큼 디스크의 이동이나 교체 등이 잦은 작업이 되기 쉬운데, 그래서 꼭 알아야 하는 작업 중 하나이다. 솔라리스(x86 solaris 8)를 기준으로 디스크 추가 작업을 순서대로 알아보자.

1) 시스템 reconfigure

시스템을 shutdown 한 후에 disk 를 설치한다. 하드웨어를 연결하는 일은 그다지 어려운 일이 아니므로 설명을 생략하도록 하겠다. 디스크 설치 후에 그냥 부팅을 한다면 시스템은 인식을 하지 못한다. 그래서 필요한 작업이 reconfigure 수행이다.

Reconfigure 방법엔 여러 가지가 있다.

/reconfigure 파일을 만들어 준 후 reboot 을 한다.

부팅 후 init에서 불러 들이는 rc.sysinit 파일에서는 root 디렉토리에 reconfigure 라는 파일의 존재를 파악해서 시스템이 변경된 부분이 있는지 kernel 을 rebuild 하게 한다. 참고로 / 디렉토리는 root 만이 쓸 수 있으니 반드시 root로 로그인해야 한다.
   # su - 
   Password: 
   # touch reconfigure 
   # ls 
   TT_DB devices lib packages tmp 
   bin etc lost+found platform usr 
   boot export mnt proc var 
   cdrom floppy net reconfigure vol 
   core home nsmail sbin xfn 
   dev kernel opt 

이때 만들어진 reconfigure 파일은 재부팅 시 rebuild 후 자동으로 삭제된다. 부팅 후 쉘 상태에서 다음과 같이 입력한다.
   # reboot -- -r  

부팅 시 옵션을 입력한다. x86 버전의 경우 부팅 후 (b)oot (i)nterprete 를 고르는 부분이 있는데, 이곳에 ?b ?r?을 입력한다. PROM 프롬프트 에서는 'boot -r' 을 입력한다. 위와 같은 방법을 거쳐 booting 이 된 후에야 다음 작업을 할 수 있다.

마. 새 디스크 추가하기 2

1) Format

① 설치할 디스크 고르기

Format 명령을 하면 커널에서 인식하고 있는 디스크들을 나열한다.
   # format 
   Searching for disks...done 

   AVAILABLE DISK SELECTIONS: 
   0. c0d0     /pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0 
   1. c0d1     /pci@0,0/pci-ide@7,1/ide@0/cmdk@1,0 
   Specify disk (enter its number): 

위의 출력을 통해 ide 하드 디스크를 2개 가지고 있다는 것을 알 수 있다. 새로 설치한 디스크가 1번이라 가정하고 다음으로 넘어가자. 주의할 점은 이 명령 역시 디스크를 다루는 명령으로서 마운트가 되어 있으면 안된다. 물론 새로 산 디스크를 마운트 했을 리는 없지만, 예를 들자면, re-partitioning 할 경우에 주의해야 한다.
   FORMAT MENU: 
   disk - select a disk 
   type - select (define) a disk type 
   partition - select (define) a partition table 
   current - describe the current disk 
   format - format and analyze the disk 
   fdisk - run the fdisk program 
   repair - repair a defective sector 
   show - translate a disk address 
   label - write label to the disk 
   analyze - surface analysis 
   defect - defect list management 
   backup - search for backup labels 
   verify - read and display labels 
   save - save new disk/partition definitions 
   volname - set 8-character volume name 
   ! - execute , then return 
   quit 

위의 메뉴는 고른 디스크에 대해 작업할 수 있는 format menu 이다. 우리는 우선 fdisk 를 통해 솔라리스 파일 시스템으로 만들어 주어야 한다.

② 파일 시스템 결정 및 저장

fdisk 를 입력하면 다음과 같은 메시지가 뜬다.
   Total disk size is 39703 cylinders 
   Cylinder size is 1008 (512 byte) blocks 

   Cylinders 
   Partition Status Type Start End Length % 
   ========= ====== ============ ===== === ====== === 
   1 Active Solaris 15 16287 16273 41 

   SELECT ONE OF THE FOLLOWING: 

   1. Create a partition 
   2. Specify the active partition 
   3. Delete a partition 
   4. Exit (update disk configuration and exit) 
   5. Cancel (exit without updating disk configuration) 
   Enter Selection: 

필자의 디스크인데, 이미 ufs 로 포맷하여 사용하고 있기 때문에 사용량 등등에 관한 정보가 나온다. 만약 디스크 자체를 새로 구성하고 싶다면(re-partition이 아니다, re-partition 은 이 다음에 할 수 있다) 솔라리스 파일 시스템을 지우는 3번을 선택하고 지우면 된다. 저장 후 다시 메뉴로 나가기 위해서는 4. Exit 를 선택하여야 하는데, 만약 새 디스크라면 1. Create a partition 에서 100% solaris 파티션을 설정해 준 뒤에, 4. Exit 를 선택하도록 하자.

③ 파티션 나누기

이제 100% 솔라리스 파티션인 이 디스크를 여러 슬라이스로 나눌 차례이다. partition 을 입력해 보자.
   format> partition 

   PARTITION MENU: 
   0 - change `0' partition 
   1 - change `1' partition 
   2 - change `2' partition 
   3 - change `3' partition 
   4 - change `4' partition 
   5 - change `5' partition 
   6 - change `6' partition 
   7 - change `7' partition 
   select - select a predefined table 
   modify - modify a predefined partition table 
   name - name the current table 
   print - display the current table 
   label - write partition map and label to the disk 
   ! - execute , then return 
   quit 

위에서 볼 수 있듯, 8개의 슬라이스가 있다. 하지만 우리가 건드릴 수 있는 것은 7개이다. 이 상태에서 print 명령을 통해 현재 디스크의 슬라이스 상태를 알아보자.
   partition> print 
   Current partition table (original): 
   Total disk cylinders available: 16270 + 2 (reserved cylinders) 

   Part Tag Flag Cylinders Size Blocks 
   0 unassigned wm 3 - 10161 4.88GB (10159/0/0) 10240272 
   1 unassigned wm 10162 - 16257 2.93GB (6096/0/0) 6144768 
   2 backup wm 0 - 16270 7.82GB (16271/0/0) 16401168 
   3 unassigned wm 0 0 (0/0/0) 0 
   4 unassigned wm 0 0 (0/0/0) 0 
   5 unassigned wm 0 0 (0/0/0) 0 
   6 unassigned wm 0 0 (0/0/0) 0 
   7 unassigned wm 0 0 (0/0/0) 0 
   8 boot wu 0 - 0 0.49MB (1/0/0) 1008 
   9 alternates wu 1 - 2 0.98MB (2/0/0) 2016 

필자는 이미 0번과 1번의 슬라이스를 만들어 두었다. 만드는 것은 쉽다. 변경하고 싶은 슬라이스 번호를 입력하여 용량이나 실린더 수 등으로 partitioning이 가능하다. 위에서 s2(두번째 슬라이스)에 tag 가 backup 인 것을 유심히 보자. 이것은 기본적으로 쓰이지 않는 슬라이스이며, 디스크의 전체 용량을 나타낸다. 2번 슬라이스는 건드리지 않도록 하자. 다 했다면 quit 입력으로 format 메뉴로 빠져 나온다.

④ relabel

format 메뉴에서 빠져 나오기 전에 꼭 해줘야 할 명령이 있다. relabel 작업인데, 지금까지 슬라이스를 나눈 정보를 저장하는 작업이다. 만일 제대로 안 해준다면 다시 한번 위의 작업을 복습해야 하는 좋은 기회(?)가 될지도 모르겠다. 하지만 우리는 시간도 없는데 그런 짓은 하지 말자. 그냥 label 을 입력하여, 가볍게 yes 를 눌러주자. 그런 다음 quit 를 입력하여 shell 상태로 나오자.

바. 새 디스크 추가하기 3

1) newfs

이제 디스크의 각 부분들이 자리를 잡았다. 각 슬라이스 별로 newfs 명령을 통해 파일 시스템을 재구성해줘야 한다. 우선 format 한 상황을 종합해 보자. c0d1 인 디스크에서 s0번과 s1번의 두개의 슬라이스로 나누었다. 앗 윗장에서 다 설명한 것들이 아닌가! 역시 뭐든 공부해 두면 다 써먹게 되어 있다. 윗장을 읽었음에도 잘 기억이 안 나는 사람은 자신의 머리와 부모님을 원망해가며 다시 한번 정진하도록 하자. ?아무나 다 유닉스를 쓴다면, 난 유닉스를 쓰지 않았을 것이다.? 라는 유닉스 유저도 꽤 있다. 만만하게 보지 말자.

다음과 같이 명령을 내려줘야 할 것이다.
   # newfs /dev/rdsk/c0d1s0 
   …… 생략 
   #newfs /dev/rdsk/c0d1s1 
   …… 생략 

이 작업에서 super block 의 지정 등 여러 작업이 이루어지며 드디어 우리가 마운트 할 수 있는 디스크가 생긴 것이다.
728x90

댓글