Howto für ein Softraid1 mit LVM und grub
Diese Dokument beschreibt die Installation von Softraid-1 mitmodularem Kernel auf einem laufendem Debian-System. Es soll alszusätzliche Hilfe zu den man-Pages des Paketes mdadm sein und dieInstallation eines SoftRaid-1 erleichtern. Alle Angaben sind nach bestem Wissen, aber natürlich ohne Gewähr (no warranty in any kind).
Systemanforderung und Versionen
Systemanforderung
Hardware
Einen funktionierenden Rechner mit zwei, nach Möglichkeit selben Modelle bzw. Kapazitäten, Festplatten.
Eine der beiden Festplatten sollte leer und unpartioniert sein. Bei IDE-Platten sollte die 1. Platte auf dem Primary und die 2. Platte auf dem Secondary Bus, jeweils als Master gejumpert, angeschlossensein. Es wird davon ausgegangen, das die 1. Platte (/dev/hda) das laufenden System enthält. Die 2. Platte ist /dev/hdc und ist unpartioniert.
Software
Neben einem laufenden Linux-System werden die Pakete mdadm, lvm2 und lvm-common benötigt. Der sollte Kernel 2.4.x. oder neuersein. Weiterhin kommt grub zum Einsatz.
Bei dieser Installation wird verwendet:
Kernel-image (Version 2.6.11-7 für K7) «ist nicht der default-Kernel»
mdadm (Version 1.9.0-4.1)
lvm-common (Version 1.5.17)
lvm2 (Version 2.01.04-5)
Diese Pakete sind aus der aktuellen Debian testing (sarge) vom August2005.
Installation und Konfiguration
Installation
Installieren Sie die Pakete mdadm, lvm2 und lvm-common. Evtl. noch fehlende Pakete werden automatisch mitinstalliert.
apt-get install mdadm lvm2 lvm-common
Konfiguration
Nun bereiten Sie die die 2. Platte für das Raid vor. Dazu wird die Partitionstabelle von /dev/hda nach /dev/hdc kopiert. Anschließendwerden die Partitionen als Raid-Autodetect (Type fd) eingestellt. Mit
sfdisk -d /dev/hda | sfdisk /dev/hdc
ist das schnell erledigt. Jetzt werden noch alle Partitionen auf den Typ "fd" umgestellt.
sfdisk --change-id /dev/hdc "Partition-Nr." fd
Alle Partionen mit sfdisk auf einmal zu ändern habe ich nicht hinbekommen.[1] Schließlich noch die Kontrolle, das alles richtig ist.
server:/# sfdisk -l /dev/hdc
Disk /dev/hdc: 14593 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/hdc1 * 0+ 29 30- 240943+ fd Linux raid autodetect
/dev/hdc2 30 14592 14563 116977297+ 5 Extended
/dev/hdc3 0 - 0 0 0 Empty
/dev/hdc4 0 - 0 0 0 Empty
/dev/hdc5 30+ 47 18- 144553+ fd Linux raidautodetect
/dev/hdc6 48+ 109 62- 497983+ fd Linux raidautodetect
/dev/hdc7 110+ 14592 14483- 116334666 fd Linux raidautodetect
Wenn alles in Ordnung ist, kommen als nächstes die Kernelmodule dran. Ich habe hier bewußt keinen neuen Kernel kompiliert um nicht bei jeder Versionänderung einen neuen Kernel zu backen.
modprobe md raid-1
sollte das erledigt haben. Wenn die Kontrolle wie nachfolgend ausfällt
server:/# lsmod | grep raid1
raid1 16576 4
md 47184 5 raid1
wurden die Module geladen und sie können in /etc/modules eingetragen werden. Am besten an oberster Stelle, damit sie als erste geladen werden. Es geht auch mit
server:/# insmod md raid1
server:/# depmod -a
An dieser Stelle habe ich den Rechner neu gestartet.
Nun werden die Raidpartitionen angelegt.
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing/dev/hdc1
mdadm --create /dev/md5 --level=1 --raid-disks=2 missing /dev/hdc5
mdadm --create /dev/md6 --level=1 --raid-disks=2 missing /dev/hdc6
mdadm --create /dev/md7 --level=1 --raid-disks=2 missing /dev/hdc7
Die Kontrolle wird mit cat /proc/mdstat durchgeführt. Sind die Devices vorhanden? Es sollte so aussehen:
server:# cat /proc/mdstat
Personalities : [raid1]
md7 : active raid1 hdc7[1]
116334592 blocks [2/1] [_U]
md6 : active raid1 hdc6[1]
144448 blocks [2/1] [_U]
md5 : active raid1 hdc5[1]
144448 blocks [2/1] [_U]
md1 : active raid1 hdc1[1]
240832 blocks [2/1] [_U]
unused devices: <none>
Sollte es hierbei zu Fehlermeldungen kommen dann wird ein leererSuperblock benötigt. Der wird erzeugt mit
mdadm --zero-superblock /dev/hdc[partitions-Nr] (man mdadm)
Jetzt wird noch die raidconfig-Datei angelegt.
server:# echo DEVICE /dev/hda[1567] /dev/hdc[1567] >/etc/mdadm/mdadm.conf
server:# mdadm -D --brief -s /dev/md[1567] >> /etc/mdadm/mdadm.conf
Und nun werden die Partitionen als ext3 und LVM angelegt.
server:# mkfs.ext3 /dev/md1
server:# mkfs.ext3 /dev/md5
server:# mkswap /dev/md6
Das physikalische Volume wird angelegt und die Volumegruppe wird auch angelegt.
server:# pvcreate /dev/md7
server:# vgcreate server /dv/md7
Auch die logische Volumes bzw. die Partitionen werden nun angelegt. Bei mir sehen sie so aus.
server:# lvcreate -L 5G -n usr server
server:# lvcreate -L 10G -n var server
server:# lvcreate -L 20G -n home server
server:# lvcreate -L 5G -n spool server
server:# lvcreate -L 2G -n web server
server:# lvcreate -L 15G -n mirror server
Die Partitionen noch formatieren
server:# mkfs.ext3 /dev/server/usr
server:# mkfs.ext3 /dev/server/var
server:# mkfs.ext3 /dev/server/home
server:# mkfs.ext3 /dev/server/spool
server:# mkfs.ext3 /dev/server/web
server:# mkfs.ext3 /dev/server/mirror
und die anschließend mounten. Aber zuerst ein Verzeichnis dafür erstellen mit
server:# mkdir /new-disk/
server:# mount /dev/server/usr /new-disk/usr/
server:# mount /dev/server/var /new-disk/var/
server:# mount /dev/server/home /new-disk/home/
server:# mount /dev/server/spool /new-disk/var/spool/
server:# mount /dev/server/web /new-disk/var/www
server:# mount /dev/server/mirror /new-disk/srv/mirror/
Um zu prüfen ob die Partitionen automatisch geladen werden, tragen Sie in /etc/fstab die Zeilen zusätzlich ein:
/dev/md1 /new-disk/ ext3 defaults 0 0
/dev/md5 /new-disk/boot ext3 defaults 0 0
/dev/server/usr /new-disk/usr ext3 defaults 0 0
/dev/server/var /new-disk/var ext3 defaults 0 0
/dev/server/home /new-disk/home ext3 defaults 0 0
/dev/server/spool /new-disk/var/spool ext3 defaults 0 0
/dev/server/web /new-disk/var/www ext3 defaults 0 0
/dev/server/mirror /new-disk/srv/mirror ext3 defaults 0 0
Und in /etc/lvm/lvm.conf muß ebenfalls noch eine Änderung vorgenommen werden. Es muß
md_component_detection = 1
aktiviert werden. Sonst erkennt LVM die Raid-Devices nicht und mounted stattdessen /dev/hdc.
Zum Testen können Sie jetzt den Rechner neustarten. Die Platte /dev/hdc sollte mit ihren Devices unter /new-disk/ gemountet sein. Dann funktionieren die md-Devices und auch die LVM Partitionen.
Ok. Der Neustart hat funktioniert und die md-Devices sind auch nach new-disk gemountet. Jetzt kopieren Sie die Daten auf die andere Platte. Dazu habe ich mir ein kleines Bash-Script erstellt.
#! /bin/sh
# Hier werden die Daten kopiert.
echo "Daten werden kopiert"
echo "Rootverzeichnis"
cp -uax / /new-disk/
echo "/boot"
cp -uax /boot/ /new-disk/
echo "Ab hier die LVM-Partitionen"
echo "usr nach /new-disk/usr"
cp -uax /usr/ /new-disk/
echo "var nach /new-disk/var"
cp -uax /var/ /new-disk/
echo "spool nach /new-disk/spool"
cp -uax /var/spool/ /new-disk/var/
echo "home nach /new-disk/home"
cp -uax /home /new-disk/
echo "mirror nach /new-disk/mirror"
cp -uax /srv/mirror/ /new-disk/srv/
echo "software nach /new-disk/software"
cp -uax /srv/software/ /new-disk/srv/
echo "/var/www nach /new-disk/web"
cp -uax /var/www/ /new-disk/var/
Danach passen Sie die /new-disk/etc/fstab an. Fertig sollte sie so aussehen:
# /etc/fstab: static file system information.
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/md6 none swap sw 0 0
/dev/md1 / ext3 defaults,errors=remount-ro 0 1
/dev/md5 /boot ext3 defaults 0 2
/dev/server/usr /usr ext3 defaults 0 0
/dev/server/var /var ext3 defaults 0 0
/dev/server/home /home ext3 defaults 0 0
/dev/server/spool /var/spool ext3 defaults 0 0
/dev/server/web /var/www ext3 defaults 0 0
/dev/server/mirror /srv/mirror ext3 defaults 0 0
Jetzt muß noch ein neues initrd für die 2. Platte erstellt werden, damit die Module geladen und von den md-Device gebootet werden können. Damit das nur auf hdc installiert wird, wird erstmal in /new-disk/etc/mkinitrd/mkinitrd.conf die Zeile ROOT=/dev/hda nach
ROOT=/dev/md1
geändert. Dann wird ein initrd mit den zusätzlichen Kernelmodulen neu erzeugt.
mkinitrd -d /new-disk/etc/mkinitrd/mkinitrd.conf -o/new-disk/boot/initrd.img-2.6.11-1-686-raid
Als nächstes muß grub auf /dev/hdc in den MBR geschrieben werden. Dazu starten Sie grub und geben die nachfolgenden Parameter ein.
Probing devices to guess BIOS drives. This may take a long time.
grub> device (hd0) /dev/hdc
grub> root (hd0,4)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
grub> quit
Danach wird /new-disk/boot/grub/menu.lst noch geändert. Damit von md1gebootet werden kann, müssen die Einträge so abgeändert werden.
title Debian GNU/Linux, RAID 1 Standard
root (hd0,4)
kernel /vmlinuz-2.6.11-1-686 root=/dev/md1 ro
initrd /initrd.img-2.6.11-1-686-raid
savedefault
boot
title Debian GNU/Linux, RAID 1 Boot von Platte 2
root (hd1,4)
kernel /vmlinuz-2.6.11-1-686 root=/dev/md1 ro
initrd /initrd.img-2.6.11-1-686-raid
savedefault
boot
Die 2. Platte ist jetzt so vorbereitet, das sie sowohl als 1. Platte als auch als 2. Platte gebootet werden kann. Schließlich weiß man ja nicht, wann welche Platte sich verabschiedet.
Das sollte reichen und es kann zum Testen von Platte 2 neu gebootet werden.
Wenn alles geklappt hat sollte mount nach dem Neustart mindestens das auswerfen:
/dev/md1 on / type ext3 (rw,errors=remount-ro)
/dev/md5 on /boot type ext3 (rw)
/dev/mapper/server-usr on /usr type ext3 (rw)
/dev/mapper/server-var on /var type ext3 (rw)
/dev/mapper/server-home on /home type ext3 (rw)
/dev/mapper/server-spool on /var/spool type ext3 (rw)
/dev/mapper/server-mirror on /srv/mirror type ext3 (rw)
/dev/mapper/server-web on /var/www type ext3 (rw)
Glückwunsch! Sie haben eben von RAID Devices gebootet und LVM funktioniert auch. Um auch die letzten Dateien die während und nach dem Kopieren verändert oder angelegt wurden, zu erhalten, wird der Rest noch nachträglich kopiert. Dazu werden jetzt alle Partitionen von /dev/hda nach /new-disk/ gemountet. Anschließend werden mit cp -auv /new-disk/* / die neueren oder fehlenden Daten ins neue laufende System kopiert. Der Parameter -v zeigt dabei an was kopiert wird.
Eine letzte Kontrolle sollte in etwa so sehen.
server:# cat /proc/mdstat
Personalities : [raid1]
md7 : active raid1 hdc7[1]
116334592 blocks [2/1] [_U]
md6 : active raid1 hdc6[1]
144448 blocks [2/1] [_U]
md5 : active raid1 hdc5[1]
144448 blocks [2/1] [_U]
md1 : active raid1 hdc1[1]
240832 blocks [2/1] [_U]
unused devices: <none>
Nun ist alles auf dem aktuellen Stand und hda kann als 2. Device im Raid1-Verbund vorbereitet werden. Diesmal wird die Festplatte /dev/hda partioniert
server:# sfdisk -d /dev/hdc | sfdisk /dev/hda
Jetzt werden die Partitionen eingebunden.
server:# mdadm /dev/md1 -a /dev/hda1
server:# mdadm /dev/md5 -a /dev/hda5
server:#mdadm /dev/md7 -a /dev/hda7
WICHTIG! Das Sync des Raid abwarten! Der Fortschritt kann mit 'watch cat /proc/mdstat' kontrolliert werden. Damit erkennt man sofort, wenn die Platten synchron sind.
server:# watch cat /proc/mdstat
Personalities : [raid1]
md7 : active raid1 hda7[2] hdc7[1]
116334592 blocks [2/1] [_U]
[===========>………] recovery = 58.8% (68470656/116334592) finish=29.6min speed=26883K/sec
md5 : active raid1 hda5[0] hdc5[1]
144448 blocks [2/2] [UU]
md1 : active raid1 hda1[0] hdc1[1]
240832 blocks [2/2] [UU]
unused devices: <none>
Aktualisieren der mdadm.conf
server:# echo DEVICE /dev/hda[1567] /dev/hdc[1567] > /etc/mdadm/mdadm.conf
server:# mdadm -D --brief -s /dev/md[1567] >> /etc/mdadm/mdadm.conf
Damit auch von dieser Platte gebootet werden kann wird grub ebenso in den MBR installiert. Dazu starten wir grub
Probing devices to guess BIOS drives. This may take a long time.
grub> device (hd0) /dev/hda
grub> root (hd0,4)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
grub> quit
Das sollte es gewesen sein.
Reboot


