Инструменты пользователя

Инструменты сайта


linux:softraid

Оригинал: http://alexr.me/index.php?option=com_content&view=article&id=109:-raid1-centos-53-grub&catid=1:linux&Itemid=5

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

Данное руководство показывает, как создать программный массив RAID1 на уже установленной и работающей системе CentOS 5.3. Загрузчик GRUB будет настроен таким образом, чтобы при выходе из строя одного из дисков (любого) система все равно запускалась.

1 Введение

В этом руководстве я использую систему CentOS 5.3 с двумя одинаковыми по размеру жесткими дисками, /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)

А вот что имеем сейчас:

[root@server1 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             9.1G  1.1G  7.6G  12% /
/dev/sda1             190M   12M  169M   7% /boot
tmpfs                 252M     0  252M   0% /dev/shm
[root@server1 ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          25      200781   83  Linux
/dev/sda2              26          90      522112+  82  Linux swap / Solaris
/dev/sda3              91        1305     9759487+  83  Linux
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table

2 Установка mdadm

Для создания RAID будем использовать утилиту mdadm. Давайте установим ее:

yum install mkinitrd mdadm

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

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

Теперь запускаем cat /proc/mdstat, на выходе должны получить следующее:

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

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

Для создания массива RAID1 на нашей уже запущенной системе, необходимо подготовить диск /dev/sdb к данной процедуре, затем скопировать на него содержимое /dev/sda и только после этого наконец добавить /dev/sda к массиву.

Сначала мы копируем таблицу разделов диска /dev/sda на диск /dev/sdb, чтобы оба диска имели абсолютно идентичную разметку:

sfdisk -d /dev/sda | sfdisk /dev/sdb

На выходе должны получить следующее:

[root@server1 ~]# sfdisk -d /dev/sda | sfdisk /dev/sdb
Checking that no-one is using this disk right now ...
OK
Disk /dev/sdb: 1305 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    401624     401562  83  Linux
/dev/sdb2        401625   1445849    1044225  82  Linux swap / Solaris
/dev/sdb3       1445850  20964824   19518975  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).)

Команда fdisk -l должна теперь показать идентичную разметку обоих дисков:

[root@server1 ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          25      200781   83  Linux
/dev/sda2              26          90      522112+  82  Linux swap / Solaris
/dev/sda3              91        1305     9759487+  83  Linux

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1          25      200781   83  Linux
/dev/sdb2              26          90      522112+  82  Linux swap / Solaris
/dev/sdb3              91        1305     9759487+  83  Linux

Далее необходимо изменить тип всех трех разделов /dev/sdb на Linux raid autodetect:

[root@server1 ~]# fdisk /dev/sdb
The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs
 (e.g., DOS FDISK, OS/2 FDISK)

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
 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): <==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/
12  Compaq diagnost    5c    Priam Edisk        a8    Darwin UFS        f1    SpeedStor
11  Hidden FAT12    56    Golden Bow        a7    NeXTSTEP        f0    Linux/PA-RISC b
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.
Чтобы убедиться в том, что на диске /dev/sdb не осталось ничего от возможных предыдущих установок RAID, выполняем следующие команды:

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

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

[root@server1 ~]# mdadm --zero-superblock /dev/sdb1
mdadm: Unrecognised md component device - /dev/sdb1
Иначе же команды вообще ничего не отобразят.

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

Теперь давайте перейдем к созданию наших RAID массивов /dev/md0, /dev/md1 и /dev/md2. /dev/sdb1 будет добавлен к /dev/md0, /dev/sdb2 к /dev/md1, а /dev/sdb3 - к /dev/md2. /dev/sda1, /dev/sda2 и /dev/sda3 нельзя добавить к массиву сразу - на них сейчас запущена система - поэтому мы используем заполнитель missing в следующих трех командах:

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

Команда cat /proc/mdstat должна сейчас показать, что мы имеем три деградированных RAID массива ([_U] или [U_] означает, что массив деградированный, тогда как [UU] означает, что с массивом все в порядке):

