156 lines
5.3 KiB
Plaintext
156 lines
5.3 KiB
Plaintext
/* PIPE- Filesystem */
|
|
|
|
1. Was sind PIPEs?
|
|
|
|
das 'PIPE Filesystem' entstand urspruenglich aus der Frage heraus:
|
|
Wie kann ich ein Linux System oder Teile davon ueber/auf einen
|
|
DOS-Rechner oder Novell Fileserver sichern.
|
|
Ein schneller Loesungsansatz ergab das 'PIPE Filesystem'.
|
|
|
|
In dem Pipe Filesystem koennen Shell Scripte oder
|
|
Linux Programme hinterlegt werden.
|
|
Diese Programme werden von dem Client (z.B. DOS) wie einfache
|
|
Dateien behandelt.
|
|
Ein Lese oder Schreibzugriff auf diese Dateien ueber den Client bewirkt
|
|
einen popen dieser Programme. Der Server uebergibt
|
|
als 1. Parameter entweder 'READ' oder 'WRITE'
|
|
je nach Modus des ersten Zugriffes (Read oder Write).
|
|
Das 'PIPE-Filesystem' bietet damit eine direkte Schnittstelle
|
|
zwischen Client Anwendungen und Linux Programmen.
|
|
|
|
2. Beispiele
|
|
|
|
2.1 Dos->Linux, Linux->Dos Backup
|
|
|
|
Die Loesung des obigen Problems ergab sich dann mit folgendem einfachen
|
|
Shell Script, welches im PIPE-Filesystem hinterlegt wurde.
|
|
|
|
#!/bin/sh
|
|
case "$1" in
|
|
'WRITE')
|
|
cd /u3 && tar -xf - 2>> /tmp/tar.in
|
|
# restore directory /u3/mar
|
|
;;
|
|
'READ')
|
|
cd /u3 && tar -cf - mar 2> /dev/null
|
|
# save directory /u3/mar
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
Unter DOS kann nun diese 'Pipe Datei' mit dem Copy Befehl in eine
|
|
lokale Datei 'kopiert' werden ( -> Sichern ) bzw. es
|
|
kann die lokale Datei auf diese 'Pipe Datei' kopiert werden.
|
|
( -> Ruecksichern )
|
|
|
|
2.2 Drucken ueber Pipes
|
|
|
|
Ein einfaches Drucken kann z.B. mit folgendem Mini Script realisiert werden.
|
|
Anstatt des Scriptes reicht in diesem Fall natuerlich auch ein link auf
|
|
/usr/bin/lpr.
|
|
|
|
#!/bin/sh
|
|
/usr/bin/lpr
|
|
|
|
Dadurch kann ein capture unter DOS/Windows entfallen.
|
|
|
|
2.3 Private Windowsinstallation fuer jeden Netzbenutzer
|
|
|
|
(Beispiel von Sascha Herrmann <sascha@system.rhein-main.de>)
|
|
|
|
Die Idee fuer diesen Script, war auf einem Netz mit Diskless PCs, die ueber
|
|
mars-nwe ihr Dos/Windows System bekommen, fuer jeden einzelnen Benutzer eine
|
|
eigene Windowsconfiguration zu bekommen.
|
|
Hierfuer habe ich einen kleinen Shellscript geschrieben, der diese Aufgabe
|
|
bisher recht gut erledigt, ohne viel Speicherplatz zu verschwenden.
|
|
|
|
Fuer den Skript muss zunaechst einmal Windows in mehrere Teile aufgesplittet
|
|
werden, einen gemeinsamen Teil, auf den kein Schreibzugriff noetig ist
|
|
(*.exe, *.dll etc.) und einen Teil auf den Schreibzugriff noetig ist (*.ini
|
|
etc.). Windows bringt mit der Serverinstallation schon eine moeglichkeit die
|
|
Installation in zwei Teile aufzuspalten. setup /a erzeugt ein Verzeichnis,
|
|
das von allen Benutzern gemeinsam benutzt werden kann und setup /n erzeugt
|
|
dann eine Benutzerinstallation, die nur noch ca. 500kb gross ist. Das so
|
|
erzeugte Verzeichnis wird nun auf den Server kopiert und dort nochmal in
|
|
zwei Teile aufgeteilt (nach dem oben beschriebenen Schema).
|
|
|
|
Der Skript kopiert und linkt nun einfach die Dateien aus dem mit setup /n
|
|
installierten Dateien in ~/windows/windows. Wenn man nun auf den Dosclient
|
|
das Volume \\SERVER\HOMEDIR\WINDOWS auf Laufwerk d: und das mit setup /a
|
|
erzeugte Verzeichnis auf ein anderes Laufwerk einbindet hat man eine
|
|
funktionierende Windowsinstallation, die pro Benutzer grade einmal 80kb
|
|
Plattenplatz wegnimmt.
|
|
|
|
Der Skript wird nach jedem login von dem Dosclient durch einen type auf die
|
|
Datei ausgefuehrt und kopiert alle Dateien mit cp -au (u steht fuer Update,
|
|
daher nur neuere Dateien werden kopiert) aus $TEMPLATE/dynamic nach
|
|
~/windows/windows und legt fuer jede Datei aus $TEMPLATE/static einen
|
|
symbolischen link in ~/windows/windows an. Damit kann man die mit setup -n
|
|
erstellten Dateien noch einmal in einen Teil mit und einem ohne
|
|
Schreibzugriff unterteilen.
|
|
Leider setzt mars-nwe (zumindest in 0.99.pl4) in Pipescripts die
|
|
umgebungsvariable $HOME immer auf /root, daher lese ich das Heimatverzeichnis
|
|
mit dem gethomedir.pl script aus /etc/passwd aus.
|
|
|
|
--------------------------------------------------------------------
|
|
#!/bin/sh
|
|
# mkwin Pipeskript
|
|
#
|
|
# !!!!ACHTUNG!!!!
|
|
# Wenn in $home/ eine Datei windows oder windows/windows exestiert,
|
|
# wird diese ohne nachfrage geloescht
|
|
PATH="/bin:/usr/bin"
|
|
|
|
TEMPLATE="/var/spool/nwserv/windows/template"
|
|
home=`/var/spool/nwserv/pipe/gethomedir.pl $UID`
|
|
case "$1" in
|
|
'READ')
|
|
if ! test -d $home/windows ; then
|
|
rm -rf $home/windows
|
|
fi
|
|
if ! test -d $home/windows/windows ; then
|
|
rm -rf $home/windows/windows > /dev/null
|
|
mkdir -pm 0700 $home/windows/windows
|
|
fi
|
|
for i in $TEMPLATE/static/* ; do
|
|
ln -s $i $home/windows/windows
|
|
done
|
|
cp -au $TEMPLATE/dynamic/* $home/windows/windows
|
|
;;
|
|
esac
|
|
-----------------------------------------------------------------
|
|
#!/usr/bin/perl
|
|
#
|
|
# File: gethomedir.pl
|
|
#
|
|
print "$1\n";
|
|
open(PW, "/etc/passwd");
|
|
while ($line=<PW>) {
|
|
chop($line);
|
|
($uid, $home) = ($line=~
|
|
/[^\:]*\:[^\:]*\:([\d]*)\:[^\:]*\:[^\:]*\:([^\:]*)\:/
|
|
);
|
|
|
|
if ($uid == $ARGV[0]) {
|
|
print "$home";
|
|
}
|
|
|
|
}
|
|
close(PW);
|
|
------------------------------------------------------------------
|
|
|
|
2.4 andere Beispiele
|
|
|
|
In dem Verzeichnis examples gibt es als zusaetzliches Beispiel
|
|
die Programmpaare unxcomm<->comm und sendm<->unxsendm.
|
|
Mittels unxcomm/comm ist es sehr einfach moeglich einige
|
|
Linux Befehle vom Client aus aufzurufen.
|
|
z.B. : ps, lpq, lprm usw.
|
|
|
|
Ueber weitere dokumentierte Anwendungen bzw. Anregungen zu dem
|
|
PIPE-Filesystem wuerde ich mich freuen.
|
|
|
|
Martin
|
|
|