Linux-Arbeitskreis Hamburg

X-Terminals
Installation von Win4Lin Terminalserver

Die notwendige Software bekommen Sie entweder bei http://www.netraverse.com zum Download, oder beim deutschen Distributor http://www.ixsoft.de gegen eine geringe Gebühr auf CD. In beiden Fällen bekommen Sie kostenlos einen Lizenzschlüssel für eine Testperiode von 30 Tagen.

Die CD von ixsoft war nicht ganz aktuell, so dass zusätzlich eine Aktualisierung von NeTraverse notwendig ist.

Die Installation der Software ist in der Dokumentation sehr ausführlich beschrieben und problemlos. Sie besteht aus drei Schritten.

Für die Installation von Win4Lin und NSSE ist ein angepasster Linux-Kernel notwendig. NeTraverse stellt auf den Webseiten Kernel für die wichtigsten Distributionen zur Verfügung, u.a. auch SMP-Kernel für Computer mit mehreren Prozessoren.

Sie müssen nur darauf achten, dass Sie über einen Standardkernel der jeweiligen Distribution verfügen und nicht über eine aktualisierte Version.

Beim ersten Installationsschritt (von CD) aktualisiert der Installer auch den neuen Kernel. Sie müssen hier keine Angst haben, im Boot-Menü steht Ihnen sowohl der neue, als auch der alte Kernel zur Verfügung. Nach einem Reboot des Rechners starten Sie den Installer lokal, worauf im nächsten Schritt die systemweite Windows-Vorinstallation erfolgt.

Sie benötigen dazu eine Windows-CD und die zugehörige Boot-Diskette. Beide Medien liest das Installationsprogramm ein und speichert Sie auf der Festplatte.

Im letzten Schritt erfolgt dann die Installation für jeden Benutzer anhand der bereits eingelesenen Medien. Hieraus ergibt sich, dass alle Windows-Installationen die gleiche Version besitzen müssen.

Windows-Installation für die Benutzer

Wenn Sie über genügend Speicherplatz auf dem Server verfügen und über genügend Lizenzen, dann können Sie für jeden Benutzer eine Windows-Installation erstellen. Das kann der jeweilige Benutzer auch selber machen, indem er unter KDE in einer Shell

win

eingibt. Das System erkennt, dass der Benutzer noch über keine Installation verfügt und bietet ihm eine Installation an. Der Benutzer braucht dafür keinerlei Medien, sondern nur die Code-Nummer der Windows-CD.

Bei der Installation legt Win4Lin drei Verzeichnisse im Homeverzeichnis des Benutzers an:
win		hier liegt die eigentliche Windows-Installation
.merge 		hier liegen Konfigurationseinstellungen
mydata 		Verzeichnis für Benutzerdaten, erreichbar als d:

Wenn Sie nicht für jeden Benutzer die Installation ablaufen lassen wollen, dann können Sie die erfolgte Installation einfach kopieren. Sie müssen dann nur für jede der Kopien den Rechnernamen ändern, die Vorgabe ist

servername-benutzername

und wird bei der Installation erstellt.

Für das bequeme Sichern und Zurückspielen der Installationen liefert NeTraverse ein kleines Shell-Script mit, das auf der CD im Verzeichnis \misc\tools zu finden ist. Das Programm heißt Nssetemplate und ist in der Lage Installationen gepackt als sog. Templates abzulegen. Die Templates kann man dann einfach wieder mit diesem Ordner in ein Benutzerverzeichnis zurückkopieren.

Das Programm hat zwei kleine Fehler bzw. Probleme. Es ist mit DOS-Zeilenschaltungen gespeichert und muss erst einmal dementsprechend bearbeitet werden. Kopieren Sie Sich die Datei ein ein Verzeichnis, z.B. /tmp dort geben Sie ein:

dos2unix Nssetemplate

womit dieses Problem beseitigt wird. Bei Zurückspielen eines Templates gibt es ein weiteres Problem. Nach der Installation müssen die Dateien dem Benutzer übereignet werden. Dazu findet sich in dem Script die Zeile

