Software RAID1 auf einem laufenden System (Inkl. GRUB Konfiguration) (Debian Etch) einrichten

Version 1.0
Author: Falko Timme


Diese Anleitung erklärt, wie man die Software RAID1 auf einem bereits laufenden Debian Etch System einrichtet. Der GRUB Bootloader wird so konfiguriert, dass das System immer noch in der Lage sein wird, hochzufahren wenn eine der Festplatten ausfällt (egal welche).

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

1 Vorbemerkung

In dieser Anleitung verwende ich ein Debian Etch System mit zwei Festplatten /dev/sda und /dev/sdb, die eine identische Größe haben. /dev/sdb wird derzeit nicht verwendet und /dev/sda hat folgende Partitionen:
  • /dev/sda1: /boot partition, ext3;
  • /dev/sda2: swap;
  • /dev/sda3: / partition, ext3
Am Ende möchte ich Folgendes vorfinden:
  • /dev/md0 (made up of /dev/sda1 and /dev/sdb1): /boot partition, ext3;
  • /dev/md1 (made up of /dev/sda2 and /dev/sdb2): swap;
  • /dev/md2 (made up of /dev/sda3 and /dev/sdb3): / partition, ext3
Dies ist die derzeitige Situation:

df -h


server1:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 4.4G 729M 3.4G 18% /
tmpfs 126M 0 126M 0% /lib/init/rw
udev 10M 56K 10M 1% /dev
tmpfs 126M 0 126M 0% /dev/shm
/dev/sda1 137M 12M 118M 10% /boot
server1:~#

fdisk -l

server1:~# fdisk -l


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

Device Boot Start End Blocks Id System
/dev/sda1 * 1 18 144553+ 83 Linux
/dev/sda2 19 80 498015 82 Linux swap / Solaris
/dev/sda3 81 652 4594590 83 Linux

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

Disk /dev/sdb doesn't contain a valid partition table
server1:~#

2 Installation von mdadm

Das wichtigste Tool für das Setup von RAID ist mdadm. Lass es uns so installieren:

apt-get install initramfs-tools mdadm

Folgende Frage wird Dir gestellt:

MD arrays needed for the root filesystem: <-- all

Danach laden wir ein paar Kernelmodule (um einen Neustart zu verhindern):

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

Lass nun Folgendes laufen

cat /proc/mdstat

Die Ausgabe sollte wie folgt aussehen:

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

3 Vorbereiten von /dev/sdb

Um ein RAID1 array auf Deinem bereits laufenden System zu installieren, müssen wir die /dev/sdb Festplatte für RAID1 vorbereiten, dann die Inhalte unserer /dev/sda Festplatte darauf kopierenhard und schließlich /dev/sda dem RAID1 array hinzufügen.

Zuerst kopieren wir die Partitionstabelle von /dev/sda zu /dev/sdb sodass beide Festplatten exakz das gleiche Layout haben:

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

Die Ausgabe sollte folgendermaßen aussehen:

server1:~# sfdisk -d /dev/sda | sfdisk /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 * 63 289169 289107 83 Linux
/dev/sdb2 289170 1285199 996030 82 Linux swap / Solaris
/dev/sdb3 1285200 10474379 9189180 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).)
server1:~#

Der Befehl

fdisk -l

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

server1:~# fdisk -l


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

Device Boot Start End Blocks Id System
/dev/sda1 * 1 18 144553+ 83 Linux
/dev/sda2 19 80 498015 82 Linux swap / Solaris
/dev/sda3 81 652 4594590 83 Linux

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

Device Boot Start End Blocks Id System
/dev/sdb1 * 1 18 144553+ 83 Linux
/dev/sdb2 19 80 498015 82 Linux swap / Solaris
/dev/sdb3 81 652 4594590 83 Linux
server1:~#

Als Nächstes müssen wir die Partitionsart unserer drei Partitionen auf /dev/sdb zu Linux raid autodetect ändern:

