/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 |
로그 파일의 내용을 자동으로 비우기(상용 웹 사이트에서 보내는 귀찮은 "쿠키"를 처리할 때 특별히 좋습니다):
/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' 카테고리의 다른 글
ulimit 제한 설정 변경 [ 코어생성 ] (0) | 2009.09.22 |
---|---|
vi 편집기 활용 (0) | 2009.09.01 |
bash: /dev/null: Permission denied 에러 대처방법 (0) | 2009.06.02 |
Linux server security [1] (0) | 2009.06.01 |
Linux Server Security [2] (0) | 2009.06.01 |