[Linux / Unix ] 리눅스시스템 디렉토리 구조와 기능

2010. 4. 29. 13:20OS/Linux,Unix

리눅스를 설치하면 상당히 많은 디렉토리가 자동으로 생성됩니다. 이러한 디렉토리는 대부분 유닉스와 유사합니다. 파일 시스템의 구조는 유닉스의 종류(AT&T 계열과 BSD계열)에 따라 약간 차이가 있으며, 리눅스는 주로 AT&T를 중심으로 BSD가 섞인 형태입니다. 리눅스 연합에서는 이러한 배포판의 파일시스템 차이를 표준화하기 위해 FSSTND(File System Standard) 표준안을 마련해 놓고 있습니다.아래는 리눅스의 파일시스템 구조를 나타낸 것입니다.

 

파일과 디렉토리는 카테고리별로 조직화되어 있습니다. 위 그림에서 가장 분명하게 알 수 있는 카테고리는 고정(static)과 유동(dynamic)적인 파일들입니다. 또한 다른 카테고리로는 실행가능 여부, 환경설정, 데이터 파일들 등이 있습니다. 시스템 관리자라는 입장에서 볼 때, 이와 같은 파일 시스템 구조는 관리하기에 적합합니다.
고정적인 파일들과 디렉토리는 또한 네트워크 상의 다른 호스트들로부터 공유가 가능하기 때문에 공유 가능한(shared) 카테고리 분류에도 해당이 됩니다. /usr, /sbin, /opt 같은 디렉토리들이 여기에 해당합니다.
환경 파일들, 디바이스 파일들, 커널 파일들과 같이 특정한 호스트를 위한 파일들과 로그 파일들, 임시 파일들, 사용자의 홈디렉토리에 있는 파일들은 유동적인 파일들입니다. 관련 디렉토리로는 /boot, /home, /tmp, /dev, /etc, /var 등이 있습니다.

운영체제와 응용프로그램들은 서로 분리 시켜서 유지하여야 합니다. 오랜 시간 동안 많은 응용프로그램을 설치하다 보면 이러한 테크닉이 도움이 된다는 것을 알 수 있을 것입니다. 응용프로그램 제공업체들은 설치되는 위치에 대해서 사용자의 편의를 제공하지 않습니다. 부주의로 인해 운영체제 파일들을 응용프로그램 파일들이 덮어 쓰는 것을 방지하는 것은 시스템 관리자로써 매우 중요한 일입니다. 게다가 운영체제와 분리된 영역에 설치된 응용프로그램을 "모듈화"가 가능하므로 추가, 삭제 및 수정에 있어서 운영체제나 다른 응용프로그램에 영향이 미치지 않도록 할 수 있습니다. 유닉스 계열의 운영체제들은 /opt 라는 디렉토리에 응용프로그램들이 설치되지만, 레드햇 리눅스는 이 디렉토리를 구성하지 않고 /usr/local 디렉토리에 응용프로그램 별로 설치가 되거나 RPM으로 설치를 하면 각각의 구성파일들이 필요한 디렉토리로 설치가 됩니다.

실행 파일들도 시스템 환경 파일들과 구분이 되어져야 합니다. 이는 호스트들 사이에 실행 파일들을 공유하기 위함이며, 운영체제를 업데이트 할 때 환경 파일들에게 영향을 주는 것을 방지할 수도 있습니다.

다음은 레드헷 리눅스를 기준으로 한 디렉토리의 구성과 용도에 대한 간략한 설명입니다.

 

디렉토리

기능

/

 

 루트 디렉토리

/boot

 BOOT

 부트 이미지 디렉토리

/bin

 BINaries

 사용자 명령어 디렉토리

/dev

 DEVice

 장치 파일 디렉토리

/etc

 ETCetera

 시스템 환경 설정 디렉토리

/home

 HOME

 사용자 홈 디렉토리

/lib

 LIBraries

 공유 라이브러리 및 커널 모듈 디렉토리

/lost+found

 LOST+FOUND

 파일 시스템 복구를 위한 fsck의 링크 디렉토리

/misc

 MISCellaneous

 아키텍처 독립 자료 디렉토리

/mnt

 MouNT

 마운트 포인트 디렉토리

/opt

 OPeraTion

 애드온(Add-on) 소프트웨어 패키지 디렉토리

/proc

 PROCess

 커널과 프로세스를 위한 가상 파일 시스템 디렉토리

/root

 ROOT

 루트 사용자 홈 디렉토리

