[정보보안기사/리눅스] 리눅스 파일 시스템
파일 시스템
- 여러 가지 정보를 저장하는 기본적인 구조
- 시스템 관리를 위한 기본 환경을 제공
- 계층적인 트리 구조 형태
리눅스에 설치되어 있는 운영체제 관련 파일, 사용자 패키지, 사용자가 만든 파일 등을 관리하는 것이다. 리눅스의 파일은 가장 최상위 루트부터 그 하위로 만들어지며 루트 파일 시스템은 오직 한 개만 존재한다
사용자가 vi, vim과 같은 에디터 프로그램을 사용해서 파일을 만드는 텍스트 파일과 gcc(C언어 컴파일러)를 사용해서 만든 실행파일이 있으므로 실행파일은 바이너리 파일로 분류된다.
파일들을 저장하기 위한 디렉터리가 있고 USB, CDROM, CPU, Memory와 같은 하드웨어 장치를 관리하기 위한 특수파일이 있으며 특수파일은 /dev
디렉터리에 위치한다. 특수파일에는 문자단위로 기록된 문자단위 특수파일과 동일한 크기로 기록되는 블록단위 특수파일로 분류된다
종류 | 설명 |
---|---|
루트 파일 시스템 | 하드디스크 상에서 적어도 하나의 파일 시스템이 존재 시스템 프로그램과 디렉터리들이 포함 |
일반 파일 | 컴퓨터가 수행 가능한 프로그램 파일이나 원시 프로그램 파일, 텍스트 파일, 데이터 파일 등이 존재 |
디렉터리 파일 | 다른 파일과 디렉터리들에 관한 정보를 저장하는 논리적인 단위 파일명인 문자열과 inode 번호를 연결하는 부분 |
특수 파일 | 주변 장치에 연결된 파일로 하나 이상의 특수 파일을 가지고 있어야 한다 |
파일시스템 구조
리눅스 파일 시스템의 구조는 부트블록
으로 시작되며 부트블록은 컴퓨터 시스템을 부팅하기 위한 부팅에 관련된 이미지를 가지고 있다. 이것은 리눅스 운영체제가 시작되면 제일 처음 읽음으로써 리눅스를 기동하게 된다. 부트블록이 주기억 장치에 모두 올라가면 리눅스 운영체제는 제일 처음 init
프로세스를 기동하게 되고, init 프로세스의 프로세스 ID는 1번이 부여된다
부트블록 다음에 슈퍼블록
이 나오며 슈퍼블록은 파일 시스템의 크기, 여유 공간, 파일 시스템 이름, 디스크의 이름 등의 정보를 가지고 있다
부트 블록(Boot Block)
파일 시스템으로부터 리눅스 커널을 적재시키기 위한 프로그램
슈퍼 블록(Super Block)
- 파일 시스템의 크기, 블록 수 등 이용 가능한 빈 블록 리스트
- 빈 블록 리스트에서 그 다음의 빈 블록을 가리키는 인덱스
- inode 목록의 크기, 파일 시스템에 있는 빈 inode의 수와 목록
- 빈 node 목록에서 그 다음의 빈 inode의 수와 목록
- 빈 블록과 빈 inode 목록들에 대한 lock 필드
- 슈퍼 블록들이 수정되었는지 나타내는 플래그
- 파일 시스템 이름과 파일 시스템 디스크의 이름
inode
리눅스 커널이 현재 사용하는 자료구조를 유지하는 구조체
리눅스는 파일에 접근 시 아이노드를 통해서 파일을 참조한다. inode는 리눅스만 가지고 있는 정보로 파일과 관련된 정보를 가지고 있고, 파일은 영문이름, 한글이름등으로 나타내지만 리눅스는 inode number라는 일련의 숫자를 부여하여 파일을 관리한다.
inode는 파일 링크 정보를 가지고 있는데 파일링크는 심볼릭 링크와 하드 링크로 나누어진다
심볼릭 링크는 마치 윈도우의 바로가기와 비슷한 기능으로 파일명이 너무 길면 심볼릭 링크를 만들어서 짧은 파일명으로 사용할 수 있다.
즉, 긴 파일명과 긴 디렉터리 명을 대신해서 사용할 때 링크정보만 가지고 있는 새로운 inode가 만들어지고(ln -s
) inode는 원래 파일의 포인터 정보만을 가지고 있다. 만약 원본 파일이나 디렉터리를 삭제하게 되면 심볼릭 링크는 삭제된다
하드 링크는 원본 파일을 복사해서 동일한 inode를 만드는 것(ln
)으로 원본 파일을 삭제하거나 이동해도 하드 링크는 존재한다
- 구성요소
- 파일 소유자의 사용자 ID
- 파일 소유자의 그룹 ID
- 파일 크기
- 파일이 생성된 시간
- 최근 파일이 사용된 시간
- 최근 파일이 변경된 시간
- 파일이 링크된 수
- 데이터 블록 주소
- 접근 모드
- 기능
- 할당 및 적용 : 파일 구성 블록에 대한 물리적 위치 정보
- 파일생성 : 파일이 생성되면 해당하는 inode가
i-list
에 만들어지며 그 inode의 inode Number와 파일 이름, 디렉터리가 등록됨 - 파일링크 : 기존 파일과 링크할 경우 디렉터리에 그 파일에 대한 새로운 이름이 등록되고 inode Number는 본래 있던 파일의 inode Number가 복사된다
- 파일삭제 : 파일에 대한 inode의 파일 링크 수가 하나 감소되고 디렉터리 엔트리에서 해당 파일의 inode Number가 0으로 변경
블록관리 방법
-
단일 간접블록(Single Indirect Block)
inode block을 가리키며 실제 데이터 블록을 가리키는 포인터들로 구성 -
이중 간접블록(Double Indirect Block)
인덱스 블록이 2개의 레이어로 구성되면 첫 번째 인덱스 블록은 두 번째 인덱스 블록을 가리키는 포인터로, 두 번째 인덱스 블록은 실제 데이터 블록을 가리키는 포인터로 구성 -
삼중 간접블록(Triple Indirect Block)
인덱스 블록이 3개의 레이어로 구성되면 첫 번째와 두 번째 인덱스 블록은 다른 인덱스 블록을 가리키는 포인터, 세 번째 층 인덱스 블록은 실제데이터 블록을 가리키는 포인터들로 구성
데이터 블록(Data Block)
실제 데이터가 저장되어 있는 파일 형태
파일 시스템 생성
디스크 파티션
파일 시스템을 생성하기 위해서는 하드 디스크를 초기화하고 필요하면 파티션을 수행하여 하드 디스크를 분할해야 한다. 그 때 파티션을 수행하는 리눅스 명령어가 fdisk
이다.
fdisk [-l][-v][-s 파티션][장치명]
fdisk 옵션 | 설명 |
---|---|
-l | 현재 파일 시스템 목록 확인 |
-v | 버전 정보 확인 |
-s 장치명 | 입력 장치 크기를 출력 |
-d | 파티션 삭제 |
-n | 새로운 파티션 생성 |
-p | 현재 파티션 설정 상태 확인 |
파일 시스템 생성
하드 디스크를 파티션했으면 해당 파티션에 파일 시스템을 생성해야 한다. 하드 디스크를 생성하기 위해서는 mkfs
명령어를 실행한다.
mkfs[옵션][장치이름]
mkfs 옵션 | 설명 |
---|---|
-V | 실행되는 파일 시스템의 특정 명령어 등 모든 정보를 출력 |
-t | 파일 시스템 형식 선택 |
-c | Bad Block 검사, Bad Block 리스트 초기화 |
-l | 파일로부터 초기 Bad Block을 읽음 |
-v | 현재 진행사항 출력 |
파일 시스템 무결성 검사
fsck
는 파일 시스템의 무결성을 검사하는 명령어로 파일 시스템에는 상위 디렉터리, 하위 디렉터리 그리고 파일 간의 링크 정보 등을 가지고 있어야 한다. 이러한 정보에 오류가 발생되면 파일 시스템의 구조를 파악할 수 없다. 그럴 때 리눅스는 fsck를 통해서 파일 시스템의 무결성을 검사하고 오류가 발생하면 수정할 수 있다. fsck는 기본적으로 부팅단계에서 자동적으로 실행하게 되고 필요에 따라서 직접 실행할 수도 있다
fsck 옵션 | 설명 |
---|---|
-s | 대화형 모드에서 여러 파일 시스템을 점검할 때 fsck 동작을 시리얼화 한다 |
-t | 검사를 수행할 파일 시스템을 지정 |
-A | /etc/fstab 파일에 기술된 파일 시스템을 모두 검사 |
-N | 검사는 수행하지 않고 수행될 내용을 출력 |
-P | 병렬처리를 수행하여 루트 파일 시스템 점검 |
-R | 루트 파일 시스템은 제외 |
-V | 명령을 포함하여 세부 내역을 출력 |
파일 시스템 옵션 | 설명 |
---|---|
-a | 무결성 검사 후에 자동검사 수행 |
-r | 대화형 모드를 수행하며 오류를 수정 |
-n | 오류를 수정하지 않고 표준 출력으로 출력 |
-y | 특정 파일 시스템에 대해서 오류를 자동 수정 |
파일 시스템 마운트
디렉터리, CDROM, USB 등과 같은 장치를 연결하여 사용하는 것이 마운트(Mount)이다. 리눅스에서는 특정 디렉터리를 연결할 경우 mount
명령을 사용한다
mount [-hV]
mount -a [-fnrvw] [-t 파일 시스템 유형]
mount [-fnrvw] [-o 옵션[…]] 장치/디렉터리
mount [-fnrvw] [-t 파일 시스템 유형] [-o 옵션] 장치 디렉터리
mount 옵션 | 설명 |
---|---|
-v | 자세한 정보 출력모드 |
-f | 마운트 를 할 수 있는지 점검 |
-n | /etc/mtab 파일에 쓰기 작업을 하지 않고 마운트 |
-r | 읽기만 가능하도록 마운트 수행 |
-w | 읽기 및 쓰기 모드로 마운트 수행 |
-t vfstype | -t 다음에 쓰이는 인수로 파일 시스템 유형 지정 |
fstab
파일은 mount를 수행할 때 참조하는 파일로 파일 시스템 마운트에 관한 정보를 가지고 있다
- fstab 파일의 필드
- 파일 시스템 장치(레이블 명)
- 마운트 포인터(디렉터리 명)
- 파일 시스템 형식(ext2, ext3…)
- 옵션(Read Only / Read Write)
- 덤프
- 파일 점검 옵션(0,1)
fstab 옵션 | 설명 |
---|---|
defalut | 일반적인 팡리 시스템 |
auto | 부팅 시 자동으로 마운트 |
exec | 실행 파일이 실행되도록 허용 |
suid | setuid와 setid를 허용 |
ro | 읽기전용 파일 시스템 |
rw | 읽고 쓰기가 가능한 파일 시스템 |
user | 일반 사용자도 마운트 할 수 있는 파일 시스템 |
nouser | root만 마운트 할 수 있는 파일 시스템 |
noauto | 부팅 시 자동으로 마운트하지 않음 |
noexec | 실행 파일이 실행되지 못함 |
nosuid | setuid와 setgid를 허용하지 않음 |
usrquota | 개별 사용자의 쿼터 설정이 가능한 파일 시스템을 의미 |
grpquota | 그룹별 쿼터 설정이 가능한 파일 시스템 |
마운트를 해제할 때는 umount 명령어를 사용한다
umount [-nv] 장치/디렉터리
umount 옵션 | 설명 |
---|---|
-n | /etc/mtab 파일을 변경하지 않고 마운트를 해제 |
-v | 정보출력 |
-a | /etc/mtab 파일에 지정된 파일 시스템을 모두 해제 |
-t 파일시스템 명 | 지정된 파일 시스템을 해제 |
CDROM과 같은 하드웨어는 마운트를 수행하여 사용할 수 있다. 만약 CDROM에서 CD를 빼내려면 마운트를 해제하고 eject
명령을 실행한다.
파일 시스템 종류
리눅스 파일 시스템은 ext2, ext3, ext4가 있으며 현재 대부분의 리눅스는 ext4
를 지원한다.
- ext2 파일 시스템
- 단일 파일의 크기 : 최대 2GB
- 파일명 : 최대 256Byte
- 최대 지원 파일 시스템 크기 : 4TB
- 디렉터리 당 저장 가능한 최대 파일 수 : 약 25,000개
- ext3 파일 시스템
- 단일 단일의 크기 : 4GB
- 파일명 : 256Byte
- 최대 파일 시스템 크기 : 16TB
- 디렉터리 당 저장 가능한 최대 파일 수 : 65,565개
- 저널링 파일 시스템 지원
- ext4 파일 시스템
- 1EB(엑사바이트) 블록 지원, 단일 파일 크기 16TB 지원
- ext2, ext3 호환성 및 마운트 가능
- 파일 무결성 오류 시 실행되는
fsck
성능 향상 Extends
지원 : 큰 사이즈 파일을 삭제할 때 시간을 단축함- 하위 디렉터리 수 제한이 32,000개에서 2배 확대
- ext3 저널링 파일 시스템에서 발생되는 단편화를 조각모음으로 개선
댓글남기기