#!/bin/bash # Copyright 1999-2002 Gentoo Technologies, Inc. # Distributed under the terms of the GNU General Public License v2 # $Header: $ ### version control ### BUSYBOX_VER_REAL=0.60.5 BUSYBOX_VER_PORTAGE=${BUSYBOX_VER_REAL} TINYLOGIN_VER_REAL=1.2 TINYLOGIN_VER_PORTAGE=${TINYLOGIN_VER_REAL} UCLIBC_VER=0.9.16 export FEATURES="noauto" export USE="-static" ### grab helper funcs/vars from Gentoo ### . /sbin/functions.sh die() { eerror "!!! $@ !!!" exit 1 } PORTAGE_TMPDIR="`python -c 'import portage; print portage.settings["PORTAGE_TMPDIR"];'`" PORTDIR="`python -c 'import portage; print portage.settings["PORTDIR"];'`" ### check pre-requesites ### if [ ! -x /usr/bin/syslinux ] || [ ! -x /usr/i386-linux-uclibc ] ; then eerror "You *must* have all these pkgs installed:" eerror "emerge uclibc syslinux" die "couldnt find all pre-requesites" fi ### parse cmdline ### if [ -z "$1" ] ; then BUILDROOT="${PORTAGE_TMPDIR}/floppies/`hostname`-$(date '+%d.%m.%Y-%H.%M.%S')" ewarn "No BUILDROOT specified, using ${BUILDROOT}" else BUILDROOT="$1" fi ### setup buildroot ### mkdir -p ${BUILDROOT} FDROOT=${BUILDROOT}/fdroot if [ -e ${FDROOT} ] && [ "`find ${FDROOT} | wc -l`" != 1 ] ; then ewarn "Everything in ${FDROOT} will be nuked ..." printf " Continue !? [Y/n] " # read cont cont=Y ; echo $cont [ "${cont}" != "Y" ] && die "buh bye" fi rm -rf ${FDROOT} echo TMP=${BUILDROOT}/tmp rm -rf ${TMP} mkdir ${TMP} CACHE=${BUILDROOT}/cache mkdir ${CACHE} >& /dev/null DEVRAMDISK=/dev/ram8 [ -n "`mount | grep ${DEVRAMDISK}`" ] && { umount ${DEVRAMDISK} || exit 1 ; } RAMDISK=${BUILDROOT}/ramdisk rm -rf ${RAMDISK} mkdir ${RAMDISK} ### build base fs in fdroot ### einfo "Building floppy in ${FDROOT}" mkdir ${FDROOT} && cd ${FDROOT} || die "could not enter FDROOT ${FDROOT}" mkdir -p bin tmp dev lib mnt/gentoo proc var boot etc || die "could not make base fs" ln -s bin sbin ### install uclibc ### einfo "Grabbing uclibc" mkdir ${FDROOT}/usr/i386-linux-uclibc -p cd ${FDROOT}/usr/i386-linux-uclibc ln -s ../../lib lib cd ${FDROOT}/lib cp /usr/i386-linux-uclibc/lib/{ld-uClibc,libuClibc,libcrypt}-*.so . ln -s libuClibc-${UCLIBC_VER}.so libc.so ln -s libuClibc-${UCLIBC_VER}.so libc.so.0 ln -s ld-uClibc-${UCLIBC_VER}.so ld-uClibc.so.0 ### install busybox app ### if [ ! -x ${CACHE}/busybox ] ; then einfo "Building busybox with uclibc" EBUILD=${PORTDIR}/sys-apps/busybox/busybox-${BUSYBOX_VER_PORTAGE}.ebuild BUILDDIR=${PORTAGE_TMPDIR}/portage/busybox-${BUSYBOX_VER_PORTAGE}/work/busybox-${BUSYBOX_VER_REAL} ebuild ${EBUILD} clean unpack >& ${TMP}/busybox || die "could not unpack busybox, check ${TMP}/busybox" cd ${BUILDDIR} sed -i '/CC=.*uclibc/s:#::' Makefile ebuild ${EBUILD} compile >& ${TMP}/busybox mv busybox ${CACHE}/ || die "could not move busybox, check ${TMP}/busybox" rm -rf ${PORTAGE_TMPDIR}/portage/busybox-${BUSYBOX_VER_PORTAGE} fi einfo "Grabbing busybox and making links" cd ${FDROOT}/bin cp ${CACHE}/busybox . || die "could not grab busybox" busybox >& ${TMP}/busybox for ln in `cat ${TMP}/busybox | cut -d$'\n' -f12- | sed -e 's:,::g' -e 's:busybox::'` ; do ln busybox ${ln} done ### install tinylogin app ### if [ ! -x ${CACHE}/tinylogin ] ; then einfo "Building tinylogin with uclibc" EBUILD=${PORTDIR}/sys-apps/tinylogin/tinylogin-${TINYLOGIN_VER_PORTAGE}.ebuild BUILDDIR=${PORTAGE_TMPDIR}/portage/tinylogin-${TINYLOGIN_VER_PORTAGE}/work/tinylogin-${TINYLOGIN_VER_REAL} ebuild ${EBUILD} clean unpack >& ${TMP}/tinylogin || die "could not unpack tinylogin, check ${TMP}/tinylogin" cd ${BUILDDIR} sed -i -e '/CC =.*uclibc/s:#::' -e 's:uclibc/usr/bin:uclibc/bin:' Makefile ebuild ${EBUILD} compile >& ${TMP}/tinylogin mv tinylogin ${CACHE}/ || die "could not move tinylogin, check ${TMP}/tinylogin" rm -rf ${PORTAGE_TMPDIR}/portage/tinylogin-${TINYLOGIN_VER_PORTAGE} fi einfo "Grabbing tinylogin and making links" cd ${FDROOT}/bin cp `which tinylogin` . tinylogin >& ${TMP}/tinylogin for ln in `cat ${TMP}/tinylogin | cut -d$'\n' -f13- | sed -e 's:,::g' -e 's:tinylogin::'` ; do ln tinylogin ${ln} done ### create /dev ### # NOT NEEDED CAUSE WE USE DEVFS :D #einfo "Creating /dev nodes" #cd ${FDROOT}/dev #cp -dpR /dev/fd[01]* . #cp -dpR /dev/tty[0-6] . #MAKEDEV generic-i386 ### setup /etc ### einfo "Creating /etc files" cd ${FDROOT}/etc mkdir init.d echo "root:x:0:0::/root:/bin/sh" > passwd echo "root:$1$SJRAN9z0$UMDsDx9/8MZOoSXsJROo6.:11986:0:::::" > shadow echo "root::0:root" > group echo "#!/bin/sh$'\n'/bin/mount -av$'\n'/bin/hostname gentoo-floppy" > init.d/rc chmod a+x init.d/rc echo "/dev/ram0 / ext2 defaults /dev/fd0 / ext2 defaults /proc /proc proc defaults" > fstab echo "id:2:initdefault: si::sysinit:/etc/init.d/rc 1:2345:respawn:/sbin/getty 9600 tty1 2:23:respawn:/sbin/getty 9600 tty2" > inittab cp /etc/termcap . ### do up the disk ### einfo "Making image" dd if=${CACHE}/msdosdisk of=${DEVRAMDISK} bs=1k >& /dev/null mount -t msdos ${DEVRAMDISK} ${RAMDISK} cp ${CACHE}/bzImage ${FDROOT}/LINUX cp -dprf ${FDROOT}/* ${RAMDISK}/ cd ${BUILDROOT} umount ${RAMDISK} BLKCNT=`du -k -s ${FDROOT} | cut -f1` dd of=${BUILDROOT}/floppy.raw if=${DEVRAMDISK} bs=1k >& /dev/null ( dd if=${DEVRAMDISK} bs=1k count=${BLKCNT}|bzip2 -9>${BUILDROOT}/floppy.raw.bz2 ) >& /dev/null ( dd if=${DEVRAMDISK} bs=1k count=${BLKCNT}|gzip -v9>${BUILDROOT}/floppy.raw.gz ) >& /dev/null einfo "All done :D !"