Настройка программного RAID1 на работающей системе (включая конфигурацию GRUB)

Материал из support.qbpro.ru

Настройка программного RAID1 на работающей системе (включая конфигурацию GRUB)

Оригинал: How To Set Up Software RAID1 On A Running System (Incl. GRUB Configuration) Автор: Falko Timme Дата: 26 ноября 2007 Перевод: Андрей Синицын aka boombick Дата перевода: 15 февраля 2008

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

В этой статье описывается настройка RAID1-массива на уже установленном и запущенном Debian Etch с конфигурацией загрузчика GRUB для корректной загрузки системы даже в том случае, если один из винчестеров поврежден.

Я не даю никаких гарантий того, что это будет работать на вашей системе.

Предварительные замечания

Все действия описаны для Debian Etch, с двумя жесткими дисками одинакового размера: /dev/sda и /dev/sdb. /dev/sdb пока не используется, /dev/sda размечен следующим образом:

  • /dev/sda1 - /boot, файловая система ext3
  • /dev/sda2 - swap
  • /dev/sda3 - /, файловая система ext3

В итоге мы хотим получить следующую конфигурацию:

  • /dev/md0 (составлен из /dev/sda1 и /dev/sdb1) - /boot, ext3
  • /dev/md1 (составлен из /dev/sda2 и /dev/sdb2) - swap
  • /dev/md2 (составлен из /dev/sda3 и /dev/sdb3) - /, ext3

Текущая ситуация выглядит следующим образом:


server1:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             4.4G  729M  3.4G  18% /
tmpfs                 126M     0  126M   0% /lib/init/rw
udev                   10M   56K   10M   1% /dev
tmpfs                 126M     0  126M   0% /dev/shm
/dev/sda1             137M   12M  118M  10% /boot
server1:~# fdisk -l
Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          18      144553+  83  Linux
/dev/sda2              19          80      498015   82  Linux swap / Solaris
/dev/sda3              81         652     4594590   83  Linux
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table

Установка mdadm

mdadm - это утилита для построения программных RAID-массивов. Установите ее командой

apt-get install initramfs-tools mdadm

Вам будет задан следующий вопрос:

MD arrays needed for the root filesystem <-- all

(далее в тексте ответы на вопросы утилит будут выделяться красным цветом)

Затем подгрузите необходимые модули ядра (чтобы избежать перезагрузки):

modprobe md
modprobe linear
modprobe multipath
modprobe raid0
modprobe raid1
modprobe raid5
modprobe raid6
modprobe raid10

И выполните команду

cat /proc/mdstat

Вывод должен быть примерно следующим:


server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices: 
server1:~#

Подготовка /dev/sdb

Для создания RAID1 нам необходимо подготовить второй жесткий диск (/dev/sdb), скопировать на него все данные с /dev/sda и добавить его в массив.

Сначала скопируем таблицу разделов


server1:~# sfdisk -d /dev/sda | sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK
Disk /dev/sdb: 652 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   *        63    289169     289107  83  Linux
/dev/sdb2        289170   1285199     996030  82  Linux swap / Solaris
/dev/sdb3       1285200  10474379    9189180  83  Linux
/dev/sdb4             0         -          0   0  Empty
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).)
server1:~#

Проверим, что оба диска имеют одинаковую таблицу:


server1:~# fdisk -l
Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          18      144553+  83  Linux
/dev/sda2              19          80      498015   82  Linux swap / Solaris
/dev/sda3              81         652     4594590   83  Linux
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1          18      144553+  83  Linux
/dev/sdb2              19          80      498015   82  Linux swap / Solaris
/dev/sdb3              81         652     4594590   83  Linux
server1:~#

Теперь изменим тип разделов на втором жестком диске на Linux raid autodetect


