Aufsetzen von Software RAID1 auf einem bereits installierten System (Inkl. GRUB Konfiguration) (Mandriva 2008.0)

Version 1.0
Author: Falko Timme


Diese Anleitung veranschaulicht, wie man Software RAID1 auf einem bereits installierten Mandriva 2008.0 System aufsetzt. Der GRUB Bootloader wird so konfiguriert werden, dass das System auch dann noch in der Lage ist zu starten, wenn eine der Festplatten ausgefallen ist (egal welche).

Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Vorbemerkung

In dieser Anleitung verwende ich ein Mandriva 2008.0 System mit zwei Festplatten /dev/hda und /dev/hdb, die die gleiche Größe aufweisen. /dev/hdb wird derzeit nicht genutzt und /dev/hda hat folgende Partitionen:
  • /dev/hda1: /boot partition, ext3;
  • /dev/hda5: swap;
  • /dev/hda6: / partition, ext3
Am Ende möchte ich folgende Situation vorfinden:
  • /dev/md0 (bestehend aus /dev/hda1 und /dev/hdb1): /boot partition, ext3;
  • /dev/md1 (bestehend aus /dev/hda5 und /dev/hdb5): swap;
  • /dev/md2 (bestehend aus /dev/hda6 und /dev/hdb6): / partition, ext3
Dies ist die derzeitige Situation:

df -h


[root@server1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda6 4.4G 757M 3.4G 18% /
/dev/hda1 168M 8.5M 151M 6% /boot
[root@server1 ~]#

fdisk -l

[root@server1 ~]# fdisk -l


Disk /dev/hda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/hda1 * 1 22 176683+ 83 Linux
/dev/hda2 23 652 5060475 5 Extended
/dev/hda5 23 74 417658+ 82 Linux swap / Solaris
/dev/hda6 75 652 4642753+ 83 Linux

Disk /dev/hdb: 5368 MB, 5368709120 bytes
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk identifier: 0x00000000

Disk /dev/hdb doesn't contain a valid partition table
[root@server1 ~]#

2 Installation von mdadm

Das wichtigste Tool für das Setup von RAID ist mdadm. Wir installieren es wie folgt:

urpmi mdadm mkinitrd

Danach laden wir einige Kernel Module (um einen Neustart zu verhindern):

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

Führe nun Folgendes aus

cat /proc/mdstat

Die Ausgabe sollte wie folgt aussehen:

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

3 /dev/hdb vorbereiten

Um ein RAID1 Array auf unserem bereits installierten System zu erstellen, müssen wir die /dev/hdb Festplatte für RAID1 vorbereiten, dann die Inhalte unserer /dev/hda Festplatte auf /dev/hdb kopieren und schließlich /dev/hda dem RAID1 Array hinzufügen.

Zuerst kopieren wir die Partitionstabelle von /dev/hda nach /dev/hdb sodass beide Festplatten das gleiche Layout haben:

sfdisk -d /dev/hda | sfdisk --force /dev/hdb

Die Ausgabe sollte wie folgt aussehen:

[root@server1 ~]# sfdisk -d /dev/hda | sfdisk --force /dev/hdb
Checking that no-one is using this disk right now ...
OK

Disk /dev/hdb: 10402 cylinders, 16 heads, 63 sectors/track


sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/hdb: unrecognized partition table type
Old situation:
No partitions found
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
New situation:
Units = sectors of 512 bytes, counting from 0

Device Boot Start End #sectors Id System
/dev/hdb1 * 63 353429 353367 83 Linux
/dev/hdb2 353430 10474379 10120950 5 Extended
/dev/hdb3 0 - 0 0 Empty
/dev/hdb4 0 - 0 0 Empty
/dev/hdb5 353493 1188809 835317 82 Linux swap / Solaris
/dev/hdb6 1188873 10474379 9285507 83 Linux
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 ~]#

Der Befehl

fdisk -l

sollte nun zeigen, dass beide Festplatten das gleiche Layout haben:

[root@server1 ~]# fdisk -l


Disk /dev/hda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/hda1 * 1 22 176683+ 83 Linux
/dev/hda2 23 652 5060475 5 Extended
/dev/hda5 23 74 417658+ 82 Linux swap / Solaris
/dev/hda6 75 652 4642753+ 83 Linux

Disk /dev/hdb: 5368 MB, 5368709120 bytes
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/hdb1 * 1 351 176683+ 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/hdb2 351 10392 5060475 5 Extended
/dev/hdb5 351 1180 417658+ 82 Linux swap / Solaris
/dev/hdb6 1180 10392 4642753+ 83 Linux
[root@server1 ~]#

Als Nächstes müssen wir den Partitionstyp unserer drei Partitionen auf /dev/hdb zu Linux raid autodetect ändern:

fdisk /dev/hdb

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


The number of cylinders for this disk is set to 10402.
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-6): <-- 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/
11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b
12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f1 SpeedStor
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-6): <-- 5
Hex code (type L to list codes): <-- fd
Changed system type of partition 5 to fd (Linux raid autodetect)

Command (m for help): <-- t
Partition number (1-6): <-- 6
Hex code (type L to list codes): <-- fd
Changed system type of partition 6 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 ~]#

Um sicher zu gehen, dass keine Überbleibsel von voherigen RAID Installationen auf /dev/hdb vorhanden sind, führen wir folgenden Befehle aus:


mdadm --zero-superblock /dev/hdb1
mdadm --zero-superblock /dev/hdb5
mdadm --zero-superblock /dev/hdb6

Falls es keine Überbleibsel früherer RAID Installationen gibt, wird jeder der obigen Befehle einen Fehler wie den Folgenden anzeigen (keine Sorge deswegen):


[root@server1 ~]# mdadm --zero-superblock /dev/hdb1
mdadm: Unrecognised md component device - /dev/hdb1
[root@server1 ~]#

Anderenfalls werden die Befehle überhaupt nichts anzeigen.

4 Unsere RAID Arrays erstellen

Lass uns nun unsere RAID Arrays /dev/md0, /dev/md1 und /dev/md2 erstellen. /dev/hdb1 wird /dev/md0 hinzugefügt, /dev/hdb5 zu /dev/md1 und /dev/hdb6 zu /dev/md2. /dev/hda1, /dev/hda5, und /dev/hda6 können noch nicht gleich hinzugefügt werden (da das System derzeit darauf ausgeführt wird), daher verwenden wir den Platzhalter missing in den folgenden drei Befehlen:

mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/hdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/hdb5
mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/hdb6

Der Befehl

cat /proc/mdstat

sollte nun zeigen, dass Du drei degraded RAID Arrays hast ([_U] or [U_] bedeutet, dass ein Array degraded ist, wohingegen [UU] bedeutet, dass das Array in Ordnung ist):

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

md1 : active raid1 hdb5[1]
417536 blocks [2/1] [_U]

md0 : active raid1 hdb1[1]
176576 blocks [2/1] [_U]

unused devices: <none>
[root@server1 ~]#

Als Nächstes erstellen wir auf unseren RAID Arrays Dateisysteme (ext3 auf /dev/md0 und /dev/md2 und swap auf /dev/md1):

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

Als Nächstes müssen wir /etc/mdadm.conf (das noch keinerlei Informationen über unsere neuen RAID arrays enthält) an die neue Situation anpassen:

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

Lass Dir die Inhalte der Datei anzeigen:

cat /etc/mdadm.conf

