[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