Stern inaktivStern inaktivStern inaktivStern inaktivStern inaktiv
 
Der Einsatz von RAID1 hat gewisse Vorteile:
 
1) Ausfallsicherheit: Wenn eine Platte ausfällt läuft trotzdem alles weiter
2) Nach einem Plattenausfall erhält der Admin eine eMail und kann die defekte Platte austauschen und wieder das RAID1 mit 2 Platten versehen
3) Das Lesen von Daten von den 2 Platten ist schneller als wenn man nur eine Platte hat
 
Man kann sich eine RAID Hardwarekarte kaufen oder ein RAID mit Software betreiben. Gute RAID Karten sind zeimlich teuer - das SW RAID dagegen ist im Linux enthalten.
 
Auf den folgenden Seiten habe ich an einem einfachen Beispiel beschrieben, was man alles machen muss, um eine existierende openSuSE 11.2 Linux Installation so umzukonfigurieren, dass man ein RAID1 benutzt. Als wesentliche Vorlage für diese Anleitung habe ich diesen Wiki-Beitrag genommen. Weitere Informationen habe ich aus Linux Software Raid Setup, Quick HOWTO: Linux Software RAID sowie Linux RAID1 and Grub entnommen. Hilfreich war auch dieser Forumsthread , in dem mir bei meinenen Problemen geholfen wurde.
  
Damit ein raid1 genutzt werden kann sind ein paar Voraussetzungen notwendig:
 
1) Es müssen zwei Platten existieren, die möglichst identisch vom Typ und der Größe sein sollten. Bei mir sieht es z.B. so aus:
 
fdisk -l
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00033bcd

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         144     1156648+  82  Linux swap / Solaris
/dev/sda2   *         145         797     5245222+  83  Linux
/dev/sda3             798        1044     1984027+  83  Linux

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

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

 
df -h 
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             5.0G  1.1G  3.7G  23% /
udev                  377M  168K  377M   1% /dev
/dev/sda3             1.9G   35M  1.8G   2% /home
 
Es gibt also 3 Partitionen:
 
1) /dev/sda1 - Swap- swap
2) /dev/sda2 - root Filesystem (/) - ext4
3) /dev/sda3 - home Filesystem (/home) - ext4
 
Diese Info sollte man sich gut aufschreiben und immer parat haben, denn sie wird im Folgenden immer wieder benötigt werden.
 
 2) Es muss das raid1 module geladen sein. Das kann man prüfen. Es sollte
 
lsmod | grep raid  
raid1                  25696  0
 
als Ergebis kommen. Falls nicht muss in in /etc/sysconfig/kernel  in der Zeile INITRD_MODULES am Ende noch raid1 eingetragen werden. Danach mkinitrdeingegeben und nach dem nächsten Restartmuss das Modul geladen.

 

Nun müssen die neuen RAID Partitionen angelegt werden, d.h. es werden sämtliche Partitionsinformationen von /dev/sda nach /dev/sdb kopiert.:
 
sfdisk -d /dev/sda | sfdisk /dev/sdb
 
Danach bekommt man mit 
 
fdisk -l 
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00033bcd

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         144     1156648+  82  Linux swap / Solaris
/dev/sda2   *         145         797     5245222+  83  Linux
/dev/sda3             798        1044     1984027+  83  Linux

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         144     1156648+  82  Linux swap / Solaris
/dev/sdb2   *         145         797     5245222+  83  Linux
/dev/sdb3             798        1044     1984027+  83  Linux
 
d.h. beide Disks haben jetzt dasselbe Partitionslayout.
 
Jetzt müssen alle Partitions auf /dev/sdb als RAIDpartitions gekennzeichnet werden. (Die Nummern 1 2 3 bezeichnen die Partitionen, die geändert werden sollen)
 
for i in 1 2 3; do sfdisk --change-id /dev/sdb $i fd; done;  sfdisk -R /dev/sdb
 
und die Kontrolle
 
fdisk -l  
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00033bcd

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         144     1156648+  82  Linux swap / Solaris
/dev/sda2   *         145         797     5245222+  83  Linux
/dev/sda3             798        1044     1984027+  83  Linux

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         144     1156648+  fd  Linux raid autodetect
/dev/sdb2   *         145         797     5245222+  fd  Linux raid autodetect
/dev/sdb3             798        1044     1984027+  fd  Linux raid autodetect
 
Nun müssen die RAIDPartitionen angelegt werden.
 
for i in 1 2 3; do mdadm --create /dev/md$i --level=1 --raid-disks=2 missing /dev/sdb$i; done
mdadm: array /dev/md1started
mdadm: array /dev/md2 started
mdadm: array /dev/md3 started
 
