← Documents Documentation/admin-guide/device-mapper/linear.rst GitHub 원문 ↗

Linux 6.18.37 · Administration / Device Mapper

dm-linear

논리 sector 범위를 underlying block device의 연속 범위에 배치하는 linear target의 parameter와 세 가지 mapping 예제를 설명합니다.

Source pathDocumentation/admin-guide/device-mapper/linear.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

Linear mapping 모델

linear.rst:1-15

Device path와 시작 sector offset으로 연속적인 논리 대 실제 sector 관계를 정의합니다.

Table 구성 예제

linear.rst:16-63

Identity mapping, 두 장치 연결, 고정 크기 chunk 역순 배치를 shell과 Perl로 구현합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 =========
2 dm-linear
3 =========
4
5 Device-Mapper's "linear" target maps a linear range of the Device-Mapper
6 device onto a linear range of another device. This is the basic building
7 block of logical volume managers.
8
9 Parameters: <dev path> <offset>
10 <dev path>:
11 Full pathname to the underlying block-device, or a
12 "major:minor" device-number.
13 <offset>:
14 Starting sector within the device.
15
16
17 Example scripts
18 ===============
19
20 ::
21
22 #!/bin/sh
23 # Create an identity mapping for a device
24 echo "0 `blockdev --getsz $1` linear $1 0" | dmsetup create identity
25
26 ::
27
28 #!/bin/sh
29 # Join 2 devices together
30 size1=`blockdev --getsz $1`
31 size2=`blockdev --getsz $2`
32 echo "0 $size1 linear $1 0
33 $size1 $size2 linear $2 0" | dmsetup create joined
34
35 ::
36
37 #!/usr/bin/perl -w
38 # Split a device into 4M chunks and then join them together in reverse order.
39
40 my $name = "reverse";
41 my $extent_size = 4 * 1024 * 2;
42 my $dev = $ARGV[0];
43 my $table = "";
44 my $count = 0;
45
46 if (!defined($dev)) {
47 die("Please specify a device.\n");
48 }
49
50 my $dev_size = `blockdev --getsz $dev`;
51 my $extents = int($dev_size / $extent_size) -
52 (($dev_size % $extent_size) ? 1 : 0);
53
54 while ($extents > 0) {
55 my $this_start = $count * $extent_size;
56 $extents--;
57 $count++;
58 my $this_offset = $extents * $extent_size;
59
60 $table .= "$this_start $extent_size linear $dev $this_offset\n";
61 }
62
63 `echo \"$table\" | dmsetup create $name`;
64

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

연속 논리 범위를 다른 장치의 연속 범위로 mapping

1-7

Device Mapper의 `linear` target은 Device Mapper 장치의 연속 범위를 다른 장치의 연속 범위에 mapping합니다. 이 단순한 변환은 logical volume manager를 구성하는 기본 building block입니다.

Linear target mapping
Device Mapper 논리 sector 범위`linear` targetUnderlying device의 연속 sector 범위

논리 범위의 순서와 길이를 유지한 채 underlying block device의 지정 offset으로 이동합니다.

Underlying device와 시작 offset

8-15

Target 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.
dm-linear parameter
Parameter허용 값역할
`<dev path>`전체 block-device pathname 또는 `major:minor`Underlying device 선택
`<offset>`시작 sector논리 sector 0이 대응할 장치 sector
Mapping 식Target 내부의 논리 sector L은 underlying device의 sector `<offset> + L`에 대응합니다.

두 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
Identity mapping
`identity` sector 0..size-1`linear $1 0``$1` sector 0..size-1

논리 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
두 장치 연결
`joined`: 0 .. size1-1`linear $1 0`첫 장치 `$1`
`joined`: size1 .. size1+size2-1`linear $2 0`두 번째 장치 `$2`

논리 주소 공간에서는 두 번째 장치가 첫 번째 장치의 마지막 sector 바로 다음에 이어집니다.

4M chunk를 역순으로 다시 연결

35-63

Perl 예제는 장치를 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`;
Chunk 순서 반전
원본: extent 0 | 1 | ... | N-1`this_offset` 감소새 table row 누적`reverse`: extent N-1 | ... | 1 | 0

원본 장치의 뒤쪽 extent부터 새 논리 장치의 앞쪽에 차례로 mapping합니다.