fdisk /dev/sdb

server1:~# fdisk /dev/sdb


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/
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-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.
server1:~#


Um sicher zu gehen, dass keine Reste von vorhergehenden RAID Installationen auf /dev/sdb zu finden sind, lassen wir folgende Befehle laufen:

mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdb3

Wenn es keine Reste von vorhergehenden RAID Installationen gibt, wird jeder der obrigen Befehle einen Fehler wie diesen anzeigen (von dem man sich aber nicht beunruhigen lassen muss):

server1:~# mdadm --zero-superblock /dev/sdb1
mdadm: Unrecognised md component device - /dev/sdb1
server1:~#

Sonst werden die Befehle gar nichts anzeigen.

4 Unsere RAID Arrays erstellen

Lass uns nun unsere RAID arrays erstellen /dev/md0, /dev/md1 und /dev/md2. /dev/sdb1 wird zu /dev/md0 hinzugefügt, /dev/sdb2 zu /dev/md1 und /dev/sdb3 zu /dev/md2. /dev/sda1, /dev/sda2 and /dev/sda3 können noch nicht gleich hinzugefügt werden (da das System derzeit auf ihnen läuft). Daher verwenden wir den Platzhalter missing in den folgenden drei Befehlen:

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

Der Befehl

cat /proc/mdstat

sollte nun anzeigen, dass Du drei zerfallene RAID arrays hast ([_U] or [U_] bedeutet, dass ein array fehlerhaft ist während [UU] bedeutet, dass das array in Ordnung ist):

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

md1 : active raid1 sdb2[1]
497920 blocks [2/1] [_U]

md0 : active raid1 sdb1[1]
144448 blocks [2/1] [_U]

unused devices: <none>
server1:~#

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

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

Nun müssen wir /etc/mdadm/mdadm.conf (was keinerlei Informationen über unsere neuen RAID arrays beinhaltet) der neuen Situation anpassen:

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

Den Inhalt der Datei anzeigen:

cat /etc/mdadm/mdadm.conf

Am Ende der Datei solltest Du nun Angaben über unsere drei (fehlerhaften) RAID arrays sehen:
# mdadm.conf
# # Please refer to mdadm.conf(5) for information about this file. # # by default, scan all partitions (/proc/partitions) for MD superblocks. # alternatively, specify devices to scan, using wildcards if desired. DEVICE partitions # auto-create devices with Debian standard permissions CREATE owner=root group=disk mode=0660 auto=yes # automatically tag new arrays as belonging to the local system HOMEHOST <system> # instruct the monitoring daemon where to send mail alerts MAILADDR root # This file was auto-generated on Mon, 26 Nov 2007 21:22:04 +0100 # by mkconf $Id: mkconf 261 2006-11-09 13:32:35Z madduck $ ARRAY /dev/md0 level=raid1 num-devices=2 UUID=72d23d35:35d103e3:01b5209e:be9ff10a ARRAY /dev/md1 level=raid1 num-devices=2 UUID=a50c4299:9e19f9e4:01b5209e:be9ff10a ARRAY /dev/md2 level=raid1 num-devices=2 UUID=99fee3a5:ae381162:01b5209e:be9ff10a

5 Das System An RAID1 Anpassen

Lass uns nun /dev/md0 und /dev/md2 mounten (wir müssen das /dev/md1 nicht mounten):

mkdir /mnt/md0
mkdir /mnt/md2

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

Du findest nun beide arrays in der Ausgabe von

mount


server1:~# mount
/dev/sda3 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
/dev/md0 on /mnt/md0 type ext3 (rw)
/dev/md2 on /mnt/md2 type ext3 (rw)
server1:~#

Als Nächstes bearbeiten wir /etc/fstab. Ersetze /dev/sda1 mit /dev/md0, /dev/sda2 mit /dev/md1, und /dev/sda3 mit /dev/md2 so dass die Datei wie folgt aussieht:

