Extent for macOS
받기
Linux 디스크 가이드

ext4, ext3, ext2 설명.

Linux 파일 시스템이 무엇인지, 디스크에 파일을 어떻게 배치하는지, 저널이 무엇을 보호하는지, 오늘날 중요한 기능과 한계는 무엇인지, 그리고 Mac이나 Windows PC에서 ext4 디스크를 여는 방법.

마지막 확인

ext2, ext3, ext4란

ext2, ext3, ext4는 두 번째, 세 번째, 네 번째 확장 파일 시스템(extended file system)입니다. Linux가 30년 넘게 자기 디스크에 사용해 온 형식입니다. 파일 시스템은 파일, 폴더, 이름, 권한, 날짜가 디스크에 어떻게 배치될지 정하며, 그 형식을 아는 컴퓨터라면 다시 찾을 수 있게 합니다.

오늘날 주로 만나는 것은 ext4입니다. Debian, Ubuntu, Raspberry Pi OS가 디스크를 ext4로 포맷하고, Linux 서버의 데이터 디스크에도 흔히 쓰이며, Google은 2010년에 Android 휴대폰을 ext4로 옮겼습니다. Linux에서 준비한 USB 드라이브나 SD 카드는 거의 항상 ext4입니다.

이 셋은 서로 다른 형식이 아니라 하나의 계열입니다. 각 세대는 이전 세대의 디스크 구조를 그대로 두고 확장했습니다. 그래서 현재의 Linux 커널은 세 가지 모두를 하나의 ext4 드라이버로 읽고 씁니다.

짧은 역사

  1. 1992

    ext, 확장 파일 시스템

    Rémy Card가 Linux 0.96c를 위해 만들었습니다. Linux가 처음 사용하던 Minix 파일 시스템은 디스크 크기와 파일 이름의 한계가 이미 너무 작았기 때문에 이를 대체했습니다.

  2. 1993

    ext2

    1993년 1월 Linux 0.99를 위한 재설계로, BSD Fast File System의 아이디어를 가져왔습니다. 디스크를 블록 그룹으로 나누고 접근, 변경, 수정 시간을 따로 기록합니다. 1990년대 내내 Linux의 표준으로 남았습니다.

  3. 2001

    ext3가 저널을 추가

    Stephen Tweedie의 ext3가 2001년 11월 Linux 2.4.15로 메인라인 커널에 들어갑니다. 구조가 ext2와 같아서 ext2 디스크에 저널만 추가하면 ext3가 되지만, 충돌 후에 디스크 전체를 오래 검사할 필요가 없어졌습니다.

  4. 2006

    ext4 개발 시작

    Theodore Ts’o가 2006년 6월 28일 계획을 발표합니다. 클러스터 파일 시스템 Lustre를 위해 개발된 확장을 바탕으로 했습니다. 개발 버전인 ext4dev가 Linux 2.6.19에 등장합니다.

  5. 2008

    ext4가 안정판으로

    2008년 12월 25일 출시된 Linux 2.6.28이 익스텐트, 64비트 블록 번호, 지연 할당, 나노초 단위 타임스탬프를 가져옵니다.

  6. 2013–2021

    체크섬, 암호화, 대소문자

    이후 커널에 인라인 데이터(3.8), 메타데이터 체크섬(3.18), 암호화(4.1), 대소문자를 구분하지 않는 폴더(5.2), verity(5.4), fast commit(5.10), orphan file(5.15)이 추가됩니다.

ext4의 디스크 구조

블록. ext4는 공간을 블록 단위로 할당하며 보통 4 KiB입니다. 크기는 포맷할 때 1 KiB에서 64 KiB 사이로 정해집니다. 디스크가 인라인 데이터를 쓰지 않는 한, 1바이트짜리 파일도 블록 하나를 통째로 차지합니다.

블록 그룹. 디스크는 블록 그룹으로 나뉩니다. 4 KiB 블록이면 그룹마다 32,768 블록, 즉 128 MiB입니다. 각 그룹에는 사용 중인 블록용과 아이노드용 비트맵 두 개, 그리고 아이노드 테이블의 일부가 있습니다. 파일의 데이터를 아이노드 가까이에 두면 디스크 헤드의 이동이 줄어듭니다. flex_bg 기능은 여러 그룹의 비트맵과 아이노드 테이블을 한곳에 모아, 큰 파일이 그룹 경계를 넘어 한 덩어리로 놓일 수 있게 합니다.

