#!/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 DEVFDDISK=/dev/fd0 [ -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 rootdisk ### einfo "Creating rootdisk" dd if=/dev/zero of=${DEVRAMDISK} bs=1k count=4096 >& /dev/null mke2fs -m 0 -N 500 ${DEVRAMDISK} >& /dev/null mount -t ext2 ${DEVRAMDISK} ${RAMDISK} rm -rf ${RAMDISK}/lost+found cp -dprf ${FDROOT}/* ${RAMDISK}/ umount ${RAMDISK} ROOTDISK_BLOCKS=`du -k -s ${FDROOT} | cut -f1` dd of=${BUILDROOT}/initrd.raw if=${DEVRAMDISK} bs=1k >& /dev/null ( dd if=${DEVRAMDISK} bs=1k count=${ROOTDISK_BLOCKS}|bzip2 -9>${BUILDROOT}/initrd.bz2 ) >& /dev/null ( dd if=${DEVRAMDISK} bs=1k count=${ROOTDISK_BLOCKS}|gzip -v9>${BUILDROOT}/initrd.gz ) >& /dev/null ROOTDISK_BLOCKS="`ls -s ${BUILDROOT}/initrd.gz | awk '{print $1}'`" ### do up the bootdisk ### einfo "Creating bootdisk" BOOTDISK_BLOCKS="$(expr `ls -s ${CACHE}/bzImage | awk '{print $1}'` + 70)" dd if=/dev/zero of=${DEVFDDISK} bs=1k count=${BOOTDISK_BLOCKS} mke2fs -N 24 -m 0 ${DEVFDDISK} ${BOOTDISK_BLOCKS} mount -o dev ${DEVFDDISK} ${RAMDISK} rm -rf ${RAMDISK}/lost+found/ mkdir ${RAMDISK}/{boot,dev} cp -RL /dev/{null,fd0} ${RAMDISK}/dev/ cp /boot/boot.b ${RAMDISK}/boot/ echo "boot =/dev/fd0 install =/boot/boot.b map =/boot/map read-write backup =/dev/null image =vmlinuz label =Gentoo root =/dev/fd0" > ${RAMDISK}/boot/lilo.conf cp ${CACHE}/bzImage ${RAMDISK}/vmlinuz lilo -v -C boot/lilo.conf -r ${RAMDISK} INITRD_OFFSET="$(expr ${BOOTDISK_BLOCKS} + 1)" rdev -r ${RAMDISK}/vmlinuz `expr ${INITRD_OFFSET} + 16384` umount ${RAMDISK} dd if=${DEVFDDISK} of=${BUILDROOT}/rootdisk.raw bs=1k count=${BOOTDISK_BLOCKS} ### make the image ### einfo "Combining boot with root" dd if=/dev/zero of=${DEVRAMDISK} bs=1k count=4096 dd if=${BUILDROOT}/rootdisk.raw of=${DEVRAMDISK} bs=1k count=${BOOTDISK_BLOCKS} DISKSIZE="`expr ${BOOTDISK_BLOCKS} + ${ROOTDISK_BLOCKS}`" dd if=${BUILDROOT}/initrd.gz of=${DEVRAMDISK} bs=1k seek=${INITRD_OFFSET} dd if=${DEVRAMDISK} of=${BUILDROOT}/floppy.raw bs=1k #dd if=${DEVRAMDISK} of=${BUILDROOT}/floppy.raw bs=1k count=${DISKSIZE} einfo "All done :D !"