Создаём raid зеркало в debian с помощью mdadm

Как перенести уже установленную систему на raid-массив в режиме зеркалирования без потери данных?
Именно такой вопрос часто встаёт при настройке серверов, расположенных в датацентрах, где нет возможности подробно конфигурировать установку операционной системы, а доступ к KVM или невозможен в принципе или чрезвычайно дорог. (При стандартной установке на компьютер, к которому имеется физический доступ, есть возможность сконфигурировать raid сразу при инсталляции системы).

Мы будем рассматривать вариант системы, где имеется отдельный своп-раздел на расширенном партишне – sda5, и корневой (он же загрузочный) sda1.

RAID1 на 2 винчестера на работающей системе

apt-get install mc mdadm lshw vim rsync

При установке пакета mdadm указываем какие массивы необходимо запускать как можно раньше при старте системы “all” (все).

root@debtest:~# fdisk -l /dev/sda
 
Disk /dev/sda: 2142 MB, 2142296064 bytes
255 heads, 63 sectors/track, 260 cylinders, total 4184172 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 identifier: 0x000143a1
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     3903487     1950720   83  Linux
/dev/sda2         3905534     4182015      138241    5  Extended
/dev/sda5         3905536     4182015      138240   82  Linux swap / Solaris
root@debiantest:~# sfdisk -d /dev/sda --force | sfdisk /dev/sdb --force
Checking that no-one is using this disk right now ...
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
OK
 
Disk /dev/sdb: 261 cylinders, 255 heads, 63 sectors/track
 
sfdisk: ERROR: sector 0 does not have an msdos signature
 /dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0
 
   Device Boot    Start       End   #sectors  Id  System
/dev/sdb1   *      2048   3913727    3911680  83  Linux
/dev/sdb2       3915774   4192255     276482   5  Extended
/dev/sdb3             0         -          0   0  Empty
/dev/sdb4             0         -          0   0  Empty
/dev/sdb5       3915776   4192255     276480  82  Linux swap / Solaris
Warning: partition 1 does not end at a cylinder boundary
Warning: partition 2 does not start at a cylinder boundary
Warning: partition 2 does not end at a cylinder boundary
Warning: partition 5 does not end at a cylinder boundary
Successfully wrote the new partition table
 
Re-reading the partition table ...
 
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
 
root@debiantest:~# mdadm --create /dev/md4 --level=1 --raid-disks=2 missing /dev/sdb1
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
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md4 started.
 
root@debiantest:~# mkfs.ext4 /dev/md4
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
122400 inodes, 488688 blocks
24434 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=503316480
15 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912
 
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
 
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
 
mkdir /mnt/md4 && mount /dev/md4 /mnt/md4
rsync -avHxl --progress --inplace --exclude 'lost+found' --exclude '/mnt' / /mnt/md4/
umount /mnt/md4
root@debtest:~# blkid /dev/md* /dev/sd*
/dev/md4: UUID="ad17782b-be57-4be0-9008-433afce1368d" TYPE="ext4"
/dev/sda1: UUID="c44dc161-2622-4552-a816-831a86b4693b" TYPE="ext4"
/dev/sda5: UUID="7068334e-7b73-4238-933e-f644d179800c" TYPE="swap"
/dev/sdb1: UUID="5b7fae1e-1013-54fd-7434-00296d4f8d4f" UUID_SUB="dc2bb93f-293c-fbb0-5cf2-084160ce373c" LABEL="debtest:4" TYPE="linux_raid_member"
/dev/sdb5: UUID="875044e3-bdd6-4ae0-a28b-a1e98ae61ef5" TYPE="swap"
root@debtest:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=ad17782b-be57-4be0-9008-433afce1368d /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=7068334e-7b73-4238-933e-f644d179800c none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

В файле /boot/grub/grub.cfg меняем “c44dc161-2622-4552-a816-831a86b4693b” на “ad17782b-be57-4be0-9008-433afce1368d” и обязательно добавляем строку “insmod mdraid1x”, иначе груб не будет видеть массив. Также заменяем “(hd0,msdos1)” на “(md/4)”. Можно заменять не все вышеописанные вхождения, а секцию Recovery не трогать, – это позволит загрузить систему, если что-то пойдёт не так (если есть физический доступ к машине или KVM).

