#!/bin/sh ## live-build(7) - System Build Scripts ## Copyright (C) 2006-2010 Daniel Baumann ## ## live-build 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 . "${LB_BASE:-/usr/share/live/build}"/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 [ "${LB_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}" # Boot in quiet mode where appropriate QAPPEND="quiet" case "${LB_BINARY_IMAGES}" in iso*|usb*) if [ "${LABEL}" = "live" ] then # Do not number the default kernel / initrd files. _NUMBER="" else # Use order of flavours in LB_LINUX_FLAVOURS for numbering. _NUMBER="$(echo ${LB_LINUX_FLAVOURS} | awk -v FLAVOUR="${FLAVOUR}" 'BEGIN{RS=" "} {if($1 == FLAVOUR) print NR}')" fi if [ -e ${KERNEL_PATH}/${KERNEL} ] then # Note: ISOLINUX will not find the kernel if the name ends in ".img". 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} config ${LB_BOOTAPPEND_LIVE} ${APPEND} ${QAPPEND}\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} config ${LB_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} ${LB_BOOTAPPEND_INSTALL}\n" done } Copy_syslinux_templates () { cp -r "${TEMPLATES}"/common/* ${SCREEN_PATH} if [ "${LB_SYSLINUX_MENU}" = "false" ] then cp -r "${TEMPLATES}"/normal/* ${SCREEN_PATH} else cp -r "${TEMPLATES}"/menu/* ${SCREEN_PATH} case "${LB_SYSLINUX_MENU}" in gfxboot) MENUMODULE="gfxboot.c32" ;; menu) MENUMODULE="menu.c32" ;; vesamenu) MENUMODULE="vesamenu.c32" ;; *) if [ -z "${LB_SYSLINUX_CFG}" ] then MENUMODULE=$(grep 'menu.c32' ${TEMPLATES}/menu/syslinux.cfg | sed 's|default\s*.*/\(.*menu.c32\)$|\1|g') else LB_SYSLINUX_CFG="${LB_SYSLINUX_CFG:-${TEMPLATES}/menu/syslinux.cfg}" fi ;; esac case "${LB_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}/${LB_LANGUAGE}"/* > /dev/null 2>&1 then cp -r "${TEMPLATES}"/"${LB_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 [ "${LB_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 "${LB_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 [ "${LB_SYSLINUX_MENU}" != "false" ] then rm -f ${DATA_PATH}/boot.txt fi # Copying custom splash screen if [ "${LB_SYSLINUX_SPLASH}" = "none" ] then # no splash screen SPLASH="" rm -f ${SCREEN_PATH}/splash.rle rm -f ${DATA_PATH}/splash.png else if [ "${LB_SYSLINUX_MENU}" = "false" ] then SPLASH="${LIVE_DATA_PATH}/splash.rle" else SPLASH="${LIVE_DATA_PATH}/splash.png" fi if [ -n "${LB_SYSLINUX_SPLASH}" ] then if [ ! -e "${LB_SYSLINUX_SPLASH}" ] then Echo_error "%s doen't exist" "${LB_SYSLINUX_SPLASH}" exit 1 else rm -f ${SCREEN_PATH}/splash.rle rm -f ${DATA_PATH}/splash.png cp -f "${LB_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|{\$LB_DISTRIBUTION}|${LB_DISTRIBUTION}|" \ -e "s|{\$LB_DATE}|$(date +%Y%m%d)|" \ -e "s|{\$LB_MEDIA}|${MEDIA}|" \ -e "s|{\$LB_VERSION}|${VERSION}|" \ -e "s|{\$LB_SYSLINUX_TIMEOUT}|${LB_SYSLINUX_TIMEOUT}0|" \ $template_file done case "${LB_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 "${LB_INITRAMFS}" in casper) INITFS="casper" ;; live-initramfs|live-boot) INITFS="live" ;; esac # Setting boot method specific variables case "${LB_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/${LB_ARCHITECTURE}" SCREEN_PATH="${SYSLINUX_PATH}/debian-live/${LB_ARCHITECTURE}/boot-screens" DATA_PATH="${SCREEN_PATH}" LIVE_KERNEL_PATH="debian-live/${LB_ARCHITECTURE}" LIVE_INSTALL_KERNEL_PATH="debian-install/${LB_ARCHITECTURE}" LIVE_SCREEN_PATH="debian-live/${LB_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 "${LB_ENCRYPTION}" in ""|false) ;; *) LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} encryption=${LB_ENCRYPTION}" ;; esac if [ -n "${LB_USERNAME}" ] then case "${LB_INITRAMFS}" in casper) LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} username=${LB_USERNAME}" ;; live-initramfs|live-boot) if [ "${LB_USERNAME}" != "user" ] then LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} username=${LB_USERNAME}" fi ;; esac fi if [ -n "${LB_HOSTNAME}" ] then case "${LB_INITRAMFS}" in casper) LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} hostname=${LB_HOSTNAME}" ;; live-initramfs|live-boot) if [ "${LB_HOSTNAME}" != "debian" ] then LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} hostname=${LB_HOSTNAME}" fi ;; esac fi if [ "${LB_UNION_FILESYSTEM}" != "aufs" ] then LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} union=${LB_UNION_FILESYSTEM}" fi if [ "${LB_EXPOSED_ROOT}" != "false" ] then LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} exposedroot" fi if [ "${LB_BINARY_IMAGES}" = "net" ] then case "${LB_NET_ROOT_FILESYSTEM}" in nfs) LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} netboot=nfs nfsroot=${LB_NET_ROOT_SERVER}:${LB_NET_ROOT_PATH}" ;; cifs) LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} netboot=cifs nfsroot=//${LB_NET_ROOT_SERVER}${LB_NET_ROOT_PATH}" ;; *) Echo_error "Unsupported net filesystem" exit 1 ;; esac if [ -n "${LB_NET_ROOT_MOUNTOPTIONS}" ] then LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} nfsopts=${LB_NET_ROOT_MOUNTOPTIONS}" fi fi if [ -n "${LB_NET_COW_PATH}" ] then case "${LB_NET_COW_FILESYSTEM}" in nfs) if [ -n "${LB_NET_COW_MOUNTOPTIONS}" ] then LB_NET_COW_MOUNTOPTIONS=",${LB_NET_COW_MOUNTOPTIONS}" fi LB_BOOTAPPEND_LIVE="${LB_BOOTAPPEND_LIVE} nfscow=${LB_NET_COW_SERVER}:${LB_NET_COW_PATH}${LB_NET_COW_MOUNTOPTIONS}" ;; *) Echo_error "Unsupported net filesystem" exit 1 ;; esac fi LB_BOOTAPPEND_LIVE="$(echo ${LB_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 [ "${LB_MEMTEST}" != "false" ] && [ "${LB_MEMTEST}" != "none" ] then mv binary/${INITFS}/memtest ${KERNEL_PATH} fi 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-||')" Syslinux_live_entry "live" "${LB_SYSLINUX_MENU_LIVE_ENTRY}" "${DEFAULT_KERNEL}" "${DEFAULT_INITRD}" if [ "$(echo ${LB_LINUX_FLAVOURS} | wc -w)" -gt "1" ] then for FLAVOUR in ${LB_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}" "${LB_SYSLINUX_MENU_LIVE_ENTRY} ${FLAVOUR}" "${FLAVOUR_KERNEL}" "${FLAVOUR_INITRD}" fi done fi # Only needed for non-vesamenu, non-gfxboot syslinux case "${LB_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 [ "${LB_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" "${LB_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 "${LB_BINARY_IMAGES}" in iso*) case "${LB_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 "${LB_SYSLINUX_CFG}" ] then cp "${LB_SYSLINUX_CFG}" ${SCREEN_PATH}/isolinux.cfg fi ;; net) case "${LB_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 "${LB_SYSLINUX_CFG}" ] then cp "${LB_SYSLINUX_CFG}" ${KERNEL_PATH}/pxelinux.cfg/default fi ;; usb*|tar) case "${LB_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 "${LB_SYSLINUX_CFG}" ] then cp "${LB_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