#!/bin/sh -e # # Copyright (C) 2008-2011 Intel, 2014 sysmocom # install.sh [device_name] [rootfs_name] [video_mode] [vga_mode] # PATH=/sbin:/bin:/usr/sbin:/usr/bin # We want a 1 Gig partition on the cf partition_size=1000 # Get a list of hard drives hdnamelist="" live_dev_name=${1%%/*} echo "Searching for hard drives ..." for device in `ls /sys/block/`; do case $device in loop*) # skip loop device ;; ram*) # skip ram device ;; *) # skip the device LiveOS is on # Add valid hard drive name to the list if [ $device != $live_dev_name -a -e /dev/$device ]; then hdnamelist="$hdnamelist $device" fi ;; esac done TARGET_DEVICE_NAME="" for hdname in $hdnamelist; do # Display found hard drives and their basic info echo "-------------------------------" echo /dev/$hdname if [ -r /sys/block/$hdname/device/vendor ]; then echo -n "VENDOR=" cat /sys/block/$hdname/device/vendor fi echo -n "MODEL=" cat /sys/block/$hdname/device/model cat /sys/block/$hdname/device/uevent echo # Get user choice while true; do echo -n "Do you want to install this image there? [y/n] " read answer if [ "$answer" = "y" -o "$answer" = "n" ]; then break fi echo "Please answer y or n" done if [ "$answer" = "y" ]; then TARGET_DEVICE_NAME=$hdname break fi done if [ -n "$TARGET_DEVICE_NAME" ]; then echo "Installing image on /dev/$TARGET_DEVICE_NAME ..." else echo "No hard drive selected. Installation aborted." exit 1 fi device=$TARGET_DEVICE_NAME # # The udev automounter can cause pain here, kill it # rm -f /etc/udev/rules.d/automount.rules rm -f /etc/udev/scripts/mount* # # Unmount anything the automounter had mounted # umount /dev/${device}* 2> /dev/null || /bin/true if [ ! -b /dev/loop0 ] ; then mknod /dev/loop0 b 7 0 fi mkdir -p /tmp cat /proc/mounts > /etc/mtab # MMC devices are special in a couple of ways # 1) they use a partition prefix character 'p' # 2) they are detected asynchronously (need rootwait) rootwait="" part_prefix="" if [ ! "${device#mmcblk}" = "${device}" ]; then part_prefix="p" rootwait="rootwait" fi rootfs=/dev/${device}${part_prefix}1 echo "*****************" echo "Rootfs partition size: $rootfs_size MB ($rootfs)" echo "*****************" echo "Deleting partition table on /dev/${device} ..." dd if=/dev/zero of=/dev/${device} bs=512 count=2 echo "Creating new partition table on /dev/${device} ..." parted /dev/${device} mklabel msdos echo "Creating rootfs partition on $rootfs" parted /dev/${device} mkpart primary 0% $partition_size parted /dev/${device} print echo "Formatting $rootfs to ext4..." mkfs.ext4 $rootfs mkdir /tgt_root mkdir -p /boot echo "Copying rootfs files..." dd if=/media/$1/$2 of=$rootfs bs=1024 # Handling of the target root partition mount $rootfs /tgt_root if [ -d /tgt_root/etc/ ] ; then # We dont want udev to mount our root device while we're booting... if [ -d /tgt_root/etc/udev/ ] ; then echo "/dev/${device}" >> /tgt_root/etc/udev/mount.blacklist fi fi # Handling of the target boot partition mount --bind /tgt_root/boot /boot echo "Preparing boot partition..." GRUBCFG="/boot/grub/grub.cfg" mkdir -p $(dirname $GRUBCFG) cat > $GRUBCFG << EOF default=0 timeout=1 serial --unit=0 --speed=38400 terminal --timeout=2 serial terminal_input --append serial terminal_output --append serial EOF if [ -f /etc/grub.d/40_custom ] ; then echo "Preparing custom grub2 menu..." cat /etc/grub.d/40_custom >> $GRUBCFG sed -i "s@__ROOTFS__@$rootfs $rootwait@g" $GRUBCFG sed -i "s/__VIDEO_MODE__/$3/g" $GRUBCFG sed -i "s/__VGA_MODE__/$4/g" $GRUBCFG sed -i "s/__CONSOLE__/$5/g" $GRUBCFG sed -i "/#/d" $GRUBCFG sed -i "/exec tail/d" $GRUBCFG chmod 0444 $GRUBCFG fi ln -fs /boot/bzImage /tgt_root/vmlinuz grub-install /dev/${device} echo "(hd0) /dev/${device}" > /boot/grub/device.map umount /boot umount /tgt_root sync echo "Remove your installation media, and press ENTER" read enter echo "Rebooting..." reboot -f