C# Usercontrol

Heute mal was ganz anderes. Wenn man ein Programm schreibt findet man nicht immer das Steuerelement was man braucht.
Letztens benötigte Ich eine „Oszilloskop Ansicht“ um eine Vorschau für eine berechnete Wellenform darzustellen.
Nun in Visual Studio gibt es zwar vieles aber eben dies nicht. Viele werden jetzt sagen „nimm einfach eine Picturebox und zeichne da rein“.
Nun das habe ich auch getan um den Algorithmus zu testen aber Ich wollte was schöneres. Also schnell ein neues Projekt aufgesetzt.

Entwicklungsumgebung einrichten

  • Leere Projektmappe anlegen (hier Usercontrol)
  • Neues Projekt hinzufügen „Windows Forms-Anwendung“ (TestAPP)
  • Neues Projekt hinzufügen „Windows Forms-Steuerelementbibliothek“ (Oszilloskop)
  • Die Eigenschaft (Name) von Usercontrol1 in Oszilloskop abändern
  • Projektmappe erstellen [F6] damit das neue Steuerelement in der TestAPP zu Verfügung steht
  • Das neue Steuerelement in der TestAPP Anwendung verwenden

Jetzt kann man mit der eigentlichen Entwicklung loslegen.

Steuerelement

Zunächst muss man sich den Quellcode der Datei UserControl1.cs anzeigen lassen.
Die erreicht man in dem man die Datei UserControl1.cs im Projektmappen-Explorer markiert und [F7] drückt.
Alternativ kann man auch das Kontextmenü verwenden und den Punkt „Code anzeigen“ auswählen.

Direkt unter dem Konstruktor fügt man jetzt folgende Codezeilen ein.

Code
private PointF[] _data = null; // Globale variable die die Kurvenform enthält
// Extern zugängliche Funktion zur übergabe der zu zeichnenden Kurvenform
public void Drawcurve(PointF[] data)
{
// Zwei Punkte werden benötigt zum zeichnen
if (data.Length < 2)
return;  _data = data;
this.Invalidate(); // Graph neu zeichnen
}

// Funktion zum skalieren von werten
private float scale(float x, float x1, float x2, float y1, float y2)
{
if (x1 == x2)
return 0.0f; // We don't devide by 0

float retval = ((y2 - y1) / (x2 - x1)) * (x - x1) + y1;
return retval;
}

Diese Codezeilen zeichnen jedoch noch keine Kurve oder andere Elemente im Steuerelement. Dazu müssen wir die Funktion OnPaint des Steuerelements überschreiben.

Code
protected override void OnPaint(PaintEventArgs e)
{
Pen pGrid = new
Pen(Color.DarkGray);

float x1 = 0.0f,
x2 = this.Width - 1.0f, // Breite des Steuerelements
y1 = 0.0f,
y2 = this.Height - 1.0f; // Höhe des Steuerelements

float vdiv = 10.0f, hdiv = 10.0f; // Anzahl an Horizontlen/Vertikalen linien

// Vertikale linien
for (float y = x1; y < x2; y+=((x2 - x1 - 0.001f) / vdiv))
{
e.Graphics.DrawLine(pGrid, y, y1, y, y2);
}

// Horizontale linien
for (float x = y1; x <= y2; x+=((y2 - y1 - 0.001f) / hdiv))
{
e.Graphics.DrawLine(pGrid, x1, x, x2, x);
}

if (_data != null && _data.Length >= 2)
{
// Enthaltene Daten zeichnen
for (int i = 0; i < _data.Length; i++)
{
// Zu zeichnende Daten auf die Zeichenfläche skalieren
// Hier mit fester Skala

_data[i].X = scale(_data[i].X, 0.0f, 0.02f, 0, this.Width);
_data[i].Y = scale(_data[i].Y, -325.0f, 325.0f, this.Height, 0);
}

e.Graphics.DrawCurve(Pens.DarkCyan, _data);
}

base.OnPaint(e);
}

Testdaten berechnen

Zum berechnen des Augenblickswertes einer Sinusförmigen Spannung benötigt man folgende Formel.

Da jedoch ein einzelner Wert relativ sinnfrei ist für eine Darstellung einer ganzen Welle muss man sich die Werte für t=0 bis t=T berechnen und in einem Array abspeichern.