[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[1]
 9759360 blocks [2/1] [_U]

md1 : active raid1 sdb2[1]
522048 blocks [2/1] [_U]

md0 : active raid1 sdb1[1]
200704 blocks [2/1] [_U]

unused devices: <none>

Следующий шаг - создание файловых систем на наших массивах (ext3 на /dev/md0 и /dev/md2, swap на /dev/md1):

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

Теперь создаем /etc/mdadm.conf следующим образом:

mdadm --detail --scan > /etc/mdadm.conf

Отображаем содержимое файла:

cat /etc/mdadm.conf

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

ARRAY /dev/md0 level=raid1 num-devices=2 UUID=78d582f0:940fabb5:f1c1092a:04a55452
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=8db8f7e1:f2a64674:d22afece:4a539aa7
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=1baf282d:17c58efd:a8de6947:b0af9792

Настройка системы под RAID1

Приступаем к монтированию /dev/md0 и /dev/md2 (естественно, swap массив /dev/md1 монтировать не нужно):

[root@server1 ~]#mkdir /mnt/md0
mkdir /mnt/md2
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2

Оба массива должны быть видны при выводе команды mount:

[root@server1 ~]# mount
/dev/sda3 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/md0 on /mnt/md0 type ext3 (rw)
/dev/md2 on /mnt/md2 type ext3 (rw)

CentOS 5.x

Отредактируем /etc/fstab. Заменим LABEL=/boot на /dev/md0, LABEL=SWAP-sda2 на /dev/md1, LABEL=/ на /dev/md2, чтобы файл при выводе (vi /etc/fstab) выглядел вот так:

/dev/md0         /boot           ext3        defaults           1 2
/dev/md2         /               ext3        defaults           1 1
tmpfs            /dev/shm        tmpfs       defaults           0 0
devpts           /dev/pts        devpts      gid=5,mode=620     0 0
sysfs            /sys            sysfs       defaults           0 0
proc             /proc           proc        defaults           0 0
/dev/md1         swap            swap        defaults           0 0

Идем дальше. Заменяем /dev/sda1 на /dev/md0, а /dev/sda3 на /dev/md2 в файле /etc/mtab:

vi /etc/mtab
/dev/md2   /                         ext3        rw                0 0
proc       /proc                     proc        rw                0 0
sysfs      /sys                      sysfs       rw                0 0<
devpts     /dev/pts                  devpts      rw,gid=5,mode=620 0 0
/dev/md0   /boot                     ext3        rw                0 0
tmpfs      /dev/shm                  tmpfs       rw                0 0
none       /proc/sys/fs/binfmt_misc  binfmt_misc rw                0 0
sunrpc     /var/lib/nfs/rpc_pipefs   rpc_pipefs  rw                0 0

Настало время GRUB. Открываем /boot/grub/menu.lst и добавляем fallback=1 сразу после default=0:

vi /boot/grub/menu.lst
[...]
default=0
fallback=1 [...]

Этим мы указываем, чтобы в случае ошибки загрузки первого ядра (отсчет идет с 0, так что первое ядро имеет номер 0) загружалось второе.

В конце того же файла находятся блоки с описанием параметров ядер для загрузки. Копируем первый блок и вставляем его самым первым по списку, при этом заменив в нем root=LABEL=/ на root=/dev/md2 и root (hd0,0) на root (hd1,0):

[...]
title CentOS (2.6.18-128.el5)
root (hd1,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/md2
initrd /initrd-2.6.18-128.el5.img
title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=initrd /initrd-2.6.18-128.el5.img

После всех этих махинаций файл должен выглядеть примерно так:

grub> root (hd0,0)
# grub.conf generated by anaconda
## Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda3
# initrd /initrd-version.img
#boot=/dev/sda 
default=0 
fallback=1 
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-128.el5)
root (hd1,0) 
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/md2
initrd /initrd-2.6.18-128.el5.imgesystem type is ext2fs, partition type 0x83

title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=initrd /initrd-2.6.18-128.el5.img
root (hd1,0) ссылается на /dev/sdb, который уже является частью нашего RAID массива. Скоро мы перезагрузим систему: она попытается загрузиться с нашего (все еще деградированного) массива; если не получится, она загрузится с раздела /dev/sda (-> fallback 1).

Далее подстроим наш RAM-диск под новую ситуацию:

mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig
mkinitrd /boot/initrd-`uname -r`.img `uname -r`

После чего скопируем содержимое /dev/sda1 и /dev/sda3 на /dev/md0 и /dev/md2 соответственно (последние сейчас смонтированы на /mnt/md0 и /mnt/md2):

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

CentOS 6.x

Отличия настройки CentOS 5.x от CentOS 6.x состоит в том, что вместо меток (LABEL) система использует UUID устройств

Подготовимся к изменению /etc/fstab и /boot/grub/menu.lst

# blkid | grep md
/dev/md0: UUID="4dec12fd-0eea-461b-bd08-f9bb420f33b8" TYPE="ext2"
/dev/md1: UUID="9fcb5fff-668a-4f41-a86b-4919074a9f9a" TYPE="ext4"
/dev/md2: UUID="7152a1aa-5ad7-45d2-b801-5718ce05ba4e" TYPE="swap"

Редактируем /etc/fstab, заменяя все UUID устройства на нужные нам.

Добавим sdb устройство в device map для установки grub на него и приведем его к виду:

# cat /boot/grub/device.map
# this device map was generated by anaconda
(hd0)     /dev/sda
(hd1)     /dev/sdb

Переливаем все данные с текущего устройства /dev/sda на /dev/md

mount /dev/md0 /mnt/md0
mount /dev/md1 /mnt/md1

:!: слеши на концах папок обязательны!

rsync -aqxP / /mnt/md1/
rsync -aqxP /boot/ /mnt/md0/

Устанавливаем загрузчик на sdb

grub-install /dev/sdb

Правим /boot/grub/menu.lst

Приводим секцию к виду:

title CentOS Linux (2.6.32-71.29.1.el6.x86_64) MD
        root (hd1,0)
        kernel /vmlinuz-2.6.32-71.29.1.el6.x86_64 ro root=UUID=5870dbe5-145b-4cf5-bf22-382405328a17 rd_NO_LUKS rd_NO_LVM rd_MD_UUID=17074147:5a01c3b4:752a1b46:80d50cc6 rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb
        initrd /initramfs-2.6.32-71.29.1.el6.x86_64.img

Где UUID - это UUID раздела /

Подготовка GRUB (часть 1)

Теперь необходимо установить GRUB на второй жесткий диск, /dev/sdb. Запускаем оболочку (grub) и вводим следующие команды:

root (hd0,0)

grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83

grub>

setup (hd0)

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/grub.conf"... succeeded
 Done.

grub>

root (hd1,0)

grub> root (hd1,0)
 Filesystem type is ext2fs, partition type 0xfd

grub>

setup (hd1)

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/grub.conf"... succeeded
 Done.

grub>

quit

Теперь, уже в «нормальной» оболочке, перезагрузим систему и будем надеяться, что она нормально загрузится с нашего RAID массива:

reboot

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

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

[root@server1 ~]# df -h
Filesystem  Size  Used Avail Use% Mounted on

Вывод команды cat /proc/mdstat должен выглядеть так:

[root@server1 ~]# cat /proc/mdstat<br /> Personalities : [raid1]
 md0 : active raid1 sdb1[1]
 200704 blocks [2/1] [_U]

md1 : active raid1 sdb2[1]
522048 blocks [2/1] [_U]

md2 : active raid1 sdb3[1]
9759360 blocks [2/1] [_U]

unused devices: <none>

Теперь нужно изменить типы всех трех разделов /dev/sda на уже знакомый нам Linux raid autodetect:

[root@server1 ~]# fdisk /dev/sda

The number of cylinders for this disk is set to 1305.
There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

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

Выполните команду cat /proc/mdstat и вы должны увидеть, что идет процесс синхронизации массивов:

[root@server1 ~]# cat /proc/mdstat
 Personalities : [raid1]<br /> md0 : active raid1 sda1[0] sdb1[1]
 200704 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
522048 blocks [2/2] [UU]

md2 : active raid1 sda3[2] sdb3[1]
9759360 blocks [2/1] [_U]
[====>................]  recovery = 22.8% (2232576/9759360) finish=2.4min speed=50816K/sec

unused devices: <none>

(Можно выполнить watch cat /proc/mdstat для наблюдения за ходом процесса. Остановить watch можно, нажав CTRL+C)

Дождитесь окончания синхронизации. После этого все должно выглядеть следующим образом:

[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0] sdb1[1]
 200704 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
522048 blocks [2/2] [UU]

md2 : active raid1 sda3[0] sdb3[1]
9759360 blocks [2/2] [UU]

unused devices: <none>

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

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

В результате содержимое файла должно выглядеть так:

cat /etc/mdadm.conf

ARRAY /dev/md0 level=raid1 num-devices=2 UUID=78d582f0:940fabb5:f1c1092a:04a55452
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=8db8f7e1:f2a64674:d22afece:4a539aa7
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=1baf282d:17c58efd:a8de6947:b0af9792

Подготовка GRUB (часть 2)

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

vi /boot/grub/menu.lst

# grub.conf generated by anaconda 
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)<br /> # kernel /vmlinuz-version ro root=/dev/sda3
# initrd /initrd-version.img 
#boot=/dev/sda
#default=0 
#fallback=1
#timeout=5
#splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu
#title CentOS (2.6.18-128.el5)
#root (hd1,0)
#kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/md2
#initrd /initrd-2.6.18-128.el5.img