/sbin

 System BINaries

 시스템 명령어 디렉토리

/tmp

 TeMPorary

 임시 작업 디렉토리

/usr

 USeR

 공유 파일 시스템 디렉토리

/var

 VARiable data

 가변 자료 디렉토리

 

 그럼, 중요한 디렉토리들에 대한 자세한 내용을 살펴 보도록 하겠습니다.

 

▶ /

루트 디렉토리로 파일 시스템 계층 구조의 시작점입니다. 따라서 빈 상태로 유지하는 것이 바람직합니다.

 

▶ /boot

환경 설정 파일을 제외한 부팅 과정에서 필요한 모든 구성 요소들이 포함되어 있습니다.

 

▶ /bin

실행 파일들이 모두 모여 있습니다. 이 디렉토리에는 많은 필수적인 프로그램들이 포함되어 있습니다.

"ls /bin"을 해보면 이 안의 파일들을 볼 수 있으며 cp, ls, mv 같은 몇 개의 명령어들은 알아 볼 수 있을 것입니다. 이것들은 이들 명령어들의 실제 프로그램들입니다. 따라서 "cp" 명령을 입력하면, /bin/cp 프로그램이 실행되는 것입니다.

" ls -F"를 사용하면, /bin의 대부분의 파일들에서 "*"가 파일명 끝에 추가되어 있는 것을 볼 수 있습니다. 이것은 이 파일이 실행 가능한 파일임을 표시하는 것입니다.

 

▶ /dev

/dev 안의 파일들은 디바이스 드라이버들입니 다. 이것들은 디스크 드라이버, 모뎀, 메모리 등과 같은 시스템 디바이스나 자원들을 접근하는데 사용됩니다. 예를 들면, 파일들로부터 정보를 읽어 볼 수 있는 것과 같이, /dev/mouse를 access 함으로써 마우스로부터 입력되는 정보를 읽어 올 수 있습니다. fd로 시작하는 파일 이름들은 플로피 장치들입니다. fd0는 첫 번째의 플로피 디스크 드라이브이며, fd1은 두 번째입니다. 이 이외의 것들은 보통 플로피 디스크의 특정 형태를 표시합니다. 예를 들면, fd0H1440은 첫 번째 드라이브(A: 드라이브)의 고밀도 3.5 인치 디스켓을 말합니다.

 

/dev/console

시스템의 콘솔이며, 모니터가 시스템에 직접 연결되어 있음을 말합니다.

 

/dev/ttyS? 와 /dev/cua?

직렬 포트를 액세싱합니다. 예를 들면, /dev/ttyS0는 도스 상의 "COM1"을 뜻하며, /dev/cua는 "callout" 장치로써, 이것은 모뎀을 직접 액세스할 때 사용됩니다.

 

hd로 시작하는 디바이스 이름

하드 디스크를 액세스합니다. /dev/hda는 첫 번째 하드 디스크 전체를 뜻하며, hda1은 /dev/hda의 첫 번째 파티션을 의미합니다.

 

sd로 시작하는 디바이스 이름

SCSI 하드 디스크 드라이브나 테이프 드라이브 같은 SCSI 장치들을 의미합니다. 만약 SCSI 하드 디스크를 가지고 있다면, /dev/hda를 접근하는 대신에 /dev/sda를 액세스해야 합니다.

 

lp로 시작하는 디바이스 이름

병렬 포트를 말하며, /dev/lp1은 도스의 "LPT1"과 같습니다.

 

/dev/null

"black hole"로써 사용되는 것으로서 어떠한 데이터를 이 장치에 보내면 모두 없어지게 됩니다. 예를 들면, 화면에 아무 것도 출력되지 않기를 바랄 경우, /dev/null로 출력을 보내면 됩니다.

 

/dev/tty로 시작하는 디바이스 이름

시스템에 있는 "가상 콘솔 : Virtual Console(VC)"입니다. /dev/tty1은 첫번째 VC이며, /dev/tty2는 두 번째입니다. 가상 콘솔은 한 화면이 여러 개의 가상 터미널을 갖는 것입니다. 각각의 터미널은 [alt]+[F1], [alt]+[F2] 등을 누름으로서 전환할 수 있으며, 같은 사용자나 다른 사용자로 login할 수 있습니다.

 

/dev/pty로 시작하는 디바이스 이름

이것들은 원격 login 세션에서 사용되는 "pseudo-terminal"들입니다. 예를 들어, 사용 중인 컴퓨터가 네트워크에 연결되어 있고, telnet으로 login하려고 할 때, /dev/pty 디바이스를 사용합니다.

 

