Ok, looking at a Live USB I find that this /etc/init.d script does the actual CD eject:
Code:
#! /bin/sh
### BEGIN INIT INFO
# Provides: casper
# Required-Start: $syslog
# Required-Stop:
# Should-Start: $local_fs
# Should-Stop: halt reboot
# X-Stop-After: umountroot
# Default-Start:
# Default-Stop: 0 6
# Short-Description: Casper init script
# Description: Resyncs snapshots, evantually caches files in order
# to let remove the media.
### END INIT INFO
# Author: Tollef Fog Heen <tfheen@canonical.com>
# Marco Amadori <marco.amadori@gmail.com>
#
PATH=/usr/sbin:/usr/bin:/sbin:/bin
NAME=casper
SCRIPTNAME=/etc/init.d/${NAME}
DO_SNAPSHOT=/sbin/${NAME}-snapshot
# Exit if system was not booted by casper
grep -qs boot=casper /proc/cmdline || exit 0
# Exit if the system was booted from an ISO image rather than a physical CD
grep -qs find_iso= /proc/cmdline && exit 0
# Read configuration variable file if it is present
[ -r /etc/$NAME.conf ] && . /etc/$NAME.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 [ -x "$path" ]; then
if file "$path" | grep -q 'dynamically linked'; then
for lib in $(ldd "$path" | awk '{ print $3 }'); do
cache_path "$lib"
done
fi
fi
cat "$path" >/dev/null 2>&1
fi
}
do_stop ()
{
if [ ! -z "${ROOTSNAP}" ]; then
$DO_SNAPSHOT --resync-string="${ROOTSNAP}"
fi
if [ ! -z "${HOMESNAP}" ]; then
$DO_SNAPSHOT --resync-string="${HOMESNAP}"
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
# 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 grep -qs noprompt /proc/cmdline; then
prompt=
fi
for path in $(which halt) $(which reboot) /etc/rc?.d /etc/default $(which stty) /bin/plymouth /sbin/usplash_write; do
cache_path "$path"
done
eject -p -m /cdrom >/dev/null 2>&1
[ "$prompt" ] || return 0
# XXX - i18n
MSG="Please remove the disc and close the tray (if any) then press ENTER: "
if [ -x /bin/plymouth ] && plymouth --ping; then
plymouth message --text="$MSG"
plymouth watch-keystroke > /dev/null
else
stty sane < /dev/console
echo $MSG > /dev/console
if [ -x /sbin/usplash_write ]; then
/sbin/usplash_write "TIMEOUT 86400"
/sbin/usplash_write "TEXT-URGENT Please remove the disc, close the tray (if any)"
/sbin/usplash_write "TEXT-URGENT and press ENTER to continue"
fi
read x < /dev/console
fi
}
case "$1" in
restart|reload|force-reload|status)
[ "$VERBOSE" != no ] && log_end_msg 0
;;
# We normally run on start; stop is just for backwards compatibility.
start|stop)
log_begin_msg "${NAME} is resyncing snapshots and caching reboot files..."
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
*)
log_success_msg "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac
You can see the tests done for either command line strings or for architecture types, you may have to somehow munge something to avoid the eject code.
I would try adding the string "netboott" (deliberately misspelt) to the command line in the hope that it triggers the exit before the eject command without actually trying to do a netboot.
Bookmarks