Einbinden einer neuen Festplatte bei Linux zur Laufzeit

In Zeiten zunehmender Virtualisierung (mit VMware vSphere, KVM, Citrix usw.) wird es immer häufiger notwendig Festplatten im laufenden Betrieb einzubinden, da diese ohne Neustart einfach zu einer virtuellen Maschine hinzufügen wurden. Bei Linux tauchen diese Platten ohne Neustart des Gastes aber nicht so einfach auf. Damit man diese auch im laufenden Betrieb zu Gesicht bekommt, muss der Kernel die Festplattenkonfiguration neu einlesen. Wie dies ohne Neustart geht, möchte ich in diesem Artikel dokumentieren.

Welche Speicher-Adapter kennt das System?

In dem Verzeichnis /sys/class/scsi_host befindensich die dem Kernel bekannten Speicher-Adapter des Systems. Der folgende Befehl zweigt die Adapter an.

ls /sys/class/scsi_host

Wie bringe ich die Speicher-Adapter dazu neue Festplatten zu erkennen?

Mit der folgenden Schleife, bringt man alle Speicher-Adapter des Systems dazu im laufenden Betrieb nach neuen Festplatten zu suchen.

for f in /sys/class/scsi_host/host*; do echo '- - -' > $f/scan; done

Wie bringe ich die Speicher-Adapter dazu Größenänderung bei Festplatten zu erkennen?

Wenn es sich nicht um eine neue neue Festplatte sondern nur um eine geänderte handelt, wird es noch etwas komplizierter. Dank ein bisschen Zauberei mit awk, kann man auch eine Schleife bauen, die bei allen Blockdevices nach Änderungen suchen lässt. Diese sieht dann so aus.

for d in $(lsblk -Sln | awk '{if ( $3 == "disk" ) print $1}'); do echo 1 > /sys/class/block/$d/device/rescan; done

Virtualisierung mit KVM und libvirt unter Ubuntu 10.04

Um eine virtuelle Maschine mit libvirt einzurichten, benötigt man als erstes ein virtuelles Netzwerk. Dazu legt man unter /etc/libvirt/qemu/networks eine XML-Datei an oder editiert die dort bei der Installation angelegte default.xml. Wenn man sich z.B. für das virtuelle Netzwerk 192.168.34.0/24 entschieden hat, könnte diese Datei wie folgt aussehen:

<network>
  <name>subnetz1</name>
  <forward dev='eth0' mode='route'/>
  <bridge name='virbr2' stp='off' forwardDelay='0' />
  <ip address="192.168.34.1" netmask="255.255.255.0" />
</network>

Die fertige XML-Datei wird nach dem speichern und mittels virsh net-define in libvirt bekannt gemacht. Das neue Netzwerk hat in libvirt den Namen subnetz1. Wenn man nur die default.xml editiert hat entfällt dieser natürlich, da dieses Netz bereits bekannt ist.

Nach dem Aufruf von virsh net-autostart subnetz1 ist sichergestellt, dass das Netzwerk auch tatsächlich nach jedem Systemstart sofort verfügbar ist. Mit virsh net-start subnetz1 aktiviert man das Netz von Hand.

Damit die virtuelle Maschine mit der Außenwelt kommunizieren kann, muss jetzt noch IP Forwarding aktiviert werden. Bei Debian/Ubuntu wird das Forwarding in der Datei /etc/sysctl.conf aktiviert. In ihr sollte die folgende Zeile stehen:

net.ipv4.ip_forward=1

Danach kann eine neue virtuelle Maschine angelegt und gestartet werden. Diese muss dann nur noch eine freie IP-Adresse aus dem virtuellen Netzwerk bekommen und kann danach gestartet werden.

Erzeugen eines Festplattenimages

Wenn man ein Image einer Festplatte benötigt, reicht dazu eine gängige Linux Live-CD, wie z.B. Koppix.

Nachdem man die Live-CD gebootet hat kann man sich mit dem folgenden Befehlt eine Liste der Festplatten anzeigen lassen.

fdisk -l

Dabei bezeichnet /dev/hda die erste IDE-Platte und /dev/hdb bezeichnet die zweite IDE-Platte. Bei SCSI-Platten bezeichnet analog dazu /dev/sda die erste Platte und /dev/sdb die zweite. Befindet sich beispielsweise auf der Festplatte /dev/hda das System, kann man davon mit dem Programm dd ein Image erzeugen. Am besten leitet das Image gleich mit netcat auf einen anderen PC. Die genaue Anweisung dazu lautet dann wie folgt:

Empfänger:

netcat -w 30 -vvnl 3333 | gzip -dc > hda.raw

Sender:

dd if=/dev/sda | gzip -c | netcat -w 30 -vvn 192.168.1.1

In dem Beispiel liest dd die Festplatte /dev/hda und schickt die Standardausgabe durch gzip zum Komprimieren. Der komprimierte Datenstrom wird von netcat an die IP-Adresse 192.168.1.1 zu dem Port 3333 gesendet. Auf dem Empfangsrechner nimmt netcat den Datenstrom auf dem Port 3333 entgegen. gzip dekomprimiert diesen Datenstrom. Die Ausgabe wird in die Datei hda.raw umgeleitet. Ist die Übertragung zu Ende, kann dieses Image direkt in QEMU oder KVM als virtuelle Maschine getestet werden.

kvm -hda /mnt/berlindc_backup/sda.raw -m 1024 -net nic,model=virtio -vnc :1
192.168.30.2:1