Building LFS from Live CD Hint - Request for Comments

Joseph M Dupre (AVAB Inc.) dupre at avab.com
Tue Aug 16 14:56:00 PDT 2005


I have written a hint for building LFS using the live CD.  I request 
any feedback before I submit it to the hints administrator.

- Joe


*** PRELIMINARY *** PRELIMINARY *** PRELIMINARY ***

AUTHOR: Joseph M. Dupré <dupre avab com>

DATE: 2005-08-

LICENSE: tbd

SYNOPSIS: How to build a LFS system using the LFS live CD as your 
host OS.

DESCRIPTION:
This hint should guide you through the process of building a LFS 
system on a "new" computer, or one that does not have an existing 
Linux operating system installed.  You use the LFS live CD to boot 
the computer instead of loading a pre-packaged linux distribution 
like Debian or Red Hat.  This is the "cleanest" way to build a LFS 
sytem, since inconsistancies and idiosyncracies of various 
distributions are removed.

ATTACHMENTS:
[none]

PREREQUISITES:
The prerequisists are the same as that of LFS.  You will also need to 
have the LFS live CD for the version of LFS that you intend to build. 
 I also assume that you know how to create and edit a text file with 
an editor, rather than using redirected cat or echo commands.  This 
is not a hint on using the live CD, so any problems you encounter 
using or booting your system with the live CD should be directed to 
the LFS live CD mailing list.

