P.C.를 처음 본 것이 1987년이었습니다. 그리고 1989년부터 DOS를 사용해왔기 때문에 횟수로 따진다면 만 19년동안 Microsoft사의 O.S.를 사용해 왔습니다. 그러다 보니 리눅스 시스템에 처음 입문했을 때 어려운 점은 참 많죠. 그래도 리눅스 시스템과 친해질 수 있었던 첫 걸음은 아마도 File System 에 대한 이해부터 라고 생각됩니다.

물론 지금도 자세하고 깊이 아는 것은 아닙니다만 File System의 이해와 마운트가 어떤 것인지 이해를 하다보니 조금씩 리눅스 시스템에 적응이 되어 가는 것으로 생각됩니다. 그래서 이번 시간에는 간단하게 나마 리눅스의 File System에 대해 소개하려 합니다.

간단 설명

리눅스에서 쉘은 여러 종류가 있고 쉘마다 특징이 있습니다. 쉘은 크게 본쉘(bash), C쉘(csh), 콘쉘(ksh)이 있습니다. 레드핫계열의 리눅스의 디렉토리 구조는 다음과 같습니다.

디렉토리 명 설    명
/ 루트 디렉토리
/bin 가장 필수적인 실행명령
/boot 커널,LILO 등 부팅에 관련된 파일
/dev 장치파일 모음
/etc 시스템 전체 설정파일
/home 사용자의 홈디렉토리
/lib C 라이브러리 등 가장 필수적인 공유 라이브러리
/mnt 임시 마운트용 디렉토리
/proc 시스템 정보를 위한 가상적인 디렉토리
/root 루트 사용자의 홈 디렉토리
/sbin 시스템 관리용 실행파일
/tmp 임시 파일 생성용 디렉토리
/usr 어플리케이션이 설치되는 디렉토리
/var 시스템 운영중 생성되는 각종 임시 파일

대충 흝터 받으니까 이번에는 상세하게 알아 보겠습니다.

/

"루트 디렉토리"라고 불리우며 리눅스 파일 시스템에서 가장 최상위 디렉토리이면서 파일 시스템의 근간을 이루는 기본 디렉토리로 모든 디렉토리 구조의 시작입니다. 이름이 루트이다 보니 저도 자꾸 /root 와 헤깔립니다. 그러나 /root 는 사용자 계정 중의 하나인 시스템 관리자의 계정입니다.

/boot

리눅스 커널이 저장되어 있는 디렉토리로서 리눅스 boot에 필요한 각종 booting지원 파일들이 저장되어 있습니다. 예로 부팅 이미지, 시스템 맵, 모듈 정보, 리눅스 커널 등이 들어 있습니다.

/dev

시스템의 각종 디바이스들에 접근하기 위한 디바이스 드라이버들이 저장되어 있는 디렉토리로 하드디스크에 차지하는 공간이 없는 가상 디렉토리이다. 대표적으로는 하드 드라이브, 플로피, 씨디롬, 시리얼 포트 그리고 루프팩장치 등이 존재합니다.

리눅스 시스템은 윈도우와 달리 각종 디바이스 장치들을 하나의 파일로 취급합니다. 따라서 시스템은 각각의 장치 정보를 /dev 디렉토리에 존해하는 해당 장치 파일로 부터 가지고 와서 처리합니다.

각 장치는 제어하기 위한 디바이스 드라이버 파일이 존재하는데, 크게 2가지가 있습니다. 하나는 통신포트, 프린터 포트, 터미널 장치처럼 한번에 한 바이트씩 차례로 오가는 단방향의 문자 장치가 있고, 또 하나는 버퍼를 사용하여 한번에 블록 단위로 처리하는 블록 장치가 있습니다.

앞서 말씀드린바와 같이 이 디렉토리에는 하드디스크의 공간을 차지하는 곳이 아닙니다. 디바이스 드라이버 파일을 만들고 이를 등록하면 이 폴더에 나타나게 되는데, 등록하는 방법에는 콘솔에서 직접 mknod 명령을 사용하거나 /dev/MAKEDEV 라는 스크립트를 이용할 수 있습니다.

장치 하나를 볼까요?

[root@jwCentOS dev]# ls -al ttyS0
crw-rw---- 1 root uucp 4, 64 3월 18 15:45 ttyS0

