# set -e
-export PATH=/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:/usr/bin:/usr/sbin:/bin:/sbin
+export PATH="/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:/usr/bin:/usr/sbin:/bin:/sbin"
echo "/root/lib" >> /etc/ld.so.conf
echo "/root/usr/lib" >> /etc/ld.so.conf
-mountpoint=/cdrom
+mountpoint="/live/image"
+LIVE_MEDIA_PATH="live"
-USERNAME=user
-USERFULLNAME="Live session user"
-HOST=live
-BUILD_SYSTEM=Custom
+root_persistence="live-rw"
+home_persistence="home-rw"
+root_snapshot_label="live-sn"
+home_snapshot_label="home-sn"
-mkdir -p $mountpoint
+USERNAME="user"
+USERFULLNAME="Live user"
+HOSTNAME="host"
+BUILD_SYSTEM="Custom"
+
+mkdir -p "${mountpoint}"
[ -f /etc/live.conf ] && . /etc/live.conf
-export USERNAME USERFULLNAME HOST BUILD_SYSTEM
+export USERNAME USERFULLNAME HOSTNAME BUILD_SYSTEM
. /scripts/live-helpers
touch /live.vars
fi
-is_casper_path() {
- path=$1
- if [ -d "$path/live" ]; then
- if [ "$(echo $path/live/*.squashfs)" != "$path/live/*.squashfs" ] ||
- [ "$(echo $path/live/*.ext2)" != "$path/live/*.ext2" ] ||
- [ "$(echo $path/live/*.dir)" != "$path/live/*.dir" ]; then
- return 0
- fi
- fi
- return 1
+Arguments ()
+{
+ PRESEEDS=""
+
+ for ARGUMENT in `cat /proc/cmdline`
+ do
+ case "${ARGUMENT}" in
+ access=*)
+ ACCESS="${ARGUMENT#access=}"
+ export ACCESS
+ ;;
+
+ console=*)
+ DEFCONSOLE="${ARGUMENT#*=}"
+ export DEFCONFSOLE
+ ;;
+
+ debug)
+ DEBUG="Yes"
+ export DEBUG
+
+ set -x
+ ;;
+
+ fetch=*)
+ FETCH="${ARGUMENT#fetch=}"
+ export FETCH
+ ;;
+
+ hostname=*)
+ HOSTNAME="${ARGUMENT#hostname=}"
+ LIVECONF="changed"
+ export HOSTNAME LIVECONF
+ ;;
+
+ username=*)
+ USERNAME="${ARGUMENT#username=}"
+ LIVECONF="changed"
+ export USERNAME LIVECONF
+ ;;
+
+ userfullname=*)
+ USERFULLNAME="${ARGUMENT#userfullname=}"
+ LIVECONF="changed"
+ export USERFULLNAME LIVECONF
+ ;;
+
+ ip=*)
+ STATICIP="${ARGUMENT#ip=}"
+
+ if [ -z "${STATICIP}" ]
+ then
+ STATICIP="frommedia"
+ fi
+
+ export STATICIP
+ ;;
+
+ keyb=*|kbd-chooser/method=*)
+ KBD="${ARGUMENT#*=}"
+ export KBD
+ ;;
+
+ klayout=*|console-setup/layoutcode=*)
+ KLAYOUT="${ARGUMENT#*=}"
+ export KLAYOUT
+ ;;
+
+ kvariant=*|console-setup/variantcode=*)
+ KVARIANT="${ARGUMENT#*=}"
+ export KVARIANT
+ ;;
+
+ kmodel=*|console-setup/modelcode=*)
+ KMODEL="${ARGUMENT#*=}"
+ export KMODEL
+ ;;
+
+ koptions=*)
+ KOPTIONS="${ARGUMENT#koptions=}"
+ export KOPTIONS
+ ;;
+
+ live-getty)
+ LIVE_GETTY="1"
+ export LIVE_GETTY
+ ;;
+
+ live-media=*|bootfrom=*)
+ LIVE_MEDIA="${ARGUMENT#*=}"
+ export LIVE_MEDIA
+ ;;
+
+ live-media-encryption=*|encryption=*)
+ LIVE_MEDIA_ENCRYPTION="${ARGUMENT#*=}"
+ export LIVE_MEDIA_ENCRYPTION
+ ;;
+
+ live-media-offset=*)
+ LIVE_MEDIA_OFFSET="${ARGUMENT#live-media-offset=}"
+ export LIVE_MEDIA_OFFSET
+ ;;
+
+ live-media-path=*)
+ LIVE_MEDIA_PATH="${ARGUMENT#live-media-path=}"
+ export LIVE_MEDIA_PATH
+ ;;
+
+ live-media-timeout=*)
+ LIVE_MEDIA_TIMEOUT="${ARGUMENT#live-media-timeout=}"
+ export LIVE_MEDIA_TIMEOUT
+ ;;
+
+ locale=*|debian-installer/locale=*)
+ LOCALE="${ARGUMENT#*=}"
+ export LOCALE
+ ;;
+
+ module=*)
+ MODULE="${ARGUMENT#module=}"
+ export MODULE
+ ;;
+
+ netboot=*)
+ NETBOOT="${ARGUMENT#netboot=}"
+ export NETBOOT
+ ;;
+
+ nfsopts=*)
+ NFSOPTS="${ARGUMENT#nfsopts=}"
+ export NFSOPTS
+ ;;
+
+ noautologin)
+ NOAUTOLOGIN="Yes"
+ export NOAUTOLOGIN
+ ;;
+
+ noxautologin)
+ NOXAUTOLOGIN="Yes"
+ export NOXAUTOLOGIN
+ ;;
+
+ nofastboot)
+ NOFASTBOOT="Yes"
+ export NOFASTBOOT
+ ;;
+
+ nopersistent)
+ PERSISTENT=""
+ export PERSISTENT
+ ;;
+
+ nosudo)
+ NOSUDO="Yes"
+ export NOSUDO
+ ;;
+
+ noswap)
+ NOSWAP="Yes"
+ export NOSWAP
+ ;;
+
+ persistent)
+ PERSISTENT="Yes"
+ export PERSISTENT
+ ;;
+
+ preseed/file=*|file=*)
+ LOCATION="${ARGUMENT#*=}"
+ export LOCATION
+ ;;
+
+ url=*)
+ location="${ARGUMENT#url=}"
+
+ mount -n -o bind /sys /root/sys
+ mount -n -o bind /proc /root/proc
+ mount -n -o bind /dev /root/dev
+
+ mkdir -p /root/var/run/network
+ chroot /root ifup -a
+ chroot /root wget -P /tmp "$location"
+ chroot /root ifdown -a
+
+ umount /root/sys
+ umount /root/proc
+ umount /root/dev
+
+ LOCATION="/tmp/$(basename "$location")"
+ ;;
+
+ */*=*)
+ question="${ARGUMENT%%=*}"
+ value="${ARGUMENT#*=}"
+ PRESEEDS="${PRESEEDS}\"${question}=${value}\" "
+ export PRESEEDS
+ ;;
+
+ showmounts)
+ SHOWMOUNTS="Yes"
+ export SHOWMOUNTS
+ ;;
+
+ timezone=*)
+ TIMEZONE="${ARGUMENT#timezone=}"
+ export TIMEZONE
+ ;;
+
+ todisk=*)
+ TODISK="${ARGUMENT#todisk=}"
+ export TODISK
+ ;;
+
+ toram)
+ TORAM="Yes"
+ export TORAM
+ ;;
+
+ union=*)
+ UNIONTYPE="${ARGUMENT#union=}"
+ export UNIONTYPE
+ ;;
+
+ utc=*)
+ UTC="${ARGUMENT#utc=}"
+ export UTC
+ ;;
+
+ xdebconf)
+ XDEBCONF="Yes"
+ export XDEBCONF
+ ;;
+
+ xvideomode=*)
+ XVIDEOMODE="${ARGUMENT#xvideomode=}"
+ export XVIDEOMODE
+ ;;
+ esac
+ done
+
+ # sort of compatibility with netboot.h from linux docs
+ if [ -z "${NETBOOT}" ]
+ then
+ if [ "${ROOT}" = "/dev/nfs" ]
+ then
+ NETBOOT="nfs"
+ export NETBOOT
+ elif [ "${ROOT}" = "/dev/cifs" ]
+ then
+ NETBOOT="cifs"
+ export NETBOOT
+ fi
+ fi
+
+ if [ -z "${MODULE}" ]
+ then
+ MODULE="filesystem"
+ export MODULE
+ fi
+
+ if [ -z "${UNIONTYPE}" ]
+ then
+ UNIONTYPE="unionfs"
+ export UNIONTYPE
+ fi
+}
+
+is_live_path()
+{
+ DIRECTORY="${1}"
+
+ if [ -d "${DIRECTORY}"/"${LIVE_MEDIA_PATH}" ]
+ then
+ for FILESYSTEM in squashfs ext2 ext3 xfs dir
+ do
+ if [ "`echo ${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}`" != "${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}" ]
+ then
+ return 0
+ fi
+ done
+ fi
+
+ return 1
}
get_backing_device() {
case "$1" in
- *.squashfs|*.ext2)
- echo $(setup_loop "$1" "loop" "/sys/block/loop*")
+ *.squashfs|*.ext2|*.ext3)
+ echo $(setup_loop "$1" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}")
;;
*.dir)
echo "directory"
mount_images_in_directory() {
directory="$1"
rootmnt="$2"
- if match_files_in_dir "$directory/live/*.squashfs" ||
- match_files_in_dir "$directory/live/*.ext2" ||
- match_files_in_dir "$directory/live/*.dir"; then
- setup_unionfs "$directory/live" "$rootmnt"
+
+ if match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.squashfs" ||
+ match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.ext2" ||
+ match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.ext3" ||
+ match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.dir"; then
+ setup_unionfs "$directory/${LIVE_MEDIA_PATH}" "$rootmnt"
else
:
fi
return 1
fi
- # begin copying..
+ # begin copying (or uncompressing)
mkdir "${copyto}"
echo "mount -t ${fstype} ${mount_options} ${dev} ${copyto}"
mount -t "${fstype}" ${mount_options} "${dev}" "${copyto}"
- cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files
- umount ${copyfrom}
- mount -r -o move ${copyto} ${copyfrom}
+
+ if [ "$extension" == "tgz" ]; then
+ cd "${copyto}"
+ tar zxf "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
+ rm -f "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
+ mount -r --move "${copyto}" "${rootmnt}"
+ cd "${OLDPWD}"
+ else
+ cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files
+ umount ${copyfrom}
+ mount -r --move ${copyto} ${copyfrom}
+ fi
rmdir ${copyto}
return 0
}
NFSROOT=${ROOTSERVER}:${ROOTPATH}
fi
+ # source relevant ipconfig output
+ . /tmp/net-${DEVICE}.conf
+ export HOSTNAME
+
+ if [ -n "${FETCH}" ] && do_httpmount; then
+ rc=0
+ return ${rc}
+ fi
+
+ if [ "${NFSROOT#*:}" = "$NFSROOT" ] && [ "$NETBOOT" != "cifs" ]; then
+ NFSROOT=${ROOTSERVER}:${NFSROOT}
+ fi
+
[ "$quiet" != "y" ] && log_begin_msg "Trying netboot from ${NFSROOT}"
if [ "${NETBOOT}" != "nfs" ] && do_cifsmount ; then
return ${rc}
}
+do_httpmount() {
+ rc=1
+ extension=`echo "${FETCH}" | sed 's/\(.*\)\.\(.*\)/\2/'`
+ case "${extension}" in
+ squashfs|tgz|tar)
+ [ "$quiet" != "y" ] && log_begin_msg "Trying wget ${FETCH} -O ${mountpoint}/$(basename ${FETCH})"
+ mkdir -p "${mountpoint}/${LIVE_MEDIA_PATH}"
+ wget "${FETCH}" -O "${mountpoint}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})"
+ [ $? -eq 0 ] && rc=0
+ [ "${extension}" == "tgz" ] && live_dest="ram"
+ ;;
+ *)
+ [ "$quiet" != "y" ] && log_begin_msg "Unrecognized archive extension for ${FETCH}"
+ esac
+ return ${rc}
+}
+
do_nfsmount() {
rc=1
modprobe "${MP_QUIET}" nfs
try_snap ()
{
# Look for $snap_label.* in block devices and copy the contents to $snap_mount
- # and remember the device and filename for resync on exit in casper.init
+ # and remember the device and filename for resync on exit in live-initramfs.init
snap_label="${1}"
snap_mount="${2}"
snap_type="${3}"
- snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2")
+ snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2 ${snap_label}.ext3")
if [ ! -z "${snapdata}" ]; then
snapdev="$(echo ${snapdata} | cut -f1 -d ' ')"
snapback="$(echo ${snapdata} | cut -f2 -d ' ')"
snapfile="$(echo ${snapdata} | cut -f3 -d ' ')"
- if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\)'; then
- # squashfs or ext2 snapshot
+ if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\|ext3\)'; then
+ # squashfs or ext2/ext3 snapshot
dev=$(get_backing_device "${snapback}/${snapfile}")
if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}"; then
log_warning_msg "Impossible to include the ${snapfile} Snapshot"
image_directory="$1"
rootmnt="$2"
- modprobe "${MP_QUIET}" -b unionfs
+ modprobe "${MP_QUIET}" -b ${UNIONTYPE}
# run-init can't deal with images in a subdir, but we're going to
# move all of these away before it runs anyway. No, we're not,
roopt="ro"
fi
+ # Read image names from ${MODULE}.module if it exists
+ if [ -e "${image_directory}/filesystem.${MODULE}.module" ]
+ then
+ for IMAGE in `cat ${image_directory}/filesystem.${MODULE}.module`
+ do
+ image_string="${image_string} ${image_directory}/${image}"
+ done
+ elif [ -e "${image_directory}/${MODULE}.module" ]
+ then
+ for IMAGE in `cat ${image_directory}/${MODULE}.module`
+ do
+ image_string="${image_string} ${image_directory}/${image}"
+ done
+ else
+ # ${MODULE}.module does not exist, create a list of images
+ for FILESYSTEM in squashfs ext2 ext3 xfs dir
+ do
+ for IMAGE in "${image_directory}"/*."${FILESYSTEM}"
+ do
+ if [ -e "${IMAGE}" ]
+ then
+ image_string="${image_string} ${IMAGE}"
+ fi
+ done
+ done
+
+ # Now sort the list
+ image_string="`echo ${image_string} | sed -e 's/ /\n/g' | sort `"
+ fi
+
mkdir -p "${croot}"
- for image_type in "ext2" "squashfs" "dir" ; do
- for image in "${image_directory}"/*."${image_type}"; do
- imagename=$(basename "${image}")
- if [ -d "${image}" ]; then
- # it is a plain directory: do nothing
- rofsstring="${image}=${roopt}:${rofsstring}"
- rofslist="${image} ${rofslist}"
- elif [ -f "${image}" ]; then
- backdev=$(get_backing_device "$image")
- fstype=$(get_fstype "${backdev}")
- if [ "${fstype}" = "unknown" ]; then
- panic "Unknown file system type on ${backdev} (${image})"
- fi
- mkdir -p "${croot}/${imagename}"
- mount -t "${fstype}" -o ro "${backdev}" "${croot}/${imagename}" || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}"
- fi
- done
+ for image in ${image_string}; do
+ imagename=$(basename "${image}")
+ if [ -d "${image}" ]; then
+ # it is a plain directory: do nothing
+ rofsstring="${image}=${roopt}:${rofsstring}"
+ rofslist="${image} ${rofslist}"
+ elif [ -f "${image}" ]; then
+ backdev=$(get_backing_device "$image")
+ fstype=$(get_fstype "${backdev}")
+ if [ "${fstype}" = "unknown" ]; then
+ panic "Unknown file system type on ${backdev} (${image})"
+ fi
+ mkdir -p "${croot}/${imagename}"
+ mount -t "${fstype}" -o ro "${backdev}" "${croot}/${imagename}" || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}"
+ fi
done
rofsstring=${rofsstring%:}
mount ${cowdevice} -t ${cow_fstype} -o rw /cow || panic "Can not mount $cowdevice on /cow"
- mount -t unionfs -o dirs=/cow=rw:$rofsstring unionfs "$rootmnt" || panic "Unionfs mount failed"
+ mount -t ${UNIONTYPE} -o dirs=/cow=rw:$rofsstring ${UNIONTYPE} "$rootmnt" || panic "${UNIONTYPE} mount failed"
# Adding other custom mounts
if [ -n "${PERSISTENT}" ]; then
case d in
*.dir) # do nothing # mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
;;
- *) mount -o move "${d}" "${rootmnt}/live/${d##*/}"
+ *) mount --move "${d}" "${rootmnt}/live/${d##*/}"
;;
esac
done
- # shows cow fs on /cow for use by live-snapshot
- mkdir -p "${rootmnt}/cow"
- mount -o bind /cow "${rootmnt}/cow"
fi
- # move the first mount; no head in busybox-initramfs
- for d in $(mount -t squashfs | cut -d\ -f 3); do
- mkdir -p "${rootmnt}/rofs"
- mount -o move "${d}" "${rootmnt}/rofs"
- break
- done
+ # shows cow fs on /cow for use by live-snapshot
+ mkdir -p "${rootmnt}/live/cow"
+ mount -o bind /cow "${rootmnt}/live/cow"
}
check_dev ()
devname=$(sys2dev "${sysdev}")
fi
- if [ -n "${LIVEMEDIA_OFFSET}" ]; then
- loopdevname=$(setup_loop "${devname}" "loop" "/sys/block/loop*" "${LIVEMEDIA_OFFSET}")
- devname="${loopdevname}"
+ if [ -n "${LIVE_MEDIA_OFFSET}" ]; then
+ loopdevname=$(setup_loop "${devname}" "loop" "/sys/block/loop*" "${LIVE_MEDIA_OFFSET}" '')
+ devname="${loopdevname}"
fi
fstype=$(get_fstype "${devname}")
if is_supported_fs ${fstype}; then
mount -t ${fstype} -o ro "${devname}" $mountpoint || continue
- if is_casper_path $mountpoint; then
+ if is_live_path $mountpoint; then
echo $mountpoint
return 0
else
fi
fi
- if [ -n "${LIVEMEDIA_OFFSET}" ]; then
+ if [ -n "${LIVE_MEDIA_OFFSET}" ]; then
losetup -d "${loopdevname}"
fi
return 1
find_livefs() {
timeout="${1}"
# first look at the one specified in the command line
- if [ ! -z "${LIVEMEDIA}" ]; then
- if check_dev "null" "${LIVEMEDIA}"; then
+ if [ ! -z "${LIVE_MEDIA}" ]; then
+ if check_dev "null" "${LIVE_MEDIA}"; then
return 0
fi
fi
# don't start autodetection before timeout has expired
- if [ -n "${LIVEMEDIA_TIMEOUT}" ]; then
- if [ "${timeout}" -lt "${LIVEMEDIA_TIMEOUT}" ]; then
+ if [ -n "${LIVE_MEDIA_TIMEOUT}" ]; then
+ if [ "${timeout}" -lt "${LIVE_MEDIA_TIMEOUT}" ]; then
return 1
fi
fi
fi
done
elif [ "${fstype}" = "squashfs" -o \
- "${fstype}" = "ext3" -o \
- "${fstype}" = "ext2" ]; then
+ "${fstype}" = "ext2" -o \
+ "${fstype}" = "ext3" ]; then
# This is an ugly hack situation, the block device has
# an image directly on it. It's hopefully
- # casper, so take it and run with it.
+ # live-initramfs, so take it and run with it.
ln -s "${devname}" "${devname}.${fstype}"
echo "${devname}.${fstype}"
return 0
exec > live.log
exec 2>&1
+ Arguments
+
set_usplash_timeout
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-premount"
pulsate
set_usplash_timeout
- if [ ! -z "${NETBOOT}" ]; then
+ if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ]; then
if do_netmount ; then
livefs_root="${mountpoint}"
else
fi
else
# Scan local devices for the image
- for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13; do
+ for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do
livefs_root=$(find_livefs $i)
- if [ "${livefs_root}" ]; then
+ if [ -n "${livefs_root}" ]; then
break
fi
sleep 1
live_dest="${TODISK}"
fi
if [ "${live_dest}" ]; then
- log_begin_msg "Copying live_media to ${live_dest}"
+ log_begin_msg "Copying live media to ${live_dest}"
copy_live_to "${livefs_root}" "${live_dest}"
log_end_msg
fi