From 4433c53b7603c019600d8d5af1f000f87c3deadd Mon Sep 17 00:00:00 2001 From: Henning Heinold Date: Fri, 21 Mar 2014 21:04:03 +0100 Subject: [PATCH] initramfs: modify init-install to install our bsc image Fixes: partly SYS#75 --- .../initrdscripts/files/init-install.sh | 180 ++++++++++++++++++ .../initramfs-live-install_sysmocom.inc | 2 + .../initramfs-live-install_1.0.bbappend | 1 + 3 files changed, 183 insertions(+) create mode 100644 recipes-core/initrdscripts/files/init-install.sh create mode 100644 recipes-core/initrdscripts/initramfs-live-install_sysmocom.inc create mode 100644 yocto-dora/initramfs-live-install_1.0.bbappend diff --git a/recipes-core/initrdscripts/files/init-install.sh b/recipes-core/initrdscripts/files/init-install.sh new file mode 100644 index 0000000..250b13f --- /dev/null +++ b/recipes-core/initrdscripts/files/init-install.sh @@ -0,0 +1,180 @@ +#!/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 diff --git a/recipes-core/initrdscripts/initramfs-live-install_sysmocom.inc b/recipes-core/initrdscripts/initramfs-live-install_sysmocom.inc new file mode 100644 index 0000000..0fca764 --- /dev/null +++ b/recipes-core/initrdscripts/initramfs-live-install_sysmocom.inc @@ -0,0 +1,2 @@ +SYSMOCOM := "${@os.path.dirname(bb.data.getVar('FILE', d, True))}" +FILESEXTRAPATHS_prepend := "${SYSMOCOM}/files:" diff --git a/yocto-dora/initramfs-live-install_1.0.bbappend b/yocto-dora/initramfs-live-install_1.0.bbappend new file mode 100644 index 0000000..69d3d84 --- /dev/null +++ b/yocto-dora/initramfs-live-install_1.0.bbappend @@ -0,0 +1 @@ +require recipes-core/initrdscripts/${PN}_sysmocom.inc