Computer / Linux / Internet > Howto RAID1, LVM, Grub

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