부록 A. 장치 매퍼 (Device Mapper)

장치 매퍼 (Device Mapper)는 볼륨 관리를 위한 프레임워크를 제공하는 커널 드라이버로 논리 볼륨으로 사용될 맵화된 장치 생성에 대한 일반적인 방법을 제공합니다. 이는 볼륨 그룹이나 메타 데이터 포맷에 대해 명확하게 알고 있지 못합니다.
장치 매퍼는 보다 높은 수준의 테크놀로지 기반을 제공합니다. LVM에 더하여, 장치-매퍼 멀티 패스 및 dmraid 명령은 장치 매퍼를 사용합니다. 장치 매퍼로의 애플리케이션 인터페이스는 ioctl 시스템 호출입니다. 사용자 인터페이스는 dmsetup 명령입니다.
LVM 논리 볼륨은 장치 매퍼(Device Mapper)를 사용하여 활성화됩니다. 각각의 논리 볼륨은 맵핑된 장치로 전환되고, 각각의 세그먼트는 장치를 설명하는 맵핑 테이블에 있는 행으로 전환됩니다. 장치 매퍼는 선형 (linear) 맵핑, 스트라이프 (striped) 맵핑, 에러 (error) 맵핑을 포함하여 다양한 맵핑 대상을 지원합니다. 예를들어, 두 개의 디스크는 선형 맵핑과 병행하여 각각의 디스크에 하나씩 하나의 논리 볼륨으로 연결될 수 있습니다. LVM2가 볼륨을 생성할 때, 이는 dmsetup 명령으로 쿼리 가능한 기본 장치 맵퍼를 생성합니다. 맵핑 테이블에서 장치 포맷에 관한 내용은 A.1절. “장치 테이블 맵핑 ”에서 참조하십시오. 장치를 쿼리하기 위해 dmsetup 명령을 사용하는 방법에 관한 내용은 A.2절. “dmsetup 명령 ”에서 참조하십시오.

A.1. 장치 테이블 맵핑

맵핑된 장치는 지원되는 장치 테이블 매핑을 사용하여 장치의 논리 섹터의 각 영역을 맵핑하는 방법을 지정하는 테이블에 의해 정의됩니다. 맵핑된 장치의 테이블은 다음과 같은 형식의 행 목록에서 구성됩니다:
start length mapping [mapping_parameters...]
장치 매퍼 테이블의 첫 번째 행에서, start 매개 변수는 0과 동일해야 합니다. 하나의 행에 있는 start + length 매개 변수는 다음 행의 start와 동일해야 합니다. 어떤 맵핑 매개변수가 맵핑 테이블의 행에 지정되어야 하는 가는 어떤 mapping 유형이 해당 행에 지정되는 가에 따라 결정됩니다.
장치 매퍼 크기는 항상 섹터에서 지정됩니다 (512 바이트).
장치 맵퍼에서 맵핑 매개변수로 장치가 지정될 경우, 이는 파일 시스템 (예: /dev/hda)에서 장치 이름에 의해서나 또는 major:minor 형식의 major 및 minor 번호에 의해 참조될 수 있습니다. major:minor 형식은 경로명 검색을 피할 수 있기 때문에 선호됩니다.
장치의 매핑 테이블 예제는 다음과 같습니다. 이 테이블에는 4 개의 선형 대상이있습니다:
0 35258368 linear 8:48 65920
35258368 35258368 linear 8:32 65920
70516736 17694720 linear 8:16 17694976
88211456 17694720 linear 8:16 256
각 행의 첫 번째 2 개의 매개 변수는 세그먼트 시작점 블록 및 세그먼트의 길이입니다. 다음 키워드는 맵팽 대상으로, 예에서 모든 경우 linear가 됩니다. 나머지 행은 linear 대상에 대한 매개 변수로 구성됩니다.
다음의 하부 섹션에서는 맵핑 형식을 설명합니다:
  • linear
  • striped
  • mirror
  • snapshot 및 snapshot-origin
  • error
  • zero
  • multipath
  • crypt

