파일시스템 : 운영체제가 저장매체에 파일을 쓰기 위한 자료구조 또는 알고리즘
파일시스템을 사용하는 이유
● 0과 1을 비트로 고나리하기에는 오버헤드(시간, 메모리, 자원)이 너무 큼
● 블록 단위로 관리하기로함(4KB)
● 블록마다 고유번호를 부여해서 관리 -> 사용자가 블록 고유번호를 관리하기 어려움
● 추상적(논리적)객체가 필요 -> 파일
● 각 파일을 블록 단위로 관리하기 위함
파일 저장방법
-> 가능한 연속적인 공간에 파일을 저장하는 것이 좋음
But
외부단편화, 파일사이즈 변경 문제로 불연속 적인 공간에 파일 저장기능이 요구됨
-> 해결방안 제시
1) 블록체인 : 블록을 링크드리스트로 연결 (맨 처음 블록부터 주소를 따라가면 연결 )
2) 인덱스 블록 기법 : 각 블록에 대한 위치정보를 기록해서 한번에 끝 블록을 찾아갈 수 있도록 함 (블록 위치정보를 저장)
※외부단편화
위와 같이 남아있는 메모리 공간은 50MB+50MB =100MB로 요청한 메모리 공간 80MB보다 크지만, 남아있는 공간이 연속적이지 않아 Process C를 할당할 수가 없게 된다. 따라서 남아있는 메모리 공간이 낭비되게 되는 문제가 발생한다.
참조 : https://code-lab1.tistory.com/54
파일시스템 예시
● Linux : ext2, ext3, ext4
● Windows : FAT, FAT32, NTFS
파일시스템
1) inode : UNIX 스타일의 파일 시스템
크게 3가지 구조
● Super Block : 파일 시스템 정보 및 파티션 정보 (리눅스에서 df)
● inode Block : 파일상세정보 (PCB)
● Data Block : 실제데이터 저장
모든 파일이나 디렉토리는 반드시 inode를 하나씩 가지게 됨 -> 파일 or 디렉토리를 inode 번호랑 매칭시켜 인식
파일처리방법
1) 파일 생성 -> inode번호 부여
2) 생성된 inode block에 메타데이터(파일권한, 소유자정보, 파일사이즈, 생성기간, 데이터저장위치) 를 저장
3) inode block의 메타데이터 정보를 기반으로 파일 접근
● Super Block
-> 파일 시스템의 전체 크기, 마운트 정보, Data Block의 개수, 파일 시스템과 같은 주요 정보를 담음
● Group descriptors(GDT)
-> 해당 파일 시스템 내에 모든 Block Group 들의 정보를 기록
-> Group 내의 Free Block의 개수, inode의 개수 및 디렉토리 개수 저장
● inode table
-> inode block들의 모임 -> inode block 안에 inode 들이 모여있음
-> 접근 권한, 소유주, inode번호 등, 파일에 대한 정보를 저장하고 있는 부분
-> 파일 하나당 하나의 inode가 사용됨
● Data blocks Bitmap
-> Data block 내에서 빈공간을 관리하기위해 비트맵을 사용
-> Block의 할당 상태를 나타내며, Block을 할당하거나 해제할때 사용
● inode Bitmap
-> inode table 내에서 빈공간을 관리하기위해 비트맵을 사용
-> inode를 할당하거나 해제할때 사용
● Data blocks
-> 실제 데이터 내용이 저장되는 디스크 영역
inode 구조
● mode
-> type(4bit) : directory, file, link를 결정
-> u (setuid) : 파일이 수행될 때 파일을 생성한 사용자의 권한을 동작할 수 있게 함
-> g (setgid) : 파일이 수행될 때 파일 소유 그룹의 멤버로의 권한을 동작할 수 있게 함
-> s (sticky bit) : 해당 bit 설정된 디렉토리에서는 누그든 파일을 저장할 수 있으나, 파일 삭제는 해당 파일 소유자만 가능하게 함
-> 하위 9bit : r(read), w(write), x(excute)
※ link file
하드링크 : 같은 inode를 가르킴
심볼릭 링크 : 새로운 inode를 할당하고 새로운 inode가 data block을 가르킴
● Owner Info (i_oid, i_gid)
-> 파일을 생성한 소유자의 user id
-> 파일을 생성한 소유자의 group id
● Size
-> 파일의 사이즈를 표시
● Timestamps (i_atime, i_ctime, i_mtime)
-> 파일 접근시간, 생성시간, 수정시간
● Direct Blocks
-> 실제 데이터를 담고 있는 하나의 크기가 4kb인 Block을 가르키는 포인터
● Indirect Blocks (Single, Double, Triple)
-> Data Block을 가르키는 포인터를 가르키는 포인터 테이블
2) ext 계열 파일 시스템 (extended file system)
● ext2 : 리눅스에서 적용하는 시스템 inode구조를 따르고 있다./
● ext3 : ext2구조에서 저널링 기능이 추가되었다.
● ext4 : Extent Tree를 사용하여 인접한 물리적 블록의 묶음 및 대용량 파일 접근 성능을 향상시키도 단편화를 줄임
※저널링(Journaling)
파일 수정 중 시스템 충돌이나 전원 문제가 발생하면 여러문제가 발생할 수 있다.
ex) inode 번호를 할당 받았으나 데이터를 할당 받지 못하는경우 -> Data Block을 사용하지 못해 스토리지 누수가 발생
inode나 비트맵의 수정이 있으면 그 내용을 로그로 남긴다.
이렇게 남겨진 로그를 추적하여 변경사항을 반영한다.
로그를 작성중 크래시가 발생하는 경우
-> 실제 파일에 반영되지 않아 파일의 일관성이 깨지지 않음
실제 파일에 반영하는 중에 크래시가 발생하는 경우
-> 저널에 기록된 로그를 기반으로 다시 반영
3가지 저널링 모드
- Journal : 모든 데이터는 파일 시스템에 쓰여지기전에 Journal에 커밋되고, 나중에 실제 파일 시스템에 복사됨, 속도는 라지만 높은 안정성 보장
- Ordered (ext4 default mode) : 데이터는 저널링 없이 기록하고 , 메타 데이터만 journal에 기록, 속도 측면에서 성능이 좋아지나 journal에 기록되어지지 않았다면 데이터 손실 가능성이 있다.
- Writeback - 데이터를 먼저 저너링하여 기록 후 메타데이터를 journal에 기록한다. 성능향상을 기대할 수 있으나 안정성이 떨어짐
3) FAT (File Allocation Table)
- 디지털 카메라의 저장 장치, USB 메모리등에서 사용
- FAT12, FAT16, VFAT, FAT32 등의 구조가 있다.
FAT32 구조
- FAT32 는 크게 예약영역, FAT 영역, DATA영역 3가지로 나눌 수 있다.
● 예약된 영역 (Reserved Area)
- BR(Boot Record) : window를 부팅시키기 위한 기계어 코드와 FAT 파일 시스템의 여러 설정 ㄱ밧 저장
- FSINFO(File System Information) : 파일시스템의 정보를 저장
- Boot Strap : 부팅시 동작해야할 명령어 코드가 들어있는 부분
- Reserved Sector : 예약된 섹터 공간
- Boot Record Backup : BR의 정보를 백업하는 섹터
- FSINFO Backup : FSINFO의 정보를 백업하는 섹터
● FAT 영역
- FAT1
-> 파일이나 디렉토리 할당 유무구 기록되는 부분
-> 클러스터 단위로 기록되며 1개의 클러스터에 대한 사용 유무를 기록하기 위해 4byte 필요
- FAT2
-> FAT1 영역의 백업 영역
-> FAT1 구조와 동일
● DATA 영역
- 실제 데이터인 파일이나 디렉토리가 저장되어 있는 영역
4) NTFS
- Window NT 부터 사용되기 시작한 파일 시스템
- 모든 데이터를 파일 형태로 관리
- VBR(Volume Boot Record), MFT(Master File Table), Data 영역으로 나뉘어진다.
- VBR 영역
-> Boot Sector 와 추가적인 Boot Code가 저장되는 영역
- MFT
-> 파일의 위치, 시간정보, 크기, 파일 ,이름등의 속성 정보를 보관
- Data 영역