슈퍼블록. 디스크 맨 앞 1 KiB 여백 다음에 있으며, 파일 시스템의 크기, 블록 크기, 사용하는 기능, 정상적으로 마운트 해제되었는지를 기록합니다. 여러 블록 그룹에 사본이 있어 손상된 슈퍼블록을 백업에서 복원할 수 있습니다.

아이노드. 모든 파일과 폴더에는 아이노드가 하나씩 있으며 기본 크기는 256바이트입니다. 소유자, 권한, 타임스탬프, 크기, 데이터 위치 등 이름을 뺀 모든 것을 담습니다. 아이노드 수는 포맷할 때 정해지므로, 아주 작은 파일로 가득한 디스크는 여유 공간이 남아 있어도 아이노드가 바닥날 수 있습니다.

폴더. 폴더는 이름을 아이노드 번호에 연결하는 특별한 파일입니다. 이름은 최대 255바이트입니다. 작은 폴더는 단순한 목록이고, 큰 폴더에는 해시 트리(dir_index, “htree”) 색인이 붙어, 10만 개 중 이름 하나를 찾는 데도 전체를 훑지 않고 블록 몇 개만 읽으면 됩니다.

블록 맵 대신 익스텐트. ext2와 ext3는 파일의 블록을 하나하나 기록합니다. 아이노드 안의 직접 포인터 12개, 그다음 포인터로 가득 찬 블록, 그 블록을 가리키는 포인터, 다시 그 포인터를 가리키는 포인터입니다. ext4는 구간을 기록합니다. 익스텐트는 “여기서부터 이만큼의 블록”을 뜻하며, 항목 하나로 최대 32,768 블록(4 KiB 블록에서 128 MiB)을 나타냅니다. 익스텐트 4개는 아이노드 자체에 들어가고, 더 길고 조각난 파일에는 최대 5단계의 익스텐트 트리가 만들어집니다. 크고 연속된 파일은 수천 개가 아니라 몇 개의 항목으로 표현됩니다.

작은 파일은 아이노드 안에 들어갈 수 있습니다. inline_data 기능을 쓰면 파일의 처음 60바이트까지는 아이노드 자체에, 조금 더 큰 부분은 확장 속성 공간에 저장되어 블록을 전혀 쓰지 않습니다.

저널과 저널이 지키는 것

파일 시스템을 바꾸는 일은 한 번의 쓰기로 끝나지 않습니다. 파일 하나를 만들어도 비트맵, 아이노드, 폴더, 그룹 디스크립터의 카운터를 건드립니다. 이 쓰기들 사이에 전원이 나가면 디스크는 반쯤 바뀐 채로 남습니다. ext2는 이를 알아내려면 e2fsck로 디스크 전체를 검사할 수밖에 없었고, 큰 디스크에서는 오래 걸렸습니다.

ext3와 ext4는 저널을 둡니다. 디스크의 예약된 영역(보통 아이노드 8)으로, 변경 내용이 실제로 적용되기 전에 먼저 여기에 기록됩니다. 변경은 세 단계로 진행됩니다. 먼저 새 블록이 저널에 들어갑니다. 다음으로 커밋 레코드가 트랜잭션이 완료되었음을 표시합니다. 그 뒤에야 블록이 실제 위치에 기록되는데, 이것이 체크포인트입니다. 어느 시점에 전원이 나가더라도 다음 마운트 때 저널이 재생되어, 커밋까지 도달한 트랜잭션은 다시 적용되고 커밋이 없는 것은 버려집니다. 파일 시스템은 몇 초 만에 일관된 상태로 돌아옵니다.

ext3와 ext4 저널의 세 가지 데이터 모드
모드저널을 거치는 것충돌 후
data=ordered (기본값)메타데이터만. 단, 파일 데이터는 그것을 가리키는 메타데이터가 커밋되기 전에 기록됩니다.구조는 일관됩니다. 그 순간 쓰고 있던 파일에는 이전 데이터가 남을 수 있습니다.
data=journal메타데이터와 파일 데이터.가장 안전하고 가장 느립니다. 커밋에 도달한 데이터는 남아 있습니다.
data=writeback메타데이터만, 데이터 순서 보장 없음.구조는 일관되지만 최근에 바꾼 파일에 오래된 내용이 보일 수 있습니다.

저널은 백업이 아닙니다. 파일 시스템의 구조를 온전히 지키고 커밋된 내용을 보장하지만, 진행 중이던 변경을 되살리거나 고장 나는 디스크로부터 보호하지는 않습니다. ext4는 fast commit(Linux 5.10)도 쓸 수 있습니다. 전체 커밋 사이에 바뀐 메타데이터만 담은 작은 레코드를 써서 잦은 fsync 호출의 부담을 줄입니다.

