달력

42024  이전 다음

  • 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

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 iwho The Man처럼 who에 아무 인자나 두 개 넘겨주면 who -m 이라고 한 것과 같습니다.

bash$ who -m localhost.localdomain!bozo pts/2 Apr 27 17:49 

whoamiwho -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

터미널용 초기화 프로세스가 gettyagetty를 써서 사용자의 로그인을 설정해 줍니다. 이 명령어들은 사용자의 쉘 스크립트에서 쓰이지 않기 때문에 쉘 스크립트에서 이런 기능을 쓰려면 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의 출력은 파이프를 통해 grepawk로 넘겨서 파싱해서 분석할 수 있습니다.

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

이 유틸리티는 시스템 로그 파일들을 적당하게 로테이트 시키고, 압축하고, 지우고, 메일을 보내는 일들을 처리해 줍니다. 보통 crondlogrotate를 가장 기본적인 하루 일과로 삼습니다.

/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), 다중 사용자 모드인지(23), X 윈도우 모드인지(5), 리부팅 중인지(6)등으로 보여 줍니다. 이 명령어는 /var/run/utmp 파일을 통해 정보를 얻어 옵니다.

halt, shutdown, reboot

보통 시스템 전원을 끄기 전에 시스템을 정지시키는 명령어들.

네트워크

ifconfig

네트워크 인터페이스 설정및 튜닝 유틸리티. 이 명령어는 부팅시 인터페이스를 설정할 때나 리부팅때 인터페이스를 내리기 위해 쓰입니다.

# /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.가 주석을 더 넣어 줬습니다. 고마워요.
예 30-5 참고.

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

네트워크 패킷 "스니퍼". 주어진 기준에 맞는 패킷 헤더의 덤프를 떠서 네트워크 트래픽을 분석하고 문제점을 해결할 수 있게 해 줍니다.

bozovillecaduceus 두 호스트간의 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]

예 13-5. CD 이미지 확인하기

# 루트로... mkdir /mnt/cdtest # 마운트 포인트가 없다면 준비함. mount -r -t iso9660 -o loop cd-image.iso /mnt/cdtest # 이미지 마운트. # "-o loop" 옵션은 "losetup /dev/loop0" 와 같음. cd /mnt/cdtest # 이제 이미지를 확인. ls -alR # 이미지에 들어있는 디렉토리 트리에 들어 있는 파일들을 나열. # 기타 등등...
umount

현재 마운트 되어 있는 파일 시스템을 언마운트 해 줍니다. 이미 마운트 되어 있는 플로피나 시디롬 디스크를 빼기 전에 꼭 umount를 해 줘야 합니다. 안 그러면 파일 시스템이 깨질 수도 있습니다.

umount /mnt/cdrom # 이제 이젝트 버튼을 눌러 디스크를 안전하게 뺄 수 있습니다.

참고: automount 유틸리티가 적절하게 설치되어 있다면 플로피나 시디롬 디스크에 접근시나 제거시에 자동으로 마운트와 언마운트를 할 수 있습니다. 플로피나 시디롬 드라이브를 꼈다 뺐다 할 수 있는 랩탑에서는 문제를 일으킬 수도 있습니다.

sync

버퍼에 들어 있는 최신 데이타를 하드 드라이브로 즉시 쓰게 합니다(버퍼와 드라이브를 동기화). 이 명령어가 꼭 필요한 것은 아니지만 시스템 관리자나 사용자에게 자신들이 변경한 데이타가 갑작스런 전원 이상에도 살아남을 수 있게 해 줍니다. 예전에는 sync; sync(아주 확실히 하기 위해서 두 번 내림)라고 해서 시스템을 리부팅하기 전의 유용한 예방책으로 쓰였습니다.

파일을 안전하게 지우거나(예 12-33) 천장의 전등이 깜빡이기 시작했을 때 버퍼를 즉시 플러쉬시키고 싶을 때가 있을지도 모릅니다.

losetup

루프백 디바이스를 설정해 줍니다.

예 13-6. 한 파일에서 한번에 파일 시스템 만들기

SIZE=1000000 # 1 meg head -c $SIZE < /dev/zero > file 
# 지정된 크기로 파일을 설정. losetup /dev/loop0 file
# 루프백 디바이스로 설정. mke2fs /dev/loop0 
# 파일 시스템 만들기. mount -o loop /dev/loop0 /mnt 
# 마운트. # Thanks, S.C.
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

예 13-6예 29-3 도 참고하세요.

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
Posted by tornado
|