# 리눅스 파일과 디렉토리

## I. 디렉터리 구조 및 디렉터리별 기능

디렉터리 구조: 리눅스에서 디렉터리 구조는 전체적으로 '역 트리(tree)' 구조를 하고 있다. 루트(/)를 기준으로 크게 주요한 디렉터리로 분할이 되고 하는데, 이러한 구조를 파일시스템이라고 한다.

1\) 루트(/): 리눅스 파일시스템의 최상위 디렉토리이다. 즉, 절대 경로표기 시 항상 루트(/)부터 시작한다.

| 루트 이하에서 포함하는 디렉터리     |                             |
| --------------------- | --------------------------- |
| /bin                  | 주 명령 바이너리 파일                |
| /boot                 | 부트로더의 고정 파일들                |
| /dev                  | 장치 파일들                      |
| /etc                  | 시스템 설정                      |
| /lib                  | 주요 공유 라이브러리와 커널 모듈          |
| /media                | 착탈 가능한 미디어에 대한 마운프 포인트(m.p) |
| /opt                  | 추가 애플리케이션 소프트웨어 패키지         |
| /sbin                 | 주요 시스템 바이너리들                |
| /srv                  | 시스템에 의해 제공되는 서비스들에 대한 자료    |
| /tmp                  | 임시 파일들                      |
| /usr                  | 2차적 디텍터리 체계                 |
| /var                  | 가변자료                        |
| 서브 시스템 설치 시 루트 이하에 포함 |                             |
| /home                 | 사용자의 홈 디텍터리(옵션)             |
| /lib(qual)            | 대체 형식의 주요 공유 라이브러리(옵션)      |
| /root                 | 루트(root) 사용자를 위한 홈 디렉터리(옵션) |

2\) /bin: 기본적인 명령어가 저장된 디렉터리이다. 예를 들어 mv, cp, rm, rmdir, 등과 같은 명령어들을 포함하고 있다. 이 디렉터리에 존재하는 명령어들은 root사용자 뿐만 아니라 일반 사용자들도 사용할 수 있다. /sbin 디렉터리에 존재하는 명령어들은 대부분 root 사용자용이다. 즉, /bin은 공동, /sbin은 root위주 명령어 디렉터리이다.

3\) /boot: 리눅스 부트로더가 존재하는 디렉터리이다. 즉, GRUB와 관련된 파일들(ex. grub.conf)이 존재한다. 리눅스의 커널은 루트(/)나 /boot에 존재해야한다.

4\) /dev: 시스템 장치(device) 파일을 저장하고 있는 디렉터리이다. 즉, 하드디스크 장치파일(/dev/sda), CD-ROM 장치파일(/dev/cdrom) 등과 같은 장치 파일들이 존재한다. /dev 위치에 백도어 파일이 숨겨져 있는 장소이기도 하며, MAKEDEV 명령어를 포함하고 있는데, 이 명령어에 의해 /dev 디렉터리에 장치 파일들을 생성할 수 있다.

5\) /etc: 시스템의 거의 모든 설정 파일이 존재하는 디렉터리이며, 바이너리 파일은 존재하지 않도록 한다. 패스워드 파일(/etc/passwd), 그룹파일(/etc/group), yum, xinetd, vsftpd 설정파일 과, 시스템 제어판용 설정 파일(/etc/sysconfig) 등과 같이 거의 모든 시스템 관련 설정 파일이 위치해 있다.