작동 중인 Raspberry Pi에서 뽑은 카드가 바로 이 경우입니다. 저널에는 제자리에 기록되지 못한 커밋된 트랜잭션이 남아 있고, 슈퍼블록은 “needs recovery”를 표시합니다. Linux는 다음 마운트 때 이를 재생합니다. 다른 곳에서 카드를 읽는 소프트웨어도 재생해야 하며, 그렇지 않으면 그 트랜잭션 이전 상태의 파일을 보여 줍니다.

ext2 vs ext3 vs ext4

세 세대 비교(4 KiB 블록)
ext2ext3ext4
Linux 도입1993년(0.99)2001년(2.4.15)2008년(2.6.28)
저널없음있음있음, Linux 5.10부터 fast commit 포함
파일 블록 기록 방식블록 맵블록 맵익스텐트
최대 파일 크기2 TiB2 TiB16 TiB
최대 파일 시스템 크기16 TiB16 TiB실제로는 1 EiB(64비트)
타임스탬프초 단위, 2038년까지(128바이트 아이노드)초 단위, 2038년까지(128바이트 아이노드)나노초 단위, 2446년까지
큰 폴더 색인없음있음(dir_index)있음, large_dir로 3단계
메타데이터 체크섬없음없음있음(metadata_csum)

실제로는 새로 만드는 것은 모두 ext4면 됩니다. 새 디스크에 ext3를 쓸 이유는 없고, ext2는 저널이 필요 없는 곳, 예를 들어 작은 부팅 파티션이나 쓰기를 최소화해야 하는 플래시 매체에 남아 있습니다. ext3 디스크는 그 자리에서 ext4로 변환할 수 있지만, 이미 있던 파일은 다시 쓰일 때까지 블록 맵을 유지합니다.

실제 디스크에서 만나는 기능

ext 디스크에는 버전 번호 대신 슈퍼블록에 기능 플래그가 있고, 각 플래그는 세 종류 중 하나에 속합니다. 호환 기능은 그 기능을 모르는 소프트웨어가 무시해도 됩니다. 읽기 전용 호환은 그런 소프트웨어가 디스크를 읽을 수는 있지만 쓰면 안 된다는 뜻입니다. 비호환은 디스크를 전혀 건드리면 안 된다는 뜻입니다. 이 규칙 덕분에 오래된 도구는 새 디스크를 망가뜨리지 않고 거부합니다.

자주 쓰이는 ext4 기능
기능하는 일Linux 지원 시작
extent블록 맵 대신 익스텐트로 파일을 기록.2.6.28
64bit32비트보다 넓은 블록 번호, 16 TiB를 넘는 파일 시스템용.2.6.28
flex_bg여러 블록 그룹의 메타데이터를 한곳에 배치.2.6.28
metadata_csum모든 메타데이터에 CRC32C 체크섬을 붙여 손상을 감지.3.18
metadata_csum_seed체크섬 시드를 슈퍼블록에 저장해 UUID를 바꿀 수 있게 함.4.4
inline_data아주 작은 파일을 아이노드 안에 저장.3.8
encrypt폴더 단위로 파일 내용과 이름을 암호화.4.1
casefold이름의 대소문자를 구분하지 않는 폴더.5.2
verity해시 트리로 내용을 검증하는 읽기 전용 파일.5.4
fast_commit전체 커밋 사이의 작은 저널 레코드.5.10
orphan_file열린 채로 삭제된 파일의 관리를 빠르게 함.5.15

어디서 만나는지: 현재의 mke2fs는 metadata_csum과 64bit를 기본으로 켜고, e2fsprogs 1.47에서 orphan_file과 metadata_csum_seed가 추가되었습니다. 오래된 부트로더도 디스크를 읽을 수 있도록 이를 다시 끄는 배포판도 있습니다. Raspberry Pi OS 이미지는 64bit 없이 만들어집니다. Steam Deck은 microSD 카드를 casefold로 포맷하고, Android는 encrypt를 사용합니다.

디스크가 어떤 기능을 쓰는지는 Linux에서 sudo dumpe2fs -h /dev/sdX1로 슈퍼블록을 읽고 “Filesystem features” 줄을 보면 알 수 있습니다.

한계

