flog

dem Flo sein Blog

Ex-Feuerwehrman, Baskettballer, Schachspieler, House-Addict (since 1998), Radfahrer, Fitnessmensch und vor allem: Webprogrammierer aus Leidenschaft. Meine Hosen hab ich auch auf Facebook und Xing runtergelassen

Virtueller Server - KVM, Raid, LVM und IPv6

Seit einigen Tagen hab ich einen eigenen Root-Server angemietet bei Webtropia in Düsseldorf. Wenn man dann schon einen Server aufsetzt, dann gleich richtig. Also Raid, Virtuelle Maschinen (via KVM), LVM und natürlich IPv6.

Grundsetup auf der Maschine ist ein Debian Lenny mit zwei Festplatten (erste Partition Swap, zweite raid1)

IPv6 Tunnel mit Ubuntu

Für letzteres muss ich erstmal meinem Ubuntu IPv6 beitreiben. Da mein Provider noch keine IPv6 Adressen verteilt, musste eine Tunnel-Lösung her. Entschieden hab ich mich letztendlich für Hurricane Electric, keine Ahnung warum, IPv6 Tunnel Anbieter gibt es ja genug.

Zur Einrichtung einfach auf deren Seite, anmelden und die Daten in die /etc/network/interfaces eintragen:

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
     endpoint IPv4_ENDOINT
     address  IPv6_ADRESSE
     netmask  64
     up ip -6 route add default dev he-ipv6
     down ip -6 route del default dev he-ipv6

Dann per "sudo ifup he-ipv6" das Interface starten. Testen kann man die IPv6 Verbindung so:

$ ping6 -n -c 4 heise.de
PING heise.de(2a02:2e0:3fe:100::8) 56 data bytes
64 bytes from 2a02:2e0:3fe:100::8: icmp_seq=1 ttl=59 time=27.8 ms
64 bytes from 2a02:2e0:3fe:100::8: icmp_seq=2 ttl=59 time=25.7 ms
64 bytes from 2a02:2e0:3fe:100::8: icmp_seq=3 ttl=59 time=27.2 ms
64 bytes from 2a02:2e0:3fe:100::8: icmp_seq=4 ttl=59 time=25.8 ms

--- heise.de ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 25.770/26.674/27.866/0.912 ms

Die Verbindung steht

EXT3 und Linux Software Raid verkleinern

Als nächstes musste ich Platz schaffen auf dem Server für das LVM. Das Grundsetup sind zwei Festplatten, die jeweils erste Partition ist 1GB groß und Swap, die zweite Partition belegt den Rest der Platte und ist als Softwareraid 1 zusammengeschaltet.

Layout sda und sdb

Nun muss die zweite Partition verkleinert werden, dabei muss man von innen nach außen vorgehen. Erst das Dateisystem verkleinern, dann das Raid und dann die Partitionen auf den beiden Platten. Ich hab mir das verkleinern des Raids gespart und folgendes gemacht:

  • Server im Rescue Modus hochfahren
  • Verkleinern des Dateisystem
  • Raid 1 anhalten
  • Raid 1 zerstören
  • Partition 2 verkleinern mit cfdisk
  • Partitionstabelle von sda auf sdb kopieren
  • Raid neu anlegen
  • Dateisystem auf Partitionsgröße vergrößern
  • Abschließender Check
e2fsck -f /dev/md0
resize2fs -p /dev/md0 9G
mdadm --stop /dev/md0
mdadm --zero-superblock /dev/sda2
mdadm --zero-superblock /dev/sdb2
cfdisk /dev/sda
sfdisk -d /dev/sda | sfdisk /dev/sdb --force
mdadm --create --assume-clean --level=1 -n2 /dev/md0 /dev/sda2 /dev/sdb2
resize2fs -p /dev/md0
e2fsck -f /dev/md0

Wichtig ist beim neu anlegen des Raids das "--assume-clean", da die Daten auf den beiden Partitionen ja korrekt sind, anderenfalls würden alle Daten verloren gehen auf den beiden Partitionen. Ich hab das Dateisystem auf 9GB geschrumpft, per cfdisk die Partition /dev/sda2 auf 10GB verkleinert. Mit dem abschließenden resize2fs Aufruf wird das Dateisystem dann wieder auf die volle Partitionsgröße ausgedehnt.

Das neue Layout

Das LVM ist stand jetzt noch nicht angelegt, das kommt in einem späteren Schritt. Aber soweit mal der Plan. Jetzt erstmal den Server neu starten und hoffen, dass er sauber hoch fährt :-)