server1:~# fdisk /dev/sdb
Command (m for help): <-- t
Partition number (1-4): <-- 1
Hex code (type L to list codes): <-- L
 0  Empty           1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot
 1  FAT12           24  NEC DOS         81  Minix / old Lin bf  Solaris
 2  XENIX root      39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 5  Extended        41  PPC PReP Boot   85  Linux extended  c7  Syrinx
 6  FAT16           42  SFS             86  NTFS volume set da  Non-FS data
 7  HPFS/NTFS       4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
 8  AIX             4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility
 9  AIX bootable    4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt
 a  OS/2 Boot Manag 50  OnTrack DM      93  Amoeba          e1  DOS access
 b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O
 c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          e4  SpeedStor
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  EFI GPT
10  OPUS            55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       a9  NetBSD          f4  SpeedStor
16  Hidden FAT16    63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fd  Linux raid auto
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fe  LANstep
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid ff  BBT
1c  Hidden W95 FAT3 75  PC/IX
Hex code (type L to list codes): <-- fd
Changed system type of partition 1 to fd (Linux raid autodetect)
Command (m for help): <-- t
Partition number (1-4): <-- 2
Hex code (type L to list codes): <-- fd
Changed system type of partition 2 to fd (Linux raid autodetect)
Command (m for help): <-- t
Partition number (1-4): <-- 3
Hex code (type L to list codes): <-- fd
Changed system type of partition 3 to fd (Linux raid autodetect)
Command (m for help): <-- w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
server1:~#

Чтобы быть уверенным, что на /dev/sdb не осталось никаких следов от возможных предыдущих установок RAID-массивов, выполните следующие команды:

mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdb3

Если никаких остатков предыдущих установок RAID не обнаружится, то каждая из приведенных выше команд mdadm выдаст ошибку (не надо беспокоиться) примерно следующего вида:

server1:~# mdadm --zero-superblock /dev/sdb1
mdadm: Unrecognised md component device - /dev/sdb1
server1:~# 

В противном случае никакого вывода не будет.

Создание RAID-массива

Пришло время для создания самих массивов: /dev/md0, /dev/md1, и /dev/md2. /dev/sdb1 будет добавлен в /dev/md0, /dev/sdb2 в /dev/md1 и /dev/sdb3 в /dev/md2. Разделы на первом диске мы пока не трогаем, так как с него загружена система. Мы будем использовать указатель missing при создании массива:

mdadm --create /dev/md0 --level=1 --metadata=1.2 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --metadata=1.2 --raid-disks=2 missing /dev/sdb2
mdadm --create /dev/md2 --level=1 --metadata=1.2 --raid-disks=2 missing /dev/sdb3

Проверка состояния нашего массива должна показать, что у нас есть три поврежденных RAID-массива ([_U] или [U_] означает, что массив поврежден, а [UU] означает, что все в порядке):


server1:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[1]
      4594496 blocks [2/1] [_U]
md1 : active raid1 sdb2[1]
      497920 blocks [2/1] [_U]
md0 : active raid1 sdb1[1]
      144448 blocks [2/1] [_U]
unused devices: 
server1:~# 

Теперь создадим файловые системы на массивах

mkfs.ext3 /dev/md0
mkswap /dev/md1
mkfs.ext3 /dev/md2

и отредактируем конфигурационный файл /etc/mdadm/mdadm.conf

cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
mdadm --examine --scan >> /etc/mdadm/mdadm.conf

Он должен выглядеть примерно так (в последних строках расположена информация о наших массивах):

# cat /etc/mdadm/mdadm.conf


# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#
# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
DEVICE partitions
# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes
# automatically tag new arrays as belonging to the local system
HOMEHOST 
# instruct the monitoring daemon where to send mail alerts
MAILADDR root
# This file was auto-generated on Mon, 26 Nov 2007 21:22:04 +0100
# by mkconf $Id: mkconf 261 2006-11-09 13:32:35Z madduck $
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=72d23d35:35d103e3:01b5209e:be9ff10a
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=a50c4299:9e19f9e4:01b5209e:be9ff10a
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=99fee3a5:ae381162:01b5209e:be9ff10a

Подготовка и перенос данных

Смонтируем массивы (swap монтировать, естественно, не надо):

mkdir /mnt/md0
mkdir /mnt/md2
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2

и отредактируем файлы /etc/fstab и /etc/mtab. Заменим /dev/sda1 на /dev/md0, /dev/sda2 на /dev/md1 и /dev/sda3 на /dev/md2, чтобы эти файлы приняли следующий вид:


# cat /etc/fstab
# /etc/fstab: static file system information.
#
#                    
proc            /proc           proc        defaults        0       0
/dev/md2        /               ext3        defaults,errors=remount-ro 0       1
/dev/md0        /boot           ext3        defaults        0       2
/dev/md1        none            swap        sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto        rw,user,noauto  0       0
# cat /etc/mtab
/dev/md2 / ext3 rw,errors=remount-ro 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
udev /dev tmpfs rw,mode=0755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0
/dev/md0 /boot ext3 rw 0 0

Пришло время для настройки GRUB. Откройте файл /boot/grub/menu.lst и добавьте опцию fallback сразу после default

[...]
default         0
fallback        1
[...]

Это значит, что если первое ядро (нумерация начинается с нуля) не сможет загрузиться, то будет загружено следующее в списке. В конце этого файла расположены блоки, описывающие параметры ядер для загрузки. Скопируйте первый блок, замените в копии root=/dev/sda3 на root=/dev/md2 и root (hd0,0) на root (hd1,0), после чего поставьте полученный блок первым в списке. После редактирования файл должен выглядеть примерно так:


[...]
## ## End Default Options ##
title           Debian GNU/Linux, kernel 2.6.18-4-486 RAID (hd1)
root            (hd1,0)
kernel          /vmlinuz-2.6.18-4-486 root=/dev/md2 ro
initrd          /initrd.img-2.6.18-4-486
savedefault
title           Debian GNU/Linux, kernel 2.6.18-4-486
root            (hd0,0)
kernel          /vmlinuz-2.6.18-4-486 root=/dev/sda3 ro
initrd          /initrd.img-2.6.18-4-486
savedefault
title           Debian GNU/Linux, kernel 2.6.18-4-486 (single-user mode)
root            (hd0,0)
kernel          /vmlinuz-2.6.18-4-486 root=/dev/sda3 ro single
initrd          /initrd.img-2.6.18-4-486
savedefault
### END DEBIAN AUTOMAGIC KERNELS LIST

root (hd1,0) ссылается на диск /dev/sdb, который уже входит в RAID-массив. Вскоре мы будем перезагружать систему, при этом система попытается загрузиться с нашего (все еще поврежденного) массива /dev/md2. В случае неудачи загрузка продолжится со следующего по списку раздела /dev/sda (-> fallback 1).

Теперь обновим RAM-диск

update-initramfs -u

И скопируем данные на /dev/sdb

cp -dpRx / /mnt/md2
cd /boot
cp -dpRx . /mnt/md0

Настройка GRUB

Теперь необходимо установить загрузчик на второй винчестер. Все последующие команды (выделены красным) выполняются в оболочке GRUB (она запускается командой grub):

grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/menu.lst"... succeeded
Done.
grub> root (hd1,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd1)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd1) (hd1)1+15 p (hd1,0)/grub/stage2 /grub/menu.lst"... succeeded
Done.
grub> quit

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

reboot

и надеемся, что наша система загрузится с RAID-массива :)

Подготовка /dev/sda

Если все прошло нормально, то вы должны увидеть /dev/md0 и /dev/md2 в выводе команды df -h

server1:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/md2              4.4G  730M  3.4G  18% /
tmpfs                 126M     0  126M   0% /lib/init/rw
udev                   10M   68K   10M   1% /dev
tmpfs                 126M     0  126M   0% /dev/shm
/dev/md0              137M   17M  114M  13% /boot
server1:~#

Вывод cat /proc/mdstat должен быть примерно таким:

server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[1]
      4594496 blocks [2/1] [_U]
md1 : active raid1 sdb2[1]
      497920 blocks [2/1] [_U]
md0 : active raid1 sdb1[1]
      144448 blocks [2/1] [_U]
unused devices: 
server1:~#

Теперь изменим тип разделов на /dev/sda на Linux raid autodetect


server1:~# fdisk /dev/sda
Command (m for help): <-- t
Partition number (1-4): <-- 1
Hex code (type L to list codes): <-- fd
Changed system type of partition 1 to fd (Linux raid autodetect)
Command (m for help): <-- t
Partition number (1-4): <-- 2
Hex code (type L to list codes): <-- fd
Changed system type of partition 2 to fd (Linux raid autodetect)
Command (m for help): <-- t
Partition number (1-4): <-- 3
Hex code (type L to list codes): <-- fd
Changed system type of partition 3 to fd (Linux raid autodetect)
Command (m for help): <-- w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

