Оригинал: [[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: [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: Следующий шаг - создание файловых систем на наших массивах (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
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: Теперь нужно изменить типы всех трех разделов /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]
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: (Можно выполнить 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: Теперь отредактируем /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)
# 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: Вывод 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]
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: Ждем, пока закончится процесс синхронизации: [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: Запускаем grub и устанавливаем загрузчик на оба HDD: root (hd0,0) setup (hd0) root (hd1,0) setup (hd1) quit Готово. Мы только что заменили отказавший жесткий диск в массиве RAID1. ===== Links ===== Руководство по программным 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]]