▶ /etc

시스템의 부팅, 셧다운 시에 필요한 파일들시스템의 전반에 걸친 설정 파일들 초기 스크립트 파일들이 있습니다. 시스템에 어떠한 문제가 발생한다거나, 시스템 전체 환경에 관한 설정을 바꾸기 위해서는 이들 디렉토리 내에 포함되어 있는 파일들에 대해서 잘 알아야 합니다.

 

/etc/rc.d/rc

/bin/sh shell이 시스템이 부트되면, 자동적으로 실행되는 스크립트입니다. 이것은 update, crond, inetd 같은 프로그램을 백그라운드로 실행시키며, 파일 시스템 마운팅, 스왑 영역 활성, 그리고 이런 유사한 다른 작업들을 합니다. /etc/rc.d/rc.local과 /etc/rc.d/rc.# 파일이 포함되기도 합니다.

 

/etc/passwd

사용자에 대한 정보를 포함하고 있는 문서 파일입니다.

 

/etc/fdprm

플로피 디스크 파라메터 표입니다.

 

/etc/fstab

이 파일은 /etc/rc.d/rc 파일 안의 mount -a 명령에 의해 마운팅되는 파일 시스템과 스왑 영역의 목록입니다.

 

/etc/getty (혹은 /sbin/getty)

이 프로그램은 터미널로 누군가가 login하기를 기다립니다. 명령어 init에 의해 자동적으로 실행되며, login 가능한 터미널 라인이나 가상 콘솔 당 한번씩 실행됩니다. 또한, 사용자의 패스워드를 기다리며, login을 실행합니다.

 

/etc/gettydefs 혹은 /etc/gettytab

getty가 터미널 라인의 속도, 패리티 검사 등을 어떻게 사용할 것인가를 설정합니다.

 

/etc/group

/etc/passwd와 유사하며, 사용자 대신에 그룹을 설정합니다.

 

/etc/init (혹은 /sbin/init)

이 프로그램은 부팅 시에 커널에 의해 첫 번째 프로세스로 실행됩니다. init가 실행된 후에 커널 부팅이 완료됩니다. init는 /etc/rc.d/rc와 getty 등을 실행합니다.

 

/etc/inittab

init가 시작할 때의 getty의 파일 목록입니다.

 

/etc/issue

로그인 프롬프트 이전에 출력되는 getty 출력 문서 파일입니다. /etc/issue.net 파일은 remote 로그인시 프로프트에 출력됩니다.

 

/etc/mtab

이 파일은 마운팅된 파일 시스템을 포함하고 있습니다. /etc/rc/rc.d와 mount나 umount 명령에 의한 셋업이며, 마운팅된 파일 시스템의 목록이 필요할 때 사용됩니다.

 

/etc/shadow

시스템의 shadow 패스워드를 포함하는 파일입니다.

 

/etc/login.defs

login 명령에 사용되는 설정 파일입니다.

 

/etc/printcap

/etc/termcap과 유사하며, 프린터를 사용할 때(lpr) 쓰입니다.

 

/etc/profile

Bourne shell(/bin/sh 혹은 bash)에 의해 로그인 할 때 실행되는 파일입니다.

 

/etc/securetty

터미널 보안을 위해 사용하는 것으로 root는 이 파일에 열거된 터미널로 로그인할 수 있습니다. 보통 가상 콘솔들이 열거되어 있으며, 모뎀이나 네트워크로 시스템에 접근하여 수퍼 유저의 권한을 얻는 것을 막을 수 있습니다.

 

/etc/shells

shell의 목록으로 chsh 명령으로 사용자 로그인 shell을 바꿀 때, 이 파일의 목록에 있는 shell만 바꿀 수 있도록 합니다.

 

/etc/termcap

터미널의 기능 데이터베이스입니다. 이것은 문서 파일로서 ESCAPE 문자들로서 터미널을 제어할 때 사용됩니다.

 

/etc/update (혹은 /sbin/update)

/etc/rc.d/rc에 의해 백그라운드로 실행되는 프로그램의 하나로 매 30초 마다 버퍼 캐시에 있는 하드로 쓰여지지 않은 데이터를 저장합니다. 이러한 것은 전원의 단절이나, 커널의 이상 등을 대비하여 매 30초 마다 데이터를 저장함으로써 데이터 손실의 위험을 줄이는 것입니다.

 