title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/md2
initrd /initrd-2.6.18-128.el5.img

#title CentOS (2.6.18-128.el5)
# root (hd0,0)
# kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/
# initrd /initrd-2.6.18-128.el5.img

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

mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig2
mkinitrd /boot/initrd-`uname -r`.img `uname -r`

… и перезагрузимся:

reboot

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

Вот и всё - мы успешно создали и настроили программный массив RAID1 на работающей CentOS 5.3!

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

Что ж, давайте симулируем отказ жесткого диска. Неважно, какого именно - /dev/sda или /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

Выключаем систему:

shutdown -h now

Вставляем новый диск /dev/sdb (если вы симулируете отказ /dev/sda, то сейчас вы должны установить /dev/sdb на место /dev/sda, а новый HDD подключить как /dev/sdb!) и включаем машину. Всё должно загрузиться без проблем.

Теперь выполним cat /proc/mdstat и видим, что у нас снова имеется деградированный массив:

[root@server1 ~]# cat /proc/mdstat
 Personalities : [raid1]
 md0 : active raid1 sda1[0]
 200704 blocks [2/1] [U_]

md1 : active raid1 sda2[0]
522048 blocks [2/1] [U_]

md2 : active raid1 sda3[0]
9759360 blocks [2/1] [U_]