| 배포판, 소프트웨어 설치여부에 따라 있는 디렉터리 |                                                |
| --------------------------- | ---------------------------------------------- |
| csh.login                   | C 셀 로그인을 위한 시스템 전역 설정 파일                       |
| exports                     | NFS 파일 시스템 접속을 위한 제어 파일                        |
| fstab                       | 파일 시스템에 대한 정적(static) 정보                       |
| ftpusers                    | FTP 데몬 사용자 접속 제어 파일                            |
| gateways                    | 라우트 되는 게이트웨이를 목록화한 파일                          |
| gettydefs                   | Getty에 의한 속도 및 터미널 설정                          |
| group                       | 사용자 그룹 파일                                      |
| host.conf                   | resolver(도메인 이름 참조 프로그램 설정 파일)                 |
| hosts                       | 호스트 이름들에 대한 정적 정보                              |
| hosts.(allow\|deny)         | TCP wrapper에 의한 호스트 접근 여부 파일                   |
| hosts.equiv                 | rlogin, rsh, rcp에 대한 신뢰받는 호스트 목록               |
| hosts.lpd                   | ldp에 대한 신뢰받는 호스트 목록                            |
| inetd.conf                  | inetd에 대한 설정 파일                                |
| inittab                     | init에 대한 설정 파일                                 |
| issue                       | 로그인 전에 표시되는 메시지 및 확인 파일                        |
| ld.so.conf                  | 공유 라이브러리를 찾기 위한 extra 디렉터리 목록                  |
| motd                        | 로그인 후 나타나는 메세지                                 |
| mtab                        | 파일시스템에 대한 동적 정보(m.p된 파일시스템 정보)                 |
| mtools.conf                 | Mtools에 대한 설정 파일                               |
| networks                    | 네트워크 이름들에 대한 정적 정보                             |
| passwd                      | 패스워드 설정 파일, 홈 디렉터리 및 쉘 등에 대한 설정 파일             |
| printcap                    | ldp 프린터 설정 파일                                  |
| profile                     | sh 쉘 로그인에 대한 시스템 전역 설정 파일                      |
| protocols                   | IP 프로토콜 목록                                     |
| resolv.conf                 | 리졸버 설정 파일                                      |
| rpc                         | RPC 프로토콜 목록                                    |
| securetty                   | root 사용자 로그인에 대한 TTY 접근 통제                     |
| services                    | 네트워크 서비스를 위한 포트 이름들                            |
| shells                      | 유효한 로그인 쉘들의 경로를 포함                             |
| syslog.conf                 | syslogd에 대한 설정 파일                              |
| 기본적으로 있는 디렉터리               |                                                |
| opt                         | 추가 애플리케이션을 위한 설정 파일                            |
| X11                         | X 윈도우 시스템을 위한 설정 파일(X 윈도우 설치 시 생성)             |
| sgml                        | SGML을 위한 설정 파일(SGML이 설치된 경우)                   |
| xml                         | XML을 위한 설정 파일(XML이 설치된 경우)                     |
| 리눅스 시스템 설정 파일, 주요 서비스 설정 파일 |                                                |
| mail                        | sendmail.cf 나 access 파일 등 sendmail 프로그램의 설정 파일 |
| ssh                         | SSH 서비스를 위한 각종 설정 파일                           |
| squid                       | Squid 프락시 서버의 설정 파일                            |
| skel                        | 계정 사용자 생성 시 초기화 파일(useradd때 기본으로 생성할 파일들)      |
| rc.d                        | 부팅레벨별 부팅 스크립트 파일                               |
| rc.d/init.d                 | 시스템 초기화 파일들의 실제 파일들                            |
| pam.d                       | PAM 설정 정보파일                                    |
| cron.(\*)                   | cron 프로그램 설정 파일들                               |
| xinetd.d                    | xinetd 수퍼 데몬 설정 파일                             |
| yum                         | yum 설정 파일                                      |
| sysconfig                   | 시스템 제어판 설정 파일                                  |

6\) /lib: 커널 모듈 파일과 라이브러리 파일(C, C++등)들이 존재하는 디렉터리이다. /lib64(64bit)와 /lib32(32bit)로 하드웨어 아키텍쳐에 따라 구분하여 공유 라이브러리를 저장한다.

7\) /media: DVD, CD-ROM, USB 메모리 같은 탈부착 가능한 장치들의 마운트 포인트로 사용되는 디렉터리이다. /mnt와 비슷한 용도로 사용된다.

8\) /opt: 추가적인 소프트웨어를 설치하는 디렉터리이다. 그러나 대부분은 /usr 아래에 설치된다.

9\) /sbin: 시스템 관리를 위해 사용되는 유틸리티들과 root사용자 만을 위한 명령어들은 /sbin, /usr/sbin, /usr/local/sbin에 저장된다. /sbin는 /bin 의 바이너리들에 더하여 시스템을 부팅,복원, 복구 및 수리하기 위한 중요한 바이너리들을 포함한다. /usr/sbin은 /user가 마운트 된 이후에 실행되는 프로그램이고, /usr/local/sbin는 관리자에 의해 관리되는 컴퓨터에만 설치하는 시스템 관리 프로그램인 경우에 해당 바이너리가 설치된다. /sbin에는 dumpe2fs, e2fsck, ldconfig, sln, ifconfig, ethtool, halt, shutdown, 등과 같은 시스템 명령어 들이 존재한다.

10\) /tmp: 시스템을 사용하는 모든 사용자들이 공동으로 사용하는 "공용 디렉터리" 이다. 예를 들어, mysql에 사용되는 mysql.sock 등과 같은 소켓 파일, 아파치 세션 파일 등이 생성되기도 한다. 즉, 시스템의 일반적인 사용자 또는 각종 프로세스에서 사용하는 파일들이 생성되는 위치이다.