Code
PointF[] Ut = new
PointF[4096]; // Augenblickswertarray
float u = 325.0f; // Spitzenwert
float f = 50.0f; // Frequenz der Spannung
float T = 1.0f / f; // Periodendauer
float phi = 0.0f; // Phasenwinkel
float omega = Convert.ToSingle(2.0f * Math.PI * f);
float stepsize = T / Ut.Length;
int idx = 0; // Arrayindex

// Testdaten berechnen
for (float t = 0; t < T; t+=stepsize)
{
idx = Convert.ToInt32(t / stepsize);
if (idx < Ut.Length)
{
Ut[idx].X = t;
Ut[idx].Y = Convert.ToSingle(u * Math.Sin(omega * t + phi));
}
}

Steuerelement testen

Wenn man mit der obigen Funktion seine Testkurve berechnet hat muss man diese nur noch an das neue Steuerelement übergeben und Sie darstellen lassen. Die folgende Codezeile muss man nur noch unter die obige For-Schleife schreiben und seine Anwendung starten.

Code
oszilloskop1.Drawcurve(Ut);

Going OLD-School with Assembler


Ok, Seit ein paar Tagen bin ich stolzer Besitzer eines Dev-Kits für einen C8051F930 von Silicon Labs.
Da ich mir das Teil für die Technikerschule angeschafft habe musste ich gleich mal ein wenig damit Spielen. In der Technikerschule arbeiten wir zwar mit einem Anderen Prozessortyp (Infineon SAB80C517) aber der Kern ist derselbe ein 8051.
Somit kann man das Board zum üben verwenden, man muss allerdings aufpassen das man mit den Registernamen sowie den Eigenheiten nicht durcheinander kommt.
Beim 80C517 gibt es bspw. einen Watchdog den man in Assembler mittels

SETB WDT
SETB SWDT

bedienen muss. Beim C8051F930 geschieht dies anders.
Des Weiteren wurde bei dem Dev-Kit eine „Vollversion“ von Keil µVision V4 mitgeliefert.
Die Vollversion bezieht sich allerdings nur auf die µCs von Silicon Labs, was durchaus verständlich ist.
Zum Spielen hab ich mir mal 2 Programme geschrieben und deren Footprint im Flash des µCs gegenübergestellt.
Die Programme schalten jeweils nur die LED die am Portpin 1.6 angeschlossen ist ein und gehen dann in eine Dauerschleife.
Zuerst die Assemblerversion:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Name Test
; Description: Turn on the LED connected to PortPIN 1.6
; Author: Manuel Koenig
; Date: 03.03.2014

$include(C8051F930.INC)

CSEG AT 0000h

MOV P1MDIN,#60h ;// P1.5, P1.6 are digital
MOV P1MDOUT,#60h ;// P1.5, P1.6 are push-pull
MOV XBR2,#40h ;// Enable crossbar and
;// enable weak pull-ups

;// High = LED Off, Low = LED On
MOV P1,#0FFh ;// Turn off all LEDs
CLR P1.6 ;// Turn on LED on Portpin 1.6

endlos: JMP endlos
END

Assembler footprint im Flash
1
2
3
4
5
6
C:0x0000 75F260 MOV P1MDIN(0xF2),#0x60
C:0x0003 75A560 MOV P1MDOUT(0xA5),#0x60
C:0x0006 75E340 MOV XBR2(0xE3),#0x40
C:0x0009 7590FF MOV P1(0x90),#VDM0CN(0xFF)
C:0x000C C296 CLR 0x90.6
C:0x000E 80FE SJMP C:000E

Hier das C Programm:

C-Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <compiler_defs.h> // compiler declarations
#include <C8051F930_defs.h> // SFR declarations

SBIT (YELLOW_LED, SFR_P1, 6); // ‚0‘ means ON, ‚1‘ means OFF
#define LED_ON 0

void main (void)
{
P0MDIN |= 0x0C; // P0.2, P0.3 are digital
P1MDIN |= 0x60; // P1.5, P1.6 are digital

P0MDOUT &= ~0x0C; // P0.2, P0.3 are open-drain
P1MDOUT |= 0x60; // P1.5, P1.6 are push-pull

XBR2 = 0x40; // Enable crossbar and enable
// weak pull-ups
YELLOW_LED = LED_ON; // Turn on the LED on Portpin 1.6

while (1) {} // Spin forever
}

