FastNetMon

Tuesday 17 November 2009

Перенос Centos Linux 5 с одного диска на Soft Raid

Появилась следующая проблема, есть Centos Linux 5, установленный на один жесткий диск (/dev/sda) без рейда вообще, также в системе присутствует второй не размеченный жесткий диск (/dev/sdb). Из всего этого требуется собрать soft raid 1 (зеркало в народе) не потеряв при этом данные. Данный мануал почти без изменений применим для серверов на fastvps.ru

Вот как раз для этого есть отличный мануал от Red Hat: http://kbase.redhat.com/faq/docs/DOC-7355 и вот еще один мануал с Opennet и вот еще один.

Вот конфигурация винтов:
fdisk -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 82 Linux swap / Solaris
/dev/sda2 524 785 2104515 83 Linux
/dev/sda3 786 36481 286728120 83 Linux

Disk /dev/sdb: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

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



Создаем на втором диске (/dev/sdb) структуру разделов аналогичную /dev/sda

fdisk /dev/sdb
n
p
1
[enter]
523 # соответствует значению End напротив /dev/sda1 из таблицы выше
w


fdisk /dev/sdb
n
p
2
[enter]
785 # соответствует значению End напротив /dev/sda2 из таблицы выше




fdisk /dev/sdb
n
p
3
[enter]
[enter]
w


В итоге должна получиться следующая картина:

fdisk -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 82 Linux swap / Solaris
/dev/sda2 524 785 2104515 83 Linux
/dev/sda3 786 36481 286728120 83 Linux

Disk /dev/sdb: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 523 4200966 83 Linux
/dev/sdb2 524 785 2104515 83 Linux
/dev/sdb3 786 36481 286728120 83 Linux



Как легко заметить, структура размещения разделов на обоих дисках идентична.

Кстати говоря, на Opennet автор рекомендует использовать вот такую простую команду для копирования структуры разделов:
sfdisk -d /dev/sda | sfdisk /dev/sdb
она работает отлично, также рекомендую, как более простой путь :)

Меняем тип для всех вновь созданных разделов с Linux на Linux Raid


fdisk /dev/sdb

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.




Итого в результате у нас получается следующее:

fdisk -l

Disk /dev/sda: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 523 4200966 82 Linux swap / Solaris
/dev/sda2 524 785 2104515 83 Linux
/dev/sda3 786 36481 286728120 83 Linux

Disk /dev/sdb: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 523 4200966 fd Linux raid autodetect
/dev/sdb2 524 785 2104515 fd Linux raid autodetect
/dev/sdb3 786 36481 286728120 fd Linux raid autodetect





Создаем Raid на основе второго диска (/dev/sdb):

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


Слово missing означает, что создается degraded (разбитый) массив, т.е. массив, в котором один из дисков отсутствует.

Форматируем диски вновь созданного Raid


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


Составляем конфиг RAID
Теперь нам необходимо составить конфиг нашего RAID массива (как я понял, он особо никому не нужен, но сделать его стоит хотя бы для удобства):

Генерируется он так:


mkdir -p /etc/mdadm
/sbin/mdadm --examine --scan > /etc/mdadm/mdadm.conf


Перенос данных


Теперь нам нужно перенести данные c /dev/sda2 и /dev/sda3 на соответственно /dev/md1 и /dev/md2

Данные на sda2 и sda3 у нас размещены в следующих точках мониторования:

/dev/sda2 on /boot type ext3 (rw)
/dev/sda3 on / type ext3 (rw)


Итак, копируем /dev/sda2:

mkdir /mnt/md1
mount /dev/md1 /mnt/md1
cp -axu /boot/* /mnt/md1
sync
umount /mnt/md1


В итоге получаем идентичное содержимое папок:

root@CentOS-54-32-minimal /etc # ls /mnt/md1
boot message
config-2.6.18-164.6.1.el5PAE symvers-2.6.18-164.6.1.el5PAE.gz
grub System.map-2.6.18-164.6.1.el5PAE
initrd-2.6.18-164.6.1.el5PAE.img vmlinuz-2.6.18-164.6.1.el5PAE
lost+found

root@CentOS-54-32-minimal /etc # ls /boot
boot message
config-2.6.18-164.6.1.el5PAE symvers-2.6.18-164.6.1.el5PAE.gz
grub System.map-2.6.18-164.6.1.el5PAE
initrd-2.6.18-164.6.1.el5PAE.img vmlinuz-2.6.18-164.6.1.el5PAE
lost+found



Следующая операция крайне длительна и не хотелось бы, чтобы она оборвалась по вине интернет-соединения, поэтому ставим и запускаем screen:
yum install -y screen
screen



Переносим /dev/sda3:

mkdir /mnt/md2
mount /dev/md2 /mnt/md2/
cp -axu / /mnt/md2


Также убеждаемся в идентичности содержимого папок:

root@CentOS-54-32-minimal /etc # ls /mnt/md2/
bin dev home lib media opt root selinux sys usr
boot etc installimage.conf lost+found mnt proc sbin srv tmp var
root@CentOS-54-32-minimal /etc # ls /
bin dev home lib media opt root selinux sys usr
boot etc installimage.conf lost+found mnt proc sbin srv tmp var



Корректирование /etc/fstab

Теперь на нашем примонтированном рейде нам нужно внести изменения в fstab чтобы система монтировала не старые разделы, а уже RAID. Для этого открываем файл:

vi /mnt/md2/etc/fstab


И строки:
/dev/sda1 none swap sw 0 0
/dev/sda2 /boot ext3 defaults 0 0
/dev/sda3 / ext3 defaults 0 0


Заменяем соотвественно на:

/dev/md0 none swap sw 0 0
/dev/md1 /boot ext3 defaults 0 0
/dev/md2 / ext3 defaults 0 0


Регенерируем Initrd ядра, включаем в него модули поддержки RAID

mkinitrd --fstab=/mnt/md2/etc/fstab -v -f /boot/initrd-`uname -r`.img `uname -r`


При этом в выдаче команды должны промелькнуть строки "raid-1". Только вот честно не понимаю, где он узнает, что на машинке теперь используется RAID. Как выяснилось после долгих изысканий, об использовании RAID на root разделе он узнает из fstab.

Теперь повторяем перенос /boot раздела, т.к. у нас новый initrd
Сейчас оптимизирую мануал. чтобы этого избежать.



mkdir -p /mnt/md1
mount /dev/md1 /mnt/md1
cp -axu /boot/* /mnt/md1
sync
umount /mnt/md1


Отмонитируем раздел

umount /mnt/md2/


Вносим коррективы в системный GRUB

Для этого открываем /etc/grub.conf и там

root=/dev/sda3


заменяем на:

root=/dev/md2


Тоже самое делаем для нового /boot (/dev/md1).


mount /dev/md1 /mnt/md1
vi /mnt/md1/grub/menu.lst
umount /mnt/md1


Перезагружаемся

shutdown -r now



Ставим GRUB на второй диск

grub-install /dev/sdb
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(hd0) /dev/sda
(hd1) /dev/sdb


Также я бы рекомендовал "освежить" инсталляцию grub на первом диск:
grub-install /dev/sda


Еще раз перезагружаемся

И ставим в BIOS загрузку со второго, нового жесткого диска ( Boot Sequecce ) и еще раз перзагружаемся, при этом уже загрузка пойдет со второго диска и первый не потребуется вообще.

Устанавливаем тип Linux Raid для разделов первого диска


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.


Добавляем разделы с первого диска в RAID

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


Дожидаемся окончания ребилда RAID

cat /proc/mdstat
Personalities : [raid1] [raid10] [raid0] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[2] sdb1[1]
4200896 blocks [2/1] [_U]
[==========>..........] recovery = 52.7% (2215232/4200896) finish=0.5min speed=58454K/sec

md1 : active raid1 sda2[2] sdb2[1]
2104448 blocks [2/1] [_U]
resync=DELAYED

md2 : active raid1 sda3[2] sdb3[1]
286728000 blocks [2/1] [_U]
resync=DELAYED

unused devices:


Еще раз перезагружаемся

И Убеждаемся, что все окей :) Либо идем заказывать KVM

3 comments :

  1. This comment has been removed by the author.

    ReplyDelete
  2. А вот ещё 1 описание, тренировались тоже на CentOS 5.3
    http://rus-linux.net/nlib.php?name=/MyLDP/sys-conf/RAID1_CentOS.html

    ReplyDelete
  3. Ага, я из него тоже, вроде бы, что-то брал :)

    ReplyDelete

Note: only a member of this blog may post a comment.