제대로 서버를 운영해 보겠다고 처음 리눅스를 설치하고 난 직후, 명령어 연습을 하고 있을 때 유독 눈에 거슬리던것들이 있었다. 바로 루트 디렉토리(/)에 있던 bin, dev, var, ... 이런 디렉토리들이습니다.
home이나 boot의 경우 무엇인지 바로 알 수 있었지만, 그 나머지들은 딱 봐서는 뭐가 뭔지 잘 알 수가 없었습니다.
어느 정도 리눅스에 익숙해진 지금, 리눅스 루트 디렉토리에 포함되어 있는 이상한(?) 디렉토리들의 명칭과 기능을 정리해 도록 하겠습니다.
/ (root)
최상위 디렉토리입니다.
드라이브 문자부터 시작하는 윈도에서의 경로와 달리, 리눅스에서는 최상위 디렉토리가 '/'이므로 절대경로는 무조건 이 슬래시로 시작하게 됩니다.
윈도 파일시스템과 다른 또 한가지 중요한 특징은, 하드디스크나 USB와 같은 메모리는 물론 키보드, 모니터, 프린터와 같은 '장치' 들도 파일시스템상에 디렉토리나 파일의 형태로 존재한다는 점입니다.
예를 들어, 윈도에 익숙한 사용자가 리눅스로 자신있게 부팅해서 USB를 꽃으면 또 다른 루트(/)가 뙇! 하고 생기겠거니 하고 기대할지도 모르지만, 현실은 /dev/sdx 처럼 루트로부터 시작하는 하위 디렉토리에 붙어서 보여집니다.
외부 장치를 디렉토리 형태로 '붙이는'것을 전문용어(?)로 '마운트(Mount)'라고 합니다.
/bin
'binary'의 약자로, 실행 가능한 파일들이 저장되어 있습니다.
흔히들 많이 사용하는 ls, cp, mv, rm 등과 같은 명령어들의 실행파일이 바로 이곳이 존재합니다. 예를 들어, Shell에서 mkdir blah~blah 라고 치면 바로 이 bin 디렉토리에서 mkdir 바이너리를 찾아서 실행을 하합니다.
이 디렉토리의 경로는 PATH 변수에 저장이 되어 있는데, Shell에 명령어를 입력하면 PATH에 등록된 경로를 뒤져서 명령어의 실행파일이 저장된 위치를 찾아 가는 원리로 동작합니다.
궁긍하면 Shell에 다음 명령어를 쳐 보도록 합니다.
echo $PATH
출력 결과를 잘 찾아보면 '... :/bin: ...' 이라고 써진 부분이 있을 것입니다. 명령어를 찾을 경로 목록중 하나에 바로 이 bin 디렉토리가 등록되어 있는 것입니다.
/boot
부팅에 필요한 이미지, 커널, 부트로더(GRUB)와 같은 중요한 파일들이 들어 있습니다. 커널 컴파일과 같은 작업을 할 때 외에는 직접 찾아 들어갈 일이 거의 없습니다.
이 디렉토리를 잘못 건드리면 부팅이 되지 않으므로 주의해야 하며, 시스템이 부팅조차 되지 않는 사태를 방지하기 위해 다른 디렉토리는 같은 파티션에 놓더라도, 이 디렉토리만은 별도 파티션으로 구성하는 것이 일반적입니다.
/dev
하드디스크, ODD, USB 등 물리적 장치들이 파일 형태로 매핑되어 있는 디렉토리입니다. '리눅스는 모든 것이 파일이다.'라고 할 수 있을 정도로, 리눅스 시스템은 모든 시스템 자원들을 파일로 취급하여 관리합니다.
예를 들어 cdrom은 ODD, hdx나 sdx는 하드디스크, ttyn은 키보드 이런 식입니다.
/etc
시스템 및 설치한 프로그램의 환경설정 또는 스크립트 파일이 저장되어 있습니다.
/home
등록된 사용자의 홈 디렉토리입니다.
윈도에서 C:\Documents and Settings 폴더와 같은 기능을 한다고 생각하면 됩니다. 사용자별로 하위 디렉토리가 생성되며, 바탕화면에 늘어놓은 아이콘이나 다운로드 받은 파일이 저장됩니다.
단, 최고 관리자인 root의 홈 디렉토리는 이곳에 저장되지 않고 별도 위치인 /root가 됩니다.
/lib, /lib64
프로그램을 실행할 때 동적으로 로드되는 라이브러리 파일들이 저장되어 있습니다.
/lost+found
손상된 파일 조각이나, 결함이 있는 파일이 저장됩니다. 보통 이런 파일들은 갑작스러운 시스템 종료나 오류로 인해 발생하며, fsck와 같은 오류체크 프로그램을 통해 발견되어 이 디렉토리에 자동으로 옮겨집니다.
이 디렉토리는 루트에만 존재하는 것이 아니라, 마운트되는 모든 장치의 최상위 위치에 모두 존재합니다. 즉, USB 메모리를 꽃은 경우에도 메모리의 최상위 위치에 자동으로 이 디렉토리가 생성됩니다.
/mnt, /media
파일시스템이 마운트되는 기본 위치입니다.
본래 mnt만 존재하였으나, USB 메모리와 같은 휴대용 장치들이 많이 사용되면서 media라는 디렉토리도 새로 추가되었습니다. USB 메모리를 꽃으면 기본적으로 /media 디렉토리에 마운트됩니다.
/opt
패키지 형태가 아닌, 빌드된 상태로 배포되는 응용프로그램의 설치 목적으로 사용되는 디렉토리입니다.
예를 들어, Sublime Text와 같이 디렉토리 통째로 복사하는 방식으로 설치하는 프로그램들을 이 디렉토리에 설치합니다. Windows에서 Program Files 디렉토리와 그 용도가 같습니다.
/proc
현재 동작중인 프로세스들의 정보가 저장되어 있습니다.
이 디렉토리는 Kernel 부팅 과정에서 생성된 뒤 Mount되며, 여기에 있는 항목들은 실제로 디스크에 존재하는 파일들은 아닙니다. 실제로, Linux가 설치된 디스크를 다른 컴퓨터에 연결해서 이 디렉토리를 살펴보면 아무것도 들어있지 않음을 알 수 있습니다.
/root
최고 관리자인 root의 홈 디렉토리입니다.
/sbin
System Binary를 의미하며, root만 사용할 수 있는 명령어들(시스템종료, 업데이트, 프로그램 설치 등)이 저장되어 있습니다.
/tmp
프로세스들이 동작하면서 생성하는 임시 파일이 위치하는 디렉토리입니다.
기본적으로 시스템의 모든 사용자가 접근할 수 있으므로 여기에 임시파일을 생성할 때는 보안에 유의해야 합니다.
/usr
시스템 응용프로그램이 위치하는 디렉토리입니다. GCC, Apache, MySQL, PHP등의 응용프로그램이 이곳에 설치됩니다.
/usr/local
패키지 매니저(yum, apt-get, pacman 등)가 아닌, 소스코드를 다운받아 직접 빌드하여 설치하는 프로그램들이 위치하는 디렉토리입니다. (./configure - make - make install)
이렇게 프로그램 설치 디렉토리를 구분해 놓은 이유는 패키지 매니저가 관리하는 프로그램과 직접 빌드해서 설치한 프로그램들이 서로 충돌하는 것을 방지하기 위함입니다. (yum으로 uninstall을 했는데, make install로 설치한 프로그램이 삭제되면 재미있는(?) 일들이 일어날 것입니다.)
또한 충돌 방지 목적 외에, 직접 빌드해서 설치하는 프로그램들은 차후에 불필요해져서 삭제하려면 직접 관련 파일들을 일일이 찾아서 삭제해야 하므로 관리의 편의상 한곳에 모아놓는 것이 좋습니다. 보통 make명령으로 설치를 할 때 별도 옵션을 안 주면 기본으로 이 디렉토리에 설치되지만, 혹시 모르므로 다음과 같이 configure를 할 때 prefix 옵션으로 이 디렉토리를 지정해 주는 것이 좋습니다.
./configure --prefix=/usr/local
/var
로그(Log) 및 수신된 이메일이 저장되는 위치입니다.
서버 등을 운영할 때 차지하는 용량이 급격히 늘어날 수 있으므로 별도의 파티션으로 분리하는 것이 좋습니다. 특히 로그파일 등은 수시로 확인하고 불필요한 파일은 바로바로 지워주어야 용량 부족으로 인한 문제를 방지할 수 있습니다.
/var/log
여러 프로세스들이 쏟아내는 감당할 수 없는 로그파일들이 위치하는 디렉토리입니다. 보통 프로세스별로 하위 디렉토리가 존재하여 각 프로세스는 자신의 로그 디렉토리에 로그 파일들을 생성합니다.
이 디렉토리(와 하위디렉토리)에 위치하는 로그파일이 일정 크기보다 커지면 cron에 의해 하루에 한 번 실행되는 logrotate에 의해 access.log-YYYYMMDD와 같은 파일명으로 변경되고, 더 오래된 로그파일은 gzip으로 압축됩니다. 어느 정도 자동으로 관리되고 있기는 하지만, 주기적으로 로그 파일을 확인하고 오래된 로그파일들(*.gz)은 삭제해 주는 것이 좋습니다.
참고적으로, 로그파일을 모니터링하려면 다음과 같이 tail -f 명령을 사용하면 편리합니다. 예를 들어, 다음과 같이 쓰면 업데이트되는 Nginx 웹 서버 로그를 지속적으로 확인할 수 있습니다.
tail -f /var/log/nginx/access.log
- [Ubuntu] 파티션 관리 프로그램 - GParted (23453)
- [Ubuntu] 디스크 마운트하기 (37106)
- Windows에서 Ubuntu로 원격 데스크톱 연결하기 (45669)