FAT

혹시 지방을(를) 찾아오셨나요?

1 개요

File Allocation Table의 약자. 번역하면 파일 할당 테이블이다. 보통명사같지만 아니다. 그 특유의 간단한 디자인 덕택에 개인용 컴퓨터에서 동작하는 운영체제 중에서 FAT를 지원하지 않는 것이 없어서 데이터 전송에 매우 적합하다. 그에 따라 메모리 카드플래시 메모리 등 많은 장치에서 사용 중이며 그런 메모리를 사용하는 많은 이동식 장비들도 FAT를 지원한다.

FAT라는 이름은 디스크를 포맷할 때 일괄적으로 색인표를 만들어두는데에서 기인한다.

FAT는 간단하게 말해 '클러스터를 제어하는 것'이다. 클러스터 문서 참조.

2 종류

MS-DOSMicrosoft Windows 시리즈가 널리 사용되고 버전업을 함에 따라 발전되어 왔는데 그 중 유명한 것으로는 FAT12와 FAT16, FAT32 등이 있다.

디스크에 접근할 때의 최소단위는 바이트나 킬로바이트 단위가 아니라 클러스터(또는 섹터) 단위를 사용한다. 색인표에는 이 클러스터의 번호가 기록되는데 종류에 따라 이 번호를 기록할 공간의 비트 크기가 다르고 이 크기를 이름에 붙여서 서로를 구분한다.

2.1 FAT12

MS-DOS의 전신인 86-DOS에서 사용하기 위해 팀 패터슨이 CP/M의 FAT를 8비트에서 12비트로 확장하고 기타 정보를 추가하여 만든 것. 클러스터 번호가 12비트이기 때문에 클러스터의 숫자는 4078개[1]로 제한되지만 전체 섹터의 수는 16비트로 계산되기 때문에 최대 32MB[2]까지 지원하였다.

플로피디스크는 용량이 작아 FAT12로 충분하기 때문에 FAT16 등 발전된 버전이 나온 이후에도 여전히 FAT12를 사용하고 있다.[3]

2.2 FAT16

16비트짜리 클러스터 번호를 사용한다. 사용할 수 있는 클러스터의 숫자는 최대 65524.

20MB짜리 HDD가 달린 IBM PC AT 컴퓨터가 나올 때인 MS-DOS 3.0에서부터 지원하였다. 처음에는 FAT12와 마찬가지로 디스크 크기가 32MB로 제한되었다. 당시에는 큰 하드디스크도 거의 없었고 수십~수백 바이트 정도의 파일이 자주 사용되었으므로 섹터의 크기를 512바이트보다 크게 할 필요성이 낮았기 때문이다.

그러다 하드디스크의 용량이 더욱 커졌고 업계는 더 큰 용량을 지원하는 파일시스템을 필요로 했다. 그래서 몇몇 업체는 DOS를 개조해서 지원할 수 있는 파티션 개수를 늘리거나 논리섹터[4]를 이용하기도 했다.

MS-DOS 3.3을 개조한 컴팩의 MS-DOS 3.31에서야 FAT16의 최종진화형이 나타났다. 전체 섹터의 수를 32비트로 늘린 것이다. 파티션의 플래그에 따라 기존의 FAT16처럼 섹터의 개수가 65535 이하로 제한되는 파티션이거나 그보다 많은 파티션이거나가 결정되므로 호환성이 좋았다.

MS-DOS 4.0에서 섹터의 크기를 512B에서 32KB까지 조절할 수 있게 되었고 하드디스크의 크기 제한이 2GB로 올랐다. 하지만 클러스터의 크기를 32KB로 올려두면 파일의 크기가 1바이트이더라도 32KB를 차지하기 때문에 하드디스크 용량 낭비가 매우 심했다. 따라서 90년대 중반 들어 하드디스크의 용량이 GB대로 올라가면서 문제가 심각해졌다.

2.3 VFAT

윈도우 95와 함께 등장. 기존의 MS-DOS의 파일이름은 점을 기준으로 왼쪽에 8자 이하, 오른쪽에 3자 이하로 길이가 제한되어 있었는데 최대 255자까지 지원하도록 했다. 이전 버전의 OS와 호환을 위해 실제로 파일 할당 테이블에는 8.3 형식으로 저장되지만 우회 공간을 두고 거기에 긴 파일 이름을 저장한다. 파일명이 8자가 넘어갈 때는 6자 뒷부분은 자르고 뒤에 "~1"을 붙인다. 같은 디렉토리 내에서 6자까지 글자가 완전히 같을 경우에는 "~2", "~3", ... 형식으로 숫자가 올라간다.[5] 이는 어디까지나 VFAT를 지원하지 않는 프로그램에서도 자료를 읽을 수 있도록 지원하는 것이 목적이며, 구 버전의 파일관리 툴을 이용하는 경우 긴 파일 이름과의 링크가 파손되면서 문제가 되는 경우가 많았다.