11\) /usr: 파일 체계의 2차적인 주요 부분인데, 시스템이 아닌 일반 사용자들이 주로 사용하는 디렉터리이다.\\

| bin     | 대부분의 일반 사용자 명령어가 포함(perl, python, tclsh, wish, expect, chsh, cpp, crontab, du, find, 등) |
| ------- | --------------------------------------------------------------------------------------- |
| include | C, C++ 프로그램에 의해 포함되는 헤더 파일들같은 시스템이 일반적으로 사용하는 파일이 존재                                    |
| lib     | 프로그래밍과 패키지들을 위한 라이브러리들이 존재하는 디렉터리(오브젝트 파일, 라이브러리 및 내부 바이너리)                             |
| local   | 로컬 디렉터리 체계이며, 해당 컴퓨터에서 사용할 소프트웨어를 시스템 관리자가 설치하는 디렉터리(애플리케이션 소스코드 컴파일 시 사용)              |
| sbin    | 시스템 관리자에 의해 사용되는 시스템 바이너리가 존재(시스템 수리, 복구, /usr 마운팅, 등 /sbin을 대신하여 존재)                   |
| share   | 읽기 전용인 아키텍처 비의존 자료들이 존재                                                                 |

12\) /var: 시스템 운영 중에 생성되었다가 삭제되는 자료같은 가변 자료 파일들을 저장하기 위한 디렉터리이다.

13\) /home: 사용자의 홈 디렉터리이다. useradd 로 새로운 사용자를 생성 시 대부분 사용자의 ID와 같은 이름의 디렉터리가 /home 아래에 생성된다.

14\) /proc: 커널과 프로세스 정보를 위한 가상 파일 시스템이다. 프로세스와 시스템 정보를 다루기 위한 표준적 방법으로 사용한다. 이 디렉터리는 디스크상에 실제 존재하는 것이 아니라 메모리상에 존재하기 때문에 가상 파일 시스템이라고 부른다.

15\) /lost+found: ext2, ext3, ext4 등의 파일 시스템을 사용하는 경우에 해당 파티션에 자동으로 생성된다. 따라서 루트(/) 디렉터리에만 존재하는 것아 아니라 파일 시스템 마다 존재할 수 있다.  이 디렉터리는 fsck, e2fsck 등과 같은 파일 시스템 체크 및 복구 유틸리티 실행 후에 주로 생성되는 것으로써 복구되지 않은 채로 블록만 존재하는 파일(연결이 끊어진 inode들이 숫자 파일 형태로 존재)이 존재하는 곳이다. 이 디렉터리를 삭제해도 시스템에는 아무 영향이 없지만, 꼭 필요한 파일이 이 디렉터리에 복구되지 않은 채로 남아 있을 수 있기 때문에 반드시 확인 후 삭제하여야 한다.&#x20;

## II. 부팅과 셧다운

부트 스트래핑(Boot Straping): 컴퓨터 전원을 켰을때, CPU는 컴퓨터 메인보드에 장착된 ROM에 내장되어 있는 ROM-BIOS의 시동코드를 실행한다.

### 부팅 절차

1\) ROM-BIOS (Read Only Memory - Basic Input Output System): 컴퓨터 부팅 시 가장 먼저 실행되는 프로그램

&#x20; a. POST(Power On Self Test): 전원이 켜짐과 동시에 ROM에 저장되어 있던 ROM-BIOS가 실행되고 BIOS는 스스로 시스템에 장착된 하드웨어 장치들을 하나씩 인식, 이상유무를 체크한다. 이상이 없다면 장치의 사용을 위해 모든 장치를 초기화 한다. (이상 발생 시 에러음 내고 멈춤)

&#x20; b. 부트로더 로딩 기능: ROM-BIOS는 Boot Loader를 가진 하드장치(하드디스크, CD-ROM, USB 등)를 하나씩 검사한다. 그리고 0번섹터(MBR)에서 부트 로더를 불러들여 메모리에 적재한다. 이렇게 부트로더를 메모리에 적재한 후에는 부트로더에게 제어권을 넘겨주고 자신은 종료한다.

2\) 부트로더(GRUB)

&#x20; a. 리눅스 커널 로딩: GRUB는 /boot/grub/grub.conf 파일에 정의되어 있는 리눅스 커널을 메모리로 로딩한 후 Swapper 프로세서를 호출한다.

3\) Swapper 프로세서