In der Datei müsstest Du nun Angaben über unsere drei (degraded) RAID Arrays sehen:
# mdadm configuration file
# # mdadm will function properly without the use of a configuration file, # but this file is useful for keeping track of arrays and member disks. # In general, a mdadm.conf file is created, and updated, after arrays # are created. This is the opposite behavior of /etc/raidtab which is # created prior to array construction. # # # the config file takes two types of lines: # # DEVICE lines specify a list of devices of where to look for # potential member disks # # ARRAY lines specify information about how to identify arrays so # so that they can be activated # # You can have more than one device line and use wild cards. The first # example includes SCSI the first partition of SCSI disks /dev/sdb, # /dev/sdc, /dev/sdd, /dev/sdj, /dev/sdk, and /dev/sdl. The second # line looks for array slices on IDE disks. # #DEVICE /dev/sd[bcdjkl]1 #DEVICE /dev/hda1 /dev/hdb1 # # If you mount devfs on /dev, then a suitable way to list all devices is: #DEVICE /dev/discs/*/* # # # # ARRAY lines specify an array to assemble and a method of identification. # Arrays can currently be identified by using a UUID, superblock minor number, # or a listing of devices. # # super-minor is usually the minor number of the metadevice # UUID is the Universally Unique Identifier for the array # Each can be obtained using # # mdadm -D <md> # #ARRAY /dev/md0 UUID=3aaa0122:29827cfa:5331ad66:ca767371 #ARRAY /dev/md1 super-minor=1 #ARRAY /dev/md2 devices=/dev/hda1,/dev/hdb1 # # ARRAY lines can also specify a "spare-group" for each array. mdadm --monitor # will then move a spare between arrays in a spare-group if one array has a failed # drive but no spare #ARRAY /dev/md4 uuid=b23f3c6d:aec43a9f:fd65db85:369432df spare-group=group1 #ARRAY /dev/md5 uuid=19464854:03f71b1b:e0df2edd:246cc977 spare-group=group1 # # When used in --follow (aka --monitor) mode, mdadm needs a # mail address and/or a program. This can be given with "mailaddr" # and "program" lines to that monitoring can be started using # mdadm --follow --scan & echo $! > /var/run/mdadm # If the lines are not found, mdadm will exit quietly #MAILADDR root@mydomain.tld #PROGRAM /usr/sbin/handle-mdadm-events ARRAY /dev/md0 level=raid1 num-devices=2 UUID=6b4f013f:6fe18719:5904a9bd:70e9cee6 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=63194e2e:c656857a:3237a906:0616f49e ARRAY /dev/md2 level=raid1 num-devices=2 UUID=edec7105:62700dc0:643e9917:176563a7

5 Das System an RAID1 anpassen

Lass uns nun /dev/md0 und /dev/md2 einhängen (das swap array /dev/md1 brauchen wir nicht einhängen):

mkdir /mnt/md0
mkdir /mnt/md2

mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2

Beide Arrays solltest Du nun in der Ausgabe von folgendem Befehl sehen

mount


[root@server1 ~]# mount
/dev/hda6 on / type ext3 (rw,relatime)
none on /proc type proc (rw)
/dev/hda1 on /boot type ext3 (rw,relatime)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/md0 on /mnt/md0 type ext3 (rw)
/dev/md2 on /mnt/md2 type ext3 (rw)
[root@server1 ~]#

Als Nächstes bearbeiten wir /etc/fstab. Ersetze /dev/hda1 mit /dev/md0, /dev/hda5 mit /dev/md1 und /dev/hda6 mit /dev/md2 sodass die Datei wie folgt aussieht:

vi /etc/fstab


/dev/md2 / ext3 relatime 1 1
/dev/md0 /boot ext3 relatime 1 2 /dev/cdrom /media/cdrom auto umask=0022,users,iocharset=utf8,noauto,ro,exec 0 0 /dev/fd0 /media/floppy auto umask=0022,users,iocharset=utf8,noauto,exec,flush 0 0 none /proc proc defaults 0 0 /dev/md1 swap swap defaults 0 0
Ersetze als Nächstes /dev/hda1 mit /dev/md0 und /dev/hda6 mit /dev/md2 in /etc/mtab (Du kannst die beiden /dev/md Zeilen am Ende der Datei ignorieren):

vi /etc/mtab