A.1.1. 선형 맵핑 대상

선형 맵핑 대상은 다른 블록 장치에 연속적인 범위의 블록을 맵핑합니다. 선형 대상 형식은 다음과 같습니다:
start length linear device offset
start
가상 장치에서 시작점 블록
length
세그먼트 길이
device
블록 장치, 파일 시스템에서 장치 이름에 의해 또는 major:minor 형식에서 major 및 minor 번호에 의해 참조됩니다
offset
장치에서 맵핑의 시작점 오프셋
다음 예제에서는 가상 장치의 시작점 블록이 0, 세그먼트 길이가 1638400, major:minor 번호 쌍이 8:2, 장치의 시작점 오프셋이 41146992인 선형 대상을 보여주고 있습니다.
0 16384000 linear 8:2 41156992
다음의 예에서는 /dev/hda로 지정된 장치 매개 변수와 함께 선형 대상을 보여주고 있습니다.
0 20971520 linear /dev/hda 384

A.1.2. 스트라이프 맵핑 대상

스트라이프 맵핑 대상은 물리적 장치 전역에서 스트라이프를 지원합니다. 이는 스트라이프 수, 스트라이핑 chunk size, 장치 이름 및 섹터 쌍의 목록을 인수로 사용합니다. 스트라이프 대상 형식은 다음과 같습니다:
start length striped #stripes chunk_size device1 offset1 ... deviceN offsetN
각각의 스트라이프에 대해 deviceoffset 매개 변수 모음 하나가 있습니다.
start
가상 장치에서 시작점 블록
length
세그먼트 길이
#stripes
가상 장치 용 스트라이프 수
chunk_size
다음으로 전환하기 전 까지 각각의 스트라이프에 작성된 섹터 수량; 컨널 페이지 크기 만큼 큰 것으로 최소 2 개의 전력이 되어야 합니다
device
블록 장치, 파일 시스템에서 장치 이름에 의해서나 또는 major:minor 형식에서 major 및 minor 번호에 의해 참조됩니다.
offset
장치에서 맵핑의 시작점 오프셋
다음의 예에서는 세 개의 스트라이프 및 128 chunk size를 갖는 스트라이프 대상을 보여주고 있습니다:
0 73728 striped 3 128 8:9 384 8:8 384 8:7 9789824
0
가상 장치에서 시작점 블록
73728
세그먼트 길이
striped 3 128
128 블록의 chunk size를 갖는 세 개의 장치를 통해 스트라이프
8:9
첫 번째 장치의 major:minor 번호
384
첫 번째 장치에서 맵핑의 시작점 오프셋
8:8
두 번째 장치의 major:minor 번호
384
두 번째 장치에서 맵핑의 시작점 오프셋
8:7
세 번째 장치의 major:minor 번호
9789824
세 번째 장치에서 맵핑의 시작점 오프셋
다음의 예제에서는 256 KiB chunk와 함께 major 및 minor 번호 대신 파일 시스템에 있는 장치 이름에 의해 지정된 장치 매개 변수를 갖는 2 개의 스트라이프에 대한 스트라이프 대상을 보여주고 있습니다.
0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0

A.1.3. 미러 맵핑 대상

