summaryrefslogtreecommitdiff
path: root/LINUX/DISK/MDADM организация RAID.md
blob: 7a50f40a723214179db87aa3ad239f6de5b5ad03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
![Обновлено](https://www.dmosk.ru/img/public/time.jpg "Дата обновления") Обновлено: 28.09.2023  ![Опубликовано](https://www.dmosk.ru/img/public/time.jpg "Дата публикации") Опубликовано: 08.03.2019

mdadm — утилита для работы с программными RAID-массивами различных уровней. В данной инструкции рассмотрим примеры ее использования.

[Установка утилиты mdadm](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#install)  
[Создание RAID](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#create)  
    [Подготовка носителей](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#create-prepare)  
    [Сборка отказоустойчивого массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#create-raid)  
[Файл mdadm.conf](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#conf)  
[Создание файловой системы и монтирование](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#fs-mount)  
[Получение информации о RAID](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#info)  
[Проверка целостности массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#check)  
[Восстановление RAID](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#restore)  
    [Заменой диска](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#restore-disk)  
    [Пересборка массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#restore-assemble)  
[Использование Hot Spare](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#spare)  
[Добавление диска к массиву](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#add-to-raid)  
[Удаление массива](https://www.dmosk.ru/miniinstruktions.php?mini=mdadm#remove)

## Установка mdadm

`apt-get install mdadm

## Сборка RAID

Перед сборкой, стоит подготовить наши носители. Затем можно приступать к созданию рейд-массива.

### Подготовка носителей

Сначала необходимо занулить суперблоки на дисках, которые мы будем использовать для построения RAID (если диски ранее использовались, их суперблоки могут содержать служебную информацию о других RAID):

`mdadm --zero-superblock --force /dev/sd{b,c}

_* в данном примере мы зануляем суперблоки для дисков **sdb** и **sdc**._

> Посмотреть, какие в вашей системе есть устройства можно командой:
> 
> `lsblk

Если мы получили ответ:

`mdadm: Unrecognised md component device - /dev/sdb  
`mdadm: Unrecognised md component device - /dev/sdc

... то значит, что диски не использовались ранее для RAID. Просто продолжаем настройку.

Далее нужно удалить старые метаданные и подпись на дисках:

`wipefs --all --force /dev/sd{b,c}

### Создание рейда

Для сборки избыточного массива применяем следующую команду:

`mdadm --create --verbose /dev/md0 -l 1 -n 2 /dev/sd{b,c}

_* где:_
- _**/dev/md0** — устройство RAID, которое появится после сборки;_ 
- _**-l 1** — уровень RAID;_ 
- _**-n 2** — количество дисков, из которых собирается массив;_ 
- _**/dev/sd{b,c}** — сборка выполняется из дисков sdb и sdc._

Мы должны увидеть что-то на подобие:

`mdadm: Note: this array has metadata at the start and  
    `may not be suitable as a boot device.  If you plan to  
    `store '/boot' on this device please ensure that  
    `your boot-loader understands md/v1.x metadata, or use  
    `--metadata=0.90  
`mdadm: size set to 1046528K

Также система задаст контрольный вопрос, хотим ли мы продолжить и создать RAID — нужно ответить **y**:

`Continue creating array? y

Мы увидим что-то на подобие:

`mdadm: Defaulting to version 1.2 metadata  
`mdadm: array /dev/md0 started.

Вводим команду:

`lsblk

... и находим информацию о том, что у наших дисков sdb и sdc появился раздел md0, например:
...  
sdb                     8:16   0    2G  0 disk    
??md0                   9:0    0    2G  0 raid1   
sdc                     8:32   0    2G  0 disk    
??md0                   9:0    0    2G  0 raid1   
...

_* в примере мы видим собранный raid1 из дисков sdb и sdc._

## Создание файла mdadm.conf

В файле mdadm.conf находится информация о RAID-массивах и компонентах, которые в них входят. Для его создания выполняем следующие команды:

`mkdir /etc/mdadm

`echo "DEVICE partitions" > /etc/mdadm/mdadm.conf

`mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf

Пример содержимого:

`DEVICE partitions  
`ARRAY /dev/md0 level=raid1 num-devices=2 metadata=1.2 name=proxy.dmosk.local:0 UUID=411f9848:0fae25f9:85736344:ff18e41d

_* в данном примере хранится информация о массиве **/dev/md0** — его уровень 1, он собирается из 2-х дисков._

## Создание файловой системы и монтирование массива

Создание файловой системы для массива выполняется также, как для раздела, например:

`mkfs.ext4 /dev/md0

_* данной командой мы создаем на **md0** файловую систему **ext4**._
или:

`mkfs.xfs /dev/md0

_* для файловой системы **xfs**._

Примонтировать раздел можно командой:

`mount /dev/md0 /mnt

_* в данном случае мы примонтировали наш массив в каталог **/mnt**._

Чтобы данный раздел также монтировался при загрузке системы, добавляем в fstab.

Сначала смотрим идентификатор раздела:

`blkid

Мы увидим что-то на подобие:

`/dev/md0: UUID="ffa7c082-7613-4dbc-ae62-3f5508652cf6" TYPE="ext4"

_* в моем примере мы будем использовать идентификатор **ffa7c082-7613-4dbc-ae62-3f5508652cf6**._

Открываем теперь fstab и добавляем строку:

`vim /etc/fstab

`UUID="ffa7c082-7613-4dbc-ae62-3f5508652cf6"    /mnt    ext4    defaults    0 0

Если ранее мы монтировали раздел в каталог /mnt, вводим:

`umount /mnt

И после: 

`mount -a

Мы должны увидеть примонтированный раздел md, например:

`df -h

`/dev/md0               990M         2,6M  921M            1% /mnt

## Информация о RAID

Посмотреть состояние всех RAID можно командой:

`cat /proc/mdstat

В ответ мы получим что-то на подобие:

`md0 : active raid1 sdc[1] sdb[0]  
      `1046528 blocks super 1.2 [2/2] [UU]

_* где **md0** — имя RAID устройства; **raid1 sdc[1] sdb[0]** — уровень избыточности и из каких дисков собран; **1046528 blocks** — размер массива; **[2/2] [UU]** — количество юнитов, которые на данный момент используются.  
** мы можем увидеть строку **md0 : active(auto-read-only)** — это означает, что после монтирования массива, он не использовался для записи._

Подробную информацию о конкретном массиве можно посмотреть командой:

`mdadm -D /dev/md0

_* где **/dev/md0** — имя RAID устройства._

Пример ответа:

           Version : 1.2  
     Creation Time : Wed Mar  6 09:41:06 2019  
        Raid Level : raid1  
        Array Size : 1046528 (1022.00 MiB 1071.64 MB)  
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)  
      Raid Devices : 2  
     Total Devices : 2  
       Persistence : Superblock is persistent  
  
       Update Time : Wed Mar  6 09:41:26 2019  
             State : clean   
    Active Devices : 2  
   Working Devices : 2  
    Failed Devices : 0  
     Spare Devices : 0  
  
Consistency Policy : resync  
  
              Name : proxy.dmosk.local:0  (local to host proxy.dmosk.local)  
              UUID : 304ad447:a04cda4a:90457d04:d9a4e884  
            Events : 17  
  
    Number   Major   Minor   RaidDevice State  
       0       8       16        0      active sync   /dev/sdb  
       1       8       32        1      active sync   /dev/sdc

_* где:_

- _**Version —** версия метаданных._
- _**Creation Time —** дата в время создания массива._
- _**Raid Level —** уровень RAID._
- _**Array Size —** объем дискового пространства для RAID._
- _**Used Dev Size —** используемый объем для устройств. Для каждого уровня будет индивидуальный расчет: RAID1 — равен половине общего размера дисков, RAID5 — равен размеру, используемому для контроля четности._
- _**Raid Devices —** количество используемых устройств для RAID._
- _**Total Devices —** количество добавленных в RAID устройств._
- _**Update Time —** дата и время последнего изменения массива._
- _**State —** текущее состояние. clean — все в порядке._
- _**Active Devices —** количество работающих в массиве устройств._
- _**Working Devices —** количество добавленных в массив устройств в рабочем состоянии._
- _**Failed Devices —** количество сбойных устройств._
- _**Spare Devices —** количество запасных устройств._
- _**Consistency Policy —** политика согласованности активного массива (при неожиданном сбое). По умолчанию используется **resync** — полная ресинхронизация после восстановления. Также могут быть bitmap, journal, ppl._
- _**Name —** имя компьютера._
- _**UUID —** идентификатор для массива._
- _**Events —** количество событий обновления._
- **Chunk Size** (для RAID5) — размер блока в килобайтах, который пишется на разные диски.

Подробнее про каждый параметр можно прочитать в мануале для mdadm:

`man mdadm

Также, информацию о разделах и дисковом пространстве массива можно посмотреть командой fdisk:

`fdisk -l /dev/md0

## Проверка целостности

Для проверки целостности вводим:

`echo 'check' > /sys/block/md0/md/sync_action

Результат проверки смотрим командой:

`cat /sys/block/md0/md/mismatch_cnt

_* если команда возвращает **0**, то с массивом все в порядке._

Остановка проверки:

`echo 'idle' > /sys/block/md0/md/sync_action

## Восстановление RAID

Рассмотрим два варианта восстановлении массива.

### Замена диска

В случае выхода из строя одного из дисков массива, команда cat /proc/mdstat покажет следующее:

`cat /proc/mdstat

Personalities : [raid1]   
md0 : active raid1 sdb[0]  
      1046528 blocks super 1.2 [2/1] [U_]

_* о наличии проблемы нам говорит нижнее подчеркивание вместо U — **[U_]** вместо **[UU]**._

Или:

`mdadm -D /dev/md0

...  
       Update Time : Thu Mar  7 20:20:40 2019  
             State : clean, degraded  
...

_* статус **degraded** говорит о проблемах с RAID._

Для восстановления, сначала удалим сбойный диск, например:

`mdadm /dev/md0 --remove /dev/sdc

> Если нам нужно заменить диск, но при этом он в mdadm имеет рабочее состояние, мы получим ошибку:
> 
> ... device or resource busy
> 
> Сначала, нам нужно пометить диск как сбойный:
> 
> `mdadm /dev/md0 --manage --fail /dev/sdc
> 
> _* в данном примере диск **sdb** массива **md0** будет помечен сбойным._
> 
> Теперь удаляем:
> 
> `mdadm /dev/md0 --remove /dev/sdc

Теперь добавим новый:

`mdadm /dev/md0 --add /dev/sde

Смотрим состояние массива:

`mdadm -D /dev/md0

...  
       Update Time : Thu Mar  7 20:57:13 2019  
             State : clean, degraded, recovering  
...  
    Rebuild Status : 40% complete  
...

_* **recovering** говорит, что RAID восстанавливается; **Rebuild Status** — текущее состояние восстановления массива (в данном примере он восстановлен на **40%**)._

Если синхронизация выполняется слишком медленно, можно увеличить ее скорость. Для изменения скорости синхронизации вводим:

`echo '10000' > /proc/sys/dev/raid/speed_limit_min

_* по умолчанию скорость **speed_limit_min** = 1000 Кб, **speed_limit_max** — 200000 Кб. Для изменения скорости, можно поменять только минимальную._

### Пересборка массива

Если нам нужно вернуть ранее разобранный или развалившийся массив из дисков, которые уже входили в состав RAID, вводим:

`mdadm --assemble --scan

_* данная команда сама найдет необходимую конфигурацию и восстановит RAID._

Также, мы можем указать, из каких дисков пересобрать массив:

`mdadm --assemble /dev/md0 /dev/sdb /dev/sdc

===============================================

**Чтобы вытащить данные из одного диска RAID-1 в Ubuntu, можно попробовать следующее:**

При подключении одного жесткого диска к моей машине Ubuntu `fdisk -l`отчеты:

```
Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
    Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: D1C4E003-11FD-4223-AA98-61CB9C6322BD

Device          Start        End    Sectors  Size Type
/dev/sdb1        2048    1050623    1048576  512M Linux swap
/dev/sdb2     3147776 3904929899 3901782124  1.8T Microsoft basic data
/dev/sdb3  3904931840 3907029134    2097295    1G Microsoft basic data
/dev/sdb4     1050624    3147775    2097152    1G Microsoft basic data
```

Я попробовал шаги из похожего вопроса на этом сайте:

```
root@host:/mnt# mount /dev/sdb2 /mnt/old_nas/
mount: /mnt/old_nas: unknown filesystem type 'linux_raid_member'.

root@host:/mnt# mdadm --assemble --run /dev/md0 /dev/sdb2
mdadm: failed to RUN_ARRAY /dev/md0: Invalid argument
mdadm: Not enough devices to start the array.
```

Предположим, /deb/sdb2 — это старый участник raid 1, который вы хотите восстановить.

**Первый вариант** : попробуйте заново собрать RAID 1 со старым диском:

Вам необходимо собрать деградировавший RAID-массив на новой машине, используя что-то вроде этого:

```
mdadm --force --assemble --run /dev/md0 /dev/sdb2
```

Конечно, выберите номер помимо md0, если он уже используется. Затем вы можете смонтировать /dev/md0, где захотите.

Другой вариант:

```
mdadm --force --run --assemble --scan
```

Вы получите что-то вроде этого:

```
mdadm: /dev/md/0 has been started with 1 drive (out of 2)
```

Затем смонтируйте и просмотрите свои файлы:

```
cd /mnt && mkdir md0 && mount /dev/md0 md0
ls -la md0
```

Наконец, вы можете добавить второй диск в массив:

```
mdadm /dev/md0 --manage --add /dev/sdc1
```

**Второй вариант** : использование циклического устройства только для чтения

Получите смещение данных для старого диска:

```
mdadm --examine /dev/sdb2 | grep -i offset
```

Создайте петлевое устройство (представим, что смещение данных равно 2048):

```
losetup --find --show --read-only --offset $((2048*512)) /dev/sdb2
```

Смонтируйте печатное устройство петли, полученное в результате предыдущей команды.

```
mount -o ro /dev/loo1 /mnt/
```

Mount может сделать это напрямую с помощью опций -o ro,loop,offset=:

```
mount -o ro,loop,offset=$((2048*512)) /dev/sdb2 /mnt
```

Насколько я понимаю, проблема, с которой вы столкнулись, может быть связана с тем, что mdadm считает ваш массив RAID 1 "чистым", что не так. Перед тем, как извлечь диск из массива, вы должны явно сообщить mdadm, что ваш второй диск (sdb2) вышел из строя:

```
mdadm --manage /dev/md0 --fail /dev/sdb2
mdadm --manage /dev/md0 --remove /dev/sdb2
```

===============================================
## Запасной диск (Hot Spare)

Если в массиве будет запасной диск для горячей замены, при выходе из строя одного из основных дисков, его место займет запасной.

Диском Hot Spare станет тот, который просто будет добавлен к массиву:

`mdadm /dev/md0 --add /dev/sdd

Информация о массиве изменится, например:

`mdadm -D /dev/md0

...  
    Number   Major   Minor   RaidDevice State  
       0       8       16        0      active sync   /dev/sdb  
       2       8       48        1      active sync   /dev/sdc  
  
       3       8       32        -      spare   /dev/sdd

Проверить работоспособность резерва можно вручную, симулировав выход из строя одного из дисков:

`mdadm /dev/md0 --fail /dev/sdb

И смотрим состояние:

`mdadm -D /dev/md0

...  
    Rebuild Status : 37% complete  
...  
    Number   Major   Minor   RaidDevice State  
       3       8       32        0      spare rebuilding   /dev/sdd  
       2       8       48        1      active sync   /dev/sdc  
  
       0       8       16        -      faulty   /dev/sdb  
...

_* как видим, начинается ребилд. На замену вышедшему из строя **sdb** встал hot-spare **sdd**._

## Добавить диск к массиву

В данном примере рассмотрим вариант добавления активного диска к RAID, который будет использоваться для работы, а не в качестве запасного.

Добавляем диск к массиву:

`mdadm /dev/md0 --add /dev/sde

Новый диск мы увидим в качестве spare:

4       8       16        -      spare   /dev/sde

Теперь расширяем RAID:

`mdadm -G /dev/md0 --raid-devices=3

_* в данном примере подразумевается, что у нас RAID 1 и мы добавили к нему 3-й диск._

## Удаление массива

При удалении массива внимательнее смотрите на имена массива и дисков и подставляйте свои значения.

Если нам нужно полностью разобрать RAID, сначала размонтируем и остановим его:

`umount /mnt

_* где **/mnt** — каталог монтирования нашего RAID._

> Если мы получим ошибку **umount: /mnt: target is busy**, то смотрим пользовательские процессы, которые мешают отмонтировать раздел:
> 
> `fuser -vm /mnt
> 
> И останавливаем их.

`mdadm -S /dev/md0

_* где **/dev/md0** — массив, который мы хотим разобрать._

> Если мы получим ошибку **mdadm: fail to stop array /dev/md0: Device or resource busy**, с помощью команды
> 
> `lsof -f -- /dev/md0
> 
> ... смотрим процессы, которые используют раздел и останавливаем их.

Затем очищаем суперблоки на всех дисках, из которых он был собран:

`mdadm --zero-superblock /dev/sdb

`mdadm --zero-superblock /dev/sdc

`mdadm --zero-superblock /dev/sdd

_* где диски **/dev/sdb**, **/dev/sdc**, **/dev/sdd** были частью массива md0._

А также удаляем метаданные и подпись:

`wipefs --all --force /dev/sd{b,c,d}