HINT:
Follow the procedures in the LFS book.  When something differs when 
using the live cd environment, it will be pointed below by chapter 
number.  When following the LFS book note the difference between the 
"back-tick" [ ` ] and the single quote [ ' ].  On a US keyboard the 
back-tick is on the key with the [ ~ ] and the single-quote is on the 
key with the [ " ].  Also, capitalization matters.  If you specify a 
configure or make option in the wrong case, you may not get any 
warning and the build may fail or exhibit problems later.  Think 
about what each command does before you hit the enter key.  If you 
don't understand what is happening, look it up using the man pages.  
I learned more about Linux building my first LFS system then I did in 
several years of administering Red Hat Linux systems. 

In the command examples shown below the leading # is a prompt.  Do 
not type it.  However, in the script examples, the leading # 
indicates a line that is a comment.  In this case you must type the # 
within the script, or ignore the line completely. 

2.2
By now you should have booted your system using the LFS live CD.  All 
the tools for creating a partition and creating a filesystem are 
included in the live CD's operating system.

3.1
All the source packages and patches should be on the live CD in 
/sources.  You don't have to copy them all once to your lfs partition 
if you do not have the space, but it makes life easier.
# cp -R /sources $LFS

4.2
Since you create a link on the root of the live CD's filesystem, it 
will be gone the next time you boot.  We will add this link to a 
startup script later.

4.3
Since the CD can not be accidentally damaged, there is no reason to 
create a lfs user for safety.  Ignore this chapter.

4.4
Read chapter 4.4, but don't do anything yet.  The problem with using 
a live CD to build your system is that everytime you reboot the 
system, any special settings you have made to your user environment 
are lost.  You can't easily make a lfs user and a special build 
environment by editing the user's .bash_profile and .bashrc files as 
specified in this chapter.  So instead, we will write a script that 
sets up a "clean" environment.  This script will have to be run each 
time you leave the special build environment or re-boot the system.

The only place you have to store any settings that will remain the 
next time you boot the live CD is the partion you created for your 
LFS build.  Although there may well be better solutions to this, this 
is the method I used when building LFS 6.1.  I am assuming that you 
place all of the scripts mentioned in this hint in the root of your 
LFS partition.

cd to $LFS and create the following script using your favorite text 
editor (provided that your favorite text editor is included on the 
live cd).  At the time of writing, you may use vim, nano or joe.   

#################################################################
# Begin setenv.sh
# Sets up clean environment for 6.1 Chapter 5
#
# Before this script is run, you must have executed the following
# after booting to the live CD:
#
# export LFS=/mnt/lfs
# mkdir $LFS
# mount /dev/xxx $LFS	(where xxx is your lfs partition)

# Create the link to tools as per Ch 4.2
ln -s $LFS/tools /

# Set up the environment as per chapter 4.4
# This sets up a special environment for root based
# on the procedure for the user "lfs" which isn't
# necessary when running from the live CD.
 
echo "set +h" > ~/.bashrc
echo "LFS=/mnt/lfs" >> ~/.bashrc
echo "LC_ALL=POSIX" >> ~/.bashrc
echo "PATH=/tools/bin:/bin:/usr/bin" >> ~/.bashrc
echo "export LC_ALL PATH" >> ~/.bashrc

# This sets up key mapping so the delete key works:
cp /etc/inputrc ~/.inputrc

# Enter the special build environment
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash

# End setenv.sh
###################################################################

And now make the script file executable and run it:
# chmod 700 setenv.sh
# ./setenv.sh

Note the difference between the live CD shell prompt and the special 
"build" environment prompt we have created here.  You will be able to 
easily see which environment you are in.

So, to recap, every time you reboot the system you will have to 
execute the following commands to mount your LFS partition:

# export LFS=/mnt/lfs
# mkdir $LFS
# mount /dev/[xxx] $LFS

(Replace [xxx] with the partition that you have created for your LFS 
installation.)

Then, run the setenv script to set up a "clean" environment:
# $LFS/setenv.sh

Now you can continue on with chapter 5...

When you are done with chapter 5, you may want to make a backup of 
this partition using "Ghost" or some other backup tool.  (Just in 
case something goes wrong in the next chapter...)  It could also be 
used for a future build, or on another machine of the same 
architecture.

Turn off your machine and take a break.  At least type "exit" to 
leave the temporary build environment. 

Chapter 6
For the procedures in chapter 6 we will no longer be using the 
setenv.sh script to set up the build environment. Instead we "chroot" 
into the $LFS directory.  This will require running a script to enter 
the chroot environment, and then another script to configure the 
temporaty filesystems and devices within that environment.

If you are still in the environment set up by setenv.sh, type exit to 
return to the live CD root prompt.  Or to be safe, reboot the live 
CD.


6.2
Create the $LFS/proc and $LFS/sys directories, but do not mount the 
file systems.  We will mount the filesystems in the lfschroot.sh 
script below.

6.3
It is assumed that during the build process you may want to take a 
break and turn off your machine to save energy.  Rather than retyping 
all the commands required to chroot when you come back, we will put 
them all in the following script.

################################################################
# Begin lfschroot.sh
# Changes root directory for use in LFS 6.1 Chapter 6

# Mount required filesystems
mount -t proc proc $LFS/proc
mount -t sysfs sysfs $LFS/sys

# These "fake mounts" are also needed now
mount -f -t ramfs ramfs $LFS/dev
mount -f -t tmpfs tmpfs $LFS/dev/shm
mount -f -t devpts -o gid=4,mode=620 devpts $LFS/dev/pts

echo ""
echo "Do not forget to populate /dev !"
echo ""

# Chroot into the LFS system with a reduced environment
chroot "$LFS" /tools/bin/env -i \
	HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
	PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
	/tools/bin/bash --login +h

# End lfschroot.sh
###################################################################

Make the script executable with this command.
# chmod 700 lfschroot.sh

Enter the lfs chroot environment:
# ./lfschroot.sh

Ignore the reminder about populating /dev.  I will cover that in 
chapter 6.8

Once in the chroot environment a lot of things will be "broken".  You 
no longer have access to the text editors or many of the other tools 
from the live CD.  In fact, all you have to work with is what you 
have installed in chapter 5.

6.4
Since we skipped creating the lfs user, you can skip this too.  Note 
that when in the chroot environment the files are allready owned by 
0:0, whereas outside the in the live CD environment that are owned by 
root:root.  This is because the files are never really owned by 
"root", they are owned by user 0 group 0.  A "normal" OS translates 
the user and group numbers to the user and group names specified in 
/etc/passwd and /etc/group.  Since we have no passwd or group files, 
"I have no name!"  

6.5 - 6.7
[Optional] I hate typing a bunch of stuff on the command line.  I 
like to make a script file so I can edit it and run it later if 
necessary.  For reasons mentioned above it is a bit difficult to do 
that now in the chroot environment.  You may want to consider exiting 
now and creating scripts to perform the commands for chapters 6.5 
through 6.7.  (Or think about learning ALFS!)

6.8
Make the two nodes as decribed in 6.8.1


6.8.2
We are going to make a script for this, so that we can populate /dev 
at will while building the rest of chapter 6.  Exit the chroot 
environment and create the following script in your $LFS directory to 
load the device nodes.

#########################################################
# Begin devpop.sh
# Based on LFS 6.1 Chapter 6.8.2
# This mounts a tempfs to /dev and populates
# the /dev directories with a minimal set of device nodes.
# ONLY RUN AFTER YOU HAVE CHROOTed INTO LFS DIRECTORY!!!

mount -n -t tmpfs none /dev

mknod -m 622 /dev/console c 5 1
mknod -m 666 /dev/null c 1 3
mknod -m 666 /dev/zero c 1 5
mknod -m 666 /dev/ptmx c 5 2
mknod -m 666 /dev/tty c 5 0
mknod -m 444 /dev/random c 1 8
mknod -m 444 /dev/urandom c 1 9
chown root:tty /dev/{console,ptmx,tty}

# These symbolic links are required by LFS
ln -s /proc/self/fd /dev/fd
ln -s /proc/self/fd/0 /dev/stdin
ln -s /proc/self/fd/1 /dev/stdout
ln -s /proc/self/fd/2 /dev/stderr
ln -s /proc/kcore /dev/core

# Mount the kernel filesystems within /dev
mkdir /dev/pts
mkdir /dev/shm
mount -t devpts -o gid=4,mode=620 none /dev/pts
mount -t tmpfs none /dev/shm

# Test to see if udev is built yet.  If so, run it.
if [ -f /sbin/usevstart ]; then
	/sbin/udevstart
fi 

# End devpop.sh
#################################################################


So, for the rest of chapter 6, anytime you reboot, you must run the 
following commands:

# export LFS=/mnt/lfs
# mkdir $LFS
# mount /dev/[xxx] $LFS
# $LFS/lfschroot.sh
# ./devpop.sh

(Replace [xxx] with the partition that you have created for your LFS 
installation.)

If you don't reboot, but only leave the build environment (with the 
exit command), you may re-enter the chroot environment by running the 
lfschroot and devpop scripts.  Note that you will receive some 
warnings, since the scripts try to mount filesystems that are 
allready mounted.  These are safe to ignore.  

So, you can now continue by installing the packages in chapter 6...

6.22
Now that readline is installed, you can make the delete key work if 
you want.  Just create the files specified in chapters 7.8 & 7.9.  
(You will have to exit and chroot again to have the changes take 
effect.)  

6.61
If you followed the instructions, and you have not exited the build 
enviromnent since Chapter 6.37 (Bash), you will be running the newly 
installed bash executable.  If so, exit the build environment and 
reenter it as usual:
# exit
# $LFS/lfschroot.sh

Now you will be running the version of bash from the live CD.  
Procede with stripping if desired.

6.62
If desired, remove the /tools directory.  If you do this, you must 
edit lfschroot.sh to remove the references to /tools from the chroot 
command.  And you can remove the +h bash option. Edit the chroot 
command to look like this:

# Chroot into the LFS system with a reduced environment for Chapter 7
chroot "$LFS" /usr/bin/env -i \
	HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
	PATH=/bin:/usr/bin:/sbin:/usr/sbin \
	/bin/bash --login


EPILOGUE:
So that's all there is to it.

[ This hint was tested using LFS Live CD version x86-6.1-2, the en-US-
ISO8859-1 locale, and the US keymap on a Dell sc420 (i686) platform.  
An ext3 boot partition was allready in existance created by Fedora 
Core 4, from which I had previously removed the extended attributes.  
LFS was installed on a 2GB ext2 partition. ] 


ACKNOWLEDGEMENTS:
  * Obviously, the creators and maintainers of LFS and the LFS Live 
CD.


CHANGELOG:
[2005-08-]
  * Initial hint.






More information about the livecd mailing list