13장. 시스템과 관리자용 명령어
시스템과 관리자용 명령어의 좋은 예는 /etc/rc.d 에 있는 시작, 종료 스크립트들입니다. 이 명령어들은 보통 시스템 관리나 파일시스템을 긴급하게 고치려고 할 때 루트가 사용합니다. 이들 몇몇은 잘못 쓰면 시스템을 망가트릴 수 있기 때문에 사용에 주의를 요합니다.
- chown, chgrp
chown 명령어는 파일의 소유권을 바꿔줍니다. root가 특정 사용자가 소유한 파일을 다른 사용자용으로 바꾸려고 할 때 유용하게 쓰입니다. 하지만, 일반 사용자는 자신이 소유한 파일조차도 소유권을 바꿀 수 없습니다. [1]
root# chown bozo *.txt
chgrp 명령어는 파일의 그룹 소유권을 바꿔줍니다. 이 명령어를 쓰려면 그 파일의 소유자이고 바꾸려는 그룹의 멤버여야 합니다(혹은 root이거나).
chgrp --recursive dunderheads *.data # $PWD 디렉토리의 모든 하위 디렉토리("recursive"에 의해)의 # 모든 "*.data" 파일들은 "dunderheads" 그룹이 그 소유권을 갖습니다.
- useradd, userdel
관리자용 명령어인 useradd는 시스템에 사용자 계정을 추가해 주고 그 사용자용으로 지정된 홈 디렉토리를 만들어 줍니다. useradd와 쌍을 이루는 userdel는 시스템에서 사용자 계정을 삭제해 주고 [2] 해당 파일들도 삭제해 줍니다.
참고: adduser 명령어는 useradd의 동의어로서, 보통 useradd를 가르키는 심볼릭 링크 파일입니다.
- id
id 명령어는 현재 사용자의 실제 ID와 유효 사용자 ID, 그룹 ID를 보여줍니다. 내부 bash 변수인 $UID, $EUID, $GROUPS와 짝을 이룹니다.
bash$ id
uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio)
bash$ echo $UID 501
예 9-4 참고.
- who
시스템에 현재 로그인해 있는 모든 사용자를 보여줍니다.
bash$ who
bozo tty1 Apr 27 17:45 bozo pts/0 Apr 27 17:46
bozo pts/1 Apr 27 17:47 bozo pts/2 Apr 27 17:49
-m을 주면 오직 현재 사용자에 대한 자세한 정보만을 보여줍니다. who am i나 who The Man처럼 who에 아무 인자나 두 개 넘겨주면 who -m 이라고 한 것과 같습니다.
bash$ who -m localhost.localdomain!bozo pts/2 Apr 27 17:49
whoami는 who -m 과 비슷하지만 사용자 이름만 보여줍니다.
bash$ whoami bozo
- w
로그인 되어 있는 사용자와 그 사용자와 관련된 모든 프로세스를 보여 줍니다. 이는 who의 확장 버전인데, w의 출력에 grep으로 파이프를 걸어서 특정한 사용자나 프로세스를 찾을 수 있습니다.
bash$ w | grep startx bozo tty1 - 4:22pm 6:41 4.47s 0.45s startx
- logname
현재 사용자의 로그인 이름을 /var/run/utmp에서 찾아서 보여줍니다. 위에서 설명한 whoami와 거의 동일한 명령어입니다.
bash$ logname bozo bash$ whoami bozo
그렇지만...
bash$ su Password: ...... bash# whoami root bash# logname bozo
- su
다른 사용자(substitute user)로 프로그램이나 스크립트를 실행 시킵니다. rjones란 사용자로 쉘을 새롭게 시작하고 싶으면 su rjones라고 하면 됩니다. 옵션 없이 su만 실행시키면 기본적으로 root 로 받아들입니다. 예 A-10를 참고하세요.
- users
로그인 하고 있는 모든 사용자를 보여줍니다. 이 명령어는 who -q 와 거의 비슷한 명령어입니다.
- ac
사용자가 로그인 해 있던 시간을 /var/log/wtmp 에서 읽어서 보여줍니다. 이 명령어는 GNU 계정 유틸리티(accounting utility) 중 하나입니다.
bash$ ac total 68.08
- last
사용자가 마지막으로 로그인 한 시간을 /var/log/wtmp에서 읽어서 보여줍니다. 이 명령어는 외부에서 로그인 한 정보도 보여줄 수 있습니다.
- groups
현재 사용자가 속해 있는 그룹을 보여줍니다. 내부 변수인 $GROUPS에 해당하는 명령어이지만 숫자가 아닌 그룹 이름으로 보여줍니다.
bash$ groups bozita cdrom cdwriter audio xgrp
bash$ echo $GROUPS 501
- newgrp
로그아웃 없이 사용자의 그룹 ID를 변경하기. 이 명령어를 쓰면 새 그룹의 파일에 접근할 수 있게 됩니다. 사용자는 보통 동시에 여러 그룹의 멤버이기 때문에 이 명령어를 쓸 일은 별로 없습니다.
- tty
현재 사용자의 터미널 이름을 보여줍니다. 서로 다른 한텀, 엑스텀 윈도우는 서로 다른 터미널로 인식되는것에 주의하세요.
bash$ tty /dev/pts/1
- stty
터미널 세팅을 보여주거나 변경해 줍니다. 이 복잡한 명령어는 스크립트에서 쓰여 터미널 동작이나 출력하는 방법을 제어할 수 있습니다. info 페이지를 참고하고, 조심해서 공부하세요.
예 13-1. 지움 글자(erase character) 세팅하기
#!/bin/bash # erase.sh: "stty"로 입력시의 지움 글자(erase character)를 세트하기.
echo -n "이름이 뭐에요? "
read name # 아무 글자나 치고 지우려고 해보세요. # 안 될 겁니다.
echo "이름이 $name 군요."
stty erase '#' # "hashmark" (#) 를 지움 글자로 세트.
echo -n "이름이 뭐죠? "
read name # 마지막에 친 글자를 # 으로 지워보세요.
echo "$name 가 당신 이름이군요." exit 0
예 13-2. 비밀스런 비밀번호: 터미널 에코 끄기
#!/bin/bash echo echo -n "비밀번호를 넣으세요 "
read passwd
echo "비밀번호는 $passwd 입니다."
echo -n "누군가가 어깨 너머로 당신을 보고 있었다면, "
echo "당신의 비밀번호를 알아냈을 수도 있습니다."
echo && echo # "and list"로 묶인 라인 피드 두 줄"
stty -echo # 화면 에코를 끕니다. echo -n "비밀번호를 다시 넣으세요 "
read passwd echo echo "비밀번호는 $passwd 입니다."
echo stty echo # 화면 에코를 킵니다. exit 0
stty를 창조적으로 써서 사용자가 ENTER를 안 눌러도 어떤 키를 눌렀는지를 알아낼 수 있습니다.
예 13-3. 키누름 알아내기
#!/bin/bash # keypress.sh: 키누름 알아내기("hot keyboard").
echo old_tty_settings=$(stty -g) # 현재 세팅을 저장.
stty -icanon Keypress=$(head -c1) #
GNU 시스템이 아니라면
# $(dd bs=1 count=1 2> /dev/null)
echo echo "\""$Keypress"\" 키가 눌렸습니다."
echo stty "$old_tty_settings"
# 원래 세팅으로 복구.
# Thanks, Stephane Chazelas. exit 0
예 9-3 참고.
- tset
터미널 세팅을 보여주거나 초기화 함. stty보다 기능이 떨어집니다.
bash$ tset -r Terminal type is xterm-xfree86. Kill is control-U (^U). Interrupt is control-C (^C).
- setserial
시리얼 포트 매개변수를 세트하거나 보여줍니다. 루트로 실행시켜야 하고 보통은 시스템 셋업 스크립트에서 찾을 수 있습니다.
# /etc/pcmcia/serial 스크립트에서 발췌: IRQ=`setserial /dev/$DEVICE | sed -e 's/.*IRQ: //'` setserial /dev/$DEVICE irq 0 ; setserial /dev/$DEVICE irq $IRQ
- getty, agetty
터미널용 초기화 프로세스가 getty나 agetty를 써서 사용자의 로그인을 설정해 줍니다. 이 명령어들은 사용자의 쉘 스크립트에서 쓰이지 않기 때문에 쉘 스크립트에서 이런 기능을 쓰려면 stty를 쓰기 바랍니다.
- mesg
현재 사용자의 터미널에 대한 쓰기 접근을 제어합니다. 접근을 못 하게 설정되면 네트워크에 있는 다른 사용자가 현재 터미널로 write를 하지 못하게 해 줍니다.
작은 정보: 여러분이 텍스트 파일을 편집하고 있는데 갑자기 피자 주문 메세지가 뜨면 아주 짜증날 것입니다. 다중 사용자 네트워크에서는, 방해받기 싫을 때 여러분의 터미널에 대한 쓰기 접근을 막고 싶은 경우가 생길겁니다.
- wall
"write all"의 앞글자를 따서 wall이 된 이 명령어는 현재 로그인 되어 있는 모든 사용자에게 메세지를 날립니다. 원래는 유용한 시스템 관리자용 도구입니다. 예를 들어, 시스템에 문제가 생겨서 잠깐 동안 다운 시켜야 할 필요가 생겼을 때 모든 사용자들에게 경고를 할 수 있게 해 줍니다(예 17-2 참고).
bash$ wall System going down for maintenance in 5 minutes! Broadcast message from bozo (pts/1) Sun Jul 8 13:53:27 2001... System going down for maintenance in 5 minutes!
참고: mesg로 쓰기가 막혀있는 터미널은 wall 메세지를 받을 수 없습니다.
- dmesg
시스템 부팅 메세지를 표준출력으로 보여 줍니다. 디버깅 할 때, 어떤 디바이스 드라이버가 설치됐는지 확인할 때, 사용중인 시스템 인터럽트가 무엇인지 확인할 때 편하게 쓸 수 있습니다. 스크립트에서 dmesg의 출력을 grep이나 sed, awk로 파싱해서 쓸 수 있습니다.
- uname
시스템 사양(OS, 커널 버전등)을 표준출력으로 보여줍니다. -a 옵션을 주면 시스템 정보를 아주 자세하게 보여주고(예 12-4 참고), -s 옵션을 주면 OS 종류만 보여줍니다.
bash$ uname -a Linux localhost.localdomain 2.2.15-2.5.0 #1 Sat Feb 5 00:13:43 EST 2000 i686 unknown bash$ uname -s Linux
- arch
시스템 아키텍쳐를 보여줍니다. uname -m 과 동일한 명령어입니다. 예 10-24를 참고하세요.
bash$ arch i686 bash$ uname -m i686
- lastcomm
/var/account/pacct 파일에 저장돼 있는 이전 명령어들에 대한 정보를 알려줍니다. 옵션으로 명령어와 사용자 이름을 지정해 줄 수 있습니다. 이 명령어는 GNU 계정 유틸리티(accounting utility)중의 하나입니다.
- lastlog
시스템의 모든 사용자가 마지막으로 로그인한 시간을 보여줍니다. 이 명령어는 /var/log/lastlog 파일을 참조합니다.
bash$ lastlog root tty1 Fri Dec 7 18:43:21 -0700 2001 bin **Never logged in** daemon **Never logged in** ... bozo tty1 Sat Dec 8 21:14:29 -0700 2001 bash$ lastlog | grep root root tty1 Fri Dec 7 18:43:21 -0700 2001
경고 /var/log/lastlog 파일에 읽기 퍼미션이 없는 사용자가 이 명령어를 실행시키면 실패합니다.
- lsof
현재 열려 있는 파일들을 보여줍니다. 이 명령어는 현재 열려 있는 모든 파일들에 대한 자세한 표와 각각의 파일에 대한 소유자, 크기, 관련 프로세스등의 정보를 보여 줍니다. 당연히, lsof의 출력은 파이프를 통해 grep나 awk로 넘겨서 파싱해서 분석할 수 있습니다.
bash$ lsof COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root mem REG 3,5 30748 30303 /sbin/init init 1 root mem REG 3,5 73120 8069 /lib/ld-2.1.3.so init 1 root mem REG 3,5 931668 8075 /lib/libc-2.1.3.so cardmgr 213 root mem REG 3,5 36956 30357 /sbin/cardmgr ...
- strace
시스템 콜과 시그널을 추적해서 진단하고 디버깅해 주는 도구입니다. 가장 간단하게 실행시키는 방법은 strace COMMAND라고 치는 것입니다.
bash$ strace df execve("/bin/df", ["df"], [/* 45 vars */]) = 0 uname({sys="Linux", node="bozo.localdomain", ...}) = 0 brk(0) = 0x804f5e4 ...
이 명령어는 리눅스에서의 truss 입니다.
- free
메모리와 캐쉬 사용량을 탭이 들어간 형태로 보여줍니다. 이 명령어의 출력은 grep이나, awk, Perl을 써서 파싱하기에 알맞은 형태입니다. procinfo 명령어는 free가 보여주는 정보 이외에 더 많은 정보도 보여줍니다.
bash$ free total used free shared buffers cached Mem: 30504 28624 1880 15820 1608 16376 -/+ buffers/cache: 10640 19864 Swap: 68540 3128 65412
사용하지 않는 램 용량을 보려면:
bash$ free | grep Mem | awk '{ print $4 }' 1880
- procinfo
/proc 가상 파일시스템에서 여러 정보와 통계를 뽑아내서 광범위하고 자세하게 보여 줍니다.
bash$ procinfo | grep Bootup Bootup: Wed Mar 21 15:15:50 2001 Load average: 0.04 0.21 0.34 3/47 6829
- lsdev
설치된 하드웨어 디바이스의 목록을 보여줍니다.
bash$ lsdev Device DMA IRQ I/O Ports ------------------------------------------------ cascade 4 2 dma 0080-008f dma1 0000-001f dma2 00c0-00df fpu 00f0-00ff ide0 14 01f0-01f7 03f6-03f6 ...
- du
디스크의 파일 사용량을 재귀적으로 보여줍니다. 특별히 지정하지 않으면 현재 디렉토리에 대해서 동작합니다.
bash$ du -ach 1.0k ./wi.sh 1.0k ./tst.sh 1.0k ./random.file 6.0k . 6.0k total
- df
파일시스템 사용량을 탭이 들어간 형태로 보여 줍니다.
bash$ df Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda5 273262 92607 166547 36% / /dev/hda8 222525 123951 87085 59% /home /dev/hda7 1408796 1075744 261488 80% /usr
- stat
주어진 파일(디렉토리나 디바이스 파일도)에 대해서 자세한 통계(statistics)를 알려줍니다.
bash$ stat test.cru File: "test.cru" Size: 49970 Allocated Blocks: 100 Filetype: Regular File Mode: (0664/-rw-rw-r--) Uid: ( 501/ bozo) Gid: ( 501/ bozo) Device: 3,8 Inode: 18185 Links: 1 Access: Sat Jun 2 16:40:24 2001 Modify: Sat Jun 2 16:40:24 2001 Change: Sat Jun 2 16:40:24 2001
존재하지 않는 파일에 대해서 stat을 실행시키면 에러 메세지를 냅니다.
bash$ stat nonexistent-file nonexistent-file: No such file or directory
- vmstat
가상 메모리(virtual memory) 통계(statistics)를 보여줌.
bash$ vmstat procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 0 0 0 0 11040 2636 38952 0 0 33 7 271 88 8 3 89
- netstat
라우팅 테이블이나 활성화되어 있는 네트워크 연결같은 네트워크 통계와 정보를 보여 줍니다. 이 유틸리티는 /proc/net(28장)에서 정보를 얻어 옵니다. 예 28-2을 참고하세요.
- uptime
시스템이 얼마나 오랫동안 돌고 있었는지 관련 통계와 함께 보여줍니다.
bash$ uptime 10:28pm up 1:57, 3 users, load average: 0.17, 0.34, 0.27
- hostname
시스템의 호스트명을 보여줍니다. 이 명령어는 /etc/rc.d 에 들어 있는 셋업 스크립트에서 호스트명을 설정해 줍니다(/etc/rc.d/rc.sysinit이나 비슷한 스크립트). uname -n과 동일한 명령어이고 내부 변수인 $HOSTNAME과 연관이 있습니다.
bash$ hostname localhost.localdomain bash$ echo $HOSTNAME localhost.localdomain
- hostid
호스트 머신에 대한 32비트 16진수 구분자를 에코해 줍니다.
bash$ hostid 7f0100
참고: 이 명령어는 특정 시스템에 대해 "유일한"(unique) 시리얼 숫자를 구해줍니다. 몇몇 상업용 제품의 등록 과정에서 이 숫자를 이용해 사용자 라이센스를 만들어 냅니다. 하지만 불행하게도 hostid는 오직 네트워크 주소를 두 바이트 단위로 뒤집어 16진수로 리턴해 줍니다.
네트워크에 물리지 않은 리눅스 머신의 전형적인 네트워크 주소는 /etc/hosts에서 알아낼 수 있습니다.
bash$ cat /etc/hosts 127.0.0.1 localhost.localdomain localhost
공교롭게도 127.0.0.1을 두 바이트 단위로 뒤집으면 0.127.1.0이 되고 이를 16진수로 변환하면 007f0100이 되는데 이는 위에서 살펴본 hostid가 리턴하는 값과 정확히 일치합니다. 결국 동일한 hostid를 갖는 리눅스 머신이 수 백만 개가 존재하게 되는 것입니다.
- logger
사용자가 만들어낸 메세지를 시스템 로그(/var/log/messages)에 추가 시킵니다. 이 명령어는 일반 사용자도 쓸 수 있습니다.
logger Experiencing instability in network connection at 23:10, 05/21. # 자, 이제 'tail /var/log/messages' 라고 해 보세요.
스크립트에 logger 명령어를 넣어서 디버깅 정보를 /var/log/messages에 쓸 수 있습니다.
logger -t $0 -i Logging at line "$LINENO". # "-t" 옵션은 logger 엔트리용 태그를 지정합니다. # "-i" 옵션은 프로세스 ID를 지정합니다. # tail /var/log/message # ... # Jul 7 20:48:58 localhost ./test.sh[1712]: Logging at line 3.
- logrotate
이 유틸리티는 시스템 로그 파일들을 적당하게 로테이트 시키고, 압축하고, 지우고, 메일을 보내는 일들을 처리해 줍니다. 보통 crond은 logrotate를 가장 기본적인 하루 일과로 삼습니다.
/etc/logrotate.conf에 적당한 내용을 적어주면 시스템 전체 로그뿐만 아니라 개인용 로그 파일을 관리할 수 있습니다.
- ps
프로세스 통계(Process Statistics): 현재 실행중인 프로세스들을 사용자와 PID(프로세스 아이디)에 의해서 보여줌. 보통은 ax 옵션을 줘서 부르고, grep이나 sed로 파이프를 걸어서 특정 프로세스를 찾습니다(예 11-8와 예 28-1 참고).
bash$ ps ax | grep sendmail 295 ? S 0:00 sendmail: accepting connections on port 25
- pstree
현재 실행중인 프로세스를 "나무"(tree) 형태로 보여 줍니다. -p 옵션을 주면 프로세스 이름뿐만 아니라 PID까지 보여 줍니다.
- top
cpu를 집중적으로 사용하는 프로세스를 중심으로 최신 정보를 계속 보여줍니다. -b 옵션은 결과를 텍스트 모드로 보여주기 때문에 파싱을 하거나 스크립트에서 접근할 수가 있습니다.
bash$ top -b 8:30pm up 3 min, 3 users, load average: 0.49, 0.32, 0.13 45 processes: 44 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 13.6% user, 7.3% system, 0.0% nice, 78.9% idle Mem: 78396K av, 65468K used, 12928K free, 0K shrd, 2352K buff Swap: 157208K av, 0K used, 157208K free 37244K cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 848 bozo 17 0 996 996 800 R 5.6 1.2 0:00 top 1 root 8 0 512 512 444 S 0.0 0.6 0:04 init 2 root 9 0 0 0 0 SW 0.0 0.0 0:00 keventd ...
- nice
백그라운드 작업의 우선순위를 바꿔줍니다. 우선순위는 19(제일 낮음)에서 -20(제일 높음)까지 인데, 오직 root만이 음수(높은) 우선순위를 줄 수 있습니다. 관련 명령어로는 renice, snice, skill이 있습니다.
- nohup
사용자가 로그 아웃을 하더라고 명령어가 계속 돌게 해 줍니다. 명령어에 &를 붙여 실행하지 않으면 포그라운드로 실행이 될 것입니다. nohup을 스크립트에서 쓸 때는, 고아 프로세스나 좀비 프로세스가 생기지 않도록 wait과 같이 써야 합니다.
- pidof
실행중인 작업의 프로세스 ID(pid)를 식별해 줍니다. kill이나 renice같은 작업 제어 명령어들은 프로세스 이름이 아니라 pid에 대해 동작하기 때문에 종종 pid로 구분할 필요가 생깁니다. pidof 명령어는 내부 변수인 $PPID와 거의 쌍을 이룹니다.
bash$ pidof xclock 880
예 13-4. pidof 로 프로세스를 죽이기
#!/bin/bash # kill-process.sh NOPROCESS=2 process=xxxyyyzzz # 존재하지 않는 프로세스를 가지고, # 그냥 데모용임... # ... 실제로 돌고 있는 어떤 프로세스도 죽이려고 하는게 아니니까. # # 하지만, 예를 들어 인터넷에서 로그오프하고 싶다면 #+ process=pppd #+ 됩니다. t=`pidof $process` # $process의 pid(프로세스 ID)를 찾고, # 'kill'은 프로그램 이름이 아니라 pid를 쓰기 때문에 if [ -z "$t" ] # 해당 프로세스가 없다면 'pidof'는 널을 리턴함. then echo "$process 는 현재 실행중이 아니므로 그냥 종료합니다." exit $NOPROCESS fi kill $t # 잘 죽지 않는 프로세스라면 'kill -9'라고 해야 할지도 모릅니다. # 죽지 않게 돼 있는 프로세스일수도 있기 때문에 # 다시 한 번 " t=`pidof $process` " 로 확인해 볼 필요가 있습니다. # 위 전체 스크립트는 # kill $(pidof -x process_name) # 이라고 할 수도 있겠으나 그러면 교육적이지는 않은것 같군요. exit 0
- fuser
어떤 파일이나, 파일 집합, 디렉토리에 접근하고 있는 프로세스를 PID로 식별해 줍니다. -k 옵션을 쓰면 해당 프로세스를 죽일 수 있습니다. 이 명령어는 시스템 보안 차원에서 아주 흥미로운 구현인데 주로 스크립트에서 쓰여 시스템 서비스에 대해 허가 받지 않은 사용자의 접근을 막는 용도로 쓰입니다.
- crond
시스템 관리용 스케쥴러 프로그램으로서, 시스템 로그 파일을 정리하고 지운다거나 slocate 데이타 베이스를 업데이트 하는 등의 일을 해 줍니다. at의 루트 사용자 버전용 명령어입니다(물론, 각 사용자는 crontab 명령어를 써서 자신만의 crontab 파일을 가질수도 있습니다). 데몬으로 돌면서 /etc/crontab의 내용들을 스케쥴에 따라 실행시켜 줍니다.
- init
init 명령어는 모든 프로세스의 부모 프로세스로서, 시스템 부팅 과정의 제일 마지막에 불리면서 /etc/inittab을 읽어서 시스템의 런레벨을 결정합니다. 오직 루트만이 별명인 telinit으로 부를 수 있습니다.
- telinit
init를 가르키는 심볼릭링크로서, 시스템 런레벨을 바꿀 때 쓰는데 보통은 시스템 관리나 긴급하게 파일시스템을 수리해야 할 때 씁니다. 오직 루트만 이 명령어를 쓸 수 있습니다. 이 명령어는 아주 위험하기 때문에 쓰기 전에 이 명령어를 잘 이해하고 있어야 합니다!
- runlevel
현재와 바로 전의 런레벨을, 시스템이 정지 상태인지(런레벨 0), 단일 사용자 모드인지(1), 다중 사용자 모드인지(2나 3), X 윈도우 모드인지(5), 리부팅 중인지(6)등으로 보여 줍니다. 이 명령어는 /var/run/utmp 파일을 통해 정보를 얻어 옵니다.
- halt, shutdown, reboot
보통 시스템 전원을 끄기 전에 시스템을 정지시키는 명령어들.
- ifconfig
네트워크 인터페이스 설정및 튜닝 유틸리티. 이 명령어는 부팅시 인터페이스를 설정할 때나 리부팅때 인터페이스를 내리기 위해 쓰입니다.
예 30-5 참고.# /etc/rc.d/init.d/network 의 일부분 # ... # 네트워킹이 가능한지 확인. [ ${NETWORKING} = "no" ] && exit 0 [ -x /sbin/ifconfig ] || exit 0 # ... for i in $interfaces ; do if ifconfig $i 2>/dev/null | grep -q "UP" >/dev/null 2>&1 ; then action "Shutting down interface $i: " ./ifdown $i boot fi # "grep"의 GNU 전용인 "-q" 옵션은 "quiet"를 뜻하고, 어떤 출력도 하지 않게 합니다. # 따라서 출력을 /dev/null 로 재지향 하는 것이 꼭 필요하지 않습니다. # ... echo "현재 동작중인 디바이스:" echo `/sbin/ifconfig | grep ^[a-z] | awk '{print $1}'` # ^^^^^ globbing 을 막기 위해 쿼우트 시켜야 합니다. # 다음도 역시 동작합니다. # echo $(/sbin/ifconfig | awk '/^[a-z]/ { print $1 })' # echo $(/sbin/ifconfig | sed -e 's/ .*//') # S.C.가 주석을 더 넣어 줬습니다. 고마워요.
- route
커널 라우팅 테이블 정보를 보거나 바꿀 수 있게 해 줍니다.
bash$ route Destination Gateway Genmask Flags MSS Window irtt Iface pm3-67.bozosisp * 255.255.255.255 UH 40 0 0 ppp0 127.0.0.0 * 255.0.0.0 U 40 0 0 lo default pm3-67.bozosisp 0.0.0.0 UG 40 0 0 ppp0
- chkconfig
네트워크 설정을 체크해줌. 이 명령어는 /etc/rc?.d 디렉토리에 들어있고 부팅시 시작되는 네트워크 서비스들을 보여주고 관리해 줍니다.
원래는 IRIX에 있던 것을 레드햇 리눅스가 포팅한 것으로 다른 리눅스 배포판에서는 기본 설치에 속하지 않을 수도 있습니다.
bash$ chkconfig --list atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off rwhod 0:off 1:off 2:off 3:off 4:off 5:off 6:off ...
- tcpdump
네트워크 패킷 "스니퍼". 주어진 기준에 맞는 패킷 헤더의 덤프를 떠서 네트워크 트래픽을 분석하고 문제점을 해결할 수 있게 해 줍니다.
bozoville 와 caduceus 두 호스트간의 IP 패킷 트래픽을 덤프:
bash$ tcpdump ip host bozoville and caduceus
당연히 tcpdump의 출력은 앞에서 논의했던 텍스트 처리 유틸리티들을 이용해서 파싱할 수가 있습니다.
- mount
파일시스템을 마운트해 줍니다. 보통은 플로피나 시디롬 같은 외부 디바이스에 대해서 쓰입니다. /etc/fstab에 가능한 파일시스템이나 파티션, 디바이스, 옵션등을 적어 놓으면 자동이나 수동으로 마운트를 편하게 할 수 있습니다. /etc/mtab 파일은 /proc 같은 가상 파일시스템도 포함해서 현재 마운트 되어 있는 파일 시스템을 보여 줍니다.
mount -a 는 /etc/fstab에 들어 있는 파일 시스템과 파티션중에 noauto 옵션이 있는 항목만 빼고 모두 마운트 해 줍니다. 부팅될 때, 모든 파티션이 마운트 되도록 /etc/rc.d 디렉토리에 들어 있는 시스템 구동 스크립트(rc.sysinit이나 비슷한 것)에서 이 명령어를 부릅니다.
mount -t iso9660 /dev/cdrom /mnt/cdrom # CDROM 마운트 mount /mnt/cdrom # /mnt/cdrom 이 /etc/fstab 에 들어 있을 경우 짧게 부르기
이 다재다능한 명령어는 보통 파일을 블럭 디바이스에 존재하는 파일 시스템처럼 마운트 할 수도 있습니다. 이런 능력은 루프백 디바이스(loopback device)라고 하는 파일을 이용해서 가능해 집니다. 이 루프백 디바이스를 적용한 예로서, ISO9660 이미지를 CDR로 굽기 전에 마운트해서 테스트 해보는 것이 있습니다. [3]
- umount
현재 마운트 되어 있는 파일 시스템을 언마운트 해 줍니다. 이미 마운트 되어 있는 플로피나 시디롬 디스크를 빼기 전에 꼭 umount를 해 줘야 합니다. 안 그러면 파일 시스템이 깨질 수도 있습니다.
umount /mnt/cdrom # 이제 이젝트 버튼을 눌러 디스크를 안전하게 뺄 수 있습니다.
참고: automount 유틸리티가 적절하게 설치되어 있다면 플로피나 시디롬 디스크에 접근시나 제거시에 자동으로 마운트와 언마운트를 할 수 있습니다. 플로피나 시디롬 드라이브를 꼈다 뺐다 할 수 있는 랩탑에서는 문제를 일으킬 수도 있습니다.
- sync
버퍼에 들어 있는 최신 데이타를 하드 드라이브로 즉시 쓰게 합니다(버퍼와 드라이브를 동기화). 이 명령어가 꼭 필요한 것은 아니지만 시스템 관리자나 사용자에게 자신들이 변경한 데이타가 갑작스런 전원 이상에도 살아남을 수 있게 해 줍니다. 예전에는 sync; sync(아주 확실히 하기 위해서 두 번 내림)라고 해서 시스템을 리부팅하기 전의 유용한 예방책으로 쓰였습니다.
파일을 안전하게 지우거나(예 12-33) 천장의 전등이 깜빡이기 시작했을 때 버퍼를 즉시 플러쉬시키고 싶을 때가 있을지도 모릅니다.
- losetup
루프백 디바이스를 설정해 줍니다.
- mkswap
스왑 파티션이나 스왑 파일을 만들어 줍니다. 이 명령어 다음에는 꼭 swapon으로 활성화를 시켜줘야 합니다.
- swapon, swapoff
스왑 파티션이나 스왑 파일을 활성화/비활성화 시켜 줍니다. 이 명령어는 보통 부팅시나 셧다운시에 효력을 갖습니다.
- mke2fs
리눅스 ext2 파일시스템을 만들어 줍니다. 이 명령어는 루트로 실행 시켜야 합니다.
예 13-7. 새 하드 드라이브 추가하기
#!/bin/bash # 시스템에 두 번째 하드 드라이브 추가하기.
# 소프트웨어 설정. 하드웨어가 이미 마운트돼 있다고 가정함.
# 본 문서의 저자가 "Linux Gazett", http://www.linuxgazette.com, 38호에
# 쓴 기사에서 발췌. ROOT_UID=0
# 이 스크립트는 루트로 실행 시켜야 됩니다. E_NOTROOT=67
# root 가 아닌 경우의 종료 에러.
if [ "$UID" -ne "$ROOT_UID" ] then echo "이 스크립트는 루트만 실행시킬 수 있습니다." exit $E_NOTROOT fi # 이 스크립트는 정말 주의해서 쓰기 바랍니다! # 만약 무언가가 잘못된다면 여러분의 파일 시스템을 홀라당 날려먹을 수 있습니다. NEWDISK=/dev/hdb # /dev/hdb 가 비어 있다고 가정함. 꼭 확인해 볼 것! MOUNTPOINT=/mnt/newdisk # 아니면 다른 마운트 포인트 지정. fdisk $NEWDISK mke2fs -cv $NEWDISK1 # 배드 블럭 확인및 자세한 출력. # 주의: /dev/hdb 가 *아니라* /dev/hdb1 입니다! mkdir $MOUNTPOINT chmod 777 $MOUNTPOINT # 새 드라이브는 모든 사용자가 접근할 수 있도록 함. # 자, 테스트를 해 보죠. # mount -t ext2 /dev/hdb1 /mnt/newdisk # 디렉토리를 만들어 보고 잘 된다면 umount 한 다음 하던 일을 계속하면 됩니다. # 마지막 단계: # 다음을 /etc/fstab 에 추가해 주세요. # /dev/hdb1 /mnt/newdisk ext2 defaults 1 1 exit 0
- tune2fs
ext2 파일 시스템을 튜닝해 줍니다. 최대 마운트 숫자같은 파일 시스템 매개변수를 바꾸는데 쓰일 수 있습니다. 루트로 실행해야 됩니다.
주의 이 명령어는 굉장히 위험합니다. 부주의하게 쓴다면 여러분 파일 시스템을 박살낼 수도 있기 때문에 여러분 스스로 책임을 지고 써야 합니다.
- dumpe2fs
아주 자세한 파일 시스템 정보를 표준출력으로 덤프해 줍니다. 루트로 실행되야 합니다.
root# dumpe2fs /dev/hda7 | grep 'ount count' dumpe2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09 Mount count: 6 Maximum mount count: 20
- hdparm
-
'OS > LINUX' 카테고리의 다른 글
[펌] 인터넷 보안 방화벽( Firewall) 시스템 (0) 2004.07.02 [펌] 웹 로그 통계 내기 - AWStats (0) 2004.06.30 [펌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기 (0) 2004.06.30 [펌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기 (0) 2004.06.30 [펌] 서버 모니터링 툴의 강자, RRDtool 가이드 (0) 2004.06.29