dm-zoned device mapper target은 zoned block device(ZBD)에 대해 random write access를 제공한다. 이것은 host-managed zoned block device가 가지고 있는 sequential write constraints를 device user(the 'device user', in this context, is a file system or an application accessing a raw block device)에게서 숨겨준다. 따라서, zoned block device를 native로 지원하지 않는 application과 file system도 사용할 수 있게 한다.
host-managed zoned block device를 native로 지원하는 file system이나 application(e.g., the f2fs file system since kernel 4.10)은 dm-zoned device mapper target을 사용할 필요가 없다.
dm-zoned는 zoned block device의 sequential write required zone에서 random write access를 처리하기 위해 on-disk write buffering scheme을 구현한다. backend device의 conventional zone은 random access를 버퍼링하는 데 사용되며, 내부 metadata를 저장하는 데도 사용된다.
dm-zoned target을 지원하는 device의 모든 zone은 2가지 유형으로 나뉜다:
Metadata zones:
randomly-writable zone은 metadata를 저장하는 데 사용된다. randomly writable zone은 conventional zone 또는 sequential write preferred zones(host-aware devices only)일 수 있다. metadata zone은 user에게 사용 가능한 용량으로 보고되지 않는다. 추가적인 regular block device가 write buffering에 사용되는 경우, metadata zone은 이 cache device에 저장된다.
Data zones:
device의 나머지 모든 zone이다. 이 zone의 대부분은 sequential zone이고, user data를 저장하는 데 사용된다. conventional zone(or part of the sequential-write-preferred zones on a host-aware device)은 user random writes를 버퍼링하는 데도 사용할 수 있다. 따라서, user data는 conventional zone 또는 sequential zone에 저장될 수 있다.
위 그림을 보면, target device는 backing zone device의 zone과 동일한 크기의 chunk로 분할된다. logical chunk는 다양한 방법으로 backing device의 zone에 매핑될 수 있다.
Conventional or cache zone mapping:
이것은 그림의 chunk A가 conventional zone CA에 매핑된 경우이다. 이것은 empty(unwritten) chunk에 첫 번째 write command가 발행될 때 초기화되는 default mapping이다. chunk가 conventional zone에 매핑되는 한, any incoming write request는 mapped conventional zone을 사용해서 directly executed할 수 있다.
Sequential zone mapping:
chunk C(그림의 sequential zone SC에 매핑된)와 같이, chunk는 처음에 sequential zone에 매핑될 수 있다. with such a mapping, an already-written block of the chunk cannot be modified directly. 이 경우를 처리하기 위해, 다음 매핑 유형이 사용된다.
Dual conventional-sequential zone mapping:
sequential zone에 매핑된 already-written data of a chunk를 업데이트해야 할 때, chunk mapping에 conventional zone을 일시적으로 추가한다. any write that targets a written block은 sequential zone 대신 conventional zone을 사용해서 처리된다.
dm-zoned metadata는 backing device의 zone에 있는 validity state of blocks를 추적하기 위해 bitmap set을 포함한다. any write-operation execution은 항상 bitmap에 대한 업데이트를 진행하고, 이는 written blocks를 valid로 표시한다. dual conventional-sequential chunk mapping의 경우, sequential zone의 블록에 대한 bitmap은 conventional zone의 쓰기로 업데이트된 블록을 나타내는 비트를 지우기 위해 업데이트된다. 이렇게 함으로써, incoming reads는 block validity bitmaps를 검사하는 것만으로 항상 최신 버전의 블록 데이터에 액세스할 수 있다.
dm-zoned는 backend로 사용되는 zoned block device의 physical-sector size와 관계없이 sector size가 4096 bytes인 logical device를 노출한다. 따라서, valid block(쓰여진 블록)을 관리하는데 필요한 metadata의 양이 줄어든다. the on-disk metadata format(디스크 상의 메타데이터 형식)은 다음과 같다:
super block: randomly-writable zone의 첫 번째 블록에는 metadata block의 양과 위치(디스크 상에서의)를 설명하는 super block이 포함되어있다.
Mapping-table blocks: super block 다음에는 (1) the logical chunks of the target logical device 를 (2) data zones에 매핑하는 것을 보여주는 block set이 있다. mapping은 logical chunk number로 인덱싱되고, 각 mapping entry는 chunk data를 저장하는 data zone을 나타낸다. 또한, chunk data에 대한 random modification(수정)을 buffering하는데 사용되는 random zone의 zone 번호를 나타낼 수 있다.
bitmap-storage blocks: mapping table block 다음에는 data zone에서 블록의 유효성(validity)를 나타내는 bitmap을 저장하는데 사용되는 block set이 있다. valid block은 쓰여져 있고 삭제되지 않은 모든 블록이다. buffering된 데이터 zone에서 블록은 (1) data zone안 또는 (2) buffer zone 안에서만 valid일 수 있다.
device-mapper subsystem은 갑작스런 전력 손실 또는 시스템 충돌의 경우에 손상으로부터 내부 메타데이터를 보호하기 위해 두 세트의 metadata zone을 사용한다. 하나의 세트(the primary set)은 메인 metadata set으로 사용된다. 다른 set(the secondary set)은 로그로 사용된다. 수정된 metadata는 먼저 secondary set에 먼저 기록된다. secondary set에 기록함으로써 기록함으로써 생성된 log는 secondary set에 업데이트된 슈퍼 블록을 기록함으로써 검증된다. 이 log operation이 끝난 후, primary metadata set이 업데이트된다. 이것은 set 중 하나가 항상 정확하다는 것을 보장한다.
flush operation은 flush operation이 수신되면 metadata activity를 일시적으로 중단하고, all dirty metadata는 logged and updated한 다음 정상적인 작업을 재개하는 commit point로 사용된다. flush operation은 write request를 일시적으로 지연시키고 request를 삭제한다. read request는 metadata logging을 실행하는 동안 처리할 수 있다.
random data zone에 매핑된 logical chunk에서 모든 write operation들은 data zone에 직접 기록함으로써 처리된다. mapping zone이 seq-zone에 매핑된 경우, logical chunk내의 write offset이 seq-data zone내의 write pointer offset과 동일한 경우(즉, write operation이 zone write pointer에 정렬된 경우)에만 write operation이 직접 처리된다. 그렇지 않으면 write operation은 buffer zone을 사용해서 간접적으로 처리된다. 이미 매핑된 seq data zone에 추가하여 randomly writable free data zone이 할당되고 access 중인 chunk에 할당된다. buffer zone에 블록을 기록하면 seq data zone에서 동일한 block이 invalid된다.
read operation은 bitmap에서 제공하는 block validity information에 따라 처리된다. valid block은 data zone에서 읽거나 data zone에 할당된 buffer zone을 읽는다.
시간이 지나면, 사용 가능한 제한된 수의 random zone이 모두 소진되어, buffering 되지 않은 zone에 대한 정렬되지 않은 write가 불가능해질 수 있다. 이런 상황을 방지하기 위해 reclaim process는 사용된 random zone을 정기적으로 scan하고 buffer zone의 valid block을 free sequential zone으로 복사하는 reclaim을 시도한다. 복사가 완료되면 chunk mapping이 sequential zone을 가리키도록 업데이트되고 buffer zone이 재사용을 위해 해제된다.
dmzadm command-line utility는 dm-zoned device mapper target과 함께 사용할 backend zoned device를 format하는데 사용된다. 이 utility는 device zone model을 확인하고 device의 capacity and zone size에 따라 on-disk dm-zoned metadata를 준비하고 write한다.
dmzadm utility의 source code는 github에서 호스팅되는 [2]. dm-zoned-tools project의 일부로 사용할 수 있다. README file을 통해 자세한 설명을 볼 수 있다.
target device: 여기서 target device는 사용자가 접근하는 logical block device를 의미한다. 이 device는 실제 physical storage(backend zoned device)에 데이터를 저장하는데, dm-zoned가 이 logical device와 physical device 사이에서 데이터를 관리한다.
chunks: target device는 여러개의 chunk로 나뉜다. 이 chunk는 데이터를 저장하는 logical 단위이다. 중요한 점은 이 chunk의 크기가 backend zoned device의 zone 크기와 동일하다는 것이다.
이를 통해 chunk와 zone 간의 매핑이 효율적으로 이루어 질 수 있다.
zones of backing zoned device: backend zoned device로 data를 저장하는 실제 physical device이다. 여러 개의 zone으로 나뉘고 각 zone은 특정한 write constraints를 가진다.
mapping: logical chunk를 physical zone에 연결하는 과정을 의미한다. 각 logical chunk는 backend device의 하나 이상의 zone에 매핑될 수 있다. 이 매핑은 여러 가지 방식으로 이루어질 수 있고, dm-zoned가 data를 저장하는 방식에 따라 달라진다.
bitmap: 특정 블록이 valid한지, 또는 최신 데이터인지 여부를 나타내는 bitmap이다. 비트맵의 각 비트는 특정 블록의 상태를 나타낸다.
[1]. https://zonedstorage.io/docs/linux/dm
[2]. https://github.com/westerndigitalcorporation/dm-zoned-tools