Situation
Man hat bereits einen Linux Server aufgesetzt der gut läuft. Nun hat man dem eine zweite Platte hinzugefügt und möchte ein RAID/LVM System daraus machen, aber ohne das aufwändige neu installieren/konfigurieren des Systems.
Dies ist mit etwas know how relativ leicht möglich, indem man zuerst die zweite (unbenutzte) Festplatte entsprechend als sog. "degraded raid1 array" definiert, dann die Files von der ersten Platte rüber kopiert, von dieser bootet und letztendlich diese dann dem RAID wieder dazu fügt.
[stextbox id=“note“ caption=“Hinweis“]Der folgende Artikel zeigt wie es mit einem CentOS System geht; der Vorgang dürfte sich aber auch für andere Systeme nahezu nicht unterscheiden.[/stextbox]
Installieren der Komponenten
Als erstes sollte man in der Kernel-Konfiguration überprüfen ob RAID einkompilliert ist, dies dürfte aber bei fast allen neueren Kernels der Fall sein:
-> Device Drivers
-> Multi-device support (RAID and LVM)
-> Multiple devices driver support (RAID and LVM) (MD [=y])
-> RAID support (BLK_DEV_MD [=y])
-> RAID-1 (mirroring) mode |
-> Device Drivers
-> Multi-device support (RAID and LVM)
-> Multiple devices driver support (RAID and LVM) (MD [=y])
-> RAID support (BLK_DEV_MD [=y])
-> RAID-1 (mirroring) mode
Dann installieren wir mdadm und lvm2:
yum install mdadm lvm2 rsync |
yum install mdadm lvm2 rsync
Konfiguration
Vorbereiten der neuen Disk
Nun kann die neue Disk (von der aktuell laufenden sollte man noch die Finger lassen!) mit fdisk gemäss den eigenen wünschen partitioniert werden; in diesem Beispiel haben wir folgende aufteilung:
Device Flags Part Type FS Type Label Size (MB)
/dev/sdb1 boot Primary Linux raid autodetect 128
/dev/sdb2 Primary Linux raid autodetect (rest) |
Device Flags Part Type FS Type Label Size (MB)
/dev/sdb1 boot Primary Linux raid autodetect 128
/dev/sdb2 Primary Linux raid autodetect (rest)
Ist alles erledigt erstellen wir daraus ein degraded array mit den oben definierten Partitionen:
mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb1
mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb2
mdadm --detail --scan >> /etc/mdadm.conf |
mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb1
mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb2
mdadm --detail --scan >> /etc/mdadm.conf
Und optional nun noch der LVM drüber:
vgscan
vgchange -a y
pvcreate /dev/md2
vgcreate rootvg /dev/md2
lvcreate -L1G -nroot_lv rootvg
lvcreate -L5G -nusr_lv rootvg
lvcreate -L5G -nhome_lv rootvg
lvcreate -L7G -nvar_lv rootvg
lvcreate -L2G -ntmp_lv rootvg
lvcreate -L512M -nswap_lv rootvg |
vgscan
vgchange -a y
pvcreate /dev/md2
vgcreate rootvg /dev/md2
lvcreate -L1G -nroot_lv rootvg
lvcreate -L5G -nusr_lv rootvg
lvcreate -L5G -nhome_lv rootvg
lvcreate -L7G -nvar_lv rootvg
lvcreate -L2G -ntmp_lv rootvg
lvcreate -L512M -nswap_lv rootvg
Darauf können nun die filesysteme erstellt werden:
mke2fs /dev/md1
mke2fs -j /dev/rootvg/root_lv
mke2fs -j /dev/rootvg/home_lv
mke2fs /dev/rootvg/tmp_lv
mke2fs -j /dev/rootvg/usr_lv
mke2fs -j /dev/rootvg/var_lv
mkswap /dev/rootvg/swap_lv |
mke2fs /dev/md1
mke2fs -j /dev/rootvg/root_lv
mke2fs -j /dev/rootvg/home_lv
mke2fs /dev/rootvg/tmp_lv
mke2fs -j /dev/rootvg/usr_lv
mke2fs -j /dev/rootvg/var_lv
mkswap /dev/rootvg/swap_lv
Das ganze können wir jetzt mounten…
mkdir -p /mnt/new
mount /dev/rootvg/root_lv /mnt/new
cd /mnt/new
mkdir boot home usr opt var tmp
mount /dev/md1 /mnt/new/boot
mount /dev/rootvg/usr_lv /mnt/new/usr
mount /dev/rootvg/home_lv /mnt/new/home
mount /dev/rootvg/tmp_lv /mnt/new/tmp
mount /dev/rootvg/var_lv /mnt/new/var
chmod 1777 /mnt/new/tmp |
mkdir -p /mnt/new
mount /dev/rootvg/root_lv /mnt/new
cd /mnt/new
mkdir boot home usr opt var tmp
mount /dev/md1 /mnt/new/boot
mount /dev/rootvg/usr_lv /mnt/new/usr
mount /dev/rootvg/home_lv /mnt/new/home
mount /dev/rootvg/tmp_lv /mnt/new/tmp
mount /dev/rootvg/var_lv /mnt/new/var
chmod 1777 /mnt/new/tmp
…und die Daten rüber kopieren:
rsync -ahvx / /mnt/new/
rsync -ahv /dev/* /mnt/new/dev/
rsync -ahv /boot/ /mnt/new/boot/ |
rsync -ahvx / /mnt/new/
rsync -ahv /dev/* /mnt/new/dev/
rsync -ahv /boot/ /mnt/new/boot/
Als nächster Schritt muss noch die Datei: /mnt/new/etc/fstab angepasst werden:
# <fs> <mountpoint> <type> <opts> <dump/pass>
/dev/md1 /boot ext2 noauto,noatime 1 2
/dev/rootvg/root_lv / ext3 noatime 0 1
/dev/rootvg/swap_lv none swap sw,pri=1 0 0
/dev/rootvg/usr_lv /usr ext3 noatime 1 2
/dev/rootvg/home_lv /home ext3 noatime 1 2
/dev/rootvg/tmp_lv /tmp ext2 noatime 1 2
/dev/rootvg/var_lv /var ext3 noatime 1 2
shm /dev/shm tmpfs nodev,nosuid,noexec 0 |
# <fs> <mountpoint> <type> <opts> <dump/pass>
/dev/md1 /boot ext2 noauto,noatime 1 2
/dev/rootvg/root_lv / ext3 noatime 0 1
/dev/rootvg/swap_lv none swap sw,pri=1 0 0
/dev/rootvg/usr_lv /usr ext3 noatime 1 2
/dev/rootvg/home_lv /home ext3 noatime 1 2
/dev/rootvg/tmp_lv /tmp ext2 noatime 1 2
/dev/rootvg/var_lv /var ext3 noatime 1 2
shm /dev/shm tmpfs nodev,nosuid,noexec 0
Als letztes noch die Datei /mnt/new/boot/grub/menu.lst bearbeiten, den ersten (standard) Eintrag nach zuoberst kopieren und "root=/dev/sda2" in: "root=/dev/rootvg/root_lv" ändern.
Dies müsste dann etwa so aussehen:
title CentOS RAID
root (hd0,0)
kernel /vmlinuz ro root=/dev/rootvg/root_lv |
title CentOS RAID
root (hd0,0)
kernel /vmlinuz ro root=/dev/rootvg/root_lv
Testen
Nun gehts ans testen, ob die Maschine vom RAID booten- und LVM Partitionen mounten kann, bevor wir die Daten auf /dev/sda endgültig zerstören. – Bisher haben wir noch gar nichts "zerstört".
Dazu erstellen wir die folgenden Verzeichnisse: /mnt/md1 und /mnt/tmp_lv}:
mkdir -p /mnt/{md1,tmp_lv} |
mkdir -p /mnt/{md1,tmp_lv}
Und fügen den folgenden Eintrag in /etc/fstab:
/dev/md1 /mnt/md1 ext2 noatime 0 1
/dev/rootvg/tmp_lv /mnt/tmp_lv ext2 noatime 1 2 |
/dev/md1 /mnt/md1 ext2 noatime 0 1
/dev/rootvg/tmp_lv /mnt/tmp_lv ext2 noatime 1 2
Nun starten wir das System neu und überprüfen ob wir den Verzeichnisinhalt von diesen zwei Verzeichnissen sehen können.
[stextbox id=“warning“ caption=“Wichtig“]Fahre NICHT weiter fort, bevor du diesen Schritt erfolgreich beendet hast![/stextbox]
Editiere nun /boot/grub/menu.lst, kopiere den ersten (standard) Eintrag nach zuoberst und ändere "root=/dev/sda2" in: "root=/dev/rootvg/root_lv".
Dies müsste dann etwa so aussehen:
title CentOS RAID
root (hd0,0)
kernel /vmlinuz ro root=/dev/rootvg/root_lv |
title CentOS RAID
root (hd0,0)
kernel /vmlinuz ro root=/dev/rootvg/root_lv
Starte das System neu.
Migration
Nun migrieren wir die erste Disk.
Erstelle mit fdisk nun genau das selbe layout wie mit /dev/sdb.
Nun aktiveren wir das SWAP erstellen das array und warten bis es fertig ist:
mdadm --add /dev/md1 /dev/sda1
mdadm --add /dev/md2 /dev/sda2
watch -n 1 "cat /proc/mdstat" |
mdadm --add /dev/md1 /dev/sda1
mdadm --add /dev/md2 /dev/sda2
watch -n 1 "cat /proc/mdstat"
Nun müssen wir nur noch grub auf die beiden Disks kopieren:
grub
Probing devices to guess BIOS drives. This may take a long time.
grub> root (hd0,0)
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)"... 16 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/boot/grub/stage2 /boot
grub/menu.lst"... succeeded
Done.
grub> root (hd1,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
grub> quit |
grub
Probing devices to guess BIOS drives. This may take a long time.
grub> root (hd0,0)
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)"... 16 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/boot/grub/stage2 /boot
grub/menu.lst"... succeeded
Done.
grub> root (hd1,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
grub> quit
Starte nun das System noch ein letztes mal neu, prüfe ob es gut hochkommt und dann mit df -h die Partitionen.