[OE-core] [PATCH 1/1] initramfs-framework: include install module in recipe for installation

Otavio Salvador otavio.salvador at ossystems.com.br
Fri Jul 14 17:13:53 UTC 2017


On Wed, Jul 12, 2017 at 8:01 PM,  <wei.tee.ng at intel.com> wrote:
> From: "Ng, Wei Tee" <wei.tee.ng at intel.com>
>
> Utilized the existing init-install-efi.sh script to manage the

init-install-efi.sh could be renamed to install-efi.sh; also the
package name should be install-efi as it does not support other types
of installation.

> installation process of images in initramfs-framework model. This
> script will be executed when "install" option is being chosen in
> the grub menu and install the image on the target platform. A
> new install module is being added in the recipe to handle the
> installation process using initramfs-framework.
>
> [YOCTO #10989]
>
> Signed-off-by: Ng, Wei Tee <wei.tee.ng at intel.com>
> ---
>  .../initramfs-framework/init-install-efi.sh        | 276 +++++++++++++++++++++
>  .../initrdscripts/initramfs-framework_1.0.bb       |  13 +-
>  2 files changed, 287 insertions(+), 2 deletions(-)
>  create mode 100644 meta/recipes-core/initrdscripts/initramfs-framework/init-install-efi.sh
>
> diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/init-install-efi.sh b/meta/recipes-core/initrdscripts/initramfs-framework/init-install-efi.sh
> new file mode 100644
> index 0000000..5ad3a60
> --- /dev/null
> +++ b/meta/recipes-core/initrdscripts/initramfs-framework/init-install-efi.sh
> @@ -0,0 +1,276 @@
> +#!/bin/sh -e
> +#
> +# Copyright (c) 2012, Intel Corporation.
> +# All rights reserved.
> +#
> +# install.sh [device_name] [rootfs_name]
> +#
> +
> +PATH=/sbin:/bin:/usr/sbin:/usr/bin
> +
> +# We need 20 Mb for the boot partition
> +boot_size=20
> +
> +# 5% for swap
> +swap_ratio=5
> +
> +# Get a list of hard drives
> +hdnamelist=""
> +live_dev_name=`cat /proc/mounts | grep ${1%/} | awk '{print $1}'`
> +live_dev_name=${live_dev_name#\/dev/}
> +# Only strip the digit identifier if the device is not an mmc
> +case $live_dev_name in
> +    mmcblk*)
> +    ;;
> +    nvme*)
> +    ;;
> +    *)
> +        live_dev_name=${live_dev_name%%[0-9]*}
> +    ;;
> +esac
> +
> +echo "Searching for hard drives ..."
> +
> +# Some eMMC devices have special sub devices such as mmcblk0boot0 etc
> +# we're currently only interested in the root device so pick them wisely
> +devices=`ls /sys/block/ | grep -v mmcblk` || true
> +mmc_devices=`ls /sys/block/ | grep "mmcblk[0-9]\{1,\}$"` || true
> +devices="$devices $mmc_devices"
> +
> +for device in $devices; do
> +    case $device in
> +        loop*)
> +            # skip loop device
> +            ;;
> +        sr*)
> +            # skip CDROM device
> +            ;;
> +        ram*)
> +            # skip ram device
> +            ;;
> +        *)
> +            # skip the device LiveOS is on
> +            # Add valid hard drive name to the list
> +            case $device in
> +                $live_dev_name*)
> +                # skip the device we are running from
> +                ;;
> +                *)
> +                    hdnamelist="$hdnamelist $device"
> +                ;;
> +            esac
> +            ;;
> +    esac
> +done
> +
> +if [ -z "${hdnamelist}" ]; then
> +    echo "You need another device (besides the live device /dev/${live_dev_name}) to install the image. Installation aborted."
> +    exit 1
> +fi
> +
> +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
> +    if [ -r /sys/block/$hdname/device/model ]; then
> +        echo -n "MODEL="
> +        cat /sys/block/$hdname/device/model
> +    fi
> +    if [ -r /sys/block/$hdname/device/uevent ]; then
> +        echo -n "UEVENT="
> +        cat /sys/block/$hdname/device/uevent
> +    fi
> +    echo
> +done
> +
> +# Get user choice
> +while true; do
> +    echo "Please select an install target or press n to exit ($hdnamelist ): "
> +    read answer
> +    if [ "$answer" = "n" ]; then
> +        echo "Installation manually aborted."
> +        exit 1
> +    fi
> +    for hdname in $hdnamelist; do
> +        if [ "$answer" = "$hdname" ]; then
> +            TARGET_DEVICE_NAME=$answer
> +            break
> +        fi
> +    done
> +    if [ -n "$TARGET_DEVICE_NAME" ]; then
> +        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=/dev/$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 ${device}* 2> /dev/null || /bin/true
> +
> +mkdir -p /tmp
> +
> +# Create /etc/mtab if not present
> +if [ ! -e /etc/mtab ] && [ -e /proc/mounts ]; then
> +    ln -sf /proc/mounts /etc/mtab
> +fi
> +
> +disk_size=$(parted ${device} unit mb print | grep '^Disk .*: .*MB' | cut -d" " -f 3 | sed -e "s/MB//")
> +
> +swap_size=$((disk_size*swap_ratio/100))
> +rootfs_size=$((disk_size-boot_size-swap_size))
> +
> +rootfs_start=$((boot_size))
> +rootfs_end=$((rootfs_start+rootfs_size))
> +swap_start=$((rootfs_end))
> +
> +# 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#/dev/mmcblk}" = "${device}" ] || \
> +   [ ! "${device#/dev/nvme}" = "${device}" ]; then
> +    part_prefix="p"
> +    rootwait="rootwait"
> +fi
> +
> +# USB devices also require rootwait
> +if [ -n `readlink /dev/disk/by-id/usb* | grep $TARGET_DEVICE_NAME` ]; then
> +    rootwait="rootwait"
> +fi
> +
> +bootfs=${device}${part_prefix}1
> +rootfs=${device}${part_prefix}2
> +swap=${device}${part_prefix}3
> +
> +echo "*****************"
> +echo "Boot partition size:   $boot_size MB ($bootfs)"
> +echo "Rootfs partition size: $rootfs_size MB ($rootfs)"
> +echo "Swap partition size:   $swap_size MB ($swap)"
> +echo "*****************"
> +echo "Deleting partition table on ${device} ..."
> +dd if=/dev/zero of=${device} bs=512 count=35
> +
> +echo "Creating new partition table on ${device} ..."
> +parted ${device} mklabel gpt
> +
> +echo "Creating boot partition on $bootfs"
> +parted ${device} mkpart boot fat32 0% $boot_size
> +parted ${device} set 1 boot on
> +
> +echo "Creating rootfs partition on $rootfs"
> +parted ${device} mkpart root ext3 $rootfs_start $rootfs_end
> +
> +echo "Creating swap partition on $swap"
> +parted ${device} mkpart swap linux-swap $swap_start 100%
> +
> +parted ${device} print
> +
> +echo "Formatting $bootfs to vfat..."
> +mkfs.vfat $bootfs
> +
> +echo "Formatting $rootfs to ext3..."
> +mkfs.ext3 $rootfs
> +
> +echo "Formatting swap partition...($swap)"
> +mkswap $swap
> +
> +mkdir /tgt_root
> +mkdir /src_root
> +mkdir -p /boot
> +
> +# Handling of the target root partition
> +mount $rootfs /tgt_root
> +mount -o rw,loop,noatime,nodiratime /run/media/$1/$2 /src_root
> +echo "Copying rootfs files..."
> +cp -a /src_root/* /tgt_root
> +if [ -d /tgt_root/etc/ ] ; then
> +    boot_uuid=$(blkid -o value -s UUID ${bootfs})
> +    swap_part_uuid=$(blkid -o value -s PARTUUID ${swap})
> +    echo "/dev/disk/by-partuuid/$swap_part_uuid                swap             swap       defaults              0  0" >> /tgt_root/etc/fstab
> +    echo "UUID=$boot_uuid              /boot            vfat       defaults              1  2" >> /tgt_root/etc/fstab
> +    # We dont want udev to mount our root device while we're booting...
> +    if [ -d /tgt_root/etc/udev/ ] ; then
> +        echo "${device}" >> /tgt_root/etc/udev/mount.blacklist
> +    fi
> +fi
> +
> +umount /src_root
> +
> +# Handling of the target boot partition
> +mount $bootfs /boot
> +echo "Preparing boot partition..."
> +
> +EFIDIR="/boot/EFI/BOOT"
> +mkdir -p $EFIDIR
> +# Copy the efi loader
> +cp /run/media/$1/EFI/BOOT/*.efi $EFIDIR
> +
> +if [ -f /run/media/$1/EFI/BOOT/grub.cfg ]; then
> +    root_part_uuid=$(blkid -o value -s PARTUUID ${rootfs})
> +    GRUBCFG="$EFIDIR/grub.cfg"
> +    cp /run/media/$1/EFI/BOOT/grub.cfg $GRUBCFG
> +    # Update grub config for the installed image
> +    # Delete the install entry
> +    sed -i "/menuentry 'install'/,/^}/d" $GRUBCFG
> +    # Delete the initrd lines
> +    sed -i "/initrd /d" $GRUBCFG
> +    # Delete any LABEL= strings
> +    sed -i "s/ LABEL=[^ ]*/ /" $GRUBCFG
> +    # Delete any root= strings
> +    sed -i "s/ root=[^ ]*/ /g" $GRUBCFG
> +    # Add the root= and other standard boot options
> +    sed -i "s at linux /vmlinuz *@linux /vmlinuz root=PARTUUID=$root_part_uuid rw $rootwait quiet @" $GRUBCFG
> +fi
> +
> +if [ -d /run/media/$1/loader ]; then
> +    rootuuid=$(blkid -o value -s PARTUUID ${rootfs})
> +    SYSTEMDBOOT_CFGS="/boot/loader/entries/*.conf"
> +    # copy config files for systemd-boot
> +    cp -dr /run/media/$1/loader /boot
> +    # delete the install entry
> +    rm -f /boot/loader/entries/install.conf
> +    # delete the initrd lines
> +    sed -i "/initrd /d" $SYSTEMDBOOT_CFGS
> +    # delete any LABEL= strings
> +    sed -i "s/ LABEL=[^ ]*/ /" $SYSTEMDBOOT_CFGS
> +    # delete any root= strings
> +    sed -i "s/ root=[^ ]*/ /" $SYSTEMDBOOT_CFGS
> +    # add the root= and other standard boot options
> +    sed -i "s at options *@options root=PARTUUID=$rootuuid rw $rootwait quiet @" $SYSTEMDBOOT_CFGS
> +fi
> +
> +umount /tgt_root
> +
> +cp /run/media/$1/vmlinuz /boot
> +
> +umount /boot
> +
> +sync
> +
> +echo "Remove your installation media, and press ENTER"
> +
> +read enter
> +
> +echo "Rebooting..."
> +reboot -f
> diff --git a/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb b/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb
> index 211e89d..15c376e 100644
> --- a/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb
> +++ b/meta/recipes-core/initrdscripts/initramfs-framework_1.0.bb
> @@ -14,7 +14,8 @@ SRC_URI = "file://init \
>             file://udev \
>             file://e2fs \
>             file://debug \
> -           file://setup-live"
> +           file://setup-live \
> +           file://init-install-efi.sh"
>
>  S = "${WORKDIR}"
>
> @@ -41,6 +42,9 @@ do_install() {
>      # debug
>      install -m 0755 ${WORKDIR}/debug ${D}/init.d/00-debug
>
> +    # install
> +    install -m 0755 ${WORKDIR}/init-install-efi.sh ${D}/init.d/install-efi.sh
> +
>      # Create device nodes expected by some kernels in initramfs
>      # before even executing /init.
>      install -d ${D}/dev
> @@ -53,7 +57,8 @@ PACKAGES = "${PN}-base \
>              initramfs-module-e2fs \
>              initramfs-module-rootfs \
>              initramfs-module-debug \
> -            initramfs-module-setup-live"
> +            initramfs-module-setup-live \
> +            initramfs-module-install"
>
>  FILES_${PN}-base = "/init /init.d/99-finish /dev"
>
> @@ -88,3 +93,7 @@ FILES_initramfs-module-rootfs = "/init.d/90-rootfs"
>  SUMMARY_initramfs-module-debug = "initramfs dynamic debug support"
>  RDEPENDS_initramfs-module-debug = "${PN}-base"
>  FILES_initramfs-module-debug = "/init.d/00-debug"
> +
> +SUMMARY_initramfs-module-install = "initramfs support for installation option"
> +RDEPENDS_initramfs-module-install = "${PN}-base parted e2fsprogs-mke2fs dosfstools util-linux-blkid"
> +FILES_initramfs-module-install = "/init.d/install-efi.sh"
> --
> 2.7.4
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core



-- 
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9981-7854            Mobile: +1 (347) 903-9750



More information about the Openembedded-core mailing list