블록 크기별 ext4의 한계(Linux 커널 문서)
블록 크기블록 그룹최대 파일최대 파일 시스템(32비트)최대 파일 시스템(64비트)
1 KiB8 MiB4 TiB4 TiB16 ZiB
2 KiB32 MiB8 TiB8 TiB32 ZiB
4 KiB(일반적)128 MiB16 TiB16 TiB64 ZiB
64 KiB32 GiB256 TiB256 TiB1 YiB

64비트 수치는 형식이 주소를 지정할 수 있는 범위이고, 실제 파일 시스템은 익스텐트 형식과 도구 때문에 약 1 EiB로 제한됩니다. 더 자주 문제가 되는 한계는 다음과 같습니다.

  • 파일이나 폴더 이름: 255바이트. 한 글자에 여러 바이트가 필요한 문자에서는 글자 수가 더 적습니다.
  • 한 파일에 대한 하드 링크: 65,000개. 즉 한 폴더에 하위 폴더는 최대 64,998개입니다.
  • 타임스탬프: 나노초 정밀도, 256바이트 아이노드에서는 2446년 5월까지 유효합니다. 128바이트 아이노드는 2038년 1월에 끝납니다.
  • 아이노드: 포맷할 때 정해지며, 파일이나 폴더 하나에 하나씩, 최대 약 40억 개입니다.

ext4 디스크 검사와 복구

ext 파일 시스템의 검사와 복구는 Linux의 e2fsprogs에 들어 있는 e2fsck가 맡습니다. 마운트되지 않은 디스크에서 실행해야 하며, 마운트된 파일 시스템에서 실행하면 손상될 수 있습니다.

sudo dumpe2fs -h /dev/sdX1      # 슈퍼블록: 기능, 상태, 마지막 검사
sudo e2fsck -fn /dev/sdX1        # 읽기 전용 전체 검사: 보고만 하고 아무것도 바꾸지 않음
sudo e2fsck -f /dev/sdX1         # 복구를 포함한 전체 검사: 복구마다 확인
sudo tune2fs -l /dev/sdX1        # 같은 슈퍼블록 요약
sudo mkfs.ext4 -L DATA /dev/sdX1 # 새 ext4 파일 시스템(파티션을 지움)

/dev/sdX1은 해당 파티션으로 바꾸십시오. lsblk로 목록을 볼 수 있습니다. 비정상 종료 후에도 대개 할 일은 없습니다. 다음 마운트 때 저널이 재생됩니다. 전체 검사가 필요한 경우는 Linux가 슈퍼블록에 오류를 기록했을 때, 체크섬이 맞지 않을 때, 디스크가 반복해서 멈춘 기기에 들어 있었을 때입니다.

ext4와 다른 파일 시스템

각 파일 시스템의 주 무대와 추가 소프트웨어 없이 읽을 수 있는지
파일 시스템충돌 대비주 무대macOSWindows
ext4저널Linux, Android불가불가
BtrfsCopy-on-write, 데이터에도 체크섬Linux(Fedora 기본값)불가불가
XFS저널Linux 서버불가불가
APFSCopy-on-writeMac, iPhone가능불가
NTFS저널Windows읽기 전용가능
exFAT없음USB 드라이브, SD 카드, 카메라가능가능

아무것도 설치하지 않고 Linux, Mac, Windows 사이를 오가는 드라이브라면 공통으로 쓸 수 있는 것은 exFAT입니다. 대신 Linux 권한, 소유자, 심볼릭 링크, 그리고 쓰는 도중 케이블이 빠졌을 때의 보호를 잃습니다. ext4는 이 모두를 지키지만 Mac과 Windows에서는 추가 소프트웨어가 필요합니다.

Mac이나 Windows에서 ext4 읽기

macOS는 ext 파일 시스템을 하나도 읽지 못합니다. Linux 디스크를 연결하면 macOS는 디스크를 읽을 수 없다고 알리며 초기화, 무시, 추출을 제시합니다. 초기화하면 디스크가 지워집니다. 무시나 추출을 선택하십시오.

macOS 15.4부터 Apple의 FSKit으로 파일 시스템을 커널 밖에서 일반 앱 확장 프로그램으로 실행할 수 있습니다. Apple의 최신 파일 시스템과 같은 방식이며, 커널 확장도 보안 설정 완화도 필요 없습니다. 다른 방법으로는 커널 확장, FUSE 같은 사용자 공간 계층, 디스크를 넘겨받은 Linux 가상 머신이 있습니다.

