리눅스 파일 시스템
파일 시스템
- 파일과 디렉터리의 집합을 구조적으로 관리하는 체계
- 어떤 구조를 구성하여 파일이나 디렉터리를 관리하는지에 따라 다양한 형식의 파일 시스템 존재
- /proc/filesystems는 현재 커널이 지원하는 파일 시스템의 종류를 알려줌
리눅스 파일 시스템의 종류
디스크 기반 파일 시스템
- ext(ext1)
- Extended File System
- 1992년 4월 리눅스 0.96c에 포함되어 발표
- 파일 시스템의 최대 크기는 2GB, 파일 이름의 길이는 255 바이트까지 지원
- inode 수정과 데이터의 수정 시간 지원이 안되고, 파일 시스템이 복잡해지고 파편화되는 문제
- 현재 리눅스에서는 ext 파일 시스템을 사용하지 않음
- ext2
- ext 파일 시스템이 가지고 있던 문제를 해결하고자 1993년 1월 발표
- ext2는 ext3가 도입되기 전까지 사실상 리눅스의 표준 파일 시스템으로 사용
- 이론적으로 32TB까지 가능(최대 볼륨 크기 2~32TB)
- ext3
- ext2를 기반으로 개발되어 호환이 가능하며 2001년 11월 공개
- 가장 큰 장점은 저널링(Journaling) 기능을 도입하여 복구기능 강화
- 저널: 일련의 로그 기록
- 저널링: 데이터를 디스크에 기록하기 전에 저널에 수정사항을 기록하는 것으로 디스크에 기록되는 데이터의 복구 기능 강화
- 파일 시스템의 최대 크기는 블록의 크기에 따라 2~32TB까지 지원
- ext4
- 1EB(엑사바이트, 1EB = 1,024*1,024TB) 이상의 볼륨과 16TB 이상의 파일을 지원
- ext2 및 ext3와 호환성을 유지하며 2008년 12월 발표
기타 파일 시스템
- 리눅스에서 지원하는 파일 시스템
- msdos: MS-DOS 파티션을 사용하기 위한 파일 시스템
- iso9660: CD-ROM, DVD의 표준 파일 시스템, 읽기 전용
- nfs: Network File System, 원격 서버 디스크 연결
- ufs: Unix File System, 유닉스 표준 파일 시스템
- vfat: 윈도 95, 98, NT를 지원하기 위한 파일 시스템
- hpfs: High Performance File System
- ntfs: New Technology File System
- sysv: 유닉스 시스템V를 지원하기 위한 파일 시스템
- hfs: 맥 컴퓨터의 hfs 파일 시스템을 지원하기 위한 파일 시스템
- 리눅스 가상 파일 시스템
- swap: 스왑 영역을 관리하기 위한 스왑 파일 시스템
- tmpfs: temporary file system, 메모리에 임시 파일을 저장하기 위한 파일 시스템, 시스템이 재시작할 때마다 기존 내용이 없어짐
- proc: proc file system(/proc 디렉터리), 커널의 현재 상태를 나타내는 파일을 가지고 있음
- ramfs: 램디스크를 지원하는 파일 시스템
- rootfs: root file system, 시스템 초기화 및 관리에 필요한 내용을 관리
리눅스 파일 시스템의 구조
- 파일은 inode로 관리
- 디렉터리는 단순히 파일의 목록을 가지고 있는 파일임
- 특수 파일을 통해 장치에 접근 가능
ext4의 구조
- 효율적으로 디스크를 사용하기 위해 저장 장치를 논리적인 블록의 집합(블록 그룹)으로 구분
- 일반적으로 블록은 4KB이고, 실제 크기는 시스템의 설정에 따라 변경 가능
- 블록 그룹 0
- 파일 시스템의 첫 번째 블록 그룹
- 특별하게 그룹 0 패딩, 슈퍼 블록, 그룹 디스크립터를 가지고 있음
- 첫 1,024 바이트는 특별한 용도(x86 부트 섹터와 부가 정보 저장)로 사용
- 블록 그룹 a
- 파일 시스템에서 첫 번째 블록 그룹이 아닌 블록 그룹
- 그룹 0 패딩이 없으나 슈퍼 블록과 그룹 디스크립터에 대한 복사본을 가지고 있음
- 블록 그룹 b
- 파일 시스템에서 첫 번째 블록 그룹이 아닌 블록 그룹
- 그룹 0 패딩, 슈퍼 블록, 그룹 디스크립터가 없고 바로 데이터 블록 비트맵으로 시작
- 슈퍼 블록: 파일 시스템과 관련된 다양한 정보가 저장 (전체 inode 개수, 블록 개수, 블록 크기, 마운트 시간 등)
- 문제가 생길 경우 전체 파일 시스템 사용 불가
- 슈퍼 블록을 다른 블록 그룹에 복사할 경우 복사본을 사용하여 복구 가능
- 그룹 디스크립터(GDT): 슈퍼 블록 다음에 위치, 블록 비트맵과 inode 관련 주소/개수 등을 저장
- 데이터 블록 비트맵: 블록 그룹에 포함된 데이터 블록의 사용 여부를 확인하는 데 사용
- inode 비트맵: inode 테이블의 항목(inode) 사용 여부 표시
- inode 테이블: 파일 정보 저장
- 데이터 블록: 실제 데이터 저장
디렉터리 계층 구조
- 리눅스의 전체 파일과 디렉터리를 어떤 구조로 정리하고 관리할 것인지를 정의한 것
- 실제 파일이 저장되어 있는 파일 시스템은 디렉터리 계층 구조에 연결되어야 사용자가 접근 가능
- 디렉터리 계층 구조에서 보이는 모든 디렉터리와 파일을 하나의 파일 시스템으로 구성할 수도 있고, 여러 파일 시스템으로 구분하여 구성해 일부 파일 시스템에 문제가 생기더라도 다른 파일 시스템의 파일을 보호할 수 있음
파일 시스템 마운트
- 마운트: 파일 시스템을 디렉터리 계층 구조의 특정 디렉터리와 연결하는 것
- 마운트 포인트: 디렉터리 계층 구조에서 파일 시스템이 연결되는 디렉터리
/etc/fstab
- 파일 시스템 마운트 설정 정보가 저장된 파일
- 장치명(UUID): Universally Unique Identifier
- 로컬 시스템과 다른 시스템에서 파일 시스템을 유일하게 구분해주는 128비트의 숫자
- 시스템의 하드웨어 정보와 시간 정보를 조합하여 랜덤으로 생성
- UUID로 지정된 장치는 /dev/disk/by-uuid 디렉터리에서 찾을 수 있음
- 마운트 포인트: 파일 시스템이 마운트될 마운트 포인트 설정
- 파일 시스템의 종류: ext2, ext3, ext4 등 설정 가능
- 옵션: 파일 시스템의 속성 지정
- defaults: 일반적인 파일 시스템에 지정하는 속성으로 rw, nouser, auto, exec, suid 속성 모두 포함
- auto: 부팅 시 자동으로 마운트
- exec: 실행 파일이 실행되는 것을 허용
- suid: setuid, setgid의 사용을 허용
- ro: 읽기 전용 파일 시스템
- rw: 읽기, 쓰기가 가능한 파일 시스템
- user: 일반 사용자도 마운트 가능
- usrquota: 사용자별로 디스크 쿼터(디스크의 크기 및 파일의 용량) 설정 가능
- grpquota: 그룹별로 디스크 쿼터 설정 가능
- nouser, noauto, noexec, nosuid
- 덤프 관련 설정: 0(dump 불가), 1(dump 가능)
- 덤프: 컴퓨터 프로그램이 특정 시점에 작업 중이던 메모리 상태를 기록한 것, 보통 프로그램이 비정상적으로 종료했을 때 생성
- 파일 점검 옵션: 0(부팅 시 fsck 명령 실행 X), 1(루트 파일 시스템으로 점검), 2(루트 파일 시스템 이외)
마운트 관련 명령
- mount [옵션] [장치명 또는 마운트 포인트]: 파일 시스템 마운트
- -t 파일 시스템 종류: 파일 시스템 종류 지정
- -o 마운트 옵션: 마운트 옵션 지정
- -f: 마운트할 수 있는지 점검만 함
- -r: 읽기만 가능하게 마운트(-o ro와 동일)
- unmount [옵션] [장치명 또는 마운트 포인트]: 파일 시스템 언마운트
- -t 파일 시스템 종류: 파일 시스템 종류 지정
- 옵션이나 인자 지정 없이 마운트 명령만 사용하는 경우 현재 마운트 되어 있는 정보를 출력
- /etc/mtab 파일의 내용과 동일
- 장치명, 마운트 포인트, 파일 시스템의 종류, 마운트 옵션, 사용하지 않는 항목 2개(0 0)