Post

QEMU - QCOW2 이미지

QCOW2 이미지

QCOW2(QEMU copy on write)는 가상 디스크 이미지의 저장 형식이다.
(이외에도 RAW 형식이나 여타 다른 방식도 많다)

1. 구조

QCOW2 Header
Refcount Table
Refcount Block
L1 Table
L2 Table
Data Cluster
L2 Table
Data Cluster
Data Cluster
Data Cluster
...

별도의 스냅샷이 없다면 QCOW2는 위와 같은 이미지 구조를 따른다.
위와 같은 구조는 아래와 같은 형태이다.

img.png

기본적으로 Data cluster는 가상 디스크를 일정한 사이즈로 쪼개놓은 것이다. 이러한 cluster를 찾기 위해 2차 페이징과 비슷하게 l1, l2 table을 운용하여 Data cluster를 찾는 것이다.

1) QCOW2 Header

해당 이미지에 대해 정보를 담고 있는 Header이다. 이 헤더도 다음과 같이 이루어져있다. 기본적으로 Big Endian으로 표기되어있다.

Byte index이름내용
0 ~ 3magic해당 파일이 QCOW임을 알리는 시그니처이다. QFI \xfb로 되어있다.
4 ~ 7version해당 QCOW2 이미지가 어떤 버전인지 명시한다. 2 또는 3이다.
8 ~ 15backing_file_offset

backing file의 위치이다. 0이면 backing file 이 없는 것이다.

16 ~ 19backing_file_sizebacking file의 사이즈이다. 해당 파일이 없으면 정의되지 않는다.
20 ~ 23cluster_bits클러스터 내 오프셋을 주소 지정하는 데 사용되는 비트 수이다. 최소 9 이상이어야한다. 이는 클러스터 크기의 최소치가 512bytes이기 때문이다.
24 ~ 31size

가상 디스크의 크기이다. 바이트 크기로 나타낸다

 클러스터 크기가 2MB 일경우 최대 2EB(61비트), 512 Bytes의 경우 최대 128GB(37bits) 이다.

32 ~ 35crypt_method 해당 가상 디스크의 암호화 여부로, 0이면 암호화되지 않은 것, 1이면 AES 암호화, 2이면 LUKS 암호화된 것이다.
36 ~ 39l1_sizeL1 Table의 크기로, Table 안에 몇 개의 항목이 있는지에 대한 값이다.
40 ~ 47l1_table_offsetL1 Table의 시작 위치 주소다. cluster 경계와 맞춰져 있어야한다.
48 ~ 55refcount_table_offsetrefcount Table의 시작 주소 위치이다. 클러스터 경계와 맞춰져 있어야한다.
56 ~ 59refcount_table_clustersrefcount Table이 갖고 있는 cluster의 개수이다.
60 ~ 63nb_snapshots이미지가 갖고 있는 스냅샷의 개수이다. 
64 ~ 71snapshots_offset스냅샷의 시작 주소이며 클러스터 경계와 맞춰져 있어야한다. 

2) Refcount Table

여러 refcount block의 위치를 관리하는 테이블이다.

3) Refcount Block

각 데이터 클러스터의 참조 횟수를 저장하는 블럭이다. 특정 클러스터가 몇개의 메타데이터나 스냅샷에서 참조되고 있는지 표기하는 것이다. 만약에 해당 값이 0개라면 아무곳에서도 사용되지 않는 클러스터이기 때문에 삭제 될 수 있다.

4) L1 Table

L2 Table을 찾는데 필요한 오프셋이 Table 형태로 나열되어있다.

5) L2 Table

Data Cluster를 찾는데 필요한 오프셋이 Table 형태로 나열되어있다.

6) Data Cluster

실질적인 데이터를 담고 있는 Cluster이다. Cluster는 최소 512Bytes 부터 최대 2MB까지 지정할 수 있는데 기본적으로는 64KB로 잡혀있으며 크게 잡을 수록 성능은 향상되지만 낭비되는 공간이 많다.

7) backing file

읽으려는 데이터가 cluster에 없을 경우 데이터를 갖고 오는 파일이다.
클러스터와 동일한 사이즈와 포맷을 맞출 필요는 없으며 backing file은 그 자체의 backing file을 가질 수 있다.

8) Snapshot

가상 머신의 특정 상태를 저장하려고 할 때 찍어두는것이 스냅샷 기능이다.
이는 원치 않는 작업이나 이전 상태로 돌아가고 싶을때 미리 저장해두는 것이다.

스냅샷을 활성화하면 L1 테이블을 복사한다. 이후 변경 사항은 원본과 다른 클러스터에 기재하여 원본은 유지하되 변경사항은 저장한다.

※ 본 포스팅은 추가적으로 업데이트 될 예정이다.

참고문헌

This post is licensed under CC BY 4.0 by the author.