<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//NL"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="GENERATOR" CONTENT="lfparser_2.28"> <META NAME="LFCATEGORY" CONTENT="SystemAdministration"> <TITLE>lf199, SystemAdministration: Instant data kopiëren onder Linux.</TITLE> <style type="text/css"> <!-- td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 } pre { font-family:monospace,Courier } p.cl { color:#EE9500 } a.nodec { text-decoration:none } p.trans { font-size:8pt; text-align:right } p.clbox { width:50%; alignment:center; background-color:#FFD700; border-style:none; border-width:medium; border-color:#FFD700; padding:0.5cm; text-align:center } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm; text-align:left } p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; border-width:medium; border-color:#AAAAAA; padding:0.5cm ; margin-top:0.1cm; margin-right:1cm; margin-left:1cm; text-align:center } .mark { background-color:#e6e6ff } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://www.linuxfocus.org/~guido/dev/lfparser.html --> <!-- this is used by a number of tools: =LF=AUTHOR: Atif Ghaffar =LF=CAT___: SystemAdministration =LF=TITLE_: Instant data kopiëren onder Linux. =LF=NUMBER: 199 =LF=ANAME_: article199.shtml --> <!-- 2pdaIgnoreStart --> <!-- start navegation bar --> <!-- top navegation bar --> <TABLE summary="topbar_1" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#2e2292"> <TD class="top"><TABLE summary="topbar_1_logo" cellspacing="0" cellpadding="0" border="0" width= "100%"> <TR><TD width="319"><IMG src="../../common/images/logolftop_319x45.gif" alt="[LinuxFocus-icon]" width="319" height="45" align="left" border="0"></TD> <TD class="top"> <TABLE summary="topbar_1_links" width="100%"> <TR align="right"> <TD class="top"><A class="nodec" href="../index.shtml"><FONT color= "#DDDDDD" size="2">Home</FONT></A> | <A class= "nodec" href="../map.html"><FONT color= "#DDDDDD" size="2">Map</FONT></A> | <A class= "nodec" href="../indice.html"><FONT color= "#DDDDDD" size="2">Index</FONT></A> | <A class="nodec" href="../Search/index.html"><FONT color= "#DDDDDD" size="2">Zoek</FONT></A> </TD> </TR> <TR align="right"> <TD class="top"> <HR width="100%" noshade size="1"> </TD> </TR> </TABLE> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end top navegation bar --> <!-- blue bar --> <TABLE summary="topbar_2" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#00ffff"> <TD><IMG src="../../common/images/transpix.gif" width="1" height= "2" alt=""></TD> </TR> </TABLE> <!-- end blue bar --> <!-- bottom navegation bar --> <TABLE summary="topbar_3" cellspacing="0" cellpadding="0" border="0" align="center" width="94%"> <TR bgcolor="#000000"> <TD> <TABLE summary="topbar_3_links" cellspacing="0" cellpadding="1" border="0" width= "100%"> <TR align="center"> <TD WIDTH="20%"><A class="nodec" href="../News/index.html"><FONT color= "#FFFFFF">Nieuws</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color= "#FFFFFF">Archieven</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Links/index.html"><FONT color= "#FFFFFF">Links</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color= "#FFFFFF">Over LF</FONT></A> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end bottom navegation bar --> <!-- stop navegation bar --> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.1 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Dit artikel is beschikbaar in: <A href="../../English/March2001/article199.shtml">English</a> <A href="../../Castellano/March2001/article199.shtml">Castellano</a> <A href="../../Deutsch/March2001/article199.shtml">Deutsch</a> <A href="../../Francais/March2001/article199.shtml">Francais</a> <A href="../../Nederlands/March2001/article199.shtml">Nederlands</a> <A href="../../Turkce/March2001/article199.shtml">Turkce</a> </FONT></TD></TR></TABLE><br> <!-- SSI_INFO STOP --> <!-- 2pdaIgnoreStop --> <!-- SHORT BIO ABOUT THE AUTHOR --> <TABLE ALIGN=LEFT BORDER=0 WIDTH="190" > <TR> <TD> <!-- 2pdaIgnoreStart --> <!-- PALM DOC --> <TABLE BORDER=0 hspace=4 vspace=4> <TR> <TD> <font size=1> <img src="../../common/images/2doc.gif" width=34 align=left border=0 height=22 alt="convert to palm"><a href="http://cgi.linuxfocus.org/cgi-bin/2ztxt">Convert to GutenPalm</a><br>or <a href="http://cgi.linuxfocus.org/cgi-bin/2pda">to PalmDoc</a></font> </TD> </TR> </TABLE> <!-- END PALM DOC --> <!-- 2pdaIgnoreStop --> <br> <IMG SRC="../../common/images/Atif-Ghaffar.jpg" ALT="[Photo of the Author]" HEIGHT=124 WIDTH=115> <BR>door Atif Ghaffar <br> <small><atif(at)developer.ch></small> <BR><BR> <I>Over de auteur:</I><BR> <P>Atif is een kameleon. Hij veranderd van rol, van systeembeheerder naar programmeur naar leraar naar projectleider, al naar gelang het werk vereist. <BR> Atif is van mening dat hij veel aan Linux en de <EM>open source</EM> gemeenschap met zijn projecten te danken heeft vanwege de leerzame ervaringen. <BR> Je kunt meer over hem vinden op zijn <a href="http://www.developer.ch/~aghaffar">homepage</a>. <!-- TRANSLATED TO nl --> <BR><BR><I>Vertaald naar het Nederlands door:</I><BR> Tom Uijldert <small><tom.uijldert(at)cmgplc.com></small> <br> <!-- TRANSLATED TO STOP --> <BR><i>Inhoud</i>: <UL> <LI><A HREF="#199lfindex0">Waarom kopiëren en niet gewoon delen?</A></LI> <LI><A HREF="#199lfindex1">Hou 't simpel</A></LI> <LI><A HREF="#199lfindex2">Hou 't slim</A></LI> <LI><A HREF="#199lfindex3">Wat is FAM?</A></LI> <LI><A HREF="#199lfindex4">Wat is IMON?</A></LI> <LI><A HREF="#199lfindex5">Het installeren van FAM en IMON</A></LI> <LI><A HREF="#199lfindex6">Het installeren van de SGI::PAM module</A></LI> <LI><A HREF="#199lfindex7">Kopiëren met fam_mirror</A></LI> <LI><A HREF="#199lfindex8">Referenties</A></LI> <LI><A HREF="#199lfindex9">Bekende problemen</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=199&lang=en">Talkback voor dit artikel</A></LI> </UL> </TD></TR></TABLE> <!-- HEAD OF THE ARTICLE --> <br> <H2>Instant data kopiëren onder Linux.</H2> <IMG SRC="../../common/images/tuxmirror.gif" ALT="[Illustratie]" HSPACE=10 HEIGHT=246 WIDTH=149> <!-- ABSTRACT OF THE ARTICLE --> <P><i>Kort</i>: <P> In dit artikel onderzoeken we het instant kopiëren van data onder Linux zonder gebruik te maken van dure oplossingen als <EM>SAN</EM> (Storage Area Network zoals GFS) of andere apparaten met bloksgewijze netwerktoegang. We zullen <a href="http://oss.sgi.com/projects/fam">FAM en IMON</a> gebruiken voor het kopiëren. <BR> FAM (File Alteration Monitor) en IMON (Inode monitor) zijn oorspronkelijk door SGI ontwikkeld voor IRIX. <P> De mensen van SGI hebben een prima keuze gedaan door het op Linux te zetten en er <EM>open source</EM> van te maken. <P> Als geld geen rol speelt zou ik voor <a href="http://www.globalfilesystem.org">GFS (Global File System)</a> of een op SAN gebaseerde oplossing gaan maar als kosten een belangrijke overweging zijn en je wilt toch data spiegelen dan zijn er weinig keuzes. <BR> Ik heb een aantal keuzes hier op een rij. In dit artikel zullen we ze bespreken en de voor- en nadelen bekijken. <br><br><!-- HR divider --><table width="300" align="center" border="0"> <tr> <td bgcolor="#8282e0"><IMG src="../../common/images/transpix.gif" width="1" height="2" alt=""></td> </tr> </table> <!-- BODY OF THE ARTICLE --> <A NAME="199lfindex0"> </A> <H2>Waarom kopiëren en niet gewoon delen?</H2> Zijn <EM>bestandsservers</EM> niet bedoeld voor het beschikbaar maken van data aan <EM>clients</EM>? <BR> Jazeker <P> Als we echter data van bestandsservers beschikbaar maken over NFS of SMB dan creëren we een <STRONG>knelpunt</STRONG> en een <STRONG>single point of failure</STRONG> (één foutgevoelige plek of achilleshiel in het systeem). <P> Als we data over GFS delen met gedeelde opslag (SAN of Multichannel SCSI) dan is de doos voor opslag hier de Achilleshiel en bovendien is het heel duur om een dergelijk systeem op te zetten. <P> We kunnen NBD (<EM>Network Block Devices</EM>) gebruiken om via het netwerk data te kopiëren, maar ik ben niet gecharmeerd van een dergelijke oplossing. NBD's hebben hun beperkingen, zijn moeilijk te implementeren en onderhouden en gewoon te veel moeite als je alleen maar wat webserver data over verschillende webservers wil kopiëren. <A NAME="199lfindex1"> </A> <H2>Hou 't simpel</H2> Ok, laten we het kopiëren eens proberen: <BR> <STRONG>Hier is een scenario</STRONG> <BR> Je hebt 2 webservers, één server om het werk te doen en één als reserve. <BR> Je brengt alle veranderingen aan op de server en voert deze door op de reserve via een <KBD>rsync</KBD>. <BR> Simpel? <BR> Maar hoe dit nu te automatiseren? Je gebruikers zullen meerdere malen per dag met FTP data veranderen. Wat gebeurt er nu als de server plat gaat en de reserve neemt het werk over? <BR> Ik heb hier een eenvoudig antwoordt op. Ze zullen hun veranderingen niet zien en daar behoorlijk geïrriteerd over zijn :) <BR> Je kunt natuurlijk iedere 5 seconden vanuit <KBD>cron</KBD> een <KBD>$ rsync -av --delete source destination</KBD> draaien maar dan zul je de machine niet bepaald voor nog iets anders kunnen gebruiken, niet? <P> <STRONG>Hier nog een ander scenario</STRONG> <BR> Je hebt één FTP server voor het deponeren van data en zes webservers die om de beurt de rest van het verkeer afhandelen. <BR> De data op iedere machine moet dan hetzelfde zijn. Je kunt hier voor een korte tijd met NFS wegkomen als je geluk hebt, maar dat zal niet lang duren. <P> Dus, wat moeten we doen? <BR> Ik denk dat het antwoord als volgt is: "Kopieer alleen die data naar de webservers die veranderd is". En data die niet veranderd is kopieer je niet. <P> Dat zullen we nu precies gaan doen met "FAM". <A NAME="199lfindex2"> </A> <H2>Hou 't slim</H2> Hoe weten we nu dat data veranderd is? <BR> Hier een antwoord wat ik verwacht van een Windows ontwikkelaar. <BR> <STRONG>We doorzoeken de betreffende directory iedere paar seconden en onderzoeken de datum en grootte van de bestanden op veranderingen in vergelijking met onze <EM>cache</EM></STRONG>. <BR> Jaja <P> <STRONG>Polling</STRONG>: het regelmatig vergelijken van datum en grootte van bestanden met oudere versies is een dure oplossing. Stel je maar eens voor dat je webserver iedere 5 seconden het commando "<KBD>ls -lR/eendirectory</KBD>" uitvoert :) <P> De elegante oplossing zou zijn dat het bestand ons vertelt wanneer het is veranderd, zodat we daarop actie kunnen ondernemen. Dat is nou precies wat "IMON" voor ons doet. <A NAME="199lfindex3"> </A> <H2>Wat is FAM?</H2> Link: <a href="http://oss.sgi.com/projects/fam/faq.html">http://oss.sgi.com/projects/fam/faq.html</a> <BR> FAM, of File Attention Monitor, heeft een koppeling die door toepassingen kunnen worden gebruikt om een seintje te krijgen wanneer bepaalde bestanden of directories zijn veranderd. <BR> FAM bestaat uit 2 delen: <STRONG>fam</STRONG>, de daemon die een verzoek afhandelt en het seintje geeft, en <STRONG>libfam</STRONG>, de koppeling die toepassingen kunnen gebruiken voor het communiceren met FAM. <BR> Als de te controleren bestanden op een andere machine staan, dan zal de lokale <KBD>fam</KBD> contact opnemen met die op de andere machine en alle verzoeken daar naartoe doorspelen. <BR> <KBD>fam</KBD> kan clients ook een seintje geven wanneer een bestand wordt uitgevoerd en wanneer het stopt met uitvoeren (De IRIX Interactive Desktop gebruikt dit bijvoorbeeld om het icoon van een programma te veranderen als dit wordt uitgevoerd). <BR> <KBD>fam</KBD> is van origine voor IRIX in 1989 geschreven door Bruce Karsh en is herschreven in 1995 door Bob Miller. Deze <EM>open source</EM> versie van <KBD>fam</KBD> is geschikt voor zowel Linux als IRIX en is dezelfde als die in IRIX 6.5.8. <A NAME="199lfindex4"> </A> <H2>Wat is IMON?</H2> Link: <a href="http://oss.sgi.com/projects/fam/faq.html">http://oss.sgi.com/projects/fam/faq.html</a> <BR> <KBD>imon</KBD>, de Inode Monitor, is het stuk van de kernel wat <KBD>fam</KBD> vertelt wanneer een bestand veranderd is. Wanneer toepassingen aan <KBD>fam</KBD> meedelen in welke bestanden en directories ze geïnteresseerd zijn, dan zal <KBD>fam</KBD> deze informatie doorspelen aan <KBD>imon</KBD>. Wanneer deze bestanden en directories worden veranderd dan zal de kernel <KBD>imon</KBD> hiervan op de hoogte stellen. Op zijn beurt speelt <KBD>imon</KBD> deze informatie door aan <KBD>fam</KBD>, die het op zijn beurt zal distribueren naar alle toepassingen die hiervoor interesse hebben getoond. <BR> <KBD>imon</KBD> is van origine in 1989 voor Irix geschreven door Wiltse Carpenter. Overzetten op Linux is gedaan door Roger Chickering. De Linux implementatie van de kernel veranderingen wijkt niet veel af van de implementatie op IRIX, maar het haakt op een andere manier aan in de kernel bestandscode. <A NAME="199lfindex5"> </A> <H2>Het installeren van FAM en IMON</H2> Beide programma's zijn beschikbaar op de website van SGI. Zie de referenties aan het eind van dit artikel. <BR> IMON is een patch op de kernel. Hiermee krijg je de mogelijkheid in de kernel om veranderingen op <EM>inodes</EM> in de gaten te houden. <BR> Doe een <KBD>cd</KBD> naar de directory van je kernel boncode en installeer de patch: <PRE> $ cd /usr/src/linux $ patch -p < patchbestand </PRE> <P> Voer nu <KBD>$ make config</KBD> of <KBD> $ make menuconfig</KBD> uit en kies de volgende optie: <STRONG>inode Monitor (imon) support (EXPERIMENTAL)</STRONG> in het <SAMP>Filesystems</SAMP>-gedeelte. <BR> Compileer de kernel opnieuw en herstart (sorry) de machine. <BR> Het compileren van FAM is eenvoudig. Doe een <KBD>cd</KBD> naar de broncode en geef het commando <KBD>$ ./configure && make all install</KBD>. Ziedaar, alles geïnstalleerd. <P> Vervolgens installeren we een Perl-module met de naam <SAMP>SGI::FAM</SAMP>, zodat we het geheel in Perl kunnen schrijven. <A NAME="199lfindex6"> </A> <H2>Het installeren van de SGI::PAM module</H2> Je dacht toch niet dat ik je ging vragen het in C/C++ te doen, wel? <BR> Ik weet niet hoe jij er over denkt maar persoonlijk ben ik te lui en ongeduldig, dus schrijf ik mijn spiegel-programma met Perl. <P> Haal SGI::FAM (door <a href="mailto::jglick@sig.bsh.com">Jesse N. Glick</a>) van het net en installeer het. Voer de CPAN module uit om dit te installeren, als volgt: <PRE> $ perl -MCPAN -e shell $ install SGI::FAM </PRE> Hiermee zou SGI::FAM en verdere relevante modules geïnstalleerd moeten zijn. <A NAME="199lfindex7"> </A> <H2>Kopiëren met fam_mirror</H2> <STRONG>fam_mirror</STRONG> is het script wat ik heb gemaakt voor het automatisch kopiëren van gewijzigde bestanden. Je kunt het hier <a href="../../common/src/article199/fam_mirror.html">bekijken</a> of hier <a href="../../common/src/article199/fam_mirror">ophalen</a>. <BR> Je kunt dit vervolgens wijzigen door <KBD>$replicaHosts</KBD> aan te passen op jouw configuratie en mogelijk <KBD>$rsh</KBD> te wijzigen in wat voor commando je dan ook gebruikt om iets op een andere machine uit te voeren. Idem voor <KBD>rsync</KBD>. <P> En nu terug naar <STRONG>scenario 1</STRONG> <BR> 2 machines als webservers (web1 en web2). Eén als primaire server (web1) en de andere als reserve (web2). Primaire FTP-server is web1. web2 doet niet aan FTP (anders gaan gebruikers ook bestanden schrijven terwijl het systeem op z'n reserve draait). <P> Het startdocument op het web is voor beide machines <STRONG>/var/www</STRONG>. <BR> Configureer <KBD>rsh</KBD> of <KBD>ssh</KBD> op beide machines. web2 moet toestemming verlenen aan web1 om van afstand commando's te kunnen geven zonder dat er een wachtwoord nodig is. Meestal doe ik dat door mijn <SAMP>ssh_key</SAMP> toe te voegen aan de <SAMP>authorized_keys</SAMP> van <SAMP>replicaHosts</SAMP>. <BR> Doe een <KBD>rsync</KBD> van alle data van web1 naar web2: <PRE> $ rsync -avz /var/www web2:/var/www </PRE> Verander <SAMP>fam_mirror</SAMP> door <CODE>@replicaHosts</CODE> te vervangen door <STRONG><CODE>@replicaHosts=qw(web2);</CODE></STRONG>. <BR> Start <STRONG>fam_mirror</STRONG> op web1: <PRE> $ fam_mirror /var/www & </PRE> en wijzig vervolgens bestanden op web1. Deze veranderingen zullen ook door worden gevoerd op web2. <P> En nu dan <STRONG>scenario 2</STRONG> (een aantal webservers). <BR> We hebben machines "linuxweb1", "linuxweb2", "linuxweb3" en "linuxweb4" als webservers. Machine "linuxftp1" is de ftp server (primaire bestandsserver). De webmachines staan geen ftp toe aan gebruikers. <BR> Installeer <SAMP>fam, imon, SGI::FAM</SAMP> en <SAMP>fam_mirror</SAMP> op de "linuxftp1" machine. Configureer vervolgens <KBD>rsh</KBD> of <KBD>ssh</KBD> voor alle machines. <BR> linuxweb[1-4] moeten daarbij linuxftp1 toestemming verlenen om commando's op hun machines uit te voeren zonder het ingeven van een wachtwoord. <BR> Wijzig <SAMP>fam_mirror</SAMP> en laat <CODE>@replicaHosts</CODE> verwijzen naar: <STRONG><CODE>@replicaHosts=qw(linuxweb1 linuxweb2 linuxweb3 linuxweb4);</CODE></STRONG>. <BR> Wijzig <SAMP>$rsh</SAMP> en <CODE>$rsync</CODE> indien nodig. Aannemende dat het startdocument wederom in <SAMP>/var/www</SAMP> is te vinden op alle machines, geef het volgende commando op linuxftp1: <PRE> $ INIT_MIRROR=1 fam_mirror /var/www & </PRE> <P> Alle veranderingen op linuxftp1 zouden nu te zien moeten zijn op linuxweb[1-4]. <A NAME="199lfindex8"> </A> <H2>Referenties</H2> <ul> <li><a href="http://oss.sgi.com/projects/fam">SGI's fam site</a> <li><a href="http://search.cpan.org/search?dist=SGI-FAM">SGI::FAM Perl Module</a> <li><a href="http://www.nas.nasa.gov/Groups/WWW/subpages/topology.html">Realtime Data Mirroring (WEBD and SLIM) for IRIX</a> <li><a href="../../common/src/article199/fam_mirror">fam_mirror</a> </ul> <A NAME="199lfindex9"> </A> <H2>Bekende problemen</H2> Ik heb gemerkt dat de oplossing, hier gegeven, een probleempje heeft: het werkt niet voor grote directories (directories met 4 of 5 duizend sub directories). De kernel gaat klagen over <SAMP>kmalloc</SAMP> en zo. <BR> Ik werk aan een oplossing. Zodra ik die heb zal ik hem verwerken in het artikel. Laat het me even weten wanneer je al een oplossing hebt. <!-- vim: set sw=2 ts=2 et: --> <!-- 2pdaIgnoreStart --> <A NAME="talkback"> </a> <h2>Talkback voor dit artikel</h2> Elk artikel heeft zijn eigen talkback pagina. Daar kan je commentaar geven of commentaar van anderen lezen: <center> <table border="0" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <table border="3" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=199&lang=en"><b> talkback pagina </b></a> </td></tr></table> </td></tr></table> </center> <HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="98%"> <TR><TD ALIGN=CENTER BGCOLOR="#9999AA" WIDTH="50%"> <A HREF="../../common/lfteam.html">Site onderhouden door het LinuxFocus editors team</A> <BR><FONT COLOR="#FFFFFF">© Atif Ghaffar, <a href="../../common/copy.html">FDL</a> <BR><a href="http://www.linuxfocus.org">LinuxFocus.org</a></FONT> <BR><a href="http://cgi.linuxfocus.org/cgi-bin/lfcomment?lang=nl&article=article199.shtml" target="_TOP">Klik hier om een fout te melden of commentaar te geven</A><BR></TD> <TD BGCOLOR="#9999AA"> <!-- TRANSLATION INFO --> <font size=2>Vertaling info:</font> <TABLE> <tr><td><font size="2">en --> -- : Atif Ghaffar <small><atif(at)developer.ch></small></font></td></tr> <tr><td><font size="2">en --> nl: Tom Uijldert <tom.uijldert(at)cmgplc.com></font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2002-06-08, generated by lfparser version 2.28</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>