&#x20; a. init프로세스 적재: GRUB에 의해 실행된 Swapper은 PID 0번을 가지며 각 장치들의 드라이버들을 초기화하고 PID 1번인 init 프로세스를 실행 한 후 스스로 종료한다. (PID = Process ID)

4\) init 프로세스\
&#x20;/etc/inittab 파일 \[CentOS 6 기준] - 부팅레벨 설정 파일

| 0 | 종료 모드                     |
| - | ------------------------- |
| 1 | 싱글 부트 (시스템 복구 모드)         |
| 2 | 사용 안함(X)                  |
| 3 | 다중 사용자 모드                 |
| 4 | 사용 안함(X)                  |
| 5 | GUI(그래픽 모드) - \[default값] |
| 6 | 재부팅 모드                    |

&#x20; a. Runlevel 설정: /etc/inittab 파일의 내용을 읽어 부팅레벨이 결정되고, 부팅레벨에 상관없이 무조건 /etc/rc.d/rc.sysinit 스크립트(시스템 초기화 수행)를 실행한다. 그리고 선택된 부팅레벨(N)에 따라서 /etc/rc.d/rc(N).d 디렉터리의 파일들을 순차적으로 실행한다.&#x20;

(S로 시작하는 파일은 부팅 시 자동시작, K로 시작하는 파일은 시작 X)

<figure><img src="https://t1.daumcdn.net/cfile/tistory/99C2EE4E5A6ADC9D05" alt=""><figcaption></figcaption></figure>

&#x20; b. /etc/rc.d/rc.local: 런레벨 2\~5의 맨 마지막 단계에서 실행된다. 부팅 시에 자동으로 실행하고자 하는 프로그램들을 설정해 놓은 곳이다.\\

부팅 디스크 작성: 현재는 CD-ROM용 iso파일이나, diskboot.img 파일을 이용하는데, boot.iso는 CD 라이팅을 통해 CD-ROM에 기록 할 수 있고, diskboot.img 파일은 dd명령어로 USB 등에 기록할 수 있다.\\

| CD-ROM에 저장된 파일 이용 시                        |
| ------------------------------------------ |
| # mount -t iso9660 /dev/cdrom /media/cdrom |
| USB가 /dev/sda1 장치명으로 인식되는 경우               |
| # dd if=diskboot.img of=/dev/sda1          |

### 셧다운 절차

#### 터미널 모드에서 시스템 종료하기

디스크 기록: 만약, 시스템 전원이 갑자기 차단되거나 리부팅되면 메모리에 있던 데이터가 디스크에 쓰여지지 않고 자료를 잃어버리게 될 수 도 있는데, 이때 시스템을 종료하거나 재부팅 할 경우 메모리에 있는 데이터를 디스크에 기록할 수 있다.

&#x20; \# sync (메모리에 있는 데이터를 디스크에 기록)

#### 시스템 종료 관련 명령어

| # shutdown \[옵션] \[시간] "전달메세지" - ex) shutdown -h now, shutdown -h +20 |                                                     |
| --------------------------------------------------------------------- | --------------------------------------------------- |
| \[옵션]                                                                 | -k(실질적인 종료없이 경고메세지만 보냄), -h(시스템 종료), -r(재부팅)        |
| \[시간]                                                                 | +m(현재 시간으로부터 m분 후 종료), hh:mm(절대시간으로 종료), now(바로 종료) |
| # poweroff (시스템 종료)                                                   |                                                     |
| # reboot (재부팅)                                                        |                                                     |

### III. 파일 시스템의 이해

파일 시스템(File System): 운영체제가 파일을 시스템의 디스크상에 구성하는 방식

#### 1) 리눅스 파일 시스템의 구조 (공통으로 가지고 있는 것들)

| 수퍼 블록(Super Block)       | 파일 시스템에 의존하는 정보를 가지며 파일 시스템의 크기 등과 같은 파일 시스템의 전체적인 정보를 가지고 있다.                              |
| ------------------------ | ------------------------------------------------------------------------------------------- |
| 아이노드(Inode)              | 파일의 이름을 제외한 해당 파일의 모든 정보를 가지고 있으며, 각 파일이름에 부여되는 고유한 번호이고 파일의 형태, 크기, 위치, 소유권자 등에 관한 정보가 있다. |
| 데이터 블록(Data Block)       | 아이노드가 몇 개의 데이터 블록을 포함하고 있으며, 파일에서 데이터를 저장하기 위해서 사용된다.                                       |
| 디렉터리 블록(Directory Block) | 파일 이름과 아이노드 번호를 저장하기 위해서 사용된다.                                                              |
| 간접 블록(Indirection Block) | 추가적인 데이터 블록을 위한 포인터들이 사용할 동적으로 할당되는 공간이다.                                                   |
| 홀(Hole)                  | 아이노드나 간접 블록안의 데이터 블록의 주소로 특별한 값을 저장한다.                                                      |