vi /etc/fstab


# /etc/fstab: static file system information.
# # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/md2 / ext3 defaults,errors=remount-ro 0 1 /dev/md0 /boot ext3 defaults 0 2 /dev/md1 none swap sw 0 0 /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
Erstetze nun /dev/sda1 mit /dev/md0 und /dev/sda3 mit /dev/md2 in /etc/mtab:

vi /etc/mtab


/dev/md2 / ext3 rw,errors=remount-ro 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0 proc /proc proc rw,noexec,nosuid,nodev 0 0 sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0 udev /dev tmpfs rw,mode=0755 0 0 tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0 devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0 /dev/md0 /boot ext3 rw 0 0
Nun hoch zum GRUB Boot loader. Öffne /boot/grub/menu.lst und füge fallback 1 gleich nach default 0 hinzu:

vi /boot/grub/menu.lst


[...]
default 0 fallback 1 [...]
Das bewirkt, dass wenn der erste Kernel ausfällt, (beginnend mit 0, also ist der erste Kernel 0) Kernel #2 hochgefahren wird.

Gehe in der gleichen Datei bis ans Ende, wo Du einige Kernelzeilen finden solltest. Kopiere die erste von ihnen und füge sie vor der ersten vorhandenen Zeile ein; ersetze root=/dev/sda3 mit root=/dev/md2 und root (hd0,0) mit root (hd1,0):
[...]
## ## End Default Options ## title Debian GNU/Linux, kernel 2.6.18-4-486 RAID (hd1) root (hd1,0) kernel /vmlinuz-2.6.18-4-486 root=/dev/md2 ro initrd /initrd.img-2.6.18-4-486 savedefault title Debian GNU/Linux, kernel 2.6.18-4-486 root (hd0,0) kernel /vmlinuz-2.6.18-4-486 root=/dev/sda3 ro initrd /initrd.img-2.6.18-4-486 savedefault title Debian GNU/Linux, kernel 2.6.18-4-486 (single-user mode) root (hd0,0) kernel /vmlinuz-2.6.18-4-486 root=/dev/sda3 ro single initrd /initrd.img-2.6.18-4-486 savedefault ### END DEBIAN AUTOMAGIC KERNELS LIST
root (hd1,0) bezieht sich auf /dev/sdb die bereits ein Teil unserer RAID arrays ist. Wir werden das System in ein paar Minuten neu starten; das System wird dann versuchen von unseren (immer noch fehlerhaften) RAID arrays hochzufahren; wenn es fehlschlägt, wird es von /dev/sda (-> fallback 1) hochfahren.

Als Nächstes passen wir unsere Ramdisk der neuen Situation an:

update-initramfs -u

Nun kopieren wir die Inhalte von /dev/sda1 und /dev/sda3 zu /dev/md0 und /dev/md2 (die auf /mnt/md0 und /mnt/md2 gemountet sind):

cp -dpRx / /mnt/md2


cd /boot
cp -dpRx . /mnt/md0

6 GRUB (Teil 1) vorbereiten

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

grub

IN der GRUB Kommandozeile, gib 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

Zurück in der normalen Kommandozeile. Wir starten das System neu und hoffen, dass es gut von unseren RAID arrays hochfährt:

reboot


7 /dev/sda Vorbereiten

Wenn alles gut läuft, findest Du /dev/md0 und /dev/md2 in der Ausgabe von

df -h


server1:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md2 4.4G 730M 3.4G 18% /
tmpfs 126M 0 126M 0% /lib/init/rw
udev 10M 68K 10M 1% /dev
tmpfs 126M 0 126M 0% /dev/shm
/dev/md0 137M 17M 114M 13% /boot
server1:~#

Die Ausgabe von

cat /proc/mdstat

sollte wie folgt aussehen:

server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[1]
4594496 blocks [2/1] [_U]