LVM Anlegen

Wenn der Server sauber hochgefahren ist, dann kann man auf der freien Partition auf sda und sdb ein Raid 1 anlegen und darin dann das LVM anlegen.

  • Raid 1 anlegen
  • LVM Physical Volume anlegen
  • LVM Volume Group anlegen
  • LVM Logical Volume anlegen
mdadm --create --level=1 /dev/md1 -n2 /dev/sda3 /dev/sdb3
pvcreate /dev/md1
vgcreate -s 16M vg0 /dev/md1
lvcreate -L 10G -n vm01 vg0

Jetzt ist das LVM erzeugt, und ich hab eine 10 GB große Partition angelegt, die als Root-Laufwerk für meine erste virtuelle Maschine dienen darf.

KVM einrichten

aptitude install kvm libvirt-bin

Als erstes habe ich dazu den Rechner auf bridged Networking umgestellt. Dazu einfach folgendes in die /etc/network/interfaces reinschreiben:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
	address DEINE_IPv4
	netmask IPv4_NETMASK
	broadcast IPv4_BROADCAST
	gateway IPv4_GATE
	bridge_ports eth0
	bridge_fd 9
	bridge_hello 2
	bridge_maxage 12
	bridge_stp off
iface br0 inet6 static
	address DEINE_IPv6
	netmask 64
	up ip -6 route add IPv6_GATEWAY dev br0 
	down ip -6 route del IPv6_GATEWAY dev br0
	up ip -6 route add default via IPv6_GATEWAY dev br0
	down ip -6 route del default via IPv6_GATEWAY dev br0
	pre-up modprobe ipv6
	bridge_ports eth0
	bridge_fd 9
	bridge_hello 2
	bridge_maxage 12
	bridge_stp off

Dann per "/etc/init.d/networking restart" das alles neu laden, danach sollte man auch vom Server IPv6 Adressen anpingen können:

$ ping6 heise.de -n -c4
PING heise.de(2a02:2e0:3fe:100::8) 56 data bytes
64 bytes from 2a02:2e0:3fe:100::8: icmp_seq=1 ttl=58 time=5.87 ms
64 bytes from 2a02:2e0:3fe:100::8: icmp_seq=2 ttl=58 time=5.70 ms
64 bytes from 2a02:2e0:3fe:100::8: icmp_seq=3 ttl=58 time=6.15 ms
64 bytes from 2a02:2e0:3fe:100::8: icmp_seq=4 ttl=58 time=5.44 ms

--- heise.de ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 5.445/5.794/6.159/0.265 ms

Wenn das geht und die IPv4 Verbindungen auch noch funktionieren, dann kann man jetzt die virtuelle Maschine starten. Ich hab mir hierzu ein aktuelles CD-Image von debian.com gezogen, mit dem ich die Installation starten kann:

virt-install --connect qemu:///system -n vm01 -r 512 -f /dev/vg0/vm01 -c debian-6.0.0-amd64-netinst.iso
--vnc --os-type linux --os-variant debianLenny --accelerate --network=bridge:br0 --hvm
  • -r 512: 512 MB Ram zuweisen
  • -f /dev/vg0/vm01: Das Laufwerk, das der Maschine als Festplatte gegeben wird
  • -c debian-6.0.0-amd64-netinst.iso: Image für CD-ROM Laufwerk
  • --vnc: Damit ich per VNC drauf komm :)
  • --network=bridge:br0: Netzwerkverbindung für diese VM über unser bridged Interface

Der Rest kann in der Manpage nachgelesen werden.

Damit läuft die Maschine und man kann per VNC drauf. Ich hab mir dazu auf meinem Ubuntu Desktop virt-manager installiert, damit kann man sich dann sehr bequem auf den virtuellen Maschinen einloggen und auch neue anlegen.

Zur Installation eines IPv6 only Guest noch folgende Hinweise:

  • IPv6 Nameserver in die /etc/resolv.conf eintragen
  • IPv6 Adresse eintragen und die Routen zum IPv6 Gateway eintragen
  • bei einem Debian Guest noch beachten, dass die Mirrors in der /etc/apt/sources.list per IPv6 erreichbar sind

Stromsparen mit dem Linux-NAS

Vor ein paar Tagen hab ich mir ein NAS auf Basis von Arch-Linux und einem Intel Atom aufgebaut. Ich hab eine Promise-Controller reingebaut und vier Samsung SpinPoint F2 Eco Green 1TB zu einem 3TB Raid5 verschweißt.

