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.
This commit is contained in:
Adrian Gibanel Lopez 2014-12-07 18:20:09 +01:00
parent d515ae5684
commit b6771e7360
2 changed files with 342 additions and 0 deletions

View File

@ -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 ${@}

341
scripts/build/binary_loopback_cfg Executable file
View File

@ -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