База знаний

www. IT-Mehanika .ru --  журнал доброго админа

Установка программного RAID1 массива на работающей системе с установкой загрузчика GRUB2 на Ubuntu10.04 (Часть 1)

В этом руководстве мы покажем, как установить программное обеспечение на RAID1 с уже запущенной системой Ubuntu 10.04. Загрузчик GRUB2 будет настроен таким образом, что система будет по прежнему работоспособна даже если один из жестких дисков выйдет из строя (независимо от того, какой именно)

Я не даю никаких гарантий, что это будет работать у Вас!

 

 

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

 

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

 

/dev/sda1: /boot partition, ext4;

/dev/sda2: swap;

/dev/sda3: / partition, ext4

 

В конечном итоге я хочу добиться следующего:

 

/dev/md0 (made up of /dev/sda1 and /dev/sdb1): /boot partition, ext4;

/dev/md1 (made up of /dev/sda2 and /dev/sdb2): swap;

/dev/md2 (made up of /dev/sda3 and /dev/sdb3): / partition, ext4

 

Это текущая конфигурация:

 

df -h

 

root@server1:~# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda3 4.0G 808M 3.0G 21% /

none 243M 168K 243M 1% /dev

none 247M 0 247M 0% /dev/shm

none 247M 36K 247M 1% /var/run

none 247M 0 247M 0% /var/lock

none 247M 0 247M 0% /lib/init/rw

none 4.0G 808M 3.0G 21% /var/lib/ureadahead/debugfs

/dev/sda1 472M 27M 422M 6% /boot

root@server1:~#

 

fdisk -l

 

root@server1:~# fdisk -l

 

Disk /dev/sda: 5368 MB, 5368709120 bytes

255 heads, 63 sectors/track, 652 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x000246b7

 

Device Boot Start End Blocks Id System

/dev/sda1 * 1 63 498688 83 Linux

Partition 1 does not end on cylinder boundary.

/dev/sda2 63 125 499712 82 Linux swap / Solaris

Partition 2 does not end on cylinder boundary.

/dev/sda3 125 653 4242432 83 Linux

Partition 3 does not end on cylinder boundary.

 

Disk /dev/sdb: 5368 MB, 5368709120 bytes

255 heads, 63 sectors/track, 652 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000

 

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

root@server1:~#

 

2. Устанавливаем mdadm

 

Самым важным инструментом для создания RAID является mdadm. Устанавливаем его:

 

aptitude install initramfs-tools 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:~#

 

3. Подготавливаем /dev/sdb

 

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

 

Во-первых, мы копируем таблицы разделов /dev/sda на /dev/sdb так, что оба диска имели точно такой же макет:

 

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

 

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

 

root@server1:~# sfdisk -d /dev/sda | sfdisk --force /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 * 2048 999423 997376 83 Linux

/dev/sdb2 999424 1998847 999424 82 Linux swap / Solaris

/dev/sdb3 1998848 10483711 8484864 83 Linux

/dev/sdb4 0 - 0 0 Empty

Warning: partition 1 does not end at a cylinder boundary

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).)

root@server1:~#

 

Команда

 

fdisk -l

 

теперь должна показать, что жесткие диски имеют одинаковые макеты:

 

root@server1:~# fdisk -l

 

Disk /dev/sda: 5368 MB, 5368709120 bytes

255 heads, 63 sectors/track, 652 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x000246b7

 

Device Boot Start End Blocks Id System

/dev/sda1 * 1 63 498688 83 Linux

Partition 1 does not end on cylinder boundary.

/dev/sda2 63 125 499712 82 Linux swap / Solaris

Partition 2 does not end on cylinder boundary.

/dev/sda3 125 653 4242432 83 Linux

Partition 3 does not end on cylinder boundary.

 

Disk /dev/sdb: 5368 MB, 5368709120 bytes

255 heads, 63 sectors/track, 652 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000

 

Device Boot Start End Blocks Id System

/dev/sdb1 * 1 63 498688 83 Linux

Partition 1 does not end on cylinder boundary.

/dev/sdb2 63 125 499712 82 Linux swap / Solaris

Partition 2 does not end on cylinder boundary.

