<imghch AT gmail DOT com>
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 #_____________________________________________________________________________ # $WORKexport WORK=/mnt/bootcd mkdir -pv $WORK/tmpfssleep 5 #_____________________________________________________________________________ # create mkbootcdcat > $WORK/mkbootcd << 'EOF' && chmod +x $WORK/mkbootcd #!/bin/sh cd $WORK umount tmpfs #compress initrd.img to iso/boot/initrd.img gzip -9 -c initrd.img > iso/boot/initrd.img #create bootcd.iso 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 EOFsleep 5 #_____________________________________________________________________________ # create gld.plcat > $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 - }; } } } EOFsleep 5 #_____________________________________________________________________________ # install grub, create menu.lst, install kernelcd $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 10 color green/black light-green/black title grub bootcd root(cd) kernel /boot/kernel root=/dev/ram0 rw initrd /boot/initrd.img EOF #install kernel cp /boot/lfskernel-* iso/boot/kernelsleep 5 #_____________________________________________________________________________ # create /initcd $WORK #create initrd.img, size is 8M dd if=/dev/zero of=initrd.img bs=1024k count=8 mke2fs -F -m0 initrd.img mount -o loop initrd.img tmpfs mkdir tmpfs/dev mknod tmpfs/dev/console c 5 1sleep 5 #_____________________________________________________________________________ # copy some commands and their libscat > $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/shsleep 5 #_____________________________________________________________________________ # create /inittabmkdir $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 EOFsleep 5 #_____________________________________________________________________________ # create /bin/logincat > $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 EOFsleep 5 #_____________________________________________________________________________ # create /etc/profilecat > $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 EOFsleep 5 #_____________________________________________________________________________ # create rc processcp /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/rcsleep 5 #_____________________________________________________________________________ # create mount dirsmkdir -pv $WORK/tmpfs/{proc,sys,media/cdrom}sleep 5 #_____________________________________________________________________________ # create /etc/fstabcat > $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 EOFsleep 5 #_____________________________________________________________________________ # udev related filesmkdir -p $WORK/tmpfs/lib/udev cp -a /lib/udev/devices $WORK/tmpfs/lib/udev/sleep 5 #_____________________________________________________________________________ # aute cdrom linkmkdir -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" EOFsleep 5 #_____________________________________________________________________________ # terminfomkdir -p $WORK/tmpfs/usr/share cp -a /usr/share/terminfo $WORK/tmpfs/usr/share/sleep 5 #_____________________________________________________________________________ # finalize the bootcdcat > $WORK/tmpfs/etc/version << EOF Build Bootable CD from Scratch Based on LFS-6.5 EOF cd $WORK ./mkbootcd