파일 시스템 1 - FAT, NTFS
파일 시스템
파일 시스템을 한 마디로 정의하자면 파일을 쉽고 빠르게 저장하고 검색할 수 있도록 저장 매체를 관리하는 일종의 규약이다.
이러한 파일 시스템의 종류로는 윈도우 계통에서는 FAT 12/16/32나 NTFS 등이 있고, 리눅스에서는 ext2, ext3 등이 있다.
1. FAT
1) 개요
File Allocation Table의 약자이다. 클러스터 단위로 관리하며 뒤에 붙은 12/16/32는 클러스터를 관리하는 비트 수 이다. FAT12의 경우에는 12비트로 관리하기 때문에 최대 4084개의 클러스터를 관리 할 수 있으며 FAT32의 경우 12비트로 관리하기 때문에 67,092,481개의 클러스터를 관리 할 수 있다.
이 클러스터 크기를 몇으로 잡느냐에 따라서 전체 크기가 정해지는데 클러스터의 크기 제한은 전적으로 OS의 제한에 따른다. 일반적으로 FAT16은 4GB, FAT32는 32GB로 제한된다.
2) 세부 사항
전체적인 구조는 아래와 같다.
FAT 파일 시스템 구조는 크게 3가지 영역으로 나뉜다. 각각 Reserved Area / FAT Area / Data Area 등 이렇게 세가지 인데 각 영역의 크기와 오프셋은 다르지만 FAT 12/16/32가 모두 공통으로 가지는 영역이다. 이 세가지 영역에 대해서 차근차근 설명해보도록하겠다.
1. Reserved Area
파일 시스템에서 가장 앞에 위치하면서 크기는 가변적이다. FAT12/16의 경우 1개, FAT32의 경우 첫 32개의 섹터가 Reserved Area로 사용되는데, 그 중에서 0,1,2,6,7,8번 섹터는 어떤 데이터를 담을지 미리 정해져있다.
0,6번은 Boot Sector고 1,7번은 FSINFO 그리고 2,8번은 Boot Strap에 관한 내용이다.
1.1. 0번,6번섹터 : Boot Sector
이 섹터가 부트 코드를 포함하고 있기 때문에 부트 섹터라고 불리는건데, 앞서서 포스팅했던 그 부트 코드가 맞으며 끝에 시그니쳐로 0x55AA가 포함되어있다.
- Jump command to Boot Code : 3Bytes
- BPB(Bios Parameter Block) : 87Bytes
- Boot Code : 420Bytes
- Signature : 0x55AA 2Bytes
Jump Command to boot code는 말 그대로 부트 코드로 점프하기 위한 부분인데 파일시스템 마다 이부분은 조금씩 다르다. BPB의 경우 여러가지 값들이 87 바이트 안에 다 들어있는데 그 목록은 아래와 같다.
- OEM ID : 파일 시스템의 고유한 값
- BP(Bytes Per Sector) : 한 섹터 당 할당되는 바이트의 크기
- SP(Sectors per cluster) : 한 클러스터가 가지는 섹터의 수 (MAX = 32KB)
- Reserved sector count : FAT Area가 나오기전 예약된 영역의 섹터의 수(FAT32 = 32섹터)
- Number of FAT tables : FAT Area의 개수
- Root directory entry count : FAT 12/16의 루트 디렉터리에 존재 가능한 최대 파일수
- Total sector 16 : 파일 시스템에 있는 총 섹터의 수
- Media Type : 어떤 미디어가 저장되어있는지 나타냄 (플로피디스크 제외하고 0XF8)
- FAT Size 16 : FAT12/16의 FAT Area의 섹터수(FAT32=0)
- Sectors Per Track : 트랙당 섹터의 수 보통 63
- Number of Heads : 헤드의 수
- Hidden Sectors : 파티션 시작전 섹터의 수
- Total Sectors 32 : 파일 시스템에 있는 총 섹터의 수(FAT32일때 주로 기재)
- FAT Size 32 : FAT Area 하나당 섹터 수
- Ext Flags : 여러개의 FAT Area 사용시 설정값 표시
- File System Version : 파일 시스템의 주 버전과 하위 버전 번호
- Root Directory Cluster : 루트 디렉터리가 있는 클러스터 위치 (FAT32는 가변)
- File System Information : FSINFO 구조체가 있는 섹터 위치 (대개 0x01)
- Backup Boot Record : 백업된 부트 섹터의 위치 (대개 0x06)
- Reserved : 예약된 영역
- Drive Number : 드라이브 번호
- Reserved1 : 예약된 영역
- Boot Signature : 확장 부트 시그니처 (대개 0x29)
- Volume ID : 볼륨 시리얼 번호
- Volume Label : 볼륨 레이블 (없으면 NO NAME)
- File System Type : 파일 시스템 형식 표시 (FAT12/16/32)
1.2. 1번,7번섹터 : FSINFO
- Signature : 고유값 0x52526141
- Not used : 사용하지 않음
- Signature : 고유값 0x72724161
- Number of Free Clusters : 사용가능한 클러스터 수
- Next Free Cluster : 사용 가능한 클러스터 시작 위치
- Not used : 사용하지 않음
- Signature : 0x55AA
1.3. 2번,8번섹터 : Boot strap
부트 섹터의 영역이 부족하면 사용할 수 있도록 예약된 영역이며, 일반적으로는 비어있으나 무언가 적혀있다면 은닉된 데이터일 가능성이 있다.
2. FAT Area
FAT Area는 #1과 #2 두개로 나뉘어져있는데, 한 개는 원본 FAT Area이고, 다른 하나는 백업용이다. FAT Area는 Data Area의 클러스터 할당 상태를 표시하는 것으로 FAT12는 12Bit, FAT16은 16Bit, FAT32는 32Bit로 Data Area의 시작 클러스터부터 마지막 클러스터의 할당 상태를 표시한다.
이 FAT Area의 위치는 BPB의 Reserved Sector Count를 확인하여 섹터의 크기를 곱해주면 FAT Area의 시작 위치를 구할 수 있다. FAT Area #1의 경우 그렇게 구할 수 있고 #2의 경우 BPB의 FAT32 Size 값을 시작 위치에 더해주면 FAT Area #2의 시작 위치를 구할 수 있다.
FAT32의 경우 4Bytes로 클러스터 할당 유무를 표시하는데, 이 4Bytes를 FAT Entry 또는 클러스터 번호라고 하며 FAT32의 경우 한 섹터당 128개의 엔트리를 표현 할 수 있다. 각 FAT Entry는 Data Area의 클러스터와 대응되지만 0부터가 아닌 2번 부터 대응된다. 왜냐하면 0번은 Media Type을 표현하고, 1번은 Partition Status를 표현하기 때문이다.
이 FAT Entry에 올 수 있는 값은 아래와 같다.
- 0x?00000000 : 해당 클러스터가 사용가능함
- 0x?00000002 ~ 0x?FFFFFFEF : 사용중인 클러스터이며, 다음 클러스터 값을 나타낸다.
- 0x?FFFFFFF0 ~ 0x?FFFFFFF6 : 예약값
- 0xFFFFFFF7 : 배드 클러스터로 클러스터 내에 한 개 이상의 배드 섹터가 발생해서 사용할수 없음
- 0x?FFFFFFF8 ~ 0X?FFFFFFFF : 파일의 끝을 나타내는 것으로 할당된 마지막 클러스터이다.
3. Data Area
FAT12/16은 Root Directory가 Data Area의 영역 중 올 수 있는 곳이 정해져있지만, FAT32의 경우 Data Area의 영역중 어느곳에나 올 수 있다. 하지만 일반적으로 FAT Area 바로 다음에 오는 듯하다.
데이터가 Data Area에 저장되는 형태는 디렉터리와 파일 두가지 형태로 구분되며 루트 디렉터리는 512개로 한정이지만 서브 디렉터리의 개수 제한은 없다. 이 디렉터리들은 디렉터리 엔트리 라는 구조체로 이루어져있는데 내용은 아래와 같다.
- File Name : 파일 이름, 기본적으로 아스키임
- Extension : 확장자
- Attribute : 읽기 전용인지, 숨김인지, 운영체제 시스템 파일인지 등 속성을 나타냄
- Reserved : 예약된 영역
- Create Time Tenth : 파일 생성시간 (0.1초 단위)
- Created Time : 생성시간 (시 분 초)
- Created Date : 생성일
- Last Accessed Date : 마지막 접근 기록
- Starting Cluster High : 몇번째 클러스터에 위치한지 뒤에 4Bytes
- Last Written Time :
- Starting Cluster Low : 몇번째 클러스터에 위치한지 앞에 4Bytes
- File Size : 파일 크기
NTFS
1) 개요
New Technology File System의 약자로, 윈도우 NT 이후에 도입된 파일 시스템이다. 서버용 파일시스템을 위해서 만들어진 것으로 스펙은 아래와 같다.
- 단일 파일 최대 크기
- 이론 : 16EB - 1KB
- 실제 : 16TB - 64KB
- 최대 볼륨 사이즈
- 이론 : 2 ^ 64 Cluster - 1
- 실제 : 2 ^ 32 Cluster - 1(256TB - 64KB)
- 볼륨당 파일 최대 적재 개수
- 4,294,967,295 (2^32-1)
- 그외의 기능
- 백업, 복구, 2TB 이상 용량 지원, 유니코드 지원, 암호화 지원 등
2) 세부 구조
1. Volume Boot Record
가장 앞 부분에 위치하고 있는 영역으로 부트 섹터, NTLDR Location(부트 로더), Boot Code를 담고 있다. VBR의 섹터 크기는 Cluster Size에 의해서 정해진다. Cluster Size가 512 Bytes일때 VBR Size가 1 섹터, 1KB일때 2섹터, 2KB일때 4섹터, 4KB일때 8섹터이다.
부트 섹터는 아래와 같은 내용으로 이루어져 있다.
- Jump Boot Code : 실행 분기를 부트 코드로 옮기는 코드
- OEM ID : 제조사 ID를 나타냄
- BPB(Bios Parameter Block)
- Bytes Per Secter : 한 섹터 당 할당되는 Byte 크기
- Secter Per Cluster : 한 클러스터 당 할당되는 섹터 수
- Reserved Sector Count : FAT Area가 나오기전에 예약된 영역의 섹터 수
- Unused : 사용하지 않음
- Media : 대부분 0xF8
- Unused : 사용하지 않음
- Total Sectors : 해당 볼륨이 가지는 총 섹터 수
- Start Cluster for MFT : MFT의 LBA 주소
- Start Cluster for MFTMirr : MFTMirr의 LBA 주소
- media : MFT Entry 크기
- Unused : 사용하지 않음
- Cluster Per Index : 디렉터리 공간 할당을 위해 사용되는 인덱스 버퍼의 크기
- Unused : 사용하지 않음
- Volume Serial Number : 볼륨 시리얼 번호
- Unused : 사용하지 않음
- Boot Code Error Message : 에러 메세지
- Sinature : 부트 섹터임을 나타내는 시그니처 (0x55AA)
NTLDR Location 및 부트 스트랩은 NTFS 부트 로더의 위치를 담고 있다.
2. Master File Table
파일, 디렉터리 메타데이터를 모두 파일 형태로 관리하며, 파일 시스템의 전체 영역중 12.5% 정도를 할당하여 관리하게 된다. MFT Entry 0 ~ 15까지는 예약된 영역으로 사용한다. 이 예약된 영역에 대해서는 아래와 같다.
- MFT : 모든 파일들의 MFT Entry 정보를 담고 있다.
- MFTMirr : MFT 파일의 일부 백업 데이터를 담고 있다.
- LogFile : Meta Data의 트랜잭션 저널 정보를 담고 있다.
- Volume : 볼륨의 레이블, 식별자, 버전등 정보를 담고 있다.
- AttrDef : 속성의 식별자 이름, 크기 등의 정보를 담고 있다.
- . : 볼륨의 루트 디렉터리 정보를 담고 있다.
- Bitmap : 볼륨의 클러스터 할당 정보를 담고 있다.
- Boot : 볼륨이 부팅 가능할 경우 부트 섹터 정보를 담고 있다.
- BadClus : 배드 섹터를 가진 클러스터 정보를 담고 있다.
- Secure : 파일의 보안, 접근 제어와 관련된 정보를 담고 있다.
- Upcase : 모든 유니코드 문자의 대문자
- Extend : 추가적인 파일의 정보를 기록하기 위해 사용하는 엔트리 12~15 : 미래를 위해서 예약된 영역으로 남겨둠
그 다음 엔트리들은 Header, Fixup Array, Attributes, End marker, unused space로 이루어져있다. 각기 세부 값이 있는데, 해당 부분의 경우 필요하면 추가로 포스팅을 하겠다.
3. Data Area
실질적인 데이터가 들어가는 부분이다.