LVM: Physical Volume vergössern

Physical volume als ganze Disk

Hat man eine Virtualisierte Maschine (z.B. VMware) und im LVM die Physical Volumes als ganze Disks hinzugefügt (z.B. /dev/sdb/, anstatt /deb/sdb1), kann man diese einfach vergrössern, indem man in der VM die Festplatte vergrössert, diese dann mit dem blockdev Kommando in Linux einliesst und mit pvresize vom LVM erkennen lässt:

blockdev --rereadpt /dev/sdX
pvresize /dev/sdX

Physical voume als Partition

Besteht das Physical Volume hingegen aus einer Partition (z.B. /dev/sdb1) und es ist die letzte in der Reihenfolge, so gibt es einen einfachen Trick: Die Partition entfernen und danach neu erstellen. Das klingt zwar etwas beängstigend, funktioniert aber: 😉

Achtung: Bevor man an der Partitionstabelle manipuliert ist es anzuraten vorher einen snapshot der VM zu machen und oder die Schritte vorher auf einer Test-VM auszuprobieren!

fdisk /dev/sdX
 
Command (m for help): p
 
Disk /dev/sdX: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00015b7c
 
    Device Boot      Start         End      Blocks   Id  System
/dev/sdX1   *        2048     1026047      512000   83  Linux
/dev/sdX2         1026048    10485759     4729856   8e  Linux LVM
 
 
Command (m for help): d
Partition number (1,2, default 2): 
Partition 2 is deleted
 
 
Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
 
Partition number (2-4, default 2): 2
First sector (1026048-16777215, default 1026048): 
Using default value 1026048
Last sector, +sectors or +size{K,M,G} (1026048-16777215, default 16777215): 
Using default value 16777215
Partition 2 of type Linux and of size 7.5 GiB is set
 
 
Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
 
 
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 or after you run partprobe(8) or kpartx(8)
Syncing disks.

Nun muss noch die Partitionstabelle neu eingelesen werden, dies geht nur mit partx:

partx -u /dev/sdX

Nun kann man mit pvscan und pvresize das Volume vergrössern:

pvscan
pvresize /dev/sdX

Pysical volume als Partition (alternative)

Alternativ kann man auch eine neue Festplatte hinzufügen, die grösser oder gleichgross ist als die andere, die Daten auf der alten dann mit pvmove auf die neue/grössere verschiebt und danach die alte entfernen.

Quellen

LVM: Physical Volume entfernen

Manchmal merkt man, dass man eine Disk „zu viel“ in der VG hat und diese anderweitig verwenden möchte.

Mittels pvmove kann man die Daten von einer Disk (physical volume) auf andere in der gleichen volume group (VG) verschieben, danach kann man mittels vgreduce die Disk aus der VG entfernen und schliesslich mit pvremove das physical volume komplett entfernen.

Das ganze sieht so aus:

pvmove /dev/sdX
vgreduce <volume_group> /dev/sdX
pvremove /dev/sdX

Achtung: Möchte man danach die Festplatte im laufenden Betrieb „physisch“ aus dem System entfernen, muss man vorher ebenfalls die System-Referenzen entfernen!

RAID/LVM nachträglich hinzufügen

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.

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.

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

Dann installieren wir mdadm und lvm2:

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)

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

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

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

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

…und die Daten rüber kopieren:

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

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

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}

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

Nun starten wir das System neu und überprüfen ob wir den Verzeichnisinhalt von diesen zwei Verzeichnissen sehen können.

Wichtig
Fahre NICHT weiter fort, bevor du diesen Schritt erfolgreich beendet hast!

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

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"

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

Starte nun das System noch ein letztes mal neu, prüfe ob es gut hochkommt und dann mit df -h die Partitionen.