2.4 FAT32

FAT16의 제한을 풀기 위해 만든 파일시스템. 클러스터 번호를 32비트로 저장하고 클러스터의 크기가 512바이트에서 4KB까지 지원하기 때문에 지원하는 디스크 크기의 물리적인 한계는 16TB이다.(논리 파티션은 8TB가 한계, 외부 파티션 관리 프로그램을 사용할 경우 2TB가 한계, 윈도우에서는 의도적으로 32GB까지만 지원.) 하지만 파일 하나의 크기가 최대 4GB까지밖에 지원을 하지 못한다.

윈도우 95 OSR2와 윈도우 98부터 지원한다. 처음 나왔을 당시 호환성 때문에 윈도에선 FAT16 시스템을 FAT32로 손실없이 변환해주는 유틸리티를 넣어주기도 했다. 물론 FAT16으로는 못 돌아갔다. 여담으로 훗날 MS는 FAT32를 NTFS로 변환해주는 기능을 넣어준다.

NTFS 보다 단순하기 때문에 액세스 속도가 조금 더 빠르다는 장점이 있지만 NTFS 같은 자동 조각모음 같은 편한 기능도 없고[6] NTFS의 안정성과 보안을 따라오진 못하기 때문에 OS용 스토리지에서는 사실상 설 자리를 잃었다. 사실 윈도 XP 이후부터는 일부러 32GB 이상의 파티션에 대해서는 FAT32 로 포맷하는 옵션을 제공하지 않고 [7], 윈도우 비스타 이상에서는 NTFS 드라이브에만 Windows 설치가 가능해서 자연스레 도태되었긴 했다.

FAT의 구조가 단순하여 구현이 쉽다는 장점으로 인해 카메라 등의 PC외 주변기기에서는 여전히 많이 쓰인다. MS에 지불하는 FAT의 라이센스 비용이 싸다는 점도 한 몫 하고 있다. 범용성이 크기 때문에 Windows 외의 다른 OS와 같이 사용하는 이동식 디스크용으로도 아주 유용하다. 플래시 메모리USB 메모리SSD등의 저장장치로 널리 보급되면서 FAT가 재조명 되었는데, NTFS에 비해 오버헤드가 없어 기본적으로 필요한 용량이 작고, 저널링 등이 없어 정보 기록 횟수가 적어 기록 횟수에 민감한 장치에 적합하고, 조각모음 따위도 필요 없기 때문이다.

다만, 파일 하나당 최대 크기가 4GB가 한계라 동영상 같은 초 고용량의 파일을 저장하지 못하는 맹점이 있다. 일례로 캠코더로 동영상 촬영/녹화시 3.99GB단위로 파일을 끊어 저장된다. 이에 따라 exFAT가 도입된다.

2.4.1 FATX

XBOX 시리즈에서 쓰이는 전용 파일포맷이다. XBOX의 하드디스크와 메모리카드에 사용되며, NTFS가 아니라 FAT32를 살짝 수정한 버전이다. 파일길이 42문자와 파일용량 4GB 제한이 있지만 어차피 일반인들이 사용할 일은 없다.

XBOX 360부터 하드디스크 파일 시스템이 NTFS로 변경되었다.

2.5 exFAT

이동식 디스크 용으로 마이크로소프트에서 개발한 파일시스템이다. 가끔 FAT64라고 부르기도 한다. 고용량, 고속의 플래시 메모리를 효율적으로 다루기 위해 개발되었다. 최대 파일/파티션 크기는 권장 512TB, 이론상 64ZB[8]이므로 용량 문제는 거의 없을듯하다. 하드디스크에도 쓸 수는 있지만(FAT32와는 달리 용량 제한을 걸지 않는다.) FAT 계열의 장수만세 버전이라 전체적으로 클러스터가 큰 편[9]이라 저장된 파일 개수가 많을수록 용량 낭비가 커지게 마련이고, MS에서는 NTFS를 밀어줘서 그런지 윈도우 내에서는 별로 이용되지는 않는 듯 하다. 대표적으로 쓰이는 곳은 Windows PC와 Android 스마트폰 양쪽에 쓰는 64GB이상의 micro SD카드.