퍼미션 부분의 crw-rw---- 첫번째 문자 c 는 문자 장치를 나타냅니다. b 이면 블록 장치입니다. 그리고 uucp 다음에 나오는 첫 번째 숫자가 디바이스 드라이버의 메이저 번호이고 다음 숫자가 마이너 번호인데, (1) 각 장치에는 고유 번호인 메이저 번호가 있고 (2) 이 메이저 번호를 가지고 커널은 어떤 디바이스 드리이버를 사용할지를 결정하게 됩니다. (3) 또한 같은 디바이스 드라이버를 사용하는 같은 장치가 여러 개가 있을 때, (4) 디바이스 드라이버는 마이너 번호로 각 장치를 구별하게 됩니다.

예를 들어 시리얼 포트 첫번째가 메이저 번호 4번이고 마이너 번호가 64라면 두번째 시리얼 포트는 메이저 번호가 같은 4번이면서 마이너 번호가 65가 됩니다.

(1) 첫 번째 시리얼 포트를 사용하게 되면, (2) 커널은 메이저 번호 4번으로 디바이스 드라이버를 선택하고 (3) 디바이스 드라이버에 마이너 번호를 전달해 줍니다. 그러면 (4) 디바이드 드라이버는 마이너 번호로 어떤 장치를 제어할 지를 판단하게 됩니다.

몇 가지 대표적인 장치를 보겠습니다.

디렉토리 명 설    명
/dev/fd0 프로피 디스크 드라이브
/dev/hda 첫 번째 슬롯 마스터 IDE 하드 디스크 드라이브
/dev/hdb 첫 번째 슬롯 슬레이브 IDE 하드 디스크 드라이브
/dev/hdc 두 번째 슬롯 마스터 IDE 하드 디스크 드라이브
/dev/hdd 두 번째 슬롯 슬레이브 IDE 하드 디스크 드라이브
/dev/sda 첫 번째 SCSI 하드 디스크 드라이브
/dev/sdb 두 번째 SCSI 하드 디스크 드라이브
/dev/st0 첫 번째 SCSI 테이프 드라이브
/dev/st1 두 번째 SCSI 테이프 드라이브
/dev/scd0 첫 번째 SCSI CD 롬 드라이브
/dev/scd1 두 번째 SCSI CD 롬 드라이브
/dev/cdrom IDE CD 롬 드라이브
/dev/mouse 마우스
/dev/ttyS0 COM 1 시리얼 포트
/dev/ttyS1 COM 2 시리얼 포트
/dev/lp0 첫 번째 병렬 포트
/dev/lp1 두 번째 병렬 포트
/dev/console 시스템의 콘솔 장치입니다.
/dev/null

아무것도 없는 장치(?) 하수구라고 생각하시면 되겠습니다. 예로 어떤 출력을 해야 하는데, 그 출력을 그냥 버리고 싶다면 출력 방향을 이 장치로 설정하면 그냥 하수구로 버리듯이 모든 출력이 사라집니다.

이 장치는 프로그램에서 열기 명령을 사용하면 항상 OK가 됩니다. 그러므로 프로그램에서도 디버깅에 상용되며, 셀 명령 실행에서 보기 싫은 출력 문자열을 없앨 때에도 사용됩니다.

/dev/zero /dev/null처럼 가상 파일이면서 이 장치에 쓰기를 하면 출력이 사라지지만 특정한 길이의 초기화된 더미 파일을 임시 스왑 파일을 만들 때 사용한다고 합니다. 아직은 도대체 뭔 소리인지 잘 모르겠습니다. --;

/proc

MS 윈도즈의 작업 관리자를 보면 실행 중인 프로세스의 정보가 출력되는 것처럼 시스템의 각종 프로세서, 프로그램 정보 그리고 하드웨어적인 정보들이 저장되어 있습니다. 이 티렉토리도 /dev처럼 가상 파일 시스템으로 하드 디스크의 물리적인 공간을 사용하지 않고 메모리 상에 존재합니다.

예로 cpuinfo 를 출력해 보시면 CPU 정보를 보실 수 있습니다.

]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 CPU 6300 @ 1.86GHz
stepping : 6
cpu MHz : 1932.425
cache size : 2048 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme pse tsc msr pae cx8 pge cmov acpi mmx fxsr sse sse2
bogomips : 3914.89