menuentry 'Debian GNU/Linux, with Linux 3.2.0-4-486' --class debian --class gnu-linux --class gnu --class os {
	load_video
	insmod gzio
	insmod mdraid1x

Перезагружаемся.

Добавляем второй диск в массив и ждём окончания сихронизации (статус проверяем командой “cat /proc/mdstat”)

root@debiantest:/boot/grub# mdadm -a /dev/md4 /dev/sda1
mdadm: added /dev/sda1
 
root@debiantest:/boot/grub# cat /proc/mdstat
Personalities : [raid1]
md4 : active raid1 sda1[2] sdb1[1]
      1954752 blocks super 1.2 [2/1] [_U]
      [==>..................]  recovery = 10.9% (214400/1954752) finish=0.9min speed=30628K/sec
 
root@debiantest:/boot/grub# cat /proc/mdstat
Personalities : [raid1]
md4 : active raid1 sda1[2] sdb1[1]
      1954752 blocks super 1.2 [2/2] [UU]
 
unused devices: <none>

Реконфигурируем загрузчик и устанавливаем его на каждый из двух дисков

update-grub
update-initramfs -u
grub-install /dev/sda
grub-install /dev/sdb

Копируем новые конфигурационные файлы груба на второй диск.

Опять перезагружаемся, чтобы убедиться, что всё работает.

Быстрый SWAP на два диска

Для того, чтобы работа с файлом подкачки была максимально эффективной, можно одновременно использовать два раздела подкачки, расположенные на разных дисках. Для того, чтобы они использовались одновременно, в параметре команды swapon следует указать одинаковый приоритет

mkswap /dev/sdb5
swapon -p1 /dev/sdb5
swapoff /dev/sda5
swapon -p1 /dev/sda5

Или, если требования предъявляемые к уровню надёжности системы достаточно высоки, swap имеет смысл вынести также массив-зеркало raid1, потому что в описанном выше случае, после смерти одного из дисков, можно будет с высокой долей вероятности получить SEGFAULT и останов некоторых сервисов (чьи данные пропали). То есть получается такой raid0 без рэйда :) А в случае использования твердотельных ssd дисков, имеет смысл вообще избавится от раздела подкачки.

RAID1 на 4 винчестера

А можно сделать зеркало сразу на 4 винчестера. Подключем ещё 2 диска, такой же ёмкости (они появятся под наименованиями sdc и sdd)

root@debtest:~# lshw -class disk
  *-cdrom
       description: DVD reader
       physical id: 0.0.0
       bus info: scsi@1:0.0.0
       logical name: /dev/cdrom
       logical name: /dev/dvd
       logical name: /dev/sr0
       capabilities: audio dvd
       configuration: status=nodisc
  *-disk:0
       description: ATA Disk
       product: VBOX HARDDISK
       physical id: 0
       bus info: scsi@2:0.0.0
       logical name: /dev/sda
       version: 1.0
       serial: VBfa63ddc1-a7a65bab
       size: 2043MiB (2142MB)
       capabilities: partitioned partitioned:dos
       configuration: ansiversion=5 sectorsize=512 signature=000143a1
  *-disk:1
       description: ATA Disk
       product: VBOX HARDDISK
       physical id: 1
       bus info: scsi@3:0.0.0
       logical name: /dev/sdb
       version: 1.0
       serial: VBc754548b-6ad1582b
       size: 2GiB (2147MB)
       capabilities: partitioned partitioned:dos
       configuration: ansiversion=5 sectorsize=512
  *-disk:2
       description: ATA Disk
       product: VBOX HARDDISK
       physical id: 2
       bus info: scsi@4:0.0.0
       logical name: /dev/sdc
       version: 1.0
       serial: VBb3bddae6-55e073ab
       size: 2GiB (2147MB)
       configuration: ansiversion=5 sectorsize=512
  *-disk:3
       description: ATA Disk
       product: VBOX HARDDISK
       physical id: 3
       bus info: scsi@5:0.0.0
       logical name: /dev/sdd
       version: 1.0
       serial: VB6c8afc23-2d32b22d
       size: 2GiB (2147MB)
       configuration: ansiversion=5 sectorsize=512

Для этого опять копируем таблицу разделов на новые диски

root@debtest:~# sfdisk -d /dev/sda --force | sfdisk /dev/sdc --force
Checking that no-one is using this disk right now ...
OK
 
Disk /dev/sdc: 261 cylinders, 255 heads, 63 sectors/track
 
sfdisk: ERROR: sector 0 does not have an msdos signature
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
 /dev/sdc: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0
 
   Device Boot    Start       End   #sectors  Id  System
/dev/sdc1   *      2048   3903487    3901440  83  Linux
/dev/sdc2       3905534   4182015     276482   5  Extended
/dev/sdc3             0         -          0   0  Empty
/dev/sdc4             0         -          0   0  Empty
/dev/sdc5       3905536   4182015     276480  82  Linux swap / Solaris
Warning: partition 1 does not end at a cylinder boundary
Warning: partition 2 does not start at a cylinder boundary
Warning: partition 2 does not end at a cylinder boundary
Warning: partition 5 does not end at a cylinder boundary
Successfully wrote the new partition table
 
Re-reading the partition table ...
 
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
root@debtest:~# sfdisk -d /dev/sda --force | sfdisk /dev/sdd --force
Checking that no-one is using this disk right now ...
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
OK
 
Disk /dev/sdd: 261 cylinders, 255 heads, 63 sectors/track
 
sfdisk: ERROR: sector 0 does not have an msdos signature
 /dev/sdd: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0
 
   Device Boot    Start       End   #sectors  Id  System
/dev/sdd1   *      2048   3903487    3901440  83  Linux
/dev/sdd2       3905534   4182015     276482   5  Extended
/dev/sdd3             0         -          0   0  Empty
/dev/sdd4             0         -          0   0  Empty
/dev/sdd5       3905536   4182015     276480  82  Linux swap / Solaris
Warning: partition 1 does not end at a cylinder boundary
Warning: partition 2 does not start at a cylinder boundary
Warning: partition 2 does not end at a cylinder boundary
Warning: partition 5 does not end at a cylinder boundary
Successfully wrote the new partition table
 