이 포맷을 써야 되는 결정적인 이유는 FAT32의 한계인 4GB이상의 파일 크기를 지원하면서 XP나 비스타 32비트에서 고용량 플래시 메모리를 쓰기 위함이다. 기본적으로 NTFS는 윈도우 운영체제에서만 사용이 가능하므로 기종이 다른 리눅스,안드로이드,맥에서는 이용이 불가능한 단점이 있으므로 이동식 메모리로는 거의 쓰이지 않아 FAT 계열을 써야 하는데, FAT32에 넣기 위해 파일을 매번 4기가씩 쪼개기도 그렇고 동영상이면 쪼개는 시간도 굉장히 오래 걸리므로 기존 FAT32를 확장할 필요가 생겨서 exFAT 포맷이 나왔다고 보면 된다. 즉, exFAT 시스템으로 포맷하면 exFAT를 지원안하는 일부 모바일 기기(가령 Divx플레이어라든지)를 제외하곤 아무 곳에서나 대용량 파일과 64GB이상의 플래시 메모리를 사용할 수 있다. 특히 최근엔 OTG도 겸용한 듀얼포트 USB 플래시 메모리가 초저가에 대량으로 풀리면서 스마트폰에 외장 메모리로 연결하는 사람이 늘어나게 되어 관심이 많아졌다. 덕분에 점점 FAT32는 자리를 잃고 있으며 그나마 OS설치도 윈도우7까지만 지원하고 있어 윈도우7의 연장 지원이 종료되는 시점인 2020년 이후라면 FAT16처럼 역사의 뒷편으로 사라질 운명이다. 참고로 윈도우8부터는 exFAT로 부팅지원이 되고 있다. 윈도우7도 편법을 쓰면 부팅이 가능하다.

최초로 도입된 건 Windows CE 6.0이며, PC용 윈도에서는 Windows XP SP2 이후 (KB955704 패치를 깔아야 지원), Windows Vista SP1 이후에서만 지원되며 패치를 깔아야 한다. Windows 7 이후부터는 기본 지원. 당연히 다른 FAT와는 호환성이 없다. Windows XP 패치는 여기 [10][11].

참고로 exFAT를 사용하려면 마이크로소프트에서 라이선스를 얻어야 하기 때문에 이를 지원하는 장비는 그리 많지 않다. 마이크로소프트의 정책상 FAT32까지는 무료, 혹은 무료에 가까운 비용으로 쉽게 라이선스를 사용하게 해주지만 exFAT은 회사의 규모에 따라 꽤 많은 금액을 요구한다. 고용량 파일을 저장하지 않는 mp3 플레이어나 보급형 디카같은 기기들은 exFAT을 굳이 지원하지 않는 경향이 있다. 하지만 메모리 용량이 계속 커지고 대용량 파일도 계속 늘어나다 보니, 특히 동영상 촬영이 되는 기기들은 어쩔 수 없이(?) 보급되고 있는 상황. 안드로이드폰이 팔리면 팔릴수록 MS가 돈을 버는 이유

애플에서도 마이크로소프트의 라이센스를 취득해 OS X 10.6.5 버전부터는 exFAT을 지원한다. 다만, 경험자들의 말로는 맥에서 포맷한 경우에는 OS X과 윈도 둘 다 읽기 쓰기가 가능하지만, 윈도에서 포맷한 경우에 OS X에서 쓰기를 하면 파티션 구조가 꼬여버린다고(...) 맥에서 포맷한 경우에 디스크 오류가 뜨면 맥에서 디스크권한복구를 해주면 디스크가 다시 정상으로 돌아온다.

안드로이드에서는 4.0(아이스크림 샌드위치) 이후부터 제조사들이 본격적으로 지원해주기 시작했다. 이 때 구글에서 마이크로소프트에 대한 특허 문제를 피하기 위해 그 불편하디 불편한 MTP를 도입했다. 기존 방식에서는 안드로이드에 연결된 컴퓨터가 안드로이드의 저장소에 직접 접근하여 정보를 주고받는 반면 MTP는 안드로이드가 별도로 일종의 파일서버가 되어 중간에서 매개하는 역할을 해 준다. 이로써 저장소의 파일 시스템이 어떻든지 안드로이드가 읽을 수만 있다면 PC와 통신이 가능하게 된 것[12]. 따라서 구글은 저장소를 내장 메모리로 돌리고 특허를 어떻게든 회피하기 위해 리눅스 전용 파일시스템인 ext계열을 사용할 수 있게 된 것이다. 그러나 다른 제조사에서는 주로 외장 메모리를 사용하기 때문에, 소비자 입장에서 외장 메모리를 빼서 (90% 이상의 확률로 윈도를 사용하고 있을)자신의 컴퓨터에 꽂았을 때 제대로 동작하지 않는다면 곤란하게 될 것이므로 울며 겨자먹기로 exFAT를 돈을 내고 사용할 수 밖에 없게 되었다. 제조사가 깡으로 외장메모리를 ext계열로 포맷해서 사용할 수 있도록 만들수도 있긴 한데... 이러면, 윈도우 PC에 외장메모리를 연결하는 순간 "포맷하시겠습니까?"가 뜨고 대다수의 예스맨들은 를 누를 것이 뻔하므로(...) 사진이 지워지고 음악이 사라지는 일이 속출하게 될 것이다. 관련 토론.

