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

Linux 6.18.37 · Administration / Device Mapper

dm-stripe

연속 chunk를 여러 underlying block device에 round-robin 배치하는 RAID-0 target의 parameter, 크기 정렬과 Perl table 생성 예제입니다.

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

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

1. 요약·해설

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

Stripe mapping 모델

striped.rst:1-25

Chunk 크기와 device 수로 stripe 폭을 만들고 논리 data를 순환 배치합니다.

Table 생성 예제

striped.rst:26-61

최소 device 용량과 stripe 폭에 맞춰 전체 크기를 정렬한 뒤 모든 device entry를 추가합니다.

2. 영어 원문 전체

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

원문 전체 펼치기
1 =========
2 dm-stripe
3 =========
4
5 Device-Mapper's "striped" target is used to create a striped (i.e. RAID-0)
6 device across one or more underlying devices. Data is written in "chunks",
7 with consecutive chunks rotating among the underlying devices. This can
8 potentially provide improved I/O throughput by utilizing several physical
9 devices in parallel.
10
11 Parameters: <num devs> <chunk size> [<dev path> <offset>]+
12 <num devs>:
13 Number of underlying devices.
14 <chunk size>:
15 Size of each chunk of data. Must be at least as
16 large as the system's PAGE_SIZE.
17 <dev path>:
18 Full pathname to the underlying block-device, or a
19 "major:minor" device-number.
20 <offset>:
21 Starting sector within the device.
22
23 One or more underlying devices can be specified. The striped device size must
24 be a multiple of the chunk size multiplied by the number of underlying devices.
25
26
27 Example scripts
28 ===============
29
30 ::
31
32 #!/usr/bin/perl -w
33 # Create a striped device across any number of underlying devices. The device
34 # will be called "stripe_dev" and have a chunk-size of 128k.
35
36 my $chunk_size = 128 * 2;
37 my $dev_name = "stripe_dev";
38 my $num_devs = @ARGV;
39 my @devs = @ARGV;
40 my ($min_dev_size, $stripe_dev_size, $i);
41
42 if (!$num_devs) {
43 die("Specify at least one device\n");
44 }
45
46 $min_dev_size = `blockdev --getsz $devs[0]`;
47 for ($i = 1; $i < $num_devs; $i++) {
48 my $this_size = `blockdev --getsz $devs[$i]`;
49 $min_dev_size = ($min_dev_size < $this_size) ?
50 $min_dev_size : $this_size;
51 }
52
53 $stripe_dev_size = $min_dev_size * $num_devs;
54 $stripe_dev_size -= $stripe_dev_size % ($chunk_size * $num_devs);
55
56 $table = "0 $stripe_dev_size striped $num_devs $chunk_size";
57 for ($i = 0; $i < $num_devs; $i++) {
58 $table .= " $devs[$i] 0";
59 }
60
61 `echo $table | dmsetup create $dev_name`;
62

3. 한국어 전문 번역

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

여러 장치에 chunk를 순환 배치하는 RAID-0

1-9

Device Mapper의 `striped` target은 하나 이상의 underlying device에 걸친 striped device, 즉 RAID-0 장치를 만듭니다. Data는 chunk 단위로 기록하며 연속 chunk를 underlying device 사이에서 순환 배치합니다.

여러 physical device를 병렬로 활용할 수 있으므로 I/O throughput이 향상될 가능성이 있습니다.

Chunk round-robin
Logical chunk 0Device 0Logical chunk NDevice 0으로 순환
Logical chunk 1Device 1Logical chunk N+1Device 1로 순환

연속 논리 chunk를 device 0부터 마지막 device까지 반복해서 배치합니다.

Striped target 특성
항목동작
Data 배치고정 크기 chunk를 device별 round-robin
병렬성서로 다른 chunk를 여러 physical device에서 처리
중복성없음
주요 효과잠재적인 I/O throughput 향상

용량 중복 없이 device를 병렬 사용하므로 RAID-0과 같은 성격을 가집니다.

Device 수, chunk 크기와 시작 sector

10-25

Target parameter 형식은 다음과 같습니다.