Da ich noch kein passendes Netzteil habe, hab ich erstmal ein 430 Watt Netzteil angeschlossen, welches natürlich eine menge Verlustleistung hat. Im Idle Modus verbraucht das NAS 71 Watt. Dann hab ich von der Möglichkeit gelesen, die Platten abzuschalten, wenn diese idlen.

hdparm -B 1 -S 120 /dev/sdb

Nach 10 Minuten Idle schalten sich die Platten ab. Dann sinkt die Leistungsaufnahme des Gesamtsystem auf 58 Watt.

Einen Großteil davon wird die alte Systemplatte verbrauchen, eine alte 20 GB IDE Platte (vermutlich irgendwas um die 10 Watt) und dann wird noch ein relativ großer Block die Verlustleistung des Netzteils sein.

Das Raid- und Dateisystem wurde wie folgt angelegt:

mdadm --create /dev/md0 --assume-clean --level=raid5 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mkfs.ext4 -O large_file,dir_index,sparse_super -E stride=64,stripe-width=192 -b 4096 -m 0 /dev/md0

Mountoptionen sind:

/dev/md0 /mnt ext4 noatime,nodiratime,defaults,auto,data=writeback

Fastboot Archlinux - Dem Linux Beine machen

Als aller erstes muss mal der Kernel selbst gebaut werden. Dazu einfach die Kernel-Sourcen von kernel.org ziehen, entpacken, und konfigurieren:
cd /usr/src/
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.1.tar.bz2
tar -xvzf linux-2.6.29.1.tar.bz2
ln -s linux-2.6.29.1 linux
cd linux
make menuconfig
Was da dann so einzustellen ist, hängt natürlich von deinem Rechner ab. Ein Grundsatz allerdings: Nach Möglichkeit alles fest einkompilieren. Ein paar Dinge, die ich eingestellt hab:
Processor type and features -> Processor family -> Core 2
Processor type and features -> Preemption Model -> Preemptible Kernel (Low-Latency Desktop)
Processor type and features -> Timer frequency -> 300 Hz
Enable the block layer -> IO Schedulers -> Default -> Deadline
Das wären nur ein paar Dinge, die ich eingestellt hab. Wichtig ist nur, alles was man braucht fest rein, alles andere raus. Danach den Kernel kompilieren und installieren:
make
make modules_install
cp arch/x86/boot/bzImage /boot/vmlinuz_foo
Danach in der /etc/grub/menu.1st, oder bei LILO entsprechend anders, zwei Kernel-Parameter anhängen: fastboot und quiet
Da du jetzt keine Module mehr hast, sondern alles fest im Kernel drin ist muss jetzt noch einiges an den Startup-Skripten gemacht werden. Alles was jetzt kommt ist Archlinux-Spezifisch.
Als erstes entfernst du aus der /etc/rc.conf alle Module, die geladen werden sollen. Den Rest hab ich so gemacht, wie im Arch-Wiki beschrieben. Eine Datei, die dort auch stark angepasst wird, die /etc/rc.sysinit, hab ich von dort genommen und zack boom bang war mein ext4 Schrott. Frag mich nicht, wie das zusammenhängt. Ich werd jetzt erstmal retten, was zu retten ist und dann pack ich meine /etc/rc.sysinit hier mit dran.

Ich kann keine Garantie dafür übernehmen, dass das 1:1 bei dir läuft also: selber Hirn einschalten. Bei mir hat es immerhin dazu geführt (bevor das Filesystem gebrickt war), dass die Boot-Zeit von 17 Sekunden vorher auf 11 Sekunden nachher geschrumpft ist.

Suse Linux

Gerade beim Aufräumen gefunden, gescannt und in den Container geworfen.

Duplikate finden

Hatte mal wieder das Problem, dass ich durch hin- und herkopieren auf meiner Platte Duplikate angehäuft haben. Da es jetzt echt viele sind hab ich natürlich gar keine Lust das manuell zu erledigen. Und da kommt mir fdupes gerade recht. Ein Linux-Kommandozeilen-Tool, dem man einfach "-r" für Rekursiv und das Verzeichnis, in dem es arbeiten soll, übergibt. Das Tool erzeugt von jeder Datei md5-Hashes und liefert einem zum Schluss dann eine vollständige Liste mit den Duplikaten. Bei Bedarf kann man mit "-d" noch anfordern, dass es Duplikate auf Nachfrage löscht.
fdupes -r . > dupes.txt