# Settings !!!*** PLEASE MODIFY THESE ***!!! export MIRROR="http://download.fedora.redhat.com/pub/fedora/linux/core/5/x86_64/os/Fedora/RPMS/" export TMPDIR=`pwd`"/tmp" export ROOT_FS=`pwd`"/FedoraCore5-AMD64-root_fs" export RPM_DIR=`pwd`"/RPMS" export CHROOTCMD="chroot" export RPMCMD="rpm" function fetch() { local=$RPM_DIR"/$1.rpm" if [ ! -e "$local" ]; then echo "Downloading $1" wget -c -O $local "$MIRROR$1.rpm" fi } function rpminstall() { fetch $1 stripped=`echo $1 | sed 's+\.noarch++g' | sed 's+\.x86_64++g'` exists=`$RPMCMD -qa --root $TMPDIR | grep $stripped | wc -l` if [ "$exists" -ne "0" ]; then echo "skipped: $stripped" else $RPMCMD -ivh --root $TMPDIR $local fi } function rpminstallgroup() { echo "SIZE="$# list="" while [ $# -ne 0 ] do package=$1 fetch $package stripped=`echo $1 | sed 's+\.noarch++g' | sed 's+\.x86_64++g'` exists=`$RPMCMD -qa --root $TMPDIR | grep $stripped | wc -l` if [ "$exists" -ne "0" ]; then echo "skipped: $stripped" else list="$list $local" fi shift done echo "installing list=$list" $RPMCMD -ivh --root $TMPDIR $list } # Making the filesystem if [ ! -e "$ROOT_FS" ]; then dd if=/dev/zero of=$ROOT_FS bs=1024 count=1 seek=1572864 mkfs.ext3 $ROOT_FS else echo "Filesystem already created" fi if [ ! -e "$TMPDIR" ]; then mkdir $TMPDIR mount -o loop $ROOT_FS $TMPDIR else echo "Filesystem already mounted" fi mkdir -p $RPM_DIR if [ ! -e "$TMPDIR/var/lib/rpm" ]; then $RPMCMD --initdb --root $TMPDIR fi if [ ! -e "$TMPDIR/dev" ]; then mkdir $TMPDIR/dev mknod $TMPDIR/dev/null c 1 3 fi # pretend to have a kernel (we don't need one): fetch kernel-2.6.15-1.2054_FC5.x86_64 $RPMCMD -Uvh --justdb --force --nodeps --root $TMPDIR $local mkdir -p $TMPDIR/etc # copy the fstab (root=/dev/ubda) cp fstab $TMPDIR/etc/ # Installing the packages # no deps for these packages="setup-2.5.49-1.noarch filesystem-2.3.7-1.2.1.x86_64 basesystem-8.0-5.1.noarch libgcc-4.1.0-3.x86_64 tzdata-2006b-1.noarch glibc-common-2.4-4.x86_64 glibc-2.4-4.x86_64 termcap-5.4-7.1.noarch libtermcap-2.0.8-45.x86_64 zlib-1.2.3-1.2.1.x86_64 zip-2.31-1.2.1.x86_64 man-pages-2.21-1.noarch mktemp-1.5-23.2.1.x86_64 bash-3.1-6.2.x86_64 ncurses-5.5-19.x86_64 info-4.8-9.2.x86_64 gawk-3.1.5-6.2.x86_64 vim-common-6.4.007-4.x86_64 libattr-2.4.28-1.2.x86_64 libacl-2.2.34-1.2.x86_64 libsepol-1.11.18-2.x86_64 libstdc++-4.1.0-3.x86_64 pcre-6.3-1.2.1.x86_64 grep-2.5.1-52.2.x86_64 cracklib-dicts-2.8.6-1.2.1.x86_64 glib2-2.10.1-1.x86_64 fedora-release-5-5.noarch chkconfig-1.3.29-1.x86_64 sed-4.1.5-1.2.x86_64 iputils-20020927-35.x86_64 rootfiles-8.1-1.1.noarch ethtool-3-1.2.1.x86_64 audit-libs-1.1.5-1.x86_64 popt-1.10.2-15.2.x86_64 sysfsutils-1.3.0-1.2.1.x86_64 cpio-2.6-11.2.1.x86_64 less-394-3.x86_64 gzip-1.3.5-6.2.1.x86_64 readline-5.0-3.2.1.x86_64 tar-1.15.1-12.2.x86_64 db4-4.3.29-2.x86_64 iproute-2.6.15-1.2.x86_64 mingetty-1.07-5.2.1.x86_64 " for package in $packages; do rpminstall $package done rpminstallgroup libsepol-1.11.18-2.x86_64 libselinux-1.29.7-1.2.x86_64 libsetrans-0.1.18-1.2.x86_64 packages="vim-minimal-6.4.007-4.x86_64 findutils-4.2.27-4.x86_64 device-mapper-1.02.02-3.2.x86_64 e2fsprogs-libs-1.38-12.x86_64 e2fsprogs-1.38-12.x86_64 net-tools-1.60-62.1.x86_64 shadow-utils-4.0.14-1.2.x86_64 lvm2-2.02.01-1.2.1.x86_64 MAKEDEV-3.21-3.x86_64 psmisc-21.8-1.2.1.x86_64 bzip2-libs-1.0.3-2.2.1.x86_64 libxml-1.8.17-13.2.1.x86_64 libxml2-2.6.23-1.2.x86_64 beecrypt-4.1.2-9.2.1.x86_64 expat-1.95.8-8.2.x86_64 sqlite-3.3.3-1.2.x86_64 tcp_wrappers-7.6-40.2.x86_64 gdbm-1.8.0-26.2.x86_64" for package in $packages; do rpminstall $package done rpminstallgroup coreutils-5.93-7.2.x86_64 cracklib-2.8.6-1.2.1.x86_64 pam-0.99.3.0-2.x86_64 python-2.4.2-3.2.1.x86_64 openssl-0.9.8a-5.2.x86_64 libgssapi-0.7-2.1.x86_64 krb5-libs-1.4.3-4.1.x86_64 packages="SysVinit-2.86-2.2.2.x86_64 module-init-tools-3.2-0.pre9.2.2.1.x86_64 hwdata-0.177-1.noarch sysklogd-1.4.1-36.x86_64 udev-084-13.x86_64 procps-3.2.6-3.2.x86_64 diffutils-2.8.1-15.2.1.x86_64 libcap-1.10-24.2.x86_64" for package in $packages; do rpminstall $package done rpminstallgroup initscripts-8.31.1-1.x86_64 glibc-kernheaders-3.0-5.2.x86_64 audit-libs-python-1.1.5-1.x86_64 util-linux-2.13-0.20.x86_64 policycoreutils-1.29.26-6.x86_64 libselinux-python-1.29.7-1.2.x86_64 libsemanage-1.5.28-1.x86_64 mkinitrd-5.0.32-1.x86_64 dmraid-1.0.0.rc9-FC5_5.2.x86_64 packages="libselinux-python-1.29.7-1.2.x86_64 libsemanage-1.5.28-1.x86_64 initscripts-8.31.1-1.x86_64 db4-4.3.29-2.x86_64 libxml2-python-2.6.23-1.2.x86_64" for package in $packages; do rpminstall $package done # some extras packages="which-2.16-6.2.1.x86_64 vixie-cron-4.1-54.FC5.x86_64 bzip2-libs-1.0.3-2.2.1.x86_64 krb5-libs-1.4.3-4.1.x86_64 python-urlgrabber-2.9.8-2.noarch neon-0.25.5-1.2.x86_64 elfutils-libelf-0.119-1.2.1.x86_64 elfutils-libs-0.119-1.2.1.x86_64 elfutils-0.119-1.2.1.x86_64 sqlite-3.3.3-1.2.x86_64 rpm-libs-4.4.2-15.2.x86_64 rpm-4.4.2-15.2.x86_64 openssh-4.3p2-4.x86_64 openssh-clients-4.3p2-4.x86_64 openssh-server-4.3p2-4.x86_64 wget-1.10.2-3.2.1.x86_64 python-elementtree-1.2.6-4.2.x86_64 python-sqlite-1.1.7-1.2.x86_64 elfutils-0.119-1.2.1.x86_64 rpm-python-4.4.2-15.2.x86_64 python-elementtree-1.2.6-4.2.1.x86_64" for package in $packages; do rpminstall $package done # rpm gets confused by these: rm -f $TMPDIR/var/lib/rpm/__db* # yum needs to be installed by the real rpm... fetch yum-2.6.0-1.noarch cp $local $TMPDIR/root $CHROOTCMD $TMPDIR rpm -ivh /root/yum-2.6.0-1.noarch.rpm rm $TMPDIR/root/yum-2.6.0-1.noarch.rpm # ldconfig the newly installed libraries ldconfig -r $TMPDIR # create the ubd devices if [ ! -e "$TMPDIR/dev/ubda" ]; then if [ -e "$TMPDIR/dev" ]; then for ((i=0; i<8; i++)) do let=$(echo $i|tr '0-7' 'a-z') mknod $TMPDIR/dev/ubd$let b 98 $[16 * $i] for ((p=1; p<=16; p++)) do mknod $TMPDIR/dev/ubd$let$p b 98 $[16 * $i + $p] done done else echo "/dev not found!" exit 1 fi fi # basic devices so we can boot without an initrd: cp -avpr /dev/console /dev/null /dev/zero $TMPDIR/dev mkdir $TMPDIR/dev/pts # copy current resolv cp /etc/resolv.conf $TMPDIR/etc # use yum to update the system mount -t proc none $TMPDIR/proc echo "/dev/ROOT / ext3 rw 0 0" > $TMPDIR/etc/mtab $CHROOTCMD tmp yum update umount $TMPDIR/proc # tweak the inittab to only use tty0 and add it to securetty tweaked=`grep tty0 $TMPDIR/etc/inittab | wc -l` if [ "$tweaked" -eq "0" ]; then cp $TMPDIR/etc/inittab $TMPDIR/etc/inittab.save grep -v "mingetty" $TMPDIR/etc/inittab.save > $TMPDIR/etc/inittab echo "# We launch just one console for UML:" >> $TMPDIR/etc/inittab echo "c0:1235:respawn:/sbin/mingetty tty0" >> $TMPDIR/etc/inittab echo "# UML modification: use tty0" >> $TMPDIR/etc/securetty echo "tty0" >> $TMPDIR/etc/securetty fi # We need an /etc/hosts file! echo "127.0.0.1 localhost localhost.localdomain" > $TMPDIR/etc/hosts # make the first network interface start with dhcp #cp $TMPDIR/etc/rc.d/rc.inet1.conf $TMPDIR/etc/rc.d/rc.inet1.conf.save chroot $TMPDIR yum install dhclient cp ifcfg-eth0 $TMPDIR/etc/sysconfig/networking/devices/ifcfg-eth0 cp ifcfg-eth0 $TMPDIR/etc/sysconfig/networking/profiles/default/ifcfg-eth0 cp ifcfg-eth0 $TMPDIR/etc/sysconfig/network-scripts/ifcfg-eth0 echo "NETWORKING=yes" > $TMPDIR/etc/sysconfig/network echo "HOSTNAME=localhost.localdomain" >> $TMPDIR/etc/sysconfig/network # clear rest of image dd if=/dev/zero of=$TMPDIR/blank >& /dev/null sync rm $TMPDIR/blank umount $TMPDIR rmdir $TMPDIR echo "Done!"