Parameters: <num devs> <chunk size> [<dev path> <offset>]+
dm-striped parameter
Parameter의미제약
`<num devs>`Underlying device 수하나 이상
`<chunk size>`각 data chunk 크기System `PAGE_SIZE` 이상
`<dev path>`Underlying block device전체 pathname 또는 `major:minor`
`<offset>`해당 device 안의 시작 위치Sector 단위

각 device마다 path와 offset 한 쌍을 제공하며 앞에서 stripe geometry를 지정합니다.

Underlying device는 하나 이상 지정할 수 있습니다. Striped device의 전체 크기는 `chunk size * underlying device 수`의 배수여야 합니다.

Stripe 폭 정렬
`chunk_size`×`num_devs`=한 stripe의 sector 수전체 device size의 정렬 단위

한 stripe가 모든 device에 chunk 하나씩 배치하므로 전체 논리 크기는 stripe 폭에 맞아야 합니다.

128 KiB chunk 예제와 입력 장치 확인

26-44

Perl 예제는 임의 개수의 underlying device에 `stripe_dev`라는 striped device를 만들고 chunk size를 128 KiB로 설정합니다. 512-byte sector 기준으로 `128 * 2`는 256 sector, 즉 128 KiB입니다.

`@ARGV`의 모든 device를 `@devs`에 저장하고 인자 수를 `num_devs`로 사용합니다. Device가 하나도 없으면 `Specify at least one device` 오류로 종료합니다.

Script 입력 준비
`@ARGV` device 목록`num_devs` 계산0개이면 종료`chunk_size = 128 * 2``dev_name = stripe_dev`

Command-line device 목록에서 target 이름과 stripe geometry를 준비합니다.

최소 장치 크기와 aligned table 생성

45-61

Script는 `blockdev --getsz`로 각 device의 sector 수를 읽어 가장 작은 값 `min_dev_size`를 찾습니다. 모든 device에서 같은 양을 사용할 수 있도록 이 최소 크기를 기준으로 합니다.

초기 `stripe_dev_size`는 `min_dev_size * num_devs`입니다. 이어서 `chunk_size * num_devs`로 나눈 나머지를 빼 한 stripe 폭의 배수로 내림 정렬합니다.

Striped device 크기 계산
각 device의 `blockdev --getsz``min_dev_size` 선택× `num_devs`Stripe 폭 나머지 제거`stripe_dev_size`

가장 작은 device 용량을 넘지 않으면서 완전한 stripe만 포함하도록 size를 내립니다.

Table은 논리 시작 sector 0, 정렬된 전체 길이, `striped`, device 수와 chunk 크기로 시작합니다. 각 device에 path와 offset 0을 추가한 뒤 `dmsetup create stripe_dev`로 target을 생성합니다.

::

  #!/usr/bin/perl -w
  # Create a striped device across any number of underlying devices. The device
  # will be called "stripe_dev" and have a chunk-size of 128k.

  my $chunk_size = 128 * 2;
  my $dev_name = "stripe_dev";
  my $num_devs = @ARGV;
  my @devs = @ARGV;
  my ($min_dev_size, $stripe_dev_size, $i);

  if (!$num_devs) {
          die("Specify at least one device\n");
  }

  $min_dev_size = `blockdev --getsz $devs[0]`;
  for ($i = 1; $i < $num_devs; $i++) {
          my $this_size = `blockdev --getsz $devs[$i]`;
          $min_dev_size = ($min_dev_size < $this_size) ?
                          $min_dev_size : $this_size;
  }

  $stripe_dev_size = $min_dev_size * $num_devs;
  $stripe_dev_size -= $stripe_dev_size % ($chunk_size * $num_devs);

  $table = "0 $stripe_dev_size striped $num_devs $chunk_size";
  for ($i = 0; $i < $num_devs; $i++) {
          $table .= " $devs[$i] 0";
  }

  `echo $table | dmsetup create $dev_name`;
생성 table 구성
부분
논리 범위`0 $stripe_dev_size`
Target`striped`
Geometry`$num_devs $chunk_size`
Device entries각 `$devs[$i] 0`
생성 명령`dmsetup create $dev_name`

Header 뒤에 device 수만큼 `<dev path> <offset>` 쌍을 연결합니다.