Добавим /dev/sda1, /dev/sda2 и /dev/sda3 в RAID-массив

mdadm --add /dev/md0 /dev/sda1
mdadm --add /dev/md1 /dev/sda2
mdadm --add /dev/md2 /dev/sda3

И проверим состояние массива. Вы должны увидеть, что идет процесс синхронизации server1:~# cat /proc/mdstat Personalities : [raid1] md2 : active raid1 sda3[2] sdb3[1] 4594496 blocks [2/1] [_U] [=====>...............] recovery = 29.7% (1367040/4594496) finish=0.6min speed=85440K/sec md1 : active raid1 sda2[0] sdb2[1] 497920 blocks [2/2] [UU] md0 : active raid1 sda1[0] sdb1[1] 144448 blocks [2/2] [UU] unused devices: <none> server1:~# (Вы можете запустить watch cat /proc/mdstat для наблюдения за ходом процесса. Выход из watch осуществляется нажатием CTRL+C.)

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

server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0] sdb3[1]
      4594496 blocks [2/2] [UU]
md1 : active raid1 sda2[0] sdb2[1]
      497920 blocks [2/2] [UU]
md0 : active raid1 sda1[0] sdb1[1]
      144448 blocks [2/2] [UU]
unused devices: 
server1:~#

Затем отредактируем /etc/mdadm/mdadm.conf, чтобы он соотвествовал новой ситуации.

cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf
mdadm --examine --scan >> /etc/mdadm/mdadm.conf

Теперь он выглядит так:


# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#
# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
DEVICE partitions
# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes
# automatically tag new arrays as belonging to the local system
HOMEHOST 
# instruct the monitoring daemon where to send mail alerts
MAILADDR root
# This file was auto-generated on Mon, 26 Nov 2007 21:22:04 +0100
# by mkconf $Id: mkconf 261 2006-11-09 13:32:35Z madduck $
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=72d23d35:35d103e3:2b3d68b9:a903a704
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=a50c4299:9e19f9e4:2b3d68b9:a903a704
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=99fee3a5:ae381162:2b3d68b9:a903a704

Настройка GRUB (Часть 2)

Почти все готово. Теперь отредактируем /boot/grub/menu.lst. На данный момент GRUB настроен на загрузку с /dev/sdb (hd1,0). Конечно же, мы все еще хотим, чтобы система грузилась, если /dev/sdb содержит какие-то ошибки. Создадаим копию первого блока с описанием параметров загрузки (в котором описан hd1), вставим ее ниже и заменим в этом блоке hd1 на hd0. Остальные блоки закомментируем. Теперь конфиг загрузчика должен выглядеть примерно так:

[...]
## ## End Default Options ##
title           Debian GNU/Linux, kernel 2.6.18-4-486 RAID (hd1)
root            (hd1,0)
kernel          /vmlinuz-2.6.18-4-486 root=/dev/md2 ro
initrd          /initrd.img-2.6.18-4-486
savedefault
title           Debian GNU/Linux, kernel 2.6.18-4-486 RAID (hd0)
root            (hd0,0)
kernel          /vmlinuz-2.6.18-4-486 root=/dev/md2 ro
initrd          /initrd.img-2.6.18-4-486
savedefault
#title          Debian GNU/Linux, kernel 2.6.18-4-486
#root           (hd0,0)
#kernel         /vmlinuz-2.6.18-4-486 root=/dev/sda3 ro
#initrd         /initrd.img-2.6.18-4-486
#savedefault
#title          Debian GNU/Linux, kernel 2.6.18-4-486 (single-user mode)
#root           (hd0,0)
#kernel         /vmlinuz-2.6.18-4-486 root=/dev/sda3 ro single
#initrd         /initrd.img-2.6.18-4-486
#savedefault
### END DEBIAN AUTOMAGIC KERNELS LIST