역시 대표적인 정보를 알아 보겠습니다.

cat ****   설    명
/proc/1/status

첫번째 프로세스의 상태를 출력합니다.

/proc 아래에 프로세스 별로 번호에 맟춘 디렉토리가 있으며, 각 디렉토리에 프로세스별 정보가 있습니다. 예로,  /proc/1

/proc/cpuinfo cpu 에 대한 타입, 제조사, 모델, 성능 등에 관한 정보가 출력
/proc/devices 현재 동작 중인 디바이스 드라이버 목록
/proc/dma 현재 어떤 DMA 채널을 사용 중인지를 출력
/proc/filesystems 커널에 설정되어 있는 파일 시스템 목록
/proc/interrupts 어떤 인터럽트가 사용 중이고 각각의 인터럽트가 얼마나 사용되었는지를 출력
/proc/ioports 현재 어떤 I/O 포트가 사용 중인지를 출력
/proc/kcore 현재 시스템에서 사용중인 메로리의 실제 이미지로 실제 메모리의 내용을 모두 가진 것처럼 보이지만 프로그램이 필요로 하는 부분의 이미지만을 필요할 때 만들어 제공
/proc/kmsg 커널에 의해서 출력되는 메시지들을 저장하고 있는 파일
/proc/loadavg 현재 시스템의 평균 부하량(Load Average)에 대한 정보를 출력
/proc/ksyms 시스템 커널이 사용하고 있는 심볼들에 대한 정보를 저장하고 있는 파일
/proc/meminfo 사용중인 메모리의 사용량을 출력. 가상 메모리에 대한 정보도 얻을 수 있습니다.
/proc/self /proc를 억세스하는 프로그램의 프로세스 디렉토리에 대한 심볼릭 링크로 두개의 프로세스가 /proc에 접근하면 각각은 서로 다른 링크를 가지게 됩니다. 이것은 주로 프로그램이 자신의 프로세스 디렉토리에 쉽게 접근할 수 있도록 해줍니다.
/proc/stat 시스템의 현재 상태에 대한 다양한 정보를 저장하고 있는 파일
/proc/uptime 시스템이 얼마나 오래 동작했는지에 대한 정보를 저장하고 있는 파일
/proc/version 시스템이 현재 사용중인 커널 버전에 대한 정보를 저장하고 있는 파일

/bin

binaries의 약어로 이진 파일들이며 리눅스에서 가장 기본이 되는 명령어들이 모여 있는 디렉토리입니다. 파일 목록을 보여주는 ls 라든지 일반 사용자가 root 계정으로 잠시 로그인하게 해주는 su 라든 하는 일반 사용자를 포함한 모든 사용자들이 사용하는 프로그램이 들어 있습니다.

또한 이곳에는 부팅에 필요한 명령어들이 위치하여 부팅한 후에 시스템의 계정 사용자들이 사용할 수 있는 일반적인 명령어들도 위치 하고 있습니다.

프로그램이 많아서 모두 설명드릴 수 없지만 자주 사용하는 몇 가지를 올립니다.

프로그램  설    명
cat 파일 내용을 출력
chgrp

파일의 그룹 속성 변경

chmod 파일의 접근 권한 변경
chown 파일의 소유자 변경
cp 파일 복사
cut 특정 필드를 파일 밖으로 복사
date  현재 날짜 출력
df 파일 시스템별 용량 출력
dmesg

부팅 메시지 출력

grep 파일 안의 특정 패턴을 검색

gupzip
gzip

파일 압축
hostname 컴퓨터 이름 출력
kill 프로세스 죽이기
link 링크 만들기
ls 파일 목록 출력
mkdir 디렉토리 만들기
mount 장치를 시스템에 연결
mv 파일 이동/파일 이름 변경
netstat 현재 연결된 네트워크에 대한 모든 정보
ping 상대 P.C. 가 네트워크에 연결되어 있는지 확인
ps 실행 중인 프로세스 목록
pwd 현재 작업 디렉토리 출력
rm 파일 삭제
rmdir 디렉토리 삭제
rpm rpm 관리자
sleep 초 단위 대기
su 사용자 변경
tar 여러 개의 파일을 묶거나 풀기
touch 크기가 0인 파일을 만들거나 파일의 날짜/시간을 변경
umount mount 해제
unlink link 파일 제거
usleep 1/1,000,000초 단위로 대기
vi vi 에디터

 

