главная - Статьи - Linux, FreeBSD
Программный RAID1 (зеркало) с помощью mdadm
Теги: Linux
На практике, самый вероятный источник проблем с компьютерами, работающими 24х7 - это диски. За 12 лет я столкнулся с двумя вышедшими из строя сетевыми картами на серверах, но диски, даже серверных серий, выходят из строя регулярно. Что WD, что Seagate, что Hitahi. Поэтому вопрос с мотивацией использования зеркального raid1 считаем закрытым.
Почти все материнские платы сейчас заявляют функционал raid. Только если вы точно знаете, зачем вам использовать raid вашей motherboard, делайте это. К тому же, чаще всего это специфические вариации на тему программного raid, только никто-не-знает-как-сделанные. Т.е. не факт, что плохо сделанные. Но не факт, что вы найдете исчерпывающую информацию по решению проблемы. Далее, специальные контроллеры raid. Опять же, если вы знаете, что именно вы хотите, используйте их. Но вы должны понимать, что любое устройство (что материнка, что отдельный контроллер) могут взбрыкнуть и тогда могут быть проблемы с получением данных с дисков массива. Причем у вас могут возникнуть трудности с поиском информации по решению проблемы, т.к. разбирающихся в конкретной железке или линейки оборудования не так велико.
Одним из наиболее распространенных решений, по которому вы всегда найдете помощь на форумах, является использование программного raid, не привязанного к железу. В случае Linux это raid массив, созданный mdadm.
Сделаем простейшую систему защиты от сбоя жесткого диска - зеркальный raid массив. Для этого добавим в систему два диска:
/dev/sdb
/dev/sdd
Предположим, на дисках мы разместим файловую шару или ресурс для базы данных. Диски новые, разделов на них нет.
Проверим, что диски в самом деле без разделов:
# fdisk -l /dev/sdb
Не должно быть никаких /dev/sdb1 и прочих! Аналогично для /dev/sdd.
Убедитесь, что вы собираетесь создавать разделы именно на тех дисках, которые для этого добавили.
Проверить модель диска и его S/N: smartctl -i /dev/sdb
На каждом диске создадим раздел на весь диск с прицелом на raid.
Примерно так: Сначала n (add a new partition), потом p (primary), номер раздела 1 (partition number). Все цифры можно оставить по-умолчанию. Записали изменения и вышли: w
# fdisk /dev/sdb Command (m for help): m Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition g create a new empty GPT partition table G create an IRIX (SGI) partition table l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-1953525167, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-1953525167, default 1953525167): Using default value 1953525167 Partition 1 of type Linux and of size 931.5 GiB is set Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Меняем тип раздела /dev/sdb1 на "Linux raid autodetect":
Сначала t (change a partition's system id), потом fd (Linux raid auto), потом p (проверим изменения) и w (сохранили изменения и вышли):
# fdisk /dev/sdb Command (m for help): t Selected partition 1 Hex code (type L to list all codes): L 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b 11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor 12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary 16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT 1e Hidden W95 FAT1 80 Old Minix Hex code (type L to list all codes): fd Changed type of partition 'Linux' to 'Linux raid autodetect' Command (m for help): p Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes, 1953525168 sectors 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 label type: dos Disk identifier: 0x25413b69 Device Boot Start End Blocks Id System /dev/sdb1 2048 1953525167 976761560 fd Linux raid autodetect Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Аналогично поступаем с диском /dev/sdd (т.е. создаем primary раздел /dev/sdd1 и меняем тип на "Linux raid autodetect").
Создаем RAID1 массив
Если в вашей системе есть другие диски, внимательно и тщательно проверяйте названия устройств. На моем компьютере это уже не первый массив, поэтому я укажу имя вновь создаваемого массива "/dev/md2".
# mdadm --create --verbose /dev/md2 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdd1
--create - создать
--verbose - больше информации!
/dev/md2 - имя нового raid-массива (фактически, это устройство, на нем потом можно создавать разделы lvm и все что угодно еще)
--raid-devices=2 /dev/sdb1 /dev/sdd1 - указываем кол-во и конкретные устройства, входящие в состав массива.
Проверить, что вышло:
# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdd1[1] sdb1[0]
976630464 blocks super 1.2 [2/2] [UU]
[>....................] resync = 1.4% (13876288/976630464) finish=85.1min speed=188512K/sec
bitmap: 8/8 pages [32KB], 65536KB chunk
Идет синхронизация. Дождемся ее окончания.
После завершения синхронизации посмотрите параметры вашего массива:
# mdadm --detail --scan --verbose
ARRAY /dev/md2 level=raid1 num-devices=2 metadata=1.2 name=localhost.localdomain:2 UUID=3eaa3e42:6f083fc4:0c9281a3:1b9b7452
devices=/dev/sdb1,/dev/sdd1
Чтобы raid после ребута никуда не делся, сохраняем конфиг в файл /etc/mdadm.conf (путь к файлу верен для CentOS 7):
# mdadm --detail --scan --verbose >> /etc/mdadm.conf
Обратите внимание на ">>" (добавить, а не перезаписать). Не стоит перезаписывать конфиг mdadm, там могут быть важные сведения о других массивах, уже работающих у вас в системе.
Что за UUID "3eaa3e42:6f083fc4:0c9281a3:1b9b7452"? Посмотрите UUID блочных устройств, начинающиеся на "3eaa3e42":
# blkid | grep 3eaa3e42
/dev/sdb1: UUID="3eaa3e42-6f08-3fc4-0c92-81a31b9b7452" UUID_SUB="bb9c4771-20c9-4f4b-5013-f0d6d0f327ae" LABEL="backupmail.localdomain:2" TYPE="linux_raid_member"
/dev/sdd1: UUID="3eaa3e42-6f08-3fc4-0c92-81a31b9b7452" UUID_SUB="37997177-2fd1-6518-3036-2b1d76043816" LABEL="backupmail.localdomain:2" TYPE="linux_raid_member"
Т.е. есть привязка в конфиге raid1 массива не только по имени /dev/sdb1, но и по уникальному идентификатору устройства. Поэтому если вы просто вынете диски и на их место включите другие, то ничего хорошего не выйдет.
Так, теперь вот что: можно просто отформатировать созданный диск (mkfs.ext4 /dev/md2) и указать в файле /etc/fstab точку его монтирования, а можно поиграться с LVM. LVM может дать в дальнейшем определенные преимущества, например, если вы решите изменить размер раздела или даже добавить к нему другие диски, вдруг места будет совсем мало.
Создаем физический том на устройстве /dev/md2 (т.е. работаем уже с объектом массива, а не конкретными разделами типа /dev/sdb1):
# pvcreate /dev/md2
Physical volume "/dev/md2" successfully created.
Проверяем:
# pvscan
PV /dev/md2 lvm2 [931.39 GiB]
На томе создаем группу томов (volume group) с именем "datavg" (произвольно, можете брать другое название:
# vgcreate datavg /dev/md2
В группе "datavg" создаем логический том "datalv" (имя выбрано произвольно) размером 931Гб (размер взят из листинга команды pvscan):
# lvcreate --name datalv --size 931G datavg
[не вдаваясь в различия ext4, ext3, xfs и др.] форматируем конечный логический том /dev/datavg/datalv в xfs:
# mkfs.xfs /dev/datavg/datalv meta-data=/dev/datavg/datalv isize=512 agcount=4, agsize=61014016 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=244056064, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=119168, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
Промежуточный итог: у нас есть "диск" с файловой системой xfs, который можно примонтировать и использовать. Например, чтобы наш raid1 обслуживал какую-то директорию (пусть будет /data), в /etc/fstab добавьте, например:
/dev/mapper/datavg-datalv /data xfs defaults 0 0
Создайте саму директорию /data:
# mkdir /data
Проверьте перед перезагрузкой:
# mount /dev/mapper/datavg-datalv /data
Запишите какой-нибудь файл в /data и перезагрузитесь.
Проверяем. Тестовый файл должен быть на месте.
В первый раз всегда делайте это на тестовом или не важном сервере.
Авторизуйтесь для добавления комментариев!