미러 맵핑 대상은 미러 논리 장치의 맵핑을 지원합니다. 미러 대상의 형식은 다음과 같습니다:
start length mirror log_type #logargs logarg1 ... logargN #devs device1 offset1 ... deviceN offsetN
start
가상 장치에서 시작점 블록
length
세그먼트 길이
log_type
가능한 로그 유형 및 인수는 다음과 같습니다:
core
미러는 로컬로 되고 미러 로그는 코어 메모리에 저장됩니다. 이러한 로그 유형은 1 - 3 인수를 갖습니다:
regionsize [[no]sync] [block_on_error]
disk
미러는 로컬로 되고 미러 로그는 디스크에 저장됩니다. 이러한 로그 유형은 2 - 4 인수를 갖습니다:
logdevice regionsize [[no]sync] [block_on_error]
clustered_core
미러는 클러스터되고 미러 로그는 코어 메모리에 저장됩니다. 이러한 로그 유형은 2 - 4 인수를 갖습니다:
regionsize UUID [[no]sync] [block_on_error]
clustered_disk
미러는 클러스터되고 미러 로그는 디스크에 저장됩니다. 이러한 로그 유형은 3 - 5 인수를 갖습니다:
logdevice regionsize UUID [[no]sync] [block_on_error]
LVM은 어떤 영역이 미러와 동기화하는 지를 기록하기 위해 사용하는 로그를 유지합니다. regionsize 인수는 이러한 영역의 크기를 지정합니다.
클러스터된 환경에서, UUID 인수는 미러 로그 장치와 관련된 고유한 식별자이므로 로그 상태는 클러스터 전역에서 유지될 수 있습니다.
[no]sync 인수 옵션은 "in-sync" 또는 "out-of-sync"로 미러를 지정하기 위해 사용될 수 있습니다. block_on_error 인수는 미러에 대해 오류를 무시하는 것이 아니라 오류를 처리하도록 지시하는데 사용됩니다.
#log_args
맵핑에서 지정될 로그 인수의 수
logargs
미러에 대한 로그 인수; 제공되는 로그 인수 수량은 #log-args 매개 변수에 의해 지정되고 유효한 로그 인수는 log_type 매개 변수에 의해 결정됩니다.
#devs
미러에서 leg 수; 각 leg에 대해 장치 및 오프셋이 지정됩니다.
device
각 미러 leg에 대한 블록 장치, 파일 시스템에 있는 장치 이름으로 참조 또는 major:minor 형식에 있는 major 및 minor 번호에 의해 참조. 블록 장치 및 오프셋은 각각의 미러 leg에 대해 지정되며, #devs 매개 변수에 의해 표시됩니다.
offset
장치에서 맵핑의 시작점 오프셋. 블록 장치 및 오프셋은 #devs 매개 변수에 의해 나타나는 각 미러 leg에 대해 지정됩니다.
다음의 예제에서는 디스트레 저장된 미러 로그와 함께 클러스터된 미러에 대한 미러 맵핑 대상을 보여주고 있습니다.
0 52428800 mirror clustered_disk 4 253:2 1024 UUID block_on_error 3 253:3 0 253:4 0 253:5 0
0
가상 장치에서 시작점 블록
52428800
세그먼트 길이
mirror clustered_disk
미러가 클러스터되어 있고 미러 로그가 디스크 상에서 유지되고 있음을 지정하는 로그 유형을 갖는 미러 대상 \t
4
4 개의 미러 로그 인수가 계속됩니다
253:2
로그 장치의 major:minor 번호
1024
동기화하고 있는 기록을 보관하기 위해 미러 로그가 사용하는 영역 크기
UUID
클러스터를 통해 로그 정보를 관리하기 위한 미러 로그 장치의 UUID
block_on_error
미러는 오류에 대응해야 합니다
3
미러에서 leg 수
253:3 0 253:4 0 253:5 0
미러의 각 leg를 구성하는 장치에 대한 major:minor 번호 및 오프셋

A.1.4. snapshot 및 snapshot-origin 맵핑 대상