삼성전자가 삼성 갤럭시 만들다가 이거 관련해서 GPL 위반 논란이 생겨버려서 소스를 공개하다가 실수로 리눅스용 exFAT 모듈 소스를 공개했다.# 이 모듈 소스에는 마이크로소프트의 특허가 포함되어 있어서 지구 최강급의 공격성을 가진 오픈소스 진영의 공격권에서는 벗어났지만 제3자가 공개된 소스를 사용할 경우에 마이크로소프트의 특허소송 대상이 될 수 있다고 한다. 하지만 공개 소프트웨어에 상용 특허 기술이 포함된 경우는 흔한 편으로 소스 자체보다는 기술의 사용권, 소유권 범위가 문제의 본질이므로 삼성이 엮일 가능성은 적다.

참고로 exFAT로 포맷해서 인식 안 되는 안드로이드 기기는 드라이버가 빠져 있어서 인식만 하고 SD카드 마운트가 불가능 하다. 다행히 대부분의 2012년 이후 출시한 안드로이드 모델들은 무리없이 인식을 하지만 국내에서 한글화 한 후 판매중인 중국산 저가 제품들은 용량 절감을 위해서 드라이버를 뺀 경우가 대부분이므로 유의. 이 경우 FAT32만 이용하거나 루팅을 통하여 해당 포멧을 지원하는 모듈을 로드하는 어플을 통하여 해결이 가능하다.[13]

2.6 TFAT

Transaction-safe FAT 의 준말로서, 파일 전송중에 갑자기 메모리카드를 뽑거나 전원이 꺼지는 사태에도 데이터가 망가지는 것을 막기 위한 포맷이다. (그와는 별도로 디바이스는 망가질 수도 있다!) 기존 FAT, exFAT 파일 시스템에 한꺼풀 씌우는 개념이다.

3 기타

파일을 지우면 파일이름의 첫 글자에 0xE5를 써서 지운 파일이라고 표시만 하기 때문에 지운 파일 회복이 매우 간단하다. 이렇게 표시된 파일은 다른 파일이 같은 장소에 복사되면 그때 덮어씌워지면서 지워진다. 도스 시절에 나온 undelete는 이 점을 이용해서 파일을 복구한다. 하지만 파일이 조각나 있으면(단편화) 정상적으로 복구될 확률이 급감하므로 너무 믿지 말자.
  1. 마스터 부트 레코드와 색인표를 위한 공간을 제외
  2. 16비트는 65536개를 표현할 수 있다. 섹터 하나의 크기는 512바이트. 둘을 곱하면 32MB이다
  3. LS-120 슈퍼디스크나 HiFD 등 대형 플로피디스크는 FAT12로는 부족하므로 FAT16을 이용한다.
  4. 실제 물리 섹터의 크기는 512바이트 그대로 두고 여러 개를 하나의 논리 섹터로 묶음
  5. 예를 들어, NAMUWIKI.HTML → NAMUWI~1.HTM 이고, 한글은 한글자가 2바이트이기에 보통 세글자까지만 표현된다. 나무위키.HTML → 나무위~1.HTM
  6. 서드파티 프로그램을 이용하면 가능하기는 하다. 그런데 어차피 이용 중인 드라이브의 폴더는 조각 모음이 안 되므로(부트 시에만 가능하다) 반쪽짜리다.
  7. 윈도우가 아닌 곳에서 포맷하거나, 서드파티 프로그램을 이용하면 그 이상 포맷이 가능하긴 하다.
  8. 1ZB(zettabyte 제타바이트) = 1024 x 1024 x 1024TB. kB->MB->GB->TB->PB(petabyte 페타바이트)->EB(exabyte 엑사바이트)->ZB 순이다. 자세한 내용은 SI 단위 참고.
  9. NTFS는 4kB 수준인데 반해 32GB 메모리 기준 FAT32는 16kB, exFAT은 32kB를 할당한다. 테라 단위 디스크는 FAT32는 32kB, exFAT은 128kB를 할당한다.
  10. 현재 XP 지원 종료로 파일이 내려갔다. 여기에서 영문판을 구할 수 있다
  11. 한글판은 여기
  12. 다른 장점으로는 PC와의 연결이 갑자기 끊어져도 전송되던 파일만 깨질 뿐 파일시스템 전체가 깨지는 일은 없어지고 PC와 연결된 상태에서도 안드로이드쪽에서 저장소에 접근이 가능하다는 것 등이 있다. 단점으로는 엄청 느리고 불안정하다. 자세한 정보는 MTP 항목 참조.
  13. 동일한 방법으로 대부분의 안드로이드 기기가 지원하지 않는 NTFS포멧도 사용이 가능하다.