chown -R $USERNAME.$USERNAME $USERHOME

Dieses Kommando geht davon aus, dass es für jeden Benutzer eine gleichnamige Gruppe gibt. Ändern Sie die Zeile einfach in

chown -R $USERNAME.users $USERHOME

dann sollte die Installation klappen. Ansonsten ist das Script gut dokumentiert und gibt auch Hilfetexte aus.

Rechnerbezoge Windows-Installation

Relativ einfach und sparsam wird die Windows-Nutzung, wenn man nicht für jeden Benutzer eine Windows-Installation vornimmt, sondern eine für jeden Client.

Führen Sie für einen beliebigen Nutzer eine vollständige Windows-Installation mit allen Anwendungsprogrammen durch. Kopieren Sie nach der Installation das win-Verzeichnis in eine genügend große Partition und benennen Sie sie so um, dass Sie wie einer der Client-Rechner heißt. Anschließend erstellen Sie für jeden Client-Rechner eine Kopie dieses Verzeichnisses, die genauso heißt wie der Rechner (ohne Domainanteil).

Beim Kopieren müssen Sie darauf achten, dass die Eigenschaften der Dateien nicht verändert werden, vor allem das Datum nicht. Windows meckert nämlich, wenn bei bestimmten Dateien das Datum verändert ist. Sie sollten immer mit cp -a kopieren, was die Eigenschaften erhält:

cp -a rechner1 rechner2

Nun brauchen Sie noch ein Script, das bei der Anmeldung eines Benutzers feststellt, ob es für den zugehörigen Client-Rechner eine Installation gibt und dann im Homeverzeichnis des Benutzers einen Link namens win auf dieses Verzeichnis anlegt. Das Installationsverzeichnis muss dann noch dem Benutzer übereignet werden, danach kann dann Windows gestartet werden.

Das hier beschriebene Script ist zweistufig, da zum Ändern der Eigentumsverhältnisse Root-Rechte benötigt werden, zum Start von Windows aber nicht.

Das erste Perl-Script heißt einfach windows und kann im Verzeichnis /usr/local/bin abgelegt werden.

#!/usr/bin/perl -w
# (c) Uwe Debacher und Bernd Burre 2002
# die Verzeichnismanipulationen erfordern Root-Rechte
# wo liegen die Windows-Installationen
$winpfad="/reserve2/win4lin";
# Benutzernamen ermitteln
$uid=$<;
$username=(getpwuid($uid))[0];
if ($username=~ /^(.+)$/) {
$username = $1;
}
if ($username eq "") {
die "Fehler: Ich kann den Benutzernamen nicht ermitteln\n";
}
# der volle Hostname steckt in der letzten Spalte
@last= `/usr/bin/last -n 1 -a $username`;
$host= (split (/\s+/, $last[0]))[9];
if ($host eq "") {
die "Fehler: lokales Login auf dem Server\n";
}
# den Domainteil verwerfen
$host = (split /\./, $host)[0];
if ($host eq "") {
die "Fehler: ich kann den Rechnernamen nicht ermitteln\n";
}
if ($host eq "" || $host eq "wtmp") {
die "Fehler: Ich kann den Anmelde-Rechner nicht ermitteln\n";
}
# ist fuer diesen Rechner eine Installation vorhanden??
if (!-e "$winpfad/$host") {
die "Fehler: das Verzeichnis $winpfad/$host fehlt\n";
}
# es darf keine Datei und kein Verzeichnis win geben
if (-e "win" && !-l "win") {
die "Fehler: Ich kann den Link win nicht anlegen, es gibt eine solche Datei\n";
}
# vorhande win-Links müssen weg
if (-l "win") {
print "lösche vorhandenen Link win\n";
unlink ("win");
}
# den Link win anlegen
print "Lege Link win an\n";
symlink("$winpfad/$host", "win");
# fuer die Links werden Rootrechte benoetigt
system "wrapper";
# Erfolg testen
if (!-o "win/autoexec.bat") {
die "Fehler: Die Eigentumsverhältnisse stimmen nicht\n";
}
# weiter mit den normalen Rechten
print "Starte Windows\n";
exec "win"

