/dev/zero/dev/null

/dev/null의 쓰임새

/dev/null"블랙홀"이라고 상상해 보세요. 이 파일은 거의 읽기 전용 파일이나 마찬가집니다. 이 파일에 쓰는 모든것은 영원히 사라져 버릴겁니다. 이 파일에서 무언가를 읽으려고 하거나 어떤 결과를 바라는 것은 무의미한 일입니다. 그럼에도 불구하고, /dev/null은 명령어 줄이나 스크립트에서 아주 유용하게 쓸 수 있습니다.

표준출력이나 표준에러 막기(예 30-1에서 인용):

rm $badname 2>/dev/null
#           에러 메세지[stderr]는 완전히 사라져 버립니다.

파일 자체와 모든 퍼미션은 그대로 가지면서 내용만 지우기(예 2-1예 2-2에서 인용):

cat /dev/null > /var/log/messages
#  : > /var/log/messages   라고 해도 같지만, 이렇게 하면 새 프로세스를 띄우지 않습니다.

cat /dev/null > /var/log/wtmp

로그 파일의 내용을 자동으로 비우기(상용 웹 사이트에서 보내는 귀찮은 "쿠키"를 처리할 때 특별히 좋습니다):

예 29-1. 쿠키 항아리를 숨기기

if [ -f ~/.netscape/cookies ]  # 있다면 지우고,
then
  rm -f ~/.netscape/cookies
fi

ln -s /dev/null ~/.netscape/cookies
# 이제 모든 쿠키는 디스크에 저장되지 않고 블랙홀로 보내집니다.
/dev/zero의 쓰임새

/dev/zero/dev/null처럼 가상 파일(pseudo file)이지만, 실제로 널 값을 갖고 있습니다(아스키 문자 0이 아닌 숫자 0). 이 파일에 무언가를 쓰면 그 출력은 사라집니다. 이 파일에서 널 값을 읽어 내는 것은 아주 어렵습니다만 od 명령어나 헥사 에디터로 할 수는 있습니다. /dev/zero는 특정한 길이의 초기화된 더미 파일을 임시 스왑 파일로 만드는데 주로 쓰입니다.

예 29-2. /dev/zero로 스왑 파일 세팅하기

#!/bin/bash

# 스왑 파일 만들기.
# 루트로 실행시키세요.

ROOT_UID=0         # 루트 $UID 는 0.
E_WRONG_USER=65    # 루트가 아님.

FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0

if [ "$UID" -ne "$ROOT_UID" ]
then
  echo; echo "이 스크립트는 루트만 실행시킬 수 있습니다."; echo
  exit $E_WRONG_USER
fi  
  

if [ -n "$1" ]
then
  blocks=$1
else
  blocks=$MINBLOCKS              # 명령어줄에서 지정해 주지 않으면 
fi                               # 40 블럭을 기본값으로 세트.

if [ "$blocks" -lt $MINBLOCKS ]
then
  blocks=$MINBLOCKS              # 최소 40 블럭이어야 됩니다.
fi  


echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks  # Zero out file.

mkswap $FILE $blocks             # Designate it a swap file.
swapon $FILE                     # Activate swap file.

echo "Swap file created and activated."

exit $SUCCESS

/dev/zero의 다른 응용으로는, 파일이 0으로만 이루어진 지정된 크기를 갖게 하는 것인데, 루프백 디바이스를 마운트 하는 등의 특별한 목적을 위해 쓰입니다. 예 13-6예 12-33를 참고하세요.

예 29-3. 램디스크 만들기

#!/bin/bash
# ramdisk.sh

#  "ramdisk" 란 시스템의 RAM 의 일정 부분(segment)을 
#+ 파일시스템처럼 쓰는 것을 말합니다.
#  램디스크의 장점은 읽고/쓰기가 아주 빠르다는데 있습니다.
#  단점: 휘발성이 있기 때문에 시스템이 리부트되거나 꺼지면 그 내용을 잃어버립니다.
#        램디스크로 할당한 만큼의 메모리를 못 쓰게 됩니다.
#
#  램디스크가 뭐가 좋을까요?
#  테이블이나 사전처럼 아주 큰 데이타를 램디스크에 올려 놓으면
#+ 디스크 접근 속도보다 메모리 접근 속도가 훨씬 빠르기 때문에 데이타 탐색 속도가 빨라집니다.


E_NON_ROOT_USER=70             # 루트로 실행.
ROOTUSER_NAME=root

MOUNTPT=/mnt/ramdisk
SIZE=2000                      # 2K 블럭(필요에 따라 수정)
BLOCKSIZE=1024                 # 1K (1024 byte) 블럭 크기
DEVICE=/dev/ram0               # 첫번째 램 디바이스

username=`id -nu`
if [ "$username" != "$ROOTUSER_NAME" ]
then
  echo "\"`basename $0`\" 는 루트로 실행시켜야 됩니다."
  exit $E_NON_ROOT_USER
fi

if [ ! -d "$MOUNTPT" ]         #  마운트 포인트가 존재하는지 확인해서
then                           #+ 이 스크립트를 여러번 실행시켜도 에러가 나지 않도록 함.
  mkdir $MOUNTPT              
fi

dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE  # 램 디바이스 초기화(zero out).
mke2fs $DEVICE                 # 램 디스크에 ext2 파일시스템을 만들고,
mount $DEVICE $MOUNTPT         # 마운트.
chmod 777 $MOUNTPT             # 일반 사용자도 접근 가능하게.
                               # 하지만 언마운트는 루트만.

echo "이제 \"$MOUNTPT\" 를 쓸 수 있습니다."
# 이제부터는 일반사용자까지도 램디스크에 파일을 저장할 수 있습니다.

#  주의할 점은 램디스크가 휘발성을 갖기 때문에 리부트나 전원이 꺼질 때에는
#+ 그 내용이 없어집니다. 
#  저장하고 싶은 것이 있다면 램디스크가 아닌 일반 디렉토리로 복사해서 쓰면 됩니다.

# 리부트후에 램디스크를 다시 셋업하고 싶다면 이 스크립트를 실행시키면 됩니다.
#  /mnt/ramdisk 를 이 스크립트를 통하지 않고 
#+ 다른 방법으로 다시 마운트하려고 한다면 제대로 동작하지 않을 것입니다.

exit 0

'OS > LINUX' 카테고리의 다른 글

[/etc/rc.d/init.d/*] 데몬 실행 스크립트의 이해  (0) 2011.06.09
/dev/null 다시 만들기  (0) 2011.06.04
Perl 입문  (0) 2011.05.17
프로세스 - fork & exec  (0) 2011.05.14
쉘 스크립트 #6  (0) 2011.05.14

+ Recent posts