<>

Appendix B. All commands

You can simply copy commands listed below to your terminal to one-step get the bootcd. All commands listed below were generated from this book.

sleep 5
#_____________________________________________________________________________
# $WORK
export WORK=/mnt/bootcd
mkdir -pv $WORK/tmpfs
sleep 5 #_____________________________________________________________________________ # create mkbootcd
cat > $WORK/mkbootcd << 'EOF' && chmod +x $WORK/mkbootcd
#!/bin/sh

cd $WORK/tmpfs
find . | cpio -H newc -o | gzip > $WORK/iso/boot/initramfs.igz

#create bootcd.iso
cd $WORK
mkisofs                        \
  -R                           \
  -b boot/grub/stage2_eltorito \
  -no-emul-boot                \
  -boot-load-size 4            \
  -boot-info-table             \
  -o $WORK/bootcd.iso          \
  $WORK/iso

#upload bootcd.iso
#ftp ftpserver

EOF
sleep 5 #_____________________________________________________________________________ # create gld.pl
cat > $WORK/gld.pl << 'EOF' && chmod +x $WORK/gld.pl
#!/usr/bin/perl 
#===============================================================================
#
#  DESCRIPTION:  Get library
#
#       AUTHOR:  DawnFantasy, <goldenshore999 # gmail # com>
#      VERSION:  1.1
#         DATE:  2008-02-04
#
#===============================================================================

use strict;
use warnings;

use Getopt::Long;

my %opts;
$opts{target} = 'tmpfs';
usage(), exit -1
    if ( not GetOptions( \%opts, 'import=s', 'verbose', 'target|t=s' )
);
usage(), exit -1
    if ( ( not @ARGV ) xor ( defined $opts{import} ) );

sub usage {
    print <<EOU;
Usage:
    $0 file1 [file2...fileX]  [-t DIR]  [-v]
    or 
    $0 -i list  [-t DIR]  [-v]

Options:
    -i, --import=FILE       Process files listed in FILE
    -t, --target=DIR        Use DIR as root. (Default ./initrd)
    -v, --verbose           Be verbose.
EOU
    return;
}


## files to process
my @files;
{
    my @filess;
    {
        ## files in @ARGV
        if ( not defined $opts{import} ) {
            push @filess, @ARGV;
            last;
        }

        ## import list
        open my $fh, '<', $opts{import}
            or die "$!\n";
        @filess = (<$fh>);
        @filess = map { chomp; $_ } @filess;
        close $fh;
    }
    print "File to process: (! means file NOT found.)\n";
    foreach (@filess) {
        print " !  $_ \n" and next if not -f $_;
        push @files, $_;
        print "    $_\n";
    }
}

## parse libs to copy
my @libs;
{
    print "\n";
    foreach (@files) {
        my $ldd = qx{/usr/bin/ldd $_};
        chomp $ldd;
        print "$ldd\n\n" if defined $opts{verbose};

        my @files = split /\s+/, $ldd;
        push @libs, grep { -f $_ } @files;    ## check for existence
    }

    ## Unified them
    my %h = map { ( $_, 1 ) } @libs;
    @libs = sort keys %h;
    if ( defined $opts{verbose} ) {
        print "Libraries to copy:\n";
        print "    $_  => $opts{target}$_\n" foreach @libs;
    }
}

## Do the real work
print "\n";
{
    print "Copying files, please wait...\n";

    ## Add those files in the original list
    push @libs, @files;

    if ( not -d $opts{target} ) {
        print "Creating directory $opts{target}\n";
        system qq{ mkdir -p $opts{target} };
    }

    my $v = $opts{verbose} ? 'v' : '';
    foreach (@libs) {
        if (/^\//) {
            ## Absolute path
            s/^\///;
            system
                qq{ tar -C / -hpmcf - $_ | tar -C $opts{target} -pmx$v -f - };
        } else {
            ## Opposite path
            system
                qq{ tar      -hpmcf - $_ | tar -C $opts{target} -pmx$v -f - };
        }
    }
}



EOF
sleep 5 #_____________________________________________________________________________ # install grub, create menu.lst, install kernel
cd $WORK

#install grub
mkdir iso/boot/grub -p
cp /usr/lib/grub/i386-pc/stage2_eltorito iso/boot/grub

#create menu.lst
cat > iso/boot/grub/menu.lst << EOF
default 0
timeout 5
color green/black light-green/black
title grub bootcd
  root(cd)
  kernel /boot/kernel
  initrd /boot/initramfs.igz
EOF