Bevor das Script den Link win anlegt entfernt es einen eventuell schon vorhandenen Link. Wenn es ein Verzeichnis win findet, dann bricht es mit einer Fehlermeldung ab.

Einen wichtigen Teil der Arbeit erledigt das zweite Script, das über ein kleines C-Programm namens wrapper gestartet wird. Das zweite Programm benötigt Root-Rechte und da man Perl-Scripten nicht einfach Setuid setzen kann muss ein kleines C-Programm das Perl-Script starten. Bei diesem C-Programm muss mit

chmod u+s wrapper

das Setuid-Bit gesetzt werden.

/usr/local/bin/links.pl
#!/usr/bin/perl
# (c) Uwe Debacher und Bernd Burre März 2002
# den Pfad zu den Windows-Installationen bitte anpassen
$pfad="/reserve2/win4lin";
# wir brauchen Root-Rechte
$uid="$<";
$< = "$>";
$oldpath=$ENV{'PATH'};
$ENV{'PATH'}="/bin:/sbin:/usr/bin:/usr/sbin";
# Benutzernamen ermitteln
$username=(getpwuid($uid))[0];
if ($username=~ /^(.+)$/) {
$username = $1;
}
# der volle Hostname steckt in der letzten Spalte
@last= `/usr/bin/last -n 1 -a $username`;
$host= (split (/\s+/, $last[0]))[9];
if ($host eq "") {
die "Fehler: lokales Login\n";
}
# den Domainteil verwerfen
$host = (split /\./, $host)[0];
if ($host eq "") {
die "Fehler: Ich kann den Rechnernamen nicht ermitteln\n";
}
# den Pfad zum Windowsverzeichnis montieren
$pfad=$pfad . '/' . $host;
if ($pfad=~ /^(.+)$/) {
$pfad=$1
}
# wenn es den Pfad nicht gibt, dann stimmt was nicht
if ( !-d "$pfad") {
die "Fehler: $pfad nicht gefunden\n";
}
# nur können wir endlich übereignen
print "Übereigne $pfad an $username\n";
system "/bin/chown -R $username $pfad";

Ein großer Teil des Scriptes dients dazu die Sicherheitsanforderungen von Perl hinsichtlich von Setuid-Programmen zu erfüllen. Perl erwartet das die Eingabedaten überprüft werden. Weitere Hinweise hierzu finden sich in der Manpage perlsec.

Zum Abschluss noch der C-Quelltext des Wrapper-Scriptes, die Bedienung ist im Kommentar beschrieben.

/*
*/
#include <unistd.h>
#include <sys/types.h>
// compilieren: gcc -o wrapper script_suid.c
// danach: chmod u+s wrapper
int main(argc,argv)
int argc;
char *argv[];
{
extern char **environ;
int c;
c=execve("/usr/local/bin/link.pl",argv,environ);
return c;
};
/* *** EOF *** */

Damit ist das System funktionsfähig und alle Benutzer können ihren Windows-Emulator starten, indem Sie in einem Teminalfenster unter KDE windows eingeben.

Ein kleiner Haken bleibt noch. Sie als Administrator müssen einmal an jeden der Rechner herangehen, um den Rechner-Namen für den zugehörigen virtuellen Rechner zu ändern. Nach dem Kopieren sind die nämlich alle gleich. Mit etwas Handarbeit können Sie das aber auch alles von einem Rechner aus machen, indem Sie die Links passend setzen und die Windows-Rechner nacheinander starten und konfigurieren.

Die MAC-Adressen der virtuellen Netzwerkkarten werden von Win4Lin automatisch verteilt, jeweils in der Anmeldereihenfolge. Damit ist die Eindeutigkeit gewährleistet, vermutlich auch die Lizenzüberprüfung.


Kritik, Anregungen und Ergänzungen willkommen. Zusammengestellt von Uwe Debacher und Bernd Burre, letzte Änderung am 27.01.2006
Impressum