md1 : active raid1 sdb2[1]
497920 blocks [2/1] [_U]

md0 : active raid1 sdb1[1]
144448 blocks [2/1] [_U]

unused devices: <none>
server1:~#

Nun müssen wir auch die Partitionsart unserer drei Partitionen auf /dev/sda zu Linux raid autodetect ändern:

fdisk /dev/sda

server1:~# 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.
server1:~#

Nun können wir /dev/sda1, /dev/sda2, und /dev/sda3 zu den entsprechenden RAID arrays hinzufügen:

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

Sieh Dir nun Folgendes an

cat /proc/mdstat

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

server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[2] sdb3[1]
4594496 blocks [2/1] [_U]
[=====>...............] recovery = 29.7% (1367040/4594496) finish=0.6min speed=85440K/sec

md1 : active raid1 sda2[0] sdb2[1]
497920 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
144448 blocks [2/2] [UU]

unused devices: <none>
server1:~#

(Du kannst Folgendes laufen lassen

watch cat /proc/mdstat

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

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

server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0] sdb3[1]
4594496 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
497920 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
144448 blocks [2/2] [UU]

unused devices: <none>
server1:~#

).

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

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

/etc/mdadm/mdadm.conf sollte nun so ähnlich wie Folgendes aussehen:

cat /etc/mdadm/mdadm.conf


# mdadm.conf
# # Please refer to mdadm.conf(5) for information about this file. # # by default, scan all partitions (/proc/partitions) for MD superblocks. # alternatively, specify devices to scan, using wildcards if desired. DEVICE partitions # auto-create devices with Debian standard permissions CREATE owner=root group=disk mode=0660 auto=yes # automatically tag new arrays as belonging to the local system HOMEHOST <system> # instruct the monitoring daemon where to send mail alerts MAILADDR root # This file was auto-generated on Mon, 26 Nov 2007 21:22:04 +0100 # by mkconf $Id: mkconf 261 2006-11-09 13:32:35Z madduck $ ARRAY /dev/md0 level=raid1 num-devices=2 UUID=72d23d35:35d103e3:2b3d68b9:a903a704 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=a50c4299:9e19f9e4:2b3d68b9:a903a704 ARRAY /dev/md2 level=raid1 num-devices=2 UUID=99fee3a5:ae381162:2b3d68b9:a903a704

8 GRUB (Teil 2) vorbereiten

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

vi /boot/grub/menu.lst