/dev/sdb3 125 653 4242432 83 Linux

Partition 3 does not end on cylinder boundary.

root@server1:~#

 

Далее мы должны изменить тип раздела из наших трех дисков /dev/sdb в автоопределение Linux RAID

 

fdisk /dev/sdb

 

root@server1:~# fdisk /dev/sdb

 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

switch off the mode (command 'c') and change display units to

sectors (command 'u').

 

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 24 NEC DOS 81 Minix / old Lin bf Solaris

1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-

2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-

3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-

4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx

5 Extended 42 SFS 86 NTFS volume set da Non-FS data

6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / .

7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility

8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt

9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access

a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O

b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor

c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs

e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT

f W95 Ext'd (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/

10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b

11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor

12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor

14 Hidden FAT16 <3 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary

16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS

17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE

18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto

1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep

1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT

1e Hidden W95 FAT1

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.

root@server1:~#

 

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

 

 

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] означает, что массив в нормальном состоянии):

 

root@server1:~# cat /proc/mdstat

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]

md2 : active raid1 sdb3[1]

4242368 blocks [2/1] [_U]

 

md1 : active raid1 sdb2[1]

499648 blocks [2/1] [_U]

 

md0 : active raid1 sdb1[1]

498624 blocks [2/1] [_U]

 

unused devices:

root@server1:~#

 

Далее мы создадим файловые системы на наших массивах RAID (ext4 на /dev/md0 и /dev/md2 и swap на / dev/md1):

 

mkfs.ext4 /dev/md0

mkswap /dev/md1

mkfs.ext4 /dev/md2

 

Далее мы должны внести изменения в файл /etc/mdadm/mdadm.conf в данный момент времени которые не содержат никакой информации о наших новых массивах RAID.

 

cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig

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

 

Вот что должно получится при выводе файла:

 

cat /etc/mdadm/mdadm.conf

 

В нижней части файла, вы должны увидеть подробную информацию о наших трех массивах RAID:

 

# automatically tag new arrays as belonging to the local system

 

HOMEHOST

 

 

 

# instruct the monitoring daemon where to send mail alerts

 

MAILADDR root

 

 

 

# definitions of existing MD arrays

 

 

 

# This file was auto-generated on Mon, 21 Jun 2010 13:21:00 +0200

 

# by mkconf $Id$

 

ARRAY /dev/md0 level=raid1 num-devices=2 UUID=68686c40:b924278e:325ecf68:79913751

 

ARRAY /dev/md1 level=raid1 num-devices=2 UUID=9719181e:3071f655:325ecf68:79913751

 

ARRAY /dev/md2 level=raid1 num-devices=2 UUID=c3360f0f:7f3d47ec:325ecf68:79913751

 

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

 

root@server1:~# mount

/dev/sda3 on / type ext4 (rw,errors=remount-ro)

proc on /proc type proc (rw,noexec,nosuid,nodev)

none on /sys type sysfs (rw,noexec,nosuid,nodev)

none on /sys/fs/fuse/connections type fusectl (rw)

none on /sys/kernel/debug type debugfs (rw)

none on /sys/kernel/security type securityfs (rw)

none on /dev type devtmpfs (rw,mode=0755)

none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)

none on /dev/shm type tmpfs (rw,nosuid,nodev)

none on /var/run type tmpfs (rw,nosuid,mode=0755)

none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)

none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)

none on /var/lib/ureadahead/debugfs type debugfs (rw,relatime)

/dev/sda1 on /boot type ext4 (rw)

/dev/md0 on /mnt/md0 type ext4 (rw)

/dev/md2 on /mnt/md2 type ext4 (rw)

root@server1:~#

 

Далее мы изменим /etc/fstab. Комментируем наши текущие /boot и swap раздел и добавляем новые строчки для них, где заменим UUID /dev/md0 для /boot раздела, /dev/md1 для swap раздела, а также /dev/md2 для раздела «/» таким образом, чтобы файл выглядел следующим образом:

 

vi /etc/fstab

 

# /etc/fstab: static file system information.

 

#

 

# Use 'blkid -o value -s UUID' to print the universally unique identifier

 