Kontrolle:
 
cat /proc/mdstat
Personalities : [raid1]
md3 : active raid1 sdb3[1]
      1983936 blocks [2/1] [_U]

md2 : active raid1 sdb2[1]
      5245120 blocks [2/1] [_U]

md1 : active raid1 sdb1[1]
      1156544 blocks [2/1] [_U]


unused devices: <none>

Nun müssen die RAIDPartitionen für das RAID konfiguriert werden.
 
echo "DEVICE /dev/sd*" > /etc/mdadm.conf
 
definiert welche Platten im RAID sein können und der folgende Befehl scannt nun die /dev/md*-Geräte durch und trägt ihre Eigenschaften in /etc/mdadm.conf ein:
 
mdadm --detail --scan >> /etc/mdadm.conf
Kontrolle:
cat /etc/mdadm.conf

DEVICE /dev/sd*
ARRAY /dev/md1 metadata=0.90 UUID=f0045bf9:ddcdb29b:a24daeb9:4e1c5a02
ARRAY /dev/md2 metadata=0.90 UUID=0611c9b8:1aa41ea9:a24daeb9:4e1c5a02
ARRAY /dev/md3 metadata=0.90 UUID=97fcbd65:935c835b:a24daeb9:4e1c5a02
 

Nun müssen die neuen RAIDPartitionen formatiert werden: 

for i in 2 3; do mkfs.ext4  /dev/md$i; done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
328000 inodes, 1311280 blocks
65564 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1346371584
41 block groups
32768 blocks per group, 32768 fragments per group
8000 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables:  0/41
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
124160 inodes, 495984 blocks
24799 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=511705088
16 block groups
32768 blocks per group, 32768 fragments per group
7760 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Writing inode tables:  0/16
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
 
Nun noch das swap device initialisieren:
 
mkswap /dev/md1
 
Nun muss dafür gesorgt werden, dass beim Booten auch das Startscript für den RAID ausgeführt wird.
 
insserv /etc/init./boot.md
 
 
aufrufen.
 

Nun müssen alle Daten von den OriginalPartitionen auf die RaidPartitionen kopiert werden. Das dauert ein wenig.

Achtung!  Die / am Ende sind wichtig!

mount /dev/md2 /mnt; rsync -AHPSXavx / /mnt/; umount /mnt/
mount /dev/md3 /mnt; rsync -AHPSXavx /home /mnt/; umount /mnt/

 

Jetzt kann getestet werden, ob das System auch vom RAID bootet. Dazu muss aber nochdie neue /etc/fstab so geändert werden, dass dort die RAIDPartitionen benutzt werden.Dazu muss die neue RAIDRootPartition (im Beispiel /dev/md2) noch einmal als /mnt gemountet werden und dann dort in der /etc/fstab /dev/sda1 in /dev/md1 geändert werden. Dasselbe natürlich auch für /dev/sda2 und /dev/sda3. Ausserdem muss die initrd noch Informationen erhalten, so dass ein Booten die RAIDs konfiguriert werden.

 
mkinitrd -f md
 
mount /dev/md2 /mnt

