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/