diff options
Diffstat (limited to 'documentation/boxbackup/instguide.xml')
-rw-r--r-- | documentation/boxbackup/instguide.xml | 766 |
1 files changed, 0 insertions, 766 deletions
diff --git a/documentation/boxbackup/instguide.xml b/documentation/boxbackup/instguide.xml deleted file mode 100644 index c857da0d..00000000 --- a/documentation/boxbackup/instguide.xml +++ /dev/null @@ -1,766 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" -"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"> -<book> - <title>Box Backup Build and Installation Guide</title> - - <preface> - <title>License</title> - - <para>Copyright © 2003 - 2007, Ben Summers and contributors. - All rights reserved.</para> - - <para>Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met:</para> - - <itemizedlist> - <listitem> - <para>Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer.</para> - </listitem> - - <listitem> - <para>Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution.</para> - </listitem> - - <listitem> - <para>All use of this software and associated advertising materials - must display the following acknowledgement: This product includes - software developed by Ben Summers.</para> - </listitem> - - <listitem> - <para>The names of the Authors may not be used to endorse or promote - products derived from this software without specific prior written - permission.</para> - </listitem> - </itemizedlist> - - - <para>[Where legally impermissible the Authors do not disclaim liability - for direct physical injury or death caused solely by defects in the - software unless it is modified by a third party.]</para> - - <para>THIS SOFTWARE IS PROVIDED BY THE AUTHORS "AS IS" AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE.</para> - </preface> - - <chapter> - <title>Introduction</title> - - <para>The backup daemon, bbackupd, runs on all machines to be backed up. - The store server daemon, bbstored runs on a central server. Data is sent - to the store server, which stores all data on local filesystems, that is, - only on local hard drives. Tape or other archive media is not used.</para> - - <para>The system is designed to be easy to set up and run, and cheap to - use. Once set up, there should be no need for user or administrative - intervention, apart from usual system maintenance.</para> - - <section> - <title>Client daemon</title> - - <para>bbackupd is configured with a list of directories to back up. It - has a lazy approach to backing up data. Every so often, the directories - are scanned, and new data is uploaded to the server. This new data must - be over a set age before it is uploaded. This prevents rapid revisions - of a file resulting in many uploads of the same file in a short period - of time.</para> - - <para>It can also operate in a snapshot mode, which behaves like - traditional backup software. When instructed by an external bbackupctl - program, it will upload all changed files to the server.</para> - - <para>The daemon is always running, although sleeping most of the time. - In lazy mode, it is completely self contained -- scripts running under - cron jobs are not used. The objective is to keep files backed up, not to - make snapshots of the filesystem at particular points in time - available.</para> - - <para>If an old version of the file is present on the server, a modified - version of the rsync algorithm is used to upload only the changed - portions of the file.</para> - - <para>After a new version is uploaded, the old version is still - available (subject to disc space on the server). Similarly, a deleted - file is still available. The only limit to their availability is space - allocated to this account on the server</para> - - <para>Future versions will add the ability to mark the current state of - files on the server, and restore from this mark. This will emulate the - changing of tapes in a tape backup system.</para> - - <section> - <title>Restoration</title> - - <para>Restoring files is performed using a query tool, bbackupquery. - This can be used to restore entire directories, or as an 'FTP-like' - tool to list and retrieve individual files. Old versions and deleted - files can be retrieved using this tool for as long as they are kept on - the server.</para> - </section> - - <section> - <title>Client Resource Usage</title> - - <para>bbackupd uses only a minimal amount of disc space to store - records on uploaded files -- less than 32 bytes per directory and file - over a set size threshold. However, it minimises the amount of queries - it must make to the server by storing, in memory, a data structure - which allows it to determine what data is new. It does not need to - store a record of all files, essentially just the directory names and - last modification times. This is not a huge amount of memory.</para> - - <para>If there are no changes to the directories, then the client will - not even connect to the server.</para> - </section> - </section> - - <section> - <title>Security</title> - - <para>Box Backup is designed to be secure in several ways. The data - stored on the backup store server is encrypted using secret-key - cryptography. Additionally, the transport layer is encrypted using TLS, - to ensure that the communications can't be snooped.</para> - - <section> - <title>Encryption</title> - - <para>The files, directories, filenames and file attributes are all - encrypted. By examining the stored files on the server, it is only - possible to determine the approximate sizes of a files and the tree - structure of the disc (not names, just number of files and - subdirectories in a directory). By monitoring the actions performed by - a client, it is possible to determine the frequency and approximate - scope of changes to files and directories.</para> - - <para>The connections between the server and client are encrypted - using TLS (latest version of SSL). Traffic analysis is possible to - some degree, but limited in usefulness.</para> - - <para>An attacker will not be able to recover the backed up data - without the encryption keys. Of course, you won't be able to recover - your files without the keys either, so you must make a conventional, - secure, backup of these keys.</para> - </section> - - <section> - <title>Authentication</title> - - <para>SSL certificates are used to authenticate clients. UNIX user - accounts are not used to minimise the dependence on the configuration - of the operating system hosting the server.</para> - - <para>A script is provided to run the necessary certification - authority with minimal effort.</para> - </section> - </section> - - <section> - <title>Server daemon</title> - - <para>The server daemon is designed to be simple to deploy, and run on - the cheapest hardware possible. To avoid the necessity to use expensive - hardware RAID or software RAID with complex setup, it (optionally) - stores files using RAID techniques.</para> - - <para>It does not need to run as a privileged user.</para> - - <para>Each account has a set amount of disc space allocated, with a soft - and a hard limit. If the account exceeds the soft limit, a housekeeping - process will start deleting old versions and deleted files to reduce the - space used to below the soft limit. If the backup client attempts to - upload a file which causes the store to exceed the hard limit, the - upload will be refused.</para> - </section> - </chapter> - - <chapter> - <title>Building and installing</title> - - <section> - <title>Before you start</title> - - <para>Firstly, check that all the clocks on your clients, servers and - signing machines are accurate and in sync. A disagreement in time - between a client and a server is the biggest cause of installation - difficulties, as the times in the generated certificates will cause - login failures if the start date is in the future.</para> - </section> - - <section> - <title>Box Backup compile</title> - - <para>In the following instructions, replace 0.00 with the actual - version number of the archive you have downloaded.</para> - - <para>For help building on Windows, see the <link linkend="AppB">Windows - Compile Appendix</link>. And if you want to build a Linux RPM, <link - linkend="AppC">look here</link>.</para> - - <para>You need the latest version of OpenSSL, as some of the extra APIs - it provides are required. You should have this anyway, as earlier - versions have security flaws. (If you have an earlier version installed, - the configuration script will give you instructions on enabling - experimental support for older versions.)</para> - - <para>See <link linkend="AppA">OpenSSL notes</link> for more information - on OpenSSL issues.</para> - - <para>There are some notes in the archive about compiling on various - platforms within the boxbackup-0.00 directory -- read them first. For - example, if you are compiling under Linux, look for LINUX.txt as - boxbackup-0.00/LINUX.txt after untaring the archive.</para> - - <para>Download the archive, then in that directory type</para> - - <programlisting>tar xvzf boxbackup-0.00.tgz -cd boxbackup-0.00 -./configure -make</programlisting> - - <para>The server and client will be built and packaged up for - installation on this machine, or ready to be transferred as tar files to - another machine for installation.</para> - - <para>This builds two parcels of binaries and scripts, 'backup-client' - and 'backup-server'. The generated installation scripts assumes you want - everything installed in <emphasis - role="bold">/usr/local/bin</emphasis></para> - - <para>Optionally, type <emphasis role="bold">make test</emphasis> to run - all the tests.</para> - </section> - - <section> - <title>Local installation</title> - - <para>Type <emphasis role="bold">make install-backup-client</emphasis> - to install the backup client.</para> - - <para>Type <emphasis role="bold">make install-backup-server</emphasis> - to install the backup server.</para> - </section> - - <section> - <title>Remote installation</title> - - <para>In the parcels directory, there are tar files for each parcel. The - name reflects the version and platform you have built it for.</para> - - <para>Transfer this tar file to the remote server, and unpack it, then - run the install script. For example:</para> - - <programlisting>tar xvzf boxbackup-0.00-backup-server-OpenBSD.tgz -cd boxbackup-0.00-backup-server-OpenBSD -./install-backup-server</programlisting> - </section> - - <section> - <title>Configure options</title> - - <para>You can use arguments to the configure script to adjust the - compile and link lines in the generated Makefiles, should this be - necessary for your platform. The configure script takes the usual GNU - autoconf arguments, a full list of which can be obtained with <emphasis - role="bold">--help</emphasis>. Additional options for Box Backup - include:</para> - - <informaltable> - <tgroup cols="2"> - <tbody> - <row> - <entry char="-">--enable-gnu-readline</entry> - - <entry>Use GNU readline if present. Linking Box Backup against - GNU readline may create licence implications if you then - distribute the binaries. libeditline is also supported as a safe - alternative, and is used by default if available.</entry> - </row> - - <row> - <entry>--disable-largefile</entry> - - <entry>Omit support for large files</entry> - </row> - - <row> - <entry>--with-bdb-lib=DIR</entry> - - <entry>Specify Berkeley DB library location</entry> - </row> - - <row> - <entry>--with-bdb-headers=DIR</entry> - - <entry>Specify Berkeley DB headers location</entry> - </row> - - <row> - <entry>--with-random=FILE</entry> - - <entry>Use FILE as random number seed (normally - auto-detected)</entry> - </row> - - <row> - <entry>--with-tmp-dir=DIR</entry> - - <entry>Directory for temporary files (normally /tmp)</entry> - </row> - </tbody> - </tgroup> - </informaltable> - - <para>See <link linkend="AppA">OpenSSL notes</link> for the OpenSSL - specific options.</para> - </section> - - <section> - <title>Tests</title> - - <para>There are a number of unit tests provided. To compile and run one - type:</para> - - <programlisting>./runtest.pl bbackupd release -./runtest.pl common debug -./runtest.pl ALL</programlisting> - - <para>The runtest.pl script will compile and run the test. The first - argument is the test name, and the second the type of build. Use ALL as - a test name to run all the tests.</para> - - <para>The output from the tests is slightly muddled using this script. - If you're developing, porting or trying out new things, it might be - better to use the following scheme:</para> - - <programlisting>cd test/bbackupd -make -cd ../../debug/test/bbackupd -./t</programlisting> - - <para>or in release mode...</para> - - <programlisting>cd test/bbackupd -make -D RELEASE -cd ../../release/test/bbackupd -./t</programlisting> - - <para>(use RELEASE=1 with GNU make)</para> - - <para>I tend to use two windows, one for compilation, and one for - running tests.</para> - </section> - </chapter> - - <appendix> - <title id="AppA">Box Backup and SSL</title> - - <section> - <title>General notes</title> - - <para>Ideally, you need to use version 0.9.7 or later of OpenSSL. If - this is installed on your system by default (and it is on most recent - releases of UNIX like OSes) then everything should just work.</para> - - <para>However, if it isn't, you have a few options.</para> - - <section> - <title>Upgrade your installation</title> - - <para>The best option is to upgrade your installation to use 0.9.7. - Hopefully your package manager will make this easy for you. This may - require reinstallation of lots of software which depends on OpenSSL, - so may not be ideal.</para> - - <para>(But as there have been a few security flaws in OpenSSL - recently, you probably want to upgrade it anyway.)</para> - </section> - - <section> - <title>Install another OpenSSL</title> - - <para>The second best option is to install another copy. If you - download and install from source, it will probably install into - /usr/local/ssl. You can then configure Box Backup to use it - using:</para> - - <programlisting>./configure --with-ssl-headers=/usr/local/ssl/include --with-ssl-lib=/usr/local/ssl/lib</programlisting> - - <para>which will set up the various includes and libraries for - you.</para> - - <para>The configuration scripts may be a problem, depending on your - installation. See below for more information.</para> - </section> - - <section> - <title>Use the old version of OpenSSL</title> - - <para>If you have an old version installed, the configuration script - will give you instructions on how to enable support for older - versions. Read the warnings, and please, whatever you do, don't - release binary packages or ports which enable this option.</para> - - <para>You may have issues with the configuration scripts, see - below.</para> - </section> - </section> - - <section> - <title>If you have problems with the config scripts</title> - - <para>If you get OpenSSL related errors with the configuration scripts, - there are two things to check:</para> - - <itemizedlist> - <listitem> - <para>The bin directory within your OpenSSL directory is in the path - (if you have installed another version)</para> - </listitem> - - <listitem> - <para>You have an openssl.cnf file which works and can be - found.</para> - </listitem> - </itemizedlist> - - <section> - <title>OpenSSL config file</title> - - <para>You need to have an openssl.cnf file. The default will generally - work well (see example at end). Make sure the openssl utility can find - it, either set the OPENSSL_CONF environment variable, or install it - into the location that is mentioned in the error messages.</para> - - <para>Example OpenSSL config file:</para> - - <programlisting id="openssl.cnf" xreflabel="openssl.cnf"># -# OpenSSL example configuration file. -# This is mostly being used for generation of certificate requests. -# - -RANDFILE = /dev/arandom - -#################################################################### -[ req ] -default_bits = 1024 -default_keyfile = privkey.pem -distinguished_name = req_distinguished_name -attributes = req_attributes - -[ req_distinguished_name ] -countryName = Country Name (2 letter code) -#countryName_default = AU -countryName_min = 2 -countryName_max = 2 - -stateOrProvinceName = State or Province Name (full name) -#stateOrProvinceName_default = Some-State - -localityName = Locality Name (eg, city) - -0.organizationName = Organization Name (eg, company) -#0.organizationName_default = Internet Widgits Pty Ltd - -# we can do this but it is not needed normally :-) -#1.organizationName = Second Organization Name (eg, company) -#1.organizationName_default = CryptSoft Pty Ltd - -organizationalUnitName = Organizational Unit Name (eg, section) -#organizationalUnitName_default = - -commonName = Common Name (eg, fully qualified host name) -commonName_max = 64 - -emailAddress = Email Address -emailAddress_max = 64 - -[ req_attributes ] -challengePassword = A challenge password -challengePassword_min = 4 -challengePassword_max = 20 - -unstructuredName = An optional company name - -[ x509v3_extensions ] - -nsCaRevocationUrl = http://www.cryptsoft.com/ca-crl.pem -nsComment = "This is a comment" - -# under ASN.1, the 0 bit would be encoded as 80 -nsCertType = 0x40</programlisting> - </section> - </section> - </appendix> - - <appendix> - <title id="AppB">Compiling bbackupd on Windows using Visual C++</title> - - <para>This Appendix explains how to build the bbackupd daemon for Windows - using the Visual C++ compiler.</para> - - <para>If you have any problems following these instructions, please sign - up to the <ulink - url="http://lists.warhead.org.uk/mailman/listinfo/boxbackup">mailing - lis</ulink>t and report them to us, or send an email to <ulink - url="mailto:bbwiki@qwirx.com">Chris Wilson</ulink>. Thanks!</para> - - <para><emphasis role="bold">Note</emphasis>: bbstored will not be built - with this process. bbstored is not currently supported on Windows. There - are no plans for bbstored support on Windows.</para> - - <section> - <title>Tools</title> - - <para>You will need quite a bit of software to make this work. All of it - is available for free on the Internet, although Visual C++ Express has - license restrictions and a time limit.</para> - - <section> - <title>Visual C++</title> - - <para>Microsoft's Visual C++ compiler and development environment are - part of their commercial product <ulink - url="http://msdn.microsoft.com/vstudio/">Visual Studio</ulink>. Visual - Studio 2005 is supported, and 2003 should work as well.</para> - - <para>You can also <ulink - url="http://msdn.microsoft.com/vstudio/express/visualc/download/">download</ulink> - a free copy of Visual C++ 2005 Express. This copy must be registered - (activated) within 30 days, and is free for one year.</para> - - <para>You will need the <ulink - url="http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/">Platform - SDK</ulink> to allow you to compile Windows applications.</para> - </section> - - <section> - <title>Perl</title> - - <para>Download and install <ulink - url="http://www.activestate.com/Products/ActivePerl/">ActivePerl for - Windows</ulink>, which you can probably find <ulink - url="http://downloads.activestate.com/ActivePerl/Windows/5.6/ActivePerl-5.6.1.638-MSWin32-x86.msi">here</ulink>.</para> - </section> - - <section> - <title>Libraries</title> - - <para>You will need to download and install several libraries. They - must all be built in the same directory, to be able to link - properly.</para> - - <para>Choose a directory where you will unpack and compile OpenSSL, - Zlib and Box Backup. We will call this the base directory. An example - might be:</para> - - <programlisting>C:\Documents and Settings\Your Username\Desktop\Box</programlisting> - - <para>Make sure you know the full path to this directory.</para> - - <section> - <title>OpenSSL</title> - - <para>You will need to compile OpenSSL using Visual C++. The latest - release at this time, OpenSSL 0.9.8a, does not compile with Visual - C++ 2005 out of the box, so you need <ulink - url="http://bbdev.fluffy.co.uk/svn/box/chris/win32/support/openssl-0.9.8a-vc2005.zip">a - patched version</ulink>. The <ulink - url="http://www.openssl.org/source/openssl-0.9.8a.tar.gz">original - source</ulink> and <ulink - url="http://bbdev.fluffy.co.uk/svn/box/chris/win32/support/openssl-0.9.8a-win32fix.patch">patch</ulink> - are also available.</para> - - <para>To compile OpenSSL:</para> - - <itemizedlist> - <listitem> - <para>Use a Windows unzipper such as <ulink - url="http://www.winzip.com/">WinZip (free trial)</ulink> to - extract the <emphasis - role="bold">openssl-0.9.8a-vc2005.tar.gz</emphasis> archive, - which you just downloaded, into the base directory.</para> - </listitem> - - <listitem> - <para>Rename the folder from <emphasis - role="bold">openssl-0.9.8a-vc2005</emphasis> to <emphasis - role="bold">openssl</emphasis></para> - </listitem> - - <listitem> - <para>Open a command shell (run <emphasis - role="bold">cmd.exe</emphasis>) and <emphasis - role="bold">cd</emphasis> to the openssl directory</para> - </listitem> - - <listitem> - <para>Run the following commands:</para> - - <programlisting>perl Configure VC-WIN32 -ms\do_ms -"c:\program files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat" -nmake -f ms\ntdll.mak</programlisting> - </listitem> - </itemizedlist> - </section> - - <section> - <title>Zlib</title> - - <para>You will need to download the <ulink - url="http://www.zlib.net/zlib123-dll.zip">Zlib compiled DLL</ulink>. - Create a directory called <emphasis role="bold">zlib</emphasis> in - the base directory, and unzip the file you just downloaded into that - directory. You don't need to compile anything.</para> - </section> - </section> - - <section> - <title>Download Box Backup</title> - - <para>The first version of Box Backup that's known to compile and with - Visual C++ 2005 is available on the <ulink - url="http://bbdev.fluffy.co.uk/svn/box/chris/win32/vc2005-compile-fixes/">Subversion - server</ulink>. However, this version has not been extensively tested - and may be out of date.</para> - - <para>The changes are expected to be merged into the <ulink - url="http://bbdev.fluffy.co.uk/svn/box/trunk">Subversion trunk</ulink> - at some point, and this page should then be updated. If in doubt, - please sign up to the <ulink - url="http://lists.warhead.org.uk/mailman/listinfo/boxbackup">mailing - list</ulink> and ask us.</para> - - <para>To get the source code out of Subversion you will need a <ulink - url="http://subversion.tigris.org/files/documents/15/25364/svn-1.2.3-setup.exe">Subversion - client for Windows</ulink>. After installing it, open a new command - prompt, go to the base directory, and type:</para> - - <programlisting>svn co http://bbdev.fluffy.co.uk/svn/box/chris/win32/vc2005-compile-fixes/ boxbackup</programlisting> - - <para>This should create a directory called <emphasis - role="bold">boxbackup</emphasis> inside the base directory.</para> - </section> - - <section> - <title>Configure Box Backup</title> - - <para>Open a command prompt, change to the base directory then - <emphasis role="bold">boxbackup</emphasis>, and run <emphasis - role="bold">win32.bat</emphasis> to configure the sources. Otherwise, - Visual C++ will complain about missing files whose names start with - <emphasis role="bold">autogen</emphasis>, and missing <emphasis - role="bold">config.h</emphasis>.</para> - </section> - - <section> - <title>Compile Box Backup</title> - - <para>Open Visual C++. Choose "File/Open/Project", navigate to the - base directory, then to <emphasis - role="bold">boxbackup\infrastructure\msvc\2005</emphasis> (or - <emphasis role="bold">2003</emphasis> if using Visual Studio 2003), - and open any project or solution file in that directory.</para> - - <para>Press F7 to compile Box Backup. If the compilation is - successful, <emphasis - role="bold">boxbackup\Debug\bbackupd.exe</emphasis> will be - created.</para> - </section> - - <section> - <title>Install Box Backup</title> - - <para>Create the destination directory, <emphasis - role="bold">C:\Program Files\Box Backup\bbackupd</emphasis>.</para> - - <para>Write a configuration file, keys and certificate on a Unix - machine, and copy them into the <emphasis role="bold">Box - Backup</emphasis> directory, together with the following files from - the base directory:</para> - - <itemizedlist> - <listitem> - <para>boxbackup\Debug\bbackupd.exe</para> - </listitem> - - <listitem> - <para>openssl\out32dll\libeay32.dll</para> - </listitem> - - <listitem> - <para>openssl\out32dll\ssleay32.dll</para> - </listitem> - - <listitem> - <para>zlib\zlib1.dll</para> - </listitem> - </itemizedlist> - - <para>Ensure that the user running Box Backup can read from the - <emphasis role="bold">Box Backup</emphasis> directory, and write to - the <emphasis role="bold">bbackupd</emphasis> directory inside - it.</para> - - <para>Run Box Backup by double-clicking on it, and check that it - connects to the server. If the window opens and closes immediately, - it's probably due to a problem with the configuration file - check the - Windows Event Viewer for details.</para> - </section> - - <section> - <title>Windows Service</title> - - <para>Box Backup can also run as a Windows service, in which case it - will be automatically started at boot time in the background. To - install this, open a command prompt, and run:</para> - - <programlisting>cd "C:\Program Files\Box Backup" -bbackupd.exe -i</programlisting> - - <para>This should output Box Backup service installed.</para> - </section> - </section> - </appendix> - - <appendix> - <title id="AppC">Compilation and installation by building an RPM on - Linux</title> - - <para>It is very easy to build an RPM of Box Backup on Linux platforms. - This should work on all Red Hat distributions (including Fedora), SuSE, - and probably others too.</para> - - <para>Given that you have the correct development packages installed - simply execute this command (replacing the version number):</para> - - <programlisting>rpmbuild -ta boxbackup-0.00.tgz</programlisting> - - <para>rpmbuild will report where the packages have been written to, and - these can be installed in the normal manner.</para> - - <para>If you have never built an RPM before you should set up a convenient - build area as described in the <ulink - url="http://www.rpm.org/max-rpm/s1-rpm-anywhere-different-build-area.html">RPM - book</ulink>.</para> - - <para>If you wish to customise the package you can find the spec file in - the contrib/rpm directory.</para> - </appendix> -</book> |