Anschliessend muss die /etc/fstab wie folgt aus sehen (Die alten Zeilen sind mit einem # am Anfang auskommentiert).
 
#/dev/sad1           swap                 swap       defaults              0 0
/dev/md1             swap                 swap       defaults              0 0
#/dev/sda2           /                    ext4       acl,user_xattr        1 1
/dev/md2             /                    ext4       acl,user_xattr        1 1
#/dev/sda3           /home                ext4       acl,user_xattr        1 2
/dev/md3             /home                ext4       acl,user_xattr        1 2
proc                 /proc                proc       defaults              0 0
sysfs                /sys                 sysfs      noauto                0 0
debugfs              /sys/kernel/debug    debugfs    noauto                0 0
usbfs                /proc/bus/usb        usbfs      noauto                0 0
devpts               /dev/pts             devpts     mode=0620,gid=5       0 0

 
Dann muss die /boot/grub/menu.lst so geändert werden, dass das Betriebssystem sowohl von dre alten Partition als auch dre neuen RAIDPartition gestartet werden kann. Dazu muss der erste Eintrag dupliziert und am Ende angehängt werden und sda2 bzw sda1 ind md2 bzw md1 geändert werden.
 
# Modified by YaST2. Last modification on Sun Jun 13 00:10:27 CEST 2010
# THIS FILE WILL BE PARTIALLY OVERWRITTEN by perl-Bootloader
# Configure custom boot parameters for updated kernels in /etc/sysconfig/bootloader

default 0
timeout 8
##YaST - generic_mbr
gfxmenu (hd0,1)/boot/message
##YaST - activate

###Don't change this comment - YaST2 identifier: Original name: linux###
title openSUSE 11.2 - 2.6.31.5-0.1
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.31.5-0.1-default root=/dev/sda2 resume=/dev/sda1 splash=silent quiet showopts vga=0x314
    initrd /boot/initrd-2.6.31.5-0.1-default

###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- openSUSE 11.2 - 2.6.31.5-0.1
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.31.5-0.1-default root=/dev/sda2 showopts apm=off noresume nosmp maxcpus=0 edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 x11failsafe vga=0x314
    initrd /boot/initrd-2.6.31.5-0.1-default

###Don't change this comment - YaST2 identifier: Original name: floppy###
title Floppy
    rootnoverify (fd0)
    chainloader +1

###Don't change this comment - YaST2 identifier: Original name: linux###
title openSUSE 11.2 - 2.6.31.5-0.1 - RAID
    root (hd0,1)
    kernel /boot/vmlinuz-2.6.31.5-0.1-default root=/dev/md2 resume=/dev/md1 splash=silent quiet showopts vga=0x314
    initrd /boot/initrd-2.6.31.5-0.1-default
 
Jetzt kann nach einem Reboot  der letzte Menupunkt ausgewählt werden und und das System startet vom RAID. Falls was schiefgeht kann man immer noch wieder den ersten Menupunkt auswählen und von der OriginalsystemPartition booten.
 
Danach sollte man das halbe RAID System noch einmal prüfen ob swap sowie root und home Partition auf dem RAID liegen:
 
swapon -s
Filename                                Type            Size    Used    Priority
/dev/md1                                partition       1156536 0       -1
 
mount
/dev/md2 on / type ext4 (rw,acl,user_xattr)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
debugfs on /sys/kernel/debug type debugfs (rw)
udev on /dev type tmpfs (rw)
devpts on /dev/pts type devpts (rw,mode=0620,gid=5)
/dev/md3 on /home type ext4 (rw,acl,user_xattr)
securityfs on /sys/kernel/security type securityfs (rw)
none on /proc/fs/vmblock/mountPoint type vmblock (rw)

 
Nun erfolgt das Einbinden der OriginalPartitions in den RAID1 so dass es ein wirklicher RAID1 wird. Wenn dabei etwas schief geht besteht die grosse Gefahr, dass man seinen Backup zurückspielen muss. Deshalb sind die folgenden Schritte sehr sorgfältig vorzunehmen.
 
Alle Partitions auf /dev/sda müssen nun als RAIDpartitions gekennzeichnet werden. (Die Nummern 1 2 3 bezeichnen die Partitionen, die geändert werden sollen)
 
for i in 1 2 3; do sfdisk --change-id /dev/sda $i fd; done;  sfdisk -R /dev/sda
 
DiePatritionen werde nun ins RAID eingebunden:
 
for i in 1 2 3; do mdadm  /dev/md$i -a /dev/sda$i; done
 
Die laufende Plattensynchronisation kann man verfolgen und erst nach dem Ende der Synchronisation darf weitergemacht werden, da die grub EInträge nun nicht mehr stimmen.
 
watch cat /proc/mdstat
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4]
md3 : active raid1 sda3[2] sdb3[1]
      1983936 blocks [2/1] [_U]
        resync=DELAYED

md2 : active raid1 sda2[2] sdb2[1]
      5245120 blocks [2/1] [_U]
      [=>...................]  recovery =  9.6% (504768/5245120) finish=2.8min speed=28042K/sec

md1 : active raid1 sda1[0] sdb1[1]
      1156544 blocks [2/2] [UU]

unused devices: <none>
 
und sollte zum Schluss wie folgt aussehen:
 
Personalities : [raid1] [raid0] [raid6] [raid5] [raid4]
md3 : active raid1 sda3[0] sdb3[1]
      1983936 blocks [2/2] [UU]

md2 : active raid1 sda2[0] sdb2[1]
      5245120 blocks [2/2] [UU]

md1 : active raid1 sda1[0] sdb1[1]
      1156544 blocks [2/2] [UU]

unused devices: <none>

 
 Zum Schluss muss noch das grub Bootmenu in  /boot/grub/menu.lst angepasst werden sowie die bootloader auf beiden Platten erstellt werden.
 