#### 2) 리눅스 파일 시스템의 종류 및 특징

<table data-header-hidden><thead><tr><th width="152"></th><th></th></tr></thead><tbody><tr><td> minix </td><td> 리눅스에서 가장 먼저 사용한 파일 시스템이고, 파일 이름은 최대 30문자, 파일 시스템당 최대 64메가를 지원하여 기능측면에서 떨어진다.</td></tr><tr><td> ext </td><td> 리눅스 초기에 사용되던 파일 시스템으로 상위 호환성이 없던 ext2의 구버전이다. </td></tr><tr><td> ext2 </td><td> 256byte 길이의 파일 이름, 2GB의 단일 파일, 4TB의 디스크를 사용할 수 있다. 단점으로 시스템이 비정상적으로 종료되었을때, 부팅 시 ext2 파일 시스템 검사 프로그램인 e2fsck를 실행하여 파일 시스템의 일관성을 검사하는데, 시간이 매우 오래 걸린다. </td></tr><tr><td> ext3 </td><td> 커널 2.4부터 지원하고 있는 파일 시스템으로, ext2에 저널링 기능을 추가했다. 이 기능으로 ext2보다 데이터 신뢰성이 강화되었고 보다 빠른속도로 작업을 할 수 있다. 16TB까지 인식 할 수 있지만, 여전히 삭제 파일 복구가 용이하지 않았다.</td></tr><tr><td> ext4 </td><td> 파일 시스템의 점검 속도가 현저하게 빨라졌고, 1EiB까지 디스크를 사용할 수 있고, 16TiB까지 파일을 지원한다. 현재 많은 리눅스 시스템에서 이것을 사용한다.  (ext3, ext2 ▶ ext4 [마운트 가능])</td></tr><tr><td> xiafs </td><td> minix파일 시스템을 수정한 파일 시스템이고, ext2파일 시스템과 함께 사용되기도 했다. </td></tr><tr><td><p> ReiserFS/</p><p> ReiserFSv3/</p><p> Reiser4 </p></td><td> 저널링 파일 시스템의 일종으로 안정적인 파일 시스템으로 주목받으며 ext2파일 시스템을 대체할 만한 시스템으로 인정받은 바 있었고, SuSE 리눅스의 기본 파일 시스템으로 사용되기도 하였다. 그러나 2006년 10월 12이후에 발표된 SuSE리눅스부터는 ext3 파일 시스템이 사용되었다. 그리고 이후 ReiserFS v3가 발표되어 현재까지 널리 채택되어 사용되고 있다. Reiser4는 지속적으로 개발 중이다. </td></tr><tr><td> FAT </td><td> MS-DOS 및 윈도우즈 O/S에서 사용하는 파일 시스템이다. </td></tr><tr><td> FAT32 </td><td> FAT 파일 시스템의 32비트 버전으로 윈도우즈95에 처음 도입되었다. </td></tr><tr><td> NTFS </td><td> 윈도우즈 서버와 데스크탑(XP 이후 버전)에서 사용되는 파일 시스템으로, 예전 리눅스 전용으로 지원됬지만, 현재는 읽기/쓰기가 가능하다.</td></tr><tr><td> msdos</td><td> 리눅스에서 지원하는 것으로 FAT 파일 시스템과 호환된다.</td></tr><tr><td> umsdos</td><td> msdos 파일 시스템을 리눅스상에서 긴 파일 이름, 소유자, 접근권한, 링크와 장치 파일들을 지원하도록 확장한 파일 시스템이다. 리눅스를 위해 파티션을 나눌 필요를 없앤다. </td></tr><tr><td> iso9660 </td><td> CD-ROM 표준 파일 시스템이다. CD-ROM 펴준에 좀 더 긴 파일 이름을 쓸 수 있도록 확장한 록 릿지(rock rdge)가 자동으로 지원된다. </td></tr><tr><td> nfs </td><td> 독립되어 있는 각각의 컴퓨터들의 파일에 서로 쉽게 접근하기 위해 파일 시스템을 상호 공유 할 수 있도록 하는 네트워크 파일 시스템이다. </td></tr><tr><td> hpfs </td><td> OS/2 파일 시스템이다. </td></tr><tr><td> sysv </td><td> System V/386, System V/386 파생 시스템, Xenix 및 Coherent의 파일 시스템이다. </td></tr></tbody></table>