#install kernel
cp /boot/lfskernel-* iso/boot/kernel
sleep 5 #_____________________________________________________________________________ # copy some commands and their libs
cat > $WORK/lddfiles.dat << EOF
/bin/bash
/bin/bzip2
/bin/cat
/bin/cp
/bin/echo
/bin/grep
/bin/ls
/bin/mkdir
/bin/mount
/bin/mountpoint
/bin/ps
/bin/rm
/bin/stty
/bin/tar
/bin/umount
/sbin/agetty
/sbin/fdisk
/sbin/init
/sbin/mkfs
/sbin/mkfs.ext2
/sbin/mkfs.ext3
/sbin/mkfs.ext4
/sbin/mkswap
/sbin/swapon
/sbin/udevadm
/sbin/udevd
/usr/bin/less
/usr/bin/vi
/usr/sbin/chroot
EOF
cd $WORK
./gld.pl -i lddfiles.dat
ln -s bash tmpfs/bin/sh
sleep 5 #_____________________________________________________________________________ # create /init
cd $WORK/tmpfs
ln -s sbin/init
sleep 5 #_____________________________________________________________________________ # create /inittab
mkdir $WORK/tmpfs/etc
cat > $WORK/tmpfs/etc/inittab << EOF
# Begin /etc/inittab

id:3:initdefault:

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

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

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

# End /etc/inittab
EOF
sleep 5 #_____________________________________________________________________________ # create /bin/login
cat > $WORK/tmpfs/bin/login << EOF && chmod +x $WORK/tmpfs/bin/login
#!/bin/sh
echo "Press Enter to activate this console..."
read ENTER
exec /bin/bash --login
EOF
sleep 5 #_____________________________________________________________________________ # create /etc/profile
cat > $WORK/tmpfs/etc/profile << 'EOF'
# Begin /etc/profile
NORMAL="\[\e[0m\]"
RED="\[\e[1;31m\]"
GREEN="\[\e[1;32m\]"

export PATH=/bin:/usr/bin:/sbin:/usr/sbin
export TERM=xterm
export HISTSIZE=20
export PS1="$RED[ $NORMAL\w $RED]$GREEN\$?$RED# $NORMAL"

alias ls="ls --color"
alias ll="ls -lh"
alias la="ll -a"

cd ~
# End /etc/profile
EOF
sleep 5 #_____________________________________________________________________________ # create rc process
cp /etc/udev $WORK/tmpfs/etc/ -a
mkdir -p $WORK/tmpfs/etc/rc.d/init.d
cp -a /etc/rc.d/init.d/{functions,mountfs,mountkernfs,rc,udev,udev_retry} \
      $WORK/tmpfs/etc/rc.d/init.d/
mkdir -p $WORK/tmpfs/etc/rc.d/rcsysinit.d
cp -a /etc/rc.d/rcsysinit.d/{S00mountkernfs,S10udev,S40mountfs,S50udev_retry} \
      $WORK/tmpfs/etc/rc.d/rcsysinit.d/
mkdir -p $WORK/tmpfs/etc/sysconfig
cp -a /etc/sysconfig/rc $WORK/tmpfs/etc/sysconfig/rc
sleep 5 #_____________________________________________________________________________ # create mount dirs
mkdir -pv $WORK/tmpfs/{proc,sys,media/cdrom}
sleep 5 #_____________________________________________________________________________ # create /etc/fstab
cat > $WORK/tmpfs/etc/fstab << EOF
/dev/root   /             ext2     defaults        0     0
/dev/cdrom  /media/cdrom  iso9660  defaults        0     0
proc        /proc         proc     defaults        0     0
sysfs       /sys          sysfs    defaults        0     0
devpts      /dev/pts      devpts   defaults        0     0
EOF
sleep 5 #_____________________________________________________________________________ # udev related files
mkdir -p $WORK/tmpfs/lib/udev
cp -a /lib/udev/devices $WORK/tmpfs/lib/udev/
sleep 5 #_____________________________________________________________________________ # aute cdrom link
mkdir -p $WORK/tmpfs/etc/udev/rules.d
cat > $WORK/tmpfs/etc/udev/rules.d/75-cd-aliases-generator.rules << EOF
SYSFS{device/media}=="cdrom", SYMLINK+="cdrom"
EOF
sleep 5 #_____________________________________________________________________________ # terminfo
mkdir -p $WORK/tmpfs/usr/share
cp -a /usr/share/terminfo $WORK/tmpfs/usr/share/
sleep 5 #_____________________________________________________________________________ # finalize the bootcd
cat > $WORK/tmpfs/etc/version << EOF
Build Bootable CD from Scratch
Based on LFS-6.5
EOF

cd $WORK
./mkbootcd