Assembler footprint im Flash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:0x0000 020016 LJMP C:0016
C:0x0003 43F10C ORL P0MDIN(0xF1),#0x0C
C:0x0006 43F260 ORL P1MDIN(0xF2),#0x60
C:0x0009 53A4F3 ANL P0MDOUT(0xA4),#0xF3
C:0x000C 43A560 ORL P1MDOUT(0xA5),#0x60
C:0x000F 75E340 MOV XBR2(0xE3),#0x40
C:0x0012 C296 CLR YELLOW_LED(0x90.6)
C:0x0014 80FE SJMP C:0014
C:0x0016 787F MOV R0,#0x7F
C:0x0018 E4 CLR A
C:0x0019 F6 MOV @R0,A
C:0x001A D8FD DJNZ R0,C:0019
C:0x001C 758107 MOV 0x81,#0x07
C:0x001F 020003 LJMP C:0003
.
.
.

Wie man sieht hat man bei C einen deutlichen Overhead, daher sollte man bei begrenztem Speicher, hier max. 64kB (-Variablen, -Stack,-etc.) auf Assembler zurückgreifen.
Wer möchte kann die beiden Programme gerne runterladen und selbst ausprobieren sofern Ihr das Dev-Kit habt.

Test_ASM.zip Test_C.zip

AVR DEMO Board V1

Board
Durch einen meiner Kollegen bin ich inspiriert worden mich ein wenig mit µC-Technik zu beschäftigen.
Daraufhin hab ich mir erst mal bei Pollin das AVR NET IO Board gekauft um eine kleine Spielwiese zu haben.
Das Board von Pollin ist zwar schön und gut für den Anfang, hat jedoch ein paar Nachteile.
Es benötigt ein Netzteil das mind. 9VAC liefert und es hat neben dem µC keinen Speicher bzw. keinen Möglichkeit Daten auf eine SD-Karte zu speichern (ohne Zusatzboard).
Das hat mich dann schon ein wenig genervt. Als Elektroniker sollte ich es doch hinbekommen so eine kleine Platine selbst zu entwerfen und zu entflechten.
Gesagt getan. Nach etwas Recherche im Netz und den Festlegen der Funktionen die auf der ersten Version realisiert werden sollen ruhte das kleine Projekt jedoch erst mal eine Weile.
Die Abendschule lässt einen eben keine Zeit wenn man gute Noten schreiben will und Seinen Staatlich geprüften Techniker machen möchte.
Jetzt aber genug von dem Gejammer :D.
In den „Herbstferien“ 2013 hab ich mich dann doch mal hingehockt und die Platine entworfen, herstellen lassen und mit SMD teilen bestückt.
Die Bestückung ist zwar nicht schön aber selten :). Für die ersten Gehversuche in SMD-Technik und Handlöten finde ich es zumindest brauchbar.

Features der V1:

  • Spannungsversorgung über Mini USB-B Port 5V
  • SD-Card Slot
  • RJ45 Anschluss
  • USB RS232
  • 1K EEPROM für FTDI Chip (Eigene ID + Beschreibung)
  • 512K SPI-EEPROM (Für Daten oder Sonstiges)
  • ISP 10Pol Anschluss

Bitte weist mich nicht darauf hin dass ich mir auch einen Arduino hätte kaufen können.
Hier ging es einfach nur um den Spaß bei der Sache und um das Wissen welches man sich dadurch aneignet.

Pics:
Front Back

Da bei der V1 noch ein paar sachen gefehlt haben bzw. mir noch nicht ganz so zusagen.
Bspw. der verwendete RJ45 PulseJack J1006F01P (Lieferzeit 8Wochen+)

Hab ich mich dann an die V2 gemacht.

Board V2

Features der V2:

  • Alle der V1
  • I/O Ports auf Pfostenleiste
  • AVR RS232 auf Pfostenleiste
  • AVR XTAL1 auf Pfostenleiste (FAILOVER für Falsche Fuse Bits: Externer Takt)
  • Micro SD
  • Besser verfügbarer RJ45 anschlusA
  • Neue Level-Shifter 5V 3.3V
  • Test LED wie beim Arduino

Mittlerweile ist diese auch schon entflechtet und muss nur noch hegestellt werden.
Da die Ferien jedoch vorbei sind, konzentrier ich mich jetzt erst mal wieder auf die Schule.

