Как перенести уже установленную систему на 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 |
Pingback: Восстанавливаем raid mdadm в debian | фармалин