/dev/md2 / ext3 rw,relatime 0 0
none /proc proc rw 0 0 /dev/md0 /boot ext3 rw,relatime 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0 /dev/md0 /mnt/md0 ext3 rw 0 0 /dev/md2 /mnt/md2 ext3 rw 0 0
Nun zum GRUB Boot Loader. Öffne /boot/grub/menu.lst und füge fallback 1 direkt nach default 0 hinzu:

vi /boot/grub/menu.lst


[...]
default 0 fallback 1 [...]
Das bewirkt, wenn der erste Kernel fehlschlägt (das Zählen beginnt bei 0, also ist der erste Kernel 0), dass Kernel #2 gestartet wird.

Gehe in der gleichen Datei ans Ende, wo sich die Kernel Zeilen befinden. Kopiere den ersten Bereich und füge diese Kopie am Anfang ein; ersetze root=/dev/hda6 mit root=/dev/md2 und (hd0,0) mit (hd1,0). Falls Du etwas wie resume=/dev/hda5 in Deiner Kernel Zeile stehen hast, ersetze es mit resume=/dev/md1:
[...]
title linux kernel (hd1,0)/vmlinuz BOOT_IMAGE=linux root=/dev/md2 resume=/dev/md1 initrd (hd1,0)/initrd.img title linux kernel (hd0,0)/vmlinuz BOOT_IMAGE=linux root=/dev/hda6 resume=/dev/hda5 initrd (hd0,0)/initrd.img
Die gesamte Datei sollte so ähnlich wie Folgendes aussehen:
timeout 10
color black/cyan yellow/cyan default 0 fallback 1 title linux kernel (hd1,0)/vmlinuz BOOT_IMAGE=linux root=/dev/md2 resume=/dev/md1 initrd (hd1,0)/initrd.img title linux kernel (hd0,0)/vmlinuz BOOT_IMAGE=linux root=/dev/hda6 resume=/dev/hda5 initrd (hd0,0)/initrd.img title failsafe kernel (hd0,0)/vmlinuz BOOT_IMAGE=failsafe root=/dev/hda6 failsafe initrd (hd0,0)/initrd.img
(hd1,0) verweist auf /dev/hdb was bereits Teil unseres RAID Arrays ist. In wenigen Minuten werden wir das System neu starten; das System wird dann versuchen von unseren (immer noch degraded) RAID Arrays aus zu starten; wenn es fehlschlägt, wird es von /dev/hda (-> fallback 1) aus starten.

Als Nächstes passen wir unsere Ramdisk an die neue Situation an:

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

Nun kopieren wir die Inhalte von /dev/hda1 und /dev/hda6 nach /dev/md0 und /dev/md2 (die auf /mnt/md0 und /mnt/md2 eingehängt sind):

cp -dpRx / /mnt/md2


cd /boot
cp -dpRx . /mnt/md0

6 GRUB vorbereiten (Teil 1)

Danach müssen wir den GRUB Bootloader auf der zweiten Festplatte /dev/hdb installieren:

grub

Gib in der GRUB Kommandozeile folgende Befehle ein:

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/menu.lst"... 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/menu.lst"... succeeded
Done.

grub>

quit

Wieder zurück in der normalen Kommandozeile, starten wir das System neu und hoffen, dass es ohne Fehler von unseren RAID Arrays aus startet:

reboot


7 /dev/hda vorbereiten

Wenn alles gut gegangen ist, solltest Du nun /dev/md0 und /dev/md2 in der Ausgabe von folgendem Befehl sehen

df -h