В строке, начинающейся с kopt замените /dev/sda3 на /dev/md2 (НЕ УДАЛЯЙТЕ символ # из начала строки!!!)

[...]
# kopt=root=/dev/md2 ro
[...]

Обновляем RAM-диск и перезагружаемся:

# update-initramfs -u
# reboot

Загрузка должна пройти без проблем:


Все работает, мы только что настроили программный RAID-массив первого уровня на работающей системе Debian Etch!

Тестирование

Давайте попробуем сэмулировать сбой жесткого диска. Абсолютно неважно, как ой из дисков вы выберите для эксперимента. Я выбрал /dev/sdb Для эмуляции сбоя необходимо либо остановить систему и физически удалить второй винчестер (/dev/sdb) из компьютера, либо сэмулировать это на программном уровне:

mdadm --manage /dev/md0 --fail /dev/sdb1
mdadm --manage /dev/md1 --fail /dev/sdb2
mdadm --manage /dev/md2 --fail /dev/sdb3
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm --manage /dev/md1 --remove /dev/sdb2
mdadm --manage /dev/md2 --remove /dev/sdb3

Выключите компьютер. Если вы физически удаляли винчестер, то поместите на его место новый. Загрузка должна пройти без проблем. Посмотрим статус нашего массива:

server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0]
      4594496 blocks [2/1] [U_]
md1 : active raid1 sda2[0]
      497920 blocks [2/1] [U_]
md0 : active raid1 sda1[0]
      144448 blocks [2/1] [U_]
unused devices: 
server1:~#

Видно, что массив опять поврежден. Состояние разделов должно быть примерно следующим:


server1:~# fdisk -l
Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          18      144553+  fd  Linux raid autodetect
/dev/sda2              19          80      498015   fd  Linux raid autodetect
/dev/sda3              81         652     4594590   fd  Linux raid autodetect
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/md0: 147 MB, 147914752 bytes
2 heads, 4 sectors/track, 36112 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md0 doesn't contain a valid partition table
Disk /dev/md1: 509 MB, 509870080 bytes
2 heads, 4 sectors/track, 124480 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md1 doesn't contain a valid partition table
Disk /dev/md2: 4704 MB, 4704763904 bytes
2 heads, 4 sectors/track, 1148624 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md2 doesn't contain a valid partition table
server1:~#

Теперь скопируем таблицу разделов с /dev/sda на /dev/sdb (В случае ошибок попробуйте опцию --force)


server1:~# sfdisk -d /dev/sda | sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK
Disk /dev/sdb: 652 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   *        63    289169     289107  fd  Linux raid autodetect
/dev/sdb2        289170   1285199     996030  fd  Linux raid autodetect
/dev/sdb3       1285200  10474379    9189180  fd  Linux raid autodetect
/dev/sdb4             0         -          0   0  Empty
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).)
server1:~#

Удаляем с /dev/sdb предыдущие установки RAID


mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdb3

... и добавляем /dev/sdb в массив:

mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb2
mdadm -a /dev/md2 /dev/sdb3

Если посмотреть на статус массива, то мы увидим знакомый процесс синхронизации server1:~# cat /proc/mdstat Personalities : [raid1] md2 : active raid1 sdb3[2] sda3[0] 4594496 blocks [2/1] [U_] [======>..............] recovery = 30.8% (1416256/4594496) finish=0.6min speed=83309K/sec md1 : active raid1 sdb2[1] sda2[0] 497920 blocks [2/2] [UU] md0 : active raid1 sdb1[1] sda1[0] 144448 blocks [2/2] [UU] unused devices: <none> server1:~# По окончании синхронизации настроим загрузчик на новом винчестере

root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit

И все! Сбойный жесткий диск в RAID-массиве успешно заменен без потери данных.

Удаление программного (software) массива RAID.

Предположим, что:

с помощью mdadm был создан массив RAID5 /dev/md0 из 3-х разделов 3-х SATA-дисков;

/dev/md0 смонтирован на точку /var/spool/avreg.

1. Останавливаем все процессы, которые могут работать с файлами в /var/spool/avreg.

  • Вывести список таких процессов поможет утилита fuser из пакета psmisc
fuser -mv /var/spool/avreg

2. Отмонтируем подключенное устройство RAID.

umount /var/spool/avreg

3. Останавливаем массив.

mdadm -S /dev/md0

4. Очищаем суперблоки RAID на разделах из которого собран массив.

mdadm --zero-superblock /dev/sda1
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdc1