RAID1 - это избыточное хранение данных, зеркалирование. Ставим N дисков, а используем как 1. Кажется нерационально, но не хочется в случае поломки диска ломать голову как восстановить данные.
Я ставил NMVE
в RAID1
, однако из исследования Google ясно что технология памяти не имеет отношения к надежности и даже среди самых надежных моделей SSD
у 20% наблюдалась 1 неисправимая ошибка чтения, у менее надежных 63% (подсмотрено в книге "Unix и Linux руководство системного администратора").
Поэтому подстрахуемся и сделаем отказоучстойчивое хранилище данных.
Ниже речь идет о создании
RAID1
для хранения данных, это не подходит для установки ОС.
Нам нужно 2 диска одинакового объема. На самом деле нам нужны 2 раздела на одном диске или на двух разных дисках, и эти разделы должны быть одного размера.
Список дисковых устройств c разделами можно просмотреть через lsblk
:
$ sudo lsblk
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
└─sda3 8:3 0 18.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 10G 0 lvm /
sdb 8:16 0 5G 0 disk
sdc 8:32 0 5G 0 disk
Или через fdisk
:
$ sudo fdisk -l
...
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 9BE34257-B9A0-438B-AC51-F337CCD75C5A
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 3719167 3715072 1.8G Linux filesystem
/dev/sda3 3719168 41940991 38221824 18.2G Linux filesystem
...
Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdc: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
...
В этом выводе видно что диск /dev/sda
размечен и имеет таблицу из 3-х разделов, а диски /dev/sdb
и /dev/sdc
не размечены. Эти 2 диска мы будем использовать для построения RAID1
массива.
Просмотреть информацию по конкретному диску:
$ sudo fdisk -l /dev/sdb
Для начала нужно стереть все метаданные (магические строки с метками, подписями и прочим) для избежания конфликтов:
$ sudo wipefs --all --force /dev/sdb /dev/sdc
Теперь нам нужно разметить наши диски /dev/sdb
и /dev/sdc
, пусть каждый из них всем своим доступным пространством участвует в RAID1
массиве.
Используем fdisk
и указываем диск, с которым будем работать:
$ sudo fdisk /dev/sdb
Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xcca90513.
Command (m for help):
Диск доступен для манипуляций, а fdisk
приглашает к вводу команд. Для просмотра всего списка можно ввести m
.
fdisk
по умолчанию создает MBR схему, для схемы GPT нужно использовать аналогичную программуgdisk
.
Просмотрим список разделов диска, чтобы убедиться что диск пуст, для этого нужно ввести p
и enter
:
Command (m for help): p
Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xcca90513
Диск пуст, на нем нет разделов.
fdisk
копит введенные изменения и применяет их к диску по командеw
, если что-то пошло не так можно выйти без сохранения введяq
илиCtrl+C
.
Теперь создаем новый первичный раздел, для этого вводим n
(выбираем p
или просто enter
):
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p):
Номер раздела выбираем 1 (или просто enter
):
Partition number (1-4, default 1):
Начало первого сектора 2048
(или просто enter
):
First sector (2048-10485759, default 2048):
Вводим конец сектора 10485759
чтобы создать раздел на все доступное пространство (или просто enter
):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-10485759, default 10485759):
В итоге должны увидеть:
Created a new partition 1 of type 'Linux' and of size 5 GiB.
Теперь нужно указать тип раздела, иначе он не будет создан. Чтобы просмотреть все доступные типы можно ввести l
:
Command (m for help): l
00 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
01 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
02 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
03 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT-
04 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
05 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
06 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
07 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
08 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
09 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
0a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
0b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
0c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Linux extended
0e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
0f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto
1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT
Для указания типа раздела вводим t
и указываем hex код
типа раздела fd
(Linux raid auto
):
Command (m for help): t
Selected partition 1
Hex code or alias (type L to list all): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'.
Смотрим что получилось (p
):
Command (m for help): p
Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xcca90513
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 10485759 10483712 5G fd Linux raid autodetect
Все верно, теперь записываем изменения да диск (ввод w
):
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Проделываем тоже самое с диском /dev/sdc
. Затем смотрим lsblk
с выводом дополнительного столбца PARTTYPE
чтобы показать тип раздела (hex код
), в итоге у нас должно получиться примерно так:
$ sudo lsblk -o +PARTTYPE
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS PARTTYPE
sdb 8:16 0 5G 0 disk
└─sdb1 8:17 0 5G 0 part 0xfd
sdc 8:32 0 5G 0 disk
└─sdc1 8:33 0 5G 0 part 0xfd
Создаем RAID1
из подготовленных разделов на дисках:
$ sudo mdadm --create --verbose /dev/md0 -l 1 -n 2 /dev/sdb1 /dev/sdc1
где:
/dev/md0
- название будущего устройства с RAID1
-l 1
- уровень 1 (RAID1
)-n 2
- в массие участвует 2 устройства: /dev/sdb
и /dev/sdc
mdadm
запросит подтверждение для продолжения:
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 5236736K
Continue creating array?
y
чтобы продолжить, а финальное сообщение должно быть таким:
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
Теперь lsblk
должен показать что в каждом диске массива появился раздел md0
, к которому можно обращаться как /dev/md0
:
$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 5G 0 disk
└─sdb1 8:17 0 5G 0 part
└─md0 9:0 0 5G 0 raid1
sdc 8:32 0 5G 0 disk
└─sdc1 8:33 0 5G 0 part
└─md0 9:0 0 5G 0 raid1
При запуске система просканирует все диски и назначит им имена, мы же хотим чтобы имя нашего диска было статичным, поэтому:
$ sudo mdadm --detail --scan --verbose | sudo tee -a /etc/mdadm/mdadm.conf
Обновляем initramfs:
$ sudo update-initramfs -u
Прикручиваем файловую систему ext4
:
$ sudo mkfs -t ext4 /dev/md0
Создаем директорию для монтирования и монтируем:
$ sudo mkdir /mnt/md0
$ sudo mount /dev/md0 /mnt/md0
Теперь диск /dev/md0
можно использовать по пути /mnt/md0
, а чтобы он был доступен сразу при загрузке системы:
$ sudo echo "/dev/md0 /mnt/md0 ext4 defaults 0 0" >> /etc/fstab
Если теперь взглянуть на доступное пространство нашего RAID1
, то окажется что оно меньше чем мы ожидаем:
df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/md0 4.9G 24K 4.6G 1% /mnt/md0
Файловая система
ext4
по умолчанию резервирует 5% пространства чтобы гарантировать привилегированным процессам дополнительное пространство для использования в случае заполнения диска. Подробнее об этом можно почитать здесь и здесь.
В своем домашнем сервере я использую RAID1
из двух NMVE
дисков по 1ТБ каждый как хранилище данных для Proxmox, поэтому резервация пространства мне не нужна., отключить ее можно так:
$ sudo tune2fs -m 0 /dev/md0
Узнать состояние всех RAID
устройств:
$ sudo cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc1[1] sdb1[0]
5236736 blocks super 1.2 [2/2] [UU]
Детальная информация по конкретному RAID
:
$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Oct 10 18:46:25 2023
Raid Level : raid1
Array Size : 5236736 (4.99 GiB 5.36 GB)
Used Dev Size : 5236736 (4.99 GiB 5.36 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Tue Oct 10 18:46:51 2023
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
Name : consul:0 (local to host consul)
UUID : fa35b82f:4c74db0f:6521564e:c0c96eaf
Events : 17
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
Детальная информация по конкретному устройству в составе RAID
:
$ sudo mdadm --examine /dev/sdb1 /dev/sdc1
/dev/sdb1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : fa35b82f:4c74db0f:6521564e:c0c96eaf
Name : consul:0 (local to host consul)
Creation Time : Tue Oct 10 18:46:25 2023
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 10473472 sectors (4.99 GiB 5.36 GB)
Array Size : 5236736 KiB (4.99 GiB 5.36 GB)
Data Offset : 10240 sectors
Super Offset : 8 sectors
Unused Space : before=10160 sectors, after=0 sectors
State : clean
Device UUID : 99d9bef5:2a04ffa5:6da4dff6:d36f46ea
Update Time : Tue Oct 10 18:46:51 2023
Bad Block Log : 512 entries available at offset 16 sectors
Checksum : d2a4b311 - correct
Events : 17
Device Role : Active device 0
Array State : AA ('A' == active, '.' == missing, 'R' == replacing)
Протестировать скорость работы md0
диска можно так:
$ sudo dd if=/dev/zero of=/mnt/md0/file bs=1G count=2
2+0 records in
2+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 5.71684 s, 376 MB/s
Не забываем удалить тестовый файл:
$ sudo rm /mnt/md0/file
Оказывается в создании RAID1
ничего сложного, просто нужно:
RAID1
массив на выделенных разделахА потом можно убирать и возвращать диски по очереди (не на горяую) и наблюдать как все работает безотказно.