Downloads:
EAGLE V6.5 Projekt + Docs: ATMEGA DEMO V1

Task automation with Visual Basic Script

In case you want to automate some tasks, for example backing up a specific folder from your computer every time you plug in a specific USB-Stick.
All you need to do is to execute the following Visual Basic Script on your computer.
Place it in the Startup folder of Windows if you want it to run every time you login.
Script on your computer

Set Shell = CreateObject( "WScript.Shell" )
Set fso = CreateObject("Scripting.FileSystemObject")
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colME = oWMI.ExecNotificationQuery("Select * from Win32_VolumeChangeEvent")

' Name of the Volume we are after
strVolumeName = "BACKUPDISK"

' Watch for new Drives
Do
Set oLE = colME.NextEvent
If oLE.EventType = 2 Then
' New Drive arrived
Set d = fso.GetDrive(oLE.DriveName)

If d.VolumeName = strVolumeName Then
Shell.Run oLE.DriveName & "\backup.vbs"
End If
End If
Loop

The Script will check for the Drivename (here: „BACKUPDISK“) and if the Drive is found it will execute the BackupScript on the USB-Stick.

Script (backup.vbs) on the USB-Stick

' This Script must be on the USB-Drive in the root directory
Set Shell = CreateObject( "WScript.Shell" )
Set fso = CreateObject("Scripting.FileSystemObject")

' Get the Userprofiledirectory & Computername
strUP = Shell.ExpandEnvironmentStrings( "%USERPROFILE%" )
strCN = Shell.ExpandEnvironmentStrings( "%COMPUTERNAME%" )
strDRV = fso.GetDriveName(WScript.ScriptFullName)