[root@server1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md2 4.4G 757M 3.4G 18% /
/dev/md0 167M 9.0M 150M 6% /boot
[root@server1 ~]#

Die Ausgabe von

cat /proc/mdstat

sollte wie folgt aussehen:

[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hdb5[1]
417536 blocks [2/1] [_U]

md0 : active raid1 hdb1[1]
176576 blocks [2/1] [_U]

md2 : active raid1 hdb6[1]
4642688 blocks [2/1] [_U]

unused devices: <none>
[root@server1 ~]#

Nun müssen wir die Partitionstypen unserer drei Partitionen auf /dev/hda zu Linux raid autodetect ändern:

fdisk /dev/hda

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


Command (m for help): <-- t
Partition number (1-6): <-- 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-6): <-- 5
Hex code (type L to list codes): <-- fd
Changed system type of partition 5 to fd (Linux raid autodetect)

Command (m for help): <-- t
Partition number (1-6): <-- 6
Hex code (type L to list codes): <-- fd
Changed system type of partition 6 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 ~]#

Nun können wir /dev/hda1, /dev/hda5 und /dev/hda6 den entsprechenden RAID Arrays hinzufügen:

mdadm --add /dev/md0 /dev/hda1
mdadm --add /dev/md1 /dev/hda5
mdadm --add /dev/md2 /dev/hda6

Sieh Dir nun dies an

cat /proc/mdstat

... Du solltest feststellen, dass die RAID Arrays synchronisiert werden:

[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hda5[2] hdb5[1]
417536 blocks [2/1] [_U]
resync=DELAYED

md0 : active raid1 hda1[0] hdb1[1]
176576 blocks [2/2] [UU]

md2 : active raid1 hda6[2] hdb6[1]
4642688 blocks [2/1] [_U]
[======>..............] recovery = 34.4% (1597504/4642688) finish=1.0min speed=50349K/sec

unused devices: <none>
[root@server1 ~]#

(Du kannst Folgendes ausführen

watch cat /proc/mdstat

um eine anhaltende Ausgabe des Prozesses zu erhalten. Um watch zu verlassen, drücke STRG+C.)

Warte bis die Synchronisation abgeschlossen ist (die Ausgabe sollte dann wie folgt aussehen:

[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hda5[0] hdb5[1]
417536 blocks [2/2] [UU]

md0 : active raid1 hda1[0] hdb1[1]
176576 blocks [2/2] [UU]

md2 : active raid1 hda6[0] hdb6[1]
4642688 blocks [2/2] [UU]

unused devices: <none>
[root@server1 ~]#

).

Passe dann /etc/mdadm.conf der neuen Situation an:

cp -f /etc/mdadm.conf_orig /etc/mdadm.conf
mdadm --examine --scan >> /etc/mdadm.conf

/etc/mdadm.conf sollte nun in etwas so aussehen:

cat /etc/mdadm.conf


# mdadm configuration file
# # mdadm will function properly without the use of a configuration file, # but this file is useful for keeping track of arrays and member disks. # In general, a mdadm.conf file is created, and updated, after arrays # are created. This is the opposite behavior of /etc/raidtab which is # created prior to array construction. # # # the config file takes two types of lines: # # DEVICE lines specify a list of devices of where to look for # potential member disks # # ARRAY lines specify information about how to identify arrays so # so that they can be activated # # You can have more than one device line and use wild cards. The first # example includes SCSI the first partition of SCSI disks /dev/sdb, # /dev/sdc, /dev/sdd, /dev/sdj, /dev/sdk, and /dev/sdl. The second # line looks for array slices on IDE disks. # #DEVICE /dev/sd[bcdjkl]1 #DEVICE /dev/hda1 /dev/hdb1 # # If you mount devfs on /dev, then a suitable way to list all devices is: #DEVICE /dev/discs/*/* # # # # ARRAY lines specify an array to assemble and a method of identification. # Arrays can currently be identified by using a UUID, superblock minor number, # or a listing of devices. # # super-minor is usually the minor number of the metadevice # UUID is the Universally Unique Identifier for the array # Each can be obtained using # # mdadm -D <md> # #ARRAY /dev/md0 UUID=3aaa0122:29827cfa:5331ad66:ca767371 #ARRAY /dev/md1 super-minor=1 #ARRAY /dev/md2 devices=/dev/hda1,/dev/hdb1 # # ARRAY lines can also specify a "spare-group" for each array. mdadm --monitor # will then move a spare between arrays in a spare-group if one array has a failed # drive but no spare #ARRAY /dev/md4 uuid=b23f3c6d:aec43a9f:fd65db85:369432df spare-group=group1 #ARRAY /dev/md5 uuid=19464854:03f71b1b:e0df2edd:246cc977 spare-group=group1 # # When used in --follow (aka --monitor) mode, mdadm needs a # mail address and/or a program. This can be given with "mailaddr" # and "program" lines to that monitoring can be started using # mdadm --follow --scan & echo $! > /var/run/mdadm # If the lines are not found, mdadm will exit quietly #MAILADDR root@mydomain.tld #PROGRAM /usr/sbin/handle-mdadm-events ARRAY /dev/md0 level=raid1 num-devices=2 UUID=6b4f013f:6fe18719:5904a9bd:70e9cee6 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=63194e2e:c656857a:3237a906:0616f49e ARRAY /dev/md2 level=raid1 num-devices=2 UUID=edec7105:62700dc0:643e9917:176563a7

8 GRUB vorbereiten (Teil 2)

Wir haben es fast geschafft. Nun müssen wir /boot/grub/menu.lst erneut bearbeiten. Momentan ist es konfiguriert, von /dev/hdb (hd1,0) zu starten. Natürlich möchten wir immer noch, dass das System in der Lage ist zu starten, wenn dev/hdb ausfällt. Daher kopieren wir die erste Kernel Zeile (die hd1 enthält), fügen sie unten ein und ersetzen hd1 mit hd0. Weiterhin kommentieren wir alle anderen Kernel Zeilen aus, sodass es wie folgt aussieht:

vi /boot/grub/menu.lst


timeout 10
color black/cyan yellow/cyan default 0 fallback 1 title linux kernel (hd1,0)/vmlinuz BOOT_IMAGE=linux root=/dev/md2 resume=/dev/md1 initrd (hd1,0)/initrd.img title linux kernel (hd0,0)/vmlinuz BOOT_IMAGE=linux root=/dev/md2 resume=/dev/md1 initrd (hd0,0)/initrd.img #title linux #kernel (hd0,0)/vmlinuz BOOT_IMAGE=linux root=/dev/hda6 resume=/dev/hda5 #initrd (hd0,0)/initrd.img #title failsafe #kernel (hd0,0)/vmlinuz BOOT_IMAGE=failsafe root=/dev/hda6 failsafe #initrd (hd0,0)/initrd.img
Aktualisiere danach Deine Ramdisk:

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

... und starte das System neu:

reboot

Es sollte ohne Probleme starten.

Das war's - Du hast erfolgreich Software RAID1 auf Deinem installierten Mandriva 2008.0 System aufgesetzt!

9 Test

Lass uns nun das Ausfallen der Festplatte simulieren. Es ist egal ob Du /dev/hda oder /dev/hdb auswählst. In diesem Beispiel nehem ich an, dass /dev/hdb ausgefallen ist.

Um den Ausfall der Festplatte zu simulieren, kannst Du das System entweder runter fahren und /dev/hdb vom System entfernen oder Du entfernst es wie folgt:

mdadm --manage /dev/md0 --fail /dev/hdb1
mdadm --manage /dev/md1 --fail /dev/hdb5
mdadm --manage /dev/md2 --fail /dev/hdb6

mdadm --manage /dev/md0 --remove /dev/hdb1
mdadm --manage /dev/md1 --remove /dev/hdb5
mdadm --manage /dev/md2 --remove /dev/hdb6

Fahre das System runter:

shutdown -h now

Füge dann eine neue /dev/hdb Festplatte hinzu (wenn Du einen Fehler von /dev/hda simulierst, solltest Du nun /dev/hdb anstelle von /dev/hda verwenden und die neue Festplatte /dev/hdb hinzufügen!) und starte das System. Es sollte immer noch ohne Probleme starten.

Führe nun dies aus

cat /proc/mdstat

und Du solltest feststellen, dass wir ein degraded Array haben:

[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hda5[0]
417536 blocks [2/1] [U_]

md0 : active raid1 hda1[0]
176576 blocks [2/1] [U_]

md2 : active raid1 hda6[0]
4642688 blocks [2/1] [U_]

unused devices: <none>
[root@server1 ~]#

Die Ausgabe von

fdisk -l

sollte wie folgt aussehen:

[root@server1 ~]# fdisk -l


Disk /dev/hda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/hda1 * 1 22 176683+ fd Linux raid autodetect
/dev/hda2 23 652 5060475 5 Extended
/dev/hda5 23 74 417658+ fd Linux raid autodetect
/dev/hda6 75 652 4642753+ fd Linux raid autodetect

Disk /dev/hdb: 5368 MB, 5368709120 bytes
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Disk identifier: 0x00000000

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


Disk /dev/md2: 4754 MB, 4754112512 bytes
2 heads, 4 sectors/track, 1160672 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000

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


Disk /dev/md0: 180 MB, 180813824 bytes
2 heads, 4 sectors/track, 44144 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000

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


Disk /dev/md1: 427 MB, 427556864 bytes
2 heads, 4 sectors/track, 104384 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk identifier: 0x00000000

Disk /dev/md1 doesn't contain a valid partition table
[root@server1 ~]#

Nun kopieren wir die Partitionstabelle von /dev/hda nach /dev/hdb:

sfdisk -d /dev/hda | sfdisk --force /dev/hdb


[root@server1 ~]# sfdisk -d /dev/hda | sfdisk --force /dev/hdb
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.
Checking that no-one is using this disk right now ...
OK

Disk /dev/hdb: 10402 cylinders, 16 heads, 63 sectors/track


sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/hdb: 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/hdb1 * 63 353429 353367 fd Linux raid autodetect
/dev/hdb2 353430 10474379 10120950 5 Extended
/dev/hdb3 0 - 0 0 Empty
/dev/hdb4 0 - 0 0 Empty
/dev/hdb5 353493 1188809 835317 fd Linux raid autodetect
/dev/hdb6 1188873 10474379 9285507 fd Linux raid autodetect
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 ~]#

Danach entfernen wir jegliche Überbleibsel von früheren RAID Arrays von /dev/hdb...

mdadm --zero-superblock /dev/hdb1
mdadm --zero-superblock /dev/hdb5
mdadm --zero-superblock /dev/hdb6

... und fügen /dev/hdb dem RAID Array hinzu:

mdadm -a /dev/md0 /dev/hdb1
mdadm -a /dev/md1 /dev/hdb5
mdadm -a /dev/md2 /dev/hdb6

Sieh Dir dies an

cat /proc/mdstat


[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hdb5[2] hda5[0]
417536 blocks [2/1] [U_]
resync=DELAYED

md0 : active raid1 hdb1[1] hda1[0]
176576 blocks [2/2] [UU]

md2 : active raid1 hdb6[2] hda6[0]
4642688 blocks [2/1] [U_]
[===========>.........] recovery = 59.9% (2784512/4642688) finish=7.5min speed=4076K/sec

unused devices: <none>
[root@server1 ~]#

Warte, bis die Synchronisation beendet ist:

[root@server1 ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 hdb5[1] hda5[0]
417536 blocks [2/2] [UU]

md0 : active raid1 hdb1[1] hda1[0]
176576 blocks [2/2] [UU]

md2 : active raid1 hdb6[1] hda6[0]
4642688 blocks [2/2] [UU]

unused devices: <none>
[root@server1 ~]#

Führe dann Folgendes aus

grub

und installiere den Bootloader auf beiden Festplatten:

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

Das war's. Du hast soeben eine fehlgeschlagene Festplatte in Deinem RAID1 Array ersetzt.

10 Links