/etc/utmp (혹은 /var/run/utmp)

각각의 터미널에 로그인한 사용자나, 로그인에 관한 정보가 기록되어 있는 이진 파일입니다. 사용자가 로그인하면 login은 누가 로그인을 하고 언제 로그 아웃을 하였는가에 대한 정보를 기록합니다.

 

/etc/wtmp (혹은 /var/log/wtmp)

/etc/utmp와 유사하며, 단지 존재하는 정보를 덮어 쓰지 않고 계속 추가합니다. /etc/ftpusers, /etc/rpc, /etc/exports 네트워크에 관한 파일들입니다.

 

▶ /home

사용자의 홈 디렉토리로써 login 하였을 경우, 처음으로 위치하게 되는 디렉토리입니다. 예를 들어, /home/foo는 사용자 "foo"의 홈 디렉토리입니다. 시스템이 새로 설치되면, 이 디렉토리 안에 아무 것도 포함되어 있지 않습니다.

 

▶ /lib

부팅과 시스템 운영에 필요한 공유 라이브러리(Shared Library)커널 모듈(Kernel Module)이 위치합니다. 공유 라이브러리란 windows 95/98의 DLL(Dynamic Link Library)과 같이 여러 가지 프로그램들에 의해서 사용되는 기능을 별도의 프로그램으로 분리시켜 놓은 것입니다. 커널 모듈도 공유 라이브러리와 같이 커널 안에 자체적으로 프함되지 않고 독립적인 형태로 분리되어 있으면서 부팅 시에 커널에 동적으로 연결되어서 전체적인 커널을 유기적으로 구성하게 되는 별도의 파일(Object File)들입니다.

 

▶ /lost+found

파일 시스템의 이상 유무를 진단하고 복구하는 프로그램인 fsck(File System Check)에 의해서 사용되는 디렉토리입 니다. 손상된 파일이나 디렉토리를 /lost+found 디렉토리로 연결한 뒤에 오류를 수정하게 되며, 평상시에는 null 파일 링크에 의해서 비어있는 상태로 존재합니다. 리눅스의 파일 시스템인 ext2에 의한 fsck.ext2(File System Check.extended2) 프로그램도 이 디렉토리를 사용합니다.

 

▶ /misc

시스템 아키텍처와 무관한 프로그램들과 자료들이 위치합니다. 레드햇 리눅스는 이 디렉토리를 구성하지 않습니다.

 

▶ /mnt

루트 파일 시스템에 연결된 파일 시스템들의 마운트 디렉토리입니다. 마운트하지 않은 상태에서 빈 디렉토리로 존재하지만 마운트시키게 되면 해당 파일 시스템의 내용이 그대로 포함됩니다.

 

▶ /opt

Add-On 소프트웨어 패키지가 설치됩니다. 레드햇 리눅스는 이 디렉토리를 구성하지 않습니다.

 

▶ /proc

가상 파일 시스템입니다. 이 디렉토리의 내용들은 시스템에서 운영되고 있는 다양한 프로세서들에 관한 내용과 프로그램에 대한 정보를 포함하고 있습니다. 이 디렉토리에서 볼 수 있는 것은 실제 드라이브에 저장되어 있는 내용이 아니며, 메모리 상에 저장되어 있는 것입니다.

 

▶ /root

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

 

▶ /sbin

시스템 관리를 위한 전반적인 실행 유틸리티를 담고 있습니다. 이 디렉토리에 있는 명령어들은 일반 사용자는 실행할 수 없습니다.

 

▶ /tmp

프로세스 진행 중 발생하는 임시 파일들이 저장되는 작업 디렉토리입니다. 따라서 이 디렉토리 파일들은 수시로 생성되고 삭제되므로 중요한 자료일 경우, 이 디렉토리에 보관해서는 안됩니다. /tmp 디렉토리는 모든 사용자에 대해서 읽기와 쓰기 작업이 허용되며, 스티키 비트(sticky bit)라는 특별한 설정에 의해서 파일의 소유자만이 자신의 소유로 되어 있는 파일을 지울 수 있도록 되어 있습니다.

 

▶ /usr

