From d98b500c721b2bd5319d84f1e38a2e54db043834 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 30 Mar 2012 09:59:59 +0200 Subject: [PATCH] Replacing live-boot initscript with a stub and moving the actual code to /lib/live/boot.sh to allow different initsystem support in future. --- Makefile | 7 ++ bin/boot.sh | 233 ++++++++++++++++++++++++++++++++++++++++++++ debian/live-boot.init | 248 ++++------------------------------------------- debian/live-boot.install | 1 + 4 files changed, 258 insertions(+), 231 deletions(-) create mode 100644 bin/boot.sh diff --git a/Makefile b/Makefile index ec67501..ce0262b 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,9 @@ build: install: # Installing executables + mkdir -p $(DESTDIR)/lib/live + cp bin/boot.sh $(DESTDIR)/lib/live + mkdir -p $(DESTDIR)/sbin cp bin/live-new-uuid bin/live-snapshot bin/live-swapfile $(DESTDIR)/sbin @@ -77,6 +80,10 @@ install: uninstall: # Uninstalling executables + rm -f $(DESTDIR)/lib/live/boot.sh + rmdir --ignore-fail-on-non-empty $(DESTDIR)/lib/live > /dev/null 2>&1 || true + rmdir --ignore-fail-on-non-empty $(DESTDIR)/lib > /dev/null 2>&1 || true + rm -f $(DESTDIR)/sbin/live-snapshot $(DESTDIR)/sbin/live-swapfile rmdir --ignore-fail-on-non-empty $(DESTDIR)/sbin > /dev/null 2>&1 || true diff --git a/bin/boot.sh b/bin/boot.sh new file mode 100644 index 0000000..64763d0 --- /dev/null +++ b/bin/boot.sh @@ -0,0 +1,233 @@ +#!/bin/sh + +PATH=/usr/sbin:/usr/bin:/sbin:/bin +NAME=live-boot +SCRIPTNAME=/etc/init.d/${NAME} +DO_SNAPSHOT=/sbin/live-snapshot +SNAPSHOT_CONF="/etc/live/boot.d/snapshot.conf" + +# Exit if system was not booted by live-boot +grep -qs boot=live /proc/cmdline || exit 0 + +# Read snapshot configuration variables +[ -r ${SNAPSHOT_CONF} ] && . ${SNAPSHOT_CONF} + +# Load the VERBOSE setting and other rcS variables +[ -f /etc/default/rcS ] && . /etc/default/rcS + +# Define LSB log_* functions. +# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. +. /lib/lsb/init-functions + +# Try to cache everything we're likely to need after ejecting. This +# is fragile and simple-minded, but our options are limited. +cache_path() +{ + path="${1}" + + if [ -d "${path}" ] + then + find "${path}" -type f | xargs cat > /dev/null 2>&1 + elif [ -f "${path}" ] + then + if file -L "${path}" | grep -q 'dynamically linked' + then + # ldd output can be of three forms: + # 1. linux-vdso.so.1 => (0x00007fffe3fb4000) + # This is a virtual, kernel shared library and we want to skip it + # 2. libc.so.6 => /lib/libc.so.6 (0x00007f5e9dc0c000) + # We want to cache the third word. + # 3. /lib64/ld-linux-x86-64.so.2 (0x00007f5e9df8b000) + # We want to cache the first word. + ldd "${path}" | while read line + do + if echo "$line" | grep -qs ' => ' + then + continue + elif echo "$line" | grep -qs ' => ' + then + lib=$(echo "${line}" | awk '{ print $3 }') + else + lib=$(echo "${line}" | awk '{ print $1 }') + fi + cache_path "${lib}" + done + fi + + cat "${path}" >/dev/null 2>&1 + fi +} + +get_boot_device() +{ + # search in /proc/mounts for the device that is mounted at /live/image + while read DEVICE MOUNT REST + do + if [ "${MOUNT}" = "/live/image" ] + then + echo "${DEVICE}" + exit 0 + fi + done < /proc/mounts +} + +device_is_USB_flash_drive() +{ + # remove leading "/dev/" and all trailing numbers from input + DEVICE=$(expr substr ${1} 6 3) + + # check that device starts with "sd" + [ "$(expr substr ${DEVICE} 1 2)" != "sd" ] && return 1 + + # check that the device is an USB device + if readlink /sys/block/${DEVICE} | grep -q usb + then + return 0 + fi + + return 1 +} + +do_stop () +{ + if ! grep -qs nopersistent /proc/cmdline && grep -qs persistent /proc/cmdline + then + # ROOTSNAP and HOMESNAP are defined in ${SNAPSHOT_CONF} file + if [ ! -z "${ROOTSNAP}" ] + then + ${DO_SNAPSHOT} --resync-string="${ROOTSNAP}" + fi + + if [ ! -z "${HOMESNAP}" ] + then + ${DO_SNAPSHOT} --resync-string="${HOMESNAP}" + fi + fi + + # check for netboot + if [ ! -z "${NETBOOT}" ] || grep -qs netboot /proc/cmdline || grep -qsi root=/dev/nfs /proc/cmdline || grep -qsi root=/dev/cifs /proc/cmdline + then + return 0 + fi + + # check for toram + if grep -qs toram /proc/cmdline + then + return 0 + fi + + # Don't prompt to eject the SD card on Babbage board, where we reuse it + # as a quasi-boot-floppy. Technically this uses a bit of ubiquity + # (archdetect), but since this is mostly only relevant for + # installations, who cares ... + if type archdetect >/dev/null 2>&1 + then + subarch="$(archdetect)" + + case $subarch in + arm*/imx51) + return 0 + ;; + esac + fi + + prompt=1 + if [ "${NOPROMPT}" = "Yes" ] + then + prompt= + fi + + for path in $(which halt) $(which reboot) /etc/rc?.d /etc/default $(which stty) /bin/plymouth + do + cache_path "${path}" + done + + for x in $(cat /proc/cmdline) + do + case ${x} in + quickreboot) + QUICKREBOOT="Yes" + ;; + esac + done + + mount -o remount,ro /live/cow + + if [ -z ${QUICKREBOOT} ] + then + + # Exit if the system was booted from an ISO image rather than a physical CD + grep -qs find_iso= /proc/cmdline && return 0 + # TODO: i18n + BOOT_DEVICE="$(get_boot_device)" + + if device_is_USB_flash_drive ${BOOT_DEVICE} + then + # do NOT eject USB flash drives! + # otherwise rebooting with most USB flash drives + # failes because they actually remember the + # "ejected" state even after reboot + MESSAGE="Please remove the USB flash drive" + + if [ "${NOPROMPT}" = "usb" ] + then + prompt= + fi + + else + # ejecting is a very good idea here + MESSAGE="Please remove the disc, close the tray (if any)" + + if [ -x /usr/bin/eject ] + then + eject -p -m /live/image >/dev/null 2>&1 + fi + + if [ "${NOPROMPT}" = "cd" ] + then + prompt= + fi + + fi + + [ "$prompt" ] || return 0 + + if [ -x /bin/plymouth ] && plymouth --ping + then + plymouth message --text="${MESSAGE} and press ENTER to continue:" + plymouth watch-keystroke > /dev/null + else + stty sane < /dev/console + + printf "\n\n${MESSAGE} and press ENTER to continue:" > /dev/console + + read x < /dev/console + fi + fi +} + +case "${1}" in + start|restart|reload|force-reload|status) + [ "${VERBOSE}" != no ] && log_end_msg 0 || exit 0 + ;; + + stop) + log_begin_msg "${NAME} is resyncing snapshots and caching reboot files..." + do_stop + + case "${?}" in + 0|1) + [ "${VERBOSE}" != no ] && log_end_msg 0 || exit 0 + ;; + + 2) + [ "${VERBOSE}" != no ] && log_end_msg 1 || exit 1 + ;; + esac + ;; + + *) + log_success_msg "Usage: ${SCRIPTNAME} {start|stop|restart|force-reload}" >&2 + exit 3 + ;; +esac diff --git a/debian/live-boot.init b/debian/live-boot.init index fb6f662..373df1b 100644 --- a/debian/live-boot.init +++ b/debian/live-boot.init @@ -1,250 +1,36 @@ #!/bin/sh +## live-boot contains the scripts that configure a Debian Live system during +## the boot process (early userspace). +## +## This is the sysvinit script for live-boot. + + ### BEGIN INIT INFO # Provides: live-boot # Required-Start: $syslog bootmisc # Required-Stop: # Should-Start: $local_fs # Should-Stop: halt reboot -# X-Stop-After: umountroot # Default-Start: S # Default-Stop: 0 6 -# Short-Description: live-boot init script -# Description: Resyncs snapshots, evantually caches files in order to -# let remove the media. +# Short-Description: Debian Live - System Configuration Scripts +# Description: live-boot contains the scripts that configure a Debian +# Live system during the boot process (early userspace). +# X-Start-Before: +# X-Stop-After: umountroot +# X-Interactive: true ### END INIT INFO -# Authors: Tollef Fog Heen -# Marco Amadori - -PATH=/usr/sbin:/usr/bin:/sbin:/bin -NAME=live-boot -SCRIPTNAME=/etc/init.d/${NAME} -DO_SNAPSHOT=/sbin/live-snapshot -SNAPSHOT_CONF="/etc/live/boot.d/snapshot.conf" - -# Exit if system was not booted by live-boot -grep -qs boot=live /proc/cmdline || exit 0 - -# Read snapshot configuration variables -[ -r ${SNAPSHOT_CONF} ] && . ${SNAPSHOT_CONF} - -# Load the VERBOSE setting and other rcS variables -[ -f /etc/default/rcS ] && . /etc/default/rcS - -# Define LSB log_* functions. -# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. -. /lib/lsb/init-functions - -# Try to cache everything we're likely to need after ejecting. This -# is fragile and simple-minded, but our options are limited. -cache_path() -{ - path="${1}" - - if [ -d "${path}" ] - then - find "${path}" -type f | xargs cat > /dev/null 2>&1 - elif [ -f "${path}" ] - then - if file -L "${path}" | grep -q 'dynamically linked' - then - # ldd output can be of three forms: - # 1. linux-vdso.so.1 => (0x00007fffe3fb4000) - # This is a virtual, kernel shared library and we want to skip it - # 2. libc.so.6 => /lib/libc.so.6 (0x00007f5e9dc0c000) - # We want to cache the third word. - # 3. /lib64/ld-linux-x86-64.so.2 (0x00007f5e9df8b000) - # We want to cache the first word. - ldd "${path}" | while read line - do - if echo "$line" | grep -qs ' => ' - then - continue - elif echo "$line" | grep -qs ' => ' - then - lib=$(echo "${line}" | awk '{ print $3 }') - else - lib=$(echo "${line}" | awk '{ print $1 }') - fi - cache_path "${lib}" - done - fi - - cat "${path}" >/dev/null 2>&1 - fi -} - -get_boot_device() -{ - # search in /proc/mounts for the device that is mounted at /live/image - while read DEVICE MOUNT REST - do - if [ "${MOUNT}" = "/live/image" ] - then - echo "${DEVICE}" - exit 0 - fi - done < /proc/mounts -} - -device_is_USB_flash_drive() -{ - # remove leading "/dev/" and all trailing numbers from input - DEVICE=$(expr substr ${1} 6 3) - - # check that device starts with "sd" - [ "$(expr substr ${DEVICE} 1 2)" != "sd" ] && return 1 - - # check that the device is an USB device - if readlink /sys/block/${DEVICE} | grep -q usb - then - return 0 - fi - - return 1 -} - -do_stop () -{ - if ! grep -qs nopersistent /proc/cmdline && grep -qs persistent /proc/cmdline - then - # ROOTSNAP and HOMESNAP are defined in ${SNAPSHOT_CONF} file - if [ ! -z "${ROOTSNAP}" ] - then - ${DO_SNAPSHOT} --resync-string="${ROOTSNAP}" - fi - - if [ ! -z "${HOMESNAP}" ] - then - ${DO_SNAPSHOT} --resync-string="${HOMESNAP}" - fi - fi - - # check for netboot - if [ ! -z "${NETBOOT}" ] || grep -qs netboot /proc/cmdline || grep -qsi root=/dev/nfs /proc/cmdline || grep -qsi root=/dev/cifs /proc/cmdline - then - return 0 - fi - - # check for toram - if grep -qs toram /proc/cmdline - then - return 0 - fi - - # Don't prompt to eject the SD card on Babbage board, where we reuse it - # as a quasi-boot-floppy. Technically this uses a bit of ubiquity - # (archdetect), but since this is mostly only relevant for - # installations, who cares ... - if type archdetect >/dev/null 2>&1 - then - subarch="$(archdetect)" - - case $subarch in - arm*/imx51) - return 0 - ;; - esac - fi - - prompt=1 - if [ "${NOPROMPT}" = "Yes" ] - then - prompt= - fi - - for path in $(which halt) $(which reboot) /etc/rc?.d /etc/default $(which stty) /bin/plymouth - do - cache_path "${path}" - done - - for x in $(cat /proc/cmdline) - do - case ${x} in - quickreboot) - QUICKREBOOT="Yes" - ;; - esac - done - - mount -o remount,ro /live/cow - - if [ -z ${QUICKREBOOT} ] - then - - # Exit if the system was booted from an ISO image rather than a physical CD - grep -qs find_iso= /proc/cmdline && return 0 - # TODO: i18n - BOOT_DEVICE="$(get_boot_device)" - - if device_is_USB_flash_drive ${BOOT_DEVICE} - then - # do NOT eject USB flash drives! - # otherwise rebooting with most USB flash drives - # failes because they actually remember the - # "ejected" state even after reboot - MESSAGE="Please remove the USB flash drive" - - if [ "${NOPROMPT}" = "usb" ] - then - prompt= - fi - - else - # ejecting is a very good idea here - MESSAGE="Please remove the disc, close the tray (if any)" - - if [ -x /usr/bin/eject ] - then - eject -p -m /live/image >/dev/null 2>&1 - fi - - if [ "${NOPROMPT}" = "cd" ] - then - prompt= - fi - - fi - - [ "$prompt" ] || return 0 - - if [ -x /bin/plymouth ] && plymouth --ping +case "${1}" in + stop) + if [ -e /lib/live/boot.sh ] then - plymouth message --text="${MESSAGE} and press ENTER to continue:" - plymouth watch-keystroke > /dev/null - else - stty sane < /dev/console - - printf "\n\n${MESSAGE} and press ENTER to continue:" > /dev/console - - read x < /dev/console + /lib/live/boot.sh fi - fi -} - -case "${1}" in - start|restart|reload|force-reload|status) - [ "${VERBOSE}" != no ] && log_end_msg 0 || exit 0 ;; - stop) - log_begin_msg "${NAME} is resyncing snapshots and caching reboot files..." - do_stop - - case "${?}" in - 0|1) - [ "${VERBOSE}" != no ] && log_end_msg 0 || exit 0 - ;; - - 2) - [ "${VERBOSE}" != no ] && log_end_msg 1 || exit 1 - ;; - esac - ;; + start|force-reload|restart) - *) - log_success_msg "Usage: ${SCRIPTNAME} {start|stop|restart|force-reload}" >&2 - exit 3 ;; esac diff --git a/debian/live-boot.install b/debian/live-boot.install index 79474ce..85134eb 100644 --- a/debian/live-boot.install +++ b/debian/live-boot.install @@ -1,2 +1,3 @@ +lib sbin usr/share/live-boot -- 2.1.4