Copyright © 1999, 2000, 2001 by Gerard Beekmans
Copyright (c) 1999-2001, Gerard Beekmans
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions in any form must retain the above copyright notice, this list of conditions and the following disclaimer.
Neither the name of "Linux From Scratch" nor the names of its contributors may be used to endorse or promote products derived from this material without specific prior written permission.
Any material derived from Linux From Scratch must contain a reference to the "Linux From Scratch" project.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This book is dedicated to my loving and supportive wife Beverly Beekmans.
Having used a number of different Linux distributions, I was never fully satisfied with any of them. I didn't like the way the bootscripts were arranged, I didn't like the way certain programs were configured by default, and more of those things. I came to realize that if I wanted to be fully satisfied with a Linux system, I would have to build my own system from scratch, ideally using only the source code. Not using pre-compiled packages of any kind. No help from some sort of CD-ROM or bootdisk that would install some basic utilities. I would use my current Linux system and use that one to build my own.
This, at one time, wild idea seemed very difficult and at times almost impossible. After sorting out all kinds of dependency problems, compile problems, etcetera, a custom-built Linux system was created and fully operational. I called this system an LFS system, which stands for Linux From Scratch.
I hope all of you will have a great time working on LFS!
--
Gerard Beekmans
gerard@linuxfromscratch.org
There are a lot of reasons why somebody would want to read this book in order to install an LFS system. The question most people raise is "why go through all the hassle of manually installing a Linux system from scratch when you can just download an existing version like Debian or Redhat". That is a valid question which I hope to answer for you.
The most important reason for LFS's existence is teaching people how a Linux system works internally. Building an LFS system teaches you about all that makes Linux tick, how things work together, and depend on each other. And most importantly, how to customize it to your own taste and needs.
One of the key benefits of LFS is that you are in control over your system without having to rely on somebody else's Linux implementation like Debian. You are in the driver's seat now and are able to dictate every single thing such as the directory layout and boot script setup. You will also know exactly where, why and how programs are installed.
Another benefit of LFS is that you can create a very compact Linux system. When you install a distribution like Debian or RedHat, you end up installing a lot of programs you would never in your life use. They're just sitting there taking up (precious) disk space. It's not hard to get an LFS system installed under 100 MB. Does that still sound like a lot? A few of us have been working on creating a very small embedded LFS system. We installed a system that was just enough to run the Apache web server; total disk space usage was aproximately 8 MB. With further stripping, that can be brought down to 5 MB or less. Try that with a generic Debian or Redhat distribution.
If we were to compare a Linux distribution with a hamburger you buy at a supermarket or fast-food restaurant, you would end up eating it without knowing precisely what it is you are eating, whereas LFS gives you the ingredients to make a hamburger. This allows you to carefully inspect it, remove unwanted ingredients, and at the same time allow you to add ingredients to enhance the flavour of your hamburger. When you are satisfied with the ingredients, you go on to the next part of putting it together. You now have the chance to make it just the way you like it: broil it, bake it, deep-fry it, barbeque it, or eat it raw.
Another analogy that we can use is that of comparing LFS with a finished house. LFS will give you the skeleton of a house, but it's up to you to install plumbing, electrical outlets, kitchen, bathtub, wallpaper, etc.
Another advantage of a custom built Linux system is added security. You will compile the entire system from source, thus allowing you to audit everything, if you wish to do so, and apply all the security patches you want or need to apply. You don't have to wait for somebody else to provide a new binary package that fixes a security hole. Besides, you have no guarantee that the new package actually fixes the problem (adequately). You never truly know whether a security hole is fixed or not unless you do it yourself.
People who don't want to build an entire Linux system from scratch probably don't want to read this book. If you, however, want to learn more about what happens behind the scenes, in particular what happens between turning on the computer and seeing the command prompt, you may want to read the "From Power Up To Bash Prompt" (P2B) HOWTO. This HOWTO builds a bare system, in a way similar to the one this book uses, but it focuses more on just installing a bootable system instead of a complete system.
To decide whether to read this book or the P2B HOWTO, ask yourself this question: "Is my main objective to get a working Linux system that I'm going to build myself and, along the way learn what every component of a system is for? Or is just the learning part my main objective?" If you want to build and learn, read this book. If you just want to learn the basics, then the P2B HOWTO is probably better material to read.
The "From Power Up To Bash Prompt" HOWTO is located at http://www.netspace.net.au/~gok/power2bash/
This book is divided into the following parts. Although most of the appendices is copied into part II (which enlarges the book somewhat), we believe it's the easiest way to read it like this. It simply saves you from having to click to an Appendix, then back to where you were in part II. That's a real chore especially if you're reading the TXT version of this book.
Part One gives general information about this book (versions, where to get it, changelog, mailing lists, and how to get in touch with us). It also explains a few important aspects you really want and need to read before starting to build an LFS system.
Part Two guides you through the installation of the LFS system which will be the foundation for the rest of the system. Whatever you choose to do with your brand new LFS system, it will be built on the foundation that's installed in this part.
We are going to build the LFS system by using an already installed Linux distribution such as Debian, SuSe, Slackware, Mandrake, RedHat, etc. There is no 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).
After you have downloaded the necessary packages that make up an LFS system you will create a new Linux native partition onto which the LFS system will be installed.
The next step, chapter 5, will be the installation of a number of packages that are statically linked and installed on the LFS partition. These packages form a basic development suite which will be used to install the actual system, and are also needed to resolve circular dependencies. Examples of circular dependencies are: you need a compiler to install a compiler. You need a shell in order to install a shell. And so on.
Chapter 6 installs the actual base system. We use the chroot program to start a new shell whose root directory will be set to the LFS partition. This, in essence, is the same as rebooting and have the kernel mount the LFS partition as the root partition. The reason that we don't actually reboot, but instead chroot, is that this way you can still use your host system. While software is being installed you can simply switch to a different VC (Virtual Console) or X desktop and continue using your computer as you normally would.
When all the software is installed, chapter 7 will setup the boot scripts. Chapter 8 will setup the Linux boot loader and in chapter 9 there are some pointers what you can do after you finish the book. Then you can finally reboot your system into your new LFS system, and start to really use it.
This is the process in a nutshell. Detailed information on the steps you are taking are provided in the chapters as you go through them. If something isn't completely clear yet, don't worry. It will become very clear shortly.
Please read chapter 2 carefully as it explains a few important things you need to be aware of before you work your way through chapters 5 and above.
To make things easy to follow, there are a number of conventions used throughout the book. Following are some examples:
./configure --prefix=/usr
This form of text is designed to be typed exactly as seen unless otherwise noted in the surrounding text. It is also used in the explanation sections to identify which of the commands is being referred to.
install-info: unknown option `--dir-file=/mnt/lfs/usr/info/dir'
This form of text (fixed width text) is showing screen output, probably as the result of commands issued and is also used to show filenames such as /etc/lilo.conf
Emphasis
This form of text is used for several purposes in the book but mainly to emphasise important points or to give examples as to what to type.
http://www.linuxfromscratch.org/
This form of text is used for hyperlinks, both within the book and to external pages such as HowTo's, download locations, websites, etc.
cat > $LFS/etc/group << "EOF" root:x:0: bin:x:1: ...... EOF
This type of section is used mainly when creating configuration files. The first command (in bold) tells the system to create the file $LFS/etc/group from whatever is typed on the following lines until the sequence EOF is encountered. Therefore, this whole section is generally typed as seen.
This is LFS-BOOK version 3.0-rc2 dated September 8th, 2001. If this version is older than a month a newer version is probably already available for download. Check one of the mirror sites below for updated versions.
Below is a list of our current HTTP and FTP mirror sites as of August 29th, 2001. This list might not be accurate anymore. The latest info can be found on our website at http://www.linuxfromscratch.org.
Fremont, California, USA [100 Mbit] - http://www.linuxfromscratch.org/lfs/intro.shtml
Columbus, Ohio, United States [1 Mbit] - http://www.us.linuxfromscratch.org/lfs/intro.shtml
Whitinsville, Massachusetts, USA [640 Kbit] - http://www.us2.linuxfromscratch.org/lfs/intro.shtml
Canmore, Alberta, Canada [2 Mbit] - http://www.ca.linuxfromscratch.org/lfs/intro.shtml
Braunschweig, Germany [10 Mbit] - http://www.de.linuxfromscratch.org/lfs/intro.shtml
Mainz, Germany [1.5 Mbit] - http://lfs.linux-provider.net/lfs/intro.shtml
Vienna Univ. of Technology, Austria [16 Mbit] - http://www.at.linuxfromscratch.org/lfs/intro.shtml
Oslo, Norway [100 Mbit] - http://www.no.linuxfromscratch.org/lfs/intro.shtml
Teeside, United Kingdom [256 Kbit] - http://www.linuxfromscratch.co.uk/lfs/intro.shtml
Fremont, California, USA [FTP] [100 Mbit] - ftp://ftp.linuxfromscratch.org
Fremont, California, USA [HTTP] [100 Mbit] - http://ftp.linuxfromscratch.org
Canmore, Alberta, Canada [FTP] [2 Mbit] - ftp://ftp.ca.linuxfromscratch.org/pub/lfs/
Canmore, Alberta, Canada [HTTP] [2 Mbit] - http://ftp.ca.linuxfromscratch.org/pub/lfs/
Vienna Univ. of Tech., Austria [FTP] [16 Mbit] - ftp://ftp.at.linuxfromscratch.org/lfs/packages
Vienna Univ. of Tech., Austria [HTTP] [16 Mbit] - http://ftp.at.linuxfromscratch.org/lfs/packages
Oslo, Norway [FTP] [100 Mbit] - ftp://ftp.no.linuxfromscratch.org/mirrors/lfs/
We would like to thank the following people and organizations for their contributions toward the Linux From Scratch project:
Mark Stone <mstone@linux.com> for donating the linuxfromscratch.org servers.
VA Linux Systems for providing rackspace and bandwidth for the linuxfromscratch.org server.
Mark Hymers <markh@linuxfromscratch.org> for being more than a great help in editing this book.
DREAMWVR.COM for their ongoing sponsorship by donating various resources to the LFS and related sub projects.
Jesse Tie Ten Quee <highos@highos.com> for running the www.ca.linuxfromscratch.org mirror.
Jan Niemann <jan.niemann@tu.bs.de> for running the www.de.linuxfromscratch.org mirror.
Torsten Westermann <westermann@linux-provider.net> for running the lfs.linux-provider.net mirror.
Ian Chilton <ian@ichilton.co.uk> for running the www.us.linuxfromscratch.org and www.linuxfromscratch.co.uk mirrors.
Dag Stenstad <dag@stenstad.net> for providing the www.no.linuxfromscratch.org mirror, and Ian Chilton <ian@ichilton.co.uk> for running it.
Antonin Sprinzl <Antonin.Sprinzl@tuwien.ac.at> for running the www.at.linuxfromscratch.org mirror.
Jason Andrade <jason@dstc.edu.au> for running the www.au.linuxfromscratch.org mirror.
Ian Cooper <ian@wpi.edu> for running the www.us2.linuxfromscratch.org mirror.
VA Linux Systems who, on behalf of Linux.com, donated a VA Linux 420 (former StartX SP2) workstation towards this project.
Johan Lenglet <johan@linuxfromscratch.org> for leading the French LFS translation project.
Jesse Tie Ten Quee <highos@highos.com> for donating a Yamaha CDRW 8824E cd writer.
O'Reilly for donating books on SQL and PHP.
Robert Briggs for donating the linuxfromscratch.org and linuxfromscratch.com domain names.
Frank Skettino <bkenoah@oswd.org> at OSWD for coming up the initial design of the LFS website.
Garrett LeSage <garrett@linux.com> for creating the LFS banner
Dean Benson <dean@vipersoft.co.uk> for helping out financially with setting up the LFS non-profit organization.
Countless other people on the various LFS mailinglists who are making this book happen by giving their suggestions, testing the book and submitting bug reports.
3.0-rc2 - September 8th, 2001
Updated to:
sysvinit-2.82
September 7th, 2001 [gerard]: Chapter 6 - Sysvinit: Seperated the commands to change the status msg in init.c from the main commands.
September 7th, 2001 [gerard]: Chapter 6 - Bash: Added --login to the exec /bin/bash command.
September 7th, 2001 [gerard]: Chapter 5 - GCC: Removed duplicate explanation (the patch and --enable-languages ones) that are already in chapter 5 - gcc.
September 7th, 2001 [markh]: Chapter 6 - Sysvinit: updated to 2.82.
September 7th, 2001 [gerard]: Chapter 2: Added "How to ask for help" section.
September 7th, 2001 [gerard]: Chapter 6 - Makedev: changed chmod to 754. Makes more sense, non-root can't run it anways.
September 6th, 2001 [markh]: Chapter 5 - Diffutils, Grep and Sed: Moved the export CPPFLAGS fixes out of the main install instructions and explained when they are necessary.
September 5th, 2001 [markh]: Chapter 5 - Gzip and Sh-utils: Moved the patches out of the main install instructions to a seperate section as we already do with the tar patch. Also removed gzip-exp.xml and shellutils-exp.xml as the explanations are now part of the installation text.
September 5th, 2001 [gerard]: Chapter 5 - Bash: Added notes that the ncurses-dev package must be installed and the libcurses.a symlink created if missing. Added --with-curses back to Bash's installation, this now functions as a good test to make sure ncurses is installed (if not, texinfo will fail).
September 5th, 2001 [gerard]: Chapter 6 - Net-tools: Instead of running make install, we now run make update. It does the same, except make update doesn't make backup of programs it's replacing.
September 5th, 2001 [markh]: Chapter 6 - Procinfo: Removed sed and replaced with a flag to make.
September 5th, 2001 [markh]: Chapter 6 - E2fsprogs: Added explanation as to why we use --with-root-prefix=/
September 5th, 2001 [gerard]: Chapter 6 - E2fsprogs: We can supply a value to --with-root-prefix now. It's not necessary, but it makes things a lot clearer.
September 5th, 2001 [markh]: Chapter 6 - E2fsprogs: Removed command to move mklost+found to /sbin.
September 5th, 2001 [gerard]: Chapters 5 & 6: Added notes to the gcc, binutils and glibc installations that these packages behave badly when the default optimization flags are changed and should be left alone.
September 4th, 2001 [gerard]: Chapter 6-Bzip2: Added ln command to create /lib/libbz2.so
September 2nd, 2001 [gerard]: Appendix A - Psmisc: This package provides a pidof as well, added explanation of it.
September 2nd, 2001 [gerard]: Chapter 6 - Ed, Vim, Shadow: Added missing && after the sed and echo commands.
September 1st, 2001 [gerard]: Changed links to other areas in the book to xml xref tags so you can click on them when reading non-html formats (like pdf).
September 1st, 2001 [gerard]: Chapter 1 - Contact information: Changed the text to use one of the mailing lists, not just lfs-discuss (and provide a link to maillist.xml for the mailing lists list).
August 31st, 2001 [gerard]: Chapter7 - mountfs, functions: Added the -f option to the rm command that removes fastboot and forcecheck. This option should never have been removed in the first place.
3.0-RC1 - August 31st, 2001
Updated to:
MAKEDEV-1.3
autoconf-2.52
automake-1.5
binutils-2.11.2
e2fsprogs-1.23
file-3.36
gcc-2.95.3
gettext-0.10.39
glibc-2.2.4
groff-1.17.2
linux-2.4.8
man-pages-1.39
modutils-2.4.7
sysvinit-2.81
util-linux-2.11h
August 29th, 2001 [gerard]: Chapter6 - Kbd: Removed the removal of the defkeymap file. Instead just make install it, added a note that loadkeys -d doesn't work properly and leave it with that..
August 29th, 2001 [gerard]: Chapter 6 - Binutils: removed the -e options to 'make' which aren't necessary anymore. They were removed in chapter 5 already, but forgotten to commit changes to chapter 6.
August 29th, 2001 [gerard]: Chapter 6 - Bin86: Added a note that this package may not be needed if lilo isn't used.
August 29th, 2001 [gerard]: Chapter 6 - Ed: Added a note that nothing in LFS depends on Ed (except for patch, but ed formatted patch files are very rare these days), so you can safely skip it.
August 29th, 2001 [gerard]: Various updates to the text through the entire book (mostly grammatical fixes and such).
August 28th, 2001 [gerard]: Chapter 6-Texinfo: Added the explanation of the make TEXMF=/usr/share/texmf install-tex command.
August 28th, 2001 [gerard]: Chapter 6-M4: Removed the note about linking m4 statically outside of chroot. LFS doesn't use Glibc-2.1.x anymore, so this claim may not be true. It'll have to be tested again.
August 28th, 2001 [gerard]: Chapter 5+6+*: Removed the -f flags from cp commands. cp's behaviour has changed with fileutils-4.1, doing something totally different than expected.
August 28th, 2001 [gerard]: Chapter 5+6: Removed some unnecessary line breaks (so a command continues on a next line).
August 27th, 2001 [gerard]: Chapter 5: The former two sed operations are combined into one sed operation now.
August 27th, 2001 [gerard]: Preface: Inserted the currrent LFS website's introduction into "Who wants to read this book".
August 27th, 2001 [gerard]: Chapter 1: Synchronized the changelog, http and ftp mirrors with the LFS website.
August 27th, 2001 [gerard]: Chapter 6-Glibc and Bash: simplified the installation instructions. We no longer exit chroot to finish the installation. This _may_ not work properly if your host distribution is an old 2.0.x based kernel, but we have no way of testing this at the moment. We'll deal with that when bug reports come in.
August 27th, 2001 [gerard]: Moved rebooting into LFS from chapter 8 to chapter 9, after we run that find command.
August 27th, 2001 [gerard]: Updated the find command in chapter 9.
August 27th, 2001 [markh]: upgraded to e2fsprogs-1.23 and MAKEDEV-1.3.
August 27th, 2001 [gerard]: Added dependency lists for all installed packages. You now can see which programs from which packages you need in order to compile and install a package.
August 27th, 2001 [markh]: After a discussion on #lfs, we've downgraded the book to linux-2.4.8 due to performance problems with 2.4.9.
August 26th, 2001 [markh]: Moved appendix c --> appendix d and appendix b --> appendix c in order to create room for the dependency information to go into appendix b.
After much testing and discussing, it's been decided to downgrade to gcc-2.95.3 for the time being, until problems with the new gcc-3.0 version have been fixed.
Chapter 5: sed commands for bzip2 and mawk static compiles have been replaced with a simpler flag to gcc.
Chapter 5: A sed for fileutils-4.1 static has been added to avoid Segmentation Fault problems on glibc-2.2.3 systems.
Chapter 5: Binutils doens't require us passing -e to make in order for LDFLAGS=-static to work properly.
Chapter 5: GCC isn't statically linked anymore by using make -e LDFLAGS=-static, but by make BOOT_LDFLAGS=-static.
Chapter 5: Removed kernel patch for gcc-3.0 compilation
Chapter 5: Added gcc-patch to fix re_max_failure compile problems
Chapter 5: Added missing chown root.root $LFS/usr/include/linux to kernel installation
Chapter 5 & 6: Changed tar patch to use -j for bzip2 files instead of -y in order to be compatible with next tar release. Also renamed patch file to tar-1.13.patch
Chapters 5 & 6: Added a new patch for gcc-2.95.3 which fixes various problems such as the weak symbol bug.
Chapter 6: Bzip2 and shadowutils static libraries are now put in /usr/lib instead of /lib. There are now also links from /usr/lib to their dynamic libraries in /lib to enable the linker to still find the dynamic versions.
Chapter 6: ncurses patch totally removed. Static libraries now moved to /usr/lib and libcurses.a symlink created manually. A symlink is also created from /usr/lib to the dynamic libraries in /lib so that the linker still sees them.
Chapter 6: Yacc script in bison page now uses exec bison which replaces the shell.
Chapter 6: Util-linux sed command has been replaced with a flag to make.
Chapter 6: Man patch replaced with sed command.
Chapter 6: Removed shadow-utils patch in favour of a sed command
Chapter 6: Removed sysvinit patch in favour of a sed command.
Chapter 6: Removed the Groff command explanation regarding CXXFLAGS which has been made obsolete with the update to groff-1.17.1
Chapter 6: Moved the net-tools installation until after sh-utils so that net-tools can replace sh-utils's /bin/hostname.
Chapter 6: After installing Glibc, run exec /bin/bash --login instead of exiting and re-entering the chroot'ed environment.
Chapter 7: Changed $* into "$@" in the functions and rc scripts. "$@" allows usage of quoted arguments with blanks.
Chapter 7: Added print_error_msg from the rcS script as it appears in the rc script as well.
3.0-pre4 - June 22nd, 2001
Chapter 5: Reordered the installations alphabetically.
Chapter 6: Moved the installations of ed and patch into their alphabetical positions.
Chapter 7: Added [ ATTN ] warning message to the functions script. When you attemp to start a service that's already running or stop a service that's not running, it'll not print FAILED anymore but [ ATTN ] along with "Already running" or "Not running".
Chapter 9: Renamed the network-scripts directory in nic-config.
3.0-pre3 - May 12th, 2001
Added numerous FHS compliance notes. These instructions can be followed if one wishes to build a fully FHS-compliant system.
Chapter 4: Updated the directory list to be more FHS compliant. Mainly this meant adding the opt directories and removing /usr/tmp and /usr/local/tmp
Chapter 5: We now copy the kernel include directories instead of linking to them. This is theoretically safer if we plan on upgrading the kernel.
Chapter 5+6: Removed fileutils-patch. After upgrading to fileutils-4.1 the patch isn't needed anymore.
Chapter 5+6: Put back the instructions on how to copy/remove the old NSS library files, in case the original distribution uses glibc-2.0.x.
Chapter 5: Added the notice about an old version of install-info.
Chapter 5: Removed the installation of a static gettext.
Chapter 6: Changed bin86's installation from "make PREFIX=/usr install" to "make INSTALL_OPTS="-m 755" PREFIX=/usr install". This will prevent install from invoking strip -s on the files. This fails because a couple of the installed files are shell scripts rather than programs, so they can't be stripped.
Chapter 6: Removed the ld.so section since we only used the man pages and replaced it with a patch to man-pages.
Chapter 7+8: Moved the creation of /etc/fstab to chapter 8.
Appendix A: Added missing descriptions of frcode, code and bigram in the findutils-4.1 package.
3.0-pre2 - April 14th, 2001
Chapter 5: Simplified ln commands.
Chapter 5: Removed prefix=$LFS/usr from tar's make install.
Chapter 5+6: Removed --disable-nls from configuration of programs that don't need it (bash, diffutils, gzip, sed, m4).
Chapter 5+6: Changed from "cd dir && make" to "make -C dir" (gettext-static, sysvinit).
Chapter 5: Beautified the static link process for mawk.
Chapter 5: Changed the links we create during gcc-installation to $LFS/usr/bin/cpp.
Chapter 6: Changed the procps installation from sed'ing to an easier way.
Chapter 6: Changed all "rm file && ln -s dest file" into "ln -sf file" (in glibc, bzip2 and gzip installations).
Chapter 6: Added a sed to fix a problem during glibc-installation. pt_chown can not be installed setuid root, because "root" is not known by glibc yet (kind of hen and egg-problem).
Chapter 6: Changed consoledata/tools to kbd, which is more actively developed, and less of a pain to install.
Appendix A: Added the description of the Netkit-base and Net-tools packages.
3.0-pre1 - February 27th, 2001
Converted the SGML source to XML.
Chapter 4: Tell the user to use cfdisk rather than fdisk. The fdisk man page recommends cfdisk over fdisk because it's more stable.
Chapter 4: Changed the wording to make it more general as ext2 no longer is the only used file system. Reiser for example is often used too now.
Chapter 5: Added static mawk, texinfo and partially gettext to faciliate the move of Glibc from Chapter 5 to Chapter 6.
Chapter 5: Added Makedev to chapter 5. We don't create the device files here, only copy the MAKEDEV script and make a temp copy which will be used to create device files. This second file (MAKEDEV-temp) doesn't contain user names and group names but only user id's and group id's. We need a few device files to get Glibc installed, but before GLibc is installed user and group names are not recognized yet; only the numeric id's. This requires a slightly modified MAKEDEV script which will be generated by patching the original one. This patching is done here in chapter 5. Also, fixed the explanations on both makedev installations.
Chapter 5: Recommended to install all the software while logged in (or su'ed to) user root.
Chapter 5+6: Added the fileutils-4.0 patch which is needed to compile the fileutils package on Glibc-2.2 based systems (such as the upcoming LFS-3.0 system).
Chapter 5+6: Upgraded from gcc-2.95.2 to gcc-2.95.2.1
Chapter 5+6: Moved Glibc from chapter 5 to chapter 6
Chapter 6: Changed libexecdir=/usr/bin in fileutils to libexecdir=/bin
Chapter 6: Updated Glibc installation instructions. 'configparms' file creation has been deleted. No need to pick a compiler (either distro's native or the /usr/local/gcc2952/bin/gcc one); we're in chroot now so we'll use the one we have
Chapter 6: Only copy the man pages from the ld.so package. We don't need the ldconfig and ldd programs anymore; Glibc-2.2.1 comes with good working versions.
Chapter 6: Added the creation of the lex symlink to the flex installation.
Chapter 6: Changed $* into "$@" in the yacc script during bison's installation. "$@" allows usage of quoted arguments with blanks.
Chapter 6: Fixed the man page installation during console-tools' installation.
Chapter 6: When entering chroot the $TERM variable inside chroot is set properly. This is accomplished by: chroot ... -i HOME=/root TERM=$TERM...
Chapter 6: Merged the different sulogin lines from the inittab file into one line.
Chapter 7: Fixed the delays in the killproc function in the functions script. Now after kill, first check PIDs, then sleep 2 if needed. More details can be read in the comments in the script itself.
Chapter 7: Added the explanation how the runlevels and boot process works when using the LFS scripts.
Chapter 10: Added this chapter. It contains "thanks and good luck"notes and suggest creating the /etc/lfs-3.0-rc2 file
The linuxfromscratch.org server is hosting the following publicly accessible mailing lists:
lfs-discuss
lfs-apps
lfs-announce
lfs-security
lfs-book
alfs-discuss
blfs-book
The lfs-discuss mailing list discusses matters strictly related to the LFS-BOOK. If problems with the book come up, a bug or two need to be reported, or suggestions to improve the book should be made, this mailing list is the right one.
Any other mail is to be posted on the lfs-apps list.
The lfs-announce list is a moderated list. It can be subscribed to, but you can't post any messages to this list. This list is used to announce new stable releases. The lfs-discuss list will carry information about development releases as well. If a user is already on the lfs-discuss list, there's little use subscribing to this list as well because everything that is posted to the lfs-announce list will be posted to the lfs-discuss list as well.
The lfs-security mailing list discusses security-related matters. Security concerns or security problems with a package used by LFS, should be addressed on this list.
The lfs-book list is used by the LFS-BOOK editors to co-ordinate lfs-book's maintenance, like XML issues and the like. Actual discussion on what should be added and removed take place on lfs-discuss.
The alfs-discuss list discusses the development of ALFS, which stands for Automated Linux From Scratch. The goal of this project is to develop an installation tool that can install an LFS system automatically. It's main goal is to speed up compilation by taking away the need to manually enter the commands to configure, compile, and install packages.
The blfs-book list is used by the BLFS-BOOK (Beyond LFS) editors to co-ordinate blfs-book's maintenance. For now, actual discussions will take place on the lfs-apps list (like lfs-discuss is used instead of lfs-book).
All these lists are archived and can be viewed online at http://archive.linuxfromscratch.org/mail-archives or downloaded from ftp://ftp.linuxfromscratch.org/mail-archives or ftp://ftp.linuxfromscratch.org/mail-archives.
Any of the above-mentioned mailinglists can be subscribed to by sending an email to listar@linuxfromscratch.org and writing subscribe listname as the subject header of the message.
Multiple lists at the same time can be subscribed to by using one email. This is done by leaving the subject blank and putting all the commands in the body of the email. The email will look like:
To: listar@linuxfromscratch.org
Subject:
subscribe lfs-discuss
subscribe lfs-apps
subscribe alfs-discuss
After the email is sent, the Listar program will reply with an email requesting a confirmation of the subscription request. After this confirmation email is sent back, Listar will send an email again with the message that the user has been subscribed to the list(s) along with an introduction message for that particular list.
To unsubscribe from a list, send an email to listar@linuxfromscratch.org and write unsubscribe listname as the subject header of the message.
Multiple lists can be unsubscribed at the same time using one email. This is done by leaving the subject header blank and putting all the commands in the body of the email. The email will look like:
To: listar@linuxfromscratch.org
Subject:
unsubscribe lfs-discuss
unsubscribe lfs-apps
unsubscribe alfs-discuss
After the email is sent, the Listar program will reply with an email requesting a confirmation of the unsubscription request. After this confirmation email is sent back, Listar will send an email again with the message that the user has been unsubscribed from the list(s).
The modes that can be set by a user require sending an email to listar@linuxfromscratch.org. The modes themselves are set by writing the appropriate commands in the subject header of the message.
As the name implies, the Set command tells what to write to set a mode. The Unset command tells what to write to unset a mode.
The listname in the example subject headers should be replaced with the listname to which the mode is going to be applied to. If more than one mode is to be set (to the same list or multiple lists) with one email, this can be done by leaving the subject header blank and writing all the commands in the body of the message instead.
Set command: set listname digest
Unset command: unset listname digest
All lists have the digest mode available which can be set after a user has subscribed to a list. Being in digest mode will cause you to stop receiving individual messages as they are posted to the list and instead receive one email a day containing all the messages posted to the list during that day.
There is a second digest mode called digest2. When a user is set to this mode he will receive the daily digests but will also continue to receive the individual messages to the lists as they are posted. To set this mode, substitute digest for digest2 in the command.
Set command: set listname vacation
Unset command: unset listname vacation
If a user is going to be away for a while or wishes to stop receiving messages from the lists but doesn't want to unsubscribe, he can change to vacation mode. This has the same effect as unsubscribing, but without having to go through the unsubscribe process and then later through the subscribe process again.
Please direct your emails to one of the LFS mailing lists. See Chapter 1 - Mailing lists and archives for more information on the available mailing lists.
If you need to reach Gerard Beekmans personally, send an email to gerard@linuxfromscratch.org
Please read the following carefully: throughout this book the variable $LFS will be used frequently. $LFS must at all times be replaced with the directory where the partition that contains the LFS system is mounted. How to create and where to mount the partition will be explained in full detail in chapter 4. For example, let's assume that the LFS partition is mounted on /mnt/lfs.
For example when you are told to run a command like ./configure --prefix=$LFS you actually have to execute ./configure --prefix=/mnt/lfs
It's important that this is done no matter where it is read; be it in commands entered in a shell, or in a file edited or created.
A possible solution is to set the environment variable LFS. This way $LFS can be entered literally instead of replacing it with /mnt/lfs. This is accomplished by running export LFS=/mnt/lfs.
Now, if you are told to run a command like ./configure --prefix=$LFS you can type that literally. Your shell will replace $LFS with /mnt/lfs when it processes the command line (meaning when you hit enter after having typed the command).
If you plan to use $LFS, do not forget to set the $LFS variable at all times. If the variable is not set and is used in a command, $LFS will be ignored and whatever is left will be executed. A command like echo "root:x:0:0:root:/root:/bin/bash" > $LFS/etc/passwd without the $LFS variable set will re-create your host system's /etc/passwd file. Simply put: it will destroy your current password database file.
One way to make sure that $LFS is set at all times is adding it to the /root/.bash_profile and/or /root/.bashrc file(s) so that every time you login as user root, or you 'su' to user root, the $LFS variable is set.
Throughout this document, we will assume that all the packages that were downloaded are placed somewhere in $LFS/usr/src.
A convention you could use is having a $LFS/usr/src/sources directory. Under sources, you can create the directory 0-9 and the directories a through z. A package like sysvinit-2.82.tar.bz2 is stored under $LFS/usr/src/sources/s/. A package like bash-2.05.tar.bz2 is stored under $LFS/usr/src/sources/b/, and so forth.
The next chapter contains the list of all the packages that need to be downloaded, but the partition that is going to contain our LFS system isn't created yet. Therefore, you should store the files somewhere else and later moved to $LFS/usr/src/ when the chapter in which the new partition is prepared has been finished.
Before you start using the LFS book, we should point out that all of the commands here assume that you are using the bash shell. If you aren't, the commands may work but we can't guarantee it. If you want a simple life, use bash.
Before you can actually start doing something with a package, you need to unpack it first. Often the package files are tar'ed and gzip'ed or bzip2'ed. We're not going to write down every time how to unpack an archive. We'll explain how to do that once, in this section.
To start with, change to the $LFS/usr/src directory by running:
cd $LFS/usr/src
If a file is tar'ed and gzip'ed, it is unpacked by running either one of the following two commands, depending on the filename:
tar xvzf filename.tar.gz tar xvzf filename.tgz
If a file is tar'ed and bzip2'ed, it is unpacked by running:
bzcat filename.tar.bz2 | tar xv
Some tar programs (most of them nowadays but not all of them) are slightly modified to be able to use bzip2 files directly using either the I, the y or the j tar parameter, which works the same as the z tar parameter to handle gzip archives. The above construction works no matter how your host system decided to patch bzip2.
If a file is just tar'ed, it is unpacked by running:
tar xvf filename.tar
When an archive is unpacked, a new directory will be created under the current directory (and this book assumes that the archives are unpacked under the $LFS/usr/src directory). Please enter that new directory before continuing with the installation instructions. Again, every time this book is going to install a package, it's up to you to unpack the source archive and cd into the newly created directory.
From time to time you will be dealing with single files such as patch files. These files are generally gzip'ed or bzip2'ed. Before such files can be used they need to be uncompressed first.
If a file is gzip'ed, it is unpacked by running:
gunzip filename.gz
If a file is bzip2'ed, it is unpacked by running:
bunzip2 filename.bz2
After a package has been installed, two things can be done with it: either the directory that contains the sources can be deleted, or it can be kept. We highly recommend deleting it. If you don't do this and try to re-use the same source later on in the book (for example re-using the source trees from chapter 5 for use in chapter 6), it may not work as you expect it to. Source trees from chapter 5 will have your host distribution's settings, which don't always apply to the LFS system after you enter the chroot'ed environment. Even running something like make clean doesn't always guarantee a clean source tree.
So, save yourself a lot of hassle and just remove the source directory immediately after you have installed it.
There is one exception; the kernel source tree. Keep it around as you will need it later in this book when building a kernel. Nothing will use the kernel tree so it won't be in your way.
If you have a problem while using this book, you'll find that most of the people on Internet Relay Chat (IRC) and the mailing lists will be willing to help you. You can find a list of the LFS mailing lists in Chapter 1 - Mailing lists and archives. To assist us in helping though, you should make sure that you have as much relevant information as you can available. This will assist in diagnosing and solving your problem. This part of the book will guide you as to which sort of information will be useful.
First of all we need a brief explanation of the problem. Essential things to include are:
The version of the book you are using, which is 3.0-rc2
Which package or section you are having problems with
What the exact error message or symptom you are recieving is
If you have deviated from the book at all
Note that saying that you've deviated from the book doesn't mean that we won't help you, after all, LFS is all about choice. It'll just help us to see the possible other causes of your problem.
When something goes wrong during the stage where the configure script is run, look at the last lines of the config.log. This file contains possible errors encoutered during configure which aren't always printed to the screen. Include those relevant lines if you decide to ask for help.
To help us find the cause of the problem, both screen output and the contents of various files are useful. The screen output from both the ./configure script and when make is run can be useful. Don't blindly include the whole thing but on the other hand, don't include too little. As an example, here is some screen output from make:
gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\" -DLOCALEDIR=\"/mnt/lfs/usr/share/locale\" -DLIBDIR=\"/mnt/lfs/usr/lib\" -DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I. -g -O2 -c getopt1.c gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o expand.o file.o function.o getopt.o implicit.o job.o main.o misc.o read.o remake.o rule.o signame.o variable.o vpath.o default.o remote-stub.o version.o opt1.o -lutil job.o: In function `load_too_high': /lfs/tmp/make-3.79.1/job.c:1565: undefined reference to `getloadavg' collect2: ld returned 1 exit status make[2]: *** [make] Error 1 make[2]: Leaving directory `/lfs/tmp/make-3.79.1' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/lfs/tmp/make-3.79.1' make: *** [all-recursive-am] Error 2
In this case, many people just include the bottom section where it says
make [2]: *** [make] Error 1and onwards. This isn't enough for us to diagnose the problem because it only tells us that something went wrong, not what went wrong. The whole section as quoted above is what should be included to be helpful, because it includes the command that was executed and the command's error message(s).
Typing out all the bootscripts in chapter 7 can be a long, tedious process, not to mention very error-prone.
To save some time, the bootscripts can be downloaded from http://ftp.linuxfromscratch.org/lfs-bootscripts/lfs-bootscripts-3.0-rc2.tar.bz2 or ftp://ftp.linuxfromscratch.org/lfs-bootscripts/lfs-bootscripts-3.0-rc2.tar.bz2 .
LFS Commands is a tarball containing files which list the installation commands for the packages installed in this book.
These files can be used to quickly find out which commands have been changed between the different LFS versions. Download the lfs-commands tarball for this book version and the previous book version and run a diff on the files. That way it is possible to see which packages have updated installation instructions, so any scripts you may have can be modified, or you can reinstall a package if you think that necessary.
A side effect is that these files can be used to dump to a shell and install the packages, though some files need to be modified (where certain settings can't be guessed and depend on user preference or system hardware). Keep in mind, please, that these files are not thoroughly checked for correctness. There may be bugs in the files (since they are manually created at the moment) so do check them and don't blindly trust them.
If you decide to use the commands to automatically install a package and it doesn't work, try reading the book's instructions instead before you ask for help on the mailinglist.
The lfscommands can be downloaded from http://ftp.linuxfromscratch.org/lfs-commands/ or ftp://ftp.linuxfromscratch.org/lfs-commands/ .
Below is a list of all the packages that are needed to download for building the basic system. The version numbers printed correspond to versions of the software that is known to work and which this book is based on. If you experience problems which you can't solve yourself, then please download the version that is assumed in this book (in case you downloaded a newer version).
All the URL's below are to the ftp.linuxfromscratch.org server. We have a couple of FTP mirrors available from which you can download the files a well. The addresses of the mirror sites can be found in Chapter 1 - Book Version.
We have provided a list of official download sites of the packages below in Appendix D - Official download locations. The LFS FTP archive only contains the versions of packages that are recommended for use in this book. You can check the official sites in Appendix C to determine whether a newer package is available. If you do download a newer package, we would appreciate hearing whether you were able to install the package using this book's instructions or not.
Please note that all files downloaded from the LFS FTP archive are files compressed with bzip2 instead of gz. If you don't know how to handle bz2 files, check out Chapter 2 - How to install the software.
Browse FTP:
ftp://ftp.linuxfromscratch.org/
Browse HTTP:
http://ftp.linuxfromscratch.org/
You can either download one tarball that contains all the packages
used to compile an LFS system:
All LFS Packages - 77,760 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/lfs-packages-3.0-rc2.tar
http://ftp.linuxfromscratch.org/3.0-rc2/lfs-packages-3.0-rc2.tar
Or download the following packages individually:
Bash (2.05) - 1,360 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/bash-2.05.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/bash-2.05.tar.bz2
Binutils (2.11.2) - 7,641 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/binutils-2.11.2.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/binutils-2.11.2.tar.bz2
Bzip2 (1.0.1) - 410 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/bzip2-1.0.1.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/bzip2-1.0.1.tar.bz2
Diff Utils (2.7) - 247 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/diffutils-2.7.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/diffutils-2.7.tar.bz2
File Utils (4.1) - 1217 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/fileutils-4.1.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/fileutils-4.1.tar.bz2
GCC (2.95.3) - 9,618 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/gcc-2.95.3.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/gcc-2.95.3.tar.bz2
GCC Patch (2.95.3-2) - 8 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/gcc-2.95.3-2.patch.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/gcc-2.95.3-2.patch.bz2
Linux Kernel (2.4.8) - 21,672 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/linux-2.4.8.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/linux-2.4.8.tar.bz2
Grep (2.4.2) - 382 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/grep-2.4.2.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/grep-2.4.2.tar.bz2
Gzip (1.2.4a) - 178 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/gzip-1.2.4a.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/gzip-1.2.4a.tar.bz2
Gzip Patch (1.2.4a) - 1 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/gzip-1.2.4a.patch.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/gzip-1.2.4a.patch.bz2
Make (3.79.1) - 794 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/make-3.79.1.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/make-3.79.1.tar.bz2
Sed (3.02) - 221 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/sed-3.02.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/sed-3.02.tar.bz2
Sh-utils (2.0) - 824 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/sh-utils-2.0.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/sh-utils-2.0.tar.bz2
Sh-utils Patch (2.0) - 1 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/sh-utils-2.0.patch.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/sh-utils-2.0.patch.bz2
Tar (1.13) - 730 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/tar-1.13.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/tar-1.13.tar.bz2
Tar Patch (1.13) - 1 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/tar-1.13.patch.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/tar-1.13.patch.bz2
Text Utils (2.0) - 1,040 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/textutils-2.0.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/textutils-2.0.tar.bz2
Mawk (1.3.3) - 168 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/mawk1.3.3.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/mawk1.3.3.tar.bz2
Texinfo (4.0) - 812 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/texinfo-4.0.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/texinfo-4.0.tar.bz2
Patch (2.5.4) - 149 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/patch-2.5.4.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/patch-2.5.4.tar.bz2
MAKEDEV (1.3) - 7 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/MAKEDEV-1.3.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/MAKEDEV-1.3.bz2
Glibc (2.2.4) - 11,932 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/glibc-2.2.4.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/glibc-2.2.4.tar.bz2
Glibc-linuxthreads (2.2.4) - 161 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/glibc-linuxthreads-2.2.4.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/glibc-linuxthreads-2.2.4.tar.bz2
Man-pages (1.39) - 489 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/man-pages-1.39.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/man-pages-1.39.tar.bz2
Man-pages Patch (1.39) - 2 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/man-pages-1.39.patch.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/man-pages-1.39.patch.bz2
Ed (0.2) - 158 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/ed-0.2.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/ed-0.2.tar.bz2
Find Utils (4.1) - 226 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/findutils-4.1.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/findutils-4.1.tar.bz2
Find Utils Patch (4.1) - 226 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/findutils-4.1.patch.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/findutils-4.1.patch.bz2
Ncurses (5.2) - 1,308 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/ncurses-5.2.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/ncurses-5.2.tar.bz2
Vim-rt (5.8) - 1,045 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/vim-5.8-rt.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/vim-5.8-rt.tar.bz2
Vim-src (5.8) - 864 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/vim-5.8-src.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/vim-5.8-src.tar.bz2
Bison (1.28) - 321 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/bison-1.28.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/bison-1.28.tar.bz2
Less (358) - 178 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/less-358.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/less-358.tar.bz2
Groff (1.17.2) - 1,214 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/groff-1.17.2.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/groff-1.17.2.tar.bz2
Man (1.5i2) - 158 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/man-1.5i2.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/man-1.5i2.tar.bz2
Perl (5.6.1) - 4,750 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/perl-5.6.1.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/perl-5.6.1.tar.bz2
M4 (1.4) - 249 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/m4-1.4.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/m4-1.4.tar.bz2
Autoconf (2.52) - 618 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/autoconf-2.52.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/autoconf-2.52.tar.bz2
Automake (1.5) - 409 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/automake-1.5.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/automake-1.5.tar.bz2
Flex (2.5.4a) - 278 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/flex-2.5.4a.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/flex-2.5.4a.tar.bz2
File (3.36) - 138 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/file-3.36.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/file-3.36.tar.bz2
Libtool (1.4) - 605 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/libtool-1.4.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/libtool-1.4.tar.bz2
Bin86 (0.16.0) - 113 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/bin86-0.16.0.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/bin86-0.16.0.tar.bz2
Gettext (0.10.39) - 916 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/gettext-0.10.39.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/gettext-0.10.39.tar.bz2
Kbd (1.06) - 559 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/kbd-1.06.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/kbd-1.06.tar.bz2
E2fsprogs (1.23) - 1,025 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/e2fsprogs-1.23.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/e2fsprogs-1.23.tar.bz2
Lilo (21.7.5) - 175 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/lilo-21.7.5.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/lilo-21.7.5.tar.bz2
Modutils (2.4.7) - 203 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/modutils-2.4.7.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/modutils-2.4.7.tar.bz2
Procinfo (18) - 22 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/procinfo-18.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/procinfo-18.tar.bz2
Procps (2.0.7) - 153 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/procps-2.0.7.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/procps-2.0.7.tar.bz2
Psmisc (20.1) - 51 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/psmisc-20.1.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/psmisc-20.1.tar.bz2
Shadow Password Suite (20001016) - 551 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/shadow-20001016.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/shadow-20001016.tar.bz2
Sysklogd (1.4.1) - 67 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/sysklogd-1.4.1.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/sysklogd-1.4.1.tar.bz2
Sysvinit (2.82) - 75 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/sysvinit-2.82.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/sysvinit-2.82.tar.bz2
Util Linux (2.11h) - 964 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/util-linux-2.11h.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/util-linux-2.11h.tar.bz2
Netkit-base (0.17) - 49 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/netkit-base-0.17.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/netkit-base-0.17.tar.bz2
Net-tools (1.60) - 194 KB:
ftp://ftp.linuxfromscratch.org/3.0-rc2/net-tools-1.60.tar.bz2
http://ftp.linuxfromscratch.org/3.0-rc2/net-tools-1.60.tar.bz2
Total size of all packages: 77,760 KB (75.94 MB)
In this chapter, the partition that is going to host the LFS system is going to be prepared. We will be creating the partition itself, a file system and the directory structure. When this is done, we can move on to the next chapter and start the actual building process.
First, let's start with telling you that it is possible to build LFS on only one partition, which is where your original distribution is installed. This is not recommended if it is the first time you try LFS, but may be useful if you are short on disk space. If you feel brave, take a look at the one partition hint at http://hints.linuxfromscratch.org/hints/one-partition-hint.txt Keep in mind, this is a real hint in that sense of the word, not a finished document yet.
Before we can build our new Linux system, we need to have an empty Linux partition on which we can build our new system. I recommend a partition size of at least 750 MB. This gives enough space to store all the tarballs and to compile all packages without worrying about running out of the necessary temporary disk space. But you probably want more space than that if you plan to use the LFS system as your primary Linux system. If that's the case you'd want more space so you can install additional software. If a Linux Native partition is already available, this subsection can be skipped.
The cfdisk program (or another fdisk like program you prefer) is to be started with the appropriate hard disk as the option (like /dev/hda if a new partition is to be created on the primary master IDE disk). It is used to create a Linux Native partition, write the partition table and exit the cfdisk program. Please refer to the documentation that comes with your fdisk program of choice (the man pages are often a good place to start) and read the procedures about how to create a new Linux native partition and how to write the partition table.
The new partition's designation should be remembered. It could be something like hda11. This newly created partition will be referred to as the LFS partition in this book.
Once the partition is created, we have to create a new file system on that partition. The standard file system used these days is the ext2 file system, but the so-called journaling file systems are becoming increasingly popular too. It's of course up to you to decide which file system you want to create, but because we have to assume and work with something, we will assume you chose the ext2 file system.
To create an ext2 file system, use the mke2fs command. The LFS partition is used as the only option to the command and the file system is created.
mke2fs /dev/xxx
Replace "xxx" by the partition's designation (like hda11).
Now that we have created a file system, it is ready for use. All we have to do to be able to access the partition (as in reading data from and writing data to) is mount it. If it is mounted under /mnt/lfs, this partition can be accessed by cd'ing to the /mnt/lfs directory. This book will assume that the partition was mounted under /mnt/lfs. It doesn't matter which directory is chosen, just make sure you remember what you chose.
Create the /mnt/lfs directory by running:
mkdir -p /mnt/lfs
Now mount the LFS partition by running:
mount /dev/xxx /mnt/lfs
Replace "xxx" by the partition's designation (like hda11).
This directory (/mnt/lfs) is the $LFS variable you have read about back in chapter 2. If you were planning to make use of the $LFS environment variable, export LFS=/mnt/lfs has to be executed now.
Before we start creating directories, we need to check the base system's umask setting. To do this, we run umask. The result should be 022. If it isn't, then run the following command to ensure that the directories will be created with the correct permissions:
umask 022
We would advise you to make sure that the umask is set to 022 throughout your LFS installation.
Let's now create the directory tree on the LFS partition based on the FHS standard, which can be found at http://www.pathname.com/fhs/. Issuing the following commands will create a default directory layout:
cd $LFS mkdir -p bin boot dev/pts etc/opt home lib mnt proc root sbin tmp var opt for dirname in $LFS/usr $LFS/usr/local do mkdir $dirname cd $dirname mkdir bin etc include lib sbin share src var ln -s share/man man ln -s share/doc doc ln -s share/info info cd $dirname/share mkdir dict doc info locale man nls misc terminfo zoneinfo cd $dirname/share/man mkdir man{1,2,3,4,5,6,7,8} done cd $LFS/var mkdir -p lock log mail run spool tmp opt cache lib/misc local cd $LFS/opt mkdir bin doc include info lib man cd $LFS/usr ln -s ../var/tmp tmp
Normally, directories are created with permission mode 755, which isn't desired for all directories. The first change is a mode 0750 for the $LFS/root directory. This is to make sure that not just everybody can enter the /root directory (the same a user would do with /home/username directories). The second change is a mode 1777 for the tmp directories. This way, any user can write data to the /tmp or /var/tmp directory but cannot remove another user's files (the latter is caused by the so-called "sticky bit" - bit 1 of the 1777 bit mask).
cd $LFS && chmod 0750 root && chmod 1777 tmp var/tmp
Now that the directories are created, copy the source files that were downloaded in chapter 3 to some subdirectory under $LFS/usr/src (you will need to create the desired directory yourself).
The FHS stipulates that the /usr/local directory should contain the bin, games,include, lib, man, sbin, and share subdirectories. You can alter your /usr/local directory yourself if you want your system to be FHS-compliant.
Also, the standard says that there should exist a /usr/share/games directory, which we don't much like for a base system. But feel free to make your system FHS-compliant if you wish. The FHS isn't precise as to the structure of the /usr/local/share subdirectories, so we took the liberty of creating the directories that we felt needed.
In the following chapters we will install all the software that belongs to a basic Linux system. After you're done with this and the next chapter, you'll have a fully working Linux system. The remaining chapters deal with creating the boot scripts, making the LFS system bootable and setting up basic networking.
The software in this chapter will be linked statically and will be reinstalled in the next chapter and linked dynamically. The reason for the static version first is that there is a chance that our normal Linux system and the LFS system aren't using the same C Library versions. If the programs in the first part are linked against an older C library version, those programs might not work well on the LFS system. Another reason is to resolve circular dependencies. An example of such a dependency is that you need a compiler to install a compiler, and you're going to need a shell to install a shell and that compiler.
The key to learning what makes Linux tick is to know exactly what packages are used for and why a user or the system needs them. Descriptions of the package content are provided after the Installation subsection of each package and in Appendix A as well.
During the installation of various packages, you will more than likely see all kinds of compiler warnings scrolling by on the screen. These are normal and can be safely ignored. They are just that, warnings (mostly about improper use of the C or C++ syntax, but not illegal use. It's just that, often, C standards changed and packages still use the old standard which is not a problem).
Before we start, make sure the LFS environment variable is setup properly if you decided to make use of it. Run the following:
echo $LFS
Check to make sure the output contains the correct directory to the LFS partition's mount point (/mnt/lfs for example).
It's best to log in as root or su's to root when installing the packages. That way you are assured that all files are owned by user and group root (and not owned by the userid of the non-root user), and if a package wants to set special permissions, it can do so without problems due to non-root access.
The documentation that comes with Glibc, Gcc, and other packages recommend not to compile the packages as user root. We feel it's safe to ignore that recommendation and compile as user root anyway. Hundreds of people using LFS have done so without any problems whatsoever, and we haven't encountered any bugs in the compile processes that cause harm. So it's pretty safe (never can be 100% safe though, so it's up to you what you end up doing).
Estimated build time: 3 minutes Estimated required disk space: 20 MB
Before you attempt to install Bash, you have to check to make sure your distribution has the /usr/lib/libcurses.a and /usr/lib/libncurses.a files. If both of the files are missing, you have to install the ncurses development package. This package is often call something like ncurses-dev.
If this package is already installed, or you just did it, check for the two files again. Often the libcurses.a file is (still) missing. If so, then create libcurses.a as a symlink by running the following commands:
cd /usr/lib && ln -s libncurses.a libcurses.a
Now we can continue. Install Bash by running the following commands:
./configure --enable-static-link --prefix=$LFS/usr \ --bindir=$LFS/bin --with-curses && make && make install && cd $LFS/bin && ln -sf bash sh
If the make install phase ends with something along the lines of
install-info: unknown option `--dir-file=/mnt/lfs/usr/info/dir' usage: install-info [--version] [--help] [--debug] [--maxwidth=nnn] [--section regexp title] [--infodir=xxx] [--align=nnn] [--calign=nnn] [--quiet] [--menuentry=xxx] [--info-dir=xxx] [--keep-old] [--description=xxx] [--test] [--remove] [--] filename make[1]: *** [install] Error 1 make[1]: Leaving directory `/mnt/lfs/usr/src/bash-2.05/doc' make: [install] Error 2 (ignored)
then that means that you are probably using Debian, and that you have an old version of the texinfo package. This error is not severe by any means: the info pages will be installed when we recompile bash dynamically in chapter 6, so you can ignore it. You do, however, have to run the last two commands manually (the cd $LFS/bin and ln -sf bash sh commands) because they won't be executed when the error occurs.
--enable-static-link: This configure option causes Bash to be linked statically
--prefix=$LFS/usr: This configure option installs all of Bash's files under the $LFS/usr directory, which becomes the /usr directory after the user chroot'ed into $LFS or when he rebooted the system into LFS.
--bindir=$LFS/bin: This installs the executable files in $LFS/bin. We do this because we want bash to be in /bin, not in /usr/bin. One reason being: the /usr partition might be on a separate partition which has to be mounted at some point. Before that partition is mounted you need and will want to have bash available (it will be hard to execute the boot scripts without a shell for instance).
--with-curses: This causes Bash to be linked against the curses library instead of the default termcap library which is becoming obsolete.
It is not strictly necessary for the static bash to be linked against libncurses (it can link against a static termap for the time being just fine because we will reinstall Bash in chapter 6 anyways, where we will use libncurses), but it's a good test to make sure that the ncurses package has been installed properly. If not, you will get in trouble later on in this chapter when you install the Texinfo package. That package requires ncurses and termcap can't reliably be used there.
ln -sf bash sh: This command creates the sh symlink that points to bash. Most scripts run themselves via 'sh' (invoked by the #!/bin/sh as the first line in the scripts) which invokes a special bash mode. Bash will then behave (as closely as possible) as the original Bourne shell.
The &&'s at the end of every line cause the next command to be executed only if the previous command exists with a return value of 0 indicating success. In case all of these commands are copy&pasted on the shell, is is important to be ensured that if ./configure fails, make isn't being executed and, likewise, if make fails, that make install isn't being executed, and so forth.
Bash is the Bourne-Again SHell, which is a widely used command interpreter on Unix systems. Bash is a program that reads from standard input, the keyboard. A user types something and the program will evaluate what he has typed and do something with it, like running a program.
Bash-2.05 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
size from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 6 minutes Estimated required disk space: 96 MB
This package is known to behave badly when you have changed it's default optimization flags (including the -march and -mcpu options). Binutils is best left alone, so we recommend you unsetting CFLAGS, CXXFLAGS and other such variables/settings that would change the default optimization that it comes with.
Install Binutils by running the following commands:
./configure --prefix=$LFS/usr --disable-nls && make LDFLAGS=-all-static tooldir=$LFS/usr && make tooldir=$LFS/usr install
--disable-nls: This option disabled internationalization (also known as i18n). We don't need this for our static programs and nls often causes problems when you're linking statically.
LDFLAGS=-all-static: Setting the variable LDFLAGS to the value -all-static causes binutils to be linked statically.
tooldir=$LFS/usr: Normally, the tooldir (the directory where the executables from binutils end up in) is set to $(exec_prefix)/$(target_alias) which expands into, for example, /usr/i686-pc-linux-gnu. Since we only build for our own system, we don't need this target specific directory in $LFS/usr. That setup would be used if the system was used to cross-compile (for example compiling a package on the Intel machine that generates code that can be executed on Apple PowerPC machines).
The Binutils package contains the gasp, gprof, ld, as, ar, nm, objcopy, objdump, ranlib, readelf, size, strings, strip, c++filt and addr2line programs
Gasp is the Assembler Macro Preprocessor.
ld combines a number of object and archive files, relocates their data and ties up symbol references. Often the last step in building a new compiled program to run is a call to ld.
as is primarily intended to assemble the output of the GNU C compiler gcc for use by the linker ld.
The ar program creates, modifies, and extracts from archives. An archive is a single file holding a collection of other files in a structure that makes it possible to retrieve the original individual files (called members of the archive).
objcopy utility copies the contents of an object file to another. objcopy uses the GNU BFD Library to read and write the object files. It can write the destination object file in a format different from that of the source object file.
objdump displays information about one or more object files. The options control what particular information to display. This information is mostly useful to programmers who are working on the compilation tools, as opposed to programmers who just want their program to compile and work.
ranlib generates an index to the contents of an archive, and stores it in the archive. The index lists each symbol defined by a member of an archive that is a relocatable object file.
size lists the section sizes --and the total size-- for each of the object files objfile in its argument list. By default, one line of output is generated for each object file or each module in an archive.
For each file given, strings prints the printable character sequences that are at least 4 characters long (or the number specified with an option to the program) and are followed by an unprintable character. By default, it only prints the strings from the initialized and loaded sections of object files; for other types of files, it prints the strings from the whole file.
strings is mainly useful for determining the contents of non-text files.
strip discards all or specific symbols from object files. The list of object files may include archives. At least one object file must be given. strip modifies the files named in its argument, rather than writing modified copies under different names.
The C++ language provides function overloading, which means that it is possible to write many functions with the same name (providing each takes parameters of different types). All C++ function names are encoded into a low-level assembly label (this process is known as mangling). The c++filt program does the inverse mapping: it decodes (demangles) low-level names into user-level names so that the linker can keep these overloaded functions from clashing.
addr2line translates program addresses into file names and line numbers. Given an address and an executable, it uses the debugging information in the executable to figure out which file name and line number are associated with a given address.
Binutils-2.11.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
ranlib from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
rmdir from the fileutils package
touch from the fileutils package
gcc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
makeinfo from the texinfo package
cat from the textutils package
sort from the textutils package
tail from the textutils package
tr from the textutils package
true from the sh-utils package
uniq from the textutils package
Estimated build time: 1 minute Estimated required disk space: 3 MB
Install Bzip2 by running the following commands:
make CC="gcc -static" && make PREFIX=$LFS/usr install && cd $LFS/usr/bin && mv bzcat bunzip2 bzip2 bzip2recover $LFS/bin
Although it's not strictly a part of a basic LFS system it's worth mentioning that a patch for Tar can be downloaded which enables the tar program to compress and uncompress using bzip2/bunzip2 easily. With a plain tar, you have to use constructions like bzcat file.tar.bz|tar xv or tar --use-compress-prog=bunzip2 -xvf file.tar.bz2 to use bzip2 and bunzip2 with tar. This patch provides the -j option so you can unpack a Bzip2 archive with tar xvfj file.tar.bz2. Applying this patch will be mentioned later on when the Tar package is installed.
make CC="gcc -static": This is the method we use to tell gcc that we want bzip2 to be linked statically.
bzip2 compresses files using the Burrows-Wheeler block sorting text compression algorithm, and Huffman coding. Compression is generally considerably better than that achieved by more conventional LZ77/LZ78-based compressors, and approaches the performance of the PPM family of statistical compressors.
Bzip2-1.0.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cp from the fileutils package
ln from the fileutils package
rm from the fileutils package
gcc from the gcc package
make from the make package
Estimated build time: 1 minute Estimated required disk space: 4 MB
When installing Diffutils using glibc-2.1.x on your base system, it may be necessary to use a fix to prevent a variable name conflict. The following commands can be used in this case. Note that these commands can also be used for other glibc versions so if you aren't sure, then use the first version.
export CPPFLAGS=-Dre_max_failures=re_max_failures2 && ./configure --prefix=$LFS/usr && unset CPPFLAGS && make LDFLAGS=-static && make install
If you are using a newer glibc version (2.2.x), you can use the following commands to install Diffutils:
./configure --prefix=$LFS/usr && make LDFLAGS=-static && make install
CPPFLAGS=-Dre_max_failures=re_max_failures2: The CPPFLAGS variable is a variable that's read by the cpp program (C PreProcessor). The value of this variable tells the preprocessor to replace every instance of re_max_failures it finds by re_max_failures2 before handing the source file to the compiler itself for compilation. This package has problems linking statically on systems that run an older Glibc version and this construction fixes that problem.
cmp and diff both compare two files and report their differences. Both programs have extra options which compare files in different situations.
Diffutils-2.7 needs the following to be installed:
sh from the bash package
ld from the binutils package
as from the binutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 3 minutes Estimated required disk space: 25 MB
The programs from a statically linked fileutils package may cause segmentation faults on certain systems, if your distribution has Glibc-2.2.3 or higher installed. It also seems to happen mostly on machines powered by an AMD CPU, but there is a case or two where an Intel system is affected as well. If your system falls under this category, try the following fix.
Note that in some cases using these sed commands will result in problems not being able to compile this at package at all, even when your system has and AMD CPU and has Glibc-2.2.3 (or higher) installed. If that's the case, you'll need to remove the fileutils-4.1 directory and unpack it again from the tarball before continuing. We believe this may be the case when your distribution has altered Glibc-2.2.3 somehow, but details are unavailable at the time.
To fix this package to compile properly on AMD/Glibc-2.2.3 machines, run the following commands. Do not attempt this fix if you don't have Glibc-2.2.3 installed. It will more than likely result in all kinds of compile time problems.
cp lib/Makefile.in lib/Makefile.in.backup && sed -e 's/\(.*\)\(fopen-safer\.c \)\\/\1\2atexit.c \\/' \ -e 's/\(.*\)\(idcache\$U\.\$.*\)\\/\1\2atexit$U.$(OBJEXT) \\/' \ lib/Makefile.in > lib/Makefile.in~ && mv lib/Makefile.in~ lib/Makefile.in
Install fileutils by running the following commands:
./configure --disable-nls \ --prefix=$LFS/usr --libexecdir=$LFS/bin --bindir=$LFS/bin && make LDFLAGS=-static && make install && cd $LFS/usr/bin && ln -sf ../../bin/install
Once you have installed fileutils, you can test whether the segmentation fault problem has been avoided by running $LFS/bin/ls. If this works, then you are OK. If not, then you need to re-do the installation using the sed commands if you didn't use them, or without the sed commands if you did use them.
cp lib/Makefile.in lib/Makefile.in.backup : We run this command in order to keep a backup of the file we are about to change.
cp lib/Makefile.in lib/Makefile.in.backup && sed -e 's/\(.*\)\(fopen-safer\.c \)\\/\1\2atexit.c \\/' \ -e 's/\(.*\)\(idcache\$U\.\$.*\)\\/\1\2atexit$U.$(OBJEXT) \\/' \ lib/Makefile.in > lib/Makefile.in~ && mv lib/Makefile.in~ lib/Makefile.in:This is used to fix a problem with building fileutils statically on glibc 2.2.3 systems. If this isn't done, then there is the possibility of all of the fileutils programs causing segmentation faults once chroot is entered in chapter 6.
--libexecdir=$LFS/bin: This configure option will set the program executable directory to $LFS/bin. This is normally set to /usr/libexec, but nothing is placed in it. Changing it just prevents that directory from being created.
The Fileutils package contains the chgrp, chmod, chown, cp, dd, df, dir, dircolors, du, install, ln, ls, mkdir, mkfifo, mknod, mv, rm, rmdir, sync, touch and vdir programs.
chgrp changes the group ownership of each given file to the named group, which can be either a group name or a numeric group ID.
chmod changes the permissions of each given file according to mode, which can be either a symbolic representation of changes to make, or an octal number representing the bit pattern for the new permissions.
dd copies a file (from the standard input to the standard output, by default) with a user-selectable blocksize, while optionally performing conversions on it.
df displays the amount of disk space available on the filesystem containing each file name argument. If no file name is given, the space available on all currently mounted filesystems is shown.
dir and vdir are versions of ls with different default output formats. These programs list each given file or directory name. Directory contents are sorted alphabetically. For ls, files are by default listed in columns, sorted vertically, if the standard output is a terminal; otherwise they are listed one per line. For dir, files are by default listed in columns, sorted vertically. For vdir, files are by default listed in long format.
dircolors outputs commands to set the LS_COLOR environment variable. The LS_COLOR variable is use to change the default color scheme used by ls and related utilities.
du displays the amount of disk space used by each argument and for each subdirectory of directory arguments.
install copies files and sets their permission modes and, if possible, their owner and group.
mv moves files from one directory to another or renames files, depending on the arguments given to mv.
touch changes the access and modification times of each given file to the current time. Files that do not exist are created empty.
Fileutils-4.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
install from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
uniq from the textutils package
Estimated build time: 22 minutes Estimated required disk space: 168 MB
This package is known to behave badly when you have changed it's default optimization flags (including the -march and -mcpu options). GCC is best left alone, so we recommend you unsetting CFLAGS, CXXFLAGS and other such variables/settings that would change the default optimization that it comes with.
Install GCC by running the following commands:
patch -Np1 -i ../gcc-2.95.3-2.patch && mkdir ../gcc-build && cd ../gcc-build && ../gcc-2.95.3/configure --prefix=/usr --enable-languages=c,c++ \ --disable-nls --disable-shared && make BOOT_LDFLAGS=-static bootstrap && make prefix=$LFS/usr install && cd $LFS/lib && ln -sf ../usr/bin/cpp && cd $LFS/usr/lib && ln -sf ../bin/cpp && cd $LFS/usr/bin && ln -sf gcc cc
patch -Np1 -i ../gcc-2.95.3-2.patch: This new patch deals with incorrect handling of weak symbols, the over-optimization of calls to those weak symbols, an atexit issue and the __dso_handle symbol required for atexit's proper function.
make BOOT_LDFLAGS=-static: This is the equivalent to make LDFLAGS=-static as we use with other packages to compile them statically.
--prefix=/usr: This is NOT a typo. GCC hard codes some paths while compiling and so we need to pass /usr as the prefix during ./configure. We pass the real install prefix during the make install command later.
--enable-languages=c,c++: This only builds the C and C++ compilers and not the other available compilers as they are, on the average, not often used. If those other compilers are needed, the --enable-languages parameter can be omitted.
ln -sf ../usr/bin/cpp: This creates the $LFS/lib/cpp symlink. Some packages explicitly try to find cpp in /lib.
ln -sf ../bin/cpp: This creates the $LFS/usr/lib/cpp symlink as there are packages that expect cpp to be in /usr/lib.
A compiler translates source code in text format to a format that a computer understands. After a source code file is compiled into an object file, a linker will create an executable file from one or more of these compiler generated object files.
A preprocessor pre-processes a source file, such as including the contents of header files into the source file. It's a good idea to not do this manually to save a lot of time. Someone just inserts a line like #include <filename>. The preprocessor inserts the contents of that file into the source file. That's one of the things a preprocessor does.
The C++ library is used by C++ programs. The C++ library contains functions that are frequently used in C++ programs. This way the programmer doesn't have to write certain functions (such as writing a string of text to the screen) from scratch every time he creates a program.
GCC-2.95.3 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
ranlib from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
find from the find package
gcc from the gcc package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
mawk from the mawk package
sed from the sed package
basename from the sh-utils package
echo from the sh-util package
expr from the sh-utils package
sleep from the sh-utils package
true from the sh-utils package
uname from the sh-utils package
tar from the tar package
makeinfo from the texinfo package
cat from the textutils package
head from the textutils package
sort from the textutils package
tail from the textutils package
tr from the textutils package
uniq from the textutils package
Estimated build time: 1 minute Estimated required disk space: 4 MB
When installing Grep using glibc-2.1.x on your base system, it may be necessary to use a fix to prevent a variable name conflict. The following commands can be used in this case. Note that these commands can also be used for other glibc versions so if you aren't sure, then use the first version.
export CPPFLAGS=-Dre_max_failures=re_max_failures2 && ./configure --prefix=$LFS/usr --disable-nls && unset CPPFLAGS && make LDFLAGS=-static && make install
If you are using a newer glibc version (2.2.x), you can use the following commands to install Grep:
./configure --prefix=$LFS/usr --disable-nls && make LDFLAGS=-static && make install
egrep prints lines from files matching an extended regular expression pattern.
fgrep prints lines from files matching a list of fixed strings, separated by newlines, any of which is to be matched.
Grep-2.4.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Before Gzip is installed, the patch file may need to be applied. This patch file is necessary to avoid a conflict of variable names with Glibc-2.0 systems when compiling and linking statically and so is only required if your base system runs Glibc-2.0. It is however safe to apply the patch even if you are running a different glibc version, so if you aren't sure, it's best to apply it.
Apply the patch by running the following command:
patch -Np1 -i ../gzip-1.2.4a.patch
Install Gzip by running the following commands:
./configure --prefix=$LFS/usr && make LDFLAGS=-static && make install && cp $LFS/usr/bin/gunzip $LFS/usr/bin/gzip $LFS/bin && rm $LFS/usr/bin/gunzip $LFS/usr/bin/gzip
The Gzip package contains the compress, gunzip, gzexe, gzip, uncompress, zcat, zcmp, zdiff, zforce, zgrep, zmore and znew programs.
gunzip decompresses files that are compressed with gzip.
gzexe allows you to compress executables in place and have them automatically uncompress and execute when they are run (at a penalty in performance).
zcat uncompresses either a list of files on the command line or its standard input and writes the uncompressed data on standard output
zforce forces a .gz extension on all gzip files so that gzip will not compress them twice. This can be useful for files with names truncated after a file transfer.
zmore is a filter which allows examination of compressed or plain text files one screen at a time on a soft-copy terminal (similar to the more program).
Gzip-1.2.4a needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
nm from the binutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
cat from the textutils package
tr from the textutils package
Estimated build time: 3 minutes Estimated required disk space: 132 MB
We won't be compiling a new kernel image yet. We'll do that after we have finished the installation of the basic system software in this chapter. But because certain software needs the kernel header files, we're going to unpack the kernel archive now and set it up so that we can compile the packages that need the kernel.
The kernel configuration file is created by running the following command:
make mrproper && yes "" | make config && make dep && cd $LFS/usr/include && cp -a ../src/linux/include/linux . && chown -R root.root $LFS/usr/include/linux && mkdir asm && cp -a ../src/linux/include/asm/* asm && chown -R root.root $LFS/usr/include/asm
make mrproper: This will ensure that the kernel tree is absolutely clean.
yes "" | make config: This runs make config and answers with the default answer to every question the config script asks the user (it does this by simply doing the equivalent of hitting the Enter key, thus accepting the default Y and N answers to the questions). We're not configuring the real kernel here, we just need to have some sort of configure file created so that we can run make dep next that will create a few files in $LFS/usr/src/linux/include/linux, like version.h, among others, that we will need to compile Glibc and other packages later in chroot.
make dep: make dep checks dependencies and sets up the dependencies file. We don't really care about the dependency checks, but what we do care about is that make dep creates those aforementioned files in $LFS/usr/src/linux/include/linux we will be needing later on.
cp -a ../src/linux/include/linux . and mkdir asm && cp -a ../src/linux/include/asm/* .: These commands copy the kernel headers in the $LFS/usr/include directory.
chown -R root.root $LFS/usr/include/linux and chown -R root.root $LFS/usr/include/asm: These commands change the ownership of the $LFS/usr/include/linux and the $LFS/usr/include/asm directories, plus all the files contained therein to the user root and group root.
The Linux kernel is at the core of every Linux system. It's what makes Linux tick. When a computer is turned on and boots a Linux system, the very first piece of Linux software that gets loaded is the kernel. The kernel initializes the system's hardware components such as serial ports, parallel ports, sound cards, network cards, IDE controllers, SCSI controllers and a lot more. In a nutshell the kernel makes the hardware available so that the software can run.
Linux-2.4.8 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
objcopy from the binutils package
chown from the fileutils package
cp from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
find from the findutils package
xargs from the findutils package
gcc from the gcc package
grep from the grep package
make from the make package
awk from the mawk package
depmod from the modutils package
genksyms from the modutils package
hostname from the net-tools package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
expr from the sh-utils package
pwd from the sh-utils package
uname from the sh-utils package
whoami from the sh-utils package
yes from the sh-utils package
cat from the textutils package
md5sum from the textutils package
sort from the textutils package
tail from the textutils package
touch from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 6 MB
Install Make by running the following commands:
./configure --prefix=$LFS/usr --disable-nls && make LDFLAGS=-static && make install
make determines automatically which pieces of a large program need to be recompiled, and issues the commands to recompile them.
Make-3.79.1 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chgrp from the fileutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Mawk by running the following commands:
./configure && make CC="gcc -static" && make BINDIR=$LFS/usr/bin \ MANDIR=$LFS/usr/share/man/man1 install
Mawk is an interpreter for the AWK Programming Language. The AWK language is useful for manipulation of data files, text retrieval and processing, and for prototyping and experimenting with algorithms.
Mawk-1.3.3 needs the following to be installed:
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
rm from the fileutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
tee from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Patch by running the following commands:
./configure --prefix=$LFS/usr && make LDFLAGS=-static && make install
The patch program modifies a file according to a patch file. A patch file usually is a list created by the diff program that contains instructions on how an original file needs to be modified. Patch is used a lot for source code patches since it saves time and space. Imagine a package that is 1MB in size. The next version of that package only has changes in two files of the first version. It can be shipped as an entirely new package of 1MB or just as a patch file of 1KB which will update the first version to make it identical to the second version. So if the first version was downloaded already, a patch file avoids a second large download.
Patch-2.5.4 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
When installing Sed using glibc-2.1.x on your base system, it may be necessary to use a fix to prevent a variable name conflict. The following commands can be used in this case. Note that these commands can also be used for other glibc versions so if you aren't sure, then use the first version.
export CPPFLAGS=-Dre_max_failures=re_max_failures2 && ./configure --prefix=$LFS/usr --bindir=$LFS/bin && unset CPPFLAGS && make LDFLAGS=-static && make install
If you are using a newer glibc version (2.2.x), you can use the following commands to install Sed:
./configure --prefix=$LFS/usr --bindir=$LFS/bin && make LDFLAGS=-static && make install
sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline).
Sed-3.02 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 2 minutes Estimated required disk space: 23 MB
Before Sh-utils is installed, the sh-utils patch file may need to be applied. This patch is needed to avoid a conflict of variable names with certain Glibc verions (usually glibc-2.1.x) when compiling sh-utils statically. It is however safe to apply the patch even if you are running a different glibc version, so if you aren't sure, it's best to apply it.
Apply the patch by running the following command:
patch -Np1 -i ../sh-utils-2.0.patch
Install Sh-utils by running the following commands:
./configure --prefix=$LFS/usr --disable-nls && make LDFLAGS=-static && make install && cd $LFS/usr/bin && mv date echo false pwd stty $LFS/bin && mv su true uname hostname $LFS/bin
The Sh-utils package contains the basename, chroot, date, dirname, echo, env, expr, factor, false, groups, hostid, hostname, id, logname, nice, nohup, pathchk, pinky, printenv, printf, pwd, seq, sleep, stty, su, tee, test, true, tty, uname, uptime, users, who, whoami and yes programs.
Sh-utils-2.0 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
chown from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 7 MB
To be able to directly use bzip2 files with tar, use the tar patch available from the LFS FTP site. This patch will add the -j option to tar which works the same as the -z option to tar (which can be used for gzip files).
Apply the patch by running the following command:
patch -Np1 -i ../tar-1.13.patch
Install Tar by running the following commands:
./configure --prefix=$LFS/usr --disable-nls \ --libexecdir=$LFS/usr/bin --bindir=$LFS/bin && make LDFLAGS=-static && make install
tar is an archiving program designed to store and extract files from an archive file known as a tar file.
rmt is a program used by the remote dump and restore programs in manipulating a magnetic tape drive through an interprocess communication connection.
Tar-1.13 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
patch from the patch package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 11 MB
Install Texinfo by running the following commands:
./configure --prefix=$LFS/usr --disable-nls && make LDFLAGS=-static && make install
The Texinfo package contains the info, install-info, makeinfo, texi2dvi and texindex programs
The info program reads Info documents, usually contained in the /usr/doc/info directory. Info documents are like man(ual) pages, but they tend to be more in depth than just explaining the options to a program.
The install-info program updates the info entries. When the info program is run a list with available topics (ie: available info documents) will be presented. The install-info program is used to maintain this list of available topics. If info files are removed manually, it is also necessary to delete the topic in the index file as well. This program is used for that. It also works the other way around when info documents are added.
The makeinfo program translates Texinfo source documents into various formats. Available formats are: info files, plain text and HTML.
Texinfo-4.0 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 2 minutes Estimated required disk space: 24 MB
Install Textutils by running the following commands:
./configure --prefix=$LFS/usr --disable-nls && make LDFLAGS=-static && make install && mv $LFS/usr/bin/cat $LFS/bin
The Textutils package contains the cat, cksum, comm, csplit, cut, expand, fmt, fold, head, join, md5sum, nl, od, paste, pr, ptx, sort, split, sum, tac, tail, tr, tsort, unexpand, uniq and wc programs.
cat concatenates file(s) or standard input to standard output.
csplit outputs pieces of a file separated by (a) pattern(s) to files xx01, xx02, ..., and outputs byte counts of each piece to standard output.
fold wraps input lines in each specified file (standard input by default), writing to standard output.
od writes an unambiguous representation, octal bytes by default, of a specified file to standard output.
paste writes lines consisting of the sequentially corresponding lines from each specified file, separated by TABs, to standard output.
tr translates, squeezes, and/or deletes characters from standard input, writing to standard output.
wc prints line, word, and byte counts for each specified file, and a total line if more than one file is specified.
Textutils-2.0 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
In order for the user and group root to be recognized and to be able to login, there needs to be an entry in the /etc/passwd and /etc/group file. Besides the group root, a couple of other groups are recommended and needed by packages. The groups with their GID's below aren't part of any standard. The LSB only recommends besides a group root a group bin to be present with GID 1. Other group names and GID's can be chosen by the user. Well written packages don't depend on GID numbers but just use the group name, since it doesn't matter which GID a group has. Since there aren't any standards for groups The groups created here are the groups the MAKEDEV script (the script that creates the device files in the /dev directory) mentions.
Create a new file $LFS/etc/passwd by running the following command:
echo "root:x:0:0:root:/root:/bin/bash" > $LFS/etc/passwd
Create a new file $LFS/etc/group by running the following:
cat > $LFS/etc/group << "EOF" root:x:0: bin:x:1: sys:x:2: kmem:x:3: tty:x:4: tape:x:5: daemon:x:6: floppy:x:7: disk:x:8: lp:x:9: dialout:x:10: audio:x:11: EOF
If your normal Linux system runs Glibc-2.0, you need to copy the NSS library files to the LFS partition. Certain statically linked programs still depend on the NSS library, especially programs that need to lookup usernames, userid's and groupid's. You can check which C library version your normal Linux system uses by simply executing the library, like this:
/lib/libc.so.6
The first line will give you the release version. Following lines contain interesting information. If you have Glibc-2.0.x installed on your starting distribution, copy the NSS library files by running:
cp -av /lib/libnss* $LFS/lib
In order for certain programs to function properly, the proc file system must be mounted and available from within the chroot'ed environment as well. It's not a problem to mount the proc file system twice or even more than that, since it's a virtual file system maintained by the kernel itself.
The proc file system is mounted under $LFS/proc by running the following command:
mount proc $LFS/proc -t proc
The installation of all the software is pretty straightforward and you will probably think it's so much easier and shorter to give the generic installation instructions for each package and only explain how to install something if a certain package requires an alternate installation method. Although I agree on that, I choose to give the full instructions for each and every package. This is simply to avoid any possible confusion and errors.
Now would be a good time to take a look at the optimization hint at http://hints.linuxfromscratch.org/hints/optimization.txt if you plan on using compiler optimization for the packages installed in the following chapter. Compiler optimization can make a program run faster, but may also cause some compilation problems. If you run into problems after having used optimization, always try it without optimizing to see if you can reproduce the problem.
Most programs and libraries by default are compiled with debugging symbols (gcc option -g).
A program compiled with debugging symbols means a user can run a program or library through a debugger and the debugger's output will be user friendly. These debugging symbols also enlarge the program or library significantly.
Before you start wondering whether these debugging symbols really make a big difference, here are some statistics. Use them to draw your own conclusion.
A dynamic Bash binary with debugging symbols: 1.2MB
A dynamic Bash binary without debugging symbols: 478KB
/lib and /usr/lib (glibc and gcc files) with debugging symbols: 87MB
/lib and /usr/lib (glibc and gcc files) without debugging symbols: 16MB
Sizes vary depending on which compiler was used and which C library version was used to link dynamic programs against, but results will be similar if you compare programs with and without debugging symbols.
To remove debugging symbols from a binary (must be an a.out or ELF binary) run strip --strip-debug filename. Wild cards can be used to strip debugging symbols from multiple files (use something like strip --strip-debug $LFS/usr/bin/*). Most people will probably never use a debugger on software, so by removing those symbols a lot of disk space can be regained.
For your convenience, chapter 9 includes one simple command to strip all debugging symbols from all programs and libraries on your system.
You might find additional information in the optimization hint which can be found at http://hints.linuxfromscratch.org/hints/optimization.txt .
When we have entered the chroot'ed environment in the next section we want to export a couple of environment variables in that shell such as PS1, PATH and others variables which are good to have set. For that purpose we'll create the $LFS/root/.bash_profile file which will be read by bash when we enter the chroot environment.
Create a new file $LFS/root/.bash_profile by running the following.
cat > $LFS/root/.bash_profile << "EOF" # Begin /root/.bash_profile PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin export PS1 PATH # End /root/.bash_profile EOF
The PS1 variable is an environment variable that controls the appearance of the command prompt. See the bash man page for details how this variable is constructed. Additional environment variables, aliases and so forth that are needed and/or wanted can be added at your own discretion.
It's time to enter our chroot'ed environment in order to install the rest of the software we need.
Enter the following commands to enter the chroot'ed environment. From this point on there's no need to use the $LFS variable anymore, because everything a user does will be restricted to the LFS partition (since / is actually /mnt/lfs but the shell doesn't know that).
cd $LFS && chroot $LFS /usr/bin/env -i HOME=/root \ TERM=$TERM /bin/bash --login
The -i option will clear all environment variables for as long as you are in the chroot'ed environment and only the ROOT and TERM variables are reset. The TERM=$TERM construction will set the $TERM value inside chroot to the same value as outside chroot which is needed for programs like vim and less to operate properly. If you need other variables present, such as CFLAGS or CXXFLAGS, you need to set them again.
Now that we are inside a chroot'ed environment, we can continue to install all the basic system software. You have to make sure all the following commands in this and following chapters are run from within the chroot'ed environment. If you ever leave this environment for any reason (when rebooting for example) please remember to mount $LFS/proc again and re-enter chroot before continuing with the book.
Note that the bash prompt will contain "I have no name!" This is normal because Glibc hasn't been installed yet.
Chroot needs the following to be installed:
bash from the bash package
env from the sh-utils package
Estimated build time: 46 minutes Estimated required disk space: 350 MB
Before starting to install glibc, you must cd into the glibc-2.2.4 directory and unpack glibc-linuxthreads inside the glibc-2.2.4 directory, not in /usr/src as you normally would do.
This package is known to behave badly when you have changed it's default optimization flags (including the -march and -mcpu options). Glibc is best left alone, so we recommend you unsetting CFLAGS, CXXFLAGS and other such variables/settings that would change the default optimization that it comes with.
Install Glibc by running the following commands:
mknod -m 0666 /dev/null c 1 3 && touch /etc/ld.so.conf && cp malloc/Makefile malloc/Makefile.backup && sed 's%\$(PERL)%/usr/bin/perl%' malloc/Makefile > tmp~ && mv tmp~ malloc/Makefile && cp login/Makefile login/Makefile.backup && sed 's/root/0/' login/Makefile > tmp~ && mv tmp~ login/Makefile && mkdir ../glibc-build && cd ../glibc-build && ../glibc-2.2.4/configure --prefix=/usr \ --enable-add-ons --libexecdir=/usr/bin && cp config.make config.make.backup && sed 's/cross-compiling = yes/cross-compiling = no/' \ config.make > tmp~ && mv tmp~ config.make && make && make install && make localedata/install-locales && exec /bin/bash --login
An alternative to running make localedata/install-locales is to only install those locales which you need or want. This can be achieved using the localedef command. Information on this can be found in the INSTALL file in the glibc-2.2.4 tree.
During the configure stage you will see the following warning:
configure: warning: *** These auxiliary programs are missing or too old: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
The missing msgfmt (from the gettext package which we will install later in this chapter) is not fatal. The files msgfmt would create are already pre-built, so you won't be missing out on anything. You would only need it if you make changes to the Glibc manual files. Since we don't do this by default, we can safely ignore it.
mknod -m 0666 /dev/null c 1 3: Glibc needs a null device to compile properly. All other devices will be created in the next section.
touch /etc/ld.so.conf One of the final steps of the Glibc installation is running ldconfig to update the dynamic loader cache. If this file doesn't exist, the installation will abort with an error that it can't read the file, so we simply create an empty file (the empty file will have Glibc default to using /lib and /usr/lib which is fine).
sed 's%\$(PERL)%/usr/bin/perl%' malloc/Makefile > tmp~: This sed command searches through malloc/Makefile and converts all occurances of $(PERL) to /usr/bin/perl. The output is then written to the file tmp~. This is done because Glibc can't autodetect perl since it hasn't been installed yet.
mv tmp~ malloc/Makefile: The file tmp~ is now moved back to malloc/Makefile. We do this because when using sed, we can't write straight back to this file so we need to use a temporary file in between.
sed 's/root/0' login/Makefile > tmp~: This sed command replaces all occurances of root in login/Makefile with 0. This is because as we don't have glibc on the LFS system yet, usernames can't be resolved to their user id's. Therefore, we replace the username root with the id 0.
mv tmp~ login/Makefile: As above, we are using a temporary file (tmp~) to store the edited Makefile and then copying it back over the original.
--enable-add-ons: This enables the add-on that we install with Glibc: linuxthreads
--libexecdir=/usr/bin: This will cause the pt_chown program to be installed in the /usr/bin directory.
sed 's/cross-compiling = yes/cross-compiling = no/' config.make > config.make~: This time, we're replacing cross-compiling = yes with cross-compiling = no. We do this because we are only building for our own system. Cross-compiling is used, for instance, to build a package for an Apple Power PC on an Intel system. The reason Glibc thinks we're cross-compiling is that it can't compile a test program to determine this, so it automatically defaults to a cross-compiler. The reason for the failed program is because Glibc hasn't been installed yet.
mv config.make~ config.make: Again, we are moving the temporary file over the original.
exec /bin/bash:This command will start a new bash shell which will replace the current shell. This is done to get rid of the "I have no name!" message in the command prompt, which was caused by bash's inability to resolve a userid to a username (which in turn was caused by the missing Glibc installation).
The C Library is a collection of commonly used functions in programs. This way a programmer doesn't need to create his own functions for every single task. The most common things like writing a string to the screen are already present and at the disposal of the programmer.
The C library (actually almost every library) come in two flavors: dynamic ones and static ones. In short when a program uses a static C library, the code from the C library will be copied into the executable file. When a program uses a dynamic library, that executable will not contain the code from the C library, but instead a routine that loads the functions from the library at the time the program is run. This means a significant decrease in the file size of a program. The documentation that comes with the C Library describes this in more detail, as it is too complicated to explain here in one or two lines.
Glibc-2.2.4 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
ranlib from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mknod from the fileutils package
mv from the fileutils package
mkdir from the fileutils package
rm from the fileutils package
touch from the fileutils package
cpp from the gcc package
gcc from the gcc package
egrep from the grep package
grep from the grep package
gzip from the gzip package
make from the make package
mawk from the mawk package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
pwd from the sh-utils package
uname from the sh-utils package
cat from the textutils package
sort from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 57 KB
Note: the MAKEDEV-1.3.bz2 file you have unpacked is not an archive, so it won't create a directory for you to cd into.
Create the device files by running the following commands:
cp MAKEDEV-1.3 /dev/MAKEDEV && cd /dev && chmod 754 MAKEDEV
Now, depending on whether you are going to use devpts or not, you can run one of two commands:
If you do not intend to use devpts, run:
./MAKEDEV -v generic
If you do intend to use devpts, then run:
./MAKEDEV -v generic-nopty
Note that if you aren't sure, it's best to use the ./MAKEDEV -v generic command as this will ensure you have the devices you need. If you are sure you are going to use devpts however, the other command makes sure that you don't create a set of devices which you don't require.
MAKEDEV will create hda[1-20] to hdh[1-20] and such but keep in mind that you may not be able to use all of those devices due to kernel limitations regarding the max. number of partitions.
./MAKEDEV -v generic: This creates generic devices. Normally, these devices are all the devices you need. It's possible that you are missing some special devices that are needed for your hardware configuration. Create them with ./MAKEDEV -v <device>. The generic-nopty option does a similar job but skips some devices which are not needed if you are using devpts.
MAKEDEV is a script that can help in creating the necessary static device files that usually reside in the /dev directory.
MAKEDEV-1.3 needs the following to be installed:
sh from the bash package
chmod from the fileutils package
chown from the fileutils package
cp from the fileutils package
ln from the fileutils package
mknod from the fileutils package
mv from the fileutils package
rm from the fileutils package
grep from the grep package
expr from the sh-utils package
Estimated build time: 1 minute Estimated required disk space: 5 MB
Before man-pages is installed, the patch file has to be unpacked. Install Man-pages by running the following commands:
patch -Np1 -i ../man-pages-1.39.patch && make install
patch -Np1 -i ../man-pages-1.39.patch: We patch the man-pages package to include pages for ldd and ld.so.
Examples of provided manual pages are the manual pages describing all the C and C++ functions, few important /dev/ files and more.
Man-pages-1.39 needs the following to be installed:
sh from the bash package
install from the fileutils package
make from the make package
patch from the patch package
Estimated build time: 1 minute Estimated required disk space: 3 MB
Before Findutils is installed the findutils patch file has to be unpacked.
Install Findutils by running the following commands:
patch -Np1 -i ../findutils-4.1.patch && ./configure --prefix=/usr && make && make libexecdir=/usr/bin install
patch -Np1 -i ../findutils-4.1.patch: This patch is to fix some compliation errors by avoiding a variable conflict and changing some bad syntax.
The Findutils package contains the find, locate, updatedb, xargs, frcode, code and bigram programs.
The find program searches for files in a directory hierarchy which match a certain criteria. If no criteria is given, it lists all files in the current directory and it's subdirectories.
Locate scans a database which contain all files and directories on a filesystem. This program lists the files and directories in this database matching a certain criteria. If a user is looking for a file this program will scan the database and tell him exactly where the files he requested are located. This only makes sense if the locate database is fairly up-to-date else it will provide out-of-date information.
The updatedb program updates the locate database. It scans the entire file system (including other file system that are currently mounted unless it is told not to do so) and puts every directory and file it finds into the database that's used by the locate program which retrieves this information. It's a good practice to update this database once a day to have it up-to-date whenever it is needed.
The xargs command applies a command to a list of files. If there is a need to perform the same command on multiple files, a file can be created that contains all these files (one per line) and use xargs to perform that command on the list.
updatedb runs a program called frcode to compress the list of file names using front-compression, which reduces the database size by a factor of 4 to 5.
bigram is used together with code to produce older-style locate databases. To learn more about these last three programs, read the locatedb.5 manual page.
Findutils-4.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
grep from the grep package
cc from the gcc package
make from the make package
patch from the patch package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Mawk by running the following commands:
./configure && make && make BINDIR=/usr/bin \ MANDIR=/usr/share/man/man1 install && cd /usr/bin && ln -sf mawk awk
Mawk is an interpreter for the AWK Programming Language. The AWK language is useful for manipulation of data files, text retrieval and processing, and for prototyping and experimenting with algorithms.
Mawk-1.3.3 needs the following to be installed:
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
rm from the fileutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
tee from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 6 minutes Estimated required disk space: 29 MB
Install Ncurses by running the following commands:
./configure --prefix=/usr --libdir=/lib \ --with-shared --disable-termcap && make && make install && cd /lib && mv *.a /usr/lib && chmod 755 *.5.2 && cd /usr/lib && ln -sf libncurses.a libcurses.a && ln -sf ../../lib/libncurses.so && ln -sf ../../lib/libcurses.so && ln -sf ../../lib/libform.so && ln -sf ../../lib/libpanel.so && ln -sf ../../lib/libmenu.so
--with-shared: This enables the build of the shared ncurses library files.
--disable-termcap: Disabled the compilation of termcap fall back support.
cd /lib && mv *.a /usr/lib : This moves all of the static ncurses library files from /lib to /usr/lib. /lib should only contain the shared files which are essential to the system when /usr may not be mounted.
chmod 755 *.5.2: Shared libraries should be executable. Ncurses install routine doesn't set the permissions properly so we do it manaully instead.
ln -sf libncurses.a libcurses.a: Some programs try to link using -lcurses instead of -lncurses. This symlink ensures that such programs will link without errors.
ln -sf ../../lib/libncurses.so etc: These links are created because if they aren't, the linker will not find the dynamic libraries when linking and so link all programs with the static versions.
The Ncurses package contains the ncurses, panel, menu and form libraries. It also contains the tic, infocmp, clear, tput, toe and tset programs.
The libraries that make up the Ncurses library are used to display text (often in a fancy way) on the screen. An example where ncurses is used is in the kernel's "make menuconfig" process. The libraries contain routines to create panels, menu's, form and general text display routines.
Tic is the terminfo entry-description compiler. The program translates a terminfo file from source format into the binary format for use with the ncurses library routines. Terminfo files contain information about the capabilities of a terminal.
The infocmp program can be used to compare a binary terminfo entry with other terminfo entries, rewrite a terminfo description to take advantage of the use= terminfo field, or print out a terminfo description from the binary file (term) in a variety of formats (the opposite of what tic does).
The clear program clears the screen if this is possible. It looks in the environment for the terminal type and then in the terminfo database to figure out how to clear the screen.
The tput program uses the terminfo database to make the values of terminal-dependent capabilities and information available to the shell, to initialize or reset the terminal, or return the long name of the requested terminal type.
The Tset program initializes terminals so they can be used, but it's not widely used anymore. It's provided for 4.4BSD compatibility.
Ncurses-5.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
c++ from the gcc package
gcc from the gcc package
egrep from the grep package
fgrep from the grep package
grep from the grep package
make from the make package
mawk from the mawk package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
test from the sh-utils package
uname from the sh-utils package
cat from the textutils package
sort from the textutils package
tr from the textutils package
wc from the textutils package
Estimated build time: 2 minutes Estimated required disk space: 15 MB
If you don't like vim to be installed as an editor on the LFS system, you may want to download an alternative and install an editor you prefer. There are a few hints how to install different editors available at http://hints.linuxfromscratch.org/hints/. The hints which are currently available are for Emacs, Joe and nano.
Both the vim-rt and vim-src packages need to be unpacked to install Vim. Both packages will unpack their files into the vim-5.8 directory. This won't overwrite any files from the other package. So it doesn't matter in which order it is done. Install Vim by running the following commands:
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> \ src/feature.h && ./configure --prefix=/usr && make && make install && cd /usr/bin && ln -sf vim vi
If you plan on installing the X Window system on your LFS system, you might want to re-compile Vim after you have installed X. Vim comes with a nice GUI version of the editor which requires X and a few other libraries to be installed. For more information read the Vim documentation.
The FHS says that editors like vim should use /var/lib/<editor> for their temporary state files, like temporary save files for example. If you wish vim to conform to the FHS, you should use this command set instead of the one presented above:
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> \ src/feature.h && ./configure --prefix=/usr --localstatedir=/var/lib/vim && make && make install && cd /usr/bin && ln -sf vim vi && mkdir /var/lib/vim
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h: This will change the location of the global vim configuration file vimrc to /etc rather than /usr/share/vim
The Vim package contains the ex, gview, gvim, rgview, rgvim, rview, rvim, view, vim, vimtutor and xxd programs.
ex starts vim in Ex mode.
rview is a restricted version of view. No shell commands can be started and Vim can't be suspended.
rvim is the restricted version of vim. No shell commands can be started and Vim can't be suspended.
Vim-5.8 needs the following to be installed:
sh from the bash package
ld from the binutils package
as from the binutils package
cmp from the diffutils package
diff from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
find from the find package
cc from the gcc package
grep from the grep package
make from the make package
hostname from the net-tools package
sed from the sed package
echo from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
whoami from the sh-utils package
cat from the textutils package
tr from the textutils package
wc from the textutils package
Estimated build time: 22 minutes Estimated required disk space: 148 MB
This package is known to behave badly when you have changed it's default optimization flags (including the -march and -mcpu options). GCC is best left alone, so we recommend you unsetting CFLAGS, CXXFLAGS and other such variables/settings that would change the default optimization that it comes with.
Install GCC by running the following commands. These commands will build the C and C++ compiler. Other compilers are available within the gcc package. If you want to build all the other availble compilers too, leave out the --enable-languages=c,c++ option in the configure command. See the GCC documentation for more details on which additional compilers are available.
Note: the build of other compilers is not tested by the people who actively work on LFS.
patch -Np1 -i ../gcc-2.95.3-2.patch && mkdir ../gcc-build && cd ../gcc-build && ../gcc-2.95.3/configure --prefix=/usr --enable-shared \ --enable-languages=c,c++ --enable-threads && make bootstrap && make install
--enable-threads: C++ exception handling for multithreaded code will not work if gcc is compiled without --enable-threads.
A compiler translates source code in text format to a format that a computer understands. After a source code file is compiled into an object file, a linker will create an executable file from one or more of these compiler generated object files.
A preprocessor pre-processes a source file, such as including the contents of header files into the source file. It's a good idea to not do this manually to save a lot of time. Someone just inserts a line like #include <filename>. The preprocessor inserts the contents of that file into the source file. That's one of the things a preprocessor does.
The C++ library is used by C++ programs. The C++ library contains functions that are frequently used in C++ programs. This way the programmer doesn't have to write certain functions (such as writing a string of text to the screen) from scratch every time he creates a program.
GCC-2.95.3 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
ranlib from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
find from the find package
gcc from the gcc package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
mawk from the mawk package
sed from the sed package
basename from the sh-utils package
echo from the sh-util package
expr from the sh-utils package
sleep from the sh-utils package
true from the sh-utils package
uname from the sh-utils package
tar from the tar package
makeinfo from the texinfo package
cat from the textutils package
head from the textutils package
sort from the textutils package
tail from the textutils package
tr from the textutils package
uniq from the textutils package
Estimated build time: 1 minute Estimated required disk space: 3 MB
Install Bison by running the following commands:
./configure --prefix=/usr \ --datadir=/usr/share/bison && make && make install
Some programs don't know about bison and try to find the yacc program (bison is a (better) alternative for yacc). So to please those few programs out there we'll create a yacc script that calls bison and have it emulate yacc's output file name conventions).
Create a new file /usr/bin/yacc by running the following:
cat > /usr/bin/yacc << "EOF" #!/bin/sh # Begin /usr/bin/yacc exec /usr/bin/bison -y "$@" # End /usr/bin/yacc EOF chmod 755 /usr/bin/yacc
--datadir=/usr/share/bison: This installs the bison grammar files in /usr/share/bison rather than /usr/share.
Bison is a parser generator, a replacement for YACC. YACC stands for Yet Another Compiler Compiler. What is Bison then? It is a program that generates a program that analyzes the structure of a text file. Instead of writing the actual program a user specifies how things should be connected and with those rules a program is constructed that analyzes the text file.
There are a lot of examples where structure is needed and one of them is the calculator.
Given the string :
1 + 2 * 3
A human can easily come to the result 7. Why? Because of the structure. Our brain knows how to interpret the string. The computer doesn't know that and Bison is a tool to help it understand by presenting the string in the following way to the compiler:
+
/ \
* 1
/ \
2 3
Starting at the bottom of a tree and coming across the numbers 2 and 3 which are joined by the multiplication symbol, the computer multiplies 2 and 3. The result of that multiplication is remembered and the next thing that the computer sees is the result of 2*3 and the number 1 which are joined by the add symbol. Adding 1 to the previous result makes 7. In calculating the most complex calculations can be broken down in this tree format and the computer just starts at the bottom and works it's way up to the top and comes with the correct answer. Of course, Bison isn't only used for calculators alone.
Bison-1.28 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
rm from the fileutils package
cp from the fileutils package
mkdir from the fileutils package
ls from the fileutils package
chmod from the fileutils package
mv from the fileutils package
ln from the fileutils package
cc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
tr from the textutils package
cat from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Less by running the following commands:
./configure --prefix=/usr --bindir=/bin && make && make install
The less program is a file pager (or text viewer). It displays the contents of a file with the ability to scroll. Less is an improvement on the common pager called "more". Less has the ability to scroll backwards through files as well and it doesn't need to read the entire file when it starts, which makes it faster when reading large files.
Less-358 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
grep from the grep package
cc from the gcc package
make from the make package
sed from the sed package
dirname from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 2 minutes Estimated required disk space: 16 MB
Install Groff by running the following commands:
./configure --prefix=/usr && make && make install
The Groff packages contains the addftinfo, afmtodit, eqn, grodvi, groff, grog, grohtml, grolj4, grops, grotty, hpftodit, indxbib, lkbib, lookbib, neqn, nroff, pfbtops, pic, psbb, refer, soelim, tbl, tfmtodit and troff programs.
addftinfo reads a troff font file and adds some additional font-metric information that is used by the groff system.
eqn compiles descriptions of equations embedded within troff input files into commands that are understood by troff.
groff is a front-end to the groff document formatting system. Normally it runs the troff program and a post-processor appropriate for the selected device.
grog reads files and guesses which of the groff options -e, -man, -me, -mm, -ms, -p, -s, and -t are required for printing files, and prints the groff command including those options on the standard output.
grolj4 is a driver for groff that produces output in PCL5 format suitable for an HP Laserjet 4 printer.
indxbib makes an inverted index for the bibliographic databases a specified file for use with refer, lookbib, and lkbib.
lkbib searches bibliographic databases for references that contain specified keys and prints any references found on the standard output.
lookbib prints a prompt on the standard error (unless the standard input is not a terminal), reads from the standard input a line containing a set of keywords, searches the bibliographic databases in a specified file for references containing those keywords, prints any references found on the standard output, and repeats this process until the end of input.
pic compiles descriptions of pictures embedded within troff or TeX input files into commands that are understood by TeX or troff.
psbb reads a file which should be a Postscript document conforming to the Document Structuring conventions and looks for a %%BoundingBox comment.
refer copies the contents of a file to the standard output, except that lines between .[ and .] are interpreted as citations, and lines between .R1 and .R2 are interpreted as commands about how citations are to be processed.
tbl compiles descriptions of tables embedded within troff input files into commands that are understood by troff.
troff is highly compatible with Unix troff. Usually it should be invoked using the groff command, which will also run preprocessors and post-processors in the appropriate order and with the appropriate options.
Groff-1.17.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
bison from the bison package
yacc from the bison package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
c++ from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
awk from the mawk package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
touch from the fileutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 1 MB
Run the following commands to install man:
for i in configure src/Makefile.in src/makewhatis.sh do cp $i $i.backup && sed 's/gawk/awk/g' $i > tmp~ && mv tmp~ $i done chmod 700 configure && ./configure -default && make && make install
You may want to take a look at the man hint at http://hints.linuxfromscratch.org/hints/man.txt which deals with formatting and compression issues for man pages.
for ... sed ... done: This construct changes man so that it uses awk instead of gawk which is the default. We use this as LFS uses awk instead of gawk.
man formats and displays the on-line manual pages.
apropos searches a set of database files containing short descriptions of system commands for keywords and displays the result on the standard output.
whatis searches a set of database files containing short descriptions of system commands for keywords and displays the result on the standard output. Only complete word matches are displayed.
makewhatis reads all the manual pages contained in given sections of manpath or the pre-formatted pages contained in the given sections of catpath. For each page, it writes a line in the whatis database; each line consists of the name of the page and a short description, separated by a dash. The description is extracted using the content of the NAME section of the manual page.
Man-1.5i2 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
bzip2 from the bzip2 package
chmod from the fileutils package
cp from the fileutils package
install from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
gcc from the gcc package
grep from the grep package
gunzip from the gzip package
zcat from the gzip package
make from the make package
awk from the mawk package
sed from the sed package
echo from the sh-utils package
cat from the textutils package
Estimated build time: 6 minutes Estimated required disk space: 35 MB
Install Perl by running the following commands:
./Configure -Dprefix=/usr && make && make install
If you don't want to answer all those questions Perl asks, you can add the -d option to the configure script and Perl will use all the default settings. To avoid the Configure script asking questions after the config.sh file has been created you can pass the -e parameter to perl as well. The commands with these parameters included will be:
./Configure -Dprefix=/usr -d -e && make && make install
Perl combines the features and capabilities of C, awk, sed and sh into one powerful programming language.
Perl-5.6.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
bison from the bison package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
gcc from the gcc package
egrep from the grep package
grep from the grep package
nroff from the groff package
gzip from the gzip package
less from the less package
make from the make package
awk from the mawk package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
tee from the sh-utils package
test from the sh-utils package
true from the sh-utils package
uname from the sh-utils package
cat from the textutils package
comm from the textutils package
sort from the textutils package
split from the textutils package
tr from the textutils package
uniq from the textutils package
wc from the textutils package
Estimated build time: 1 minute Estimated required disk space: 3 MB
Install M4 by running the following commands:
./configure --prefix=/usr && make && make install
M4 is a macro processor. It copies input to output expanding macros as it goes. Macros are either built-in or user-defined and can take any number of arguments. Besides just doing macro expansion m4 has built-in functions for including named files, running UNIX commands, doing integer arithmetic, manipulating text in various ways, recursion, etc. M4 can be used either as a front-end to a compiler or as a macro processor in its own right.
M4-1.4 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
make from the make package
cc from the gcc package
egrep from the grep package
grep from the grep package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 10 MB
Install Texinfo by running the following commands:
./configure --prefix=/usr && make && make install && make TEXMF=/usr/share/texmf install-tex
make TEXMF=/usr/share/texmf install-tex: This installs the texinfo components that belong in a TeX installation. Although TeX isn't installed on LFS, it's installed here in case you are going to use TeX. As it's completely optional, feel free to skip it.
The Texinfo package contains the info, install-info, makeinfo, texi2dvi and texindex programs
The info program reads Info documents, usually contained in the /usr/doc/info directory. Info documents are like man(ual) pages, but they tend to be more in depth than just explaining the options to a program.
The install-info program updates the info entries. When the info program is run a list with available topics (ie: available info documents) will be presented. The install-info program is used to maintain this list of available topics. If info files are removed manually, it is also necessary to delete the topic in the index file as well. This program is used for that. It also works the other way around when info documents are added.
The makeinfo program translates Texinfo source documents into various formats. Available formats are: info files, plain text and HTML.
Texinfo-4.0 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 4 MB
Install Autoconf by running the following commands:
./configure --prefix=/usr && make && make install
The Autoconf package contains the autoconf, autoheader, autoreconf, autoscan, autoupdate and ifnames programs
Autoconf is a tool for producing shell scripts that automatically configure software source code packages to adapt to many kinds of UNIX-like systems. The configuration scripts produced by Autoconf are independent of Autoconf when they are run, so their users do not need to have Autoconf.
The autoheader program can create a template file of C #define statements for configure to use
If there are a lot of Autoconf-generated configure scripts, the autoreconf program can save some work. It runs autoconf (and autoheader, where appropriate) repeatedly to remake the Autoconf configure scripts and configuration header templates in the directory tree rooted at the current directory.
The autoscan program can help to create a configure.in file for a software package. autoscan examines source files in the directory tree rooted at a directory given as a command line argument, or the current directory if none is given. It searches the source files for common portability problems and creates a file configure.scan which is a preliminary configure.in for that package.
The autoupdate program updates a configure.in file that calls Autoconf macros by their old names to use the current macro names.
ifnames can help when writing a configure.in for a software package. It prints the identifiers that the package already uses in C preprocessor conditionals. If a package has already been set up to have some portability, this program can help to figure out what its configure needs to check for. It may help fill in some gaps in a configure.in generated by autoscan.
Autoconf-2.52 needs the following to be installed:
sh from the bash package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
m4 from the m4 package
make from the make package
perl from the perl package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 3 MB
Install Automake by running the following commands:
./configure --prefix=/usr && make install
Automake includes a number of Autoconf macros which can be used in packages; some of them are actually required by Automake in certain situations. These macros must be defined in the aclocal.m4-file; otherwise they will not be seen by autoconf.
The aclocal program will automatically generate aclocal.m4 files based on the contents of configure.in. This provides a convenient way to get Automake-provided macros, without having to search around. Also, the aclocal mechanism is extensible for use by other packages.
To create all the Makefile.in's for a package, run the automake program in the top level directory, with no arguments. automake will automatically find each appropriate Makefile.am (by scanning configure.in) and generate the corresponding Makefile.in.
Automake-1.5 needs the following to be installed:
sh from the bash package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
grep from the grep package
make from the make package
perl from the perl package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 3 minutes Estimated required disk space: 19 MB
Install Bash by running the following commands:
./configure --prefix=/usr --with-curses \ --bindir=/bin && make && make install && exec /bin/bash --login
Bash is the Bourne-Again SHell, which is a widely used command interpreter on Unix systems. Bash is a program that reads from standard input, the keyboard. A user types something and the program will evaluate what he has typed and do something with it, like running a program.
Bash-2.05 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
size from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 3MB
Install Flex by running the following commands:
./configure --prefix=/usr && make && make install && cd /usr/bin && ln -sf flex lex
Flex is a tool for generating programs which recognize patterns in text. Pattern recognition is very useful in many applications. A user sets up rules what to look for and flex will make a program that looks for those patterns. The reason people use flex is that it is much easier to sets up rules for what to look for than to write the actual program that finds the text.
Flex-2.5.4a needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
bison from the bison package
yacc from the bison package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
dirname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install File by running the following commands:
cp readelf.h readelf.h.backup && sed $'/#define __/a \\\n#include <stdint.h>' readelf.h.backup > readelf.h && ./configure --prefix=/usr --datadir=/usr/share/misc && make && make install
File uses magic numbers to determine a file type. These magic numbers come with File in a plain text file. File internally compiles this database each time it is run. This is not the normal type of operation for File since compiling a plain text file each time is not the fastest way to do it. File offers an option "-C" to compile this magic number file. The reason this isn't done automatically is that some people like to work on the magic numbers. On the other hand many people didn't get it that they should compile the magic numbers, so the author of File added a warning when the plain text magic file is used. As we usually won't work on the plain text magic file, we compile this file, because it's faster, fixes that annoying warning and is how it was meant to be:
file -C
sed $'/#define __/a \\\n#include <stdint.h>' readelf.h.backup > readelf.h : This sed fixes an error which occurs when compiling file-3.36 with automake-1.5 installed.
File tests each specified file in an attempt to classify it. There are three sets of tests, performed in this order: filesystem tests, magic number tests, and language tests. The first test that succeeds causes the file type to be printed.
File-3.36 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 5 MB
Install Libtool by running the following commands:
./configure --prefix=/usr && make && make install
The Libtool package contains the libtool and libtoolize programs. It also contains the ltdl library.
Libtool provides generalized library-building support services.
Libtool provides a small library, called `libltdl', that aims at hiding the various difficulties of dlopening libraries from programmers.
Libtool-1.4 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
rmdir from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 1 MB
This package is only needed if you decide to use Lilo on your LFS system. If you're going to use something else like Grub you won't need bin86. Check the documentation for your favorite boot loader to see if you need the bin86 package (usually only ld86 and/or as86 from this package are required).
Keep in mind, though, that it's not just boot loaders that use the bin86 package. There is always the chance that some other package needs programs from this package, so keep that in mind if you decide to skip this.
Install Bin86 by running the following commands:
make && make PREFIX=/usr install
as86 is an assembler for the 8086...80386 processors.
as86_encap is a shell script to call as86 and convert the created binary into a C file prog.v to be included in or linked with programs like boot block installers.
ld86 understands only the object files produced by the as86 assembler, it can link them into either an impure or a separate I&D executable.
Bin86-0.16.0 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
strip from the binutils package
chmod from the fileutils package
install from the fileutils package
ln from the fileutils package
mv from the fileutils package
cc from the gcc package
make from the make package
sed from the sed package
Estimated build time: 6 minutes Estimated required disk space: 85 MB
This package is known to behave badly when you have changed it's default optimization flags (including the -march and -mcpu options). Binutils is best left alone, so we recommend you unsetting CFLAGS, CXXFLAGS and other such variables/settings that would change the default optimization that it comes with.
Install Binutils by running the following commands:
./configure --prefix=/usr --enable-shared && make tooldir=/usr && make tooldir=/usr install && make tooldir=/usr install-info
The Binutils package contains the gasp, gprof, ld, as, ar, nm, objcopy, objdump, ranlib, readelf, size, strings, strip, c++filt and addr2line programs
Gasp is the Assembler Macro Preprocessor.
ld combines a number of object and archive files, relocates their data and ties up symbol references. Often the last step in building a new compiled program to run is a call to ld.
as is primarily intended to assemble the output of the GNU C compiler gcc for use by the linker ld.
The ar program creates, modifies, and extracts from archives. An archive is a single file holding a collection of other files in a structure that makes it possible to retrieve the original individual files (called members of the archive).
objcopy utility copies the contents of an object file to another. objcopy uses the GNU BFD Library to read and write the object files. It can write the destination object file in a format different from that of the source object file.
objdump displays information about one or more object files. The options control what particular information to display. This information is mostly useful to programmers who are working on the compilation tools, as opposed to programmers who just want their program to compile and work.
ranlib generates an index to the contents of an archive, and stores it in the archive. The index lists each symbol defined by a member of an archive that is a relocatable object file.
size lists the section sizes --and the total size-- for each of the object files objfile in its argument list. By default, one line of output is generated for each object file or each module in an archive.
For each file given, strings prints the printable character sequences that are at least 4 characters long (or the number specified with an option to the program) and are followed by an unprintable character. By default, it only prints the strings from the initialized and loaded sections of object files; for other types of files, it prints the strings from the whole file.
strings is mainly useful for determining the contents of non-text files.
strip discards all or specific symbols from object files. The list of object files may include archives. At least one object file must be given. strip modifies the files named in its argument, rather than writing modified copies under different names.
The C++ language provides function overloading, which means that it is possible to write many functions with the same name (providing each takes parameters of different types). All C++ function names are encoded into a low-level assembly label (this process is known as mangling). The c++filt program does the inverse mapping: it decodes (demangles) low-level names into user-level names so that the linker can keep these overloaded functions from clashing.
addr2line translates program addresses into file names and line numbers. Given an address and an executable, it uses the debugging information in the executable to figure out which file name and line number are associated with a given address.
Binutils-2.11.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
ranlib from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
rmdir from the fileutils package
touch from the fileutils package
gcc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
makeinfo from the texinfo package
cat from the textutils package
sort from the textutils package
tail from the textutils package
tr from the textutils package
true from the sh-utils package
uniq from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Bzip2 by running the following commands:
make -f Makefile-libbz2_so && make bzip2recover libbz2.a && ln -s libbz2.so.1.0.1 libbz2.so && cp bzip2-shared /bin/bzip2 && cp bzip2recover /bin && cp bzip2.1 /usr/share/man/man1 && cp bzlib.h /usr/include && cp -a libbz2.so* /lib && rm /usr/lib/libbz2.a && cp libbz2.a /usr/lib && cd /usr/lib && ln -sf ../../lib/libbz2.so && cd /bin && ln -sf bzip2 bunzip2 && ln -sf bzip2 bzcat && cd /usr/share/man/man1 && ln -sf bzip2.1 bunzip2.1 && ln -sf bzip2.1 bzcat.1 && ln -sf bzip2.1 bzip2recover.1
Although it's not strictly a part of a basic LFS system it's worth mentioning that a patch for Tar can be downloaded which enables the tar program to compress and uncompress using bzip2/bunzip2 easily. With a plain tar, you have to use constructions like bzcat file.tar.bz|tar xv or tar --use-compress-prog=bunzip2 -xvf file.tar.bz2 to use bzip2 and bunzip2 with tar. This patch provides the -j option so you can unpack a Bzip2 archive with tar xvfj file.tar.bz2. Applying this patch will be mentioned later on when the Tar package is re-installed.
make -f Makefile-libbz2_so: This will cause bzip2 to be built using a different Makefile file, in this case the Makefile-libbz2_so file which creates a dynamic libbz2.so library and links the bzip2 utilities against it.
The reason we don't use make install is that bzip2's make install doesn't install the shared libbz2.so, nor the bzip2 binary that's linked against that library. So we have no choice but to manually install the files.
bzip2 compresses files using the Burrows-Wheeler block sorting text compression algorithm, and Huffman coding. Compression is generally considerably better than that achieved by more conventional LZ77/LZ78-based compressors, and approaches the performance of the PPM family of statistical compressors.
Bzip2-1.0.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cp from the fileutils package
ln from the fileutils package
rm from the fileutils package
gcc from the gcc package
make from the make package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Ed is an optional package. The only program on a normal LFS system that uses ed is patch. But these days, ed patch files are quite rare in favour of the diff format patch files. So, if you personally have no need to use ed, you can skip it.
Install Ed by running the following commands:
cp buf.c buf.c.backup && sed 's/int u/int u, sfd/' buf.c.backup | \ sed '/.*\*mktemp.*/d' | \ sed 's/.*if (mktemp.*/ sfd = mkstemp(sfn);\ if ((sfd == -1) || (sfp = fopen (sfn, "w+")) == NULL)/' > buf.c && ./configure --prefix=/usr && make && make install && mv /usr/bin/ed /usr/bin/red /bin
The sed commands fix a symlink vulnerability in ed. The ed executable creates files in /tmp with predictable names. By using various symlink attacks, it is possible to have ed write to files it should not, change the permissions of various files, etc.
Ed is a line-oriented text editor. It is used to create, display, modify and otherwise manipulate text files.
Ed-0.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
cc from the gcc package
grep from the grep package
egrep from the grep package
make from the make package
sed from the sed package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 11MB
Install Gettext by running the following commands:
./configure --prefix=/usr && make && make install
The gettext package contains the gettext, gettextize, msgcmp, msgcomm, msgfmt, msgmerge, msgunfmt and xgettext programs.
The gettext package is used for internationalization (also known as i18n) and for localization (also known as l10n). Programs can be compiled with Native Language Support (NLS) which enable them to output messages in the users native language rather than in the default English language.
Gettext-0.10.39 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
rmdir from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
sort from the textutils package
tr from the textutils package
uniq from the textutils package
Estimated build time: 1 minute Estimated required disk space: 8 MB
Install Kbd by running the following commands:
./configure --datadir=/usr/share/kbd && make && make install
When using the loadkeys program from this package, don't use the -d option to load a default keymap file. It won't work properly with keymaps that include other keymaps.
--datadir=/usr/share/kbd: This puts the kbd data files (fonts, keymaps, and such) in the /usr/share/kbd directory, as the FHS suggests.
The Kbd package contains the chvt, deallocvt, dumpkeys, fgconsole, getkeycodes, kbd_mode, kbdrate, loadkeys, loadunimap, mapscrn, psfxtable, resizecons, screendump, setfont, setkeycodes, setleds, setmetamode, setvesablank, showfont, showkey, unicode_start, and unicode_stop programs. There are some other programs that don't get installed by default, as they are very optional. Take a look at the Kbd package contents if you have trouble with your console.
chvt changes foreground virtual terminal.
mapscrn loads a user defined output character mapping table into the console driver. Note that it is obsolete and that its features are built into setfont.
setleds sets the keyboard LEDs. Many people find it useful to have numlock enabled by default, and it is by using this program that you can achieve this.
This lets you fiddle with the built-in hardware screensaver (not toasters, only a blank screen).
showfont displays data about a font. The information shown includes font information, font properties, character metrics, and character bitmaps.
Kbd-1.06 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils packag
strip from the binutils package
bison from the bison package
cp from the fileutils package
install from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
flex from the flex package
cpp from the gcc package
gcc from the gcc package
gunzip from the gzip package
gzip from the gzip package
make from the make package
sed from the sed package
uname from the sh-utils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Diffutils by running the following commands:
./configure --prefix=/usr && make && make install
cmp and diff both compare two files and report their differences. Both programs have extra options which compare files in different situations.
Diffutils-2.7 needs the following to be installed:
sh from the bash package
ld from the binutils package
as from the binutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 2 minutes Estimated required disk space: 21 MB
Install E2fsprogs by running the following commands:
./configure --prefix=/usr --with-root-prefix=/ \ --enable-elf-shlibs && make && make install && make install-libs
--with-root-prefix=/: The reason for supplying this option is because of the setup of the e2fsprogs Makefile. Some programs are essential for system use when, for example, /usr isn't mounted (like the e2fsck program). These programs and libraries therefore belong in directories like /lib and /sbin. If this option isn't passed to e2fsprogs' configure, it places these programs in /usr which is not what we want.
--enable-elf-shlibs: This creates shared libraries that some programs in this package can make use of.
make install-libs: This installs the shared libraries that are built.
The e2fsprogs package contains the chattr, lsattr, uuidgen, badblocks, debugfs, dumpe2fs, e2fsck, e2label, fsck, fsck.ext2, mke2fs, mkfs.ext2, mklost+found and tune2fs programs.
chattr changes the file attributes on a Linux second extended file system.
The uuidgen program creates a new universally unique identifier (UUID) using the libuuid library. The new UUID can reasonably be considered unique among all UUIDs created on the local system, and among UUIDs created on other systems in the past and in the future.
The debugfs program is a file system debugger. It can be used to examine and change the state of an ext2 file system.
dumpe2fs prints the super block and blocks group information for the filesystem present on a specified device.
e2fsck is used to check a Linux second extended file system. fsck.ext2 does the same as e2fsck.
e2label will display or change the filesystem label on the ext2 filesystem located on the specified device.
mke2fs is used to create a Linux second extended file system on a device (usually a disk partition). mkfs.ext2 does the same as mke2fs.
mklost+found is used to create a lost+found directory in the current working directory on a Linux second extended file system. mklost+found pre-allocates disk blocks to the directory to make it usable by e2fsck.
E2fsprogs-1.22 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
sync from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
gzip from the gzip package
make from the make package
awk from the mawk package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
makeinfo from the texinfo package
cat from the textutils package
tr from the textutils package
Estimated build time: 3 minutes Estimated required disk space: 16 MB
Install Fileutils by running the following commands:
./configure --prefix=/usr --bindir=/bin \ --libexecdir=/bin && make && make install
The Fileutils package contains the chgrp, chmod, chown, cp, dd, df, dir, dircolors, du, install, ln, ls, mkdir, mkfifo, mknod, mv, rm, rmdir, sync, touch and vdir programs.
chgrp changes the group ownership of each given file to the named group, which can be either a group name or a numeric group ID.
chmod changes the permissions of each given file according to mode, which can be either a symbolic representation of changes to make, or an octal number representing the bit pattern for the new permissions.
dd copies a file (from the standard input to the standard output, by default) with a user-selectable blocksize, while optionally performing conversions on it.
df displays the amount of disk space available on the filesystem containing each file name argument. If no file name is given, the space available on all currently mounted filesystems is shown.
dir and vdir are versions of ls with different default output formats. These programs list each given file or directory name. Directory contents are sorted alphabetically. For ls, files are by default listed in columns, sorted vertically, if the standard output is a terminal; otherwise they are listed one per line. For dir, files are by default listed in columns, sorted vertically. For vdir, files are by default listed in long format.
dircolors outputs commands to set the LS_COLOR environment variable. The LS_COLOR variable is use to change the default color scheme used by ls and related utilities.
du displays the amount of disk space used by each argument and for each subdirectory of directory arguments.
install copies files and sets their permission modes and, if possible, their owner and group.
mv moves files from one directory to another or renames files, depending on the arguments given to mv.
touch changes the access and modification times of each given file to the current time. Files that do not exist are created empty.
Fileutils-4.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
install from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
uniq from the textutils package
Estimated build time: 1 minute Estimated required disk space: 3 MB
Install Grep by running the following commands:
./configure --prefix=/usr && make && make install
egrep prints lines from files matching an extended regular expression pattern.
fgrep prints lines from files matching a list of fixed strings, separated by newlines, any of which is to be matched.
Grep-2.4.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 1 MB
Install Gzip by running the following commands:
./configure --prefix=/usr && make && make install && cd /usr/bin && mv gzip /bin && rm gunzip zcat && cd /bin && ln -sf gzip gunzip && ln -sf gzip zcat && ln -sf gzip compress && ln -sf gunzip uncompress
The Gzip package contains the compress, gunzip, gzexe, gzip, uncompress, zcat, zcmp, zdiff, zforce, zgrep, zmore and znew programs.
gunzip decompresses files that are compressed with gzip.
gzexe allows you to compress executables in place and have them automatically uncompress and execute when they are run (at a penalty in performance).
zcat uncompresses either a list of files on the command line or its standard input and writes the uncompressed data on standard output
zforce forces a .gz extension on all gzip files so that gzip will not compress them twice. This can be useful for files with names truncated after a file transfer.
zmore is a filter which allows examination of compressed or plain text files one screen at a time on a soft-copy terminal (similar to the more program).
Gzip-1.2.4a needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
nm from the binutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 3 MB
We have chosen Lilo because we feel confortable with it, but you may wish to take a look elsewhere. Someone has written a hint on GRUB at http://hints.linuxfromscratch.org/hints/grub-howto.txt, an alternative boot loader.
Install Lilo by running the following commands:
make && make install
It appears that compilation of this package fails on certain machines when the -g compiler flag is being used. If you can't compile Lilo at all, you should try to remove the -g value from the CFLAGS variable in the Makefile file.
At the end of the installation the make install process will print a message stating that /sbin/lilo has to be executed to complete the update. Don't do this as it has no use. The /etc/lilo.conf isn't present yet. We will complete the installation of lilo in chapter 8.
Maybe you'll be interested to know that someone wrote a hint on how to get a logo instead the the standard LILO prompt or menu. Take a look at it at http://hints.linuxfromscratch.org/hints/bootlogo.txt .
Lilo-21.7.5 needs the following to be installed:
sh from the bash package
as86 from the bin86 package
ld86 from the bin86 package
as from the binutils package
ld from the binutils package
strip from the binutils package
cp from the fileutils package
dd from the fileutils package
ln from the fileutils package
mv from the fileutils package
cc from the gcc package
make from the make package
sed from the sed package
cat from the textutils package
Estimated build time: 1 minute Estimated required disk space: 6 MB
Install Make by running the following commands:
./configure --prefix=/usr && make && make install
make determines automatically which pieces of a large program need to be recompiled, and issues the commands to recompile them.
Make-3.79.1 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chgrp from the fileutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Modutils by running the following commands:
./configure && make && make install
The Modutils package contains the depmod, genksyms, insmod, insmod_ksymoops_clean, kerneld, kernelversion, ksyms, lsmod, modinfo, modprobe and rmmod programs.
depmod handles dependency descriptions for loadable kernel modules.
genksyms reads (on standard input) the output from gcc -E source.c and generates a file containing version information.
modinfo examines an object file associated with a kernel module and displays any information that it can glean.
Modprobe uses a Makefile-like dependency file, created by depmod, to automatically load the relevant module(s) from the set of modules available in predefined directory trees.
Modutils-2.4.7 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
strip from the binutils package
bison from the bison package
cmp from the diffutils package
chmod from the fileutils package
install from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
flex from the flex package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 1 MB
Install Netkit-base by running the following commands:
./configure && make && make install && cd etc.sample && cp services protocols /etc
There are other files in the etc.sample directory which might be of interest to you.
inetd is the mother of all daemons. It listens for connections, and transfers the call to the appropriate daemon.
Netkit-base-0.17 needs the following to be installed:
sh rom the bash package
as rom the binutils package
ld rom the binutils package
strip rom the binutils package
cp rom the fileutils package
install from the fileutils package
rm rom the fileutils package
make rom the make package
cc rom the gcc package
sed rom the sed package
date from the sh-utils package
cat from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Patch by running the following commands:
./configure --prefix=/usr && make && make install
The patch program modifies a file according to a patch file. A patch file usually is a list created by the diff program that contains instructions on how an original file needs to be modified. Patch is used a lot for source code patches since it saves time and space. Imagine a package that is 1MB in size. The next version of that package only has changes in two files of the first version. It can be shipped as an entirely new package of 1MB or just as a patch file of 1KB which will update the first version to make it identical to the second version. So if the first version was downloaded already, a patch file avoids a second large download.
Patch-2.5.4 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 170 KB
Install Procinfo by running the following commands:
make LDLIBS=-lncurses && make install
make LDLIBS=-lncurses : This will use -lncurses instead of -ltermcap when building procinfo. This is done because libtermcap is declared obsolete in favor of libncurses.
procinfo gathers some system data from the /proc directory and prints it nicely formatted on the standard output device.
Procinfo-18 needs the following to be installed:
as from the binutils package
ld from the binutils package
install from the fileutils package
mkdir from the fileutils package
make from the make package
sed from the sed package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Procps by running the following commands:
make && make XSCPT='' install && mv /usr/bin/kill /bin
make XSCPT='' install: This will set the Makefile variable XSCPT to an empty value so that the XConsole installation is disabled. Otherwise "Make install" tries to copy the file XConsole to /usr/X11R6/lib/app-defaults. And that directory does not exist, because X is not installed.
The Procps package contains the free, kill, oldps, ps, skill, snice, sysctl, tload, top, uptime, vmstat, w and watch programs.
free displays the total amount of free and used physical and swap memory in the system, as well as the shared memory and buffers used by the kernel.
tload prints a graph of the current system load average to the specified tty (or the tty of the tload process if none is specified).
uptime gives a one line display of the following information: the current time, how long the system has been running, how many users are currently logged on, and the system load averages for the past 1, 5, and 15 minutes.
vmstat reports information about processes, memory, paging, block IO, traps, and cpu activity.
Procps-2.0.7 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
strip from the binutils package
install from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
gcc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
pwd from the sh-utils package
sort from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 500 KB
Install Psmisc by running the following commands:
./configure --prefix=/usr && make && make install
fuser displays the PIDs of processes using the specified files or file systems.
Pidof finds the process id's (pids) of the named programs and prints those id's on standard output.
Psmisc-20.1 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 2 MB
Install Sed by running the following commands:
./configure --prefix=/usr --bindir=/bin && make && make install
sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline).
Sed-3.02 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 2 minutes Estimated required disk space: 11 MB
Install Shellutils by running the following commands:
./configure --prefix=/usr && make && make install && cd /usr/bin && mv date echo false pwd stty /bin && mv su true uname hostname /bin && mv chroot ../sbin
There is a command installed in this package which is named test. It is often used in shell scripts to evaluate conditions, but is more often encountered in the form of [ condition ]. These brackets are built into the bash interpreter, but the FHS dictates that there should be a [ binary. We create that in this way, while still in the /usr/bin directory:
ln -sf test [
The Sh-utils package contains the basename, chroot, date, dirname, echo, env, expr, factor, false, groups, hostid, hostname, id, logname, nice, nohup, pathchk, pinky, printenv, printf, pwd, seq, sleep, stty, su, tee, test, true, tty, uname, uptime, users, who, whoami and yes programs.
Sh-utils-2.0 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
chown from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 5 MB
make update: This does the same as a make install with the exception that make update doesn't make backups of files it's replacing. One of the things net-tools replaces is sh-utils's version of /bin/hostname (net-tools's version is far better than sh-utils's version).
Also, if you decide to reinstall this package at some point in the future, a make update won't backup all the files from a previous net-tools installation.
The Net-tools package contains the arp, hostname, ifconfig, netstat, plipconfig rarp, route, and slattach programs.
arp is used to manipulate the kernel's ARP cache, usually to add or delete an entry, or to dump the ARP cache.
hostname, with its symlinks domainname, dnsdomainname, nisdomainname, ypdomainname, and nodename, is used to set or show the system's hostname (or other, depending on the symlink used).
netstat is a multi-purpose tool used to print the network connections, routing tables, interface statistics, masquerade connections, and multicast memberships.
slattach attaches a network interface to a serial line, i.e.. puts a normal terminal line into one of several "network" modes.
Net-tools-1.60 needs the following to be installed:
bash from the bash package
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
install from the fileutils package
ln from the fileutils package
rm from the fileutils package
msgfmt from the gettext package
cc from the gcc package
make from the make package
basename from the sh-utils package
echo from the sh-utils package
env from the sh-utils package
Estimated build time: 3 minutes Estimated required disk space: 6 MB
Install the Shadow Password Suite by running the following commands:
cp src/useradd.c src/useradd.c.backup && sed 's/\(.*\) (nflg || \(.*\))\(.*\)/\1\2\3/' \ src/useradd.c > tmp~ && mv tmp~ src/useradd.c && ./configure --prefix=/usr && make && make install && cd etc && cp limits login.access /etc && sed 's%/var/spool/mail%/var/mail%' login.defs.linux > /etc/login.defs && cd /lib && mv libshadow.a /usr/lib && mv libshadow.la /usr/lib && ln -sf libshadow.so.0 libshadow.so && cd /usr/lib && ln -sf ../../lib/libshadow.so
sed 's/\(.*\) (nflg || \(.*\))\(.*\)/\1\2\3/' src/useradd.c > useradd.c.temp &&: This sed is used to fix a compilation bug which occurs due to a variable (nflg) being used but not defined.
cp limits login.access and others: These files were not installed during the installation of the package so we copy them manually as those files are used to configure authentication details on the system.
sed "s%/var/spool/mail%/var/mail%" login.defs.linux > /etc/login.defs: /var/spool/mail is the old location of the user mailboxes. The location that is used nowadays is /var/mail.
The Shadow Password Suite contains the chage, chfn, chsh, expiry, faillog, gpasswd, lastlog, login, newgrp, passwd, sg, su, chpasswd, dpasswd, groupadd, groupdel, groupmod, grpck, grpconv, grpunconv, logoutd, mkpasswd, newusers, pwck, pwconv, pwunconv, useradd, userdel, usermod and vipw programs.
chage changes the number of days between password changes and the date of the last password change.
chfn changes user full name, office number, office extension, and home phone number information for a user's account.
faillog formats the contents of the failure log,/var/log/faillog, and maintains failure counts and limits.
lastlog formats and prints the contents of the last login log, /var/log/lastlog. The login-name, port, and last login time will be printed.
Change the effective user id and group id to that of a user. This replaces the su programs that's installed from the Shellutils package.
chpasswd reads a file of user name and password pairs from standard input and uses this information to update a group of existing users.
The groupadd command creates a new group account using the values specified on the command line and the default values from the system.
The groupdel command modifies the system account files, deleting all entries that refer to group.
The groupmod command modifies the system account files to reflect the changes that are specified on the command line.
mkpasswd reads a file in the format given by the flags and converts it to the corresponding database file format.
newusers reads a file of user name and clear text password pairs and uses this information to update a group of existing users or to create new users.
userdel modifies the system account files, deleting all entries that refer to a specified login name.
usermod modifies the system account files to reflect the changes that are specified on the command line.
vipw and vigr will edit the files /etc/passwd and /etc/group, respectively. With the -s flag, they will edit the shadow versions of those files, /etc/shadow and /etc/gshadow, respectively.
Shadow-20001016 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
rmdir from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
sort from the textutils package
uniq from the textutils package
Estimated build time: 1 minute Estimated required disk space: 710 KB
klogd is a system daemon which intercepts and logs Linux kernel messages.
Syslogd provides a kind of logging that many modern programs use. Every logged message contains at least a time and a hostname field, normally a program name field, too, but that depends on how trusty the logging program is.
Sysklogd-1.4.1 needs the following to be installed:
as from the binutils package
ld from the binutils package
strip from the binutils package
install from the fileutils package
gcc rom the gcc package
make from the make package
Estimated build time: 1 minute Estimated required disk space: 630 KB
When run levels are changed (for example when going to shutdown the system) the init program is going to send the TERM and KILL signals to all the processes that init started. But init prints a message to the screen saying "sending all processes the TERM signal" and the same for the KILL signal. This implies that init sends this signal to all the currently running processes, which isn't the case. To avoid this confusion, you change the init.c file so that the sentence reads "sending all processes started by init the TERM signal" by running the following commands. If you don't want to change it, skip it.
cp src/init.c src/init.c.backup && sed 's/\(.*\)\(Sending processes\)\(.*\)/\1\2 started by init\3/' \ src/init.c > tmp~ && mv tmp~ src/init.c
Install Sysvinit by running the following commands:
make -C src && make -C src install
The Sysvinit package contains the pidof, last, lastb, mesg, utmpdump, wall, halt, init, killall5, poweroff, reboot, runlevel, shutdown, sulogin and telinit programs.
Pidof finds the process id's (pids) of the named programs and prints those id's on standard output.
last searches back through the file /var/log/wtmp (or the file designated by the -f flag) and displays a list of all users logged in (and out) since that file was created.
lastb is the same as last, except that by default it shows a log of the file /var/log/btmp, which contains all the bad login attempts.
Mesg controls the access to the users terminal by others. It's typically used to allow or disallow other users to write to his terminal.
utmpdumps prints the content of a file (usually /var/run/utmp) on standard output in a user friendly format.
Halt notes that the system is being brought down in the file /var/log/wtmp, and then either tells the kernel to halt, reboot or poweroff the system. If halt or reboot is called when the system is not in runlevel 0 or 6, shutdown will be invoked instead (with the flag -h or -r).
Init is the parent of all processes. Its primary role is to create processes from a script stored in the file /etc/inittab. This file usually has entries which cause init to spawn gettys on each line that users can log in. It also controls autonomous processes required by any particular system.
killall5 is the SystemV killall command. It sends a signal to all processes except the processes in its own session, so it won't kill the shell that is running the script it was called from.
poweroff is equivalent to shutdown -h -p now. It halts the computer and switches off the computer (when using an APM compliant BIOS and APM is enabled in the kernel).
Runlevel reads the system utmp file (typically /var/run/utmp) to locate the runlevel record, and then prints the previous and current system runlevel on its standard output, separated by a single space.
shutdown brings the system down in a secure way. All logged-in users are notified that the system is going down, and login is blocked.
sulogin is invoked by init when the system goes into single user mode (this is done through an entry in /etc/inittab). Init also tries to execute sulogin when it is passed the -b flag from the boot loader (eg, LILO).
Sysvinit-2.82 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
chown from the fileutils package
install from the fileutils package
ln from the fileutils package
mknod from the fileutils package
rm from the fileutils package
cc from the gcc package
make from the make package
patch from the patch package
Estimated build time: 1 minute Estimated required disk space: 7 MB
If you want to be able to directly use bzip2 files with tar, you can use the tar patch available from the LFS FTP site. This patch will add the -j option to tar which works the same as the -z option to tar (which can be used for gzip files).
Apply the patch by running the following command:
patch -Np1 -i ../tar-1.13.patch
Install Tar by running the following commands from the toplevel directory:
./configure --prefix=/usr --libexecdir=/usr/bin \ --bindir=/bin && make && make install
tar is an archiving program designed to store and extract files from an archive file known as a tar file.
rmt is a program used by the remote dump and restore programs in manipulating a magnetic tape drive through an interprocess communication connection.
Tar-1.13 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
patch from the patch package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 15 MB
Install Textutils by running the following commands:
./configure --prefix=/usr && make && make install && mv /usr/bin/cat /bin
The Textutils package contains the cat, cksum, comm, csplit, cut, expand, fmt, fold, head, join, md5sum, nl, od, paste, pr, ptx, sort, split, sum, tac, tail, tr, tsort, unexpand, uniq and wc programs.
cat concatenates file(s) or standard input to standard output.
csplit outputs pieces of a file separated by (a) pattern(s) to files xx01, xx02, ..., and outputs byte counts of each piece to standard output.
fold wraps input lines in each specified file (standard input by default), writing to standard output.
od writes an unambiguous representation, octal bytes by default, of a specified file to standard output.
paste writes lines consisting of the sequentially corresponding lines from each specified file, separated by TABs, to standard output.
tr translates, squeezes, and/or deletes characters from standard input, writing to standard output.
wc prints line, word, and byte counts for each specified file, and a total line if more than one file is specified.
Textutils-2.0 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Estimated build time: 1 minute Estimated required disk space: 9 MB
The FHS recommends that we use /var/lib/hwclock as the location of the adjtime file, instead of the usual /etc. To make hwclock, which is part of the util-linux package, FHS-compliant, run the following.
cp hwclock/hwclock.c hwclock/hwclock.c.backup && sed 's%etc/adjtime%var/lib/hwclock/adjtime%' \ hwclock/hwclock.c > tmp~ && mv tmp~ hwclock/hwclock.c && mkdir -p /var/lib/hwclock
Install Util-Linux by running the following commands:
./configure && make HAVE_SLN=yes ADD_RAW=yes && make HAVE_SLN=yes ADD_RAW=yes install
HAVE_SLN=yes: We don't build this program because it already was installed by Glibc.
The Util-linux package contains the arch, dmesg, kill, more, mount, umount, agetty, blockdev, cfdisk, ctrlaltdel, elvtune, fdisk, fsck.minix, hwclock, kbdrate, losetup, mkfs, mkfs.bfs, mkfs.minix, mkswap, sfdisk, swapoff, swapon, cal, chkdupexe, col, colcrt, colrm, column, cytune, ddate, fdformat, getopt, hexdump, ipcrm, ipcs, logger, look, mcookie, namei, rename, renice, rev, script, setfdprm, setsid, setterm, ul, whereis, write, ramsize, rdev, readprofile, rootflags, swapdev, tunelp and vidmode programs.
arch prints the machine architecture.
hexdump displays specified files, or standard input, in a user specified format (ascii, decimal, hexadecimal, octal).
ul reads a file and translates occurrences of underscores to the sequence which indicates underlining for the terminal in use.
Util-linux-2.11h needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
chgrp from the fileutils package
chmod from the fileutils package
cp from the fileutils package
install from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
cpp from the gcc package
rpcgen from the glibc package
grep from the grep package
make from the make package
sed from the sed package
unam from the sh-utils package
whoami from the sh-utils package
cat from the textutils package
If you have copied the NSS Library files from the normal Linux system to the LFS system (because the normal system runs Glibc-2.0) it's time to remove them now by running:
rm /lib/libnss*.so.1 /lib/libnss*2.0*
Now that all software is installed, all that we need to do to get a few programs running properly is to create their configuration files.
By default Vim runs in vi compatible mode. Some people might like this, but we have a high preference to run vim in vim mode (else we wouldn't have included Vim in this book but the original Vi). Create the /root/.vimrc by running the following:
cat > /root/.vimrc << "EOF" " Begin /root/.vimrc set nocompatible set bs=2 " End /root/.vimrc EOF
We need to create the /etc/nsswitch.conf file. Although glibc should provide defaults when this file is missing or corrupt, it's defaults don't work well with networking which will be dealt with in a later chapter. Also, our timezone needs to be setup.
Create a new file /etc/nsswitch.conf by running the following:
cat > /etc/nsswitch.conf << "EOF" # Begin /etc/nsswitch.conf passwd: files group: files shadow: files publickey: files hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: db files # End /etc/nsswitch.conf EOF
The tzselect script has to be run and the questions regarding your timezone have to be answered. When you're done, the script will give the location of the needed timezone file.
Create the /etc/localtime symlink by running:
cd /etc && ln -sf ../usr/share/zoneinfo/<tzselect's output> localtime
tzselect's output can be something like EST5EDT or Canada/Eastern.
The symlink you'd create with that information would be:
ln -sf ../usr/share/zoneinfo/EST5EDT localtime
Or:
ln -sf ../usr/share/zoneinfo/Canada/Eastern localtime
By default the dynamic loader searches a few default paths for dynamic libraries, so there normally isn't a need for the /etc/ld.so.conf file unless the system has extra directories in which you want the system to search for libraries. The /usr/local/lib directory isn't searched through for dynamic libraries by default, so we want to add this path so when you install software you won't be surprised by them not running for some reason.
Create a new file /etc/ld.so.conf by running the following:
cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /lib /usr/lib /usr/local/lib # End /etc/ld.so.conf EOF
Although it's not necessary to add the /lib and /usr/lib directories it doesn't hurt. This way it can be seen right away what's being searched and a you don't have to remember the default search paths if you don't want to.
Create a new file /etc/syslog.conf by running the following:
cat > /etc/syslog.conf << "EOF" # Begin /etc/syslog.conf auth,authpriv.* -/var/log/auth.log *.*;auth,authpriv.none -/var/log/sys.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log mail.* -/var/log/mail.log user.* -/var/log/user.log *.emerg * # End /etc/syslog.conf EOF
This package contains the utilities to modify user's passwords, add new users/groups, delete users/groups and more. We're not going to explain what 'password shadowing' means. All about that can be read in the doc/HOWTO file within the unpacked shadow password suite's source tree. 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, pop3 daemons, etc) need to be 'shadow-compliant', eg. they need to be able to work with shadow'ed passwords.
To enable shadow'ed passwords, run the following command:
/usr/sbin/pwconv
Create a new file /etc/inittab by running the following:
cat > /etc/inittab << "EOF" # Begin /etc/inittab id:3:initdefault: si::sysinit:/etc/init.d/rcS l0:0:wait:/etc/init.d/rc 0 l1:S1: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 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now su:S016:respawn:/sbin/sulogin 1:2345:respawn:/sbin/agetty tty1 9600 2:2345:respawn:/sbin/agetty tty2 9600 3:2345:respawn:/sbin/agetty tty3 9600 4:2345:respawn:/sbin/agetty tty4 9600 5:2345:respawn:/sbin/agetty tty5 9600 6:2345:respawn:/sbin/agetty tty6 9600 # End /etc/inittab EOF
Programs like login, shutdown, uptime and others want to read from and write to the /var/run/utmp /var/log/btmp and /var/log/wtmp. These files contain information about who is currently logged in. It also contains information on when the computer was last booted and shutdown and a record of the bad login attempts.
Create these files with their proper permissions by running the following commands:
touch /var/run/utmp /var/log/wtmp \ /var/log/btmp /var/log/lastlog && chmod 644 /var/run/utmp /var/log/wtmp \ /var/log/btmp /var/log/lastlog
Choose a password for user root and create it by running the following command:
passwd root
This chapter will create the necessary scripts that are run at boot time. These scripts perform tasks such as remounting the root file system mounted read-only by the kernel into read-write mode, activating the swap partition(s), running a check on the root file system to make sure it's intact, setting up networking and starting the daemons that the system uses.
We will be using SysV style init scripts. We have chosen this style because it is widely used and we feel confortable with it. If you want to try something else, someone has written an LFS-Hint on BSD style init scripts at http://hints.linuxfromscratch.org/hints/bsd-init.txt .
Linux uses a special booting facility named SysVinit. It's based on a concept of runlevels. It can be widely different from one system to another, so it can not be assumed that because things worked in <insert distro name> they should work like that in LFS too. LFS has it's own way of doing things, but it respects generally accepted standards.
SysVinit (which we'll call init from now on) works using a runlevels scheme. There are 7 (from 0 to 6) runlevels (actually, there are more runlevels but they are for special cases and generally not used. The init man page describes those details), and each one of those corresponds to the things the computer is supposed to do when it starts up. The default runlevel is 3. Here are the descriptions of the different runlevels as they are often implemented:
0: halt the computer
1: single-user mode
2: multi-user mode without networking
3: multi-user mode with networking
4: reserved for customization, otherwise does the same as 3
5: same as 4, it is usually used for GUI login (like X's xdm or KDE's kdm)
6: reboot the computer
The command used to change runlevels is init <runlevel> where <runlevel> is the target runlevel. For example, to reboot the computer, a user would issue the init 6 command. The reboot command is just an alias, as is the halt command an alias to init 0.
The /etc/init.d/rcS script is run at every startup of the computer, before any runlevel is executed and runs the scripts listed in /etc/rcS.d
There are a number of directories under /etc that look like like rc?.d where ? is the number of the runlevel and rcS.d which contain a number of s ymbolic links. Some begin with an K, the others begin with an S, and all of them have three numbers following the initial letter. The K means to stop (kill) a service, and the S means to start a service. The numbers determine the order in which the scripts are run, from 000 to 999; the lower the number the sooner it gets executed. When init switches to another runlevel, the appropriate services get killed and others get started.
The real scripts are in /etc/init.d. They do all the work, and the symlinks all point to them. Killing links and starting links point to the same script in /etc/init.d. That's because the scripts can be called with different parameters like start, stop, restart, reload, status. When a K link is encountered, the appropriate script is run with the stop argument. When a S link is encountered, the appropriate script is run with the start argument.
There is one exception. Links that start with an S in the rc0.d and rc6.d directories will not cause anything to be started. They will be called with the paramater stop to stop something. The logic behind it is that when you are going to reboot or halt the system, you don't want to start anything, only stop the system.
These are descriptions of what the arguments make the scripts do:
start: The service is started.
stop: The service is stopped.
restart: The service is stopped and then started again.
reload: The configuration of the service is updated. This is used after the configuration file of a service was modified, when the service doesn't need to be restarted.
status: Tells if the service is running and with which PID's.
Feel free to modify the way the boot process works (after all it's your LFS system, not ours). The files here are just an example of how it can be done in a nice way (well what we consider nice anyway. You may hate it).
We need to start by creating a few extra directories that are used by the boot scripts. These directories are created by running:
cd /etc && mkdir rc{0,1,2,3,4,5,6,S}.d init.d sysconfig && cd init.d
The first main boot script is the /etc/init.d/rc script. Create the /etc/init.d/rc script by running the following command:
cat > /etc/init.d/rc << "EOF" #!/bin/sh # Begin /etc/init.d/rc # # By Jason Pearce - jason.pearce@linux.org # Modified by Gerard Beekmans - gerard@linuxfromscratch.org # print_error_msg based on ideas by Simon Perreault - # nomis80@videotron.ca # # # Include the functions declared in the /etc/init.d/functions file # source /etc/init.d/functions # # The print_error_msg function prints an error message when an unforeseen # error occurred that wasn't trapped for some reason by a evaluate_retval # call or error checking in different ways. print_error_msg() { echo $FAILURE echo -n "You should not read this error message. It means " echo "that an unforeseen error " echo -n "took place and subscript $i exited with " echo "a return value " echo -n "of $error_value for an unknown reason. If you're able " echo "to trace this error down " echo -n "to a bug in one of the files provided by this book, " echo "please be so kind to " echo -n "inform us at lfs-discuss@linuxfromscratch.org" $NORMAL echo echo echo "Press a key to continue..." read } # # If you uncomment the debug variable below none of the scripts will be # executed, just the script name and parameters will be echo'ed to the # screen so you can see how the scripts are called by rc. # # Un-comment the following for debugging. # debug=echo # # Start script or program. # startup() { $debug "$@" } # # Ignore CTRL-C only in this shell, so we can interrupt subprocesses. # trap ":" INT QUIT TSTP # # Now find out what the current and what the previous runlevel are. The # $RUNLEVEL variable is set by init for all it's children. This script # runs as a child of init. # runlevel=$RUNLEVEL # # Get first argument. Set new runlevel to this argument. If no runlevel # was passed to this script we won't change runlevels. # [ "$1" != "" ] && runlevel=$1 if [ "$runlevel" = "" ] then echo "Usage: $0 <runlevel>" >&2 exit 1 fi # # The same goes for $PREVLEVEL (see above for $RUNLEVEL). previous will # be set to the previous run level. If $PREVLEVEL is not set it means # that there is no previous runlevel and we'll set previous to N. # previous=$PREVLEVEL [ "$previous" = "" ] && previous=N export runlevel previous # # Is there an rc directory for the new runlevel? # if [ -d /etc/rc$runlevel.d ] then # # If so, first collect all the K* scripts in the new run level. # if [ $previous != N ] then for i in /etc/rc$runlevel.d/K* do [ ! -f $i ] && continue # # the suffix variable will contain the script name without the leading # Kxxx # suffix=${i#/etc/rc$runlevel.d/K[0-9][0-9][0-9]} # # If there is a start script for this K script in the previous runlevel # determine what it's full path is # previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix # # If there was no previous run level it could be that something was # started in rcS.d (sysinit level) so we'll determine the path for that # possibility as well. # sysinit_start=/etc/rcS.d/S[0-9][0-9][0-9]$suffix # # Stop the service if there is a start script in the previous run level # or in the sysinit level. If previous_start or sysinit_start do not # exist the 'continue' command is run which causes the script to abort # this iteration of the for loop and continue with the next iteration. # This boils down to that it won't run the commands after the next two # lines and start over from the top of this for loop. See man bash for # more info on this. # [ ! -f $previous_start ] && [ ! -f $sysinit_start ] && continue # # If we found previous_start or sysinit_start, run the K script # startup $i stop error_value=$? # # If the return value of the script is not 0, something went wrong with # error checking inside the script. the print_error_msg function will be # called and the message plus the return value of the K script will be # printed to the screen # if [ $error_value != 0 ] then print_error_msg fi done fi # # Now run the START scripts for this runlevel. # for i in /etc/rc$runlevel.d/S* do [ ! -f $i ] && continue if [ $previous != N ] then # # Find start script in previous runlevel and stop script in this # runlevel. # suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9][0-9]} stop=/etc/rc$runlevel.d/K[0-9][0-9][0-9]$suffix previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix # # If there is a start script in the previous level and no stop script in # this level, we don't have to re-start the service; abort this # iteration and start the next one. # [ -f $previous_start ] && [ ! -f $stop ] && continue fi case "$runlevel" in 0|6) # # levels 0 and 6 are halt and reboot levels. We don't really start # anything here so we call with the 'stop' parameter # startup $i stop error_value=$? # # If the return value of the script is not 0, something went wrong with # error checking inside the script. the print_error_msg function will be # called and the message plus the return value of the K script will be # printed to the screen # if [ $error_value != 0 ] then print_error_msg fi ;; *) startup $i start error_value=$? # # If the return value of the script is not 0, something went wrong with # error checking inside the script. the print_error_msg function will be # called and the message plus the return value of the K script will be # printed to the screen # if [ $error_value != 0 ] then print_error_msg fi ;; esac done fi # End /etc/init.d/rc EOF
The second main boot script is the rcS script. Create the /etc/init.d/rcS script by running the following command:
cat > /etc/init.d/rcS << "EOF" #!/bin/sh # Begin /etc/init.d/rcS # # See the rc script for the extensive comments on the constructions # used here # source /etc/init.d/functions print_error_msg() { echo $FAILURE echo -n "You should not read this error message. It means " echo "that an unforeseen error " echo -n "took place and subscript $i exited with " echo "a return value " echo -n "of $error_value for an unknown reason. If you're able " echo "to trace this error down " echo -n "to a bug in one of the files provided by this book, " echo "please be so kind to " echo -n "inform us at lfs-discuss@linuxfromscratch.org" $NORMAL echo echo echo "Press a key to continue..." read } runlevel=S prevlevel=N umask 022 export runlevel prevlevel trap ":" INT QUIT TSTP # # Collect all the S scripts in /etc/rcS.d and execute them # for i in /etc/rcS.d/S* do [ ! -f "$i" ] && continue; $i start error_value=$? if [ $error_value != 0 ] then print_error_msg fi done # End /etc/init.d/rcS EOF
Create the /etc/init.d/functions script by running the following command:
cat > /etc/init.d/functions << "EOF" #!/bin/sh # Begin /etc/init.d/functions # # Set a few variables that influence the text that's printed on the # screen. The SET_COL variable starts the text in the column number # decided by the COL and WCOL section (as defined by the COL # variable). NORMAL prints text in normal mode. # SUCCESS prints text in a green colour and FAILURE prints text in a red # colour # # If COLUMNS hasn't been set yet (bash sets it but not when called as # sh), do it ourself if [ -z "$COLUMNS" ] then # Get the console device if we don't have it already # This is ok by the FHS as there is a fallback if # /usr/bin/tty isn't available, for example at bootup. test -x /usr/bin/tty && CONSOLE=`/usr/bin/tty` test -z "$CONSOLE" && CONSOLE=/dev/console # Get the console size (rows columns) SIZE=$(stty size < $CONSOLE) # Strip off the rows leaving the columns COLUMNS=${SIZE#*\ } fi COL=$[$COLUMNS - 10] WCOL=$[$COLUMNS - 30] SET_COL="echo -en \\033[${COL}G" SET_WCOL="echo -en \\033[${WCOL}G" NORMAL="echo -en \\033[0;39m" SUCCESS="echo -en \\033[1;32m" WARNING="echo -en \\033[1;33m" FAILURE="echo -en \\033[1;31m" # # The evaluate_retval function evaluates the return value of the process # that was run just before this function was called. If the return value # was 0, indicating success, the print_status function is called with # the 'success' parameter. Otherwise the print_status function is called # with the failure parameter. # evaluate_retval() { if [ $? = 0 ] then print_status success else print_status failure fi } # # The print_status prints [ OK ] or [FAILED] to the screen. OK appears # in the colour defined by the SUCCESS variable and FAILED appears in # the colour defined by the FAILURE variable. Both are printed starting # in the column defined by the COL variable. # print_status() { # # If no parameters are given to the print_status function, print usage # information. # if [ $# = 0 ] then echo "Usage: print_status {success|failure}" return 1 fi case "$1" in success) $SET_COL echo -n "[ " $SUCCESS echo -n "OK" $NORMAL echo " ]" ;; warning) $SET_COL echo -n "[ " $WARNING echo -n "ATTN" $NORMAL echo " ]" ;; failure) $SET_COL echo -n "[" $FAILURE echo -n "FAILED" $NORMAL echo "]" ;; esac } # # The loadproc function starts a process (often a daemon) with # proper error checking # loadproc() { # # If no parameters are given to the print_status function, print usage # information. # if [ $# = 0 ] then echo "Usage: loadproc {program}" exit 1 fi # # Find the basename of the first parameter (the daemon's name without # the path # that was provided so /usr/sbin/syslogd becomes plain 'syslogd' after # basename ran) # base=$(/usr/bin/basename $1) # # the pidlist variable will contains the output of the pidof command. # pidof will try to find the PID's that belong to a certain string; # $base in this case # pidlist=$(/bin/pidof -o $$ -o $PPID -o %PPID -x $base) pid="" for apid in $pidlist do if [ -d /proc/$apid ] then pid="$pid $apid" fi done # # If the $pid variable contains anything (from the previous for loop) it # means the daemon is already running # if [ ! -n "$pid" ] then # # Empty $pid variable means it's not running, so we run "$@" (all # parameters giving to this function from the script) and then check the # return value # "$@" evaluate_retval else # # The variable $pid was not empty, meaning it was already running. We'll # print [ ATTN ] now # $SET_WCOL echo -n "Already running" print_status warning fi } # # The killproc function kills a process with proper error checking # killproc() { # # If no parameters are given to the print_status function, print usage # information. # if [ $# = 0 ] then echo "Usage: killproc {program} [signal]" exit 1 fi # # Find the basename of the first parameter (the daemon's name without # the path # that was provided so /usr/sbin/syslogd becomes plain 'syslogd' after # basename ran) # base=$(/usr/bin/basename $1) # # Check if we gave a signal to kill the process with (like -HUP, -TERM, # -KILL, etc) to this function (the second parameter). If no second # parameter was provided set the nolevel variable. Else set the # killlevel variable to the value of $2 (the second parameter) # if [ "$2" != "" ] then killlevel=-$2 else nolevel=1 fi # # the pidlist variable will contains the output of the pidof command. # pidof will try to find the PID's that belong to a certain string; # $base in this case # pidlist=$(/bin/pidof -o $$ -o $PPID -o %PPID -x $base) pid="" for apid in $pidlist do if [ -d /proc/$apid ] then pid="$pid $apid" fi done # # If $pid contains something from the previous for loop it means one or # more PID's were found that belongs to the processes to be killed # if [ -n "$pid" ] then # # If no kill level was specified we'll try -TERM first and then sleep # for 2 seconds to allow the kill to be completed # if [ "$nolevel" = 1 ] then /bin/kill -TERM $pid # # If after -TERM the PID still exists we'll wait 2 seconds before # trying to kill it with -KILL. If the PID still exist after that, wait # two more seconds. If the PIDs still exist by then it's safe to assume # that we cannot kill these PIDs. # if /bin/ps h $pid >/dev/null 2>&1 then /usr/bin/sleep 2 if /bin/ps h $pid > /dev/null 2>&1 then /bin/kill -KILL $pid if /bin/ps h $pid > /dev/null 2>&1 then /usr/bin/sleep 2 fi fi fi /bin/ps h $pid >/dev/null 2>&1 if [ $? = 0 ] then # # If after the -KILL it still exists it can't be killed for some reason # and we'll print [FAILED] # print_status failure else # # It was killed, remove possible stale PID file in /var/run and # print [ OK ] # /bin/rm -f /var/run/$base.pid print_status success fi else # # A kill level was provided. Kill with the provided kill level and wait # for 2 seconds to allow the kill to be completed # /bin/kill $killlevel $pid if /bin/ps h $pid > /dev/null 2>&1 then /usr/bin/sleep 2 fi /bin/ps h $pid >/dev/null 2>&1 if [ $? = 0 ] then # # If ps' return value is 0 it means it ran ok which indicates that the # PID still exists. This means the process wasn't killed properly with # the signal provided. Print [FAILED] # print_status failure else # # If the return value was 1 or higher it means the PID didn't exist # anymore which means it was killed successfully. Remove possible stale # PID file and print [ OK ] # /bin/rm -f /var/run/$base.pid print_status success fi fi else # # The PID didn't exist so we can't attempt to kill it. Print [ ATTN ] # $SET_WCOL echo -n "Not running" print_status warning fi } # # The reloadproc functions sends a signal to a daemon telling it to # reload it's configuration file. This is almost identical to the # killproc function with the exception that it won't try to kill it with # a -KILL signal (aka -9) # reloadproc() { # # If no parameters are given to the print_status function, print usage # information. # if [ $# = 0 ] then echo "Usage: reloadproc {program} [signal]" exit 1 fi # # Find the basename of the first parameter (the daemon's name without # the path that was provided so /usr/sbin/syslogd becomes plain 'syslogd' # after basename ran) # base=$(/usr/bin/basename $1) # # Check if we gave a signal to send to the process (like -HUP) # to this function (the second parameter). If no second # parameter was provided set the nolevel variable. Else set the # killlevel variable to the value of $2 (the second parameter) # if [ -n "$2" ] then killlevel=-$2 else nolevel=1 fi # # the pidlist variable will contains the output of the pidof command. # pidof will try to find the PID's that belong to a certain string; # $base in this case # pidlist=$(/bin/pidof -o $$ -o $PPID -o %PPID -x $base) pid="" for apid in $pidlist do if [ -d /proc/$apid ] then pid="$pid $apid" fi done # # If $pid contains something from the previous for loop it means one or # more PID's were found that belongs to the processes to be reloaded # if [ -n "$pid" ] then # # If nolevel was set we will use the default reload signal SIGHUP. # if [ "$nolevel" = 1 ] then /bin/kill -SIGHUP $pid evaluate_retval else # # Else we will use the provided signal # /bin/kill $killlevel $pid evaluate_retval fi else # # If $pid is empty no PID's have been found that belong to the process. # Print [ ATTN ] # $SET_WCOL echo -n "Not running" print_status warning fi } # # The statusproc function will try to find out if a process is running # or not # statusproc() { # # If no parameters are given to the print_status function, print usage # information. # if [ $# = 0 ] then echo "Usage: status {program}" return 1 fi # # $pid will contain a list of PID's that belong to a process # pid=$(/bin/pidof -o $$ -o $PPID -o %PPID -x $1) if [ -n "$pid" ] then # # If $pid contains something, the process is running, print the contents # of the $pid variable # echo "$1 running with Process ID $pid" return 0 fi # # If $pid doesn't contain it check if a PID file exists and inform the # user about this stale file. # if [ -f /var/run/$1.pid ] then pid=$(/usr/bin/head -1 /var/run/$1.pid) if [ -n "$pid" ] then echo "$1 not running but /var/run/$1.pid exists" return 1 fi else echo "$1 is not running" fi } # End /etc/init.d/functions EOF
Create the /etc/init.d/checkfs script by running the following command:
cat > /etc/init.d/checkfs << "EOF" #!/bin/sh # Begin /etc/init.d/checkfs # # Include the functions declared in the /etc/init.d/functions file # source /etc/init.d/functions # # Activate all the swap partitions declared in the /etc/fstab file # echo -n "Activating swap..." /sbin/swapon -a evaluate_retval # # If the /fastboot file exists we don't want to run the partition checks # if [ -f /fastboot ] then echo "Fast boot, no file system check" else # # Mount the root partition read-only (just in case the kernel mounts it # read-write and we don't want to run fsck on a read-write mounted # partition). # /bin/mount -n -o remount,ro / if [ $? = 0 ] then # # If the /forcefsck file exists we want to force a partition check even # if the partition was unmounted cleanly the last time # if [ -f /forcefsck ] then echo -n "/forcefsck exists, forcing " echo "file system check" force="-f" else force="" fi # # Check all the file systems mentioned in /etc/fstab that have the # fs_passno value set to 1 or 2 (the 6th field. See man fstab for more # info) # echo "Checking file systems..." /sbin/fsck $force -a -A -C -T # # If something went wrong during the checks of one of the partitions, # fsck will exit with a return value greater than 1. If this is # the case we start sulogin so you can repair the damage manually # if [ $? -gt 1 ] then $FAILURE echo echo -n "fsck failed. Please repair your file " echo "systems manually by running /sbin/fsck" echo "without the -a option" echo echo -n "Please note that the root file system " echo "is currently mounted in read-only mode." echo echo -n "I will start sulogin now. When you " echo "logout I will reboot your system." echo $NORMAL /sbin/sulogin /sbin/reboot -f else print_status success fi else # # If the remount to read-only mode didn't work abort the fsck and print # an error # echo -n "Cannot check root file system because it " echo "could not be mounted in read-only mode." fi fi # End /etc/init.d/checkfs EOF
Create the /etc/init.d/halt script by running the following command:
cat > /etc/init.d/halt << "EOF" #!/bin/sh # Begin /etc/init.d/halt # # Call halt. See man halt for the meaning of the parameters # /sbin/halt -d -f -i -p # End /etc/init.d/halt EOF
You only need to create this script if you don't have a default 101 keys US keyboard layout.
Create the /etc/init.d/loadkeys script by running the following command:
cat > /etc/init.d/loadkeys << "EOF" #!/bin/sh # Begin /etc/init.d/loadkeys # # Include the functions declared in the /etc/init.d/functions file # source /etc/init.d/functions # # Include /etc/sysconfig/keyboard which contains the LAYOUT variable # source /etc/sysconfig/keyboard # # Load the default keymap file # echo -n "Loading keymap..." /bin/loadkeys $LAYOUT 2>/dev/null evaluate_retval # End /etc/init.d/loadkeys EOF
Create a new file /etc/sysconfig/keyboard by running the following:
cat > /etc/sysconfig/keyboard << "EOF" # Begin /etc/sysconfig/keyboard LAYOUT=<path-to-keymap> # End /etc/sysconfig/keyboard EOF
Replace <path-to-keymap> with the path to the keymap you have selected. For example, if you have chosen the US keymap, you would replace it with /usr/share/kbd/keymaps/i386/qwerty/us.map.gz
Create the /etc/init.d/mountfs script by running the following command:
cat > /etc/init.d/mountfs << "EOF" #!/bin/sh # Begin /etc/init.d/mountfs # # Include the functions declared in the /etc/init.d/functions file # source /etc/init.d/functions case "$1" in start) # # Remount the root partition in read-write mode. -n tells mount # not to # write to the /etc/mtab file (because it can't do this. The # root # partition is most likely still mounted in read-only mode # echo -n "Remounting root file system in read-write mode..." /bin/mount -n -o remount,rw / evaluate_retval # # First empty the /etc/mtab file. Then remount root partition # in read-write # mode again but pass -f to mount. This way mount does # everything # except the mount itself. This is needed for it to write to the # mtab # file which contains a list of currently mounted file systems. # echo > /etc/mtab /bin/mount -f -o remount,rw / # # Remove the possible /fastboot and /forcefsck files. they are # only # supposed to be used during the next reboot's checkfs which just # happened. If you want to fastboot or forcefsck again you'll # have to # recreate the files # /bin/rm -f /fastboot /forcefsck # # Walk through /etc/fstab and mount all file systems that don't # have the noauto option set in the fs_mntops field (the 4th # field. # See man fstab for more info) # echo -n "Mounting other file systems..." /bin/mount -a evaluate_retval ;; stop) # # Deactivate all the swap partitions # echo -n "Deactivating swap..." /sbin/swapoff -a evaluate_retval # # And unmount all the file systems, mounting the root file # system # read-only (all are unmounted but because root can't be # unmounted # at this point mount will automatically mount it read-only # which # is what supposed to happen. This way no data can be written # anymore from disk) # echo -n "Unmounting file systems..." /bin/umount -a -r evaluate_retval ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac # End /etc/init.d/mountfs EOF
Create the /etc/init.d/reboot script by running the following command:
cat > /etc/init.d/reboot << "EOF" #!/bin/sh # Begin /etc/init.d/reboot # # Call reboot. See man halt for the meaning of the parameters # echo "System reboot in progress..." /sbin/reboot -d -f -i # End /etc/init.d/reboot EOF
Create the /etc/init.d/sendsignals script by running the following command:
cat > /etc/init.d/sendsignals << "EOF" #!/bin/sh # Begin /etc/init.d/sendsignals # # Include the functions declared in the /etc/init.d/functions file # source /etc/init.d/functions # # Send all the remaining processes the TERM signal # echo -n "Sending all processes the TERM signal..." /sbin/killall5 -15 evaluate_retval # # Send all the remaining process (after sending them the TERM signal # before) the KILL signal. # echo -n "Sending all processes the KILL signal..." /sbin/killall5 -9 evaluate_retval # End /etc/init.d/sendsignals EOF
The following script is only for real use when the hardware clock (also known as BIOS or CMOS clock) isn't set to GMT time. The recommended setup is setting the hardware clock to GMT and having the time converted to localtime using the /etc/localtime symbolic link. But if an OS is run that doesn't understand a clock set to GMT (most notable are Microsoft OS'es) you may want to set the clock to localtime so that the time is properly displayed on those OS'es. This script will then set the kernel time to the hardware clock without converting the time using the /etc/localtime symlink.
Create the /etc/init.d/setclock script by running the following command:
cat > /etc/init.d/setclock << "EOF" #!/bin/sh # Begin /etc/init.d/setclock # # Include the functions declared in the /etc/init.d/functions file # and include the variables from the /etc/sysconfig/clock file # source /etc/init.d/functions source /etc/sysconfig/clock # # Right now we want to set the kernel clock according to the hardware # clock, so we use the -hctosys parameter. # CLOCKPARAMS="--hctosys" # # If the UTC variable is set in the /etc/sysconfig/clock file, add the # -u parameter as well which tells hwclock that the hardware clock is # set to UTC time instead of local time. # case "$UTC" in yes|true|1) CLOCKPARAMS="$CLOCKPARAMS --utc" ;; no|false|0) CLOCKPARAMS="$CLOCKPARAMS --localtime" ;; esac echo -n "Setting clock..." /sbin/hwclock $CLOCKPARAMS evaluate_retval # End /etc/init.d/setclock EOF
If you want to use this script on your system even if the hardware clock is set to GMT, then the UTC variable below has to be changed to the value of 1.
Create a new file /etc/sysconfig/clock by running the following:
cat > /etc/sysconfig/clock << "EOF" # Begin /etc/sysconfig/clock UTC=0 # End /etc/sysconfig/clock EOF
Now, you may want to take a look at a very good hint explaining how we deal with time on LFS at http://hints.linuxfromscratch.org/hints/time.txt. It explains issues such as timezones, UTC, and the TZ environment variable.
Create the /etc/init.d/sysklogd script by running the following command:
cat > /etc/init.d/sysklogd << "EOF" #!/bin/sh # Begin /etc/init.d/sysklogd # # Include the functions declared in the /etc/init.d/functions file # source /etc/init.d/functions case "$1" in start) echo -n "Starting system log daemon..." loadproc /usr/sbin/syslogd -m 0 echo -n "Starting kernel log daemon..." loadproc /usr/sbin/klogd ;; stop) echo -n "Stopping kernel log daemon..." killproc klogd echo -n "Stopping system log daemon..." killproc syslogd ;; reload) echo -n "Reloading system log daemon configuration file..." reloadproc syslogd 1 ;; restart) $0 stop /usr/bin/sleep 1 $0 start ;; status) statusproc /usr/sbin/syslogd statusproc /usr/sbin/klogd ;; *) echo "Usage: $0 {start|stop|reload|restart|status}" exit 1 ;; esac # End /etc/init.d/sysklogd EOF
Create the /etc/init.d/template script by running the following command:
cat > /etc/init.d/template << "EOF" #!/bin/sh # Begin /etc/init.d/ # # Include the functions declared in the /etc/init.d/functions file # source /etc/init.d/functions case "$1" in start) echo -n "Starting ..." loadproc ;; stop) echo -n "Stopping ..." killproc ;; reload) echo -n "Reloading ..." reloadproc ;; restart) $0 stop /usr/bin/sleep 1 $0 start ;; status) statusproc ;; *) echo "Usage: $0 {start|stop|reload|restart|status}" exit 1 ;; esac # End /etc/init.d/ EOF
Create the /etc/init.d/localnet script by running the following command:
cat > /etc/init.d/localnet << "EOF" #!/bin/sh # Begin /etc/init.d/localnet # # Include the functions declared in the /etc/init.d/functions file # and include the variables from the /etc/sysconfig/network file. # source /etc/init.d/functions source /etc/sysconfig/network case "$1" in start) echo -n "Bringing up the loopback interface..." /sbin/ifconfig lo 127.0.0.1 evaluate_retval echo -n "Setting up hostname..." /bin/hostname $HOSTNAME evaluate_retval ;; stop) echo -n "Bringing down the loopback interface..." /sbin/ifconfig lo down evaluate_retval ;; restart) $0 stop sleep 1 $0 start ;; *) echo "Usage: $0: {start|stop|restart}" exit 1 ;; esac # End /etc/init.d/localnet EOF
A new file /etc/sysconfig/network is created and the hostname is put in it by running:
echo "HOSTNAME=lfs" > /etc/sysconfig/network
"lfs" needs to be replaced with the name the computer is to be called. You should not enter the FQDN (Fully Qualified Domain Name) here. That information will be put in the /etc/hosts file later.
If a network card is to be configured, you have to decide on the IP-address, FQDN and possible aliases for use in the /etc/hosts file. An example is:
<my-IP> myhost.mydomain.org aliases
You should made sure that 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 www.linuxfromscratch.org
If you aren't 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).
If a network card is not going to be configured, a new file /etc/hosts is created by running:
cat > /etc/hosts << "EOF" # Begin /etc/hosts (no network card version) 127.0.0.1 www.mydomain.com <value of HOSTNAME> localhost # End /etc/hosts (no network card version) EOF
If a network card is to be configured, a new file /etc/hosts is created by running:
cat > /etc/hosts << "EOF" # Begin /etc/hosts (network card version) 127.0.0.1 localhost.localdomain localhost 192.168.1.1 www.mydomain.org <value of HOSTNAME> # End /etc/hosts (network card version) EOF
Of course, the 192.168.1.1 and www.mydomain.org have to be changed to your liking (or requirements if assigned an IP-address by a network/system administrator and this machine is planned to be connected to that network).
This section only applies if a user is going to configure a network card. If not, this section can be skipped.
Create the /etc/init.d/ethnet script by running the following command:
cat > /etc/init.d/ethnet << "EOF" #!/bin/sh # Begin /etc/init.d/ethnet # # Main script by Gerard Beekmans - gerard@linuxfromscratch.org # GATEWAY check by Jean-François Le Ray - jfleray@club-internet.fr # "Specify which IF to use to reach default GATEWAY" by # Graham Cantin - gcantin@pacbell.net # # # Include the functions declared in the /etc/init.d/functions file # and the variables from the /etc/sysconfig/network file. # source /etc/init.d/functions source /etc/sysconfig/network case "$1" in start) # # Obtain all the network card configuration files # for interface in $(/bin/ls /etc/sysconfig/nic-config/ifcfg* | \ grep -v ifcfg-lo) do # # Load the variables from that file # source $interface # # If the ONBOOT variable is set to yes, process this file and bring the # interface up. # if [ "$ONBOOT" == yes ] then echo -n "Bringing up the $DEVICE interface..." /sbin/ifconfig $DEVICE $IP broadcast $BROADCAST \ netmask $NETMASK evaluate_retval fi done # # If the /etc/sysconfig/network file contains a GATEWAY variable, set # the default gateway and the interface through which the default # gateway can be reached. # if [ "$GATEWAY" != "" ]; then echo -n "Setting up routing for $GATEWAY_IF interface..." /sbin/route add default gateway $GATEWAY \ metric 1 dev $GATEWAY_IF evaluate_retval fi ;; stop) # # Obtain all the network card configuration files # for interface in $(/bin/ls /etc/sysconfig/nic-config/ifcfg* | \ grep -v ifcfg-lo) do # # Load the variables from that file # source $interface # # If the ONBOOT variable is set, process the file and bring the # interface down # if [ $ONBOOT == yes ] then echo -n "Bringing down the $DEVICE interface..." /sbin/ifconfig $DEVICE down evaluate_retval fi done ;; restart) $0 stop sleep 1 $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac # End /etc/init.d/ethnet EOF
If a default gateway is required to be setup, the following command does that:
cat >> /etc/sysconfig/network << "EOF" GATEWAY=192.168.1.2 GATEWAY_IF=eth0 EOF
GATEWAY and GATEWAY_IF need to be changed to match the network setup. GATEWAY contains the address of the default gateway, and GATEWAY_IF contains the network interface through which that default gateway can be reached.
Which interfaces are brought up and down by the ethnet script depends on the files in the /etc/sysconfig/nic-config directory. This directory should contain files in the form of ifcfg-x where x is an identification number (or whatever a user named it).
First the nic-config directory is created by running:
mkdir /etc/sysconfig/nic-config
Now, new files are created in that directory containing the following. The following command creates a sample file ifcfg-eth0:
cat > /etc/sysconfig/nic-config/ifcfg-eth0 << "EOF" ONBOOT=yes DEVICE=eth0 IP=192.168.1.1 NETMASK=255.255.255.0 BROADCAST=192.168.1.255 EOF
Of course, the values of those four variables have to be changed in every file to match the proper setup. Usually NETMASK and BROADCAST will remain the same, just the DEVICE and IP variables will change per network interface. If the ONBOOT variable is set to yes, the ethnet script will bring it up during boot up of the system. If set to anything else but yes it will be ignored by the ethnet script and thus not brought up.
These files get the proper permissions and the necessary symlinks are created by running the following commands. If you didn't create the loadkeys and/or setclock scripts, make sure not to type them in the commands below.
A note of caution: all the symlinks (that start with an S or K) have to be of the form Sxxxname where xxx are three digits denoting the order in which the script is executed (the lower the number the sooner it's executed). If you feel a need to use less than three digits, make sure you pad with extra zero's at the beginning. This means, don't use S20mydaemon, but S020mydaemon. And don't use K2otherdaemon, but K002otherdaemon.
cd /etc/init.d && chmod 754 rc rcS functions checkfs halt loadkeys mountfs reboot && chmod 754 sendsignals setclock sysklogd template && chmod 754 localnet ethnet && cd ../rc0.d && ln -sf ../init.d/ethnet K800ethnet && ln -sf ../init.d/sysklogd K900sysklogd && ln -sf ../init.d/sendsignals S800sendsignals && ln -sf ../init.d/mountfs S900mountfs && ln -sf ../init.d/halt S999halt && cd ../rc6.d && ln -sf ../init.d/ethnet K800ethnet && ln -sf ../init.d/sysklogd K900sysklogd && ln -sf ../init.d/sendsignals S800sendsignals && ln -sf ../init.d/mountfs S900mountfs && ln -sf ../init.d/reboot S999reboot && cd ../rcS.d && ln -sf ../init.d/localnet S100localnet && ln -sf ../init.d/checkfs S200checkfs && ln -sf ../init.d/mountfs S300mountfs && ln -sf ../init.d/setclock S400setclock && ln -sf ../init.d/loadkeys S500loadkeys && cd ../rc1.d && ln -sf ../init.d/ethnet K800ethnet && ln -sf ../init.d/sysklogd K900sysklogd && cd ../rc2.d && ln -sf ../init.d/sysklogd S100sysklogd && ln -sf ../init.d/ethnet K800ethnet && cd ../rc3.d && ln -sf ../init.d/sysklogd S100sysklogd && ln -sf ../init.d/ethnet S200ethnet && cd ../rc4.d && ln -sf ../init.d/sysklogd S100sysklogd && ln -sf ../init.d/ethnet S200ethnet && cd ../rc5.d && ln -sf ../init.d/sysklogd S100sysklogd && ln -sf ../init.d/ethnet S200ethnet
This chapter will make LFS bootable. This chapter deals with creating a new fstab file, building a new kernel for the new LFS system and adding the proper entries to LILO so that the LFS system can be selected for booting at the LILO: prompt.
In order for certain programs to be able to determine where certain partitions are supposed to be mounted by default, the /etc/fstab file is used. Create a new file /etc/fstab containing the following:
cat > /etc/fstab << "EOF" # Begin /etc/fstab # location of filesystem mount point fs-type options /dev/*LFS-partition device* / *fs-type* defaults 1 1 /dev/*swap-partition device* swap swap defaults 0 0 proc /proc proc defaults 0 0 # End /etc/fstab EOF
*LFS-partition device*, *swap-partition device* and *fs-type* have to be replaced with the appropriate values (/dev/hda2, /dev/hda5 and reiserfs for example).
When adding a reiserfs partition, the 1 1 at the end of the line should be replaced with 0 0.
For more information on the various fields which are in the fstab file, see man 5 fstab.
There are other lines which you may consider adding to your fstab file. One example is the line which you must have if you are using devpts:
devpts /dev/pts devpts gid=4,mode=620 0 0
Another example is a line to use if you intend to use USB devices:
none /proc/bus/usb usbdevfs defaults 0 0
Both of these options will only work if you have the relevant support compiled into your kernel.
Estimated build time: Depends on options selected Estimated required disk space: Depends on options selected
Building the kernel involves a few steps: configuring it and compiling it. There are a few ways to configure the kernel. If you don't like the way this book does it, read the README that comes with the kernel source tree, and find out what the other options are.
Something you could do, is take the .config file from your host distribution's kernel source tree and copy it to $LFS/usr/src/linux. This way you don't have to configure the entire kernel from scratch and can use your current values. If you choose to do this, first run the make mrproper command below, then copy the .config file over, then run make menuconfig (make oldconfig may be better in some situations. See the README file for more details when to use make oldconfig).
The following commands are run to build the kernel:
cd /usr/src/linux && make mrproper && make menuconfig && make dep && make bzImage && make modules && make modules_install && cp arch/i386/boot/bzImage /boot/lfskernel && cp System.map /boot
Note: the arch/i386/boot/bzImage path may vary on different platforms.
Linux-2.4.8 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
objcopy from the binutils package
chown from the fileutils package
cp from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
find from the findutils package
xargs from the findutils package
gcc from the gcc package
grep from the grep package
make from the make package
awk from the mawk package
depmod from the modutils package
genksyms from the modutils package
hostname from the net-tools package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
expr from the sh-utils package
pwd from the sh-utils package
uname from the sh-utils package
whoami from the sh-utils package
yes from the sh-utils package
cat from the textutils package
md5sum from the textutils package
sort from the textutils package
tail from the textutils package
touch from the textutils package
tr from the textutils package
In order to be able to boot the LFS system, we need to update our bootloader. We're assuming that your host system is using Lilo (since that's the most commonly used boot loader at the moment).
We will not be running the lilo program inside chroot. Running lilo inside chroot can have fatal side-effects which render your MBR useless and you'd need a boot disk to be able to start any Linux system (either the host system or the LFS system).
First we'll exit chroot and copy the lfskernel file to the host system:
logout cp $LFS/boot/lfskernel /boot
The next step is adding an entry to /etc/lilo.conf so that we can choose LFS when booting the computer:
cat >> /etc/lilo.conf << "EOF" image=/boot/lfskernel label=lfs root=<partition> read-only EOF
<partition> must be replaced with the LFS partition's designation.
Also note that if you are using reiserfs for your root partition, the line read-only should be changed to read-write.
Now, update the boot loader by running:
/sbin/lilo
The last step is synchronizing the host system's lilo configuration files with the LFS system's:
cp /etc/lilo.conf $LFS/etc && cp <kernel images> $LFS/boot
To find out which kernel images files are being used, look at the /etc/lilo.conf file and look for the lines starting with image=. If your host system has kernel files in other places than the /boot directory, make sure you update the paths in the $LFS/etc/lilo.conf file so that it does look for them in the /boot directory.
Well done! You have finished installing your LFS system. It may have been a long process but it was well worth it. We wish you a lot of fun with your new shiny custom built Linux system.
Now would be a good time to strip all debug symbols from the binaries on your LFS system. If you are not a programmer and don't plan on debugging your software, then you will be happy to know that you can reclaim a few tens of megs by removing debug symbols. This process causes no inconvenience other than not being able to debug the software fully anymore, which is not an issue if you don't know how to debug.
Disclaimer: 98% of the people who use the command mentioned below don't experience any problems. But do make a backup of your LFS system before you run this command. There's a slight chance it may backfire on you and render your system unusable (mostly by destroying your kernel modules and dynamic & shared libraries). This is more often caused by typo's than by a problem with the command used.
Having said that, the --strip-debug option we use to strip is quite harmless under normal circumstances. It doesn't strip anything vital from the files. It also is quite safe to use --strip-all on regular programs (don't use that on libraries - they will be destroyed) but it's not as safe and the space you gain is not all that much. But if you're tight on disk space every little bit helps, so decide yourself. Please refer to the strip man page for other strip options you can use. The general idea is to not run strip on libraries (other than --strip-debug) just to be on the safe side.
find $LFS/{,usr,usr/local}/{bin,sbin,lib} -type f \ -exec /usr/bin/strip --strip-debug '{}' ';'
It may be a good idea to create the $LFS/etc/lfs-3.0-rc2 file. By having this file it is very easy for you (and for us if you are going to ask for help with something at some point) to find out which LFS version you have installed on your system. This can just be a null-byte file by running:
touch $LFS/etc/lfs-3.0-rc2
Let's reboot into LFS now...
Now that all software has been installed, bootscripts have been created, it's time to reboot the computer. Before we reboot let's unmount $LFS/proc and the LFS partition itself by running:
umount $LFS/proc && umount $LFS
And you can reboot your system by running something like:
/sbin/shutdown -r now
At the LILO: prompt make sure that you tell it to boot lfs and not the default entry which will boot your host system again.
After you have rebooted, your LFS system is ready for use and you can start adding your own software.
One final thing you may want to do is run lilo, now that you are booted into LFS. This way you will put the LFS version of LILO in the MBR rather than the one that's there right now from your host system. Depending on how old your host distribution is, the LFS version may have more advanced features you need/could use.
Either way, run the following to make the lilo version installed on LFS active:
/sbin/lilo
If you are wondering: "Well, where to go now?" you'll be glad to hear that someone has written an LFS hint on the subject at http://hints.linuxfromscratch.org/hints/afterlfs.txt. On a same note, if you are not only newbie to LFS, but also newbie to Linux in general, you may find the newbie hint at http://hints.linuxfromscratch.org/hints/newbie.txt very interesting.
Don't forget there are several LFS mailinglists you can subscribe to if you are in need of help, advice, etc. See Chapter 1 - Mailing lists and archives for more information.
Again, we thank you for using the LFS Book and hope you found this book useful and worth your time.
This appendix describes the following aspect of each and every package that is installed in this book:
What every package contains
What every program from a package does
The packages are listed in the same order as they are installed in chapter 5 (Intel system) or chapter 11 (PPC systems).
Most information about these packages (especially the descriptions of it) come from the man pages from those packages. I'm not going to print the entire man page, just the core elements to make it possible to understand what a program does. To get knowledge of all details on a program, I suggest to start by reading the complete man page in addition to this appendix.
Certain packages are documented more in depth than others, because I just happen to know more about certain packages than I know about others. If anything should be added on the following descriptions, please don't hesitate to email me. This list is going to contain an in depth description of every package installed, but I can't do this on my own. I have had help from various people but more help is needed.
Please note that currently only what a package does is described and not why it needs to be installed. That will be added later.
The Bash package contains the bash program
Bash is the Bourne-Again SHell, which is a widely used command interpreter on Unix systems. Bash is a program that reads from standard input, the keyboard. A user types something and the program will evaluate what he has typed and do something with it, like running a program.
The Binutils package contains the gasp, gprof, ld, as, ar, nm, objcopy, objdump, ranlib, readelf, size, strings, strip, c++filt and addr2line programs
Gasp is the Assembler Macro Preprocessor.
ld combines a number of object and archive files, relocates their data and ties up symbol references. Often the last step in building a new compiled program to run is a call to ld.
as is primarily intended to assemble the output of the GNU C compiler gcc for use by the linker ld.
The ar program creates, modifies, and extracts from archives. An archive is a single file holding a collection of other files in a structure that makes it possible to retrieve the original individual files (called members of the archive).
objcopy utility copies the contents of an object file to another. objcopy uses the GNU BFD Library to read and write the object files. It can write the destination object file in a format different from that of the source object file.
objdump displays information about one or more object files. The options control what particular information to display. This information is mostly useful to programmers who are working on the compilation tools, as opposed to programmers who just want their program to compile and work.
ranlib generates an index to the contents of an archive, and stores it in the archive. The index lists each symbol defined by a member of an archive that is a relocatable object file.
size lists the section sizes --and the total size-- for each of the object files objfile in its argument list. By default, one line of output is generated for each object file or each module in an archive.
For each file given, strings prints the printable character sequences that are at least 4 characters long (or the number specified with an option to the program) and are followed by an unprintable character. By default, it only prints the strings from the initialized and loaded sections of object files; for other types of files, it prints the strings from the whole file.
strings is mainly useful for determining the contents of non-text files.
strip discards all or specific symbols from object files. The list of object files may include archives. At least one object file must be given. strip modifies the files named in its argument, rather than writing modified copies under different names.
The C++ language provides function overloading, which means that it is possible to write many functions with the same name (providing each takes parameters of different types). All C++ function names are encoded into a low-level assembly label (this process is known as mangling). The c++filt program does the inverse mapping: it decodes (demangles) low-level names into user-level names so that the linker can keep these overloaded functions from clashing.
addr2line translates program addresses into file names and line numbers. Given an address and an executable, it uses the debugging information in the executable to figure out which file name and line number are associated with a given address.
The Bzip2 packages contains the bzip2, bunzip2, bzcat and bzip2recover programs.
bzip2 compresses files using the Burrows-Wheeler block sorting text compression algorithm, and Huffman coding. Compression is generally considerably better than that achieved by more conventional LZ77/LZ78-based compressors, and approaches the performance of the PPM family of statistical compressors.
The Diffutils package contains the cmp, diff, diff3 and sdiff programs.
cmp and diff both compare two files and report their differences. Both programs have extra options which compare files in different situations.
The Fileutils package contains the chgrp, chmod, chown, cp, dd, df, dir, dircolors, du, install, ln, ls, mkdir, mkfifo, mknod, mv, rm, rmdir, sync, touch and vdir programs.
chgrp changes the group ownership of each given file to the named group, which can be either a group name or a numeric group ID.
chmod changes the permissions of each given file according to mode, which can be either a symbolic representation of changes to make, or an octal number representing the bit pattern for the new permissions.
dd copies a file (from the standard input to the standard output, by default) with a user-selectable blocksize, while optionally performing conversions on it.
df displays the amount of disk space available on the filesystem containing each file name argument. If no file name is given, the space available on all currently mounted filesystems is shown.
dir and vdir are versions of ls with different default output formats. These programs list each given file or directory name. Directory contents are sorted alphabetically. For ls, files are by default listed in columns, sorted vertically, if the standard output is a terminal; otherwise they are listed one per line. For dir, files are by default listed in columns, sorted vertically. For vdir, files are by default listed in long format.
dircolors outputs commands to set the LS_COLOR environment variable. The LS_COLOR variable is use to change the default color scheme used by ls and related utilities.
du displays the amount of disk space used by each argument and for each subdirectory of directory arguments.
install copies files and sets their permission modes and, if possible, their owner and group.
mv moves files from one directory to another or renames files, depending on the arguments given to mv.
touch changes the access and modification times of each given file to the current time. Files that do not exist are created empty.
The GCC package contains compilers, preprocessors and the GNU C++ Library.
A compiler translates source code in text format to a format that a computer understands. After a source code file is compiled into an object file, a linker will create an executable file from one or more of these compiler generated object files.
A preprocessor pre-processes a source file, such as including the contents of header files into the source file. It's a good idea to not do this manually to save a lot of time. Someone just inserts a line like #include <filename>. The preprocessor inserts the contents of that file into the source file. That's one of the things a preprocessor does.
The C++ library is used by C++ programs. The C++ library contains functions that are frequently used in C++ programs. This way the programmer doesn't have to write certain functions (such as writing a string of text to the screen) from scratch every time he creates a program.
The grep package contains the egrep, fgrep and grep programs.
egrep prints lines from files matching an extended regular expression pattern.
fgrep prints lines from files matching a list of fixed strings, separated by newlines, any of which is to be matched.
The Gzip package contains the compress, gunzip, gzexe, gzip, uncompress, zcat, zcmp, zdiff, zforce, zgrep, zmore and znew programs.
gunzip decompresses files that are compressed with gzip.
gzexe allows you to compress executables in place and have them automatically uncompress and execute when they are run (at a penalty in performance).
zcat uncompresses either a list of files on the command line or its standard input and writes the uncompressed data on standard output
zforce forces a .gz extension on all gzip files so that gzip will not compress them twice. This can be useful for files with names truncated after a file transfer.
zmore is a filter which allows examination of compressed or plain text files one screen at a time on a soft-copy terminal (similar to the more program).
The Linux kernel package contains the Linux kernel.
The Linux kernel is at the core of every Linux system. It's what makes Linux tick. When a computer is turned on and boots a Linux system, the very first piece of Linux software that gets loaded is the kernel. The kernel initializes the system's hardware components such as serial ports, parallel ports, sound cards, network cards, IDE controllers, SCSI controllers and a lot more. In a nutshell the kernel makes the hardware available so that the software can run.
The Make package contains the make program.
make determines automatically which pieces of a large program need to be recompiled, and issues the commands to recompile them.
The Mawk package contains the mawk program.
Mawk is an interpreter for the AWK Programming Language. The AWK language is useful for manipulation of data files, text retrieval and processing, and for prototyping and experimenting with algorithms.
The Patch package contains the patch program.
The patch program modifies a file according to a patch file. A patch file usually is a list created by the diff program that contains instructions on how an original file needs to be modified. Patch is used a lot for source code patches since it saves time and space. Imagine a package that is 1MB in size. The next version of that package only has changes in two files of the first version. It can be shipped as an entirely new package of 1MB or just as a patch file of 1KB which will update the first version to make it identical to the second version. So if the first version was downloaded already, a patch file avoids a second large download.
The Sed package contains the sed program.
sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline).
The Sh-utils package contains the basename, chroot, date, dirname, echo, env, expr, factor, false, groups, hostid, hostname, id, logname, nice, nohup, pathchk, pinky, printenv, printf, pwd, seq, sleep, stty, su, tee, test, true, tty, uname, uptime, users, who, whoami and yes programs.
The tar package contains the tar and rmt programs.
tar is an archiving program designed to store and extract files from an archive file known as a tar file.
rmt is a program used by the remote dump and restore programs in manipulating a magnetic tape drive through an interprocess communication connection.
The Texinfo package contains the info, install-info, makeinfo, texi2dvi and texindex programs
The info program reads Info documents, usually contained in the /usr/doc/info directory. Info documents are like man(ual) pages, but they tend to be more in depth than just explaining the options to a program.
The install-info program updates the info entries. When the info program is run a list with available topics (ie: available info documents) will be presented. The install-info program is used to maintain this list of available topics. If info files are removed manually, it is also necessary to delete the topic in the index file as well. This program is used for that. It also works the other way around when info documents are added.
The makeinfo program translates Texinfo source documents into various formats. Available formats are: info files, plain text and HTML.
The Textutils package contains the cat, cksum, comm, csplit, cut, expand, fmt, fold, head, join, md5sum, nl, od, paste, pr, ptx, sort, split, sum, tac, tail, tr, tsort, unexpand, uniq and wc programs.
cat concatenates file(s) or standard input to standard output.
csplit outputs pieces of a file separated by (a) pattern(s) to files xx01, xx02, ..., and outputs byte counts of each piece to standard output.
fold wraps input lines in each specified file (standard input by default), writing to standard output.
od writes an unambiguous representation, octal bytes by default, of a specified file to standard output.
paste writes lines consisting of the sequentially corresponding lines from each specified file, separated by TABs, to standard output.
tr translates, squeezes, and/or deletes characters from standard input, writing to standard output.
wc prints line, word, and byte counts for each specified file, and a total line if more than one file is specified.
The Glibc package contains the GNU C Library.
The C Library is a collection of commonly used functions in programs. This way a programmer doesn't need to create his own functions for every single task. The most common things like writing a string to the screen are already present and at the disposal of the programmer.
The C library (actually almost every library) come in two flavors: dynamic ones and static ones. In short when a program uses a static C library, the code from the C library will be copied into the executable file. When a program uses a dynamic library, that executable will not contain the code from the C library, but instead a routine that loads the functions from the library at the time the program is run. This means a significant decrease in the file size of a program. The documentation that comes with the C Library describes this in more detail, as it is too complicated to explain here in one or two lines.
The MAKEDEV package contains the MAKEDEV script.
MAKEDEV is a script that can help in creating the necessary static device files that usually reside in the /dev directory.
The Man-pages package contains various manual pages that don't come with the packages.
Examples of provided manual pages are the manual pages describing all the C and C++ functions, few important /dev/ files and more.
The Findutils package contains the find, locate, updatedb, xargs, frcode, code and bigram programs.
The find program searches for files in a directory hierarchy which match a certain criteria. If no criteria is given, it lists all files in the current directory and it's subdirectories.
Locate scans a database which contain all files and directories on a filesystem. This program lists the files and directories in this database matching a certain criteria. If a user is looking for a file this program will scan the database and tell him exactly where the files he requested are located. This only makes sense if the locate database is fairly up-to-date else it will provide out-of-date information.
The updatedb program updates the locate database. It scans the entire file system (including other file system that are currently mounted unless it is told not to do so) and puts every directory and file it finds into the database that's used by the locate program which retrieves this information. It's a good practice to update this database once a day to have it up-to-date whenever it is needed.
The xargs command applies a command to a list of files. If there is a need to perform the same command on multiple files, a file can be created that contains all these files (one per line) and use xargs to perform that command on the list.
updatedb runs a program called frcode to compress the list of file names using front-compression, which reduces the database size by a factor of 4 to 5.
bigram is used together with code to produce older-style locate databases. To learn more about these last three programs, read the locatedb.5 manual page.
The Ncurses package contains the ncurses, panel, menu and form libraries. It also contains the tic, infocmp, clear, tput, toe and tset programs.
The libraries that make up the Ncurses library are used to display text (often in a fancy way) on the screen. An example where ncurses is used is in the kernel's "make menuconfig" process. The libraries contain routines to create panels, menu's, form and general text display routines.
Tic is the terminfo entry-description compiler. The program translates a terminfo file from source format into the binary format for use with the ncurses library routines. Terminfo files contain information about the capabilities of a terminal.
The infocmp program can be used to compare a binary terminfo entry with other terminfo entries, rewrite a terminfo description to take advantage of the use= terminfo field, or print out a terminfo description from the binary file (term) in a variety of formats (the opposite of what tic does).
The clear program clears the screen if this is possible. It looks in the environment for the terminal type and then in the terminfo database to figure out how to clear the screen.
The tput program uses the terminfo database to make the values of terminal-dependent capabilities and information available to the shell, to initialize or reset the terminal, or return the long name of the requested terminal type.
The Tset program initializes terminals so they can be used, but it's not widely used anymore. It's provided for 4.4BSD compatibility.
The Vim package contains the ex, gview, gvim, rgview, rgvim, rview, rvim, view, vim, vimtutor and xxd programs.
ex starts vim in Ex mode.
rview is a restricted version of view. No shell commands can be started and Vim can't be suspended.
rvim is the restricted version of vim. No shell commands can be started and Vim can't be suspended.
The Bison package contains the bison program.
Bison is a parser generator, a replacement for YACC. YACC stands for Yet Another Compiler Compiler. What is Bison then? It is a program that generates a program that analyzes the structure of a text file. Instead of writing the actual program a user specifies how things should be connected and with those rules a program is constructed that analyzes the text file.
There are a lot of examples where structure is needed and one of them is the calculator.
Given the string :
1 + 2 * 3
A human can easily come to the result 7. Why? Because of the structure. Our brain knows how to interpret the string. The computer doesn't know that and Bison is a tool to help it understand by presenting the string in the following way to the compiler:
+
/ \
* 1
/ \
2 3
Starting at the bottom of a tree and coming across the numbers 2 and 3 which are joined by the multiplication symbol, the computer multiplies 2 and 3. The result of that multiplication is remembered and the next thing that the computer sees is the result of 2*3 and the number 1 which are joined by the add symbol. Adding 1 to the previous result makes 7. In calculating the most complex calculations can be broken down in this tree format and the computer just starts at the bottom and works it's way up to the top and comes with the correct answer. Of course, Bison isn't only used for calculators alone.
The Less package contains the less program
The less program is a file pager (or text viewer). It displays the contents of a file with the ability to scroll. Less is an improvement on the common pager called "more". Less has the ability to scroll backwards through files as well and it doesn't need to read the entire file when it starts, which makes it faster when reading large files.
The Groff packages contains the addftinfo, afmtodit, eqn, grodvi, groff, grog, grohtml, grolj4, grops, grotty, hpftodit, indxbib, lkbib, lookbib, neqn, nroff, pfbtops, pic, psbb, refer, soelim, tbl, tfmtodit and troff programs.
addftinfo reads a troff font file and adds some additional font-metric information that is used by the groff system.
eqn compiles descriptions of equations embedded within troff input files into commands that are understood by troff.
groff is a front-end to the groff document formatting system. Normally it runs the troff program and a post-processor appropriate for the selected device.
grog reads files and guesses which of the groff options -e, -man, -me, -mm, -ms, -p, -s, and -t are required for printing files, and prints the groff command including those options on the standard output.
grolj4 is a driver for groff that produces output in PCL5 format suitable for an HP Laserjet 4 printer.
indxbib makes an inverted index for the bibliographic databases a specified file for use with refer, lookbib, and lkbib.
lkbib searches bibliographic databases for references that contain specified keys and prints any references found on the standard output.
lookbib prints a prompt on the standard error (unless the standard input is not a terminal), reads from the standard input a line containing a set of keywords, searches the bibliographic databases in a specified file for references containing those keywords, prints any references found on the standard output, and repeats this process until the end of input.
pic compiles descriptions of pictures embedded within troff or TeX input files into commands that are understood by TeX or troff.
psbb reads a file which should be a Postscript document conforming to the Document Structuring conventions and looks for a %%BoundingBox comment.
refer copies the contents of a file to the standard output, except that lines between .[ and .] are interpreted as citations, and lines between .R1 and .R2 are interpreted as commands about how citations are to be processed.
tbl compiles descriptions of tables embedded within troff input files into commands that are understood by troff.
troff is highly compatible with Unix troff. Usually it should be invoked using the groff command, which will also run preprocessors and post-processors in the appropriate order and with the appropriate options.
The Man package contains the man, apropos whatis and makewhatis programs.
man formats and displays the on-line manual pages.
apropos searches a set of database files containing short descriptions of system commands for keywords and displays the result on the standard output.
whatis searches a set of database files containing short descriptions of system commands for keywords and displays the result on the standard output. Only complete word matches are displayed.
makewhatis reads all the manual pages contained in given sections of manpath or the pre-formatted pages contained in the given sections of catpath. For each page, it writes a line in the whatis database; each line consists of the name of the page and a short description, separated by a dash. The description is extracted using the content of the NAME section of the manual page.
The Perl package contains Perl - Practical Extraction and Report Language
Perl combines the features and capabilities of C, awk, sed and sh into one powerful programming language.
The M4 package contains the M4 processor
M4 is a macro processor. It copies input to output expanding macros as it goes. Macros are either built-in or user-defined and can take any number of arguments. Besides just doing macro expansion m4 has built-in functions for including named files, running UNIX commands, doing integer arithmetic, manipulating text in various ways, recursion, etc. M4 can be used either as a front-end to a compiler or as a macro processor in its own right.
The Autoconf package contains the autoconf, autoheader, autoreconf, autoscan, autoupdate and ifnames programs
Autoconf is a tool for producing shell scripts that automatically configure software source code packages to adapt to many kinds of UNIX-like systems. The configuration scripts produced by Autoconf are independent of Autoconf when they are run, so their users do not need to have Autoconf.
The autoheader program can create a template file of C #define statements for configure to use
If there are a lot of Autoconf-generated configure scripts, the autoreconf program can save some work. It runs autoconf (and autoheader, where appropriate) repeatedly to remake the Autoconf configure scripts and configuration header templates in the directory tree rooted at the current directory.
The autoscan program can help to create a configure.in file for a software package. autoscan examines source files in the directory tree rooted at a directory given as a command line argument, or the current directory if none is given. It searches the source files for common portability problems and creates a file configure.scan which is a preliminary configure.in for that package.
The autoupdate program updates a configure.in file that calls Autoconf macros by their old names to use the current macro names.
ifnames can help when writing a configure.in for a software package. It prints the identifiers that the package already uses in C preprocessor conditionals. If a package has already been set up to have some portability, this program can help to figure out what its configure needs to check for. It may help fill in some gaps in a configure.in generated by autoscan.
The Automake package contains the aclocal and automake programs
Automake includes a number of Autoconf macros which can be used in packages; some of them are actually required by Automake in certain situations. These macros must be defined in the aclocal.m4-file; otherwise they will not be seen by autoconf.
The aclocal program will automatically generate aclocal.m4 files based on the contents of configure.in. This provides a convenient way to get Automake-provided macros, without having to search around. Also, the aclocal mechanism is extensible for use by other packages.
To create all the Makefile.in's for a package, run the automake program in the top level directory, with no arguments. automake will automatically find each appropriate Makefile.am (by scanning configure.in) and generate the corresponding Makefile.in.
The Flex package contains the flex program
Flex is a tool for generating programs which recognize patterns in text. Pattern recognition is very useful in many applications. A user sets up rules what to look for and flex will make a program that looks for those patterns. The reason people use flex is that it is much easier to sets up rules for what to look for than to write the actual program that finds the text.
The File package contains the file program.
File tests each specified file in an attempt to classify it. There are three sets of tests, performed in this order: filesystem tests, magic number tests, and language tests. The first test that succeeds causes the file type to be printed.
The Libtool package contains the libtool and libtoolize programs. It also contains the ltdl library.
Libtool provides generalized library-building support services.
Libtool provides a small library, called `libltdl', that aims at hiding the various difficulties of dlopening libraries from programmers.
The Bin86 contains the as86, as86_encap, ld86, objdump86, nm86 and size86 programs.
as86 is an assembler for the 8086...80386 processors.
as86_encap is a shell script to call as86 and convert the created binary into a C file prog.v to be included in or linked with programs like boot block installers.
ld86 understands only the object files produced by the as86 assembler, it can link them into either an impure or a separate I&D executable.
The Ed package contains the ed program.
Ed is a line-oriented text editor. It is used to create, display, modify and otherwise manipulate text files.
The gettext package contains the gettext, gettextize, msgcmp, msgcomm, msgfmt, msgmerge, msgunfmt and xgettext programs.
The gettext package is used for internationalization (also known as i18n) and for localization (also known as l10n). Programs can be compiled with Native Language Support (NLS) which enable them to output messages in the users native language rather than in the default English language.
The Kbd package contains the chvt, deallocvt, dumpkeys, fgconsole, getkeycodes, kbd_mode, kbdrate, loadkeys, loadunimap, mapscrn, psfxtable, resizecons, screendump, setfont, setkeycodes, setleds, setmetamode, setvesablank, showfont, showkey, unicode_start, and unicode_stop programs. There are some other programs that don't get installed by default, as they are very optional. Take a look at the Kbd package contents if you have trouble with your console.
chvt changes foreground virtual terminal.
mapscrn loads a user defined output character mapping table into the console driver. Note that it is obsolete and that its features are built into setfont.
setleds sets the keyboard LEDs. Many people find it useful to have numlock enabled by default, and it is by using this program that you can achieve this.
This lets you fiddle with the built-in hardware screensaver (not toasters, only a blank screen).
showfont displays data about a font. The information shown includes font information, font properties, character metrics, and character bitmaps.
The e2fsprogs package contains the chattr, lsattr, uuidgen, badblocks, debugfs, dumpe2fs, e2fsck, e2label, fsck, fsck.ext2, mke2fs, mkfs.ext2, mklost+found and tune2fs programs.
chattr changes the file attributes on a Linux second extended file system.
The uuidgen program creates a new universally unique identifier (UUID) using the libuuid library. The new UUID can reasonably be considered unique among all UUIDs created on the local system, and among UUIDs created on other systems in the past and in the future.
The debugfs program is a file system debugger. It can be used to examine and change the state of an ext2 file system.
dumpe2fs prints the super block and blocks group information for the filesystem present on a specified device.
e2fsck is used to check a Linux second extended file system. fsck.ext2 does the same as e2fsck.
e2label will display or change the filesystem label on the ext2 filesystem located on the specified device.
mke2fs is used to create a Linux second extended file system on a device (usually a disk partition). mkfs.ext2 does the same as mke2fs.
mklost+found is used to create a lost+found directory in the current working directory on a Linux second extended file system. mklost+found pre-allocates disk blocks to the directory to make it usable by e2fsck.
The Modutils package contains the depmod, genksyms, insmod, insmod_ksymoops_clean, kerneld, kernelversion, ksyms, lsmod, modinfo, modprobe and rmmod programs.
depmod handles dependency descriptions for loadable kernel modules.
genksyms reads (on standard input) the output from gcc -E source.c and generates a file containing version information.
modinfo examines an object file associated with a kernel module and displays any information that it can glean.
Modprobe uses a Makefile-like dependency file, created by depmod, to automatically load the relevant module(s) from the set of modules available in predefined directory trees.
The Procinfo package contains the procinfo program.
procinfo gathers some system data from the /proc directory and prints it nicely formatted on the standard output device.
The Procps package contains the free, kill, oldps, ps, skill, snice, sysctl, tload, top, uptime, vmstat, w and watch programs.
free displays the total amount of free and used physical and swap memory in the system, as well as the shared memory and buffers used by the kernel.
tload prints a graph of the current system load average to the specified tty (or the tty of the tload process if none is specified).
uptime gives a one line display of the following information: the current time, how long the system has been running, how many users are currently logged on, and the system load averages for the past 1, 5, and 15 minutes.
vmstat reports information about processes, memory, paging, block IO, traps, and cpu activity.
The Psmisc package contains the fuser, killall, pidof and pstree programs.
fuser displays the PIDs of processes using the specified files or file systems.
Pidof finds the process id's (pids) of the named programs and prints those id's on standard output.
The Shadow Password Suite contains the chage, chfn, chsh, expiry, faillog, gpasswd, lastlog, login, newgrp, passwd, sg, su, chpasswd, dpasswd, groupadd, groupdel, groupmod, grpck, grpconv, grpunconv, logoutd, mkpasswd, newusers, pwck, pwconv, pwunconv, useradd, userdel, usermod and vipw programs.
chage changes the number of days between password changes and the date of the last password change.
chfn changes user full name, office number, office extension, and home phone number information for a user's account.
faillog formats the contents of the failure log,/var/log/faillog, and maintains failure counts and limits.
lastlog formats and prints the contents of the last login log, /var/log/lastlog. The login-name, port, and last login time will be printed.
Change the effective user id and group id to that of a user. This replaces the su programs that's installed from the Shellutils package.
chpasswd reads a file of user name and password pairs from standard input and uses this information to update a group of existing users.
The groupadd command creates a new group account using the values specified on the command line and the default values from the system.
The groupdel command modifies the system account files, deleting all entries that refer to group.
The groupmod command modifies the system account files to reflect the changes that are specified on the command line.
mkpasswd reads a file in the format given by the flags and converts it to the corresponding database file format.
newusers reads a file of user name and clear text password pairs and uses this information to update a group of existing users or to create new users.
userdel modifies the system account files, deleting all entries that refer to a specified login name.
usermod modifies the system account files to reflect the changes that are specified on the command line.
vipw and vigr will edit the files /etc/passwd and /etc/group, respectively. With the -s flag, they will edit the shadow versions of those files, /etc/shadow and /etc/gshadow, respectively.
The Sysklogd package contains the klogd and syslogd programs.
klogd is a system daemon which intercepts and logs Linux kernel messages.
Syslogd provides a kind of logging that many modern programs use. Every logged message contains at least a time and a hostname field, normally a program name field, too, but that depends on how trusty the logging program is.
The Sysvinit package contains the pidof, last, lastb, mesg, utmpdump, wall, halt, init, killall5, poweroff, reboot, runlevel, shutdown, sulogin and telinit programs.
Pidof finds the process id's (pids) of the named programs and prints those id's on standard output.
last searches back through the file /var/log/wtmp (or the file designated by the -f flag) and displays a list of all users logged in (and out) since that file was created.
lastb is the same as last, except that by default it shows a log of the file /var/log/btmp, which contains all the bad login attempts.
Mesg controls the access to the users terminal by others. It's typically used to allow or disallow other users to write to his terminal.
utmpdumps prints the content of a file (usually /var/run/utmp) on standard output in a user friendly format.
Halt notes that the system is being brought down in the file /var/log/wtmp, and then either tells the kernel to halt, reboot or poweroff the system. If halt or reboot is called when the system is not in runlevel 0 or 6, shutdown will be invoked instead (with the flag -h or -r).
Init is the parent of all processes. Its primary role is to create processes from a script stored in the file /etc/inittab. This file usually has entries which cause init to spawn gettys on each line that users can log in. It also controls autonomous processes required by any particular system.
killall5 is the SystemV killall command. It sends a signal to all processes except the processes in its own session, so it won't kill the shell that is running the script it was called from.
poweroff is equivalent to shutdown -h -p now. It halts the computer and switches off the computer (when using an APM compliant BIOS and APM is enabled in the kernel).
Runlevel reads the system utmp file (typically /var/run/utmp) to locate the runlevel record, and then prints the previous and current system runlevel on its standard output, separated by a single space.
shutdown brings the system down in a secure way. All logged-in users are notified that the system is going down, and login is blocked.
sulogin is invoked by init when the system goes into single user mode (this is done through an entry in /etc/inittab). Init also tries to execute sulogin when it is passed the -b flag from the boot loader (eg, LILO).
The Util-linux package contains the arch, dmesg, kill, more, mount, umount, agetty, blockdev, cfdisk, ctrlaltdel, elvtune, fdisk, fsck.minix, hwclock, kbdrate, losetup, mkfs, mkfs.bfs, mkfs.minix, mkswap, sfdisk, swapoff, swapon, cal, chkdupexe, col, colcrt, colrm, column, cytune, ddate, fdformat, getopt, hexdump, ipcrm, ipcs, logger, look, mcookie, namei, rename, renice, rev, script, setfdprm, setsid, setterm, ul, whereis, write, ramsize, rdev, readprofile, rootflags, swapdev, tunelp and vidmode programs.
arch prints the machine architecture.
hexdump displays specified files, or standard input, in a user specified format (ascii, decimal, hexadecimal, octal).
ul reads a file and translates occurrences of underscores to the sequence which indicates underlining for the terminal in use.
The Netkit-base package contains the inetd and ping programs.
inetd is the mother of all daemons. It listens for connections, and transfers the call to the appropriate daemon.
The Net-tools package contains the arp, hostname, ifconfig, netstat, plipconfig rarp, route, and slattach programs.
arp is used to manipulate the kernel's ARP cache, usually to add or delete an entry, or to dump the ARP cache.
hostname, with its symlinks domainname, dnsdomainname, nisdomainname, ypdomainname, and nodename, is used to set or show the system's hostname (or other, depending on the symlink used).
netstat is a multi-purpose tool used to print the network connections, routing tables, interface statistics, masquerade connections, and multicast memberships.
slattach attaches a network interface to a serial line, i.e.. puts a normal terminal line into one of several "network" modes.
This appendix lists all the installation dependencies for all the packages that are installed in this book. The listings will include which programs from which packages are needed to successfully compile the package to be installed.
These are not running dependencies, meaning they don't tell you what programs are needed to use that packages programs. Just the ones needed to compile it.
The dependency list can be, from time to time, outdated in regards to the current used package version. Checking dependencies takes quite a bit of work, so they may lag behind a bit on the package update. But often with minor package updates, the installation dependencies hardly change, so they'll be current in most cases. If we upgrade to a major new release, we'll make sure the dependencies are checked too at the same time.
Bash-2.05 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
size from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Binutils-2.11.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
ranlib from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
rmdir from the fileutils package
touch from the fileutils package
gcc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
makeinfo from the texinfo package
cat from the textutils package
sort from the textutils package
tail from the textutils package
tr from the textutils package
true from the sh-utils package
uniq from the textutils package
Bzip2-1.0.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cp from the fileutils package
ln from the fileutils package
rm from the fileutils package
gcc from the gcc package
make from the make package
Diffutils-2.7 needs the following to be installed:
sh from the bash package
ld from the binutils package
as from the binutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
cat from the textutils package
tr from the textutils package
Fileutils-4.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
install from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
uniq from the textutils package
GCC-2.95.3 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
ranlib from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
find from the find package
gcc from the gcc package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
mawk from the mawk package
sed from the sed package
basename from the sh-utils package
echo from the sh-util package
expr from the sh-utils package
sleep from the sh-utils package
true from the sh-utils package
uname from the sh-utils package
tar from the tar package
makeinfo from the texinfo package
cat from the textutils package
head from the textutils package
sort from the textutils package
tail from the textutils package
tr from the textutils package
uniq from the textutils package
Grep-2.4.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Gzip-1.2.4a needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
nm from the binutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
cat from the textutils package
tr from the textutils package
Linux-2.4.8 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
objcopy from the binutils package
chown from the fileutils package
cp from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
find from the findutils package
xargs from the findutils package
gcc from the gcc package
grep from the grep package
make from the make package
awk from the mawk package
depmod from the modutils package
genksyms from the modutils package
hostname from the net-tools package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
expr from the sh-utils package
pwd from the sh-utils package
uname from the sh-utils package
whoami from the sh-utils package
yes from the sh-utils package
cat from the textutils package
md5sum from the textutils package
sort from the textutils package
tail from the textutils package
touch from the textutils package
tr from the textutils package
Make-3.79.1 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chgrp from the fileutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Mawk-1.3.3 needs the following to be installed:
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
rm from the fileutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
tee from the sh-utils package
cat from the textutils package
tr from the textutils package
Patch-2.5.4 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Sed-3.02 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
cat from the textutils package
tr from the textutils package
Sh-utils-2.0 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
chown from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Tar-1.13 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
patch from the patch package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Texinfo-4.0 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Textutils-2.0 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Chroot needs the following to be installed:
bash from the bash package
env from the sh-utils package
Glibc-2.2.4 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
ranlib from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mknod from the fileutils package
mv from the fileutils package
mkdir from the fileutils package
rm from the fileutils package
touch from the fileutils package
cpp from the gcc package
gcc from the gcc package
egrep from the grep package
grep from the grep package
gzip from the gzip package
make from the make package
mawk from the mawk package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
pwd from the sh-utils package
uname from the sh-utils package
cat from the textutils package
sort from the textutils package
tr from the textutils package
MAKEDEV-1.3 needs the following to be installed:
sh from the bash package
chmod from the fileutils package
chown from the fileutils package
cp from the fileutils package
ln from the fileutils package
mknod from the fileutils package
mv from the fileutils package
rm from the fileutils package
grep from the grep package
expr from the sh-utils package
Man-pages-1.39 needs the following to be installed:
sh from the bash package
install from the fileutils package
make from the make package
patch from the patch package
Findutils-4.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
grep from the grep package
cc from the gcc package
make from the make package
patch from the patch package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
cat from the textutils package
tr from the textutils package
Ncurses-5.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
c++ from the gcc package
gcc from the gcc package
egrep from the grep package
fgrep from the grep package
grep from the grep package
make from the make package
mawk from the mawk package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
test from the sh-utils package
uname from the sh-utils package
cat from the textutils package
sort from the textutils package
tr from the textutils package
wc from the textutils package
Vim-5.8 needs the following to be installed:
sh from the bash package
ld from the binutils package
as from the binutils package
cmp from the diffutils package
diff from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
find from the find package
cc from the gcc package
grep from the grep package
make from the make package
hostname from the net-tools package
sed from the sed package
echo from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
whoami from the sh-utils package
cat from the textutils package
tr from the textutils package
wc from the textutils package
Bison-1.28 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
rm from the fileutils package
cp from the fileutils package
mkdir from the fileutils package
ls from the fileutils package
chmod from the fileutils package
mv from the fileutils package
ln from the fileutils package
cc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
tr from the textutils package
cat from the textutils package
Less-358 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
grep from the grep package
cc from the gcc package
make from the make package
sed from the sed package
dirname from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Groff-1.17.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
bison from the bison package
yacc from the bison package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
c++ from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
awk from the mawk package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
touch from the fileutils package
tr from the textutils package
Man-1.5i2 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
bzip2 from the bzip2 package
chmod from the fileutils package
cp from the fileutils package
install from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
gcc from the gcc package
grep from the grep package
gunzip from the gzip package
zcat from the gzip package
make from the make package
awk from the mawk package
sed from the sed package
echo from the sh-utils package
cat from the textutils package
Perl-5.6.1 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
bison from the bison package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
gcc from the gcc package
egrep from the grep package
grep from the grep package
nroff from the groff package
gzip from the gzip package
less from the less package
make from the make package
awk from the mawk package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
tee from the sh-utils package
test from the sh-utils package
true from the sh-utils package
uname from the sh-utils package
cat from the textutils package
comm from the textutils package
sort from the textutils package
split from the textutils package
tr from the textutils package
uniq from the textutils package
wc from the textutils package
M4-1.4 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
chmod from the fileutils package
cp from the fileutils package
mv from the fileutils package
rm from the fileutils package
make from the make package
cc from the gcc package
egrep from the grep package
grep from the grep package
sed from the sed package
basename from the sh-utils package
date from the sh-utils package
cat from the textutils package
tr from the textutils package
Autoconf-2.52 needs the following to be installed:
sh from the bash package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
m4 from the m4 package
make from the make package
perl from the perl package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
cat from the textutils package
tr from the textutils package
Automake-1.5 needs the following to be installed:
sh from the bash package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
grep from the grep package
make from the make package
perl from the perl package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
cat from the textutils package
tr from the textutils package
Flex-2.5.4a needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
bison from the bison package
yacc from the bison package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
dirname from the sh-utils package
cat from the textutils package
tr from the textutils package
File-3.36 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
cat from the textutils package
tr from the textutils package
Libtool-1.4 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
rmdir from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Bin86-0.16.0 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
strip from the binutils package
chmod from the fileutils package
install from the fileutils package
ln from the fileutils package
mv from the fileutils package
cc from the gcc package
make from the make package
sed from the sed package
Ed-0.2 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
touch from the fileutils package
cc from the gcc package
grep from the grep package
egrep from the grep package
make from the make package
sed from the sed package
cat from the textutils package
tr from the textutils package
Gettext-0.10.39 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
rmdir from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
echo from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
sort from the textutils package
tr from the textutils package
uniq from the textutils package
Kbd-1.06 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils packag
strip from the binutils package
bison from the bison package
cp from the fileutils package
install from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
flex from the flex package
cpp from the gcc package
gcc from the gcc package
gunzip from the gzip package
gzip from the gzip package
make from the make package
sed from the sed package
uname from the sh-utils package
E2fsprogs-1.22 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
sync from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
gzip from the gzip package
make from the make package
awk from the mawk package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
uname from the sh-utils package
makeinfo from the texinfo package
cat from the textutils package
tr from the textutils package
Lilo-21.7.5 needs the following to be installed:
sh from the bash package
as86 from the bin86 package
ld86 from the bin86 package
as from the binutils package
ld from the binutils package
strip from the binutils package
cp from the fileutils package
dd from the fileutils package
ln from the fileutils package
mv from the fileutils package
cc from the gcc package
make from the make package
sed from the sed package
cat from the textutils package
Modutils-2.4.7 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
strip from the binutils package
bison from the bison package
cmp from the diffutils package
chmod from the fileutils package
install from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
flex from the flex package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
expr from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Netkit-base-0.17 needs the following to be installed:
sh rom the bash package
as rom the binutils package
ld rom the binutils package
strip rom the binutils package
cp rom the fileutils package
install from the fileutils package
rm rom the fileutils package
make rom the make package
cc rom the gcc package
sed rom the sed package
date from the sh-utils package
cat from the textutils package
Procinfo-18 needs the following to be installed:
as from the binutils package
ld from the binutils package
install from the fileutils package
mkdir from the fileutils package
make from the make package
sed from the sed package
Procps-2.0.7 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
strip from the binutils package
install from the fileutils package
ln from the fileutils package
mv from the fileutils package
rm from the fileutils package
gcc from the gcc package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
pwd from the sh-utils package
sort from the textutils package
tr from the textutils package
Psmisc-20.1 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ls from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
tr from the textutils package
Net-tools-1.60 needs the following to be installed:
bash from the bash package
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
install from the fileutils package
ln from the fileutils package
rm from the fileutils package
msgfmt from the gettext package
cc from the gcc package
make from the make package
basename from the sh-utils package
echo from the sh-utils package
env from the sh-utils package
Shadow-20001016 needs the following to be installed:
sh from the bash package
ar from the binutils package
as from the binutils package
ld from the binutils package
nm from the binutils package
cmp from the diffutils package
chmod from the fileutils package
cp from the fileutils package
ln from the fileutils package
ls from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
rmdir from the fileutils package
cc from the gcc package
egrep from the grep package
grep from the grep package
make from the make package
sed from the sed package
basename from the sh-utils package
expr from the sh-utils package
sleep from the sh-utils package
uname from the sh-utils package
cat from the textutils package
sort from the textutils package
uniq from the textutils package
Sysklogd-1.4.1 needs the following to be installed:
as from the binutils package
ld from the binutils package
strip from the binutils package
install from the fileutils package
gcc rom the gcc package
make from the make package
Sysvinit-2.82 needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
chown from the fileutils package
install from the fileutils package
ln from the fileutils package
mknod from the fileutils package
rm from the fileutils package
cc from the gcc package
make from the make package
patch from the patch package
Util-linux-2.11h needs the following to be installed:
sh from the bash package
as from the binutils package
ld from the binutils package
chgrp from the fileutils package
chmod from the fileutils package
cp from the fileutils package
install from the fileutils package
ln from the fileutils package
mkdir from the fileutils package
mv from the fileutils package
rm from the fileutils package
cc from the gcc package
cpp from the gcc package
rpcgen from the glibc package
grep from the grep package
make from the make package
sed from the sed package
unam from the sh-utils package
whoami from the sh-utils package
cat from the textutils package
A list of books, HOWTOs and other documents that might be useful to download or buy follows. This list is just a small list to start with. We hope to be able to expand this list in time as we come across more useful documents or books.
Linux Network Administrator's Guide published by O'Reilly. ISBN: 1-56502-087-2
Running Linux published by O'Reilly. ISBN: 1-56592-151-8
All of the following HOWTOs can be downloaded from the Linux Documentation Project site at http://www.linuxdoc.org
Linux Network Administrator's Guide
Powerup2Bash-HOWTO
Below is the list with packages from chapter 3 with their original download locations. This might help to find a newer version of a package quicker.
Bash (2.05):
ftp://ftp.gnu.org/gnu/bash/
Binutils (2.11.2):
ftp://ftp.gnu.org/gnu/binutils/
Bzip2 (1.0.1):
ftp://sourceware.cygnus.com/pub/bzip2/
Diff Utils (2.7):
ftp://ftp.gnu.org/gnu/diffutils/
File Utils (4.1):
ftp://ftp.gnu.org/gnu/fileutils/
GCC (2.95.3):
ftp://ftp.gnu.org/pub/gnu/gcc
Grep (2.4.2):
ftp://ftp.gnu.org/gnu/grep/
Gzip (1.2.4a):
ftp://ftp.gnu.org/gnu/gzip/
Gzip Patch (1.2.4a):
ftp://ftp.linuxfromscratch.org/3.0-rc2/
http://ftp.linuxfromscratch.org/3.0-rc2/
Linux Kernel (2.4.8):
ftp://ftp.kernel.org/pub/linux/kernel/
Make (3.79.1):
ftp://ftp.gnu.org/gnu/make/
Mawk (1.3.3):
ftp://ftp.whidbey.net/pub/brennan/
Patch (2.5.4):
ftp://ftp.gnu.org/gnu/patch/
Sed (3.02):
ftp://ftp.gnu.org/gnu/sed/
Sh-utils (2.0):
ftp://ftp.gnu.org/gnu/sh-utils/
Sh-utils Patch (2.0):
ftp://ftp.linuxfromscratch.org/3.0-rc2/
http://ftp.linuxfromscratch.org/3.0-rc2/
Tar (1.13):
ftp://ftp.gnu.org/gnu/tar/
Tar Patch (1.13):
ftp://ftp.linuxfromscratch.org/3.0-rc2/
http://ftp.linuxfromscratch.org/3.0-rc2/
Texinfo (4.0):
ftp://ftp.gnu.org/gnu/texinfo/
Text Utils (2.0):
ftp://ftp.gnu.org/gnu/textutils/
Glibc (2.2.4):
ftp://ftp.gnu.org/gnu/glibc/
Glibc-linuxthreads (2.2.4):
ftp://ftp.gnu.org/gnu/glibc/
MAKEDEV (1.3):
ftp://ftp.linuxfromscratch.org/3.0-rc2/
http://ftp.linuxfromscratch.org/3.0-rc2/
Man-pages (1.39):
ftp://ftp.win.tue.nl/pub/linux-local/manpages/
Man-pages Patch (1.39):
ftp://ftp.linuxfromscratch.org/3.0-rc2/
http://ftp.linuxfromscratch.org/3.0-rc2/
Find Utils (4.1):
ftp://ftp.gnu.org/gnu/findutils/
Find Utils Patch (4.1):
ftp://ftp.linuxfromscratch.org/3.0-rc2/
http://ftp.linuxfromscratch.org/3.0-rc2/
Ncurses (5.2):
ftp://ftp.gnu.org/gnu/ncurses/
Vim-rt (5.8):
ftp://ftp.vim.org/pub/editors/vim/unix/
Vim-src (5.8):
ftp://ftp.vim.org/pub/editors/vim/unix/
Bison (1.28):
ftp://ftp.gnu.org/gnu/bison/
Less (358):
ftp://ftp.gnu.org/gnu/less/
Groff (1.17.2):
ftp://ftp.gnu.org/gnu/groff/
Man (1.5i2):
ftp://ftp.win.tue.nl/pub/linux-local/utils/man/
Perl (5.6.1):
http://www.perl.com
M4 (1.4):
ftp://ftp.gnu.org/gnu/m4/
Autoconf (2.52):
ftp://ftp.gnu.org/gnu/autoconf/
Automake (1.5):
ftp://ftp.gnu.org/gnu/automake/
Flex (2.5.4a):
ftp://ftp.gnu.org/non-gnu/flex/
File (3.36):
ftp://ftp.gw.com/mirrors/pub/unix/file/
Libtool (1.4):
ftp://ftp.gnu.org/gnu/libtool/
Bin86 (0.16.0):
http://www.cix.co.uk/~mayday/
Ed (0.2):
ftp://ftp.gnu.org/gnu/ed/
Gettext (0.10.39):
ftp://ftp.gnu.org/gnu/gettext/
Kbd (1.06):
ftp://ftp.win.tue.nl/pub/linux-local/utils/kbd/
E2fsprogs (1.23):
ftp://download.sourceforge.net/pub/sourceforge/e2fsprogs/
http://download.sourceforge.net/e2fsprogs/
Lilo (21.7.5):
ftp://metalab.unc.edu/pub/Linux/system/boot/lilo
Modutils (2.4.7):
ftp://ftp.kernel.org/pub/linux/utils/kernel/modutils
Procinfo (18):
ftp://ftp.cistron.nl/pub/people/svm/
Procps (2.0.7):
ftp://people.redhat.com/johnsonm/procps/
Psmisc (20.1):
http://download.sourceforge.net/psmisc/
ftp://download.sourceforge.net/pub/sourceforge/psmisc/
Shadow Password Suite (20001016):
ftp://ftp.pld.org.pl/software/shadow/
Sysklogd (1.4.1):
ftp://ftp.ibiblio.org/pub/Linux/system/daemons/
Sysvinit (2.82):
ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/
Util Linux (2.11h):
ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux/
Netkit-base (0.17):
ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/
Net-tools (1.60):
http://www.tazenda.demon.co.uk/phil/net-tools/