Archiv Juli 2013

Donnerstag, 25. Juli 2013

Debian-Installation mit zwei Netzwerkkarten ausfallsicher(er) machen

Auf Grund eines defekten Kabelmodem-Netzteils und einem wackeligen Switch-Netzteil war mein Debian-Server im Elternheim kürzlich für mehr als 3 Tage offline. Für einen IT-Auditoren, welcher tagtäglich mit Load Balancing, Geo-Redundanz und Failovers in Kontakt kommt, eine untolerierbare lange Zeit!

Hintergrund: Als meine linke Hand mittels Telefonsupport das tote Kabelmodem analysierte, hatte er wohl aus Unachtsamkeit das Netzteil des Gigabit-Switches aus der Fassung gerissen (zu seiner Entschuldigung: Irgendetwas ist am Switch-Netzteil defekt, es sitzt nicht mehr fest in der Steckerleiste). Obwohl am nächsten Tag dank des Austauschs des Kabelmodem-Netzteils der Router und ein Teil des Netzwerks wieder online, blieb der Switch offline (ich war beim Austausch des Netzteils nicht vor Ort, konnte deshalb keine Diagnose machen — ansonsten hätte ich den dunklen Switch innert Minuten als Fehlerquelle isoliert).

Was tun? Einerseits habe ich mir auf Ricardo einen iKVM-Switch (Avocent SwitchView IP 1010 Remote Access Device) ersteigert, welchen ich in den nächsten Wochen mit dem Server verbinden werde. Das Netzwerkkabel wird direkt an den Router eingestöpselt, um Fehler in der restlichen Netzwerktopologie auszuschliessen.

Andererseits habe ich mich entschieden, den Server über zwei Netzwerkkarten an das Netzwerk anzubinden. Da ich mir vor langer Zeit eine performante Intel Gigabit-Netzwerkkarte geleistet habe, war mit dem Onboard-NIC meines Asus P5QPL-VM EPU bereits eine zweite Netzwerkschnittstelle vorhanden, die aktiviert werden wollte.

Natürlich ging es aber nicht darum, den Server mittels dieser zweiten NIC an den Router zu verbinden und dieser NIC eine zweite IP-Adresse zu geben — der Server sollte beim Ausfall der einen NIC logisch immer noch unter derselben IP-Adresse ansprechbar sein — physisch halt aber über die Onboard-NIC.

Bonding musste her!

Im Netz gibt es viele (alte und neuere) Anleitungen dazu, aber folgendermassen habe ich den Plunder nach langem Pröbeln zum Laufen gebracht:

bonding-Modul

In der Datei /etc/modules lädt man das bonding-Modul beim Start des Betriebssystems:

bonding
fuse
...

Die Konfiguration des Moduls — ich bin immer noch nicht sicher, ob es das wirklich braucht — legt man in /etc/modprobe.d/bonding ab:

alias bond0 bonding
options bonding mode=1 miimon=100

Erläuterungen:

  • alias bond0 bonding bond0 entspricht bonding — für was man dies genau benötigt, entzieht sich meiner Kenntnis
  • mode=1 Das Bonding-Modul kennt 6 verschiedene Modi. Modus 1 ist der active-backup-Modus: Es gibt eine aktive Netzwerkkarte und eine, die als Backup bereit steht und die Aufgabe der ersten Netzwerkkarte übernehmen kann.
  • miimon=100 Überwache die aktive Netzwerkkarte alle 100 Millisekunden auf einen Verlust des Links (bspw. Kabel ausgezogen, Switch ohne Strom).

Debian-Packages

Ob man diese Packages effektiv braucht, kann ich nicht sagen — installiert habe ich sie aber auf anraten von Anleitungen im Netz:

# apt-get install ifplugd ifenslave-2.6

/etc/network/interfaces

Vorbemerkung: Am Besten macht man sich zuallererst eine Kopie der aktuellen /etc/network/interfaces — bei meinen Tests musste ich zig Reboots durchführen und teilweise wieder die alte Interface-Konfiguration laden, um Dinge aus dem Netz herunterzuladen.

Meine finale, sauber funktionierende /etc/network/interfaces sieht folgendermassen aus:

auto lo
iface lo inet loopback

auto bond0
iface bond0 inet static
	address 192.168.100.101
	netmask 255.255.255.0
	network 192.168.100.0
	broadcast 192.168.100.255
	gateway 192.168.100.1
	bond-mode active-backup
	bond-miimon 500
	bond-slaves none

auto eth1
iface eth1 inet manual
	bond-master bond0
	bond-primary eth1 eth2

auto eth2
iface eth2 inet manual
	bond-master bond0
	bond-primary eth1 eth2