[...]
## ## End Default Options ## title Debian GNU/Linux, kernel 2.6.18-4-486 RAID (hd1) root (hd1,0) kernel /vmlinuz-2.6.18-4-486 root=/dev/md2 ro initrd /initrd.img-2.6.18-4-486 savedefault title Debian GNU/Linux, kernel 2.6.18-4-486 RAID (hd0) root (hd0,0) kernel /vmlinuz-2.6.18-4-486 root=/dev/md2 ro initrd /initrd.img-2.6.18-4-486 savedefault #title Debian GNU/Linux, kernel 2.6.18-4-486 #root (hd0,0) #kernel /vmlinuz-2.6.18-4-486 root=/dev/sda3 ro #initrd /initrd.img-2.6.18-4-486 #savedefault #title Debian GNU/Linux, kernel 2.6.18-4-486 (single-user mode) #root (hd0,0) #kernel /vmlinuz-2.6.18-4-486 root=/dev/sda3 ro single #initrd /initrd.img-2.6.18-4-486 #savedefault ### END DEBIAN AUTOMAGIC KERNELS LIST
In der gleichen Datei befindet sich eine kopt Zeile; ersetze /dev/sda3 mit /dev/md2 (entferne nicht # am Anfang der Zeile!):
[...]
# kopt=root=/dev/md2 ro [...]
Aktualisiere danach Deine Ramdisk:

update-initramfs -u

... und starte das System neu:

reboot

Es sollte ohne Probleme starten.


Das war es - Du hast die Software RAID1 erfolgreich auf Deinem laufenden Debian Etch System eingerichtet!

9 Testen

Lass uns nun einen Ausfall der Festplatte simulieren. Es spielt keine Rolle ob Du /dev/sda oder /dev/sdb auswählst. In diesem Beispiel nehme ich an, dass /dev/sdb ausgefallen ist.

Um einen Ausfall der Festplatte zu simulieren, kannst Du entweder das System runter fahren und /dev/sdb aus dem System entfernen oder Du entfernst es wie folgt:

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

Fahre das System runter:

shutdown -h now

Baue dann eine neue /dev/sdb Festplatte ein (falls Du ein Versagen von /dev/sda simulierst, solltest Du jetzt /dev/sdb da einbauen, wo vorher /dev/sda war und die neue Festplatte als /dev/sdb einbauen!) und das System starten. Es sollte immer noch ohne Probleme starten.

Führe nun Folgendes aus

cat /proc/mdstat

und Du müsstest sehen, dass wir ein fehlgeschlagenes array haben:

server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[0]
4594496 blocks [2/1] [U_]

md1 : active raid1 sda2[0]
497920 blocks [2/1] [U_]

md0 : active raid1 sda1[0]
144448 blocks [2/1] [U_]

unused devices: <none>
server1:~#

Die Ausgabe von

fdisk -l

sollte wie folgt aussehen:

server1:~# fdisk -l


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

Device Boot Start End Blocks Id System
/dev/sda1 * 1 18 144553+ fd Linux raid autodetect
/dev/sda2 19 80 498015 fd Linux raid autodetect
/dev/sda3 81 652 4594590 fd Linux raid autodetect

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

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


Disk /dev/md0: 147 MB, 147914752 bytes
2 heads, 4 sectors/track, 36112 cylinders
Units = cylinders of 8 * 512 = 4096 bytes

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


Disk /dev/md1: 509 MB, 509870080 bytes
2 heads, 4 sectors/track, 124480 cylinders
Units = cylinders of 8 * 512 = 4096 bytes

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


Disk /dev/md2: 4704 MB, 4704763904 bytes
2 heads, 4 sectors/track, 1148624 cylinders
Units = cylinders of 8 * 512 = 4096 bytes

Disk /dev/md2 doesn't contain a valid partition table
server1:~#

Nun kopieren wir die Partitionstabelle von /dev/sda zu /dev/sdb:

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

(Wenn Du eine Fehlermeldung erhältst, kannst Du die --force Option versuchen:

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

)

server1:~# sfdisk -d /dev/sda | sfdisk /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 * 63 289169 289107 fd Linux raid autodetect
/dev/sdb2 289170 1285199 996030 fd Linux raid autodetect
/dev/sdb3 1285200 10474379 9189180 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).)
server1:~#

Entferne danach alle Reste eines vorhergehenden RAID array von /dev/sdb...

mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdb3

... und füge /dev/sdb dem RAID array hinzu:

mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb2
mdadm -a /dev/md2 /dev/sdb3

Sieh Dir nun Folgendes an

cat /proc/mdstat


server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[2] sda3[0]
4594496 blocks [2/1] [U_]
[======>..............] recovery = 30.8% (1416256/4594496) finish=0.6min speed=83309K/sec

md1 : active raid1 sdb2[1] sda2[0]
497920 blocks [2/2] [UU]

md0 : active raid1 sdb1[1] sda1[0]
144448 blocks [2/2] [UU]

unused devices: <none>
server1:~#

Warte bis die Synchronisation abgeschlossen ist:

server1:~# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[1] sda3[0]
4594496 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
497920 blocks [2/2] [UU]

md0 : active raid1 sdb1[1] sda1[0]
144448 blocks [2/2] [UU]

unused devices: <none>
server1:~#

Dann führe 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 gerade eine ausgefallene Festplatte in Deinem RAID1 array ersetzt.

10 Links