Re-reading the partition table ...
 
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

Создаём файловую систему (в нашем случае это ext4)

root@debtest:~# mkfs.ext4 /dev/sdc1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
121920 inodes, 487680 blocks
24384 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=503316480
15 block groups
32768 blocks per group, 32768 fragments per group
8128 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912
 
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
 
root@debtest:~# mkfs.ext4 /dev/sdd1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
121920 inodes, 487680 blocks
24384 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=503316480
15 block groups
32768 blocks per group, 32768 fragments per group
8128 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912
 
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

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

root@debtest:~# mdadm -a /dev/md4 /dev/sdc1
mdadm: added /dev/sdc1
root@debtest:~# mdadm -a /dev/md4 /dev/sdd1
mdadm: added /dev/sdd1

Если сейчас посмотреть /proc/mdstat мы увидим, что массив по-прежнему состоит из двух дисков, а ещё два – не используются и будут служить резервными

root@debtest:~# cat /proc/mdstat
Personalities : [raid1]
md4 : active raid1 sdd1[5](S) sdc1[4](S) sda1[2] sdb1[3]
      1949632 blocks super 1.2 [2/2] [UU]

Указываем mdadm, что следует, увеличить количество устройств в массиве до четырёх штук

root@debtest:~# mdadm --grow /dev/md4 --raid-devices=4
raid_disks for /dev/md4 set to 4

Начинается процесс перестроения массива (данные копируются на два новых винчестера)

root@debtest:~# cat /proc/mdstat
Personalities : [raid1]
md4 : active raid1 sda1[2] sdc1[4] sdd1[5] sdb1[3]
      1949632 blocks super 1.2 [4/2] [UU__]
      [==>..................]  recovery = 13.2% (258304/1949632) finish=0.4min speed=64576K/sec
 
unused devices: <none>
root@debtest:~# cat /proc/mdstat
Personalities : [raid1]
md4 : active raid1 sda1[2] sdc1[4] sdd1[5] sdb1[3]
      1949632 blocks super 1.2 [4/2] [UU__]
      [===>.................]  recovery = 18.0% (352320/1949632) finish=0.6min speed=44040K/sec
 
unused devices: <none>
root@debtest:~# cat /proc/mdstat
Personalities : [raid1]
md4 : active raid1 sda1[2] sdc1[4] sdd1[5] sdb1[3]
      1949632 blocks super 1.2 [4/4] [UUUU]
 
unused devices: <none>

Уменьшаем количество дисков в массиве RAID1 с 4 до 2

Помечаем диски как “упавшие”

root@debtest:~# mdadm --manage /dev/md4 --fail /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md4
root@debtest:~# mdadm --manage /dev/md4 --fail /dev/sdd1
mdadm: set /dev/sdd1 faulty in /dev/md4

Удаляем их из массива

root@debtest:~# mdadm -r /dev/md4 /dev/sdc1
mdadm: hot removed /dev/sdc1 from /dev/md4
root@debtest:~# mdadm -r /dev/md4 /dev/sdd1
mdadm: hot removed /dev/sdd1 from /dev/md4

Проверяем статус массива

root@debtest:~# cat /proc/mdstat
Personalities : [raid1]
md4 : active raid1 sda1[2] sdb1[3]
      1949632 blocks super 1.2 [4/2] [UU__]
 
unused devices: <none>

Уменьшаем количество дисков в массиве до двух

root@debtest:~# mdadm --grow /dev/md4 --raid-devices=2
raid_disks for /dev/md4 set to 2
root@debtest:~# cat /proc/mdstat
Personalities : [raid1]
md4 : active raid1 sda1[2] sdb1[3]
      1949632 blocks super 1.2 [2/2] [UU]
 
unused devices: <none>

Как grub определяет mduuid

Вы могли обратить внимание, что в новом, сгенерированном конфиге загрузчика, присутствует строка:

set root='(mduuid/a3c152c44e443f585b07bb171d1761bc)'

в то время как blkid других томов, а также самого /dev/md4 совершенно другие. Откуда груб берёт этот идентификатор? – из свойств зеркала, которые можно получить командой

root@debiantest:/boot/grub# mdadm -D /dev/md4
/dev/md4:
        Version : 1.2
  Creation Time : Wed May 14 08:34:49 2014
     Raid Level : raid1
     Array Size : 1954752 (1909.26 MiB 2001.67 MB)
  Used Dev Size : 1954752 (1909.26 MiB 2001.67 MB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent
 
    Update Time : Thu May 15 06:54:36 2014
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0
 
           Name : debiantest:4  (local to host debiantest)
           UUID : a3c152c4:4e443f58:5b07bb17:1d1761bc
         Events : 472
 
    Number   Major   Minor   RaidDevice State
       2       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1

One thought on “Создаём raid зеркало в debian с помощью mdadm

  1. Pingback: Восстанавливаем raid mdadm в debian | фармалин

Leave a Reply

Your email address will not be published. Required fields are marked *