Библиотека сайта rus-linux.net
Ошибка базы данных: Table 'a111530_forumnew.rlf1_users' doesn't exist
Настройка программного массива RAID1 на работающей системе CentOS 5.3 (включая настройку GRUB)
Оригинал: How To Set Up Software RAID1 On A Running System (Incl. GRUB Configuration) (CentOS 5.3)Автор: Falko Timme
Дата публикации: 22 сентября 2009 г.
Перевод: М.Ульянов
Дата перевода: декабрь 2009 г.
Данное руководство показывает, как создать программный массив 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)
А вот что имеем сейчас:
df -h
fdisk -l
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
, на выходе должны получить следующее:
3 Подготовка /dev/sdb
Для создания массива RAID1 на нашей уже запущенной системе, необходимо подготовить диск /dev/sdb
к данной процедуре, затем скопировать на него содержимое /dev/sda
и только после этого наконец добавить /dev/sda
к массиву.
Сначала мы копируем таблицу разделов диска /dev/sda
на диск /dev/sdb
, чтобы оба диска имели абсолютно идентичную разметку:
sfdisk -d /dev/sda | sfdisk /dev/sdb
На выходе должны получить следующее:
Команда fdisk -l
должна теперь показать идентичную разметку обоих дисков:
Далее необходимо изменить тип всех трех разделов /dev/sdb
на Linux raid autodetect
:
fdisk /dev/sdb
[root@server1 ~]# fdisk /dev/sdb
<-- m
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):
Command action
<-- t
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):
Partition number (1-4):
<-- 1
Hex code (type L to list codes):
<-- L
0 Empty 1e Hidden W95 FAT1 80 Old Minix bf Solaris
<-- fd
1 FAT12 24 NEC DOS 81 Minix / old Lin c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 82 Linux swap / So c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 83 Linux c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 84 OS/2 hidden C: c7 Syrinx
5 Extended 41 PPC PReP Boot 85 Linux extended da Non-FS data
6 FAT16 42 SFS 86 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set de Dell Utility
8 AIX 4e QNX4.x 2nd part 88 Linux plaintext df BootIt
9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi ee EFI GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a5 FreeBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a6 OpenBSD f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor a9 NetBSD f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
Hex code (type L to list codes):
Changed system type of partition 1 to fd (Linux raid autodetect)
<-- t
Command (m for help):
Partition number (1-4):
<-- 2
Hex code (type L to list codes):
<-- fd
Changed system type of partition 2 to fd (Linux raid autodetect)
<-- t
Command (m for help):
Partition number (1-4):
<-- 3
Hex code (type L to list codes):
<-- fd
Changed system type of partition 3 to fd (Linux raid autodetect)
<-- w
Command (m for help):
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@server1 ~]#
Чтобы убедиться в том, что на диске /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
[root@server1 ~]#
Иначе же команды вообще ничего не отобразят.
4 Создание 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
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3
Команда cat /proc/mdstat
должна сейчас показать, что мы имеем три деградированных RAID массива ([_U]
или [U_]
означает, что массив деградированный, тогда как [UU]
означает, что с массивом все в порядке):
Следующий шаг - создание файловых систем на наших массивах (ext3 на /dev/md0
и /dev/md2
, swap на /dev/md1
):
mkfs.ext3 /dev/md0
mkswap /dev/md1
mkfs.ext3 /dev/md2
Теперь создаем /etc/mdadm.conf
следующим образом:
mdadm --examine --scan > /etc/mdadm.conf
Отображаем содержимое файла:
cat /etc/mdadm.conf
В файле должна находиться подробная информация о нашей троице массивов (деградированных на данный момент):
5 Настройка системы под RAID1
Приступаем к монтированию /dev/md0
и /dev/md2
(естественно, swap массив /dev/md1
монтировать не нужно):
mkdir /mnt/md0
mkdir /mnt/md2
mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2
Оба массива должны быть видны при выводе команды mount
:
Отредактируем /etc/fstab
. Заменим LABEL=/boot
на /dev/md0
, LABEL=SWAP-sda2
на /dev/md1
, LABEL=/
на /dev/md2
, чтобы файл при выводе (vi /etc/fstab
) выглядел вот так:
Идем дальше. Заменяем /dev/sda1
на /dev/md0
, а /dev/sda3
на /dev/md2
в файле /etc/mtab
:
vi /etc/mtab
Настало время GRUB. Открываем /boot/grub/menu.lst
и добавляем fallback=1
сразу после default=0
:
vi /boot/grub/menu.lst
Этим мы указываем, чтобы в случае ошибки загрузки первого ядра (отсчет идет с 0, так что первое ядро имеет номер 0) загружалось второе.
В конце того же файла находятся блоки с описанием параметров ядер для загрузки. Копируем первый блок и вставляем его самым первым по списку, при этом заменив в нем root=LABEL=/
на root=/dev/md2
и root (hd0,0)
на root (hd1,0)
:
После всех этих махинаций файл должен выглядеть примерно так:
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
6 Подготовка GRUB (часть 1)
Теперь необходимо установить GRUB на второй жесткий диск, /dev/sdb
. Запускаем оболочку (grub
) и вводим следующие команды:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
Теперь, уже в "нормальной" оболочке, перезагрузим систему и будем надеяться, что она нормально загрузится с нашего RAID массива:
reboot
7 Подготовка /dev/sda
Если все прошло удачно, мы должны увидеть /dev/md0
и /dev/md2
в выводе команды df -h
Вывод команды cat /proc/mdstat
должен выглядеть так:
Теперь нужно изменить типы всех трех разделов /dev/sda
на уже знакомый нам Linux raid autodetect
:
fdisk /dev/sda
[root@server1 ~]# fdisk /dev/sda
<-- t
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):
Partition number (1-4):
<-- 1
Hex code (type L to list codes):
<-- fd
Changed system type of partition 1 to fd (Linux raid autodetect)
<-- t
Command (m for help):
Partition number (1-4):
<-- 2
Hex code (type L to list codes):
<-- fd
Changed system type of partition 2 to fd (Linux raid autodetect)
<-- t
Command (m for help):
Partition number (1-4):
<-- 3
Hex code (type L to list codes):
<-- fd
Changed system type of partition 3 to fd (Linux raid autodetect)
<-- w
Command (m for help):
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.
[root@server1 ~]#
Осталось добавить /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
и вы должны увидеть, что идет процесс синхронизации массивов:
(Можно выполнить watch cat /proc/mdstat
для наблюдения за ходом процесса. Остановить watch
можно, нажав CTRL+C
)
Дождитесь окончания синхронизации. После этого все должно выглядеть следующим образом:
Теперь отредактируем /etc/mdadm.conf
, чтобы он соответствовал новой ситуации:
mdadm --examine --scan > /etc/mdadm.conf
В результате содержимое файла должно выглядеть так:
cat /etc/mdadm.conf
8 Подготовка GRUB (часть 2)
Уже почти все готово. Сейчас нам просто нужно снова отредактировать /boot/grub/menu.lst
. Ведь на данный момент он сконфигурирован так, чтобы загружаться с /dev/sdb
(hd1,0
). А нам, естественно, нужно, чтобы система могла загружаться даже в том случае, если /dev/sdb
откажет. Поэтому копируем первый блок параметров ядра (содержащий hd1
), вставляем скопированное следующим по списку блоком и заменяем hd1
на hd0
. Потом закомментируем все другие блоки и получим следующее:
vi /boot/grub/menu.lst
Теперь обновим 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!
9 Тестирование
Что ж, давайте симулируем отказ жесткого диска. Неважно, какого именно - /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
и видим, что у нас снова имеется деградированный массив:
Вывод fdisk -l
должен выглядеть так:
Копируем таблицу разделов c /dev/sda
на /dev/sdb
:
sfdisk -d /dev/sda | sfdisk /dev/sdb
Если появляется ошибка, попробуйте запустить с параметром --force
:
sfdisk -d /dev/sda | sfdisk --force /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
Посмотрим, что нам покажет cat /proc/mdstat
:
Ждем, пока закончится процесс синхронизации:
Запускаем grub
и устанавливаем загрузчик на оба HDD:
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
quit
Готово. Мы только что заменили отказавший жесткий диск в массиве RAID1.
10 Links
- Руководство по программным RAID массивам: http://tldp.org/HOWTO/Software-RAID-HOWTO.html
- CentOS: http://www.centos.org/