Wie man klar erkennen kann, werden hier die bonding-Parameter nach /etc/modprobe.d/bonding erneut gesetzt, und dies teilweise sogar mit anderen Werten. Einige Notizen:

  • Die Netzwerkkarten heissen bei mir leider Gottes aus mir unerfindlichen Gründen eth1 (Intel-Steckkarte) und eth2 (Onboard). In anderen Systemen werden die Karten wohl eher eth0 und eth1 heissen.
  • auto bond0 Nach Reboots war bond0 nicht aktiv und musste von mir immer zuerst mittels ifup bond0 geladen werden. Irgendwann einmal realisierte ich, dass ich Linux mittels auto bond0 sagen musste, das virtuelle Gerät automatisch zu starten.
  • Unklar ist, ob es eine Rolle spielt, wo die Konfiguration von bond0 innerhalb von /etc/network/interfaces steht. Ich habe es schlussendlich an den Anfang der Datei gesetzt, nach dem Loopback-Interface.
  • bond-mode active-backup ist dasselbe wie bond-mode 1
  • bond-miimon 500 Die Überprüfung des Netzwerkkabels alle 500 Millisekunden finde ich vernünftig
  • bond-slaves none Tönt komisch (nach meiner Lesart sind eth1 und eth2 die Slaves) — aber es klappt
  • bond-master bond0 Damit wird ein physisches Interface dem virtuellen Interface zugeteilt
  • bond-primary eth1 eth2 Damit gebe ich an, welche der beiden Netzwerkkarten verwendet wird, wenn beide einen funktionierenden Uplink haben. Natürlich habe ich mich für die performantere Intel-Karte entschieden und nicht die Onboard-NIC.

Status

Den Status des Bondings erfährt man über das proc-Dateisystem unter /proc/net/bonding/bond0:

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth1 (primary_reselect always)
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 500
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:00:00:00:00:00
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:00:00:00:00:00
Slave queue ID: 0

Via: Debian-Installation mit zwei Netzwerkkarten ausfallsicher(er) machen

Links

Tags: , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 7. Juli 2013

Debian-Installation auf eine SSD-Festplatte migrieren

Auf Grund eines längeren Ausfalls meines Servers (Gründe: Netzteil des Cablemodems ist gestorben, Switch auf Grund eines Wackelkontaktes des Netzteils ohne Strom) war ich heute im Elternhaus. Aus gegebenem Anlass habe ich mich entschieden, die Debian-Installation von einer Samsung HD161GJ (160GB) auf eine hier unbenutzt herumliegende 128GB SSD–Festplatte (Crucial M4-CT128M4SSD2) zu migrieren.

Nachfolgend eine Schritt-für-Schritt-Anleitung, wie dieses Vorhaben in möglichst kurzer Zeit bewerkstelligt werden kann.

Grob (für Profis)

  1. Zweite Festplatte an Server anschliessen (SATA oder via USB-Adapter)
  2. SSD-Festplatte partitionieren (bei mir: /boot, Swap und / (root))
  3. SSD-Partitionen formatieren (mkfs.ext4, mkswap)
  4. Partitionen mounten
  5. Mittels rsync alle Nutzdaten von den System-Partitionen auf die SSD-Partionen verschieben
  6. Die UUIDs in /etc/fstab der SSD-Festplatte anpassen
  7. grub-install auf die SSD-Festplatte
  8. Herunterfahren
  9. Ehemalige System-Platte vom System trennen
  10. Neu starten
  11. BIOS anpassen
  12. grub rescue überreden, von der SSD-Festplatte zu starten, obwohl die UUIDs nicht mehr stimmen
  13. update-grub ausführen

Detailliert (für Anfänger/Erfahrene)

Partitionierung

Nachdem die Festplatte erfolgreich an den SATA-Bus angeschlossen worden ist, sollte sie sowohl unter /var/log/messages als auch mittels fdisk -l aufgelistet werden. Den von dort übernommenen Device-Namen (in meinem Fall: /dev/sdd) verwendet man, um das Partitionierungstool fdisk zu starten:

# fdisk /dev/sdd

Ich habe mir zuerst eine primäre Partition für /boot erstellt (p, 1024MB) und die Partition bootbar gemacht (a). Anschliessend habe ich eine erweiterte Partition erstellt, in welcher ich einerseits eine Swap-Partition erstellt habe (Typ 82, 1024MB — so gross wie der verfügbare RAM-Speicher) als auch die root-Partition.

Ganz wichtig ist, alle Änderungen am Schluss mittels w auch effektiv auf die SSD zu schreiben.

Formatierung

Die Formatierung ist schnell erledigt. Mittels mkfs.ext4 formatiert man die /boot-Partition:

