...
리눅스 파일의 종류
리눅스는 유닉스 계열을 바탕으로 만들어진 오픈소스 운영체제이다. 그래서 유닉스와 마찬가지로 모든 것들을 파일로 관리한다.
리눅스의 경우 계층구조(트리구조)의 디렉토리를 가지고 있는데, 이것은 용도에 따라 구분되며, 이를 파일시스템이라고 부른다.
1. 일반 파일
데이터 저장에 사용되는 파일이다. 리눅스에서 사용되는 파일 대부분이 일반 파일에 속한다.
실행 파일, 데이터 파일, 이미지 파일은 바이너리 파일이라고 부른다.
텍스트 파일은 아스키(ASCII)코드로 구성되어 vi, vim 명령어 등의 문서 편집기 명령어로 내용을 보거나 수정할 수 있다. 그 외 다른 파일들은 확장자에 맞는 특정 응용 프로그램이 있어야 확인할 수 있다.
2. 디렉토리 파일
디렉토리 역시 파일 종류 중 하나이며, 해당 디렉토리에 저장되어 있는 정보와 하위 디렉토리에 대한 정보를 담고 있다.
3. 링크 파일
링크 파일은 원본 파일을 대신해서 사용하기 위해 다른 파일명으로 링크된 파일을 뜻한다.
프로그래밍에서 쓰이는 포인터나 참조 개념이 바로 이걸 말한다.
쉽게 설명하면, 윈도우 운영체제의 바로가기 기능과 유사하다.
4. 장치 파일
장치(하드웨어)들을 관리하는 파일이다.
실제로 하드 디스크나, CPU, CD-ROM과 같이 유형의 장치들을 파일화하여 관리한다.
ROOT 디렉토리 구조
리눅스에서 모든 것은 파일로 표현된다. 디렉토리도 파일의 한 종류로서 여러개의 하위 파일이나 디렉토리의 주소들을 담고 있다.
이러한 디렉토리들을 파일을 효율적으로 관리하기 위해 계층적으로 구성하는데 이것을 트리구조라고 한다.
리눅스에서는 수많은 파일을 관리하기 위해 이러한 디렉토리 개념을 사용한다.
모든 디렉토리의 최상위 디렉토리를 루트 디렉토리라고 한다. 루트 디렉토리는 / 으로 표시한다.
주요 디렉토리의 기능
위치 | 이름 | 설명 |
/ | 루트 | 최상위(루트) 디렉토리 디렉토리들의 절대 경로를 표기할 때 이 디렉토리로 부터 시작함 |
/bin | 바이너리 | 이진파일(실행파일) 기본적인 명령어가 저장된 디렉토리 리눅스에서 자주 사용하는 mv, cp, rm등과 같은 명령어들이 이 디렉토리에 존재함 |
/boot | 부트 | 리눅스의 부팅에 필요한 정보를 가진 파일들이 있는 디렉토리 |
/dev | 디바이스 | 시스템 디바이스(장치)파일을 저장하고 있는 디렉토리 /dev/sda (하드디스크 장치파일), /dev/cdrom(CD-ROM)장치파일 등과 같은 장치 파일들이 여기에 위치해있다. 예를들어 마우스, 키보드등의 디바이스와 관련된 파일들. 즉, 물리적 장치가 파일화되어 저장 |
/etc | 설정 파일을 두는 디렉토리 | |
/home | 홈 | 사용자들의 홈디렉토리가 있는 곳 사용자를 추가하면 사용자의 id와 동일한 디렉토리가 이곳에 자동으로 생성 |
/lib | 라이브러리 | 커널이 필요로 하는 각종 라이브러리 파일, 커널 모듈파일 등이 존재하는 디렉토리 |
/media | 미디어 | DVD, CD-ROM, USB 등의 외부 장치들의 마운트 포인트(연결)로 사용하는 디렉토리 |
/mnt | 마운트 | /media와 비슷한 기능을 한다. 다만 차이점은, Media는 OS에서 자동으로 마운팅해주는 포인트로 주로 사용되며 Mnt는 사용자가 직접 마운트하는 경로로 사용된다. 예를들어 컴퓨터에 USB꽂아 OS에 자동으로 마운팅된다면 주로 Media 폴더 내에, 외부에 있는 디스크등을 직접 명령어를 통해 마운트한다면 Mnt 디렉토리에 위치하게 된다. |
/opt | 옵트 | 추가 응용프로그램 패키지 설치 장소 패키지 매니저가 자체적으로 설치/삭제를 수행함 |
/proc | 프로세스 | '가상파일시스템' 이라고 하는 곳으로 현재 메모리에 존재하는 작업들이 파일 형태로 존재하는 곳 프로세스 정보 등 커널 관련 정보가 저장 |
/root | 루트 | 관리자계정 root 사용자의 홈디렉토리 (/ 디렉토리와 다르다. 이건 사용자의 디렉토리) |
/sbin | 시스템 바이너리 | 시스템 이진파일(실행파일) ifconfig, ethtool, halt, e2fsck와 같은 시스템 명령어들을 저장하고 있는 디렉토리 |
/usr | 유저 | 일반 사용자들이 사용하는 디렉토리 |
/var | 바 | 기타 모든 다용도로 사용될 수 있는 파일들이 저장되며 로그파일, 데이터베이스 캐싱파일, 웹서버 이미지 파일 등이 위치하는 디렉토리 |
/sys | 시스템 | 디바이스를 관리하기 위한 가상 파일 시스템 디렉토리이다 |
/run | 런 | Run-time variable data를 관리한다. 부팅한 후의 시스템 정보를 관리하는 디렉토리이다. |
/tmp | 템프 | 임시 파일을 저장하기 위한 디렉토리이다. 재부팅 시에 삭제되며, 정기적으로 10일 정도 간격으로 삭제된다. |
/lost+found | 로스트 | 휴지통 같은 개념이라 보면된다. |
디렉토리 추가 상세 설명
/bin & /sbin
bin은 user command binaries, sbin은 system command binaries를 뜻한다.
둘 다 바이너리 파일로 컴파일된 실행 파일들을 포함하고 있다.
- 대체적으로 sbin은 system이 사용하거나 system을 컨트롤하기 위한 파일들을 포함하고
- bin은 커맨드 라인 인터페이스에서 우리가 자주 사용하는 명령어 실행 파일들을 포함한다.
bin 디렉토리에 가서 ls -al 커맨드를 쳐보면 위와 같은 결과를 볼 수 있다.
우리가 흔히 사용하는 cat, chmod, chown, cp, date, echo, kill, ln, mkdir 등의 커맨드는 결국 bin 디렉토리에 포함된 해당 이름으로 된 바이너리 파일을 실행한 결과이다. 당연히 ls 도 이 디렉토리 내에 포함되어 있다.
sbin 디렉토리는 sysctl, reboot 등과 같이 시스템을 다루는 파일들을 가지고 있다.
/bin & /sbin 연관 디렉토리
리눅스 이전 유닉스 운영체제를 만들 때 용량 문제로 bin과 sbin 디렉토리를 여러 곳에 분산시켜 만들었다.
현대 유닉스 기반 OS에서도 이런 사상이 남아서 bin과 sbin에 관련된 연관 디렉토리들이 파일 시스템에 남아있다.
연관된 디렉토리의 종류는 usr/bin, usr/sbin, usr/local/bin, usr/local/sbin이다.
- bin : cd, ls 등의 사용자 커맨드 파일이 위치한 디렉토리 (필수적인 파일만 관리)
- sbin : systemctl 등의 시스템 커맨드 파일이 위치한 디렉토리 (필수적인 파일만 관리)
- usr/bin : 필요에 의해 설치된 사용자 커맨드 파일이 위치한 디렉토리 (yum 등 패키지 관리자가 관리)
- usr/sbin : 필요에 의해 설치된 시스템 커맨드 파일이 위치한 디렉토리 (yum 등 패키지 관리자가 관리)
- usr/local/bin : 기타 사용자 커맨드 파일이 위치한 디렉토리 (사용자 또는 설치 파일이 해당 디렉토리에 파일 설치)
- usr/local/sbin : 기타 시스템 커맨드 파일이 위치한 디렉토리 (사용자 또는 설치 파일이 해당 디렉토리에 파일 설치)
리눅스 기반 운영체제마다 bin, sbin 연관 디렉토리를 다루는 방법이 조금씩 다르다.
CentOS에서는 디렉토리 구조를 단순화하기 위해 bin과 sbin을 usr/bin과 usr/sbin과 동일하게 만들어버렸다.
유닉스 기반의 운영체제인 MacOS는 예전 방식대로 bin, sbin 디렉토리를 모두 분리해서 사용한다.
CentOS의 yum과 달리 맥의 패키지 관리자인 brew로 설치되는 파일은 Cellar 디렉토리라는 별도의 디렉토리에 저장되며 usr/local/bin에 심볼릭 링크 형태로 관리된다.
PATH 와 /bin & /sbin
/bin과 /sbin은 PATH와 밀접한 연관이 있다.
/bin과 /sbin은 실행파일들의 집합이고 PATH 는 운영체제 어디에서든 해당위치에 접근할 수 있게 만드는 환경변수다.
위에서 설명된 6개 bin/sbin 디렉토리는 모두 기본 PATH 환경변수에 지정되어 있어 운영체제는 디렉토리에 있는 실행파일들을 어느 위치에서든 실행할 수 있다.
즉, 사용자 관점에서는 cd, ls 처럼 단순 파일이름으로 해당 커맨드 실행이 가능하다고 생각하면 된다.
brew나 yum 같은 패키지 관리자로 설치한 파일들도 6개 디렉토리 중 하나에 직접적인 파일이나 심볼릭 링크로 존재하게 되어 커맨드 라인에서 바로 사용이 가능하다.
하지만 별도의 인스톨러로 설치하거나 압축파일을 직접 풀어 설치하면 실행이 안 될 때가 있는데, 설치된 파일이 bin, sbin 디렉토리에 존재하지 않기 때문이다.
이런 경우 brew처럼 심볼릭 링크로 실행 파일을 bin 디렉토리에 연결시키거나 bin, sbin 외에 별도의 실행파일을 위한 PATH를 추가함으로써 해결할 수 있다.
/lib & /lib64
lib와 lib64는 시스템 부팅이나 bin과 sbin 디렉토리에 있는 바이너리 파일들 실행에 필요한 공유 라이브러리 디렉토리이다.
예를 들어 파이썬의 경우 usr/local/lib/python3.6/site-packages 같은 디렉토리에 라이브러리 파일이 설치되고 이를 활용해 파이썬 커맨드가 돌아가게 된다.
- /lib/modules : 커널 모듈 파일들 존재
- 대부분의 라이브러리들은 링크로 연결되어 있음
/etc
etc 폴더는 대부분의 설정 파일들이 저장된다.
네트워크 관련 설정파일, 사용자 정보 및 암호정보, 파일 시스템 정보, 보안파일, 시스템 초기화 파일등 중요 설정 파일들의 위치해 있다.
리눅스의 전신인 유닉스의 초창기에는 부팅과 관련한 모든 설정정보는 boot 폴더 디바이스와 관련된 설정 정보는 dev 폴더에 위치했지만 시간이 지나며 etcetera라는 이름의 etc 폴더를 만들어 설정 정보를 따로 보관하기 시작했다.
이후 시간이 지나며 etc 뜻 그 자체처럼 시스템 전체에서 사용하는 설정과 같은 엑스트라 데이터들이 저장되는 폴더가 된 것이다.
etc 디렉토리 내부를 보면 여러가지 디렉토리와 파일들을 볼 수 있다. .d 를 붙여서 디렉토리인 것을 구별하기도 하고 그렇지 않기도 한다. 설정파일은 .conf 라는 이름의 형식으로 많이 관리되어 있다.
예를 들어 passwd 는 사용자에 관련된 내용을 담고 있다. 우리가 커맨드를 통해 사용자를 추가하거나 삭제하면 해당 파일이 변경되며 운영체제에서 사용자를 관리하게 된다.
만약 nginx와 같은 웹서버를 다루게 되면 /etc/nginx 디렉토리에서 nginx.conf 같은 파일들을 수정해야 한다.
- /etc/CORBA : Common Object Request Broker Architecture (COBRA)에 관한 파일이 들어있음
- /etc/X11 : 엑스 윈도우 설정에 관련된 파일들이 있음
- /etc/cron.d : crontab 명령의 설정파일이 있음
- /etc/cron.daily : 매일 작동하게 하는 crontab 스크립트 파일이 존재
- /etc/gnome : GTK+ 정의파일들이 있음
- /etc/httpd : 아파치 웹 서버의 설정 및 로그파일이 있음
- /etc/logrotate.d : logrotate 설정 파일들이 있음
- /etc/mail : 센드메일과 관련된 파일이 있음
- /etc/ppp : ppp 설정에 관련된 파일들이 있음
- /etc/profile.d : 쉘 로그인 하여 프로파일의 실행되는 스크립트에 대한 정의가 있음
- /etc/rc.d : 시스템 초기화와 관련된 스크립트가 존재
- /etc/samba : 삼바에 관련된 파일들이 있음
- /etc/security : 터미널 보안에 관련된 설정이 있음
- /etc/skel : 새로운 사용자를 추가할 때 자동적으로 생성되는 디렉토리와 파일이 있음
- /etc/squid : squid 프록시 서버에 관련된 파일이 있음
- /etc/ssh : secure shell 설정 파일이 있음
- /etc/sysconfig : 시스템과 네트워크 설정을 담고 있음
- /etc/xinetd.d : 슈퍼데몬 xinetd.d의 서비스 영역을 설정하는 디렉토리
/var
시스템에서 사용되는 동적인 파일들이 저장 되어있다. (가변 자료 저장 디렉토리)
주로 시스템 작동기록(log)들을 저장하는 편이다. 이외에 사용자 로그인에 대한 보안기록, 그리고 메일서버를 운영한다면 전송되는 메일들을 임시로 저장한다
- 레드헷 7.0에서부터는 /home 디렉토리에 저장되던 /home/httpd 디렉토리가 /var/www로 변경되어 저장됨, /home/ftp는 /var/ftp로 변경
- /var/log : 시스템에 발생된 일들에 대한 기록 파일이 있음
- /var/named : 네임서버 설정 파일들 존재
- /var/spool/mail : 수신 메일을 사용자 명으로 기록하는 디렉토리
/home & /root
home 디렉토리는 개별 사용자의 디렉토리를 관리하는 디렉토리이다.
만약 jin이라는 이름의 사용자를 만들었다면 /home/jin 디렉토리로 jin을 위한 디렉토리가 생성된다. 해당 디렉토리에 대한 접근 권한은 기본적으로 jin으로 한정되어 관리된다.
chown 과 chmod 를 활용해 추후 접근이나 파일의 실행 권한에 대한 변경이 가능하다.
root 디렉토리는 root 계정을 위한 디렉토리로 home 말고 별도의 디렉토리로 관리된다.
/usr
일반 사용자들을 위한 대부분의 프로그램 라이브러리 파일들이 위치해 있다.
- /usr/bin : 응용 프로그램의 실행 파일이 위치
- /usr/sbin : 주로 네트워크 관련 실행 명령어와 실행 데몬들을 많이 포함하고 있음
- /usr/X11R6 : X-window 시스템에 관련된 파일 존재
- /usr/include : 기본 C 라이브러리 헤더 파일과 각종 라이브러리 헤더파일들이 있음
- /usr/lib : /usr/bin과 /usr/sbin에 있는 실행 바이너리를 실행하기 위한 라이브러리 존재
- /usr/src : 프로그램소스 및 커널 소스들이 보관되어 있는 곳
- /usr/man : 매뉴얼 페이지가 담겨있는곳
- /usr/local : 새로운 프로그램들이 설치되는 곳 (windows의 Program Files 와 유사)
# 참고자료
https://jinwoo1990.github.io/dev-wiki/linux-directory/
https://medium.com/harrythegreat/%EB%A6%AC%EB%88%85%EC%8A%A4-%EA%B8%B0%EC%B4%88-%EB%A3%A8%ED%8A%B8%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0-b3e4871af4b3
https://webdir.tistory.com/101?category=561456
https://www.thegeekstuff.com/2010/09/linux-file-system-structure/
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.