diff options
author | Adrian Gibanel Lopez <adrian.gibanel@btactic.com> | 2014-12-07 18:20:09 +0100 |
---|---|---|
committer | Adrian Gibanel Lopez <adrian.gibanel@btactic.com> | 2015-08-30 00:04:04 +0200 |
commit | b6771e736022d31b0cb53c552a0f7a42a1028a09 (patch) | |
tree | 7fb39b7d7f1510a5fc59614f738afab3feef937a | |
parent | d515ae56842f9420ff4c629eac18904f7beef2e8 (diff) | |
download | vyos-live-build-b6771e736022d31b0cb53c552a0f7a42a1028a09.tar.gz vyos-live-build-b6771e736022d31b0cb53c552a0f7a42a1028a09.zip |
Loopback cfg support.
Development details
--------------------
* This patch has been based originally on: binary_grub2 . It has been
improved thanks to some binary_syslinux bits.
* This patch ensures that binary_loopback_cfg needs is run
before binary_syslinux is run.
The reason is that it reuses some code from binary_syslinux to avoid
problems when binary_syslinux renames the kernel filenames.
* This patch already supports CPU detection
* I haven't tested all the possible scenarios for the script (with the
latest version). When amd64 and 486 Gnu/Linux flavours is used and the
bootloader is syslinux it works ok.
* I have not implemented a disable switch for not generating it.
Usually you always want loopback.cfg to be there.
* Compared to binary_grub2 script I have removed the installation
entries because I did not see any of them in binary_syslinux.
How to test
-----------
These are some steps to easily test if Looback cfg support is working ok.
0) We assume you have generated an iso
1) Make sure you have a partition that Grub understands. Plain ext4 or
vfat should do it.
2) Create directory: /boot/boot-isos/
3) Put the iso file into that directory making sure it has an ISO or iso
extension.
4) Setup your computer to boot from cdrom and use: Super Grub2 Disk
2.00s2 (Hybrid version recommended)
5) Choose Boot manually...
6) Choose Bootable ISOs (in /boot- ... )
7) Choose (the detected) GRUB Loopback Config
(hdN,msodsN)/boot/boot-ios/name-of-the.iso
8) You will be presented your loopback.cfg. Choose anyone of the entries
(unless it does not match your cpu architecture of course).
9) You should boot into your Debian Live without problems (thanks to
findiso boot parametre).
If you ever wanted to test from your grub2 installation instead from
Super Grub2 Disk check: http://www.supergrubdisk.org/wiki/Loopback.cfg
for an example.
-rwxr-xr-x | scripts/build/binary | 1 | ||||
-rwxr-xr-x | scripts/build/binary_loopback_cfg | 341 |
2 files changed, 342 insertions, 0 deletions
diff --git a/scripts/build/binary b/scripts/build/binary index fe90d8e75..56c7bf83a 100755 --- a/scripts/build/binary +++ b/scripts/build/binary @@ -62,6 +62,7 @@ lb binary_linux-image ${@} lb binary_memtest ${@} lb binary_grub-legacy ${@} lb binary_grub-pc ${@} +lb binary_loopback_cfg ${@} lb binary_syslinux ${@} lb binary_disk ${@} lb binary_loadlin ${@} diff --git a/scripts/build/binary_loopback_cfg b/scripts/build/binary_loopback_cfg new file mode 100755 index 000000000..6034ddc36 --- /dev/null +++ b/scripts/build/binary_loopback_cfg @@ -0,0 +1,341 @@ +#!/bin/sh + +## live-build(7) - System Build Scripts +## Copyright (C) 2006-2015 Daniel Baumann <mail@daniel-baumann.ch> +## +## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING. +## This is free software, and you are welcome to redistribute it +## under certain conditions; see COPYING for details. + + +set -e + +# Including common functions +[ -e "${LIVE_BUILD}/scripts/build.sh" ] && . "${LIVE_BUILD}/scripts/build.sh" || . /usr/lib/live/build.sh + +# Setting static variables +DESCRIPTION="$(Echo 'installs loopback.cfg into binary')" +HELP="" +USAGE="${PROGRAM} [--force]" + +Arguments "${@}" + +# Reading configuration files +Read_conffiles config/all config/common config/bootstrap config/chroot config/binary config/source +Set_defaults + +# We avoid checking if we need to be running this bootloader +# on purpose. The reason: You will always want to have +# a loopback.cfg file +# TODO: Add an option to be able to disable this file creation +Echo_message "Begin installing loopback.cfg..." + +# Requiring stage file +Require_stagefile .build/config .build/bootstrap + +# Checking stage file +Check_stagefile .build/binary_loopback_cfg + +# Checking lock file +Check_lockfile .lock + +# Creating lock file +Create_lockfile .lock + +# Check architecture +Check_architectures amd64 i386 +Check_crossarchitectures + +# Local functions +Grub_live_entry_commands () +{ + local KERNEL="${1}" + local INITRD="${2}" + local APPEND="${3}" + + LINUX_LIVE="${LINUX_LIVE}\nlinux\t\t/${KERNEL} ${INITFS:+boot=${INITFS} }config LB_BOOTAPPEND_LIVE ${APPEND}" + LINUX_LIVE="${LINUX_LIVE}\ninitrd\t\t/${INITRD}" +} + +Grub_live_entry () +{ + local LABEL="${1}" + local KERNEL="${2}" + local INITRD="${3}" + local APPEND="${4}" + + LINUX_LIVE="${LINUX_LIVE}\nmenuentry \"Debian GNU/Linux - ${LABEL}\" {" + Grub_live_entry_commands "${KERNEL}" "${INITRD}" "${APPEND} findiso=\${iso_path}" + LINUX_LIVE="${LINUX_LIVE}\n}" +} + +Grub_live_autodetect_entry () +{ + local LABEL="${1}" + local AMD64_KERNEL="${2}" + local AMD64_INITRD="${3}" + local _486_KERNEL="${4}" + local _486_INITRD="${5}" + local APPEND="${6}" + + LINUX_LIVE="${LINUX_LIVE}\nmenuentry \"Debian GNU/Linux - ${LABEL}\" {" + LINUX_LIVE="${LINUX_LIVE}\nif cpuid -l ; then" + Grub_live_entry_commands "${AMD64_KERNEL}" "${AMD64_INITRD}" "${APPEND} findiso=\${iso_path}" + LINUX_LIVE="${LINUX_LIVE}\nelse" + Grub_live_entry_commands "${_486_KERNEL}" "${_486_INITRD}" "${APPEND} findiso=\${iso_path}" + LINUX_LIVE="${LINUX_LIVE}\nfi" + LINUX_LIVE="${LINUX_LIVE}\n}" +} + +if [ -e "config/bootloaders/grub-pc" ] +then + # Internal local copy + _SOURCE="config/bootloaders/grub-pc" +else + # Internal system copy + if [ -n "${LIVE_BUILD}" ] + then + _SOURCE="${LIVE_BUILD}/share/bootloaders/grub-pc" + else + _SOURCE="/usr/share/live/build/bootloaders/grub-pc" + fi +fi + +case "${LB_INITRAMFS}" in + live-boot) + INITFS="live" + ;; + + *) + INITFS="" + ;; +esac + +# Assembling image specifics +case "${LIVE_IMAGE_TYPE}" in + iso*) + _BOOTLOADER="isolinux" + + case "${LB_MODE}" in + progress-linux) + _TARGET="binary/boot" + ;; + + *) + _TARGET="binary/isolinux" + ;; + esac + ;; + + netboot) + _BOOTLOADER="pxelinux" + _TARGET="tftpboot" + ;; + + hdd*|*) + case ${LB_BINARY_FILESYSTEM} in + fat*|ntfs) + _BOOTLOADER=syslinux + + case "${LB_MODE}" in + progress-linux) + _TARGET="binary/boot" + ;; + + *) + _TARGET="binary/syslinux" + ;; + esac + ;; + + ext[234]|btrfs) + _BOOTLOADER=extlinux + _TARGET="binary/boot/extlinux" + ;; + *) + Echo_error "syslinux/extlinux doesn't support ${LB_BINARY_FILESYSTEM}" + exit 1 + ;; + esac + ;; +esac + +DESTDIR_LIVE="${_TARGET}" + +Check_multiarchitectures + +# Creating directory +mkdir -p "${DESTDIR_LIVE}" + +# Setting boot parameters +if [ "${LB_UNION_FILESYSTEM}" != "aufs" ] +then + LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} union=${LB_UNION_FILESYSTEM}" +fi + +if [ -n "${LB_NET_COW_PATH}" ] +then + Echo_error "Net cow not yet supported on grub" + exit 1 +fi + +LB_BOOTAPPEND_LIVE="$(echo ${LB_BOOTAPPEND_LIVE} | sed -e 's| ||')" + +# Assembling kernel configuration +# If Bootloader is not syslinux that means +# binary_syslinux it's not going to rename kernel filenames in a later stage. +# We will use binary_grub2 algorithm which does not rename kernel filenames. + +FOUND_SYSLINUX="" +OLDIFS="$IFS" +IFS="," +for BOOTLOADER in ${LB_BOOTLOADERS} +do + + case ${BOOTLOADER} in + "syslinux" ) + FOUND_SYSLINUX="True" + break ;; + esac + +done +IFS="$OLDIFS" + +if [ -z ${FOUND_SYSLINUX} ] +then + + _AMD64_486_NUMBER="0" + + for _FLAVOUR in ${LB_LINUX_FLAVOURS} + do + if [ "${_FLAVOUR}" = "amd64" -o "${_FLAVOUR}" = "486" ] ; then + _AMD64_486_NUMBER="$((${_AMD64_486_NUMBER} + 1))" + fi + done + + if [ "${_AMD64_486_NUMBER}" -ge 2 ] ; then + # Default entries + AMD64_KERNEL="$(basename chroot/boot/vmlinuz-*amd64)" + AMD64_INITRD="initrd.img-$(echo ${AMD64_KERNEL} | sed -e 's|vmlinuz-||')" + _486_KERNEL="$(basename chroot/boot/vmlinuz-*486)" + _486_INITRD="initrd.img-$(echo ${_486_KERNEL} | sed -e 's|vmlinuz-||')" + + Grub_live_autodetect_entry "live (autodetect)" \ + "${INITFS}/${AMD64_KERNEL}" \ + "${INITFS}/${AMD64_INITRD}" \ + "${INITFS}/${_486_KERNEL}" \ + "${INITFS}/${_486_INITRD}" + fi + + # Default entries + DEFAULT_FLAVOUR="$(echo ${LB_LINUX_FLAVOURS} | awk '{ print $1 }')" + DEFAULT_KERNEL="$(basename chroot/boot/vmlinuz-*${DEFAULT_FLAVOUR})" + DEFAULT_INITRD="initrd.img-$(echo ${DEFAULT_KERNEL} | sed -e 's|vmlinuz-||')" + + Grub_live_entry "live" "${INITFS}/${DEFAULT_KERNEL}" "${INITFS}/${DEFAULT_INITRD}" + + if [ "${LB_BOOTAPPEND_FAILSAFE}" != "none" ] + then + Grub_live_entry "live (fail-safe mode)" "${INITFS}/${DEFAULT_KERNEL}" "${INITFS}/${DEFAULT_INITRD}" "${LB_BOOTAPPEND_FAILSAFE}" + fi + + for KERNEL in chroot/boot/vmlinuz-* + do + VERSION="$(basename ${KERNEL} | sed -e 's|vmlinuz-||')" + + Grub_live_entry "live, kernel ${VERSION}" "${INITFS}/$(basename ${KERNEL})" "${INITFS}/initrd.img-${VERSION}" + Grub_live_entry "live, kernel ${VERSION} (fail-safe mode)" "${INITFS}/$(basename ${KERNEL})" "${INITFS}/initrd.img-${VERSION}" "${LB_BOOTAPPEND_FAILSAFE}" + done +else # LB_BOOTLOADERS does not contain syslinux +# If one of the bootloader is syslinux that means +# binary_syslinux it's going to rename kernel filenames. +# We will use binary_syslinux algorithm but without renaming kernel filenames. +# That will ensure binary_syslinux will find the original kernel filenames. + #if [ -e "${_TARGET}/live.cfg.in" ] + #then + # This is all rather suboptimal.. needs prettifying at some point + _FLAVOURS="$(echo ${LB_LINUX_FLAVOURS} | wc -w)" + + case "${_FLAVOURS}" in + 1) + Grub_live_entry "live (${LB_LINUX_FLAVOURS})" "${INITFS}/vmlinuz" "${INITFS}/initrd.img" "${LB_BOOTAPPEND_LIVE}" + Grub_live_entry "live (${LB_LINUX_FLAVOURS}) (failsafe mode)" "${INITFS}/vmlinuz" "${INITFS}/initrd.img" "${LB_BOOTAPPEND_LIVE_FAILSAFE}" + ;; + + *) + _AMD64_486_NUMBER="0" + + for _FLAVOUR in ${LB_LINUX_FLAVOURS} + do + if [ "${_FLAVOUR}" = "amd64" -o "${_FLAVOUR}" = "486" ] ; then + _AMD64_486_NUMBER="$((${_AMD64_486_NUMBER} + 1))" + fi + done + + _NUMBER="0" + for _FLAVOUR in ${LB_LINUX_FLAVOURS} + do + _NUMBER="$((${_NUMBER} + 1))" + if [ "${_FLAVOUR}" = "amd64" ] ; then + AMD64_KERNEL="vmlinuz${_NUMBER}" + AMD64_INITRD="initrd${_NUMBER}.img" + fi + + if [ "${_FLAVOUR}" = "486" ] ; then + _486_KERNEL="vmlinuz${_NUMBER}" + _486_INITRD="initrd${_NUMBER}.img" + fi + done + + _NUMBER="0" + + for _FLAVOUR in ${LB_LINUX_FLAVOURS} + do + _NUMBER="$((${_NUMBER} + 1))" + + if [ "${_NUMBER}" -gt 1 ] + then + Grub_live_entry "live (${_FLAVOUR})" "${INITFS}/vmlinuz${_NUMBER}" "${INITFS}/initrd${_NUMBER}.img" "${LB_BOOTAPPEND_LIVE}" + Grub_live_entry "live (${_FLAVOUR}) (failsafe mode)" "${INITFS}/vmlinuz${_NUMBER}" "${INITFS}/initrd${_NUMBER}.img" "${LB_BOOTAPPEND_LIVE_FAILSAFE}" + + else + if [ "${_AMD64_486_NUMBER}" -ge 2 ] ; then + + Grub_live_autodetect_entry "live (autodetect)" \ + "${INITFS}/${AMD64_KERNEL}" \ + "${INITFS}/${AMD64_INITRD}" \ + "${INITFS}/${_486_KERNEL}" \ + "${INITFS}/${_486_INITRD}" + fi + + Grub_live_entry "live (${_FLAVOUR})" "${INITFS}/vmlinuz${_NUMBER}" "${INITFS}/initrd${_NUMBER}.img" "${LB_BOOTAPPEND_LIVE}" + Grub_live_entry "live (${_FLAVOUR}) (failsafe mode)" "${INITFS}/vmlinuz${_NUMBER}" "${INITFS}/initrd${_NUMBER}.img" "${LB_BOOTAPPEND_LIVE_FAILSAFE}" + fi + + done + + ;; + esac + #fi +fi +LINUX_LIVE="$(/bin/echo ${LINUX_LIVE} | sed -e 's|binary||g' -e 's|//|/|g')" + +# Assembling memtest configuration +if [ -f "${DESTDIR_LIVE}"/memtest ] +then + MEMTEST="#\t \"Other\"\n" + MEMTEST="${MEMTEST}\nmenuentry\t\"${LB_MEMTEST}\" {\nlinux16\t${INITFS}/memtest\n}" + MEMTEST="$(/bin/echo ${MEMTEST} | sed -e 's|//|/|g')" +fi + +# Copying templates +mkdir -p binary/boot/grub +cp "${_SOURCE}"/grub.cfg binary/boot/grub/loopback.cfg + +sed -i -e "s|LINUX_LIVE|${LINUX_LIVE}|" -e "s|LINUX_INSTALL||" -e "s|MEMTEST|${MEMTEST}|" binary/boot/grub/loopback.cfg +sed -i -e "s#LB_BOOTAPPEND_INSTALL##" -e "s#LB_BOOTAPPEND_LIVE#${LB_BOOTAPPEND_LIVE}#" binary/boot/grub/loopback.cfg + +sed -i -e 's|\ $||g' binary/boot/grub/loopback.cfg + +# Creating stage file +Create_stagefile .build/binary_loopback_cfg |