Die /boot/grub/menu.lst muss am Kopf eine weitere zeile für fallback bekommen und die weiteren Einträge müssen von sda auf md umgestellt werden.Ausserdem ist ein weiterer Eintrag zu erstellen der im Ausfall der ersten Platte von der zweiten Platte bootet (root ist geändert). Wichtig ist auch dass der erste Eintrag geändert wird und dann dahinter noch einmal kopiert wirdund dort root geändert wird. Ansonsten stimmt die Zahl 1 nach dem fallback nicht.
 
# Modified by YaST2. Last modification on Sun Jun 13 00:10:27 CEST 2010
# THIS FILE WILL BE PARTIALLY OVERWRITTEN by perl-Bootloader
# Configure custom boot parameters for updated kernels in /etc/sysconfig/bootloader

default 0
# added for RAID
fallback 1
timeout 8
##YaST - generic_mbr
gfxmenu (hd0,1)/boot/message
##YaST - activate

###Don't change this comment - YaST2 identifier: Original name: linux###
title openSUSE 11.2 - 2.6.31.5-0.1 - RAID1 Disk 1
    root (hd0,1)
#    kernel /boot/vmlinuz-2.6.31.5-0.1-default root=/dev/sda2 resume=/dev/sda1 splash=silent quiet showopts vga=0x314
    kernel /boot/vmlinuz-2.6.31.5-0.1-default root=/dev/md2 resume=/dev/md1 splash=silent quiet showopts vga=0x314
    initrd /boot/initrd-2.6.31.5-0.1-default

# added for RAID
title openSUSE 11.2 - 2.6.31.5-0.1 - RAID1 Disk 2
    root (hd1,1)
    kernel /boot/vmlinuz-2.6.31.5-0.1-default root=/dev/md2 resume=/dev/md1 splash=silent quiet showopts vga=0x314

###Don't change this comment - YaST2 identifier: Original name: failsafe###
title Failsafe -- openSUSE 11.2 - 2.6.31.5-0.1
    root (hd0,1)
#    kernel /boot/vmlinuz-2.6.31.5-0.1-default root=/dev/sda2 showopts apm=off noresume nosmp maxcpus=0 edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 x11failsafe vga=0x314
    kernel /boot/vmlinuz-2.6.31.5-0.1-default root=/dev/md2 showopts apm=off noresume nosmp maxcpus=0 edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 x11failsafe vga=0x314
    initrd /boot/initrd-2.6.31.5-0.1-default

###Don't change this comment - YaST2 identifier: Original name: floppy###
title Floppy
    rootnoverify (fd0)
    chainloader +1
 
Nun muss die /boot/grub/devices.map noch erweiter werden um die neue Platte /dev/sdb:
 
(fd0)   /dev/fd0
(hd0)   /dev/sda
(hd1)   /dev/sdb

Auf beiden Platten muss der grub Bootloader  installiert werden.
 

grub
grub> root (hd0,1)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 20 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+20 p (hd0,1)/boot/grub/stage2
/boot/grub/menu.lst"... succeeded
Done.

grub

grub> root (hd1,1)

Filesystem type is ext2fs, partition type 0xfd

grub> setup (hd1)

Checking if "/boot/grub/stage1" exists... yes

Checking if "/boot/grub/stage2" exists... yes

Checking if "/boot/grub/e2fs_stage1_5" exists... yes

Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... 20 sectors are embedded.

succeeded

Running "install /boot/grub/stage1 (hd0) (hd1)1+20 p (hd1,1)/boot/grub/stage2

/boot/grub/menu.lst"... succeeded

Done.

Der letzte Schritt besteht darin, noch einmal die initrd neu zu bauen

mkinitrd -f md

Damit ist das System von einem nicht RAID System zu einem RAID1 System ungewandelt worden.   

 
Damit man auch sofort eine eMail bekommt wenn eine Platte ausfällt muss noch die /etc/sysconfig/mdad.conf angepasst werden und eine gültige eMail konfiguriert werden. Denn leider nützt ein RAID1 nichts wenn man erst beim Ausfall der zweiten Platte mitbekommt dass schon viele Tage vorher die erste Platte ausgefallen ist.
Kommentar schreiben

*** Hinweis ***

Kommentare sind erwünscht. Aber um lästige Spamposts abweisen zu können gibt es ein paar Dinge die zu beachten sind:
  1. Kommentare mit dem Text http werden sofort zurückgewiesen mit der Meldung Sie sind nicht berechtigt den Tag zu verwenden. zz
  2. Kommentare werden manuell überprüft und es dauert deshalb in der Regel einen Tag bis sie veröffentlicht werden.