요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
Table 구성 예제
linear.rst:16-63Identity mapping, 두 장치 연결, 고정 크기 chunk 역순 배치를 shell과 Perl로 구현합니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
=========
dm-linear
=========
Device-Mapper's "linear" target maps a linear range of the Device-Mapper
device onto a linear range of another device. This is the basic building
block of logical volume managers.
Parameters: <dev path> <offset>
<dev path>:
Full pathname to the underlying block-device, or a
"major:minor" device-number.
<offset>:
Starting sector within the device.
Example scripts
===============
::
#!/bin/sh
# Create an identity mapping for a device
echo "0 `blockdev --getsz $1` linear $1 0" | dmsetup create identity
::
#!/bin/sh
# Join 2 devices together
size1=`blockdev --getsz $1`
size2=`blockdev --getsz $2`
echo "0 $size1 linear $1 0
$size1 $size2 linear $2 0" | dmsetup create joined
::
#!/usr/bin/perl -w
# Split a device into 4M chunks and then join them together in reverse order.
my $name = "reverse";
my $extent_size = 4 * 1024 * 2;
my $dev = $ARGV[0];
my $table = "";
my $count = 0;
if (!defined($dev)) {
die("Please specify a device.\n");
}
my $dev_size = `blockdev --getsz $dev`;
my $extents = int($dev_size / $extent_size) -
(($dev_size % $extent_size) ? 1 : 0);
while ($extents > 0) {
my $this_start = $count * $extent_size;
$extents--;
$count++;
my $this_offset = $extents * $extent_size;
$table .= "$this_start $extent_size linear $dev $this_offset\n";
}
`echo \"$table\" | dmsetup create $name`;
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
연속 논리 범위를 다른 장치의 연속 범위로 mapping
1-7Device Mapper의 `linear` target은 Device Mapper 장치의 연속 범위를 다른 장치의 연속 범위에 mapping합니다. 이 단순한 변환은 logical volume manager를 구성하는 기본 building block입니다.
논리 범위의 순서와 길이를 유지한 채 underlying block device의 지정 offset으로 이동합니다.
Underlying device와 시작 offset
8-15Target parameter 형식은 `<dev path> <offset>`입니다. `<dev path>`에는 underlying block device의 전체 pathname 또는 `major:minor` device number를 지정하고, `<offset>`에는 해당 장치 안에서 mapping을 시작할 sector를 지정합니다.
Parameters: <dev path> <offset>
<dev path>:
Full pathname to the underlying block-device, or a
"major:minor" device-number.
<offset>:
Starting sector within the device.
두 parameter가 논리 sector를 실제 장치 위치로 변환하는 기준을 정합니다.
장치 전체의 identity mapping
16-25첫 shell script는 `blockdev --getsz $1`로 첫 번째 인자의 전체 sector 수를 구합니다. 논리 시작 sector 0, 같은 길이, underlying offset 0을 사용해 원본 장치와 위치가 같은 `identity` Device Mapper 장치를 만듭니다.
::
#!/bin/sh
# Create an identity mapping for a device
echo "0 `blockdev --getsz $1` linear $1 0" | dmsetup create identity
논리 sector와 underlying sector가 같은 번호로 일대일 대응합니다.
두 장치를 하나의 연속 공간으로 연결
26-34두 번째 shell script는 두 장치의 sector 수를 각각 `size1`, `size2`로 읽습니다. 첫 table row는 논리 sector 0부터 첫 장치를 배치하고, 두 번째 row는 논리 sector `size1`부터 두 번째 장치를 배치해 `joined` 장치를 만듭니다. 두 underlying mapping 모두 장치 offset 0에서 시작합니다.
::
#!/bin/sh
# Join 2 devices together
size1=`blockdev --getsz $1`
size2=`blockdev --getsz $2`
echo "0 $size1 linear $1 0
$size1 $size2 linear $2 0" | dmsetup create joined
논리 주소 공간에서는 두 번째 장치가 첫 번째 장치의 마지막 sector 바로 다음에 이어집니다.
4M chunk를 역순으로 다시 연결
35-63Perl 예제는 장치를 4M chunk로 나누고 그 chunk들을 역순으로 연결한 `reverse` 장치를 만듭니다. `extent_size`는 `4 * 1024 * 2` sector이며, `blockdev --getsz`가 반환한 장치 크기로 처리할 extent 수를 계산합니다.
Loop에서 `this_start`는 새 논리 table의 앞쪽부터 증가하고, `this_offset`은 원본 장치의 뒤쪽부터 감소합니다. 각 반복이 `linear` row를 `$table`에 추가하고, 마지막에는 완성된 table을 `dmsetup create $name`에 전달합니다.
::
#!/usr/bin/perl -w
# Split a device into 4M chunks and then join them together in reverse order.
my $name = "reverse";
my $extent_size = 4 * 1024 * 2;
my $dev = $ARGV[0];
my $table = "";
my $count = 0;
if (!defined($dev)) {
die("Please specify a device.\n");
}
my $dev_size = `blockdev --getsz $dev`;
my $extents = int($dev_size / $extent_size) -
(($dev_size % $extent_size) ? 1 : 0);
while ($extents > 0) {
my $this_start = $count * $extent_size;
$extents--;
$count++;
my $this_offset = $extents * $extent_size;
$table .= "$this_start $extent_size linear $dev $this_offset\n";
}
`echo \"$table\" | dmsetup create $name`;
원본 장치의 뒤쪽 extent부터 새 논리 장치의 앞쪽에 차례로 mapping합니다.
Linear mapping 모델
linear.rst:1-15Device path와 시작 sector offset으로 연속적인 논리 대 실제 sector 관계를 정의합니다.