From 2f231a3c9bf7f92e6031f72a11a4b36d10c1c44b Mon Sep 17 00:00:00 2001 From: Silvan Calarco Date: Tue, 24 Sep 2013 13:15:21 +0200 Subject: [PATCH] rootfsinstall: added many new options to customize rootfs target --- src/rootfsinstall.sh | 167 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 141 insertions(+), 26 deletions(-) diff --git a/src/rootfsinstall.sh b/src/rootfsinstall.sh index 688e19b..9b1f59e 100755 --- a/src/rootfsinstall.sh +++ b/src/rootfsinstall.sh @@ -6,12 +6,17 @@ SYSTEMFSTYPE=ext4 function usage() { - echo "Usage: $0 device rootfs-archive [-y] [-rpi] [-fs fstype]" + echo "Usage: $0 device rootfs-archive [-y] [-rpi] [-fs fstype] [-a archive] [-c command] [-k kernel] [-p password]" echo echo "Options:" - echo "-fs filesystem type for system partition (default: ext4)" - echo "-rpi make a RaspberryPi SD with boot partition" - echo "-y assume yes to all questions (script mode)" + echo "-a archive : additional archive to unpack in rootfs root" + echo "-c command : command to run through chroot in rootfs" + echo "-fs fstype : filesystem type for system partition (default: ext4)" + echo "-h hostname : set given hostname" + echo "-k kernel : extract/use kernel file from ROOTFS/boot/ for boot" + echo "-p password : set given password for root user" + echo "-rpi : make a RaspberryPi SD with boot partition" + echo "-y : assume yes to all questions (script mode)" echo echo "Example: $0 /dev/sdb /tmp/openmamba-rootfs-light.arm.tar.xz" exit 1 @@ -26,20 +31,59 @@ while [ "$1" ]; do case $1 in -y) ASSUMEYES=1 ;; -rpi) RPIMODE=1 ;; - -fs) [ $2 ] || { + -fs) [ "$2" ] || { echo "Error: -fs option requires an argument; aborting." exit 1 } SYSTEMFSTYPE=$2 shift ;; + -a) [ "$2" ] || { + echo "Error: -a option requires an archive as argument; aborting." + exit 1 + } + ADDITIONALARCHIVE=`realpath $2` + [ -r "$ADDITIONALARCHIVE" ] || { + echo "Error: file $ADDITIONALARCHIVE not found; aborting." + exit 1 + } + shift + ;; + -c) [ "$2" ] || { + echo "Error: -c option requires a command string as argument; aborting." + exit 1 + } + CHROOTCOMMAND=$2 + shift + ;; + -k) [ "$2" ] || { + echo "Error: -k option requires a kernel file name as argument; aborting." + exit 1 + } + USEKERNEL=$2 + shift + ;; + -h) [ "$2" ] || { + echo "Error: -h option requires a hostname as argument; aborting." + exit 1 + } + SETHOSTNAME=$2 + shift + ;; + -p) [ "$2" ] || { + echo "Error: -p option requires a password as argument; aborting." + exit 1 + } + ROOTPASSWORD=$2 + shift + ;; -*) echo "Error: invalid option $1; aborting." exit 1 ;; *) if [ ! "$DRIVE" ]; then DRIVE=$1 elif [ ! "$ROOTFSARCHIVE" ]; then - ROOTFSARCHIVE=$1 + ROOTFSARCHIVE=`realpath $1` else echo "Error: invalid argument $1; aborting." exit 1 @@ -90,6 +134,7 @@ else echo "ERROR: parted exited with error $? while creating system partition on ${DRIVE}; aborting." fi fi +sync if [ "$RPIMODE" ]; then echo "Formatting $PARTITION1 (vfat) ..." @@ -117,15 +162,19 @@ mount $PARTITION2 $ROOTMP || { echo "ERROR: unable to mount partition $PARTITION2; aborting." exit 1 } +trap "[ -e $ROOTMP ] && umount $ROOTMP;[ -e $BOOTMP ] && umount $BOOTMP" 0 HUP INT QUIT ABRT KILL TERM if [ "$RPIMODE" ]; then ### SD-Card: install software - echo "Fetching firmware from git..." - SWHOME=`mktemp -d` - - cd $SWHOME - git clone git://github.com/raspberrypi/firmware.git --depth=1 + if [ ! "$USEKERNEL" ]; then + SWHOME=`mktemp -d` + echo "Cloning firmware repository from git..." + cd $SWHOME + git clone git://github.com/raspberrypi/firmware.git --depth=1 + else + echo "Fetching firmware boot files from git..." + fi mount $PARTITION1 $BOOTMP || { echo "ERROR: unable to mount partition $PARTITION1; aborting." @@ -137,7 +186,13 @@ if [ "$RPIMODE" ]; then # start.elf : The GPU binary firmware image, provided by the foundation # kernel.img : The OS kernel to load on the ARM processor. for f in bootcode.bin fixup_x.dat kernel.img start_x.elf LICENCE.broadcom; do - cp $SWHOME/firmware/boot/$f $BOOTMP/ + if [ ! "$USEKERNEL" ]; then + cp $SWHOME/firmware/boot/$f $BOOTMP/ + else + curl -s -L -k https://github.com/raspberrypi/firmware/raw/master/boot/$f -o $BOOTMP/$f || { + echo "ERROR: could not fetch $f from raspberrypi git; aborting." + } + fi done # cmdline.txt : parameters passed to the kernel on boot @@ -171,28 +226,88 @@ framebuffer_ignore_alpha=1" > $BOOTMP/config.txt # vlls directory: Additional GPU code, e.g. extra codecs. # Not present in the initial release. - # copy kernel modules - mkdir -p $ROOTMP/lib/modules - cp -a $SWHOME/firmware/modules/* $ROOTMP/lib/modules/ - umount $PARTITION1 - rmdir $BOOTMP + if [ ! "$USEKERNEL" ]; then + # copy kernel modules + mkdir -p $ROOTMP/lib/modules + cp -a $SWHOME/firmware/modules/* $ROOTMP/lib/modules/ + fi [ "$SWHOME" -a "${SWHOME:0:4}" = "/tmp" ] && rm -rf $SWHOME fi # rpimode -(cd $ROOTMP >/dev/null || { - echo "ERROR: unable to access system partition mount point; aborting." - umount $PARTITION2 - rmdir $ROOTMP - exit 1 -} +( + cd $ROOTMP >/dev/null || { + echo "ERROR: unable to access system partition mount point; aborting." + umount $PARTITION2 + rmdir $ROOTMP + exit 1 + } -echo "Uncompressing $ROOTFSARCHIVE..." -echo "This can take a while, please wait..." -tar xf $ROOTFSARCHIVE + echo "Uncompressing $ROOTFSARCHIVE..." + echo -n "This can take a while, please wait..." + tar xf $ROOTFSARCHIVE || { + echo + echo "ERROR: unable to uncompress rootfs archive; aborting." + exit 1 + } + echo "DONE" + + if [ "$ADDITIONALARCHIVE" ]; then + echo "Uncompressing $ADDITIONALARCHIVE..." + echo -n "This can take a while, please wait..." + tar xf $ADDITIONALARCHIVE || { + echo + echo "ERROR: unable to uncompress additional archive; aborting." + exit 1 + } + echo "DONE" + fi ) +[ $? -eq 0 ] || exit $? + +if [ "$USEKERNEL" ]; then + if [ "$RPIMODE" ]; then + KERNELDEST=$BOOTMP/kernel.img + else + KERNELDEST=/tmp/$USEKERNEL + fi + if [ -r boot/$USEKERNEL ]; then + cp boot/$USEKERNEL $KERNELDEST + if [ -e /tmp/$USEKERNEL ]; then + echo "Extracted kernel available as $KERNELDEST" + else + echo "ERROR: unable to find or copy kernel $USEKERNEL; aborting." + exit 1 + fi + fi +fi + +if [ "$SETHOSTNAME" ]; then + echo "$SETHOSTNAME" > $ROOTMP/etc/hostname + sed -i "s|HOSTNAME=.*|HOSTNAME=$SETHOSTNAME|" $ROOTMP/etc/sysconfig/network + sed -i "s|\(127\.0\.0\.1\W*\)\(.*\)|\1 $SETHOSTNAME.localdomain $SETHOSTNAME localhost.localdomain localhost|" $ROOTMP/etc/hosts +fi + +if [ "$ROOTPASSWORD" ]; then + echo "$ROOTPASSWORD" | chroot $ROOTMP passwd root --stdin || { + echo "ERROR: unable to set password for root; aborting." + exit 1 + } +fi + +if [ "$CHROOTCOMMAND" ]; then + chroot $ROOTMP $CHROOTCOMMAND || { + echo "ERROR: error running chroot command; aborting." + exit 1 + } +fi + sync +if [ "$RPIMODE" ]; then + umount $PARTITION1 + rmdir $BOOTMP +fi umount $PARTITION2 rmdir $ROOTMP