볼륨의 첫 번째 LVM 스냅샷을 생성할 때, 네 개의 장치 맵퍼가 사용됩니다:
  1. 소스 볼륨의 기존 맵핑 테이블이 들어 있는 linear 맵핑을 갖는 장치
  2. 소스 볼륨에 대해 COW (copy-on-write) 장치로 사용되는 linear 맵핑을 갖는 장치; 각각의 쓰기 작업에 대해, 기존 데이터는 각 스냅샷의 COW 장치에 저장되어 가시적 컨텐츠가 변경되지 않게 보관됩니다 (COW 장치가 채워질 때 까지).
  3. 가시적 스냅샷 볼륨인 #1과 #2를 결합한 snapshot 맵핑을 갖는 장치
  4. "기존" 볼륨 (이는 기존 소스 볼륨에 의해 사용되는 장치 번호를 사용합니다). 이러한 볼륨의 테이블은 장치 #1에서 "snapshot-origin" 맵핑하여 교체됩니다.
이러한 장치를 생성하기 위해 고정된 이름 지정 체계를 사용합니다. 예를 들어, 다음과 같은 명령을 사용하여 base라는 LVM 볼륨을 생성하고 해당 볼륨에 snap 라는 스냅샷 볼륨을 생성할 수 있습니다.
# lvcreate -L 1G -n base volumeGroup
# lvcreate -L 100M --snapshot -n snap volumeGroup/base
이는 4 개의 장치를 만들어 내며, 이는 다음의 명령으로 볼 수 있습니다:
# dmsetup table|grep volumeGroup
volumeGroup-base-real: 0 2097152 linear 8:19 384
volumeGroup-snap-cow: 0 204800 linear 8:19 2097536
volumeGroup-snap: 0 2097152 snapshot 254:11 254:12 P 16
volumeGroup-base: 0 2097152 snapshot-origin 254:11

# ls -lL /dev/mapper/volumeGroup-*
brw-------  1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
brw-------  1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow
brw-------  1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap
brw-------  1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base
snapshot-origin 대상의 형식은 다음과 같습니다:
start length snapshot-origin origin
start
가상 장치에서 시작점 블록
length
세그먼트 길이
origin
스냅샷의 기본 볼륨
일반적으로 snapshot-origin은 이를 기반으로 하는 하나 이상의 스냅샷을 가지고 있습니다. 읽기 작업은 백업 장치에 직접 맵핑됩니다. 각각의 쓰기 작업의 경우 기존 데이터는 각각의 스냅샷의 COW 장치에 저장되어 COW 장치가 채워질 때 까지 가시적 컨텐츠가 변경되지 않게 보관됩니다.
snapshot 대상의 형식은 다음과 같습니다.
start length snapshot origin COW-device P|N chunksize
start
가상 장치에서 시작점 블록
length
세그먼트 길이
origin
스냅샷의 기본 볼륨
COW-device
변경된 데이터 청크가 저장된 장치
P|N
P (Persistent) 또는 N (Not persistent); 재부팅 후 스냅샷이 유지되고 있는지에 대한 여부를 나타냅니다. 임시 스냅샷 (N)의 경우 많은 데이터를 디스크에 저장할 수 없으며, 커널에 의해 메모리에 저장할 수 있습니다.
chunksize
COW 장치에 저장될 변경된 데이터 청크의 섹터 크기
다음의 예제에서는 254:11 원본 장치를 갖는 snapshot-origin 대상을 보여주고 있습니다.
0 2097152 snapshot-origin 254:11
다음 예제에서는 254:11 원본 장치와 254:12 COW 장치를 갖는 snapshot 대상을 보여주고 있습니다. 이러한 스냅샷 장치는 재부팅 후에도 지속되며 COW 장치에 저장된 데이터의 청크 크기는 16 섹터입니다.
0 2097152 snapshot 254:11 254:12 P 16

A.1.5. 오류 맵핑 대상

오류 맵핑 대상과 함께 맵핑된 섹터로의 I/O 작업은 모두 실패합니다.
오류 맵핑 대상은 테스트 용으로 사용할 수 있습니다. 장애시 장치가 어떻게 작동하는지를 테스트하려면, 장치 중간에 잘못된 색터로 맵핑된 장치를 생성하거나 또는 미러의 leg를 옮겨 비우기하여 leg를 오류 대상으로 교체합니다.
오류 대상은 장애가 있는 장치의 위치에서, 시간 제한을 피하는 방법으로 실제 장치에서 다시 시작하는데 사용될 수 있습니다. 이는 장애 발생 시 LVM 메타데이터를 재구성하는 동안 중간 대상으로서 역할을 수행합니다.
error 맵핑 대상은 startlength 이외에 추가 매개 변수를 갖지 않습니다.
다음의 예제에서는 error 대상을 보여주고 있습니다.
0 65536 error

A.1.6. zero 맵핑 대상

zero 맵핑 대상은 /dev/zero와 동등한 블록 장치입니다. 이러한 맵핑으로의 읽기 작업을 영 블록을 반환합니다. 맵핑에 작성된 데이터는 삭제되지만 쓰기 작업은 성공합니다. zero 맵핑 대상은 startlength 매개 변수 이외에 추가 매개 변수를 갖지 않습니다.
다음의 예제에서는 16Tb 장치 용 zero 대상을 보여주고 있습니다.
0 65536 zero

A.1.7. 멀티패스 맵핑 대상

멀티패스 맵핑 대상은 멀티패스된 장치의 맵핑을 지원합니다. multipath 대상의 형식은 다음과 같습니다:
start length  multipath  #features [feature1 ... featureN] #handlerargs [handlerarg1 ... handlerargN] #pathgroups pathgroup pathgroupargs1 ... pathgroupargsN
각 경로 그룹에 대한 pathgroupargs 매개 변수 모음이 하나 있습니다.
start
가상 장치에서 시작점 블록
length
세그먼트 길이
#features
멀티패스 기능의 수로 이러한 기능은 다음에 표시됩니다. 이러한 매개 변수가 영이되면, feature 매개 변수가 없게 되고 다음의 장치 맵핑 매개 변수는 #handlerargs가 됩니다. 현재 지원되는 멀티패스 기능은 queue_if_no_path 하나 입니다. 이는 사용 가능한 경로가 없을 경우 현재 멀티패스된 장치는 I/O 작업을 대기열로 하도록 설정됨을 의미합니다.
예를 들어, multipath.conf 파일의 no_path_retry 옵션이 지정된 일련의 시도 횟수가 경로를 사용한 후 전체 경로가 실패로 표시될 때 까지 I/O 작업을 대기열로 하도록 설정되어 있을 경우, 맵핑은 전체 경로 검사기가 지정된 검사를 실패할 때 까지 다음과 같이 나타나게 됩니다.
0 71014400 multipath 1 queue_if_no_path 0 2 1 round-robin 0 2 1 66:128 \
1000 65:64 1000 round-robin 0 2 1 8:0 1000 67:192 1000
전체 경로 검사기가 지정된 검사를 실패한 후, 맵핑은 다음과 같이 나타나게 됩니다.
0 71014400 multipath 0 0 2 1 round-robin 0 2 1 66:128 1000 65:64 1000 \
round-robin 0 2 1 8:0 1000 67:192 1000
#handlerargs
하드웨어 처리기 인수 수량으로 이러한 인수가 그 다음에 표시됩니다. 하드웨어 처리기는 경로 그룹을 전환하거나 또는 I/O 오류를 처리할 때 하드웨어 특정 작업을 실행하기 위해 사용되는 모듈을 지정합니다. 이것이 0으로 설정되어 있을 경우, 다음 매개 변수는 #pathgroups이 됩니다.
#pathgroups
경로 그룹의 수량. 경로 그룹은 멀티패스된 장치가 로드 밸런스를 수행하는 경로 모음입니다. 각각의 경로 그룹에 대해 pathgroupargs 매개 변수 모음이 하나 있습니다.
pathgroup
시도할 다음 경로 그룹
pathgroupsargs
각 경로 그룹은 다음과 같은 인수로 구성되어 있습니다:
pathselector #selectorargs #paths #pathargs device1 ioreqs1 ... deviceN ioreqsN 
경로 그룹에는 각 경로에 대한 경로 인수 모음 하나가 있습니다.
pathselector
경로 그룹에서 어떤 경로를 다음 I/O 작업에 사용할 지를 결정하기 위해 사용되고 있는 알고리즘을 지정합니다.
#selectorargs
멀티패스 맵핑에서 이러한 인수를 따르는 경로 선택기 인수의 수량. 현재 이러한 인수 값은 항상 0입니다.
#paths
경로 그룹에 있는 경로 수량
#pathargs
이 그룹의 각 경로에 지정된 경로 인수의 수량. 현재 이러한 숫자는 항상 ioreqs 인수인 1로 되어 있습니다.
device
경로의 블록 장치 번호, major:minor 형식으로 major와 minor 번호에 의해 참조됩니다
ioreqs
현재 그룹의 다음 경로로 전환하기 전 이러한 경로로 라우팅하기 위한 I/O 요청 수.
그림 A.1. “멀티패스 맵핑 대상 ”에서는 두 개의 경로 그룹이 있는 멀티패스 대상 형식을 보여주고 있습니다.
멀티패스 맵핑 대상

그림 A.1. 멀티패스 맵핑 대상

다음 예제에서는 동일한 멀티패스 장치에 대한 순수한 장애 조치 대상의 정의를 보여주고 있습니다. 이러한 대상에는 경로 그룹 당 경로 하나만 열려있는 4 개의 경로 그룹이 있어 멀티패스된 장치는 한 번에 하나의 경로만을 사용하게 됩니다.
0 71014400 multipath 0 0 4 1 round-robin 0 1 1 66:112 1000 \
round-robin 0 1 1 67:176 1000 round-robin 0 1 1 68:240 1000 \
round-robin 0 1 1 65:48 1000
다음의 예제에서는 동일한 멀티패스 장치에 대해 완전하게 확산된 (multibus) 대상을 보여주고 있습니다. 이러한 대상에는 모든 경로를 포함하는 하나의 경로 그룹만 있습니다. 이러한 설정에서 멀티패스는 경로 전체에 부하를 균등하게 확산합니다.
0 71014400 multipath 0 0 1 1 round-robin 0 4 1 66:112 1000 \
 67:176 1000 68:240 1000 65:48 1000
멀티패싱에 관한 보다 자세한 내용은 Device Mapper Multipath 사용 문서를 참조하십시오.

A.1.8. crypt 맵핑 대상

crypt 대상은 지정된 장치를 통해 전송된 데이터를 암호화합니다. 이는 커널 Crypto API를 사용합니다.
crypt 대상의 형식은 다음과 같습니다:
start length crypt cipher key IV-offset device offset
start
가상 장치에서 시작점 블록
length
세그먼트 길이
cipher
Cipher는 cipher[-chainmode]-ivmode[:iv options]로 구성되어 있습니다.
cipher
사용 가능한 Ciphers는 /proc/crypto에 나열되어 있습니다 (예: aes)
chainmode
항상 cbc를 사용합니다. ebc는 사용하지 않습니다; 이는 초기 백터 (IV)를 사용하지 않습니다.
ivmode[:iv options]
IV는 초기 벡터 (initial vector)로 암호를 변경하는 데 사용됩니다. IV 모드는 plain 또는 essiv:hash입니다. -plainivmode는 IV로서 섹터 번호 (및 IV 오프셋)를 사용합니다. -essivivmode는 워터마크의 약점을 피하기 위해 강화되었습니다.
key
암호화 키, 16 진법으로 공급
IV-offset
초기 백터 (IV) 오프셋
device
블록 장치, 파일 시스템에서 장치 이름에 의해 또는 major:minor 형식에서 major 및 minor 번호에 의해 참조됩니다
offset
장치에서 맵핑의 시작점 오프셋
다음은 crypt 대상의 예제입니다.
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0