unused devices: <none>

Вывод fdisk -l должен выглядеть так:

[root@server1 ~]# fdisk -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          25      200781   fd  Linux raid autodetect
/dev/sda2              26          90      522112+  fd  Linux raid autodetect
/dev/sda3              91        1305     9759487+  fd  Linux raid autodetect

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/md2: 9993 MB, 9993584640 bytes
2 heads, 4 sectors/track, 2439840 cylinders
Units = cylinders of 8 * 512 = 4096 bytes

Disk /dev/md2 doesn't contain a valid partition table

Disk /dev/md1: 534 MB, 534577152 bytes
2 heads, 4 sectors/track, 130512 cylinders
Units = cylinders of 8 * 512 = 4096 bytes

Disk /dev/md1 doesn't contain a valid partition table

Disk /dev/md0: 205 MB, 205520896 bytes
2 heads, 4 sectors/track, 50176 cylinders
Units = cylinders of 8 * 512 = 4096 bytes

Disk /dev/md0 doesn't contain a valid partition table

Копируем таблицу разделов c /dev/sda на /dev/sdb:

sfdisk -d /dev/sda | sfdisk /dev/sdb

Если появляется ошибка, попробуйте запустить с параметром –force:

[root@server1 ~]#sfdisk -d /dev/sda | sfdisk --force /dev/sdb

[root@server1 ~]# cat /proc/mdstat
 Personalities : [raid1]
 md0 : active raid1 sdb1[1] sda1[0]
 200704 blocks [2/2] [UU]

Disk /dev/sdb: 1305 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    401624     401562  fd  Linux raid autodetect
/dev/sdb2        401625   1445849    1044225  fd  Linux raid autodetect
/dev/sdb3       1445850  20964824   19518975  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).)

Удаляем возможные следы предыдущих 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

Посмотрим, что нам покажет cat /proc/mdstat:

[root@server1 ~]# cat /proc/mdstat 
Personalities : [raid1]<br /> md0 : active raid1 sdb1[1] sda1[0]
 200704 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
522048 blocks [2/2] [UU]

md2 : active raid1 sdb3[2] sda3[0]
9759360 blocks [2/1] [U_]
[ =======>.............]  recovery = 39.4% (3846400/9759360) finish=1.7min speed=55890K/sec

unused devices: <none>

Ждем, пока закончится процесс синхронизации:

[root@server1 ~]# cat /proc/mdstat
 Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
  200704 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
522048 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
9759360 blocks [2/2] [UU]

unused devices: <none>

Запускаем grub и устанавливаем загрузчик на оба HDD:

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

Готово. Мы только что заменили отказавший жесткий диск в массиве RAID1.

Руководство по программным RAID массивам: http://tldp.org/HOWTO/Software-RAID-HOWTO.html

CentOS: http://www.centos.org/

Linux по русски: http://rus-linux.net/nlib.php?name=/MyLDP/sys-conf/RAID1_CentOS.html

linux/softraid.txt · Последнее изменение: 2011/10/19 12:20 — linko22@gmail.com