/sbin

시스템 관리를 위한 다양한 프로그램이 들어 있는 디렉토리입니다. 매우 많은 프로그램이 들어 있어서 모두 설명을 드리기에는 어렵고 몇가지를 정리해 보겠습니다.

프로그램  설    명
clock 현재의 날짜와 시간을 출력
fdisk

파티션을 새로 생성하거나 삭제

findfs 라벨에 해당되는 파티션 정보 구하기
fixfiles 파일과 관련하여 많은 거부 상황이 발생할 때 사용
grub grub 부팅 관리자 관련 프로그램
grub-install
grub-md5-crypt
grub-terminfo
halt 시스템 종료
ifconfig 네트워크 설정
ifdown 네트워크 종료
ifup

네트워크 시작 

*** 네트워크 설정 상태를 변경하셨다면 ifdown 과 ifup으로 네트워크를 다시
*** 시작하실 수 있으나 /etc/init.d/network restart 로 한버에 재 시작할 수 있습니다.

lilo lilo 부팅 관리자 프로그램
mkfs 하드 디스크 파티션을 리눅스 파일 시스템
poweroff halt 와 같이 시스템 종료
reboot 시스템 리부팅

/etc

이 디렉토리는 리눅스 시스템에 관한 각종 환경 설정에 연관된 파일들과 디렉토리들을 가진 아주 중요한 디렉토리입니다. 이 디렉토리에 있는 대부분의 파일들은 시스템 관리자에 의해 관리되는 파일들입니다.

사용자 정보를 가지고 있는 passwd, 그룹 정의 파일인 group, 프린터 목록 파일 printcap, 자동 마운트될 파일 시스템을 등록해 두는 파일 시스템 테이블인 fstab 외에도 웹 서버 환경 설정, 시스템 계정 사용자 정보, 패스 워드 관리, 시스템의 파일 시스템 관리 파일, 여러가지 시스템 보안에 관련된 파일들, 시스템 초기화 설정 파일, TCP/IP 설정 파일 등 시스쳄 전반에 걸친 거의 모든 환경 설정 파일들이 모두 이 디렉토리에 있습니다.

내  용 설    명
/etc/rc.d

시스템의 부팅과 시스템 실행 레벨 변경시에 실행되는 스크립트들이 저장되어 있는 디렉토리로 리눅스의 6가지 실행 레벨로 각각의 해당 디렉토리가 있습니다.

/etc/shadow 파일에서 패스워드 부분만을 따로 저장하는 파일. 이 파일에 패스워드는 암호화 되어 셰도우 패스워드 형태로 저장되어 있으며 시스템 관리자만이 접근할 수 있기 때문에 크래킹 등에 대한 피해를 줄임.
/etc/group 시스템의 그룹에 대한 정보를 저장하고 있는 파일
/etc/inittab init를 설정하는 파일

/etc/issue,
/etc/issue.net

getty에 의해서 로그인을 위한 프롬프트가 뜨기 전에 출력되는 메시지를 설정하는 파일. 리눅스 시스템으로 접속할 경우 가장 처음으로 볼 수 있는 메시지로 보통 시스템에 대한 설명과 각종 환영 메시지를 전달하기 위해서 사용됩니다. issue 파일의 내용은 보통 시스템의 터미널에서 볼 수 있으며 /etc/issue.net 파일의 내용은 리모트상에서 시스템으로 접속할 경우 볼 수 있습니다.

