diff --git a/scripts/Create-UMLRootfs b/scripts/Create-UMLRootfs new file mode 100644 index 000000000..3ed195dbd --- /dev/null +++ b/scripts/Create-UMLRootfs @@ -0,0 +1,142 @@ +#!/bin/bash + +# +# Commands in isofs.txt files: +# +# EVERY from to Put this on every disk +# DISK1 from to Put this on the 1st disk +# SINGLE from to Put it on any disk +# SPLIT from to You may split it up over many disks +# +# BOOT boot-options Add this mkisofs options for 1st disk +# +# If you want to add multiple 'BOOT' lines, use the tag-name 'BOOTx' for +# the 2nd and all further lines. +# +# SCRIPT script-name args Run given script for each image +# +# Intended for image post-processing. The first attached argument is the CD +# number and the second the image file. +# +cleanup () { + # Cleanup used for EXIT + umount $mountpoint + rmdir -p $mountpoint + losetup -d $loopdevice +} + +eval `grep rockver scripts/parse-config` + +if [ $# -eq 0 ] ; then + echo + echo "Usage: $0 [ -size MB ] [ -mkdebug ] [-prefix FS-Prefix] [-fs filesystem] Config" + echo + echo "E.g.: $0 -prefix my myconfig" + echo "this will leave you with a file 'my_linux' (the kernel) and a file" + echo "'my_rootfs' (the file system). Just start it with ./linux" + echo + exit 1 +fi + +src=0; mkdebug=0; fssize=0; full=0; +filesystem="reiserfs" + +while true ; do + case "$1" in + -size) + fssize=$2 ; shift ; shift ;; + -mkdebug) + mkdebug=1 ; shift ;; + -fs) + filesystem=$2; shift; shift ;; + -prefix) + ufsprefix=$2; shift; shift ;; + -full) + full=1; shift ;; + -* | '') + $0 ; exit 1 ;; + *) + cfg=$1 ; shift ; break ;; + esac +done + +if [ ! "x$ufsprefix" = "x" ]; then fsprefix=${ufsprefix}_; else fsprefix=""; fi +if [ -f ${fsprefix}rootfs -o -f ${fsprefix}linux ]; then + echo "Sorry, there exists a file with the same name, please make sure" + echo "that no ${fsprefix}linux and no ${fsprefix}rootfs exist here." + exit 1 +fi + +# get the build id +if [ ! -d config/$cfg ]; then + echo "I cannot find the selected Config '$cfg'!" + exit 1 +fi +buildid="`grep '^export ROCKCFG_ID=' config/$cfg/config | cut -f2 -d\'`" +if [ ! -d build/$buildid ]; then + echo "I cannot find the build for the Config '$cfg' (build/$buildid)" + exit 1; +fi + +# check if there is a kernel executable +if [ ! -f build/$buildid/boot/linux -o "x" = "x$(grep UMLPATCH=\'1\' config/$cfg/config)" ]; then + echo "I cannot find the executable kernel, " + echo "or it seems that the UML Patch was not applied to the kernel." + exit 1; +fi + +# calculate the default disk size as all packages of that config + 1/3 of the same +if [ $fssize = 0 ]; then + echo "Calculating optimal image size, may take some time ..." + cfssize=$(cd build/$buildid; du -sm --exclude ROCK | awk '{print $1;}';cd $OLDPWD) + echo "All packages consume $cfssize MB" + freespace=$(( $cfssize / 3 )) + fssize=$(( $cfssize + $freespace )) + echo "Therefore I propose a fs size of $fssize, that leaves you $freespace MB of free space." +fi + +# check if there is enough disk space +hereiskbfree=$(df -P $PWD | tail -n 1 | awk '{ print $4; }') +hereismbfree=$(( $hereiskbfree / 1024 )) +if [ $hereismbfree -lt $fssize ]; then + echo "Sorry, you have only $hereismbfree MB free here, " + echo "that is not enough for a rootfs of $fssize MB." + exit 1 +fi + +# create the empty rootfs file +dd if=/dev/zero of=${fsprefix}rootfs seek=${fssize} count=1 bs=1M + +trap 'cleanup' EXIT + +# find a free loop device +for i in `ls /dev/loop/*`; do + echo $i + losetup $i ${fsprefix}rootfs + if [ $? = 0 ]; then + loopdevice=$i + break + fi +done + +# make a filesystem +yes | mkfs -t $filesystem $loopdevice + +# loop-mount the file +mountpoint=${fsprefix}rootfs_mnt +mkdir -p $mountpoint +mount -t $filesystem $loopdevice $mountpoint + +# install all +echo "Installing files, may take some time..." +if [ $full = 1 ]; then + for i in build/$buildid/*; do + if [ $i = "build/$buildid/ROCK" ]; then continue; fi + cp -rp $i $mountpoint + done +fi + + +# Copy the executable kernel +cp $mountpoint/boot/linux ${fsprefix}linux +