Windows 11에서는 WSL 2로 Linux 디스크를 마운트할 수 있습니다. 관리자 터미널에서 wsl --mount \\.\PHYSICALDRIVE2 --partition 1 --type ext4를 실행하면 파일이 파일 탐색기의 \\wsl$\와 배포판의 /mnt/wsl 폴더에 나타납니다. PC에 직접 연결된 디스크에서만 되며 USB 드라이브나 SD 카드 리더에서는 되지 않습니다. 이런 장치는 먼저 USB/IP로 WSL에 넘겨야 합니다.

Extent에서 FSKit 파일 시스템이 작동하는 방식: 확장 프로그램은 파일이 디스크 어디에 있는지 macOS에 알려 주고, 파일 데이터는 디스크와 macOS 사이를 곧바로 오갑니다.

Extent는 macOS 27에서 ext2, ext3, ext4를 다루는 저희의 FSKit 파일 시스템입니다. Linux 디스크가 다른 디스크처럼 Finder에 나타납니다. 읽기는 무료이며, ext4 쓰기는 Linux와 마찬가지로 디스크의 저널을 거칩니다. 종료하지 않고 Pi에서 뽑은 카드도 저널을 메모리에서 재생해 읽습니다.

자주 묻는 질문

ext4가 ext3보다 나은가요?

새 디스크라면 그렇습니다. 블록 맵 대신 익스텐트로 파일을 기록하고, 최대 16 TiB 파일과 훨씬 큰 파일 시스템을 다루며, 2038년 이후에도 나노초 타임스탬프를 유지하고, 메타데이터를 체크섬으로 보호하며, 더 길고 덜 조각난 구간으로 공간을 할당합니다. Linux는 어차피 ext3 디스크도 ext4 드라이버로 읽습니다.

Mac에서 ext4를 읽을 수 있나요?

기본적으로는 안 됩니다. macOS는 ext 파일 시스템을 하나도 읽지 못하고 Linux 디스크를 초기화, 즉 지우라고 제안합니다. 파일 시스템 확장 프로그램이 필요합니다. macOS 27에서는 Extent가 Apple의 FSKit으로 ext2, ext3, ext4를 Finder에 마운트합니다.

Windows에서 ext4를 읽을 수 있나요?

파일 탐색기만으로는 안 됩니다. Windows 11에서 WSL 2가 wsl --mount로 직접 연결된 Linux 디스크를 마운트하면, 그 파일을 파일 탐색기의 \\wsl$\에서 열 수 있습니다. USB 드라이브와 SD 카드 리더는 먼저 USB/IP로 WSL에 넘겨야 합니다.

USB 드라이브는 ext4와 exFAT 중 무엇이 좋나요?

추가 소프트웨어 없이 어떤 컴퓨터에서든 써야 한다면 exFAT입니다. 주로 Linux나 Raspberry Pi와 함께 쓰거나 권한, 심볼릭 링크, 저널이 중요하다면 ext4입니다. 저널은 쓰는 도중 드라이브를 뽑아도 파일 시스템을 일관되게 유지합니다.

ext4 디스크를 추출하지 않고 뽑으면 어떻게 되나요?

저널이 파일 시스템을 일관되게 유지합니다. 커밋까지 도달한 변경은 다음 마운트 때 재생되고, 진행 중이던 변경은 사라집니다. 그때까지 슈퍼블록은 복구가 필요하다고 표시합니다.

내 ext4 디스크가 어떤 기능을 쓰는지 어떻게 알 수 있나요?

Linux에서 sudo dumpe2fs -h /dev/sdX1이나 sudo tune2fs -l /dev/sdX1을 실행하고 “Filesystem features” 줄을 보십시오. Mac에서는 Extent가 디스크 세부 정보에 주요 기능(저널, 익스텐트, 64비트, 체크섬)을 보여 줍니다.

ext3를 ext4로 변환할 수 있나요?

네. tune2fs와 e2fsck 검사로 다시 포맷하지 않고 그 자리에서 변환할 수 있습니다. 이미 디스크에 있던 파일은 블록 맵을 유지하고, 이후에 쓴 파일만 익스텐트를 사용합니다. 먼저 백업하십시오.

ext4에서 가장 큰 파일은 얼마인가요?

일반적인 4 KiB 블록에서 16 TiB, 64 KiB 블록이면 최대 256 TiB입니다. 가장 큰 파일 시스템은 64bit 기능을 쓰면 약 1 EiB입니다.

Mac에서 Linux 디스크를 읽고 쓰기까지.

Extent는 macOS 27에서 ext2, ext3, ext4를 Finder에 마운트합니다. 읽기는 무료이고, ext4 쓰기는 1회 구입입니다.

출처

이 페이지의 사실은 다음 문서(영문)로 확인했습니다.