' Create a subfolder on the USB-Drive if it doesn't exist
If Not(fso.FolderExists (strDRV & "\Backup\" & strCN)) Then
fso.CreateFolder strDRV & "\Backup\" & strCN
End If

' Backup the Data (Overwrite existing files)
fso.CopyFolder strUP & "\Pictures", strDRV & "\Backup\" & strCN & "\", vbTrue

In this case all your pictures from the Picturefolder in your Userprofile are backed up.

Aktivierungszeitraum von Windows erweitern (Rearm Windows)

Vor kurzem stand ich vor dem Problem das Windows Aktiviert werden musste, ich aber noch etwas Testen musste zum Abschluss.
Daher hab ich mich im Internet auf die Suche nach einer Lösung gemacht und diese auch gefunden.

Für Windows XP sowie 2003 Server:

  • Starten im Abgesicherten Modus mit Eingabeaufforderung
  • In der Konsole folgendes ausführen:
    rundll32.exe syssetup,SetupOobeBnk
  • Zum Schluss noch mit dem Eventviewer kontrollieren ob die Reaktivierung erfolgreich war.
  • Neustarten und fertig.

Windows 7/8/2008 R2/2012:

  • Eingabeaufforderung als Administrator starten und folgendes ausführen:
  • slmgr.vbs /rearm

  • Neustarten

Auf folgenden Seiten findet man noch weitere Infos darüber:
Windows Server 2008 R2 Aktivierungszeitraum erweitern
How to rearm and change activation key on Windows

VMware Remote Console [VMRC]

Wenn man mit dem ESXi Virtualiesierungssystem arbeitet gibt es immer ein Problem. Will man nur schnell eine laufende VM verwenden um etwas nachzusehen oder zu testen benötigt man immer den vSphere Client um die Konsole zu öffnen.
Um diesen Umstand zu beseitigen braucht man nur im Internet etwas suchen und man erhält die Aufrufparameter für die VMware Remote Console (vmrc).
Dort wird dann beschrieben wie man einen Link erstellt unter Windows mit den passenden Parametern.

Das sieht dann ungefähr so aus:
„… erstellen Sie eine neue Verknüpfung zur vmware-vmrc.exe auf dem Desktop mit dem Kontextmenü …“
„… bearbeiten Sie das Ziel der Verknüpfung und fügen die folgenden Parameter hinzu:“

Resultat
Link mit Ziel:
„C:\Program Files (x86)\Common Files\VMware\VMware VMRC Plug-in\Internet Explorer\vmware-vmrc.exe“ -h <ESX-IP> -u <user> -p <password> „[DATASTORE] /VMxy/VMxy.vmx“

Nun wenn man nur 1 oder 2 VMs auf dem ESX-System hat mag das ja noch praktikabel sein. Bei 5 oder mehr sollte man jedoch daran denken die zu automatisieren.
Mit Hilfe der VMware vSphere PowerCLI geht das wunderbar.
Das folgende Script muss innerhalb der PowerCLI ausgeführt werden, es meldet sich beim ESX an und erstellt dann für jede VM einen solchen Link auf dem Desktop des angemeldeten Benutzers, abschließend trennt es die Verbindung wieder.


$WshShell = New-Object -comObject WScript.Shell

$esxhost = "10.10.47.11"
$esxuser = "your user"
$esxpass = "user password"
$vmrcpath = "%programfiles%\Common Files\VMware\VMware VMRC Plug-in\Internet Explorer\vmware-vmrc.exe"

$server = Connect-VIServer $esxhost -User $esxuser -Password $esxpass

Foreach ($VM in (Get-VM | Sort Name | Get-View)){
$MyDetails = "" | Select-Object VMName,VMXLocation
$MyDetails.VMName = $VM.Name
$MyDetails.VMXLocation = $VM.Config.Files.VmPathName

$Shortcut = $WshShell.CreateShortcut("%userprofile%\desktop\" + $esxuser + "_" + $MyDetails.VMName + ".lnk")
$Shortcut.TargetPath = $vmrcpath
$Shortcut.Arguments = "-h " + $esxhost + " -u " + $esxuser + " -p " + $esxpass + " " + """" + $MyDetails.VMXLocation + """"
$Shortcut.Save()
}

Disconnect-VIServer -Server $server -Force -Confirm:$false

Auf eines muss ich noch hinweisen: Bitte verwendet nicht den root zugang für dieses Script!! Der Benutzer und das Passwort sind bei diesen Links klartextparameter. Richtet also vorher ein Benutzerkonto auf dem ESX ein.

VMLinks Script [Download]

Update: Um die VMRC ohne die Fehlermeldung „VMWare Player ist nicht korrekt installiert. Bitte Installieren Sie diesen neu.“ verwenden zu können, muss der vSphere Client mit der Version 5.0.0-623373 installiert sein. Ist nur die Version 5.1.x installiert funktioniert es nicht.

Protokollanalyse mit Linux (Teil1)

Dies ist eine Schritt für Schritt Anleitung zum Einrichten von Linux zur Analyse des Netzwerkverkehrs zwischen verschiedenen Komponenten.

Eine Analyse des Netzwerkverkehrs kann dazu eingesetzt werden Fehler in der Kommunikation von Komponenten (Soft- sowie Hardware) aufzudecken und zu beseitigen. Einer anderen Anwendung soll dieses Beispiel nicht dienen!

Testumgebung

  • Laptop mit Linux (Debian 6.0.6)
  • USB-Ethernet Adapter (Apple)
  • USB-WLAN Adapter (Realtek 8187)
  • DHCP-Server
  • Aircrack-NG Suite
  • Wirshark

Ich gehe davon aus das Debian 6 (Squeeze) bereits auf dem Laptop installiert ist und man sich in einem Terminal unter GNOME / KDE / etc. befindet.

WICHTIG!
Für diese Anleitung ist es Erforderlich das die Schritte als ROOT ausgeführt werden.
Es sollte daher mit Bedacht vorgegangen werden, da der Spruch „Ich bin root, ich darf das!“ nicht von ungefähr kommt.
Daher hafte ich für keinerlei Schäden die ihr dem System zufügt.
Wenn ihr ganz sicher gehen wollt macht das in einer VM in die ihr die USB-Adapter durchreicht.

Schritt 1: Installation der benötigten Pakete

apt-get install build-essential curl libssl-dev libsqlite3-dev
apt-get install iw wireless-tools wireshark bridge-utils isc-dhcp-server

Schritt 2: Herunterladen des aktuellen Aircrack-NG Suite Quellcodes

wget http://download.aircrack-ng.org/aircrack-ng-1.1.tar.gz

Schritt 3: Entpacken und patchen des Quellcodes

Entpacken

tar –zxvf aircrack-ng-1.1.tar.gz

Patchen

cd aircrack-ng-1.1
nano common.mak

Aus der Zeile „CFLAGS ?= -g -W -Wall -Werror -03“ das „-Werror“ entfernen da sich sonst Aircrack nicht kompilieren lässt.

Schritt 4: Kompilieren und installieren der Aircrack-NG Suite

Kompilieren

make sqlite=true

Installieren

make sqlite=true install

Schritt 5: Update der OUI-Datei

airodump-ng-oui-update

Schritt 6: Monitor Modus von wlan1 starten

airmon-ng start wlan1

Schritt 7: Einen WLAN-Accesspoint mit airbase starten

airbase-ng -e FreeWifi -c 11 mon0 &

Schritt 8: Einrichten der Schnittstellen

ifconfig at0 up
ifconfig eth1 up

Einrichten der Netzwerkbrücke

brctl addbr wifibr0
brctl addif wifibr0 at0
brctl addif wifibr0 eth1
ifconfig wifibr0 10.0.0.254 netmask 255.255.255.0
ifconfig wifibr0 up

Schritt 9: Routing und IP_FORWARDING einrichten

echo „1“ > /proc/sys/net/ipv4/ip_forward
route add net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.254
iptables –flush
iptables –table nat –flush
iptables –delete-chain
iptables –table nat –delete-chain
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQERADE

Schritt 10: DHCP Server einrichten und starten

Bindung des DHCP-Servers an die Netzwerkbrücke

nano /etc/default/isc-dhcp-server

Als INTERFACES wifibr0 eintragen. (INTERFACES=“wifibr0″)

DHCP Einstellungen bearbeiten

nano /etc/dhcp/dhcpd.conf

ddns-update-style ad-hoc;
default-lease-time 600;
max-lease-time 7200;
authoritive;

subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.10 10.0.0.30;
    option netmask 255.255.255.0;
    option routers 10.0.0.254;
    option broadcast-address 10.0.0.255;
    option domain-name-servers 8.8.8.8;
}

DHCP Server starten

/etc/init.d/isc-dhcp-server restart

Schritt 11: Start der Analyse mit Wireshark

wireshark -i wifibr0 –k &

NFS Speicher in VMware ESXi einbinden

In meinem letzten Artikel ging es um das Einrichten eines NFS Servers.
Dieser findet nun Verwendung in einer VMware ESXi Umgebung.

Wie man die NFS Freigabe dort einbindet zeigt folgendes Video:
[YouTube-Link]:NFS Freigabe in VMware ESXi einbinden Achtung! Fullscreen

Wenn dieser Datenspeicher mehreren ESX-Servern, die zu einem HA-Cluster zusammengeschlossen sind, zur Verfügung steht hat man die Möglichkeit der Migration von Virtuellen Maschinen innerhalb des Clusters. Die Migration einer VM kann während des betriebs durchgeführt werden und der Nutzer bemerkt höchstens ein zucken, falls er Remote darauf zugreift.

NFS Server mit NIC Bonding

Um einen NFS Server mit NIC Bonding (HP: NIC Teaming) aufzusetzen benötigt man folgendes:

Hardware:
PC mit freien PCI- und PCIe-Steckplätzen
mind. 2 Gigabit Ethernet Karten
1x HDD oder RAID als Systemplatte
1x Größtmögliche(s) HDD o. RAID5 (empfohlen)
RAM: mind. 1GB
CPU: ab 2GHz (mit 64bit Unterstützung)

OS: Debian 6.0.5 x64
Pakete:
ifenslave-2.6
nfs-kernel-server
nfs-common
portmap

(optional: openssh-server, samba)

Für das Beispiel wird das Ganze in einer VM als Demo laufen, die einzelnen Schritte sind aber auf das reale System übertragbar.

Beispiel:
ISO-Datei des Debian Systems (debian-6.0.5-amd64-netinst.iso) herunterladen und auf CD-brennen. (Für die VM reicht die ISO)

VM mit 3 Festplatten und 2 Netzwerkkarten erstellen
1. Festplatte (System) 8GB
2. & 3. Festplatte 0.5GB

Das Debian System ohne die Grafische Desktop-Umgebung installieren.
Nach dem Neustart sich als root anmelden.

Jetzt die oben genannten Pakete installieren.
apt-get install ifenslave-2.6 nfs-kernel-server nfs-common portmap

Konfigurieren des NIC Bondings

Netzwerkschnittstellen herunterfahren
ifconfig eth0 down
ifconfig eth1 down

mit nano die Datei /etc/network/interfaces öffnen und die folgenden Zeilen mit einer # auskommentieren.
# allow-hotplug eth0
# iface eth0 inet dhcp

Folgendes der Datei /etc/network/interfaces hinzufügen
auto bond0
iface bond0 inet dhcp
slaves eth0 eth1
# Wenn alle Netzwerkschnittstellen verwendet werden sollen.
# slaves all

# Modes
#
# mode=0 (balance-rr)
# Round-robin policy: Transmit packets in sequential order from the first
# available slave through the last. This mode provides load balancing and
# fault tolerance.
#
# mode=1 (active-backup)
# One slave interface is active at any time. If one interface fails,
# another interface takes over the MAC address and becomes the active
# interface. Provides fault tolerance only. Doesn’t require special switch # support
#
# mode=2 (balance-xor)
# Tranmissions are balanced across the slave interfaces based on ((source
# MAC) XOR (dest MAC)) modula slave count. The same slave is selected for
# each destination MAC. Provides load balancing and fault tolerance.
#
# mode=3 (broadcast)
# Transmits everything on all slave interfaces. Provides fault tolerance.
#
# mode=4 (802.3ad)
# This is classic IEEE 802.3ad Dynamic link aggregation. This requires
# 802.3ad support in the switch and driver support for retrieving the speed # and duplex of each slave.
#
# mode=5 (balance-tlb)
# Adaptive Transmit Load Balancing. Incoming traffic is received on the
# active slave only, outgoing traffic is distributed according to the
# current load on each slave. Doesn’t require special switch support
#
# mode=6 (balance-alb)
# Adaptive Load Balancing - provides both transmit load balancing (TLB) and
# receive load balancing for IPv4 via ARP negotiation. Doesn’t require
# special switch support, but does require the ability to change the MAC
# address of a device while it is open.
bond-mode 0
bond-miimon 100

Speichern der Datei mit [Ctrl]+[O].

NFS freigaben einrichten

Als root anmelden.

Einhängepunkte erstellen:
mkdir /media/DATA1
mkdir /media/DATA2

Gerätenamen der Datenfestplatten ermitteln:
fdisk –l

Für das VM Beispiel:
Disk /dev/sdb: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdc doesn't contain a valid partition table

Partitionen und Dateisystem auf den Datenfestplatten erstellen:
fdisk /dev/sdb
n
p
1
[Return]
[Return]
w

mkfs.ext3 /dev/sdb1
das gleiche für /dev/sdc

Automatisches Einhängen beim Bootvorgang:
Die Datei /etc/fstab mit nano öffnen und die folgenden Zeilen hinzufügen

/dev/sdb1 /media/DATA1 ext3 rw,user,auto 0 0
/dev/sdc1 /media/DATA2 ext3 rw,user,auto 0 0

NFS freigaben bekanntgeben
Die Datei /etc/exports mit nano öffnen und folgendes Zeilen einfügen:

/media/DATA1 *(rw,no_root_squash,no_subtree_check)
/media/DATA2 *(rw,no_root_squash,no_subtree_check)

Speichern der Datei mit [Ctrl]+[O].

Jetzt das System neustarten und der NFS-Server ist soweit eingerichtet.

ESXi Network connection with 65535Mbps [solved]

During the last days I had the problem on my ESXi Server that it was not reachable.

The Server itself and the VMs were running fine. So it was no crash or something like that. After I took a closer look at the problem with the support console, I noticed that my management network connection had some weird values.

Link: Up <- with the cable disconnected?

Linkspeed: 65535Mbs <- Hmm, cool in an Gigabit network

Duplex: Half

The first thing I tried was to restart my management network via the menu but this time it doesn’t helped. So I tried my luck in the support console by typing esxcfg-nics -a vmnic0.

The result was that my Server was reachable again and the values of the network connection were back to normal.

To automate this action I wrote a little Python Script which detects these abnormal values and resets them to normal by executing esxcfg-nics –a <interface>.

All I had to do is to place the script on the ESXi Server in a directory which is not deleted or overwritten if the server gets restarted and to add it as a cronjob which is executed every 30minutes.

In my case I placed the Script on the VMFS-Data storage.

The only thing which is left to do is to save the cronjobs so that they were persistent even if I reboot the Server. But I didn’t figured this out how to do it.

The Script is available here to Download: nic_check.py