컨테이너와 볼륨
APFS는 여러 APFS 볼륨을 포함할 수 있는 단일 컨테이너로 구성되어 있다. 컨테이너는 데이터 저장을 위한 기본 개체이다. 하나 이상의 볼륨을 포함하려면 512mb보다 커야하고 두개 이상의 볼륨을 포함할려면 최소 1024mb보다 크기가 커야한다.
—APFS의 구조
- Block Header
- Container Superblock
- Node
- Space manager
- Allocation Info File
- Unknown
- B-Tree
- Checkpoint
- Volume Superblock
— Block header
각각의 APFS 파일시스템은 block header로 부터 시작된다. 블록헤더에는 checksum, block_id, version, block_type, flags 등이 저장되어 있다.
— Container Superblock
Container Superblock은 파일 시스템의 진입점이다. 여기에는 블록의 크기, 블록의 수, 작업을 위한 space manager의 포인터가 들어 있다. 여기안에 모든 볼륨에 대한 볼륨 ID들이 저장되어 있어서 블록 ID를 블록 offset에 매핑하기 위한 block map B-tree에 대한 포인터가 저장되어 있다. 이 B-tree에는 블록의 ID, offset과 함께 각 볼륨에 대한 항목이 포함되어 있다.
—Volume Super Block
Volume Super Block은 파일시스템의 각 볼륨에 대해 존재한다. 여기에는 볼륨이름, ID, 타임스탬프가 포함이 되어있다. Container Superblock과 유사하게 블록 맵에 대한 포인터와 노드로 저장되는 루트 디렉토리에 대한 포인터가 저장되어있다.
—CheckPoint
CheckPoint는 컨테이너의 기록 상태를 저장한다. 각 체크포인트는 CS(Container Superblock)으로 초기화되고 현재 상태는 일반적으로 CS 컬랙션의 마지막 요소이다. 체크포인트에는 컨테이너와 볼륨의 메타데이터가 모두 포함되어 있다. snapshot과 유사한 기능을 하고있다.
Checkpoint Superblock Descriptor
이 블록은 APFS의 메타 데이터 구조에 대한 정보를 포함하며 Main superblock과 Checkpoint Superblock사이에 위치해 있다. 가장 중요한 정보는 HFS+의 이전 파일인 Bitmap Structure의 위치이다.
—Space manager
Space manager은 APFS 컨테이너에서 할당된 블록을 관리하는데 사용된다. 사용가능한 블록 수와 할당 정보 파일에 대한 포인터를 저장하는 역할을 한다.
— Allocation Info File
Allocation Info File은 Allocation File의 누락된 헤더로써 작동한다. 여기에는 Allocation file의 길이와 버전, offset에 관련된 정보가 저장되어 있다.
— Bitmap Structure
ApFS에서 컨테이너의 모든 볼륨은 Bitmap 구조체를 사용하고 있다. HFS+에서는 할당파일을 통해 저장하였지만 ApFS에서는 블록 모음들을 이용하여 Bitmap 구조체를 저장한다.
Bitmap 구조체는 구조체의 최상단 레벨에 있는 BMD(Bitmap Descriptor)에 대한 정보가 있는 CSBD(Checkpoint Superblock Descriptor)에서 참조가 된다. BMD에서 Bitmap 구조체의 레벨은 BMD에서 정보를 가져와 반영을 하고 최하단에는 컨테이너의 블록을 추적하는 BMB(Bitmap Block)이 있다. BMB의 1바이트는 각 비트가 할당되어 있는 상태를 제공하는 8개의 블록을 추적한다. 각 비트는 단일 블록이다.
—File and folder B-Tree
볼륨안에 있는 모든 파일들과 폴더들을 기록한다. 이것은 HFS+의 catalog file과 비슷한 역할을 수행한다.
—Extends B-Tree
스냅샷을 위한 별도의 B-Tree로 데이터 컨텐츠가 시작되는 위치와 블록의 길이의 정보가 있는 파일컨텐츠의 참조가 있는 트리이다. 각 파일의 레코드 범위는 File and foler B-Tree의 파일별로 정의된다.
—Node
노드는 다양한 종류의 항목을 저장하는데 사용하는 유연한 컨테이너이다. 노드는 가변적이거나 고정된 크기의 항목을 저장할 수 있다. 이것은 B-Tree의 일부가 될 수도 있고 독자적으로도 사용가능하다. 노드는 컨텐츠의 키나 레코드에 대한 포인터로 시작한다. node의 헤더부분에 컨텐츠의 헤더가 있고 중간에는 컨텐츠의 키, 끝부분에
Uploaded by Notion2Tistory v1.1.0