Linux From Scratch HOWTO
 Gerard Beekmans

 Version 1.3, February 2000

 This document describes the process of creating your own Linux system
 from scratch from an already installed Linux distribution, using noth-
 ing but the source code of software that we need

 ______________________________________________________________________

 Table of Contents






















































 1. Introduction

    1.1 What's this all about?
    1.2 New versions
    1.3 Version history
    1.4 Current Projects
    1.5 TODO
    1.6 Mailinglists
       1.6.1 Subscribing
       1.6.2 Unsubscribing
    1.7 Contact info

 2. Software packages you need to download

    2.1 Mandatory software
    2.2 Optional software

 3. Preparing the new system

    3.1 How we are going to do things
    3.2 Creating a new partition
    3.3 Creating an ext2 file system on the new partition
    3.4 Adding an entry to LILO
    3.5 Creating directories
    3.6 Copying the /dev directory

 4. Installing Sysvinit

    4.1 Preparing Sysvinit
    4.2 Configuring Sysvinit
    4.3 Copying passwd & group files
    4.4 Installing a root shell
    4.5 Testing the system

 5. Installing a kernel

    5.1 Note on ftp.kernel.org
    5.2 Configuring the kernel
    5.3 Updating LILO
    5.4 Testing the system

 6. Installing the GNU C and C++ Libraries

    6.1 Preparing the system for the GNU C Library installation
       6.1.1 Installing Make
       6.1.2 Installing Sed
       6.1.3 Installing Shell Utils
       6.1.4 Installing File Utils
       6.1.5 Installing Util Linux
       6.1.6 Installing Text Utils
       6.1.7 Installing Tar
       6.1.8 Installing Gzip
       6.1.9 Installing Binutils
       6.1.10 Installing Grep
       6.1.11 Installing Bison
       6.1.12 Installing Mawk
       6.1.13 Installing Find Utils
       6.1.14 Installing Diff Utils
       6.1.15 Installing Ld.so
       6.1.16 Installing Perl
       6.1.17 Installing M4
       6.1.18 Installing Texinfo
       6.1.19 Installing Automake
       6.1.20 Installing Autoconf
    6.2 Installing the GNU C Library
    6.3 Installing the GNU C++ Library
       6.3.1 Installing the libstdc++2.9_2.91.66-0slink2.deb package
       6.3.2 Installing the libstdc++2.9-dev_2.91.66-0slink2.deb package

 7. Installing the GNU C and C++ compilers

    7.1 Making two small test programs
    7.2 Installing GCC 2.7.2.3
    7.3 Installing the g++_2.91.66-0slink2.deb package
    7.4 Creating necessary symlinks
    7.5 Testing the compilers

 8. Installing login utilities

    8.1 Installing agetty + login
    8.2 Modifying $LFS/etc/inittab
    8.3 Creating the UTMP record file
    8.4 Testing the system

 9. Installing Vim

    9.1 Preparing the system for the Vim installation
       9.1.1 Installing Ncurses
    9.2 Installing Vim

 10. Creating initial boot scripts

    10.1 Preparing the directories and master files
    10.2 Creating the reboot script
    10.3 Creating the halt script
    10.4 Creating the mountfs script
    10.5 Creating the umountfs script
    10.6 Creating the sendsignals script
    10.7 Set file permissions and create symlinks
    10.8 Creating the /etc/fstab file
    10.9 Testing the system

 11. Reinstalling statically linked software

    11.1 Reinstaling GCC-2.7.2.3
    11.2 Installing the Termcap library
    11.3 Installing the Readline library
    11.4 Reinstalling Bash
    11.5 Reinstalling Sysvinit
    11.6 Reinstalling Make
    11.7 Reinstalling Sed
    11.8 Reinstalling Shell Utils
    11.9 Reinstalling File Utils
    11.10 Reinstalling + Installing Util Linux
    11.11 Reinstalling Text Utils
    11.12 Reinstalling Tar
    11.13 Reinstalling Gzip
    11.14 Reinstalling Bison
    11.15 Installing Flex
    11.16 Reinstalling Binutils
    11.17 Reinstalling Grep
    11.18 Reinstalling Mawk
    11.19 Reinstalling Find Utils
    11.20 Reinstalling Diff Utils
    11.21 Installing Less
    11.22 Reinstalling Perl
    11.23 Reinstalling M4
    11.24 Reinstalling Texinfo

 12. Installing the rest of the basic system software

    12.1 Installing E2fsprogs
       12.1.1 Installing E2fsprogs
       12.1.2 Creating the checkroot bootscript
       12.1.3 Updating /etc/init.d/umountfs
       12.1.4 Creating proper permissions and creating symlink
    12.2 Installing File
    12.3 Installing Libtool
    12.4 Installing Modutils
    12.5 Installing Linux86
    12.6 Installing Lilo
       12.6.1 Installing Lilo
       12.6.2 Configuring Lilo
       12.6.3 Copying kernel image files
    12.7 Installing DPKG
    12.8 Installing Sysklogd
       12.8.1 Installing Sysklogd
       12.8.2 Configuring Sysklogd
       12.8.3 Creating the Sysklogd bootscript
       12.8.4 Setting up symlinks and permissions
    12.9 Installing Groff
    12.10 Installing Man-db
    12.11 Installing Procps
    12.12 Installing Procinfo
    12.13 Installing Procmisc
    12.14 Installing Shadow Password

 13. Setting up basic networking

    13.1 Installing Netkit-base
    13.2 Installing Net-tools
       13.2.1 Creating the /etc/init.d/localnet bootscript
       13.2.2 Setting up permissions and symlink
       13.2.3 Creating the /etc/hostname file
       13.2.4 Creating the /etc/hosts file
       13.2.5 Creating the /etc/init.d/ethnet file
       13.2.6 Setting up permissions and symlink for /etc/init.d/ethnet
       13.2.7 Testing the network setup

 14. Setting up Email sub system

    14.1 Preparing system for Email sub system
       14.1.1 Creating extra groups and user
       14.1.2 Creating directories
    14.2 Installing Procmail
    14.3 Installing Sendmail
       14.3.1 Installing Sendmail
       14.3.2 Configuring Sendmail
    14.4 Installing Mailx
    14.5 Creating /etc/init.d/sendmail bootscript
    14.6 Setting up permissions and symlinks
    14.7 Installing Mutt
    14.8 Installing Fetchmail
    14.9 Testing the Email sub system

 15. Installing Internet Servers

    15.1 Installing telnet daemon + client
    15.2 Installing Proftpd
    15.3 Installing Netkit-ftp
    15.4 Installing Apache
    15.5 Installing Slang Library
    15.6 Installing Zlib
    15.7 Installing Lynx
    15.8 Configuring the daemons
    15.9 Configuring telnetd
       15.9.1 Creating the /etc/inetd.conf configuration file
       15.9.2 Creating the /etc/init.d/inetd bootscript
       15.9.3 Setting up permissions and symlinks
    15.10 Configuring proftpd
       15.10.1 Creating necessary groups and users
       15.10.2 Creating the /etc/init.d/proftpd bootscript
       15.10.3 Setting up permissions and symlinks
    15.11 Configuring apache
       15.11.1 Editing apache configuration file
       15.11.2 Creating /etc/init.d/apache bootscript
       15.11.3 Setting up permissions and symlinks
    15.12 Testing the daemons

 16. Installing X Window System

    16.1 Installing X
    16.2 Creating /etc/ld.so.conf
    16.3 Modifying /etc/man_db.config
    16.4 Creating the /usr/include/X11 symlink
    16.5 Creating the /usr/X11 symlink
    16.6 Adding /usr/X11/bin to the $PATH environment variable
    16.7 Configuring X
    16.8 Testing X

 17. Installing Window Maker

    17.1 Preparing the system for the Window Maker installation
       17.1.1 Installing libPropList
       17.1.2 Installing libXpm
       17.1.3 Installing libpng
       17.1.4 Installing libtiff
       17.1.5 Installing libjpeg
       17.1.6 Installing libungif
       17.1.7 Installing WindowMaker
    17.2 Updating dynamic loader cache
    17.3 Configuring WindowMaker
    17.4 Testing WindowMaker

 18. Configuring system for Internet

    18.1 Configuring Kernel
    18.2 Creating groups and directories
    18.3 Installing PPP
    18.4 Creating /etc/resolv.conf
    18.5 Creating the connect and disconnect scripts
    18.6 Creating /etc/ppp/peers/provider
    18.7 Creating /etc/chatscripts/provider
    18.8 Note on password authentication
    18.9 Other resources

 19. Migrations from old to new setups

    19.1 Migrating from old C++ Library setup to the new setup
    19.2 Migrating from old compiler setup to the new setup

 20. Copyright & Licensing Information



 ______________________________________________________________________

 11..  IInnttrroodduuccttiioonn

 11..11..  WWhhaatt''ss tthhiiss aallll aabboouutt??

 I started this document around May 1999. I tried a few Linux
 distributions and came to the conclusion that there's wasn't a
 distribution I totally liked.  Every distribution has it's own
 advantages and disadvantages, but I was never satisfied with what I
 had (although Debian comes very close to what I want), so I decided to
 explore the possibility of building my own Linux distribution using
 nothing but source code of programs. As I found out there's quite a
 bit of work involved, but it's also a lot of fun and you really learn
 a lot by doing it, since you need to configure every single aspect of
 the system. This forces you to read a lot of manuals on how to
 configure various software. It also gives you total control over your
 system (well, that's the idea). You know exactly what software is
 installed, how it is configured and where all the configuration files
 reside.

 I started writing a series of articles for a Dutch/Belgium E-zine on
 this subject. Not soon after I got stuck getting a compiler to work. I
 decided to give this project a rest at that point, since a lot of
 things at that time needed my attention (I was about to move from The
 Netherlands to Canada to get married. There were a lot of things to
 arrange regarding the move abroad and a lot of immigration stuff to
 sort out).

 A few months after my arrival in Canada and getting married, I decided
 to continue my work on this project. Pretty much starting all over
 again from scratch and following a different approach, I got things to
 work out finally.  The end result is what you are reading right now.

 11..22..  NNeeww vveerrssiioonnss

 The latest version of the document can always be found at
 http://huizen.dds.nl/~glb/

 11..33..  VVeerrssiioonn hhiissttoorryy

 1.3 - February 11th, 2000


 +o  Two mailinglists are available. Read section 1.6 for more details

 +o  Changed the compiler setup. Gcc-2.95.2 no longer is being used. In
    stead gcc-2.7.2.3 is the new C compiler and egcs-2.91.60 is the C++
    compiler.

 +o  Updated sections that contained compile instructions by running
    make CC=/usr/gcc2723/bin/gcc.  A simple 'make' suffices now since
    gcc-2.7.2.3 is our default C compiler now.

 +o  Changed the 'abstract' line to be more accurate.

 +o  Fixed typos that were left behind in the previous versions

 +o  Moved section 1.4 (TODO) to section 1.5.

 +o  Section 2: Added the version numbers of the software that are known
    to work with this document.

 +o  Section 2: Mawk link was broken (thanks to David McCauley (and
    various other people) for informing me about this).

 +o  Section 2: Sysklogd link was broken (thanks to David McCauley for
    informing me about this).

 +o  Section 2: divided the list into mandatory and optional software
    (the separation is software for section 13 and above)

 +o  Inserted new section 1.4: Current projects.


 +o  Inserted new section 3.1: How we are going to do things. In this
    section I briefly explain that you need to already have Linux
    installed to use this HOWTO and also explained there is no need for
    any kind of boot disk.

 +o  Section 3.3: Clarified the currently used kernel image is to be
    used (thanks to Andrew Blais for pointing this out).

 +o  Section 3.4: Added the usr/share directory to the list of
    directories that need to be created.

 +o  Section 5: Clarified that the kernel source tree must be copied to
    the LFS partition

 +o  Section 6.1.2: Pointed out availability of fixed package in case
    compilation fails

 +o  Section 6.1.4: Rather than renaming ginstall to install we create a
    symlink install

 +o  Section 6.1.8: Pointed out availability of fixed package in case
    compilation fails

 +o  Section 6.1.10: Pointed out availability of fixed package in case
    compilation fails

 +o  Section 6.1.13: Pointed out availability of fixed package in case
    compilation fails

 +o  Section 6.1.14: Pointed out availability of fixed package in case
    compilation fails

 +o  Section 6.1.17: Pointed out availability of fixed package in case
    compilation fails

 +o  Section 6.1.18: Pointed out availability of fixed package in case
    compilation fails

 +o  Section 7.2: The gcc-2.7.2.3 compiler needs to be linked statically
    at first (to avoid possible Library conflicts between the normal
    and LFS system).

 +o  Inserted section 11.1: Reinstalling GCC 2.7.2.3

 +o  Section 11.13: Pointed out availability of fixed package in case
    compilation fails

 +o  Section 11.19: Pointed out availability of fixed package in case
    compilation fails

 +o  Section 14.4: Failed to mention that the package needs to be
    configured prior to compilation.

 +o  Section 15.2: Failed to mention that the package needs to be
    configured prior to compilation.

 +o  Inserted a new section 19 (old section 19 has become section 20)
    that contains migrating information, in case you need to do some
    re-modeling to change a setup (like migrating to the new compiler
    setup in this version).

 1.2 - January 9th, 2000


 +o  Section 2: Owen Cook pointed out that the link for the sysvinit
    package was wrong. It said cistron.nl. It should be ftp.cistron.nl
 +o  Section 3.4: Added the usr/include directory to the list of
    directories that need to be created

 +o  Section 4.3: Made a notion of the possibility that somebody's
    system might be using shadowed passwords.

 +o  Section 6.1.3: The majority of the files that need to be copied was
    missing (the files that need to be copied to $LFS/usr/bin).

 +o  Section 6.1.4: Forgot to mention that the mv program needs to be
    copied as well

 +o  Section 6.1.14: Forgot to mention that the cmp program needs to be
    copied as well

 +o  Section 7: Just to make sure nobody runs into problems, I added the
    comment that all file systems must be unmounted and the root file
    system must be mounted read-only before the computer is rebooted

 +o  Section 7.2: Added the --local-prefix=/usr/gcc2723 switch to the
    configure command line

 +o  Section 11.7: Fixed a typo in one of the programs: patchchk should
    be pathchk

 +o  Section 11.9: Added compilation and copying of the mkswap program

 1.1 - December 20th, 1999


 +o  Fixed a few typos

 +o  Modified section 18 (Configuring system for Internet) from just a
    reference to the ISP-Hookup-HOWTO to a basic explanation on how to
    setup Internet

 +o  Fixed error in /etc/syslog.conf (in section 12.8.2)

 1.0 - December 16th, 1999


 +o  Initial release

 11..44..  CCuurrrreenntt PPrroojjeeccttss

 Projects related to this HOWTO that are currently underway.


 +o  The HOWTO is under the process of being translated into Spanish

 11..55..  TTOODDOO

 Things that need to be done for future releases. If you feel you want
 to help out on one of these items, let me know first (in case you end
 up doing something somebody else is doing already or is already
 finished).


 +o  Translate the HOWTO into Dutch. Although I'm Dutch myself, I can't
    seem to find time to do the work myself.

 11..66..  MMaaiilliinngglliissttss

 There are two mailinglists you can subscribe to. The lfs-discuss and
 the lfs-announce list. The former is an open non-moderated list
 discussing anything that has got anything to do with this HOWTO
 (asking questions, inform about mistakes in this HOWTO and so on). The
 latter is an open moderated list. Anybody can subscribe to it, but you
 cannot post messages to it (only the moderator(s) can). This list is
 primarily used for announcements of new versions of the HOWTO.

 If you're subscribed to the lfs-discuss list you don't need to be
 subscribed to the lfs-announce list as well. Everything that is sent
 over the lfs-announce list is also sent over the lfs-discuss list.

 11..66..11..  SSuubbssccrriibbiinngg

 To subscribe to a list, send an email to [email protected] and type
 in the body either _s_u_b_s_c_r_i_b_e _l_f_s_-_d_i_s_c_u_s_s or _s_u_b_s_c_r_i_b_e _l_f_s_-_a_n_n_o_u_n_c_e

 Majordomo will send you a confirmation-request email. This email will
 contain an authentication code. Once you send this email back to
 Majordomo (instructions are provided in that email) you will be
 subscribed.

 11..66..22..  UUnnssuubbssccrriibbiinngg

 To unsubscribe from a list, send an email to [email protected] and
 type in the the body either _u_n_s_u_b_s_c_r_i_b_e _l_f_s_-_d_i_s_c_u_s_s or _u_n_s_u_b_s_c_r_i_b_e
 _l_f_s_-_a_n_n_o_u_n_c_e

 11..77..  CCoonnttaacctt iinnffoo

 You can reach me, Gerard Beekmans, at [email protected]

 22..  SSooffttwwaarree ppaacckkaaggeess yyoouu nneeeedd ttoo ddoowwnnllooaadd

 Below is a list of all the software that you need to download for use
 in this document. I display the sites and directories where you can
 download the software, but it is up to you to make sure you download
 the source archive and the latest version. The version numbers
 correspondent to versions of the software that is known to work.

 22..11..  MMaannddaattoorryy ssooffttwwaarree

 Sysvinit (2.78) : ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/

 Bash (2.03) : ftp://ftp.gnu.org/gnu/bash/

 Linux Kernel (2.2.14) : ftp://ftp.kernel.org/

 Make (3.77) : ftp://ftp.gnu.org/gnu/make/

 Sed (3.02) : ftp://ftp.gnu.org/gnu/sed/

 Shell Utils (2.0) : ftp://ftp.gnu.org/gnu/sh-utils/

 File Utils (4.0) : ftp://ftp.gnu.org/gnu/fileutils/

 Util Linux (2.9z) : ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/

 Text Utils (1.22) : ftp://ftp.gnu.org/gnu/textutils/

 Tar (1.12) : ftp://ftp.gnu.org/gnu/tar/

 Gzip (1.2.4) : ftp://ftp.gnu.org/gnu/gzip/

 Binutils (2.9.1.0) : ftp://ftp.gnu.org/gnu/binutils/

 Grep (2.2) : ftp://ftp.gnu.org/gnu/grep/


 Bison (1.25) : ftp://ftp.gnu.org/gnu/bison/

 Mawk (1.3.3) : ftp://ftp.whidbey.net/pub/brennan/

 Find Utils (4.1) : ftp://ftp.gnu.org/gnu/findutils/

 Diff Utils (2.7) : ftp://ftp.gnu.org/gnu/diffutils/

 Ld.so (1.9.10) : ftp://tsx-11.mit.edu/pub/linux/packages/GCC/

 Perl (5.005_03) : ftp://ftp.gnu.org/gnu/perl/

 M4 (1.4) : ftp://ftp.gnu.org/gnu/m4/

 Texinfo (4.0) : ftp://ftp.gnu.org/gnu/texinfo/

 Automake (1.3) : ftp://ftp.gnu.org/gnu/automake/

 Autoconf (2.13) : ftp://ftp.gnu.org/gnu/autoconf/

 Glibc (2.0.7pre6) : ftp://ftp.gwdg.de/pub/linux/glibc/2.0.7pre6/

 Glibc-crypt (2.0.pre6) : ftp://ftp.gwdg.de/pub/linux/glibc/2.0.7pre6/

 Glibc-linuxthreads (2.0.7pre6) :
 ftp://ftp.gwdg.de/pub/linux/glibc/2.0.7pre6/

 Libstdc++-2.91.60 :
 ftp://ftp.debian.org/debian/dists/slink/main/binary-i386/base/

 Libstdc++-2.91.660-dev :
 ftp://ftp.debian.org/debian/dists/slink/main/binary-i386/devel/

 GCC (2.7.2.3) : ftp://ftp.gnu.org/gnu/gcc/

 G++-2.91.60 : ftp://ftp.debian.org/debian/dists/slink/main/binary-
 i386/devel/

 Ncurses (4.2) : ftp://ftp.gnu.org/gnu/ncurses/

 Vim (5.5) : ftp://ftp.vim.org/pub/vim/

 Readline Library (4.0) : ftp://ftp.gnu.org/gnu/readline/

 Termcap Library (1.3) : ftp://ftp.gnu.org/gnu/termcap/

 Flex (2.5.4a) : ftp://ftp.gnu.org/gnu/flex/

 Less (332) : ftp://ftp.gnu.org/gnu/less/

 E2fsprogs (1.12) : ftp://tsx-11.mit.edu/pub/linux/packages/ext2fs/

 File (3.26) :
 ftp://ftp.debian.org/debian/dists/slink/main/source/utils/

 Libtool (1.2) : ftp://ftp.gnu.org/gnu/libtool/

 Modutils (2.3.7) : ftp://ftp.ocs.com.au/pub/modutils/v2.3/

 Linux86 (0.14.3) :
 ftp://ftp.debian.org/debian/dists/slink/main/source/devel

 Lilo (21) : ftp://sunsite.unc.edu/pub/Linux/system/boot/lilo/

 DPKG (1.4.0.35) :
 ftp://ftp.debian.org/debian/dists/slink/main/source/base/
 Sysklogd (1.3.31) : ftp://sunsite.unc.edu/pub/Linux/system/daemons/

 Groff (1.11.1) : ftp://ftp.gnu.org/gnu/groff/

 Man-db (2.3.10) :
 ftp://ftp.debian.org/debian/dists/slink/main/source/doc/

 Procps (2.0.6) : ftp://tsx-11.mit.edu/pub/linux/sources/usr.bin/

 Procinfo (17) : ftp://ftp.cistron.nl/pub/people/svm/

 Procmisc (19) : ftp://lrcftp.epfl.ch/pub/linux/local/psmisc/

 Shadow Password Suite (19990827) :
 ftp://piast.t19.ds.pwr.wroc.pl/pub/linux/shadow/

 22..22..  OOppttiioonnaall ssooffttwwaarree

 All software below is used in sections 13 and above and are not
 strictly necessary. You have to determine for yourself if you want to
 install certain packages. If, for example, you don't intend to go
 online with the LFS system, you might not want to install the email,
 telnet, ftp, www, etc. utilities.  You can omit those. I suggest you
 read the sections 13 and above first to determine which software
 packages you want and which software packages you don't want to
 install.

 Netkit-base : ftp://ftp.uk.linux.org/pub/linux/Networking/netkit-
 devel/

 Net-tools (1.53) : http://www.tazenda.demon.co.uk/phil/net-tools/

 Procmail (3.13.1) : ftp://ftp.procmail.org/pub/procmail/

 Sendmail (8.9.3) : ftp://ftp.sendmail.org/pub/sendmail/

 Mailx (8.1.1) :
 ftp://ftp.debian.org/debian/dists/slink/main/source/mail/

 Mutt (1.0i) : ftp://ftp.mutt.org/pub/mutt/

 Fetchmail (5.2.0) : http://www.tuxedo.org/~esr/fetchmail/

 Netkit-telnet : ftp://ftp.uk.linux.org/pub/linux/Networking/netkit-
 devel/

 Proftpd (1.2.0pre9) : ftp://ftp.tos.net/pub/proftpd/

 Netkit-ftp : ftp://ftp.uk.linux.org/pub/linux/Networking/netkit-devel/

 Apache (1.3.3) : http://www.apache.org/dist/

 Slang Library (1.3.10) : ftp://space.mit.edu/pub/davis/slang/

 Zlib Library (1.1.3) : http://www.cdrom.com/pub/infozip/zlib/

 Lynx (2.8.1) : http://www.slcc.edu/lynx/release/

 Xfree86 (3.3.2.3) : ftp://ftp.xfree86.org/pub/XFree86/

 libPropList (0.9.1) : ftp://ftp.windowmaker.org/pub/libs/

 libXpm (4.7) : ftp://sunsite.unc.edu/pub/Linux/libs/X/

 libpng (1.0.3) : http://www.cdrom.com/pub/png/

 libtiff (3.4) : ftp://ftp.sgi.com/graphics/tiff/

 libjpeg (6b) : http://www.ijg.org/

 libungif (4.1.0) : ftp://prtr-13.ucsc.edu/pub/libungif/

 WindowMaker (0.61.1) : ftp://ftp.windowmaker.org/pub/release/

 PPP (2.3.10) : ftp://cs.anu.edu.au/pub/software/ppp/

 33..  PPrreeppaarriinngg tthhee nneeww ssyysstteemm

 33..11..  HHooww wwee aarree ggooiinngg ttoo ddoo tthhiinnggss

 We are going to build the LFS system using an already installed Linux
 distribution such as Debian, SuSe, Slackware, Mandrake, RedHat, etc.
 You don't need to have any kind of bootdisk. We will use an existing
 Linux system as the base (since we need a compiler, linker, text
 editor and other tools).

 If you don't have Linux installed yet, you won't be able to put this
 HOWTO to use right away. I suggest you first install a Linux
 distribution. It really doesn't matter which one you install. It also
 doesn't need to be the latest version (though it shouldn't be a too
 old one. If it is about a year old or newer it'll do just fine).

 33..22..  CCrreeaattiinngg aa nneeww ppaarrttiittiioonn

 Before we can build our new Linux system, we need to have an empty
 Linux partition on which we can build our new system. If you already
 have a Linux Native partition available, you can skip this subsection.

 Start the fdisk program (or cfdisk if you prefer that program) with
 the appropriate hard disk as the option (like /dev/hda if you want to
 create a new partition on the primary master IDE disk). Create a Linux
 Native partition, write the partition table and exit the (c)fdisk
 program. If you get the message that you need to reboot your system to
 ensure that that partition table is updated, then please reboot your
 system now before continuing.

 33..33..  CCrreeaattiinngg aann eexxtt22 ffiillee ssyysstteemm oonn tthhee nneeww ppaarrttiittiioonn

 Once the partition is created, we have to create a new ext2 file
 system on that partition. From now on I'll refer to this newly created
 partition as $LFS. $LFS should be substituted with the partition you
 have created. If you created your partition on /dev/hda4, you mounted
 it on /mnt/hda4 and this document tells you to copy a file to
 $LFS/usr/bin then you need to copy that file to /mnt/hda4/usr/bin.

 To create a new ext2 file system we use the mke2fs command. Give $LFS
 as the only option and the file system will be created.

 33..44..  AAddddiinngg aann eennttrryy ttoo LLIILLOO

 In order to be able to boot from this partition later on, we need to
 update our /etc/lilo.conf file. Add the following lines to lilo.conf:


 image=<currently used image>
    label=<label>
    root=$LFS
    read-only




 Replace <currently used image> by the kernel image file that you are
 using to boot your normal Linux system. <label> can be anything you
 want it to be. I named the label "lfs" What you enter as <label> is
 what you enter at the LILO-prompt when you choose with system to boot.

 Now run the lilo program to update the boot loader.

 33..55..  CCrreeaattiinngg ddiirreeccttoorriieess

 Let's create a minimal directory tree on the $LFS partition. issuing
 the following commands will create the necessary directories. Make
 sure you first mount the $LFS partition before you attempt to create
 the directories.


 cd $LFS
 mkdir boot etc home lib mnt proc root tmp var usr
 mkdir bin sbin usr/bin usr/sbin usr/src
 mkdir usr/man usr/include usr/share
 cd usr/man
 mkdir man1 man2 man3 man4 man5 man6 man7 man8
 cd ..
 ln -s . local
 ln -s /etc etc
 ln -s /var var
 ln -s /usr/man share/man




 I am aware that a number of directories you have created above are in
 total violation with the FHS (File Hierarchy Standard -
 http://www.pathname.com/fhs/). The reason why I do this is just a
 preference. I want to keep certain files all together. For example the
 old standard was that man pages go in /usr/man and /usr/local/man. The
 most recent standard dictates that man pages should go in
 /usr/share/man (and possibly /usr/local/share/man). I just want them
 all to be in /usr/man so I know exactly in what directory a certain
 man page is and I don't have to start looking in various directories
 to find out where it is (although I can simply find a file with the
 'locate' command I still prefer the way I do things).

 If you want to create a file system that it completely according the
 FHS, then I urge you to take a look at www.pathname.com/fhs and create
 your directories accordingly.

 33..66..  CCooppyyiinngg tthhee //ddeevv ddiirreeccttoorryy

 We can create every single file that we need to be in the $LFS/dev
 directory using the mknod command, but that just takes up a lot of
 time. I choose to just simply copy the current /dev directory to the
 $LFS partition.  Use this command to copy the entire directory while
 preserving original rights, symlinks and owner ships:

 cp -av /dev $LFS

 Feel free to strip down the $LFS/dev directory, only leaving the
 devices you really need.

 44..  IInnssttaalllliinngg SSyyssvviinniitt

 44..11..  PPrreeppaarriinngg SSyyssvviinniitt

 Under normal circumstances, after the kernel's done loading and
 initializing various system components, it attempts to load a program
 called init which will finalize the system boot process. The program
 found on most Linux systems is called Sysvinit and that's the program
 we're going to install on our LFS system.


 +o  Unpack the Sysvinit archive

 +o  Go to the src directory

 +o  Edit the Makefile file

 +o  Somewhere in this file, but before the rule _a_l_l_: putt his variable:
    _R_O_O_T _= _$_L_F_S

 +o  Precede every /dev on the last four lines in this file by _$_(_R_O_O_T_)

 After applying the $(ROOT) parts to the last four lines, they should
 look like this:


    @if [! -p $(ROOT)/dev/initctl ]; then \
    echo "Creating $(ROOT)/dev/initctl" \
    rm -f $(ROOT)/dev/initctl; \
    mknod -m 600 $(ROOT)/dev/initctl p; fi





 +o  Compile the package by running make LDFLAGS=-static

 +o  Install the package by running make install

 44..22..  CCoonnffiigguurriinngg SSyyssvviinniitt

 In order for Sysvinit to work, we need to create it's configuration
 file.  Create the $LFS/etc/inittab file containing the following:


 # Begin /etc/inittab

 id:2:initdefault:

 si::sysinit:/etc/init.d/rcS

 ~~:S:wait:/sbin/sulogin

 l0:0:wait:/etc/init.d/rc 0
 l1:1:wait:/etc/init.d/rc 1
 l2:2:wait:/etc/init.d/rc 2
 l3:3:wait:/etc/init.d/rc 3
 l4:4:wait:/etc/init.d/rc 4
 l5:5:wait:/etc/init.d/rc 5
 l6:6:wait:/etc/init.d/rc 6
 z6:6:wait:/sbin/sulogin

 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

 1:2345:respawn:/sbin/sulogin

 # End /etc/inittab






 44..33..  CCooppyyiinngg ppaasssswwdd && ggrroouupp ffiilleess

 As you can see from the inittab file, when we boot the system, init
 will start the sulogin program and sulogin will ask you for root's
 password. This means we need to have at least a passwd file present on
 the LFS system. We'll use the passwd and group files from the current
 running Linux system. Since the passwords are encoded it's just easier
 to copy the already present file and use that, instead of retyping the
 encoded password. Mistakes are easily made and this way we can avoid
 extra hassle afterwards.


 +o  Copy the /etc/passwd and /etc/group files to $LFS/etc/

 +o  Edit the $LFS/etc/passwd file and remove every line, except the
    line for the user root

 +o  Edit the $LFS/etc/group file and remove every line, except the line
    for the group root

 It might be the case that your system uses shadowed passwords. In that
 case the /etc/passwd files will not contain the root password, but the
 /etc/shadow file does (this file is only accessible by user root and
 programs who run as root). The password field of /etc/passwd contains
 a x usually (the first field after the username). Remove that x and
 replace it with the encoded password you have in /etc/shadow. The
 encoded password is the second field in the /etc/shadow file (so the
 first field after the username, without the colons). Make sure you
 copy it exactly as it is. Remember: it is case sensitive.

 44..44..  IInnssttaalllliinngg aa rroooott sshheellll

 When sulogin asks you for the root password and you've entered the
 password, a shell needs to be started. Usually this is the bash shell.
 Since there are no libraries installed yet, we need to link bash
 statically, just like we did with Sysvinit.


 +o  Unpack the Bash archive

 +o  Configure the package by running configure --enable-static-link

 +o  Compile the package by running make

 +o  Copy the binary bash to $LFS/bin

 +o  Create a symlink that links $LFS/bin/sh to $LFS/bin/bash

 44..55..  TTeessttiinngg tthhee ssyysstteemm

 After you've completed this section, we can test the system and see if
 we can log on to it. Please note that you will get errors regarding
 the init program not being able to start the rcS and rc scripts.
 Ignore those error s for now. It is normal. We will install these
 scripts in a later stage.

 Also note that you won't be able to shutdown the system with a program
 like shutdown. Although the program is present, it will give you the
 following error: "You don't exist. Go away." when you try to use the
 program.  The meaning of this error is that the system isn't able to
 locate the password file. Although the shutdown program is statically
 linked against the libraries it needs, it still depends on the nss
 library (Name Server Switch) which is part of the GNU C Library, which
 also will be installed in a later stage. This NSS library passes on
 information where (in this case) the passwd file can be found.

 For now you can reboot the system using the reboot -f command. This
 will bypass shutting down the system using the shutdown program and
 reboot immediately.  Since the file system is mounted read-only this
 will not harm our system in any way (though you might get a warning
 next time you try to mount the system that it wasn't unmounted cleanly
 the last time and that you should run e2fsck to make sure the file
 system is OK).

 55..  IInnssttaalllliinngg aa kkeerrnneell

 55..11..  NNoottee oonn ffttpp..kkeerrnneell..oorrgg

 In section 2 above I mentioned you can download a new kernel from
 ftp://ftp.kernel.org/ However, this site is often too busy to get
 through and the maintainers of this site encourage you to download the
 kernel from a location near you. You can access a mirror site by going
 to ftp://ftp.<country code>.kernel.org/ (like ftp.ca.kernel.org).

 55..22..  CCoonnffiigguurriinngg tthhee kkeerrnneell


 +o  Unpack the Kernel archive in the /usr/src/ directory

 +o  Choose a method to configure the kernel (see the README file for
    more details on configuration methods) and make sure you don't
    configure anything as modules at this point. This is because we
    won't have the necessary software available to load kernel modules
    for a while.

 +o  After you're done with your kernel configuration, run make dep

 +o  Compile the kernel by running make bzImage

 +o  Copy the arch/<cpu>/boot/bzImage file to the /boot directory (or
    some place else if your Linux system uses a different convention
    where kernel images and the like are stored)

 +o  Optionally you can rename the /boot/bzImage file to something like
    /boot/lfskernel

 +o  Copy the entire kernel source tree from to the LFS partition by
    running: cp -av /usr/src/linux $LFS/usr/src

 +o  Create the $LFS/usr/include/linux symlink by running ln -s
    $LFS/usr/include/linux /usr/src/linux/include/linux

 +o  Create the $LFS/usr/include/asm symlink by running ln -s
    $LFS/usr/include/asm /usr/src/linux/include/asm

 55..33..  UUppddaattiinngg LLIILLOO


 +o  Edit the /etc/lilo.conf file and go to the LFS section

 +o  Change the image name to lfskernel (or whatever you've named the
    originally called bzImage file)

 +o  Run lilo to update the boot loader.

 55..44..  TTeessttiinngg tthhee ssyysstteemm

 Reboot your system and start your LFS system. Verify that the newly
 installed kernel doesn't perform out-of-the-ordinary actions (like
 crashing).


 66..  IInnssttaalllliinngg tthhee GGNNUU CC aanndd CC++++ LLiibbrraarriieess

 66..11..  PPrreeppaarriinngg tthhee ssyysstteemm ffoorr tthhee GGNNUU CC LLiibbrraarryy iinnssttaallllaattiioonn

 In this section we're going to install Glibc. But before we'll be able
 to install these libraries, we need to have a bunch of other software
 installed on the LFS system. Therefore all these programs need to be
 linked statically.  This means quite a bit of extra work, because
 after Glibc and the GNU CC compilers are installed, we're going to re-
 install all these programs so they'll be linked dynamically. If
 somebody knows of a better way to accomplish this, without first
 building all the software statically and then rebuild them
 dynamically, please let me know.

 I know of one other way and that's by installing Glibc using pre-
 compiled binaries. But that would be directly against what we're doing
 here. So that's not an option.

 All software that is being installed in this section will be compiled
 on our normal working Linux system and then copied to the LFS system.

 You'll notice that the installation of this software is very
 straightforward is most cases. I also won't explain what this software
 does, since it's all trivial software and if you don't know what some
 program does, you can always read the README file and other
 documentation.

 66..11..11..  IInnssttaalllliinngg MMaakkee


 +o  Unpack the Make archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the make binary to $LFS/usr/bin

 66..11..22..  IInnssttaalllliinngg SSeedd


 +o  Unpack the Sed archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the sed/sed binary to $LFS/usr/bin

 There is a possibility you will experience compilation problems. If
 this is teh case, you can download a fixed version of this package
 from the following URL: http://tts.ookhoi.dds.nl/download/lfs-
 howto/sed-3.02-lfs.tar.gz

 66..11..33..  IInnssttaalllliinngg SShheellll UUttiillss


 +o  Unpack the Shell Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the following binaries from the src directory to $LFS/bin:
    date echo false pwd sleep stty su true uname

 +o  Copy the following binary from the src directory to $LFS/sbin:
    chroot

 +o  Copy the following binaries from the src directory to $LFS/usr/bin:
    basename dirname env expr factor groups id logname nice nohup
    pathchk printenv printf seq tee test tty uptime users who whoami
    yes

 66..11..44..  IInnssttaalllliinngg FFiillee UUttiillss


 +o  Unpack the File Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the following binaries from the src directory to $LFS/bin:
    chgrp chmod chown cp dd df dir dircolors du ln ls mkdir mkfifo
    mknod mv rm rmdir sync touch vdir

 +o  Copy the following binary from the src directory to $LFS/usr/bin:
    ginstall

 +o  Create the $LFS/usr/bin/install symlink by running: cd
    $LFS/usr/bin; ln -s ginstall install

 66..11..55..  IInnssttaalllliinngg UUttiill LLiinnuuxx


 +o  Unpack the Util Linux archive

 +o  Configure the package by running configure

 +o  Go to the lib directory and compile the files there by running make

 +o  Go to the mount directory and compile the programs there by running
    make LDFLAGS=-static

 +o  Copy the following binaries to $LFS/sbin: losetup mount swapon
    umount

 +o  Create the symlink that links $LFS/sbin/swapoff to $LFS/sbin/swapon

 66..11..66..  IInnssttaalllliinngg TTeexxtt UUttiillss


 +o  Unpack the Text Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the following binary from the src directory to $LFS/bin: cat

 +o  Copy the following binaries from the src directory to $LFS/usr/bin:
    cksum comm csplit cut expand fmt fold head join md5sum nl od paste
    pr sort split sum tac tail tr unexpand uniq wc

 66..11..77..  IInnssttaalllliinngg TTaarr


 +o  Unpack the Tar archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 After compiling the programs in the src directory you will have two
 programs: tar and rmt. Tar is obvious. Rmt stands for ReMote
 Tapeserver. If you don't need this program (ie; you don't have a
 tapestreamer in your network or on your machine) then you don't need
 to copy this program.


 +o  Copy the src/tar binary to $LFS/bin

 +o  Copy the src/rmt binary to $LFS/bin (if you need it)

 66..11..88..  IInnssttaalllliinngg GGzziipp


 +o  Unpack the Gzip archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Remove from the following files the _._i_n extension: gzexe.in
    zdiff.in zforce.in zgrep.in zmore.in znew.in

 +o  Copy the following files to $LFS/bin: gunzip gzexe gzip zcat zdiff
    zforce zgrep zmore znew

 There is a possibility you will experience compilation problems. If
 this is the case, you can download a fixed version of this package
 from the following URL: http://tts.ookhoi.dds.nl/download/lfs-
 howto/gzip-1.2.4-lfs.tar.gz

 66..11..99..  IInnssttaalllliinngg BBiinnuuttiillss


 +o  Unpack the Binutils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-all-static

 +o  Copy the following binaries from the gas directory to $LFS/usr/bin:
    as-new gasp-new

 +o  Rename those files to $LFS/usr/bin/as and $LFS/usr/bin/gasp

 +o  Copy the following binaries from the ld directory to
    $LFS/usr/bin:ld-new

 +o  Rename that file to $LFS/usr/bin/ld

 +o  Copy the following binaries from the binutils directory to
    $LFS/usr/bin: addr2line ar c++filt nm-new objcopy objdump ranlib
    size strings strip-new

 +o  Rename $LFS/usr/bin/nm-new to $LFS/usr/bin/nm

 +o  Rename $LFS/usr/bin/strip-new to $LFS/usr/bin/strip

 66..11..1100..  IInnssttaalllliinngg GGrreepp


 +o  Unpack the Grep archive


 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the following binaries from the src directory to $LFS/usr/bin:
    egrep fgrep grep

 There is a possibility you will experience compilation problems. If
 this is the case, you can download a fixed version of this package
 from the following URL:
 http://tts.ookhoi.dds.nl/download/grep-2.2-lfs.tar.gz

 66..11..1111..  IInnssttaalllliinngg BBiissoonn


 +o  Unpack the Bison archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the following binary to $LFS/usr/bin: bison

 +o  Copy the following files to $LFS/usr/share: bison.hairy
    bison.simple

 66..11..1122..  IInnssttaalllliinngg MMaawwkk


 +o  Unpack the Mawk archive

 +o  Configure the package by running configure

 +o  Compile the package by running make CFLAGS="-O -static"

 +o  Copy the following binary to $LFS/usr/bin: mawk

 +o  Create the symlinks that links $LFS/usr/bin/awk to
    $LFS/usr/bin/mawk

 66..11..1133..  IInnssttaalllliinngg FFiinndd UUttiillss


 +o  Unpack the Find Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the following binary from the find directory to $LFS/usr/bin:
    find

 There is a possibility you will experience compilation problems. If
 this is the case, you can download a fixed version of this package
 from the following URL: http://tts.ookhoi.dds.nl/download/lfs-
 howto/findutils-4.1-lfs.tar.gz

 66..11..1144..  IInnssttaalllliinngg DDiiffff UUttiillss


 +o  Unpack the Diff Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the following binaries to $LFS/usr/bin: cmp diff diff3 sdiff

 There is a possibility you will experience compilation problems. If
 this is the case, you can download a fixed version of this package
 from the following URL: http://tts.ookhoi.dds.nl/download/lfs-
 howto/diffutils-2.7-lfs.tar.gz

 66..11..1155..  IInnssttaalllliinngg LLdd..ssoo


 +o  Unpack the Ld.so archive

 +o  Go to the util directory

 +o  Compile ldd by running make ldd

 +o  Compile ldconfig by running make ldconfig

 +o  Copy the following binary to $LFS/bin:ldd

 +o  Copy the following binary to $LFS/sbin: ldconfig

 66..11..1166..  IInnssttaalllliinngg PPeerrll


 +o  Unpack the Perl archive

 +o  Configure the package by running Configure

 You can stick to all the default questions, except to the following.

 When asked _W_h_a_t _i_s _t_h_e _f_i_l_e _e_x_t_e_n_s_i_o_n _u_s_e_d _f_o_r _s_h_a_r_e_d _l_i_b_r_a_r_i_e_s_? _[_s_o_]

 Answer with: _n_o_n_e



 When asked _A_n_y _a_d_d_i_t_i_o_n_a_l _l_d _f_l_a_g_s _(_N_O_T _i_n_c_l_u_d_i_n_g _l_i_b_r_a_r_i_e_s_)_?
 _[_-_L_/_u_s_r_/_l_o_c_a_l_/_l_i_b_]

 Answer with: _-_L_/_u_s_r_/_l_o_c_a_l_/_l_i_b _-_s_t_a_t_i_c



 When asked _D_o _y_o_u _w_i_s_h _t_o _u_s_e _d_y_n_a_m_i_c _l_o_a_d_i_n_g_? _[_y_]

 Answer with: _n


 +o  Compile the package by running make

 +o  Copy the following binary to $LFS/usr/bin: perl

 66..11..1177..  IInnssttaalllliinngg MM44


 +o  Unpack the M4 archive

 +o  Configure the package by running configure

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the following binary from the src directory to $LFS/usr/bin:
    m4


 There is a possibility you will experience compilation problems. If
 this is the case, you can download a fixed version of this package
 from the following URL: http://tts.ookhoi.dds.nl/download/lfs-
 howto/m4-1.4-lfs.tar.gz

 66..11..1188..  IInnssttaalllliinngg TTeexxiinnffoo


 +o  Unpack the Texinfo archive

 +o  Configure the package by running configure --disable-nls

 +o  Compile the package by running make LDFLAGS=-static

 +o  Copy the following binary from the makeinfo directory to
    $LFS/usr/bin: makeinfo

 66..11..1199..  IInnssttaalllliinngg AAuuttoommaakkee


 +o  Unpack the automake archive

 +o  Configure the package by running configure

 +o  Copy the following scripts to $LFS/usr/bin: automake aclocal

 +o  Create the following directory: $LFS/usr/share/automake

 +o  Copy the following files to $LFS/usr/share/automake: config.guess
    config.sub install-sh mdate-sh missing mkinstalldirs elisp-comp
    ylwrap acinstall

 +o  Copy the following files to $LFS/usr/share/automake: All *.am files

 +o  Create the following directory: $LFS/usr/share/aclocal

 +o  Copy the following files from the m4 directory to
    $LFS/usr/share/aclocal: all *.m4 files

 66..11..2200..  IInnssttaalllliinngg AAuuttooccoonnff


 +o  Unpack the Autoconf archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Copy the following files to $LFS/usr/bin: autoconf autoheader
    autoreconf autoscan autoupdate ifnames

 +o  Create the following directory: $LFS/usr/share/autoconf

 +o  Copy the following files to $LFS/usr/share/autoconf: All *.m4*
    files (in effect this means all *m4 and all *.m4f files)

 +o  Also copy these following files to $LFS/usr/share/autoconf:
    acconfig.h acfunctions acheaders acidentifiers acprograms
    acmakevars

 66..22..  IInnssttaalllliinngg tthhee GGNNUU CC LLiibbrraarryy

 We're not going to installed the latest Glibc version, 2.1.2, but
 version 2.0.7pre6. The reason is that glibc 2.1.2 requires at least
 gcc 2.8 (or egcs 1.1). My system has gcc 2.7.2.3 thus I can't compile
 the glibc2.1.2 library.  And I also don't want to upgrade my working
 Linux system to gcc 2.95.2 (which is the latest version at the time of
 writing this document). Upgrading a compiler isn't as easy as it
 sounds and I don't want to break things on this working system.

 So therefore I have to install glibc 2.0.7pre6. However, we are going
 to install the gcc 2.95.2 compiler. We also need to install the gcc
 2.7.2.3 compiler because certain software can't be compiled with gcc
 2.95.2 (due to bugs in the programs that aren't really bugs but the
 gcc 2.95.2 compiler defines them as bugs. This is not a bug in the
 compiler, but changes in the C standard (if I understood it
 correctly)).

 A note on the glibc-crypt package. The following is quoted from the
 glibc-crypt-README file on ftp://ftp.gnu.org/gnu/glibc:


 -*-*-*-*-*-
 The add-on is not included in the main distribution of the GNU
 C library because some governments, mostly notable those of
 France, Russia and the US, have very restrictive rules
 governing the distribution and use of encryption software.
 Please read the node "Legal Problems" in the manual for more
 details.

 In particular, the US does not allow export of this software
 without a license, including via the Internet. So please do not
 download it from the main FSF FTP site at ftp.gnu.org if you
 are outside of the US. This software was completely developed
 outside the US.
 -*-*-*-*-*-




 "This software" refers to the glibc-crypt package at
 ftp://ftp.gwdg.de/pub/linux/glibc/2.0.7pre6/.  This law only affects
 people who don't live in the US. It's not prohibited to import DES
 software, so if you live in the US you can import it from that German
 site.


 +o  Unpack the Glibc archive

 +o  Move the glibc-crypt and glibc-linuxthreads archives into the
    unpacked glibc directory

 +o  Unpack the glibc-crypt and glibc-linuxthreads there

 +o  Configure the package by running (from the glibc top level
    directory) configure --with-gnu-binutils --enable-shared --enable-
    add-ons=linuxthreads,crypt

 +o  Create a new file configparms containing the following:


 # Begin configparms
 prefix=/usr
 slibdir=/lib
 sysconfdir=/etc
 # End configparms






 +o  Compile the package by running make

 +o  Reboot the computer into the LFS system

 +o  Remount the LFS partition in read-write mode

 +o  Mount the partition where the Glibc source files reside

 +o  If this partition is different from the partition where your /usr
    directory is usually mounted on, also mount that partition

 +o  Create a symlink that links /usr/lib/gcc-lib to the usr/lib/gcc-lib
    directory on the normal Linux system.

 +o  Go to the Glibc source directory

 +o  Install the package by running make install

 +o  Remove the /usr/lib/gcc-lib symlink

 You can check if the GNU C Library seems to be working by running a
 dynamically linked program that uses this library (like almost every
 program). A simple test is running the ls program that resides in the
 bin directory on your normal Linux partition. If you can run this
 program without any errors, then the GNU C Library seems to be
 installed correctly.

 Please not that if your normal Linux system uses a differnet library
 version that the one you just installed on your LFS system, that
 program will most likely crash and reported a 'Segmentation Fault' or
 something similar. If so, just continue with the installation of the
 C++ Library and the compilers. After the compilers are done you will
 compile a small test program and execute it for the sake of testing
 the compiler. If those two little programs execute without crashing,
 it means that 1) the compiler works 2) the C Library works too. So
 don't worry too much right now if programs from your normal Linux
 system don't work due to C Library incompatibilities.

 66..33..  IInnssttaalllliinngg tthhee GGNNUU CC++++ LLiibbrraarryy

 If you have used a previous version of this HOWTO to install a LFS
 system and you wish to update your LFS system conforming the changes
 made in this version of the HOWTO, you first need to remove the
 existing files regarding the previously installed C++ library before
 continuing with this section.


 +o  If you have used LFS-HOWTO versions 1.0, 1.1 or 1.2 please read
    section 19.1 now before continuing.

 This HOWTO used to install the C++ library from sources, but that has
 been changed and is an exception. The C++ library is installed from
 pre-compiled binaries. The reason is that I have not been able to find
 the sources for the C++ library version that I prefer to use. So until
 then we'll use pre-compiled binaries.

 66..33..11..  IInnssttaalllliinngg tthhee lliibbssttddcc++++22..99__22..9911..6666--00sslliinnkk22..ddeebb ppaacckkaaggee


 +o  Extract the archive files by running ar x
    libstdc++2.9_2.91.66-0slink2.deb

 +o  Extract the package itself by running tar xvfz data.tar.gz

 +o  Copy the package by running cp -av usr /

 +o  Remove the following files and directory: usr data.tar.gz
    control.tar.gz debian-binary

 66..33..22..  IInnssttaalllliinngg tthhee lliibbssttddcc++++22..99--ddeevv__22..9911..6666--00sslliinnkk22..ddeebb ppaacckkaaggee


 +o  Extract the archive files by running ar x
    libstdc++2.9-dev_2.91.66-0slink2.deb

 +o  Extract the package itself by running tar xvfz data.tar.gz

 +o  Copy the package by running cp -av usr /

 +o  Remove the following files and directory: usr data.tar.gz
    control.tar.gz debian-binary

 77..  IInnssttaalllliinngg tthhee GGNNUU CC aanndd CC++++ ccoommppiilleerrss

 You need to restart your system back into the normal Linux system to
 compile the gcc compiler. Before you reboot, unmount the partitions
 you mounted (that contained the glibc sources) and mount the LFS root
 partition read only by running mount -o remount,ro / /

 If you have used a previous version of this HOWTO to install a LFS
 system and you wish to update your LFS system conforming the changes
 made in this version, you first need to remove the existing files
 regarding the previously installed compilers before continuing with
 this section.


 +o  If you have used LFS-HOWTO versions 1.0, 1.1 or 1.2 please read
    section 19.2 now before continuing

 This HOWTO used to install the C++ compiler from source, but that has
 been changed and is an exception. The C++ compiler is installed using
 pre-compiled binaries. The reason is that I have not been able to find
 the sources for the C++ compiler version that I prefer to use. So
 until then we'll use pre-compiled binaries.

 We also will link the C compiler statically. Although Glibc is
 installed on our LFS system, we still are compiling the compiler on
 our normal Linux system. The normal Linux system may contain a
 different version of Glibc and the compiler will be linked against
 that version. Therefore we will link the compiler statically and later
 on when all statically linked software is being re-installed we also
 will re-install the compiler. This procedure is not necessary if both
 your normal Linux system and the LFS system use the same Library
 version, but since I don't know that we will do it this way. This
 ensures this document is usable on every Linux system, no matter what
 version of libraries they use.

 77..11..  MMaakkiinngg ttwwoo ssmmaallll tteesstt pprrooggrraammss

 We'll create a little C and a little C++ program which we will use
 after the installations to determine if the compilers can find the
 necessary files in order to successfully compile a program.


 +o  Create a new file $LFS/root/test1.c containing the following:







 // Begin test.c
 #include <stdio.h>
 int main() {
 printf("Hello World!\n");
 return 0;
 }
 // End test.c





 +o  Create a new file $LFS/root/test2.cpp containing the following:


 // Begin test2.cpp
 #include <iostream.h>
 int main() {
 cout << "Hello World!" << endl;
 return 0;
 }
 // End test2.cpp




 77..22..  IInnssttaalllliinngg GGCCCC 22..77..22..33


 +o  Unpack the gcc-2.7.2.3 archive

 +o  Configure the package by running configure

 +o  Build the compiler by executing these commands in sequence:


 make LANGUAGES=c
 make stage1
 make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2 -static" LANGUAGES=c
 make stage2
 make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2 --static" LANGUAGES=c
 make compare





 +o  If make compare doesn't report any differences, the compiler is
    build successfully.

 +o  Reboot your computer in the LFS system.

 +o  Mount the partition that contains the gcc-2.7.2.3 source files.

 +o  Install the package by running make CC="stage2/xgcc -Bstage2/"
    CFLAGS="-g -O2" LANGUAGES=c install

 77..33..  IInnssttaalllliinngg tthhee gg++++__22..9911..6666--00sslliinnkk22..ddeebb ppaacckkaaggee


 +o  Extract the archive files by running ar x g++_2.91.66-0slink2.deb

 +o  Extract the package itself by running tar xvfz data.tar.gz

 +o  Copy the files by running cp -av usr /

 +o  Remove the following files and directory: usr data.tar.gz
    control.tar.gz debian-binary

 Note that this g++ compiler is already pre-compiled and linked against
 glibc 2.0.7. Therefore there is no need to re-install this package in
 a later stage.

 77..44..  CCrreeaattiinngg nneecceessssaarryy ssyymmlliinnkkss


 +o  Create the /lib/cpp symlink by running ln -s /usr/lib/gcc-
    lib/<host>/2.7.2.3/cpp /lib/cpp

 +o  Create the /usr/bin/cpp symlink by running ln -s /usr/lib/gcc-
    lib/<host>/2.7.2.3/cpp /usr/bin/cpp

 +o  Create the /usr/bin/cc symlink by running ln -s /usr/bin/gcc
    /usr/bin/cc

 Replace <host> with the directory where the gcc-2.7.2.3 files were
 installed (i686-unknown-linux in my case).

 77..55..  TTeessttiinngg tthhee ccoommppiilleerrss

 We will compile two small programs which we will use to test if the
 compilers compile. Note that this is by no means an exhaustive test.
 It's just a little test to see if the compiler can find the necessary
 files in order to compile a basic program.


 +o  Go to the /root directory

 +o  Compile test1.c by running gcc test1.c -o test1

 +o  Compile test2.cpp by running g++ test2.cpp -o test2

 +o  Execute the test1 and test2 programs to make sure the programs run
    ok without dumping the core or perform other out-of-the-ordinary
    actions.

 88..  IInnssttaalllliinngg llooggiinn uuttiilliittiieess

 88..11..  IInnssttaalllliinngg aaggeettttyy ++ llooggiinn

 You need the Util Linux package again for this section. If you haven't
 deleted the Util Linux source directory, you can skip the first two
 steps.


 +o  Unpack the Util Linux archive (if you have deleted it since last
    time we've used it)

 +o  Configure the package by running configure

 +o  Go to the login-utils directory

 +o  Compile agetty and login by running make agetty login

 +o  Copy the following binary to /sbin: agetty

 +o  Copy the following binary to /bin: login

 88..22..  MMooddiiffyyiinngg $$LLFFSS//eettcc//iinniittttaabb

 You have to reboot back into your normal Linux system for this step
 because we need a text editor which isn't installed yet.
 The next step is modifying the $LFS/etc/inittab file so that agetty is
 started on a virtual console every time we start the system. This is
 how it works on most if not every Linux system.


 +o  Edit the $LFS/etc/inittab file

 +o  Find this line and remove it: _1_:_2_3_4_5_:_r_e_s_p_a_w_n_:_/_s_b_i_n_/_s_u_l_o_g_i_n

 +o  Where the previous line was, put the following lines:


    1:2345:respawn:/sbin/agetty /dev/tty1 9600
    2:2345:respawn:/sbin/agetty /dev/tty2 9600
    3:2345:respawn:/sbin/agetty /dev/tty3 9600
    4:2345:respawn:/sbin/agetty /dev/tty4 9600
    5:2345:respawn:/sbin/agetty /dev/tty5 9600
    6:2345:respawn:/sbin/agetty /dev/tty6 9600




 88..33..  CCrreeaattiinngg tthhee UUTTMMPP rreeccoorrdd ffiillee

 Every time you log onto a Linux system, the /var/run/utmp file is
 modified.  When this file isn't present, a lot of programs will start
 complaining, including agetty and login. So we just create an empty
 $LFS/var/run/utmp file and those programs won't complain anymore.


 +o  Create the $LFS/var/run directory

 +o  Create an empty file by running touch $LFS/var/run/utmp

 88..44..  TTeessttiinngg tthhee ssyysstteemm

 If you want you can test the system now. Restart the system and boot
 into the LFS system. After the kernel and sysvinit are done loading,
 agetty should start and prompt you with a username. Since the only
 user we currently have is 'root', you login as root.

 99..  IInnssttaalllliinngg VViimm

 Restart your system in the LFS system. From now on you don't need to
 start your normal Linux system anymore. The reason we had to do this
 is because the LFS system was lacking a text editor.

 99..11..  PPrreeppaarriinngg tthhee ssyysstteemm ffoorr tthhee VViimm iinnssttaallllaattiioonn

 99..11..11..  IInnssttaalllliinngg NNccuurrsseess

 In order to install Vim we need to have the ncurses libraries
 installed.


 +o  Unpack the Ncurses archive

 +o  Configure the package by running configure --with-shared

 +o  Compile the package by running make

 +o  Install the terminfo files by running make install.data

 +o  Go to the test directory and run a few of the programs to verify
    that the libraries are working

 +o  Install the libraries by running make install

 99..22..  IInnssttaalllliinngg VViimm

 Vim comes in two separate parts: A 'src' package and a 'rt' (run-time)
 package. You need both in order to install Vim. If you put both
 archives in the same directory, the unpacked files of both archives
 will appear in the same directory that will be created when you unpack
 the first (it doesn't matter which one you unpack first).


 +o  Unpack the Vim-src and the Vim-rt archives

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1100..  CCrreeaattiinngg iinniittiiaall bboooott ssccrriippttss

 1100..11..  PPrreeppaarriinngg tthhee ddiirreeccttoorriieess aanndd mmaasstteerr ffiilleess

 You need the Sysvinit package again for this section.

 Create the necessary directories by issuing these commands:


    cd /etc
    mkdir rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d init.d rcS.d





 +o  Go to the unpacked Sysvinit source directory

 +o  Copy the debian/etc/init.d/rc file to: /etc/init.d

 +o  Go to the /etc/init.d directory

 +o  Create a new file rcS containing the following:


    #!/bin/sh
    # Begin /etc/init.d/rcS

    runlevel=S
    prevlevel=N
    umask 022
    export runlevel prevlevel

    trap ":" INT QUIT TSTP

    for i in /etc/rcS.d/S??*
    do
       if [ ! -f  "$i" ] && continue
       $i start
    done

    # End /etc/init.d/rcS





 1100..22..  CCrreeaattiinngg tthhee rreebboooott ssccrriipptt


 +o  Create a new file reboot containing the following:


    #!/bin/sh
    # Begin /etc/init.d/reboot

    echo -n "System reboot in progress..."

    /sbin/reboot -d -f -i

    # End /etc/init.d/reboot




 1100..33..  CCrreeaattiinngg tthhee hhaalltt ssccrriipptt


 +o  Create a new file halt containing the following:


    #!/bin/sh
    # Begin /etc/init.d/halt

    /sbin/halt -d -f -i -p

    # End /etc/init.d/halt




 1100..44..  CCrreeaattiinngg tthhee mmoouunnttffss ssccrriipptt


 +o  Create a new file mountfs containing the following:




























 #!/bin/sh
 # Begin /etc/init.d/mountfs

 check_status()
 {
   if [ $? = 0 ]
   then
     echo "OK"
   else
     echo "FAILED"
   fi
 }

 echo -n "Remounting root file system in read-write mode..."
 /sbin/mount -n -o remount,rw /
 check_status

 > /etc/mtab
 /sbin/mount -f -o remount,rw /

 echo -n "Mounting proc file system..."
 /sbin/mount proc
 check_status

 # End /etc/init.d/mountfs




 1100..55..  CCrreeaattiinngg tthhee uummoouunnttffss ssccrriipptt


 +o  Create a new file umountfs containing the following:


 #!/bin/sh
 # Begin /etc/init.d/umountfs

 check_status()
 {
   if [ $? = 0 ]
   then
     echo "OK"
   else
     echo "FAILED"
   fi
 }
 echo -n "Unmounting file systems..."
 /sbin/umount -a -r
 check_status

 echo -n "Remounting root file system in read-only mode..."
 /sbin/mount -o remount,ro /
 check_status

 # End /etc/init.d/umountfs




 1100..66..  CCrreeaattiinngg tthhee sseennddssiiggnnaallss ssccrriipptt


 +o  Create a new file sendsignals containing the following:


 #!/bin/sh
 # Begin /etc/init.d/sendsignals

 check_status()
 {
   if [ $? = 0 ]
   then
     echo "OK"
   else
     echo "FAILED"
   fi
 }
 echo -n "Sending all processes the TERM signal..."
 /sbin/killall5 -15
 check_status

 echo -n "Sending all processes the KILL signal..."
 /sbin/killall5 -9
 check_status




 1100..77..  SSeett ffiillee ppeerrmmiissssiioonnss aanndd ccrreeaattee ssyymmlliinnkkss


 +o  Set the proper file permissions by running chmod 755 reboot halt
    mountfs umountfs sendsignals

 +o  Create the necessary symlinks by running:


    cd ../rc6.d; ln -s ../init.d/umountfs S90umountfs
    ln -s ../init.d/reboot S99reboot
    ln -s ../init.d/sendsignals S80sendsignals

    cd ../rc0.d; ln -s ../init.d/umountfs S90umountfs
    ln -s ../init.d/halt S99halt
    ln -s ../init.d/sendsignals S80sendsignals

    cd ../rcS.d; ln -s ../init.d/mountfs S10mountfs




 1100..88..  CCrreeaattiinngg tthhee //eettcc//ffssttaabb ffiillee


 +o  Create a file /etc/fstab containing the following:


    /dev/<LFS-partition device> / ext2 defaults 0 1
    /dev/<swap-partition device> none swap sw 0 0
    proc /proc proc defaults 0 0




 1100..99..  TTeessttiinngg tthhee ssyysstteemm

 You can test the system by restarting your computer and boot into LFS
 again.  Any errors should be gone now and your root partition should
 be mounted in read-write mode automatically.

 You can now finally restart your computer with a command like shutdown
 -r now
 1111..  RReeiinnssttaalllliinngg ssttaattiiccaallllyy lliinnkkeedd ssooffttwwaarree

 In this section we're going to reinstall all software that has been
 linked statically before dynamically. It's pretty straightforward like
 it was when we prepared our system for the Glibc installation.

 It's important that you take a close look at this section. If you
 decide you can't be bothered reinstalling all the previously installed
 software, at least look at the new libraries and programs in this
 section. A few programs that are already installed depend on certain
 libraries when dynamically linked.  But these libraries aren't only
 used by the already installed programs; other software might require
 it as well, so you want to install those. Also, a few programs
 recommend other programs to be installed. We didn't require those
 programs for the Glibc and GCC installation, but we might as well
 install them now to avoid problems later.

 Make sure you remove the old source tree first for best result (to
 make sure all programs are linked dynamically).

 1111..11..  RReeiinnssttaalliinngg GGCCCC--22..77..22..33


 +o  Unpack the GCC archive

 +o  Configure the package by running configure

 +o  Compile the package by running


 make LANGUAGES=c
 make stage1
 make "CC=stage1/xgcc -Bstage1/" "CFLAGS="-g -O2" LANGUAGES=c
 make stage2
 make "CC=stage2/xgcc -Bstage2/" "CFLAGS="-g -O2" LANGUAGES=c
 make compare





 +o  Install the package by running make CC="stage2/xgcc -Bstage2/"
    "CFLAGS="-g -O2" LANGUAGES=c install

 1111..22..  IInnssttaalllliinngg tthhee TTeerrmmccaapp lliibbrraarryy


 +o  Unpack the Termcap archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..33..  IInnssttaalllliinngg tthhee RReeaaddlliinnee lliibbrraarryy


 +o  Unpack the Readline archive

 +o  Configure the package by running configure

 +o  Compile the package by running make shared

 +o  Install the package by running make install

 +o  Install the shared libraries by running make install-shared

 1111..44..  RReeiinnssttaalllliinngg BBaasshh


 +o  Unpack the Bash archive

 +o  Configure the package by running configure --with-installed-
    readline

 +o  Compile the package by running make

 +o  Edit the Makefile file and find the variable: _b_i_n_d_i_r

 +o  Replace the current value with: _/_b_i_n

 +o  Install the package by running make install

 The just installed Bash version is compiled with the -g compiler flag,
 which means it's compiled with debugging information. This means that
 when you ever need to run bash through a debugger, the output is human
 readable, whereas a binary compiled without debugger information is
 very hard to debug.  The downside is that the Bash executable is now
 about 1MB in size. If you remove the debug information, you'll have an
 executable of around 340KB in size. This is quite a difference and
 worth it if you don't debug programs at all.

 You can edit the Makefile files whenever you compile a program so you
 can remove the -g compiler flags (often found in a CFLAGS variable),
 or you can run the strip program with one or more executables as the
 parameter(s). All debugging information will be deleted (this won't
 affect the program itself in any way whatsoever). The choice is yours.

 1111..55..  RReeiinnssttaalllliinngg SSyyssvviinniitt


 +o  Unpack the Sysvinit package

 +o  Go to the src directory

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..66..  RReeiinnssttaalllliinngg MMaakkee


 +o  Unpack the Make archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..77..  RReeiinnssttaalllliinngg SSeedd


 +o  Unpack the Sed archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..88..  RReeiinnssttaalllliinngg SShheellll UUttiillss


 +o  Unpack the Shell Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Copy the following binaries from the src directory to /bin: date
    echo false pwd sleep stty su true uname

 +o  Copy the following binary from the src directory to /sbin: chroot

 +o  Copy the following binaries from the src directory to /usr/bin:
    basename dirname env expr factor groups id logname nice nohup
    pathchk printenv printf seq tee test tty uptime users who whoami
    yes

 1111..99..  RReeiinnssttaalllliinngg FFiillee UUttiillss


 +o  Unpack the File Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Edit the Makefile file

 +o  Find the following variables: _b_i_n_d_i_r _s_b_i_n_d_i_r _s_y_s_c_o_n_f_d_i_r
    _l_o_c_a_l_s_t_a_t_e_d_i_r

 +o  Remove the _$_(_e_x_e_c___p_r_e_f_i_x_) and _$_(_p_r_e_f_i_x_) parts so you'll be left
    with the values: _/_b_i_n _/_s_b_i_n _/_e_t_c and _/_v_a_r

 +o  Install the package by running make install

 +o  Move the /bin/install file to the /usr/bin directory

 1111..1100..  RReeiinnssttaalllliinngg ++ IInnssttaalllliinngg UUttiill LLiinnuuxx


 +o  Unpack the Util Linux archive

 +o  Configure the package by running configure

 +o  Go to the lib directory

 +o  Compile the files there by running make

 +o  Go to the disk-util directory

 +o  Compile mkswap by running make mkswap

 +o  Copy the following binary to /sbin: mkswap

 +o  Go to the fdisk directory

 +o  Compile fdisk by running make fdisk

 +o  Compile cfdisk by running make cfdisk

 +o  Copy the following binaries to /sbin: cfdisk fdisk


 +o  Copy the following files to /usr/man/man8: cfdisk.8 fdisk.8

 +o  Go to the login-utils directory

 +o  Compile agetty by running make agetty

 +o  Compile login by running make login

 +o  Copy the following file to /usr/man/man1: login.1

 +o  Copy the following file to /usr/man/man8: agetty.8

 +o  Go to the mount directory

 +o  Compile the utilities by running make

 +o  Copy the following binaries to /sbin: mount umount swapon losetup

 +o  Copy the following files to /usr/man/man8: All *.8 files

 +o  Remove the /sbin/swapoff symlink and recreate the symlink that
    links /sbin/swapoff to /sbin/swapon

 +o  Go to the sys-utils directory

 +o  Compile dmesg by running make dmesg

 +o  Compile rdev by running make rdev

 +o  Copy the following binary to /bin: dmesg

 +o  Copy the following binary to /sbin: rdev

 +o  Copy the following files to /usr/man/man8: dmesg.8 rdev.8 swapdev.8
    ramsize.8 vidmode.8 rootflags.8

 +o  Create the symlinks that link /sbin/rdev, /sbin/swapdev,
    /sbin/ramsize, /sbin/vidmode and /sbin/rootflags to /sbin/rdev

 +o  Go to the text-utils directory

 +o  Compile more by running make more MOREHELPDIR=/usr/share/more

 +o  Copy the following binary to /usr/bin: more

 +o  Copy the following file to /usr/man/man1: more.1

 +o  Create the /usr/share/more directory

 +o  Copy the following file to /usr/share/more: more.help

 1111..1111..  RReeiinnssttaalllliinngg TTeexxtt UUttiillss


 +o  Unpack the Text Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Edit the src/Makefile file and find the variable: _b_i_n_d_i_r

 +o  Replace the current value with: _/_u_s_r_/_b_i_n

 +o  Install the package by running make install

 +o  Move the /usr/bin/cat file to /bin/cat

 1111..1122..  RReeiinnssttaalllliinngg TTaarr


 +o  Unpack the Tar archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Edit the src/Makefile file and find the variables: _b_i_n_d_i_r and
    _l_i_b_e_x_e_c_d_i_r

 +o  Give bindir the value: _/_b_i_n

 +o  Give libexecdir the value: _/_u_s_r_/_b_i_n

 +o  Install the package by running make install

 +o  If you don't need the ReMote Tapeserver program, you can delete the
    /usr/bin/rmt program

 1111..1133..  RReeiinnssttaalllliinngg GGzziipp


 +o  Unpack the Gzip archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Edit the Makefile file and find the variable: bindir

 +o  Replace the current value with: /bin

 +o  Install the package by running make install

 There is a possibility you will experience compilation problems. If
 this is the case, you can download a fixed version of this package
 from the following URL: http://tts.ookhoi.dds.nl/download/lfs-
 howto/gzip-1.2.4-lfs.tar.gz

 1111..1144..  RReeiinnssttaalllliinngg BBiissoonn


 +o  Unpack the Bison archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..1155..  IInnssttaalllliinngg FFlleexx


 +o  Unpack the Flex archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install


 1111..1166..  RReeiinnssttaalllliinngg BBiinnuuttiillss


 +o  Unpack the Binutils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..1177..  RReeiinnssttaalllliinngg GGrreepp


 +o  Unpack the Grep archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..1188..  RReeiinnssttaalllliinngg MMaawwkk


 +o  Unpack the Mawk archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..1199..  RReeiinnssttaalllliinngg FFiinndd UUttiillss


 +o  Unpack the Find Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 There is a possibility you will experience compilation problems. If
 this is the case, you can download a fixed version of this package
 from the following URL: http://tts.ookhoi.dds.nl/download/lfs-
 howto/findutils-4.1-lfs.tar.gz

 1111..2200..  RReeiinnssttaalllliinngg DDiiffff UUttiillss


 +o  Unpack the Diff Utils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..2211..  IInnssttaalllliinngg LLeessss


 +o  Unpack the Less archive


 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..2222..  RReeiinnssttaalllliinngg PPeerrll


 +o  Unpack the Perl archive

 +o  Configure the package by running Configure

 If you agree on all default values, you might want to configure the
 package by running Configure -d . This way you don't have to press
 enter all the time to accept the default values.


 +o  Compile the package by running make

 +o  Test the package by running make test

 +o  Install the package by running make install

 1111..2233..  RReeiinnssttaalllliinngg MM44


 +o  Unpack the M4 archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1111..2244..  RReeiinnssttaalllliinngg TTeexxiinnffoo


 +o  Unpack the Texinfo archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1122..  IInnssttaalllliinngg tthhee rreesstt ooff tthhee bbaassiicc ssyysstteemm ssooffttwwaarree

 The rest of the software that's part of our basic system will be
 installed in this section. You don't need all the software, but it's
 recommended to have it.

 1122..11..  IInnssttaalllliinngg EE22ffsspprrooggss

 1122..11..11..  IInnssttaalllliinngg EE22ffsspprrooggss


 +o  Unpack the E2fsprogs archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 When compiling I'm getting this error: mke2fs.c:142:SCSI_DISK_MAJOR
 not defined. I solved it the following way:

 +o  Edit the misc/mke2fs.c file and find the first occurrence of
    _S_C_S_I___D_I_S_K___M_A_J_O_R

 +o  Change this to: _S_C_S_I___D_I_S_K_0___M_A_J_O_R

 Please note that I have no idea what this does when you're using a
 SCSI system, but I can guess not a heck of a lot of good. Since I'm
 using an IDE system this doesn't harm me. If you're using SCSI you're
 on your own I'm afraid since I have no idea on how to fix this.
 Perhaps you don't even get it when using (a) SCSI disk(s).


 +o  Install the package by running make install

 1122..11..22..  CCrreeaattiinngg tthhee cchheecckkrroooott bboooottssccrriipptt

 We'll create a checkroot bootscript so that whenever we boot our LFS
 system, the root file system will be checked by fsck.


 +o  Create a file /etc/init.d/checkroot containing the following:













































 #!/bin/sh
 # Begin /etc/init.d/checkroot

 echo "Activating swap..."
 /sbin/swapon -av

 if [ -f /fastboot ]
 then
   echo "Fast boot, no file system check"
 else
   mount -n -o remount,ro /
   if [ $? = 0 ]
   then
     if [ -f /forcecheck ]
     then
       force="-f"
     else
       force=""
     fi

     echo "Checking root file system..."
     fsck $force -a /

     if [ $? -gt 1 ]
     then
       echo
       echo "fsck failed. Please repair your file system manually by"
       echo "running fsck without the -a option"

       echo "Please note that the file system is currently mounted in"
       echo "read-only mode."
       echo "
       echo "I will start sulogin now. CTRL+D will reboot your system."
       /sbin/sulogin
       /reboot -f
     fi
   else
     echo "Cannot check root file system because it is not mounted in"
     echo "read-only mode."
   fi
 fi

 # End /etc/init.d/checkroot




 1122..11..33..  UUppddaattiinngg //eettcc//iinniitt..dd//uummoouunnttffss


 +o  Edit the /etc/init.d/umounts file and put these lines as the first
    commands (under the "# Begin /etc/init.d/umountfs" line)


 echo "Deactivating swap..."
 /sbin/swapoff -av




 1122..11..44..  CCrreeaattiinngg pprrooppeerr ppeerrmmiissssiioonnss aanndd ccrreeaattiinngg ssyymmlliinnkk


 +o  Set the proper permissions on the checkroot file by running chmod
    755 /etc/init.d/checkroot

 +o  Create the proper symlink by running cd /etc/rcS.d; ln -s
    ../init.d/checkroot S05checkroot

 1122..22..  IInnssttaalllliinngg FFiillee


 +o  Unpack the File archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1122..33..  IInnssttaalllliinngg LLiibbttooooll


 +o  Unpack the Libtool archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1122..44..  IInnssttaalllliinngg MMoodduuttiillss


 +o  Unpack the Modutils archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1122..55..  IInnssttaalllliinngg LLiinnuuxx8866


 +o  Unpack the Linux86 archive

 +o  Go to the as directory and compile the programs there by running
    make

 +o  Copy the following binary to /usr/bin: as86

 +o  Go to the ld directory and compile the programs there by running
    make

 +o  Copy the following binary to /usr/bin: ld86

 1122..66..  IInnssttaalllliinngg LLiilloo

 1122..66..11..  IInnssttaalllliinngg LLiilloo


 +o  Unpack the Lilo archive

 +o  Compile the package by running make

 +o  Install the package by running make install

 1122..66..22..  CCoonnffiigguurriinngg LLiilloo



 +o  Copy the /etc/lilo.conf file from your normal Linux system to the
    /etc directory on the LFS system

 1122..66..33..  CCooppyyiinngg kkeerrnneell iimmaaggee ffiilleess


 +o  Copy the kernel images from the /boot directory from your normal
    Linux system to /boot on the LFS system

 1122..77..  IInnssttaalllliinngg DDPPKKGG

 We don't install the Debian Package manger itself, but a small program
 that is shipped with this package; the start-stop-daemon program. This
 program is very useful in boot scripts so we're going to use it.


 +o  Unpack the DPKG archive

 +o  Go to the scripts directory

 +o  Compile the start-stop-daemon program by running make start-stop-
    daemon

 +o  Copy the following binary /sbin: start-stop-daemon

 +o  Copy the following file to /usr/man/man8: start-stop-daemon.8

 1122..88..  IInnssttaalllliinngg SSyysskkllooggdd

 1122..88..11..  IInnssttaalllliinngg SSyysskkllooggdd


 +o  Unpack the Sysklogd archive

 +o  Compile the package by running make

 +o  Install the package by running make INSTALL=/bin/install install

 1122..88..22..  CCoonnffiigguurriinngg SSyysskkllooggdd


 +o  Create the /var/log directory

 +o  Create a new file /etc/syslog.conf containing the following:

 Please note that the white spaces must be tabs and not just hitting
 the space bar a few times.



















 #!/bin/sh
 # Begin /etc/syslog.conf

 auth,authpriv.*           /var/log/auth.log
 *.*;auth,authpriv.none    /var/log/syslog
 daemon.*                  /var/log/daemon.log
 kern.*                    /var/log/kern.log
 mail.*                    /var/log/mail.log
 user.*                    /var/log/user.log

 mail.info                 /var/log/mail.info
 mail.warn                 /var/log/mail.warn
 mail.err                  /var/log/mail.err

 *.=info;*.=notice;*.=warn; \
   auth,authpriv.none; \
   daemon.none             /var/log/messages

 *.emerg                   *

 # End /etc/syslog.conf




 1122..88..33..  CCrreeaattiinngg tthhee SSyysskkllooggdd bboooottssccrriipptt


 +o  Create a new file /etc/init.d/sysklogd containing the following:





































 #!/bin/sh
 # Begin /etc/init.d/sysklogd

 test -f /usr/sbin/klogd || exit 0
 test -f /usr/sbin/syslogd || exit 0

 check_status()
 {
   if [ $? = 0 ]
   then
     echo "OK"
   else
     echo "FAILED"
   fi
 }

 case "$1" in
   start)
     echo -n "Starting system log daemon..."
     start-stop-daemon -S -q -o -x /usr/sbin/syslogd -- -m 0
     check_status

     echo -n "Starting kernel log daemon..."
     start-stop-daemon -S -q -o -x /usr/sbin/klogd
     check_status
     ;;

   stop)
     echo -n "Stopping kernel log daemon..."
     start-stop-daemon -K -q -o -p  /var/run/klogd.pid
     check_status

     echo -n "Stopping system log daemon..."
     start-stop-daemon -K -q -o -p /var/run/syslogd.pid
     check_status
     ;;

   reload)
     echo -n "Reloading system load daemon configuration file..."
     start-stop-daemon -K -q -o -s 1 -p /var/run/syslogd.pid
     check_status
     ;;

   restart)
     echo -n "Stopping kernel log daemon..."
     start-stop-daemon -K -q -o -p /var/run/klogd.pid
     check_status

     echo -n "Stopping system log daemon..."
     start-stop-daemon -K -q -o -p /var/run/syslogd.pid
     check_status

     sleep 1

     echo -n "Starting system log daemon..."
     start-stop-daemon -S -q -o -x /usr/sbin/syslogd -- -m 0
     check_status

     echo -n "Starting kernel log daemon..."
     start-stop-daemon -S -q -o -x /usr/sbin/klogd
     check_status
     ;;

   *)
     echo Usage: $0 {start|stop|reload|restart}
     exit 1
     ;;
 esac

 # End /etc/init.d/sysklogd




 1122..88..44..  SSeettttiinngg uupp ssyymmlliinnkkss aanndd ppeerrmmiissssiioonnss


 +o  Set the proper permissions by running chmod 755
    /etc/init.d/sysklogd

 +o  Create the proper symlinks by running the following commands:


 cd /etc/rc2.d; ln -s ../init.d/sysklogd S03sysklogd
 cd ../rc6.d; ln -s ../init.d/sysklogd K90sysklogd
 cd ../rc0.d; ln -s ../init.d/sysklogd K90sysklogd




 1122..99..  IInnssttaalllliinngg GGrrooffff


 +o  Unpack the Groff archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1122..1100..  IInnssttaalllliinngg MMaann--ddbb


 +o  Unpack the Man-db archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1122..1111..  IInnssttaalllliinngg PPrrooccppss


 +o  Compile the package by running make

 +o  Edit the Makefile file and comment out the variable: _X_S_C_P_T

 +o  Install the package by running make install

 1122..1122..  IInnssttaalllliinngg PPrroocciinnffoo


 +o  Compile the package by running make

 +o  Install the package by running make install

 1122..1133..  IInnssttaalllliinngg PPrrooccmmiisscc



 +o  Compile the package by running make

 +o  Install the package by running make install

 1122..1144..  IInnssttaalllliinngg SShhaaddooww PPaasssswwoorrdd

 This package contains the utilities to modify user's passwords, add
 new users/groups, delete users/groups and more. I'm not going to
 explain to you what 'password shadowing' means. You can read all about
 that in the doc/HOWTO file. There's one thing you should keep in mind,
 if you decide to use shadow support, that programs that need to verify
 passwords (examples are xdm, ftp daemons, pop3d, etc) need to be
 'shadow-compliant', eg. they need to be able to work with shadowed
 passwords.

 If you decide you don't want to use shadowed passwords (after you're
 read the doc/HOWTO document), you still use this archive since the
 utilities in this archive are also used on system which have shadowed
 passwords disabled.  You can read all about this in the HOWTO. Also
 note that you can switch between shadow and non-shadow at any point
 you want.


 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 +o  Copy the following files from the etc directory to /etc: limits
    login.access login.defs.linux shells suauth

 +o  Rename the /etc/login.defs.linux to /etc/login.defs

 Now is a very good moment to read section #5 of the doc/HOWTO file.
 You can read how you can test if shadowing works and if not, how to
 disable it. If it doesn't work and you haven't tested it, you'll end
 up with an unusable system after you logout of all your consoles,
 since you won't be able to login anymore. You can easily fix this by
 passing the init=/sbin/sulogin parameter to the kernel, unpack the
 util-linux archive, go to the login-utils directory, build the login
 program and replace the /bin/login by the one in the util-linux
 package. Things are never hopelessly messed up, but you can avoid a
 hassle by testing properly and reading manuals ;)

 1133..  SSeettttiinngg uupp bbaassiicc nneettwwoorrkkiinngg

 1133..11..  IInnssttaalllliinngg NNeettkkiitt--bbaassee


 +o  Unpack the Netkit-base archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 +o  Copy the following files from the etc.sample directory to the /etc/
    directory: services protocols

 1133..22..  IInnssttaalllliinngg NNeett--ttoooollss


 +o  Unpack the Net-tools archive

 +o  Compile the package by running make

 +o  Install the package by running make install

 1133..22..11..  CCrreeaattiinngg tthhee //eettcc//iinniitt..dd//llooccaallnneett bboooottssccrriipptt


 +o  Create a new file /etc/init.d/localnet containing the following:


 #!/bin/sh
 # Begin /etc/init.d/localnet

 check_status()
 {
   if [ $? = 0 ]
   then
     echo "OK"
   else
     echo "FAILED"
   fi
 }

 echo -n "Setting up loopback device..."
 /sbin/ifconfig lo 127.0.0.1
 check_status

 echo -n "Setting up hostname..."
 /bin/hostname --file /etc/hostname
 check_status

 # End /etc/init.d/localnet




 1133..22..22..  SSeettttiinngg uupp ppeerrmmiissssiioonnss aanndd ssyymmlliinnkk


 +o  Set the proper permissions by running chmod 755
    /etc/init.d/localnet

 +o  Create the proper symlinks by running cd /etc/rcS.d; ln -s
    ../init.d/network S03localnet

 1133..22..33..  CCrreeaattiinngg tthhee //eettcc//hhoossttnnaammee ffiillee

 Create a new file /etc/hostname and put the hostname in it. This is
 not the FQDN (Fully Qualified Domain Name). This is the name you wish
 to call your computer in a network.

 1133..22..44..  CCrreeaattiinngg tthhee //eettcc//hhoossttss ffiillee

 If you want to configure a network card, you have to decide on the IP-
 address, FQDN and possible aliases for use in the /etc/hosts file. An
 example is:


 <myip> myhost.mydomain.org somealiases




 Make sure the IP-address is in the private network IP-address range.
 Valid ranges are:

 Class Networks
 A     10.0.0.0
 B     172.16.0.0 through 172.31.0.0
 C     192.168.0.0 through 192.168.255.0




 A valid IP address could be 192.168.1.1. A valid FQDN for this IP
 could be me.lfs.org

 If you're not going to use a network card, you still need to come up
 with a FQDN. This is necessary for programs like Sendmail to operate
 correctly (in fact; Sendmail won't run when it can't determine the
 FQDN).

 Here's the /etc/hosts file if you don't configure a network card:


 # Begin /etc/hosts (no network card version)
 127.0.0.1 me.lfs.org <contents of /etc/hostname> localhost
 # End /etc/hosts (no network card version)




 Here's the /etc/hosts file if you do configure a network card:


 # Begin /etc/hosts (network card version)
 127.0.0.1 localhost
 192.168.1.1 me.lfs.org <contents of /etc/hostname>
 # End /etc/hosts (network card version)




 Of course, change the 192.168.1.1 and me.lfs.org to your own liking
 (or requirements if you are assigned an IP-address by a network/system
 administrator and you plan on connecting this machine to that
 network).

 1133..22..55..  CCrreeaattiinngg tthhee //eettcc//iinniitt..dd//eetthhnneett ffiillee

 This sub section only applies if you are going to configure a network
 card.  If not, skip this sub section and read on.

 Create a new file /etc/init.d/ethnet containing the following:


















 #!/bin/sh
 # Begin /etc/init.d/ethnet

 check_status()
 {
   if [ $? = 0 ]
   then
     echo "OK"
   else
     echo "FAILED"
   fi
 }

 /sbin/ifconfig eth0 <ipaddress>
 check_status

 # End /etc/init.d/ethnet




 1133..22..66..  SSeettttiinngg uupp ppeerrmmiissssiioonnss aanndd ssyymmlliinnkk ffoorr //eettcc//iinniitt..dd//eetthhnneett


 +o  Set the proper permissions by running chmod 755 ethnet

 +o  Create the proper symlinks by running cd ../rc2.d; ln -s
    ../init.d/ethnet S10ethnet

 1133..22..77..  TTeessttiinngg tthhee nneettwwoorrkk sseettuupp


 +o  Start the just created localnet script by running
    /etc/init.d/localnet

 +o  Start the just created ethnet script if you have one by running
    /etc/init.d/ethnet

 +o  Test if /etc/hosts is properly setup by running:


 ping <your FQDN>
 ping <what you choose for hostname>
 ping localhost
 ping 127.0.0.1
 ping 192.168.1.1 (only when you configured your network card)




 All these five ping command's should work without failures. If so, the
 basic network is working.

 1144..  SSeettttiinngg uupp EEmmaaiill ssuubb ssyysstteemm

 1144..11..  PPrreeppaarriinngg ssyysstteemm ffoorr EEmmaaiill ssuubb ssyysstteemm

 1144..11..11..  CCrreeaattiinngg eexxttrraa ggrroouuppss aanndd uusseerr

 We need to add a few groups and a user which will be used by the email
 utilities.


 +o  Create the bin group by running groupadd -g 1 bin


 +o  Create the kmem group by running groupadd -g 2 kmem

 +o  Create the mail group by running groupadd -g 3 mail

 +o  Create the bin user by running useradd -u 1 -g bin -d /bin -s
    /bin/sh bin

 1144..11..22..  CCrreeaattiinngg ddiirreeccttoorriieess

 There are two directories used by the email sub system, thus we need
 to create them and give them the proper permissions.


 +o  Create the /var/spool directory

 +o  Create the /var/spool/mqueue directory

 +o  Create the /var/spool/mail directory

 +o  Set permissions on /tmp by running chmod 777 /tmp

 +o  Set permissions on /var/spool/mqueue by running chmod 700
    /var/spool/mqueue

 +o  Set permissions on /var/spool/mail by running chmod 775
    /var/spool/mail

 +o  Put /var/spool/mail in the mail group by running chgrp mail
    /var/spool/mail

 1144..22..  IInnssttaalllliinngg PPrrooccmmaaiill


 +o  Unpack the Procmail archive

 +o  Compile the package by running make

 +o  Install the package by running make install

 +o  Set the proper permissions on the Procmail utilities by running
    make install-suid

 1144..33..  IInnssttaalllliinngg SSeennddmmaaiill

 1144..33..11..  IInnssttaalllliinngg SSeennddmmaaiill


 +o  Unpack the Sendmail archive

 +o  Go to the src directory

 +o  Compile the package by running Build

 +o  Install the package by running Build install

 1144..33..22..  CCoonnffiigguurriinngg SSeennddmmaaiill

 Configuring Sendmail isn't as easily said as done. There are a lot of
 things you need to consider while configuring Sendmail and I can't
 take everything into account. That's why at this time we'll create a
 very basic and standard setup. If you want to tweak Sendmail to your
 own liking, go right ahead, but this is not the right article. You
 could always use your existing /etc/sendmail.cf (or
 /etc/mail/sendmail.cf) file if you need to use certain features.


 +o  Go to the cf directory

 +o  Create a new file cf/lfs.mc containing the following:


 OSTYPE(LFS)
 FEATURE(nouucp)
 define(`LOCAL_MAILER_PATH', /usr/bin/procmail)
 MAILER(local)
 MAILER(smtp)





 +o  Create an empty file ostype/lfs.m4 by running touch ostype/lfs.m4

 +o  Compile the lfs.mc file by running m4 m4/cf.m4 cf/lfs.cf >
    cf/lfs.cf

 +o  Copy the cf/lfs.cf to /etc/sendmail.cf

 +o  Create an empty /etc/aliases file by running touch /etc/aliases

 +o  Initialize this (empty) alias database by running sendmail -v -bi

 1144..44..  IInnssttaalllliinngg MMaaiillxx


 +o  Unpack the Mailx archive

 +o  Compile the package by running make *.c -o mail

 Ignore possible 'comparison between pointer and integer' and
 'assignments makes integer from pointer without a cast' warnings.
 You'll probably get quite a few of these. Though, the program seems to
 work just fine nevertheless.


 +o  Copy the following binary to /usr/bin: mail

 +o  Place the /usr/bin/mail program in the mail group by running chgrp
    mail /usr/bin/mail

 +o  Let the /usr/bin/mail program be executed sgid by running chmod
    2755 /usr/bin/mail

 1144..55..  CCrreeaattiinngg //eettcc//iinniitt..dd//sseennddmmaaiill bboooottssccrriipptt


 +o  Create a new file /etc/init.d/sendmail containing the following:















 #!/bin/sh
 # Begin /etc/init.d/sendmail

 check_status()
 {
   if [ $? = 0 ]
   then
     echo "OK"
   else
     echo "FAILED"
   fi
 }

 case "$i" in
   start)
     echo -n "Starting Sendmail..."
     start-stop-daemon -S -q -p /var/run/sendmail.pid \
         -x /usr/sbin/sendmail -- -bd
     check_status
     ;;

   stop)
     echo -n "Stopping Sendmail..."
     start-stop-daemon -K -q -p /var/run/sendmail.pid
     check_status
     ;;

   reload)
     echo -n "Reloading Sendmail configuration file..."
     start-stop-daemon -K -q -s 1 -p /var/run/sendmail.pid
     check_status
     ;;

   restart)
     echo -n "Stopping Sendmail..."
     start-stop-daemon -K -q -p /var/run/sendmail.pid
     check_status

     sleep 1

     echo -n "Starting Sendmail..."
     start-stop-daemon -S -q -p /var/run/sendmail.pid \
         -x /usr/sbin/sendmail -- -bd
     check_status
     ;;

   *)
     echo "Usage: $0 {start|stop|reload|restart}"
     exit 1
     ;;

 esac

 # End /etc/init.d/sendmail




 1144..66..  SSeettttiinngg uupp ppeerrmmiissssiioonnss aanndd ssyymmlliinnkkss


 +o  Set the proper permissions by running chmod 755
    /etc/init.d/sendmail

 +o  Create the proper symlinks by running:

 cd /etc/init.d/rc2.d; ln -s ../init.d/sendmail S20sendmail
 cd ../rc0.d; ln -s ../init.d/sendmail K20sendmail
 cd ../rc6.d; ln -s ../init.d/sendmail K20sendmail




 1144..77..  IInnssttaalllliinngg MMuutttt

 My favorite email client is Mutt, so that's why we're installing this
 one.  Feel free to skip the installation of Mutt and install your own
 favorite client.  After all, this is going to be your system. Not
 mine.

 If your favorite client is an X Window client (such as Netscape Mail)
 then you'll have to sit tight a little while till we've installed X.


 +o  Unpack the Mutt archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1144..88..  IInnssttaalllliinngg FFeettcchhmmaaiill


 +o  Unpack the Fetchmail archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1144..99..  TTeessttiinngg tthhee EEmmaaiill ssuubb ssyysstteemm

 It's time to test the email system now.


 +o  Start Sendmail by running /usr/sbin/sendmail -bd (you need to start
    sendmail using the full path. If you don't, you can't let sendmail
    reload the sendmail.cf by with kill -1 <sendmail pid>).

 +o  Send yourself an email by running echo "this is an email test" |
    mail -s test root

 +o  Start the mail program and you should see your email there.

 +o  Create a new user by running useradd -m testuser

 +o  Send an email to testuser by running echo "test mail to testuser" |
    mail -s test testuser

 +o  Login as testuser, try to obtain that email (using the mail
    program) and send an email to root in the same way as you send an
    email to testuser.

 If this all worked just fine, you have a working email system for
 local email. It's not necessarily ready for Internet yet. You can
 remove the testuser by running userdel -r testuser



 1155..  IInnssttaalllliinngg IInntteerrnneett SSeerrvveerrss

 In this section we're going to install three of the most used Internet
 servers, together with the necessary clients. These are going to be
 installed:

 telnetd with the standard telnet client

 proftpd with the standard ftp client

 apache with lynx as client

 1155..11..  IInnssttaalllliinngg tteellnneett ddaaeemmoonn ++ cclliieenntt


 +o  Unpack the Netkit-telnet archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1155..22..  IInnssttaalllliinngg PPrrooffttppdd


 +o  Unpack the Proftpd archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1155..33..  IInnssttaalllliinngg NNeettkkiitt--ffttpp


 +o  Unpack the Netkit-ftp archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1155..44..  IInnssttaalllliinngg AAppaacchhee

 Apache isn't that easily configured. Like with Sendmail, a lot depends
 on your own preference and system setup. Therefore, once I again I
 stick with a very basic installation. If this doesn't work well enough
 for you, read the documentation and modify whatever you need to.


 +o  Unpack the Apache archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1155..55..  IInnssttaalllliinngg SSllaanngg LLiibbrraarryy

 The Slang library is an alternative to the Ncurses library. We're
 going to use this library to link Lynx against. Though Lynx works fine
 with the Ncurses library, people recommend using the Slang library. I
 myself can't find a difference between a Lynx linked against the Slang
 library or against the Ncurses library.  However, I'll just follow
 that advise and use Slang.


 +o  Unpack the Slang archive

 +o  Configure the package by running configure

 +o  Compile the package by running make elf

 +o  Install the package by running make install-elf

 +o  Create extra symlinks for the library by running make install-links

 1155..66..  IInnssttaalllliinngg ZZlliibb

 Zlib is a compression library, used by programs like PKware's zip and
 unzip utilities. Lynx can use this library to compress certain files.


 +o  Unpack the Zlib archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1155..77..  IInnssttaalllliinngg LLyynnxx


 +o  Unpack the Lynx archive

 +o  Configure the package by running configure --libdir=/etc --with-
    zlib --with-screen=slang

 +o  Compile the package by running make

 +o  Install the package by running make install

 +o  Install the helpfile by running make install-help

 +o  Install other documentation by running make install-doc

 1155..88..  CCoonnffiigguurriinngg tthhee ddaaeemmoonnss

 It's possible to run the daemons in either stand-alone mode or via the
 Internet Server daemon (inetd). Where possible, I choose to run the
 daemons in stand-alone mode. This makes it easier to start and stop
 individual processes without modifying the /etc/inetd.conf file
 constantly.

 However, in the telnetd case it's better to run it via inetd, since
 telnetd doesn't seem to respawn itself when the last user logs out.
 This would mean as soon as the last person logs out from the telnet
 session, the telnet daemon stops as well. This isn't desirable, so we
 let telnetd run using inetd to spawn a telnet process whenever
 somebody logs on.

 1155..99..  CCoonnffiigguurriinngg tteellnneettdd

 1155..99..11..  CCrreeaattiinngg tthhee //eettcc//iinneettdd..ccoonnff ccoonnffiigguurraattiioonn ffiillee



 +o  Create a new file /etc/inetd.conf containing the following:


 # Begin /etc/inetd.conf

 telnet stream tcp nowait root /usr/sbin/in.telnetd

 # End /etc/inetd.conf




 1155..99..22..  CCrreeaattiinngg tthhee //eettcc//iinniitt..dd//iinneettdd bboooottssccrriipptt


 +o  Create a new file /etc/init.d/inetd containing the following:


















































 #!/bin/sh
 # Begin /etc/init.d/inetd

 check_status()
 {
   if [ $? = 0 ]
   then
     echo "OK"
   else
     echo "FAILED"
   fi
 }

 case "$1" in
   start)
     echo -n "Starting Internet Server daemon..."
     start-stop-daemon -S -q -p /var/run/inetd.pid \
          -x /usr/sbin/inetd
     check_status
     ;;

   stop)
     echo -n "Stopping Internet Server daemon..."
     start-stop-daemon -K -q -p /var/run/inetd.pid
     check_status
     ;;

   reload)
     echo -n "Reloading Internet Server configuration file..."
     start-stop-daemon -K -q -s 1 -p /var/run/inetd.pid
     check_status
     ;;

   restart)
     echo -n "Stopping Internet Server daemon..."
     start-stop-daemon -K -q -p /var/run/inetd.pid
     check_status

     sleep 1

     echo -n "Starting Internet Server daemon..."
     start-stop-daemon -S -q -p /var/run/inetd.pid \
         -x /usr/sbin/inetd
     check_status
     ;;

   *)
     echo "Usage: $0 {start|stop|reload|restart}"
     ;;

 esac

 # End /etc/init.d/inetd




 1155..99..33..  SSeettttiinngg uupp ppeerrmmiissssiioonnss aanndd ssyymmlliinnkkss


 +o  Set the proper permissions by running chmod 755 /etc/init.d/inetd

 +o  Create the necessary symlinks by running



 cd /etc/rc2.d; ln -s ../init.d/inetd S30inetd
 cd ../rc0.d; ln -s ../init.d/inetd K30inetd
 cd ../rc6.d; ln -s ../init.d/inetd K30 inetd




 1155..1100..  CCoonnffiigguurriinngg pprrooffttppdd

 1155..1100..11..  CCrreeaattiinngg nneecceessssaarryy ggrroouuppss aanndd uusseerrss


 +o  Create the necessary groups by running:


 groupadd -g 65534 nogroup
 groupadd -g 4 ftp





 +o  Create the necessary users by running:


 useradd -u 65534 -g nogroup -d /home nobody
 useradd -u 4 -g ftp -m ftp




 1155..1100..22..  CCrreeaattiinngg tthhee //eettcc//iinniitt..dd//pprrooffttppdd bboooottssccrriipptt


 +o  Create a new file /etc/init.d/proftpd containing the following:































 #!/bin/sh
 # Begin /etc/init.d/proftpd

 check_status()
 {
   if [ $? = 0 ]
   then
     echo "OK"
   else
     echo "FAILED"
   fi
 }

 case "$1" in
   start)
     echo -n "Starting Pro FTP daemon..."
     start-stop-daemon -S -q -x /usr/sbin/proftpd
     check_status
     ;;

   stop)
     echo -n "Stopping Pro FTP daemon..."
     start-stop-daemon -K -q -x /usr/sbin/proftpd
     check_status
     ;;

   restart)
     echo -n "Stopping Pro FTP daemon..."
     start-stop-daemon -K -q -x /usr/sbin/proftpd
     check_status

     sleep 1

     echo -n "Starting Pro FTP daemon..."
     start-stop-daemon -S -q -x /usr/sbin/proftpd
     check_status
     ;;

   *)
     echo "Usage: $0 {start|stop|restart}"
     ;;

 esac

 # End /etc/init.d/proftpd




 1155..1100..33..  SSeettttiinngg uupp ppeerrmmiissssiioonnss aanndd ssyymmlliinnkkss


 +o  Set the proper permissions by running chmod 755 /etc/init.d/proftpd

 +o  Create the necessary symlinks by running:


 cd /etc/rc2.d; ln -s ../init.d/proftpd S40proftpd
 cd ../rc0.d; ln -s ../init.d/proftpd K40proftpd
 cd ../rc6.d; ln -s ../init.d/proftpd K40proftpd






 1155..1111..  CCoonnffiigguurriinngg aappaacchhee

 1155..1111..11..  EEddiittiinngg aappaacchhee ccoonnffiigguurraattiioonn ffiillee

 Edit the files in the /usr/apache/etc directory and modify them
 according to your own needs.


 +o  Edit the httpd.conf file and find the variable: _G_r_o_u_p

 +o  Replace the current value (if any) with: _n_o_g_r_o_u_p

 1155..1111..22..  CCrreeaattiinngg //eettcc//iinniitt..dd//aappaacchhee bboooottssccrriipptt


 +o  Create a new file /etc/init.d/apache containing the following:


 #!/bin/sh
 # Begin /etc/init.d/apache

 case "$1" in
   start)
     echo -n "Starting Apache HTTP daemon..."
     /usr/apache/sbin/apachectl start
     ;;

   stop)
     echo -n "Stopping Apache HTTP daemon..."
     /usr/apache/sbin/apachectl stop
     ;;

   restart)
     echo -n "Restarting Apache HTTP daemon..."
     /usr/apache/sbin/apachectl restart
     ;;

   force-restart)
     echo -n "Stopping Apache HTTP daemon..."
     /usr/apache/sbin/apachectl stop

     sleep 1

     echo -n "Starting Apache HTTP daemon..."
     /usr/apache/sbin/apachectl start
     ;;

   *)
     echo "Usage: $0 {start|stop|restart|force-restart}"
     ;;

 esac

 # End /etc/init.d/apache




 1155..1111..33..  SSeettttiinngg uupp ppeerrmmiissssiioonnss aanndd ssyymmlliinnkkss


 +o  Set the proper permissions by running chmod 755 /etc/init.d/apache

 +o  Create the necessary symlinks by running:


 cd /etc/rc2.d; ln -s ../init.d/apache S50apache
 cd ../rc0.d; ln -s ../init.d/apache K50apache
 cd ../rc6.d; ln -s ../init.d/apache K50apache




 1155..1122..  TTeessttiinngg tthhee ddaaeemmoonnss

 The last step in this section is testing the just installed and
 configured daemons.


 +o  Start the Internet Server daemon (and with it telnetd) by running
    /etc/init.d/inetd start

 +o  Start a telnet session to localhost by running telnet localhost

 +o  Login and logout again.

 +o  Start the Pro ftp daemon by running /etc/init.d/proftpd start

 +o  Start a ftp session to localhost by running ftp localhost

 +o  Login as user anonymous and logout again.

 +o  Start the Apache http daemon by running /etc/init.d/apache start

 +o  Start a http session to localhost by running lynx http://localhost

 +o  Exit lynx.

 If these tests ran without trouble, the daemons are all working fine.

 1166..  IInnssttaalllliinngg XX WWiinnddooww SSyysstteemm

 1166..11..  IInnssttaalllliinngg XX


 +o  Unpack the X archive

 +o  Compile the package by running make World

 During the compilation process you will encounter a few errors about
 the "makedepend" script not being able to find the stddef.h stdarg.h
 and float.h header files. The script just isn't as smart as the
 compiler is apparently, since the compilation itself does work fine
 without compilation errors. Though, creating a few temporary symlinks
 won't solve the problem; they only will cause more problems for some
 reason.

 So you just ignore the many makedepend errors you most likely will be
 getting.  Also errors similar to "pointer targets in passing arg x of
 somefunction differ in signedness". You can rewrite those files if you
 feel like it. I won't.


 +o  Install the package by running make install

 +o  Install the man pages by running make install.man

 1166..22..  CCrreeaattiinngg //eettcc//lldd..ssoo..ccoonnff

 Create a new file /etc/ld.so.conf containing the following:


 # Begin /etc/ld.so.conf

 /lib
 /usr/lib
 /usr/X11R6/lib

 # End /etc/ld.so.conf





 +o  Update the dynamic loader cache by running ldconfig

 1166..33..  MMooddiiffyyiinngg //eettcc//mmaann__ddbb..ccoonnffiigg


 +o  Edit the /etc/man_db.config file and look for this line:
    _M_A_N_D_A_T_O_R_Y___M_A_N_P_A_T_H _/_u_s_r_/_m_a_n

 +o  Under that line put the following one: _M_A_N_D_A_T_O_R_Y___M_A_N_P_A_T_H
    _/_u_s_r_/_X_1_1_R_6_/_m_a_n

 1166..44..  CCrreeaattiinngg tthhee //uussrr//iinncclluuddee//XX1111 ssyymmlliinnkk


 +o  In order for the pre-processor to find the X11/*.h files (which you
    encounter in #include statements in source code) create the
    following symlink: ln -s /usr/X11R6/include/X11 /usr/include/X11

 1166..55..  CCrreeaattiinngg tthhee //uussrr//XX1111 ssyymmlliinnkk

 Often software copies files to /usr/X11 so it doesn't have to know
 which release of X you are using. This symlink hasn't been created by
 the X installation, so we have to create it by ourselves.


 +o  Create the /usr/X11 symlink by running ln -s /usr/X11R6 /usr/X11

 1166..66..  AAddddiinngg //uussrr//XX1111//bbiinn ttoo tthhee $$PPAATTHH eennvviirroonnmmeenntt vvaarriiaabbllee

 There are a few ways to add the /usr/X11/bin path to the $PATH
 environment variable. One way of doing so is the following:


 +o  Create a new file /root/.bashrc with it's contents as follows:
    _e_x_p_o_r_t _P_A_T_H_=_$_P_A_T_H_:_/_u_s_r_/_X_1_1_/_b_i_n

 You need to login again for this change to become effective. Or you
 can update the path by running export PATH=$PATH:/usr/X11/bin manually

 1166..77..  CCoonnffiigguurriinngg XX


 +o  Configure the X server by running xf86config

 If the XF86Config file created by xf86config doesn't suffice, then you
 better copy the already existing XF86Config from your normal Linux
 system to /etc. Cases wherein you need to make special changes to the
 file which aren't supported by the xf86config program force you to do
 this. You can always modify the created XF86Config file by hand. This
 can be very time consuming, especially if you don't quite remember
 what needs to be changed.



 1166..88..  TTeessttiinngg XX

 Now that X is properly configured it's time for our first test run.


 +o  Start the X server by running startx

 The X server should start and display 3 xterm's on your screen. If
 this is true in your case, X is running fine.

 1177..  IInnssttaalllliinngg WWiinnddooww MMaakkeerr

 I choose to install Window Maker as the Window Manager. This is
 because I've used WindowMaker for quite a while now and I'm very
 satisfied with it.  As usual, you don't have to do what I'm doing;
 install whatever you want. As you might know, you can install several
 Window Managers simultaneously and choose which one to start by
 specifying it in the $HOME/.xinitrc (or $HOME/.xsession in case you
 decide to use xdm) file.

 1177..11..  PPrreeppaarriinngg tthhee ssyysstteemm ffoorr tthhee WWiinnddooww MMaakkeerr iinnssttaallllaattiioonn

 1177..11..11..  IInnssttaalllliinngg lliibbPPrrooppLLiisstt


 +o  Unpack the libPropList archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1177..11..22..  IInnssttaalllliinngg lliibbXXppmm


 +o  Unpack the libXpm archive

 +o  Prepare the compilation by running xmkmf; make Makefiles; make
    includes; make depend

 Ignore the warning about not being able to find the X11/xpm.h file
 from make depend.


 +o  Compile the package by running make

 The compilation process will abort because the X11/xpm.h file cannot
 be found. So we install this file now and then recompile.


 +o  Go to the lib directory

 +o  Install the libraries and header files by running make install

 +o  Go to the top level directory and recompile the package by running
    make

 +o  Install the rest of the package by running make install

 1177..11..33..  IInnssttaalllliinngg lliibbppnngg


 +o  Unpack the libpng archive


 +o  Compile the package by running make -f scripts/makefile.lnx

 +o  Install the package by running make -f scripts/makefile.lnx install

 1177..11..44..  IInnssttaalllliinngg lliibbttiiffff


 +o  Unpack the libtiff archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1177..11..55..  IInnssttaalllliinngg lliibbjjppeegg


 +o  Unpack the libjpeg archive

 +o  Configure the package by running configure --enable-shared
    --enable-static

 +o  Compile the library by running make libjpg.la

 +o  Compile the tools and install the package by running make install

 1177..11..66..  IInnssttaalllliinngg lliibbuunnggiiff


 +o  Unpack the libungif archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1177..11..77..  IInnssttaalllliinngg WWiinnddoowwMMaakkeerr


 +o  Unpack the WindowMaker archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1177..22..  UUppddaattiinngg ddyynnaammiicc llooaaddeerr ccaacchhee


 +o  Update the dynamic loader cache by running ldconfig

 1177..33..  CCoonnffiigguurriinngg WWiinnddoowwMMaakkeerr

 Every user who wishes to use WindowMaker has to run the wmaker.inst
 script before he or she can use it. This script will copy the
 necessary files into the user's home directory and modify the
 $HOME/.xinitrc file (or create it if it's not there yet).


 +o  Setup WindowMaker for yourself by running wmaker.inst



 1177..44..  TTeessttiinngg WWiinnddoowwMMaakkeerr


 +o  Start the X server and see if the WindowMaker Window Manager starts
    properly by running startx

 1188..  CCoonnffiigguurriinngg ssyysstteemm ffoorr IInntteerrnneett

 1188..11..  CCoonnffiigguurriinngg KKeerrnneell

 Before you can logon to the Internet, the kernel must be ppp-aware.
 You can accomplish this by compiling ppp-support directly into the
 kernel, or compiling the ppp drivers are modules which you load when
 you need them. Whatever you prefer, do it now by re-configuring the
 kernel if necessary. If your LFS kernel is already ppp-aware than you
 don't have to re-configure the kernel.

 1188..22..  CCrreeaattiinngg ggrroouuppss aanndd ddiirreeccttoorriieess


 +o  Create the daemon group by running groupadd -g 5 daemon

 +o  Create the /var/lock directory by running mkdir /var/lock

 1188..33..  IInnssttaalllliinngg PPPPPP


 +o  Unpack the PPP archive

 +o  Configure the package by running configure

 +o  Compile the package by running make

 +o  Install the package by running make install

 1188..44..  CCrreeaattiinngg //eettcc//rreessoollvv..ccoonnff


 +o  Create a new file /etc/resolv.conf containing the following:


 # Begin /etc/resolv.conf

 nameserver <IP address of your ISP's primairy DNS server>
 nameserver <IP address of your ISP's secundairy DNS server>

 # End /etc/resolv.conf




 1188..55..  CCrreeaattiinngg tthhee ccoonnnneecctt aanndd ddiissccoonnnneecctt ssccrriippttss


 +o  Create a new file /usr/bin/pon file containing the following:


 #!/bin/sh
 # Begin /usr/bin/pon

 /usr/sbin/pppd call provider

 # End /usr/bin/pon



 +o  Create a new file /usr/bin/poff file containing the following:


 #!/bin/sh
 # Begin /usr/bin/poff

 set -- `cat /var/run/ppp*.pid`

 case $# in
   0)
     kill -15 `ps axw|grep "pppd call [[allnum:]]+"|grep -v grep|awk '{print $1}'`
     exit 0
     ;;
   1)
     kill -15 $1
     exit 0
     ;;
 esac

 # End /usr/bin/poff




 1188..66..  CCrreeaattiinngg //eettcc//pppppp//ppeeeerrss//pprroovviiddeerr


 +o  Create the /etc/ppp/peers directory

 +o  Create a new file /etc/ppp/peers/provider containing the following:


 # Begin /etc/ppp/peers/provider

 noauth
 connect "/usr/sbin/chat -v -f /etc/chatscripts/provider"
 /dev/ttyS1
 115200
 defaultroute
 noipdefault

 # End /etc/ppp/peers/provider




 1188..77..  CCrreeaattiinngg //eettcc//cchhaattssccrriippttss//pprroovviiddeerr


 +o  Create the /etc/chatscripts directory

 +o  Create a new file /etc/chatscripts/provider containing the
    following:













 # Begin /etc/chatscripts/provider

 ABORT BUSY
 ABORT "NO CARRIER"
 ABORT VOICE
 ABORT "NO DIALTONE"
 ABORT "NO ANSWER"
 "" ATZ
 OK ATDT <ISP's phonenumber>
 TIMEOUT 35
 CONNECT ''
 TIMEOUT 10
 ogin: \q<username>
 TIMEOUT 10
 assword: \q<mysecretpassword>

 # End /etc/chatscripts/provider




 1188..88..  NNoottee oonn ppaasssswwoorrdd aauutthheennttiiccaattiioonn

 As you see from the sample scripts (these are the actual scripts I'm
 using myself) above I logon to my ISP using this chatscripts in stead
 of authenticating via pap or chap. Though my ISP supports pap, I
 choose to do it this slightly different way which has it's
 disadvantages and advantages. In my case the advantages outweigh the
 disadvantages. This way I have more control over my logon procedure
 and I can see closer what is happening when.

 For example most times when I connect I have a window running tail -f
 /var/log/syslog so I can keep an eye on when things like the username
 and password are sent.

 1188..99..  OOtthheerr rreessoouurrcceess

 For a far more detailed guide on how to set up Internet, I refer to
 Egil Kvaleberg's _I_S_P_-_H_o_o_k_u_p_-_H_O_W_T_O which is available from the LDP site
 at http://www.linuxdoc.org/

 1199..  MMiiggrraattiioonnss ffrroomm oolldd ttoo nneeww sseettuuppss

 This section is only to be used by people who have installed a LFS
 system using previous versions of this HOWTO. If a major change in an
 installation approach has taken place, you first need to take some
 actions such as removing existing files from a package before you can
 re-install that package. This section is used to assist people who
 obtained an old, obsolete version of this HOWTO and after installing
 the LFS system noticed that there's a new HOWTO (like this one) fixing
 things that went wrong in the older versions.

 1199..11..  MMiiggrraattiinngg ffrroomm oolldd CC++++ LLiibbrraarryy sseettuupp ttoo tthhee nneeww sseettuupp

 This section only applies to people who have previously installed the
 C++ Library using LFS-HOWTO version 1.0, 1.1 or 1.2.


 +o  Remove the following directory and symlinks: /usr/include/g++*

 1199..22..  MMiiggrraattiinngg ffrroomm oolldd ccoommppiilleerr sseettuupp ttoo tthhee nneeww sseettuupp

 This section only applies to people who have previously installed
 compilers using LFS-HOWTO 1.0, 1.1 or 1.2.


 +o  Remove the following files from the $LFS/usr/bin directory: cc cpp
    c++ gcc gcj gcjh g77 g++ protoize unprotoize

 +o  Remove the following directories: $LFS/usr/lib/gcc-lib
    $LFS/usr/gcc2723

 2200..  CCooppyyrriigghhtt && LLiicceennssiinngg IInnffoorrmmaattiioonn

 Copyright (C) 1999 by Gerard Beekmans. This document may be
 distributed only subject to the terms and conditions set forth in the
 LDP License at http://www.linuxdoc.org/COPYRIGHT.html.

 It is not necessary to display the license notice, as described in the
 LDP License, when only a small part of this document (the HOWTO) is
 quoted for informational or similar purposes. However, I do require
 you to display with the quotation(s) a line similar to the following
 line: "Quoted from the LFS-HOWTO at http://huizen.dds.nl/~glb/