diff options
Diffstat (limited to 'scripts/build/binary_syslinux')
-rwxr-xr-x | scripts/build/binary_syslinux | 659 |
1 files changed, 659 insertions, 0 deletions
diff --git a/scripts/build/binary_syslinux b/scripts/build/binary_syslinux new file mode 100755 index 0000000..43c0b54 --- /dev/null +++ b/scripts/build/binary_syslinux @@ -0,0 +1,659 @@ +#!/bin/sh + +# lh_binary_syslinux(1) - installs syslinux into binary +# Copyright (C) 2006-2010 Daniel Baumann <daniel@debian.org> +# +# live-helper 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 +. "${LH_BASE:-/usr/share/live-helper}"/scripts/build.sh + +# Setting static variables +DESCRIPTION="$(Echo 'installs syslinux 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 + +if [ "${LH_BOOTLOADER}" != "syslinux" ] +then + exit 0 +fi + +Echo_message "Begin installing syslinux..." + +# Requiring stage file +Require_stagefile .stage/config .stage/bootstrap + +# Checking stage file +Check_stagefile .stage/binary_syslinux + +# Checking syslinux templates +Check_templates syslinux + +# Checking lock file +Check_lockfile .lock + +# Creating lock file +Create_lockfile .lock + +# Check architecture +Check_architecture amd64 i386 +Check_crossarchitecture + +# Checking depends +Check_package chroot/usr/bin/syslinux syslinux + +# Restoring cache +Restore_cache cache/packages_binary + +# Installing depends +Install_package + +# Local functions +Utf8_to_latin1 () +{ + VALUE="${1}" + + echo "${VALUE}" | iconv -f utf-8 -t latin1 +} + +Syslinux_memtest_entry () +{ + LABEL="${1}" + MENULABEL="$(Utf8_to_latin1 "${2}")" + KERNEL="${3}" + + MEMTEST="${MEMTEST}\nlabel ${LABEL}\n" + + # Write the menu label if the syslinux menu is being use + MEMTEST="${MEMTEST}\tmenu label ${MENULABEL}\n" + MEMTEST="${MEMTEST}\tkernel ${LIVE_KERNEL_PATH}/${KERNEL}\n" + MEMTEST="$(/bin/echo ${MEMTEST} | sed -e 's|//|/|g')" +} + +Syslinux_live_entry () +{ + LABEL="${1}" + MENULABEL="$(Utf8_to_latin1 "${2}")" + MENULABEL="${2}" + KERNEL="${3}" + INITRD="${4}" + APPEND="${5}" + + case "${LH_BINARY_IMAGES}" in + iso*|usb*) + NUMBER="$(ls -1 ${KERNEL_PATH} | grep 'vmlinuz[0-9]\+$' | wc -l)" + NUMBER="$((${NUMBER} +1))" + + # Do not add numbering to filenames if first kernel/initrd + if [ "${NUMBER}" = "1" ] + then + NUMBER="" + fi + + # Note: ISOLINUX will not find the kernel if the name ends in ".img". + if [ -e ${KERNEL_PATH}/${KERNEL} ] + then + mv ${KERNEL_PATH}/${KERNEL} ${KERNEL_PATH}/vmlinuz${NUMBER} + fi + + if [ -e ${KERNEL_PATH}/${INITRD} ] + then + mv ${KERNEL_PATH}/${INITRD} ${KERNEL_PATH}/initrd${NUMBER}.img + fi + + KERNEL=vmlinuz${NUMBER} + INITRD=initrd${NUMBER}.img + ;; + esac + + # Regular kernel + LINUX_LIVE="${LINUX_LIVE}\nlabel ${LABEL}\n" + + # Write the menu label if the syslinux menu is being use + if [ -n "${MENULABEL}" ] + then + LINUX_LIVE="${LINUX_LIVE}\tmenu label ${MENULABEL}\n" + fi + + LINUX_LIVE="${LINUX_LIVE}\tkernel ${LIVE_KERNEL_PATH}/${KERNEL}\n" + LINUX_LIVE="${LINUX_LIVE}\tappend initrd=${LIVE_KERNEL_PATH}/${INITRD} boot=${INITFS} live-config ${LH_BOOTAPPEND_LIVE} ${APPEND}\n" + + # Failsafe kernel + LINUX_LIVE="${LINUX_LIVE}\nlabel ${LABEL}failsafe\n" + + # Write the menu label if the syslinux menu is being use + if [ -n "${MENULABEL}" ] + then + LINUX_LIVE="${LINUX_LIVE}\tmenu label ${MENULABEL} (failsafe)\n" + fi + + LINUX_LIVE="${LINUX_LIVE}\tkernel ${LIVE_KERNEL_PATH}/${KERNEL}\n" + LINUX_LIVE="${LINUX_LIVE}\tappend initrd=${LIVE_KERNEL_PATH}/${INITRD} boot=${INITFS} live-config ${LH_BOOTAPPEND_LIVE} ${APPEND} ${FAILSAFE}\n" +} + +Syslinux_install_entry () +{ + LABEL="${1}" + KERNEL="${2}" + INITRD="${3}" + APPEND="${4}" + + # Boot in quiet mode where appropriate + QAPPEND="quiet" + + for TYPE in Install Expert Rescue Auto + do + case "${TYPE}" in + Install) + TAPPEND="${APPEND} ${QAPPEND}" + ;; + + Expert) + TAPPEND="priority=low ${APPEND}" + ;; + + Rescue) + TAPPEND="rescue/enable=true ${APPEND} ${QAPPEND}" + ;; + + Auto) + TAPPEND="auto=true priority=critical ${APPEND} ${QAPPEND}" + ;; + esac + + case "${LABEL}" in + Text) + TYPE_SUFFIX="" + ;; + GUI) + TYPE_SUFFIX="gui" + ;; + esac + + LINUX_INSTALL="${LINUX_INSTALL}\nlabel $(echo "${TYPE}" | tr A-Z a-z)${TYPE_SUFFIX}\n" + LINUX_INSTALL="${LINUX_INSTALL}\tmenu label ${LABEL} ${TYPE}\n" + LINUX_INSTALL="${LINUX_INSTALL}\tkernel ${LIVE_INSTALL_KERNEL_PATH}/${KERNEL}\n" + LINUX_INSTALL="${LINUX_INSTALL}\tappend initrd=${LIVE_INSTALL_KERNEL_PATH}/${INITRD} ${TAPPEND} ${LH_BOOTAPPEND_INSTALL}\n" + done +} + +Copy_syslinux_templates () +{ + cp -r "${TEMPLATES}"/common/* ${SCREEN_PATH} + + if [ "${LH_SYSLINUX_MENU}" = "false" ] + then + cp "${TEMPLATES}"/normal/* ${SCREEN_PATH} + else + cp "${TEMPLATES}"/menu/* ${SCREEN_PATH} + + case "${LH_SYSLINUX_MENU}" in + gfxboot) + MENUMODULE="gfxboot.c32" + ;; + + menu) + MENUMODULE="menu.c32" + ;; + + vesamenu) + MENUMODULE="vesamenu.c32" + ;; + + *) + if [ -z "${LH_SYSLINUX_CFG}" ] + then + MENUMODULE=$(grep 'menu.c32' ${TEMPLATES}/menu/syslinux.cfg | sed 's|default\s*.*/\(.*menu.c32\)$|\1|g') + else + LH_SYSLINUX_CFG="${LH_SYSLINUX_CFG:-${TEMPLATES}/menu/syslinux.cfg}" + fi + ;; + esac + + case "${LH_BUILD_WITH_CHROOT}" in + true) + cp chroot/usr/lib/syslinux/"${MENUMODULE}" ${DATA_PATH} + ;; + false) + cp /usr/lib/syslinux/"${MENUMODULE}" ${DATA_PATH} + ;; + esac + fi + + if ls "${TEMPLATES}/${LH_LANGUAGE}"/* > /dev/null 2>&1 + then + cp -r "${TEMPLATES}"/"${LH_LANGUAGE}"/* ${SCREEN_PATH} + else + if ls "${TEMPLATES}"/en/* > /dev/null 2>&1 + then + cp -r "${TEMPLATES}"/en/* ${SCREEN_PATH} + fi + fi + + if ls ${SCREEN_PATH}/*.live > /dev/null 2>&1 + then + for FILE in ${SCREEN_PATH}/*.live + do + mv ${FILE} $(dirname ${FILE})/$(basename ${FILE} .live) + done + fi + + if [ "${LH_DEBIAN_INSTALLER}" != "false" ] + then + if ls ${SCREEN_PATH}/*.install > /dev/null 2>&1 + then + for FILE in ${SCREEN_PATH}/*.install + do + mv ${FILE} $(dirname ${FILE})/$(basename ${FILE} .install) + done + fi + + case "${LH_ARCHITECTURE}" in + amd64|i386|powerpc) + if ls ${SCREEN_PATH}/*.install.g-i > /dev/null 2>&1 + then + for FILE in ${SCREEN_PATH}/*.install.g-i + do + mv ${FILE} $(dirname ${FILE})/$(basename ${FILE} .install.g-i) + done + fi + ;; + + *) + rm -f ${SCREEN_PATH}/*.install.g-i + ;; + esac + else + rm -f ${SCREEN_PATH}/*.install* + fi + + if [ "${LH_SYSLINUX_MENU}" != "false" ] + then + rm -f ${DATA_PATH}/boot.txt + fi + + # Copying custom splash screen + if [ "${LH_SYSLINUX_SPLASH}" = "none" ] + then + # no splash screen + SPLASH="" + rm -f ${SCREEN_PATH}/splash.rle + rm -f ${DATA_PATH}/splash.png + else + if [ "${LH_SYSLINUX_MENU}" = "false" ] + then + SPLASH="${LIVE_DATA_PATH}/splash.rle" + else + SPLASH="${LIVE_DATA_PATH}/splash.png" + fi + + if [ -n "${LH_SYSLINUX_SPLASH}" ] + then + if [ ! -e "${LH_SYSLINUX_SPLASH}" ] + then + Echo_error "%s doen't exist" "${LH_SYSLINUX_SPLASH}" + exit 1 + else + rm -f ${SCREEN_PATH}/splash.rle + rm -f ${DATA_PATH}/splash.png + cp -f "${LH_SYSLINUX_SPLASH}" ${DATA_PATH}/$(basename ${SPLASH}) + fi + fi + fi +} + +Configure_syslinux_templates () +{ + templates="$(find ${SYSLINUX_PATH} -type f -name '*.cfg' -o -name '*.txt')" + + for template_file in ${templates} + do + sed -i -e "s|{\$LINUX_LIVE}|${LINUX_LIVE}|" \ + -e "s|{\$LINUX_INSTALL}|${LINUX_INSTALL}|" \ + -e "s|{\$MEMTEST}|${MEMTEST}|" \ + -e "s|{\$LIVE_SCREEN_PATH}|${LIVE_SCREEN_PATH}|" \ + -e "s|{\$LIVE_DATA_PATH}|${LIVE_DATA_PATH}|" \ + -e "s|{\$LIVE_KERNEL_PATH}|${LIVE_KERNEL_PATH}|" \ + -e "s|{\$SPLASH}|${SPLASH}|" \ + -e "s|{\$LH_DISTRIBUTION}|${LH_DISTRIBUTION}|" \ + -e "s|{\$LH_DATE}|$(date +%Y%m%d)|" \ + -e "s|{\$LH_MEDIA}|${MEDIA}|" \ + -e "s|{\$LH_VERSION}|${VERSION}|" \ + -e "s|{\$LH_SYSLINUX_TIMEOUT}|${LH_SYSLINUX_TIMEOUT}0|" \ + $template_file + done + + case "${LH_BINARY_IMAGES}" in + usb*) + if [ -f "${SYSLINUX_PATH}/exithelp.cfg" ] + then + sed -i -e "s|config isolinux.cfg|config syslinux.cfg|" "${SYSLINUX_PATH}"/exithelp.cfg + fi + ;; + + net) + if [ -f "${SCREEN_PATH}/exithelp.cfg" ] + then + sed -i -e "s|config isolinux.cfg|config ${LIVE_KERNEL_PATH}/pxelinux.cfg/default|" "${SCREEN_PATH}"/exithelp.cfg + fi + ;; + esac +} + +# Setting up common variables +case "${LH_INITRAMFS}" in + casper) + INITFS="casper" + ;; + + live-initramfs) + INITFS="live" + ;; +esac + +# Setting boot method specific variables +case "${LH_BINARY_IMAGES}" in + iso*) + SYSLINUX_PATH="binary/isolinux" + KERNEL_PATH="binary/${INITFS}" + SCREEN_PATH="${SYSLINUX_PATH}" + DATA_PATH="${SCREEN_PATH}" + LIVE_KERNEL_PATH="/${INITFS}" + LIVE_INSTALL_KERNEL_PATH="/install" + LIVE_SCREEN_PATH="/isolinux" + LIVE_DATA_PATH="${LIVE_SCREEN_PATH}" + MEDIA="CD-ROM" + ;; + + net) + SYSLINUX_PATH="tftpboot" + KERNEL_PATH="${SYSLINUX_PATH}/debian-live/${LH_ARCHITECTURE}" + SCREEN_PATH="${SYSLINUX_PATH}/debian-live/${LH_ARCHITECTURE}/boot-screens" + DATA_PATH="${SCREEN_PATH}" + LIVE_KERNEL_PATH="debian-live/${LH_ARCHITECTURE}" + LIVE_INSTALL_KERNEL_PATH="debian-install/${LH_ARCHITECTURE}" + LIVE_SCREEN_PATH="debian-live/${LH_ARCHITECTURE}/boot-screens" + LIVE_DATA_PATH="${LIVE_SCREEN_PATH}" + MEDIA="netboot" + ;; + + usb*|tar) + SYSLINUX_PATH="binary/syslinux" + KERNEL_PATH="binary/${INITFS}" + SCREEN_PATH="${SYSLINUX_PATH}" + DATA_PATH="${SCREEN_PATH}" + LIVE_KERNEL_PATH="/${INITFS}" + LIVE_INSTALL_KERNEL_PATH="/install" + LIVE_SCREEN_PATH="/syslinux" + LIVE_DATA_PATH="${LIVE_SCREEN_PATH}" + MEDIA="hd-media" + ;; +esac + +Check_multiarchitecture + +# Creating directories +mkdir -p "${KERNEL_PATH}" +mkdir -p "${SCREEN_PATH}" +mkdir -p "${DATA_PATH}" + +# Setting boot parameters +case "${LH_ENCRYPTION}" in + ""|false) + ;; + *) + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} encryption=${LH_ENCRYPTION}" + ;; +esac + +if [ -n "${LH_USERNAME}" ] +then + case "${LH_INITRAMFS}" in + casper) + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} username=${LH_USERNAME}" + ;; + + live-initramfs) + if [ "${LH_USERNAME}" != "user" ] + then + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} username=${LH_USERNAME}" + fi + ;; + esac +fi + +if [ -n "${LH_HOSTNAME}" ] +then + case "${LH_INITRAMFS}" in + casper) + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} hostname=${LH_HOSTNAME}" + ;; + + live-initramfs) + if [ "${LH_HOSTNAME}" != "debian" ] + then + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} hostname=${LH_HOSTNAME}" + fi + ;; + esac +fi + +if [ "${LH_UNION_FILESYSTEM}" != "aufs" ] +then + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} union=${LH_UNION_FILESYSTEM}" +fi + +if [ "${LH_EXPOSED_ROOT}" != "false" ] +then + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} exposedroot" +fi + +if [ "${LH_BINARY_IMAGES}" = "net" ] +then + case "${LH_NET_ROOT_FILESYSTEM}" in + nfs) + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} netboot=nfs nfsroot=${LH_NET_ROOT_SERVER}:${LH_NET_ROOT_PATH}" + ;; + + cifs) + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} netboot=cifs nfsroot=//${LH_NET_ROOT_SERVER}${LH_NET_ROOT_PATH}" + ;; + + *) + Echo_error "Unsupported net filesystem" + exit 1 + ;; + esac + + if [ -n "${LH_NET_ROOT_MOUNTOPTIONS}" ] + then + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} nfsopts=${LH_NET_ROOT_MOUNTOPTIONS}" + fi +fi + +if [ -n "${LH_NET_COW_PATH}" ] +then + case "${LH_NET_COW_FILESYSTEM}" in + nfs) + if [ -n "${LH_NET_COW_MOUNTOPTIONS}" ] + then + LH_NET_COW_MOUNTOPTIONS=",${LH_NET_COW_MOUNTOPTIONS}" + fi + + LH_BOOTAPPEND_LIVE="${LH_BOOTAPPEND_LIVE} nfscow=${LH_NET_COW_SERVER}:${LH_NET_COW_PATH}${LH_NET_COW_MOUNTOPTIONS}" + ;; + + *) + Echo_error "Unsupported net filesystem" + exit 1 + ;; + esac +fi + +LH_BOOTAPPEND_LIVE="$(echo ${LH_BOOTAPPEND_LIVE} | sed -e 's| ||')" + +# Parameters are listed at: linux/Documentation/kernel-parameters.txt +FAILSAFE="noapic noapm nodma nomce nolapic nomodeset nosmp vga=normal" + +# Moving kernels into place +if [ "binary/${INITFS}" != "${KERNEL_PATH}" ] +then + mv binary/${INITFS}/vmlinuz* ${KERNEL_PATH} + mv binary/${INITFS}/initrd* ${KERNEL_PATH} + + if [ "${LH_MEMTEST}" != "false" ] && [ "${LH_MEMTEST}" != "none" ] + then + mv binary/${INITFS}/memtest ${KERNEL_PATH} + fi +fi + +# Default entries +DEFAULT_FLAVOUR="$(echo ${LH_LINUX_FLAVOURS} | awk '{ print $1 }')" +DEFAULT_KERNEL="$(basename chroot/boot/vmlinuz-*${DEFAULT_FLAVOUR})" +DEFAULT_INITRD="initrd.img-$(echo ${DEFAULT_KERNEL} | sed -e 's|vmlinuz-||')" + +Syslinux_live_entry "live" "${LH_SYSLINUX_MENU_LIVE_ENTRY}" "${DEFAULT_KERNEL}" "${DEFAULT_INITRD}" + +if [ "$(echo ${LH_LINUX_FLAVOURS} | wc -w)" -gt "1" ] +then + for FLAVOUR in ${LH_LINUX_FLAVOURS} + do + if [ "${FLAVOUR}" != "${DEFAULT_FLAVOUR}" ] + then + FLAVOUR_KERNEL="$(basename chroot/boot/vmlinuz-*${FLAVOUR})" + FLAVOUR_INITRD="initrd.img-$(echo ${FLAVOUR_KERNEL} | sed -e 's|vmlinuz-||')" + Syslinux_live_entry "live-${FLAVOUR}" "${LH_SYSLINUX_MENU_LIVE_ENTRY} ${FLAVOUR}" "${FLAVOUR_KERNEL}" "${FLAVOUR_INITRD}" + fi + done +fi + +# Only needed for non-vesamenu, non-gfxboot syslinux +case "${LH_SYSLINUX_MENU}" in + false|menu) + # Adding syslinux hardcoded default label entry + Syslinux_live_entry "linux" "" "${DEFAULT_KERNEL}" "${DEFAULT_INITRD}" + ;; +esac + +# Assembling debian-installer configuration +if [ "${LH_DEBIAN_INSTALLER}" != "false" ] +then + VMLINUZ_DI="vmlinuz" + INITRD_DI="initrd.gz" + APPEND_DI="vga=normal" + + VMLINUZ_GI="gtk/vmlinuz" + INITRD_GI="gtk/initrd.gz" + APPEND_GI="video=vesa:ywrap,mtrr vga=788" + + if [ -f "binary/${LIVE_INSTALL_KERNEL_PATH}/${VMLINUZ_DI}" ] && [ -f "binary/${LIVE_INSTALL_KERNEL_PATH}/${INITRD_DI}" ] + then + Syslinux_install_entry "Text" "${VMLINUZ_DI}" "${INITRD_DI}" "${APPEND_DI}" + fi + + if [ -f "binary/${LIVE_INSTALL_KERNEL_PATH}/${VMLINUZ_GI}" ] && [ -f "binary/${LIVE_INSTALL_KERNEL_PATH}/${INITRD_GI}" ] + then + Syslinux_install_entry "GUI" "${VMLINUZ_GI}" "${INITRD_GI}" "${APPEND_GI}" + fi +fi + +# Assembling memtest configuration +if [ -f "${KERNEL_PATH}"/memtest ] +then + Syslinux_memtest_entry "memtest" "${LH_SYSLINUX_MENU_MEMTEST_ENTRY}" "memtest" +fi + +# Copy templates to base syslinux directory +Copy_syslinux_templates + +# Fill in templates with created values +Configure_syslinux_templates + +# Configure syslinux setup per boot method +case "${LH_BINARY_IMAGES}" in + iso*) + case "${LH_BUILD_WITH_CHROOT}" in + true) + cp chroot/usr/lib/syslinux/isolinux.bin ${SCREEN_PATH} + ;; + false) + cp /usr/lib/syslinux/isolinux.bin ${SCREEN_PATH} + ;; + esac + + mv ${SCREEN_PATH}/syslinux.cfg ${SCREEN_PATH}/isolinux.cfg + + # Copying configuration file + if [ -n "${LH_SYSLINUX_CFG}" ] + then + cp "${LH_SYSLINUX_CFG}" ${SCREEN_PATH}/isolinux.cfg + fi + ;; + + net) + case "${LH_BUILD_WITH_CHROOT}" in + true) + cp chroot/usr/lib/syslinux/pxelinux.0 ${KERNEL_PATH} + ;; + false) + cp /usr/lib/syslinux/pxelinux.0 ${KERNEL_PATH} + ;; + esac + + mkdir -p ${KERNEL_PATH}/pxelinux.cfg + ln -s ${LIVE_KERNEL_PATH}/pxelinux.cfg ${SYSLINUX_PATH}/pxelinux.cfg + ln -s ${LIVE_KERNEL_PATH}/pxelinux.0 ${SYSLINUX_PATH}/pxelinux.0 + + # Adjusting include pathes + for FILE in ${SCREEN_PATH}/*.cfg + do + sed -i -e "s|^include |include ${LIVE_SCREEN_PATH}/|g" "${FILE}" + done + + sed -i -e "s| f| ${LIVE_SCREEN_PATH}/f|g" ${SCREEN_PATH}/prompt.cfg + + mv ${SCREEN_PATH}/syslinux.cfg ${KERNEL_PATH}/pxelinux.cfg/default + + # Copying configuration file + if [ -n "${LH_SYSLINUX_CFG}" ] + then + cp "${LH_SYSLINUX_CFG}" ${KERNEL_PATH}/pxelinux.cfg/default + fi + ;; + + usb*|tar) + case "${LH_BUILD_WITH_CHROOT}" in + true) + cp chroot/usr/lib/syslinux/isolinux.bin ${SCREEN_PATH}/syslinux.bin + ;; + false) + cp /usr/lib/syslinux/isolinux.bin ${SCREEN_PATH}/syslinux.bin + ;; + esac + + # Copying configuration file + if [ -n "${LH_SYSLINUX_CFG}" ] + then + cp "${LH_SYSLINUX_CFG}" ${SCREEN_PATH}/syslinux.cfg + fi + ;; +esac + +# Saving cache +Save_cache cache/packages_binary + +# Removing depends +Remove_package + +# Creating stage file +Create_stagefile .stage/binary_syslinux |