# mkfs.ext4 /dev/sdd1

… als auch die / (root)-Partition:

# mkfs.ext4 /dev/sdd6

Mittels mkswap formatiert man die Swap-Partition:

# mkswap /dev/sdd5

Mounten

Solange man die /etc/fstab-Einträge noch nicht umgebogen hat, müssen /boot und / (root) manuell gemountet werden:

# mount /dev/sdd1 /mnt/neu/boot
# mount /dev/sdd6 /mnt/neu/root

Der Filesystem-Typ wird automatisch erkannt.

Filesystem klonen

Die beiden Partitionen klont man folgendermassen:

# cd /
# rsync -av --one-file-system . /mnt/neu/root
# cd /boot
# rsync -av --one-file-system . /mnt/neu/boot

fstab

Die fstab-Datei muss auf der neuen / (root)-Partition angepasst werden. Die Festplatten sollte man heutzutage mit den UUIDs ansprechen. Die UUIDs findet man mit dem Befehl blkid heraus:

...
/dev/sdd1: UUID="3993c6e2-de5c-4227-9cae-637bbfc820b7" TYPE="ext4" 
/dev/sdd5: UUID="79c00de9-06a7-41e5-a470-641b5f68b909" TYPE="swap" 
/dev/sdd6: UUID="9672eb79-b6da-4192-a507-45de2662af2d" TYPE="ext4"
...

Die Partitionen definiert man basierend darauf folgendermassen in /etc/fstab:

...
#/etc/fstab: static file system information.
#
# 												
UUID=3993c6e2-de5c-4227-9cae-637bbfc820b7	/boot		ext4	discard,noatime,errors=remount-ro	0	2
UUID=79c00de9-06a7-41e5-a470-641b5f68b909	none		swap	sw					0	0
UUID=9672eb79-b6da-4192-a507-45de2662af2d       /               ext4    discard,noatime,errors=remount-ro       0       1
...

Gemäss SSD-Fetischisten sind die Optionen discard,noatime unendlich wichtig, um die Lebensdauer der SSD-Festplatte von 19 auf 19.1 Jahre zu erhöhen … Randbemerkung: Die SSD-Optimierer erscheinen mir ähnlich suspekt wie die Idioten, welche bei jedem Mac-Problem erst einmal raten, Repair Permissions durchzuführen (Richtigstellung: Seriously, ‘Repair Permissions’ Is Voodoo).

grub installieren

Mittels folgendem Befehl wird der grub Bootloader in den MBR der neuen Festplatte geschrieben:

# grub-install /dev/sdd

ACHTUNG: Viele Web-Seiten raten in diesem Schritt, den Computer von einer Linux Live-CD zu starten, mittels chroot das Root des Systems auf die SSD-Festplatte umzubiegen sowie sys, proc und dev neu zu mounten. Wer den hier notierten Anweisungen folgt, kann sich diesen umständlichen Schritt sparen.

BIOS

In meinem Fall war im BIOS hardkodiert, dass die 160 GB-Platte von Samsung die zu bootende Festplatte war. Da diese nun fehlte, blieb das System ohne Fehlermeldung hängen. Im BIOS musste ich deshalb die SSD-Festplatte neu als Boot-Festplatte aufnehmen.

grub rescue

Da ich grub-install ausgeführt hatte, als Linux noch von der Samsung-Festplatte als Systemplatte lief, wurden die UUIDs der Partitionen dieser Festplatten in den grub-MBR der SSD-Festplatte geschrieben.

Als das BIOS den Bootloader von der SSD-Platte startete, erschien folgende Fehlermeldung auf dem Schirm:

No such Device: ad4103fa-d940-47ca-8506-301d8071d467

Mittels des Befehls ls wurden mir alle erkannten Festplatten und Partitionen angezeigt. Nachdem ich die System-Festplatte in der grub-Nomenklatur ausgemacht hatte, konnte ich grub mitteilen, wie es zu starten hatte:

set prefix=(hd0,msdos0)/grub
set root=(hd0,msdos5)
insmod normal
normal

Mit diesen Angaben fand grub die Partitionen mit den benötigten Boot-Informationen und Debian startete sauber — und dank SSD blitzschnell.

grub

Da das System nun von SSD-Festplatte lief, konnte ich grub-install erneut ausführen. Dieses Mal übernahm grub die UUIDs der SSD-Partitionen, was ich mir mit update-grub bestätigen liess. Der letzte Befehl schrieb die grub-Konfiguration im Klartext in die Datei /boot/grub/grub.cfg.

Links

Tags: , , , , , ,
Labels: Linux

1 Kommentar | neuen Kommentar verfassen