루트 디렉토리와 함께 중요한 시스템 디렉토리 계층을 구성합니다. /usr 디렉토리에는 공유 가능한 대부분의 프로그램들이 설치되며 네트워크를 이용해서 여러 개의 시스템을 연결할 경우, 이 디렉토리를 공유해서 설치된 프로그램들을 활용할 수 있게 됩니다. 따라서 /usr 디렉토리는 읽기 전용으로 마운트되어야 하며, 가변 자료들은 /var 디렉토리로 심볼릭 링크시켜서 사용하게 됩니다. /usr 디렉토리는 다른 시스템과 연결될 경우, 시스템 운영과 연관되기 때문에 내부적으로 전체 루트 디렉토리와 유사한 구조를 갖게 됩니다.

 

/usr/X11R6

X윈도우 시스템을 설치하였다면 이 디렉토리에 설치가 됩니다. X윈도우 시스템은 방대하여, 많은 그래픽 유틸리티와 프로그램들이 그래픽 윈도우로 출력되는 강력한 그래픽 사용자 환경입니다. 이 디렉토리에는 X윈도우 실행 파일, 사양 파일, 자원 파일들을 포함하고 있습니다. X11R6은 X의 버전과 릴리즈 번호를 뜻합니다.

 

/usr/bin

시스템이 소유하고 있는 소프트웨어를 담기 위한 warehouse입니다. /bin과 같은 곳에는 없는 유용한 실행 파일들을 가지고 있습니다.

 

/usr/etc

유틸리티와 파일들이 있습니다. 일반적으로 /usr/etc에 있는 파일들은 /etc에 있는 것만큼 반드시 필요한 것들은 아닙니다.

 

/usr/include

C 컴파일러를 위한 include 파일을 포함합니다. 이 파일은 데이터 구조 이름과 서브루틴, 상수 같은 C로 작성된 프로그램에서 사용되는 내용을 담고 있습니다. /usr/include/sys에 있는 파일들은 리눅스 시스템 레벨의 프로그래밍을 할 때 사용됩니다. 만약, C프로그래밍 언어에 익숙하다면, 여기에 printf()가 선언되어 있는 stdio.h같은 헤더 파일을 찾을 수 있을 것입니다.

 

/usr/lib

/lib에서 찾을 수 있는 "stub"와 "static"와 같은 라이브러리를 포함하고 있습니다. 프로그램을 컴파일할 때, 프로그램은 /usr/lib에 있는 파일들과 link되며 이 라이브러리 안에 실행 코드가 필요로 할 때, /lib를 찾습니다. 또한, 많은 프로그램들이 /usr/lib 안에 사양 파일을 저장합니다.

 

/usr/local

/usr에 포함된 것과 유사하고, 시스템에 반드시 필요로 하는 것은 아니지만, 매우 유용한 것들을 포함하는데 사용합니다. /usr/local에 있는 프로그램들은 시스템의 특성을 결정 짓는 소프트웨어들이 있을 수 있습니다.

 

/usr/man

이 디렉토리는 실제적인 man page를 포함하고 있습니다.

 

/usr/src

시스템에 있는 다양한 프로그램의 컴파일 되지 않은 소스 코드를 포함하고 있습니다. 여기서 가장 중요한 것은 /usr/src/linux이며, 이것은 리눅스 커널의 소스 코드를 포함하고 있습니다.

 

/usr/dict

사전 파일 디렉토리입니다.

 

/usr/doc

프로그램의 문서와 관련한 파일들이 저장되는 곳입니다.

 

/usr/games

게임 프로그램들이 위치하고 있습니다.

 

/usr/infi

GNU info 파일을 위한 디렉토리입니다.

 

/usr/sbin

시스템 명령어들이 위치합니다.

 

/usr/share

아키텍처 독립적인 자료들의 디렉토리입니다.

 

▶ /var

내용이 수시로 변경될 수 있는 변수를 담고 있는 파일들이 위치합니다. 예를 들면, 부팅 중의 시스템 확인 과정은 부팅 때마다 달라질 수 있으므로 부팅 과정을 기록하는 파일은 이 디렉토리에 위치하게 됩니다. /tmp 디렉토리가 파일 자체에 대한 임시 디렉토리인데 반해서 /var 디렉토리는 변경될 수 있는 자료를 포함하고 있는 파일들을 위한 디렉토리입니다.

 

/var/adm

시스템 관리적인 문제의 파일, 로그 파일, 커널 크래쉬 덤프를 기록한 파일들을 포함합니다.

 

/var/spool

스풀 파일들이 위치합니다.

 

 

참고글

HP-UX 11.x system administration handbook and toolkit - Marty Poniatowskil (Prentice Hall PTR, 1999)

레드햇 리눅스 ver.5.2 완벽 가이드 - 송창훈(사이버출판사, 1999)