FAT
1. 개요
<File Allocation Table>의 약자. 번역은 '파일 할당 테이블'이다. 보통명사 같지만 아니다. 그 특유의 간단한 디자인 덕택에 개인용 컴퓨터로 동작하는 운영체제 가운데에서 FAT를 지원하지 않는 것이 없어서 데이터 전송에 매우 적합하다. 그에 따라 메모리 카드나 플래시 메모리 같은 많은 장치에서 사용하며, 그런 메모리를 사용하는 많은 이동식 장비들도 FAT를 지원한다. 간단한 디자인이 이동성 측면에서는 장점이지만, 안정성 면에서는 단점으로 작용한다. 디스크 오류에 대비한 저널링과 같은 각종 현대적 안전 장치들이 FAT에는 미미하기 때문.
FAT라는 이름은 디스크를 포맷할 때 일괄적으로 색인표를 만들어 두는 데에서 기인한다. 간단하게 말해 '클러스터를 제어하는 것'이다. 클러스터 문서 참고.
2. 종류
MS-DOS와 Microsoft Windows 시리즈가 널리 사용되고 버전업을 함에 따라 발전되어 왔는데, 그 가운데에 유명한 것으로는 FAT12, FAT16, FAT32, exFAT(FAT64) 등이 있다.
물리적으로 디스크에 접근할 때의 최소 단위는 바이트나 킬로바이트 단위가 아니라 여러 바이트가 모여 있는 섹터 단위이다. 보통 한 섹터의 크기는 512바이트이며, 이보다 더 큰 섹터를 사용하는 경우도 있다. FAT에서는 여러 섹터를 하나로 묶은 논리 단위인 클러스터 단위로 디스크에 접근한다. 보통 한 클러스터의 크기는 4KB이다. 색인표에는 이 클러스터의 번호가 기록되는데, 종류에 따라 이 번호를 기록할 공간의 비트 크기가 다르고 이 크기를 이름에 붙여서 서로를 구분한다.
2.1. FAT12
MS-DOS의 전신인 86-DOS에서 사용하기 위해 팀 패터슨이 CP/M의 FAT를 8비트에서 12비트로 확장하고 기타 정보를 추가하여 만든 것. 클러스터 번호가 12비트이기 때문에, 클러스터의 숫자는 마스터 부트 레코드와 색인표를 위한 공간을 제외한 4078개로 제한되지만, 전체 섹터의 수는 16비트로 계산되기 때문에 최대 32 MB까지 지원하였다. 16비트는 65536개를 표현할 수 있으며, 섹터 하나의 크기는 512바이트인데, 둘을 곱하면 32 MB가 되기 때문. 그러나 FAT16을 지원하기 시작한 MS-DOS 3.0부터는 최대 16 MB까지만 지원한다. macOS의 디스크 유틸리티로 포맷할 경우 5 MB까지만 지원한다.
일반적인 플로피 디스크는 용량이 작아 FAT12로 충분하기 때문에 FAT16 같이 발전된 버전이 나온 이후에도 여전히 FAT12를 사용하지만 LS-120 슈퍼디스크와 HiFD 같은 대형 플로피 디스크는 FAT12로는 부족하므로 FAT16을 이용한다.
현재는 32 MB 이하의 하드 디스크를 찾는 것이 매우 힘들고 플로피 디스크도 거의 사용하지 않아서 거의 사용되지 않고, 홈브류 OS 개발 과정 같은 데서나 쓰인다. 그렇지만 최신 윈도우인 Windows 10이나 최신 맥인 macOS 10.15 카탈리나에서도 지원하고 있다.
2.2. FAT16
16비트짜리 클러스터 번호를 사용한다. 사용할 수 있는 클러스터의 숫자는 최대 65524.
20 MB 짜리 HDD가 달린 IBM PC AT 컴퓨터가 나온 때인 MS-DOS 3.0부터 지원한다. 처음에는 FAT12와 마찬가지로 디스크 크기가 32 MB로 제한되었다. 당시에는 큰 하드 디스크도 거의 없었고 수십~수백 바이트 정도의 파일이 자주 사용되었으므로 섹터의 크기를 512바이트보다 크게 할 필요성이 낮았기 때문이다. 그러다 하드 디스크의 용량이 더욱 커졌고, 업계는 더 큰 용량을 지원하는 파일 시스템을 필요로 했다. 그래서 몇몇 업체는 DOS를 개조해서 지원할 수 있는 파티션 개수를 늘리거나, 실제 물리 섹터의 크기는 512 바이트 그대로 두고 여러 개를 하나의 논리 섹터로 묶어서 이용하기도 했다.
MS-DOS 3.3을 개조한 컴팩의 MS-DOS 3.31에서야 FAT16의 최종 진화형이 나타났다. 전체 섹터의 수를 32비트로 늘린 것이다. 파티션의 플래그에 따라 기존의 FAT16처럼 섹터의 개수가 65535 이하로 제한되는 파티션이거나 그보다 많은 파티션이거나가 결정되므로 호환성이 좋았다.
MS-DOS 4.0에서 섹터의 크기를 512 B에서 32 KB(NT 계열은 64 KB)까지 조절할 수 있게 되었고, 파티션의 크기 제한이 2 GB(NT 계열은 4 GB)로 올랐다. 하지만 클러스터의 크기를 32 KB로 올려 두면 파일의 크기가 1 바이트이더라도 32 KB를 차지하기 때문에 하드디스크 용량 낭비가 지나치다. 따라서 90년대 중반 들어 하드 디스크의 용량이 GB대로 올라가면서 문제가 심각해졌다. 이로 말미암아 2000년대부터는 하드 디스크에 FAT16을 사용하는 일이 드물어졌지만 2000년대 중후반까지만 하더라도 USB와 SD 카드에 많이 사용되었는데, 당시 USB, SD 카드의 용량은 2 GB 미만인 경우가 많았고, FAT32를 지원하지 않는 기기도 흔했기 때문이다.(SD 규격) 그러다가 USB와 SD 카드의 용량도 많이 커지고, SD 카드를 사용하는 많은 기기들도 FAT32를 지원하면서(SDHC 규격) 2010년대 이후로는 FAT12와 함께 거의 사용되지 않는다. 하지만 최신 윈도우인 Windows 10이나 최신 맥인 macOS 10.15 카탈리나에서도 아직 지원하고 있다.
한 경로(폴더)에 파일 개수는 최대 16384개(2^14개)이다. 크기 자체는 작아도 많은 파일을 한 폴더에 넣을 수 없기 때문에 이러한 제한에 걸릴 수 있다.
macOS의 디스크 유틸리티로 포맷할 경우 512 MB까지 지원한다.
2.3. VFAT
Windows 95와 함께 등장. 기존 MS-DOS의 파일 이름은 점을 기준으로 왼쪽에 8자 이하[1] , 오른쪽에 3자 이하로 길이가 제한되어 있었는데 최대 255자까지 지원하도록 했다. 기존 MS-DOS의 파일 이름이 시스템 의존적이었던 반면 VFAT은 UCS-2를 지원하였다. 이전 버전의 OS와 호환을 위해 실제로 루트 디렉터리 영역 및 서브 디렉터리 영역에는 8.3 형식으로 저장되지만 우회 공간을 두고 거기에 긴 파일 이름을 저장한다. 파일명이 8자가 넘어갈 때는 6자 뒷부분은 자르고 뒤에 "~1"을 붙인다. 같은 디렉터리 내에서 6자까지 글자가 완전히 같은 경우에는 "~2", "~3", ... 형식으로 숫자가 올라간다. 또한 띄어쓰기를 할 수 없는 FAT의 특성상 띄어쓰기는 모두 제거된 다음 ~1을 붙인다. 예를 들어, Namu Wiki.html → NAMUWI~1.HTM 이고, 한글은 한 글자가 완성형으로 2 바이트이기에 보통 세 글자까지만 표현된다. 나무 위키.html → 나무위~1.HTM 이는 어디까지나 VFAT를 지원하지 않는 프로그램에서도 자료를 읽을 수 있도록 지원하는 것이 목적이며, 구 버전의 파일관리 툴을 이용하면 긴 파일 이름과의 링크가 파손되면서 문제가 되는 경우가 많았다.
Windows 95 이상의 FAT 파일 시스템들은 모두 이 방식을 사용한다.
2.4. FAT32
FAT16의 제한을 풀기 위해 만든 파일 시스템. 클러스터 번호를 32비트로 저장하고 클러스터의 크기가 512 바이트에서 64[대부분기기] /256[네이티브4K섹터HDD] KB까지 지원하기 때문에 논리 파티션의 최대 크기는 네이티브 4K 섹터 HDD는 16 TB, 대부분의 타 기기는 4 TB까지 지원한다. 하지만 대부분 2 TB가 한계이며[2] , 2000 이후의 NT 계열 윈도우 자체 포맷 프로그램은 32 GB까지만 지원한다. 하지만 파일 하나의 크기가 최대 4 GB[@] 까지만 지원한다. 또한 한 경로(폴더)에 파일 개수가 16384개(2^14개)를 넘기지 못하며, 이마저도 파일 이름이 길면 그 개수는 줄어든다. 크기 자체는 작아도 많은 파일을 한 폴더에 넣을 수 없기 때문에 4 GB[@] 가 넘지 않아도 이러한 제한에 걸릴 수 있다.
윈도우 95 OSR2와 윈도우 98부터 지원한다. 그러나 윈도우 95 OSR2 출시 후에 윈도우 NT 4.0이 나왔음에도 윈도우 NT 4.0은 FAT32를 지원하지 않는다.[3] 윈도우 95 OSR2, 98, Me는 128 GB 크기의 파티션까지 지원한다.
애플에서는 Mac OS 8.1부터 지원한다.
처음 나온 당시에 호환성 때문에 윈도 98에선 512 MB ~ 2 GB짜리 FAT16 파티션을 FAT32로 손실 없이 변환해 주는 '드라이브 변환기(FAT32)' 유틸리티를 넣어 주기도 했다. 물론 포맷 없이 FAT16으로는 못 돌아갔다. 나중에 MS는 윈도우 NT 3.x 이상의 NT 계열 OS에 FAT12/16/32를 NTFS로 변환해 주는 기능을 넣어줬다. 명령 프롬프트에서 convert 명령어로 변환할 수 있는데 이 역시 포맷 없이 NTFS에서 FAT12/16/32로는 못 돌아간다.
NTFS보다 단순하기 때문에 액세스 속도가 조금 더 빠르다는 장점이 있지만 NTFS 같은 자동 조각모음 같은 편한 기능도 없고 NTFS의 안정성과 보안을 따라오진 못하기 때문에 OS용 스토리지에서는 사실상 설 자리를 잃었다. 윈도우 2000과 XP부터는 32 GB 이상의 파티션을 FAT32로 포맷하는 옵션을 제공하지 않았다. 윈도우 2000은 NT 계열 가운데 처음으로 FAT32를 지원하였는데, 이때는 32 GB 면 외장메모리로는 충분하다고 생각했고 이것이 XP를 비롯한 이후의 NT 계열에 영향을 미친 것이다. 단 기술적으로는 FAT32 도 최대 16 테라바이트의 파티션 크기를 지원하기 때문에 FORMAT 명령어를 사용하거나 윈도우가 아닌 곳에서 포맷하거나, 서드파티 프로그램을 이용하면 그 이상[4] 포맷을 할 수 있다.
이 FAT32 의 32 GB 의 제한은 NT포맷 프로그램의 UI를 만들며서 메모리카드는 32 GB 면 충분하다고 생각해 임의로 정했을 뿐 기술적으로는 2 테라바이트 까지는 지원하는데는 아무 문제가 없다. MS 출신 프로그래머가 유투브에서 직접 자신의 과거 실수을 인정했다. ##
FAT의 구조가 단순하여 구현이 쉬운 장점 때문에 카메라, 카오디오 같은 PC 밖의 주변기기에는 여전히 많이 쓰인다. 범용성이 크기 때문에 Windows 이외의 다른 OS와 같이 사용하는 이동식 디스크용으로도 아주 유용하다. 플래시 메모리가 USB 메모리나 SD 카드 같은 저장장치로 널리 보급되면서 FAT가 재조명되었는데, NTFS에 비해 오버헤드가 없어 기본적으로 필요한 용량이 작고, 저널링 등이 없어 정보 기록 횟수가 적어 기록 횟수에 민감한 장치에 적합하고, 조각모음 같은 것도 필요 없기 때문이다.
다만, 파일 하나의 최대 크기가 4 GB[@] 가 한계라, 동영상 같은 초고용량의 파일을 저장하지 못하는 맹점이 있다. 한 예로, 캠코더로 동영상 촬영/녹화 시 3.99 GB 단위로 파일을 끊어 저장한다. 이에 따라 exFAT가 도입됐다. 그래서 FAT32는 자리를 점점 잃고 있으며, OS 설치도 윈도우 XP까지만 지원하고 있어 윈도우 XP의 연장 지원이 종료된 시점인 2014년 이후로는 상당히 입지가 좁아지긴 했지만, 8 GB 이하의 USB 메모리나 임베디드 시스템 등에서는 FAT32가 아직도 사용되고 있다. EFI를 이용하는 일반 PC 역시 EFI 시스템 파티션이 FAT32 형식이다. EFI 표준에 아예 FAT를 사용해야 한다고 못박아 두었기 때문이다.
윈도우 비스타와 7은 FAT32로의 부팅을 지원하지만 FAT32에 윈도우를 바로 설치할 수는 없다. 윈도우를 FAT32에서 부팅하려면 먼저 윈도우를 NTFS에 설치하고 설치된 하드 디스크를 외장으로 물리거나 PE 등으로 부팅하여 운영체제가 설치된 파일을 다른 곳에 복사한 다음에 기존 하드 디스크를 FAT32로 포맷하고 다시 복사해야 부팅할 수 있다.
2.4.1. FATX
Xbox 1세대에 쓰이는 전용 파일 포맷이다. XBOX의 하드 디스크와 메모리 카드에 사용되며, NTFS가 아니라 FAT32를 살짝 수정한 버전이다. 파일 길이 42문자와 파일 용량 4 GB 제한이 있지만 어차피 일반인들이 사용할 일은 없다. Xbox 360은 XTAF라는 자체적인 파일 시스템을 사용하고, Xbox One에서는 NTFS를 마개조한 시스템을 사용한다.
2.5. exFAT
이동식 디스크 용으로 마이크로소프트에서 개발한 파일 시스템이다. 가끔 'FAT64'라고도 한다. 고용량, 고속의 플래시 메모리를 효율적으로 다루기 위해 개발되었다. 최대 파일/파티션 크기는 권장 512 TB, 이론상 128 PB[5] 이므로 용량 문제는 거의 없다. 명령 프롬프트에서 포맷하여 하드 디스크에도 쓸 수는 있지만, 여전히 FAT을 개량한 버전이라 전체적으로 클러스터가 큰 편이라서 저장된 파일 개수가 많을수록 용량 낭비가 커진다. MS에서는 NTFS를 밀어 줘서 그런지 윈도우 내에서는 별로 이용되지 않으며 대표적으로 쓰이는 곳은 Windows PC와 Android 스마트폰 양쪽에 쓰는 64 GB 이상의 micro SD카드, USB 및 PS4이다. macOS와 Windows가 동시에 설치된 부트캠프 환경의 PC나 해킨토시 PC 등에서 공유 폴더의 목적으로도 쓰인다. macOS와 Windows는 모두 exFAT의 읽기/쓰기를 지원한다.
이 포맷을 써야 하는 결정적인 이유는 FAT32의 한계인 4 GB 이상의 파일 크기를 지원하면서 XP 이상에서 고용량 플래시 메모리를 쓰기 위함이다. 기본적으로 NTFS는 윈도우 운영체제에만 사용할 수 있으므로 기종이 다른 리눅스, 안드로이드, 맥에서는 이용할 수 없고, NTFS의 설계가 이동식 메모리에는 불친절한 면도 있다. 따라서 이동식 메모리로는 거의 쓰이지 않아 FAT 계열을 써야 하는데, FAT32에 넣는 데에 파일을 매번 4기가씩 쪼개기도 그렇고 동영상이면 쪼개는 시간도 굉장히 오래 걸리므로 기존 FAT32를 확장할 필요가 생겨서 exFAT 포맷이 나왔다고 보면 된다. 즉, exFAT 시스템으로 포맷하면 exFAT를 지원하지 않는 일부 모바일 기기(가령 Divx 플레이어)를 제외하곤 아무 곳에서나 대용량 파일과 64 GB 이상의 플래시 메모리를 사용할 수 있다. 특히 최근엔 OTG도 겸용한 듀얼포트 USB 플래시 메모리가 초저가에 대량으로 풀리면서 스마트폰에 외장 메모리로 연결하는 사람이 늘어나 관심이 많아졌다.
윈도우 비스타부터는 exFAT로의 부팅을 지원한다. 그러나 부팅 속도가 매우 느리며 특정 프로그램을 설치하거나 윈도우 업데이트를 하려하면 오류가 발생한다. 애초에 exFAT는 부팅용으로 나온 파일시스템이 아니기 때문. 더구나 exFAT는 파일을 읽고 쓰는 속도가 기존 FAT32나 NTFS보다 월등히 느린 편이며, 특히 작은 파일이 많을수록 그러한 현상은 두드러지게 나타난다.[6] 그리고 exFAT에 윈도우를 바로 설치할 수는 없다. 윈도우를 exFAT에서 부팅하려면 먼저 윈도우를 NTFS에 설치하고 설치된 하드 디스크를 외장으로 물리거나 PE 등으로 부팅하여 운영체제가 설치된 파일을 다른 곳에 복사한 다음에 기존 하드 디스크를 exFAT로 포맷하고 다시 복사해야 부팅할 수 있다.
USB 부팅 부분은 exFAT가 지원되지 않는 경우가 많다. USB 부팅을 위해 작업을 진행하다 보면 exFAT에서는 USB 부팅 디스크를 만드는 옵션이 비활성화되거나 강제로 NTFS 또는 FAT32로 바뀐다.
최초로 도입된 건 Windows CE 6.0이며, PC용 윈도우에서는 Windows XP SP2 이상 (KB955704 패치를 깔아야 지원), Windows Vista SP1 이상, Windows 7 이상만 지원된다. 당연히 다른 FAT와는 호환성이 없다. Windows XP 패치는 여기에 있었으나 현재 XP 지원 종료로 파일이 내려가 없다. 여기에서 영문판을 구할 수 있다. 한국어판은 여기.
exFAT를 사용하려면 마이크로소프트에 로열티를 내야 했기 때문에 이를 지원하는 장비는 그리 많지 않았다.[7] 하지만 메모리 용량이 계속 커지고 대용량 파일도 계속 늘어나고 특히 동영상 촬영이 되는 기기들은 어쩔 수 없이 지원할 수 밖에 없었는데 Windows 10 의 2020년 1분기 업데이트 이후, 리눅스 커널에서 exFAT 지원이 된다. 이와 함께 마이크로소프트에서 특허권을 포기하여 이제 더 이상 exFAT을 쓸 때 로열티 없이 모든 장치에 사용할 수 있게 되었다.#
애플에서도 마이크로소프트의 라이선스를 취득해 macOS 10.6.5 버전부터 exFAT를 지원한다. 다만, 경험자들의 말로는 맥에서 포맷한 경우에는 macOS과 윈도우 둘 다 읽기와 쓰기를 할 수 있지만, 윈도우에서 포맷한 경우에 macOS에서 쓰기를 하면 파티션 구조가 꼬여버린다고 한다. 맥에서 포맷한 경우에 디스크 오류가 뜨면 맥에서 디스크 권한 복구를 해주면 디스크가 다시 정상으로 돌아온다.
안드로이드에서는 4.0(아이스크림 샌드위치)부터 제조사들이 본격적으로 지원해 주기 시작했다.
LG TV 에서는 지원하지 않는다.
삼성전자가 삼성 갤럭시 만들다가 이거 관련해서 GPL 위반 논란이 생겨버려서 소스를 공개하다가 실수로 리눅스용 exFAT 모듈 소스를 공개했다.# 이 모듈 소스에는 마이크로소프트의 특허가 포함되어 있어서 지구 최강급의 공격성을 가진 오픈소스 진영의 공격권에서는 벗어났지만 제3자가 공개된 소스를 사용하면 마이크로소프트의 특허소송 대상이 될 수 있다고 한다. 하지만 공개 소프트웨어에 상용 특허 기술이 포함된 경우는 흔한 편으로 소스 자체보다는 기술의 사용권, 소유권 범위가 문제의 본질이므로 삼성이 엮일 가능성은 적다.
exFAT로 포맷해서 인식 안 되는 안드로이드 기기는 드라이버가 빠져 있어서 인식만 하고 SD 카드를 마운트할 수 없다. 다행히 2012년 이후에 출시한 대부분의 안드로이드 모델들은 무리없이 인식을 하지만 국내에서 한국어로 번역하고 판매 중인 중국산 저가 제품들은 용량 절감을 위해서 드라이버를 뺀 경우가 대부분이므로 유의. 이 경우에 FAT32만 이용하거나 루팅을 통하여 해당 포맷을 지원하는 모듈을 로드하는 앱을 통하여 해결할 수 있다. 동일한 방법으로 대부분의 안드로이드 기기가 지원하지 않는 NTFS도 사용할 수 있다.
2.6. TFAT
"Transaction-safe FAT"의 준말로서, 파일 전송 중에 갑자기 메모리 카드를 뽑거나 전원이 꺼지는 사태에도 데이터가 망가지는 것을 막는 포맷이다. 그와는 별도로 장치는 망가질 수도 있다! 마이크로소프트의 윈도우 CE에서 종종 찾아볼 수 있다. 기존 FAT, exFAT 파일 시스템에 한꺼풀 씌우는 개념이다.
2.7. RFS
삼성전자에서 개발한 플래시 메모리용 파일 시스템으로 "Robust File System"의 줄임말이다. 이름만 보면 전혀 상관이 없는 것 같아 보이지만, FAT32를 기반으로 하여 플래시 메모리용 웨어 레벨링과 저널링을 추가한 파일 시스템이다. 갤럭시 S의 /system 및 /data 파티션이 이 형식으로 되어 있는데, 느린 성능으로 인하여 당시에 삼성이 삼적화 소리를 들으면서 욕을 먹게 된 원인 중 하나였다. 결국 삼성은 갤럭시 S2부터는 표준적인 리눅스 계열의 ext4 파일 시스템을 사용하기 시작했다. 삼성의 또 다른 플래시 메모리용 파일 시스템인 F2FS와는 관계가 없다.
3. 최대 파티션 크기
4. 기타
파일을 지우면 파일이름의 첫 글자에 '0xE5'[8] 를 써서 지운 파일이라고 표시만 하기 때문에 지운 파일 회복이 매우 간단하다. 이렇게 표시된 파일은 다른 파일이 같은 장소에 복사되면 그때 덮어 씌워지면서 지워진다. 도스 시절에 나온 undelete는 이 점을 이용해서 파일을 복구한다. 하지만 파일이 조각나 있으면(단편화) 정상적으로 복구될 확률이 급감하므로 너무 믿지 말자.
5. 관련 문서
[1] 8자보다 짧은 경우에는 남은 공간을 공백 문자(0x20)로 채운다. 그래서 MS-DOS에서는 파일 이름에 공백을 사용할 수 없었다.[대부분기기] [네이티브4K섹터HDD] [2] #[@] A B C 정확히는 (해당 용량) - 1 바이트이다.[3] 공식적으로 지원은 안되나 FAT32를 인식시켜주는 패치는 존재한다.[4] 대부분 2 TB까지 지원[5] 1 PB(petabyte 페타바이트) = 1024 TB. KB→MB→GB→TB→PB(petabyte, 페타바이트) 순이다. 자세한 내용은 SI 단위 참고.[6] 그래서 요즘 외장하드는 전부 NTFS로 포맷되어 나온다.[7] 왜냐하면 기업의 규모에 따라 로열티가 크게 달라지기 때문이다.[C] A B C D E F G 사실상 비표준[A] MS-DOS 4.0~8.0 및 Windows 9x가 지원하는 최대 클러스터 크기[B] A B FAT16/32는 섹터 크기가 512B보다 큰 경우 가능하다. 단 512B 에뮬레이션 HDD인 경우는 제외.[8] 확장 아스키 코드의 그리스 문자 σ다.