# for a device; this may be used with UUID= as a more robust way to name

 

# devices that works even if disks are added and removed. See fstab(5).

 

#

 

#

 

proc /proc proc nodev,noexec,nosuid 0 0

 

# / was on /dev/sda3 during installation

 

#UUID=48d65bba-0f02-44b4-8557-b508309b1963 / ext4 errors=remount-ro 0 1

 

/dev/md2 / ext4 errors=remount-ro 0 1

 

# /boot was on /dev/sda1 during installation

 

#UUID=e3a677ee-2db0-4a8a-8d6c-94715c8cd90f /boot ext4 defaults 0 2

 

/dev/md0 /boot ext4 defaults 0 2

 

# swap was on /dev/sda2 during installation

 

#UUID=1e27f700-ec54-4de9-9428-c6d47d7921f4 none swap sw 0 0

 

/dev/md1 none swap sw 0 0

 

/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0

 

Далее заменим /dev/sda1 с /dev/md0 и /dev/sda3 с /dev/md2 в /etc/mtab:

 

vi /etc/mtab

 

/dev/md2 / ext4 rw,errors=remount-ro 0 0

 

proc /proc proc rw,noexec,nosuid,nodev 0 0

 

none /sys sysfs rw,noexec,nosuid,nodev 0 0

 

none /sys/fs/fuse/connections fusectl rw 0 0

 

none /sys/kernel/debug debugfs rw 0 0

 

none /sys/kernel/security securityfs rw 0 0

 

none /dev devtmpfs rw,mode=0755 0 0

 

none /dev/pts devpts rw,noexec,nosuid,gid=5,mode=0620 0 0

 

none /dev/shm tmpfs rw,nosuid,nodev 0 0

 

none /var/run tmpfs rw,nosuid,mode=0755 0 0

 

none /var/lock tmpfs rw,noexec,nosuid,nodev 0 0

 

none /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0

 

none /var/lib/ureadahead/debugfs debugfs rw,relatime 0 0

 

/dev/md0 /boot ext4 rw 0 0

 

/dev/md0 /mnt/md0 ext4 rw 0 0

 

/dev/md2 /mnt/md2 ext4 rw 0 0

 

Теперь возьмемся за загрузчик GRUB2. Создадим файл /etc/grub.d/09_swraid1_setup следующим образом:

 

cp /etc/grub.d/40_custom /etc/grub.d/09_swraid1_setup

vi /etc/grub.d/09_swraid1_setup

 

#!/bin/sh

 

exec tail -n +3 $0

 

# This file provides an easy way to add custom menu entries. Simply type the

 

# menu entries you want to add after this comment. Be careful not to change

 

# the 'exec tail' line above.

 

menuentry 'Ubuntu, with Linux 2.6.32-21-server' --class ubuntu --class gnu-linux --class gnu --class os {

 

recordfail

 

insmod raid

 

insmod mdraid

 

insmod ext2

 

set root='(md0)'

 

linux /vmlinuz-2.6.32-21-server root=/dev/md2 ro quiet

 

initrd /initrd.img-2.6.32-21-server

 

}

 

Убедимся, что мы используем правильную версию ядра в menuentry строки (в Linux и Initrd строке). Выполним:

 

uname -r

 

или посмотрим на текущее строку menuentry в # # # BEGIN /etc/grub.d/10_linux ### в разделе /boot/grub/grub.cfg. Также убедимся, что мы используем root=/dev/md2 в Linux.

 

Важную роль в нашей новой строке menuentry является линия множества root='(md0)' – мы будем производить загрузку с нашего RAID1 массива /dev/md0 (который будет производится с /boot раздела) вместо /dev/sda или /dev/sdb, что важно, если один из наших жестких дисков выйдет из строя, то система будет по-прежнему работоспособна и сможет загрузится.

 

Запускаем:

 

update-grub

 

для записи наших новых изменений в ядро с /etc/grub.d/09_swraid1_setup в /boot/grub/grub.cfg

 

Далее корректируем наши RamDisk к новому состоянию:

 

update-initramfs -u

 

Теперь мы копируем содержимое /dev/sda1 и /dev/sda3 на /dev/md0 и /dev/md2 (которые, смонтированны в /mnt/md0 и /mnt/md2):

 

cp -dpRx / /mnt/md2

 

cd /boot

cp -dpRx . /mnt/md0

 

6. Подготовка GRUB2 Часть 1

 

Мы должны убедится, что загрузчик GRUB2 установлен на обоих жестких дисках /dev/sda и /dev/sdb:

 

grub-install /dev/sda

grub-install /dev/sdb

 

Теперь перезагрузим нашу систему и будем надеятся что она нормально загрузится с наших RAID массивов:

 

reboot

 

Продолжение следует.....

 

 

 

Комментарии   

0 #16 Guest 16.02.2012 15:34
(Протестировано на Ubuntu 11.10)
Для тех у кого не грузится с массива после перезагрузки, с ошибками:
file not found
no such disk
you need to load the kernel first

меняем в файле /etc/grub.d/09_ swraid1_setup строки:
"insmod mdraid" на "insmod mdraid1x",
"set root='(md0)'" на "set root='(md/0)'"
и в файле /etc/default/grub
убираем комментарий перед "GRUB_TERMINAL= console" (также эта строка помогает, при циклической перезагрузке, при отключенном sda диске, когда RAID собран)
0 #15 Guest 24.12.2011 04:17
В общем, на каждый винт поставил grub и грузится оно у меня с hd1,msdos1 или hd0,msdos1, а дальше уже подхватывает root=/dev/md0
При выставлении одинаково md0 грузить ядро не хочет.
Ну, хоть так.
0 #14 Guest 24.12.2011 03:46
Цитирую :

Читайте мануал внимательней, все есть. Все работает. Если все делать по этому ману, все получится. Только внимательно читайте.

Куда уж внимательнее?
Кто-нибудь подскажет, как нужно пункт загрузки с массива прописать, если /boot не вынесен в отдельный раздел?
И md0 и md/0 и /dev/md0 и по всякому пробовал.
Grub постоянно мне выдаёт you need to load the kernel first и не хочет грузить систему с md0, на которой и стоит /.
0 #13 Guest 29.09.2011 14:32
Автору огромное спасибо. До этого 2 дня убил - не получалось с загрузчиком. сейчас система уже загружена с массива, добавляется диск в md2
0 #12 Guest 05.09.2011 10:21
Цитирую :
Херня все это. И так и сяк ставлю. После reboot только получаю:

mount: mounting /dev on /root/dev failed: No such file or directory
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /proc on /root/proc failed: No such file or directory
Target filesystem doesn't have /sbin/init
No init found, Try passing init=bootarg.
BusyBox ...

Или что ядро должно быть загружено первым.

В общем сутки впустую улетели.


Читайте мануал внимательней, все есть. Все работает. Если все делать по этому ману, все получится. Только внимательно читайте.
0 #11 Guest 25.08.2011 15:29
все сделал как описано в этой первой части и после последней перезагрузки при выводе команды df -h выдает что / загружен с sda1 - что сделать чтоб он грузился с md????
0 #10 Guest 17.08.2011 12:28
А где команда добавления /dev/sda... в массив?
0 #9 Guest 10.04.2011 14:27
Херня все это. И так и сяк ставлю. После reboot только получаю:

mount: mounting /dev on /root/dev failed: No such file or directory
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /proc on /root/proc failed: No such file or directory
Target filesystem doesn't have /sbin/init
No init found, Try passing init=bootarg.
BusyBox ...

Или что ядро должно быть загружено первым.

В общем сутки впустую улетели.
0 #8 Guest 09.02.2011 12:53
экспериментальн о установил:
linux /boot/vmlinuz-2 .6.32-21-server root=/dev/md0 ro quiet

initrd /boot/initrd.im g-2.6.32-21-ser ver
0 #7 Guest 08.02.2011 12:44
Цитирую Daemon:
Андрей, вы где-то ошиблись или не подправили один из приведенных конфигов под себя - только что ставил на 10.10, boot на одном разделе с / - все отлично работает

Автору большое спасибо за статью :3

а если один раздел с / как должен выглядеть /etc/grub.d/09_ swraid1_setup ?

You have no rights to post comments