/etc/motd 'Message of the day'의 약자로 시스템으로의 접속에 성공할 경우 쉘이 뜨기 전에 출력되는 메세지를 설정하는 파일
/etc/profile,
/etc/csh.login,
/etc/csh.cshrc
시스템이 시작될 때 사용자가 로그인을 할 때 본쉘이나 C쉘에 의해서 실행되는 스크립트 파일. 일반적으로 사용자들에 대한 기본 환경 설정에 사용.
/etc/securetty 시스템 관리자가 시스템에 로그인할 수 있는 안전한 터미널에 대한 정보가 저장. 일반적으로 가상 콘솔이 설정되어 있으며 네트워크를 통해 시스템으로 침입해 시스템 관리자의 권한을 획득하는 크랙킹을 막기 위해서 사용합니다.
/ete/shell 시스템에서 안정적으로 사용할 수 있는 쉘에 대한 정보를 저장하고 있는 파일. 만약 chsh명령을 사용해 사용중인 쉘을 바꾸려면 이 파일에 저장되어 있는 쉘중에 선택해야 합니다. 또한 ftp데몬의 경우 사용자의 쉘을 검사하여 /etc/shell에 저장되어 있지 않은 쉘을 사용한다면 로그인을 허용하지 않습니다.

/mnt

외부 장치인 플로피 디스크, 시디롬, 삼바등을 마운트하기 위해서 제공되는 디렉토리입니다. 임시로 사용되는 디렉토리이므로 프로그램들은 /mnt에 어떤 파일 시스템이 마운트 되었는지 자동으로 인식하지 않습니다. 또한 /mnt는 보통 여러 개의 하위 디렉토리로 나누어 사용되고, 평소에는 각 디렉토리들은 비어 있습니다.

예를 들어 CD-ROM을 마운트하시려면,

]# mount -t ISO9660 /dev/cdrom /mnt/cdrom

이렇게 CD-ROM을 마운트하면 CD-ROM이 열리질 않습니다. 마운트를 해제해야 CD-ROM이 빠집니다.

]# umount /mnt/cdrom

그런데, "Device is Busy" 라는 에러를 내면서 언마운트가 안되는 경우가 있습니다. 이럴 때에는 장치를 사용하는 프로세스를 죽이시면 됩니다.

fuser -km /mnt/cdrom

또 다른 사용은 nfs 공유 폴더를 공유하는 방법이죠.

]# mount -t nfs -o nolock 192.168.10.50:/home/jwjw/prjs /mnt/nfs

/usr

시스템에 사용되는 각종 프로그램들이 설치되는 디렉토리로 프로그램과 관련된 명령어와 라이브러리들이 이 디렉토리에 위치 합니다. 또한 X 시스템관련 파일들과 리눅스 커널 소스, 각종 C 언어 과련 해더 파일 등도 이 디렉토리 안에 저장되어 있습니다.

내  용 설    명
/usr/bin 리눅스 시스템에서 사용되는 각종 프로그램들이 저장되어 있으며 /bin 디텍토리에 없는 다양한 실행 파일들이 저장되어 있는 디렉토리
/usr/X11R6 X 윈도우 시스템에 사용되는 모든 파일들이 이 디렉토리 안에 저장되며 X 윈도우 시스템의 개발과 설치를 좀더 쉽게 하기 위해서 전체 시스템 디렉토리 구조에 통합되지 않고 독자적인 구조
/usr/etc /etc 디렉토리에는 각종 환경 설정 파일들이 있듯이 이곳에도 여러 가지 시스템 환경 설정 파일들이 저장되어 있습니다. /usr/etc의 파일들은 /etc디렉토리 안의 파일들과 달리 반드시 필요한 파일들은 아닙니다.
/usr/sbin 시스템 관리자를 위한 명령어들이 저장되는 디렉토리이며 명령어들은 루트 파일 시스템에는 필요가 없는 서버 프로그램들이 저장됩니다.
/usr/include C 라이브러리 및 각종 추가 라이브러리 헤더 파일
/usr/lib /lib 에 들어 있는 라이브러리를 제외한 라이브러리로 /usr/bin의 실행 파일의 동적 링크된 라이브러리가 들어 있습니다.
/usr/local 시스템 관리자에 의해서 따로 설치되는 프로그램들을 모아 놓은 곳으로 시스템에 관련된 프로그램이 아닌 관리자가 소스를 가져다가 컴파일하여 설치한 파일이 저장되는 곳입니다.
/usr/man man페이지의 실제 내용들이 저장되어 있는 디렉토리. man1, man2, man3, 등과 같이 여러개의 디렉토리들로 나누어져 있으며, man1 디렉토리는 섹션 1의 man 페이지 소스를 위한 디렉토리가 됩니다.
/usr/src 시스템에서 사용하는 각종 프로그램들의 컴파일되지 않은 소스 파일들이 저장되어 있다./usr/src/linux 디렉토리가 리눅스의 커널소스를 저장하고 있는 디렉토리입니다.
/usr/X386 /usr/X11R6 디렉토리와 유사한 티렉토리로 X11 Release 5를 위한 디렉토리
/usr/info GNU info문서들을 저장하고 있는 디렉토리
/usr/doc 각종 문서들이 저장되어 있는 디렉토리
/lib

일반적인 리눅스 시스템에서 사용하는 공용 라이브러리 파일들이 위치한 디렉토리입니다.
/lib/modules 디렉토리에는 커널로 로딩 사능한 커널 모듈들이 저장되어 있습니다.

/home

사용자 별로 제공되는 홈 디렉토리가 위치하는 디렉토리입니다. 그러므로 시스템에서 사용하지 않으며 네트워크로 시스템에 접속하는 사용자들을 위한 공간입니다.

/var

각종 시스템 로그 파일이나 사용자 로그인에 대한 보안기록등과 같은 시스템에서 사용되는 동적인 파일들이 저장됩니다.

내  용 설    명
/var/cache 포멧된 메뉴얼 페이지들이 잠시 대기(Cache)하기 위한 디렉토리
/var/lib 시스테이 동작하면서 계속 수정되고 변경되는 파일들을 위한 디렉토리
/var/local /usr/local 디렉토리에 설치된 프로그램들의 각종 데이터들이 저장되는 디렉토리
/var/lock 잠금 파일들이 저장되는 디렉토리로 프로그램들이 특정한 장치나 파일들을 프로그램 자신이 독점적으로 사용하려 할 때 /var/lock 디렉토리에 잠금 파일을 만들어 사용하게 됩니다. 그렇기 때문에 다른 프로그램들은 장치나 파일을 사용하기 전에 우선 이 디렉토리의 내용을 조사하여 해당 장치나 파일들이 사용중인지 확인합니다.
/var/log 프로그램들의 로그 파일을 저장하는 디렉토리
/var/log/boot.log 부팅시 시작된 데몬들에 대한 정보
/var/log/cron 크론 메시지
/var/log/dmesg 부팅 시 컴퓨터 초기화 부분의 메시지가 기록되며 마직 부팅 메시지를 담습니다.
/var/log/secure 서비스를 받기 위하여 서버에 접속하는 모든 기록이 저장
/var/log/spooler 메일 및 뉴스 로그 파일
/var/log/statistics 센드 메일에서 사용하는 로그 파일
/var/log/wtmp 로그인한 사람의 정보를 가지고 있는 데이터 파일. 시스템을 사용하고 있는 사람의 정보를 가지고 있습니다.
/var/log/lastlog 마지막에 로그인한 사람에 대한 정보
/var/log/messages 시스템의 이상 유무에 대한 로그 파일로 시스템의 이상 유무를 파악하는데 사용
/var/log/xferlog ftp 억세스 로그 파일
/var/log/htmlaccess.log 아파치 웹 억세스 로그 파일. rpm으로 설치 시 여기에 억세스 로고가 쌓이며 /var/log/httpd/와 더블어 아파치와 관련된 로그 파일
/var/log/maillog 센드 메일의 로그 파일. 사용자가 메일 관련하여 접속할 경우 기록
/var/run 시스템의 현재 정보들을 저장하고 있는 디렉토리. /var/run/xinetd.pid 파일의 경우 현재 사용중인 xinetd 데몬의 프로세스 번호를 저장
/var/spool 메일이나 뉴스, 프린터 큐 등고 같은 시스템상에서 대기 상태에 있는 작업들을 위한 디렉토리. 각각의 대기 작업들은 모두 /var/spool 아래 고유의 디렉토리에 위치합니다. 예를 들어 시스템의 계정 사용자들의 메일은 /var/spool/mail 에 저장됩니다.
/var/tmp /tmp에 저장된 임시 파일들중에 오래 보관되어야 할 임시 파일들이 저장되는 디렉토리
/var/log/netconf.log netconf 명령어 수행에 대한 로그 파일

/tmp

임시 파일을 위한 디렉토리입니다.

/root

시스템 관리자의 홈 디렉토리입니다.