r2742 - people/daniel/installer-initramfs/scripts
daniel at alioth.debian.org
daniel at alioth.debian.org
Sat Aug 11 17:40:47 UTC 2007
Author: daniel
Date: 2007-08-11 17:40:46 +0000 (Sat, 11 Aug 2007)
New Revision: 2742
Added:
people/daniel/installer-initramfs/scripts/installer
Removed:
people/daniel/installer-initramfs/scripts/live
people/daniel/installer-initramfs/scripts/local-top/
Log:
Copied: people/daniel/installer-initramfs/scripts/installer (from rev 2733, people/daniel/installer-initramfs/scripts/live)
===================================================================
--- people/daniel/installer-initramfs/scripts/installer (rev 0)
+++ people/daniel/installer-initramfs/scripts/installer 2007-08-11 17:40:46 UTC (rev 2742)
@@ -0,0 +1,894 @@
+#!/bin/sh
+
+# set -e
+
+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="/live/image"
+LIVE_MEDIA_PATH="live"
+
+root_persistence="live-rw"
+home_persistence="home-rw"
+root_snapshot_label="live-sn"
+home_snapshot_label="home-sn"
+
+USERNAME="user"
+USERFULLNAME="Live user"
+HOSTNAME="host"
+BUILD_SYSTEM="Custom"
+
+mkdir -p "${mountpoint}"
+
+[ -f /etc/live.conf ] && . /etc/live.conf
+export USERNAME USERFULLNAME HOSTNAME BUILD_SYSTEM
+
+. /scripts/live-helpers
+
+if [ ! -f /live.vars ]; then
+ touch /live.vars
+fi
+
+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|*.ext3)
+ echo $(setup_loop "$1" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}")
+ ;;
+ *.dir)
+ echo "directory"
+ ;;
+ *)
+ panic "Unrecognized live filesystem: $1"
+ ;;
+ esac
+}
+
+match_files_in_dir() {
+ # Does any files match pattern $1 ?
+
+ local pattern="$1"
+ if [ "$(echo $pattern)" != "$pattern" ]; then
+ return 0
+ fi
+ return 1
+}
+
+mount_images_in_directory() {
+ directory="$1"
+ rootmnt="$2"
+
+ 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
+}
+
+is_nice_device() {
+ sysfs_path="${1#/sys}"
+ if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-[^-]*-[ide|scsi|usb])"; then
+ return 0
+ fi
+ return 1
+}
+
+is_supported_fs () {
+ # FIXME: do something better like the scan of supported filesystems
+ fstype="${1}"
+ case ${fstype} in
+ vfat|iso9660|udf|ext2|ext3|ntfs)
+ return 0
+ ;;
+ esac
+ return 1
+}
+
+copy_live_to() {
+ copyfrom="${1}"
+ copytodev="${2}"
+ copyto="${copyfrom}_swap"
+
+ size=$(fs_size "" ${copyfrom} "used")
+
+ if [ "${copytodev}" = "ram" ]; then
+ # copying to ram:
+ freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( cat /proc/meminfo | grep Cached | head -n 1 | awk '/Cached/{print $2}' - ) )
+ mount_options="-o size=${size}k"
+ free_string="memory"
+ fstype="tmpfs"
+ dev="/dev/shm"
+ else
+ # it should be a writable block device
+ if [ -b "${copytodev}" ]; then
+ dev="${copytodev}"
+ free_string="space"
+ fstype=$(get_fstype "${dev}")
+ freespace=$(fs_size "${dev}")
+ else
+ [ "$quiet" != "y" ] && log_warning_msg "${copytodev} is not a block device."
+ return 1
+ fi
+ fi
+ if [ "${freespace}" -lt "${size}" ] ; then
+ [ "$quiet" != "y" ] && log_warning_msg "Not enough free ${free_string} (${freespace}k > ${size}k) to copy live media in ${copytodev}."
+ return 1
+ fi
+
+ # begin copying (or uncompressing)
+ mkdir "${copyto}"
+ echo "mount -t ${fstype} ${mount_options} ${dev} ${copyto}"
+ mount -t "${fstype}" ${mount_options} "${dev}" "${copyto}"
+
+ 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
+}
+
+do_netmount() {
+ rc=1
+
+ modprobe "${MP_QUIET}" af_packet # For DHCP
+
+ udevtrigger
+ udevsettle
+
+ ipconfig ${DEVICE} /tmp/net-${DEVICE}.conf | tee /netboot.config
+
+ if [ "${NFSROOT}" = "auto" ]; then
+ 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
+ rc=0
+ elif do_nfsmount ; then
+ NETBOOT="nfs"
+ export NETBOOT
+ rc=0
+ fi
+
+ [ "$quiet" != "y" ] && log_end_msg
+ 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
+ if [ -z "${NFSOPTS}" ]; then
+ NFSOPTS=""
+ fi
+
+ [ "$quiet" != "y" ] && log_begin_msg "Trying nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}"
+ # FIXME: This for loop is an ugly HACK round an nfs bug
+ for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13; do
+ nfsmount -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && rc=0 && break
+ sleep 1
+ done
+ return ${rc}
+}
+
+do_cifsmount() {
+ rc=1
+ if [ -x "/sbin/mount.cifs" ]; then
+ if [ -z "${NFSOPTS}" ]; then
+ CIFSOPTS="-ouser=root,password="
+ else
+ CIFSOPTS="${NFSOPTS}"
+ fi
+
+ [ "$quiet" != "y" ] && log_begin_msg "Trying mount.cifs ${NFSROOT} ${mountpoint} ${CIFSOPTS}"
+ modprobe "${MP_QUIET}" cifs
+
+ if mount.cifs "${NFSROOT}" "${mountpoint}" "${CIFSOPTS}" ; then
+ rc=0
+ fi
+ fi
+ return ${rc}
+}
+
+do_snap_copy ()
+{
+ fromdev="${1}"
+ todir="${2}"
+ snap_type="${3}"
+
+ size=$(fs_size "${fromdev}" "" "used")
+
+ if [ -b "${fromdev}" ]; then
+ # look for free mem
+ if [ -n "${HOMEMOUNTED}" -a "${snap_type}" = "HOME" ]; then
+ todev=$(cat /proc/mounts | grep -s " $(base_path ${todir}) " | awk '{print $1}' )
+ freespace=$(df -k | grep -s ${todev} | awk '{print $4}')
+ else
+ freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( cat /proc/meminfo | grep Cached | head -n 1 | awk '/Cached/{print $2}' - ))
+ fi
+
+ tomount="/mnt/tmpsnap"
+ if [ ! -d "${tomount}" ] ; then
+ mkdir -p "${tomount}"
+ fi
+
+ fstype=$(get_fstype "${fromdev}")
+ if [ -n "${fstype}" ]; then
+ # Copying stuff...
+ mount -t "${fstype}" -o ro "${fromdev}" "${tomount}"
+ cp -a "${tomount}"/* ${todir}
+ umount "${tomount}"
+ else
+ log_warning_msg "Unrecognized fstype: ${fstype} on ${fromdev}:${snap_type}"
+ fi
+
+ rmdir "${tomount}"
+ if echo ${fromdev} | grep -qs loop; then
+ losetup -d "${fromdev}"
+ fi
+ return 0
+ else
+ return 1
+ [ "$quiet" != "y" ] && log_warning_msg "Unable to find the snapshot ${snap_type} medium"
+ fi
+}
+
+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 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 ${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\|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"
+ return 1
+ fi
+ else
+ # cpio.gz snapshot
+ if ! (cd "${snap_mount}" && zcat "${snapback}/${snapfile}" | cpio -i -u -d 2>/dev/null) ; then
+ log_warning_msg "Impossible to include the ${snapfile} Snapshot"
+ return 1
+ fi
+ fi
+ umount "${snapback}"
+ else
+ dev=$(find_cow_device "${snap_label}")
+ if [ -b ${dev} ]; then
+ if echo "${dev}" | grep -qs loop; then
+ # strange things happens, user confused?
+ snaploop=$( losetup ${dev} | awk '{print $3}' | tr -d '()' )
+ snapfile=$(basename ${snaploop})
+ snapdev=$(cat /proc/mounts | awk '{print $2,$1}' | grep -es "^$( dirname ${snaploop} )" | cut -f2 -d ' ')
+ else
+ snapdev="${dev}"
+ fi
+ if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" ; then
+ log_warning_msg "Impossible to include the ${snap_label} Snapshot"
+ return 1
+ else
+ if [ -n "${snapfile}" ]; then
+ # it was a loop device, user confused
+ umount ${snapdev}
+ fi
+ fi
+ else
+ log_warning_msg "Impossible to include the ${snap_label} Snapshot"
+ return 1
+ fi
+ fi
+ echo "export ${snap_type}SNAP="${snap_mount}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt
+ return 0
+}
+
+setup_unionfs() {
+ image_directory="$1"
+ rootmnt="$2"
+
+ 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,
+ # put them in / since move-mounting them into / breaks mono and
+ # some other apps.
+
+ croot="/"
+
+ # Let's just mount the read-only file systems first
+ rofsstring=""
+ rofslist=""
+ if [ "${NETBOOT}" = "nfs" ] ; then
+ roopt="nfsro" # go aroung a bug in nfs-unionfs locking
+ else
+ 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 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%:}
+
+ mkdir -p /cow
+ cowdevice="tmpfs"
+ cow_fstype="tmpfs"
+
+ # Looking for "${root_persistence}" device or file
+ if [ -n "${PERSISTENT}" ]; then
+ cowprobe=$(find_cow_device "${root_persistence}")
+ if [ -b "${cowprobe}" ]; then
+ cowdevice=${cowprobe}
+ cow_fstype=$(get_fstype "${cowprobe}")
+ else
+ [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent medium"
+ fi
+ fi
+
+ mount ${cowdevice} -t ${cow_fstype} -o rw /cow || panic "Can not mount $cowdevice on /cow"
+
+ mount -t ${UNIONTYPE} -o dirs=/cow=rw:$rofsstring ${UNIONTYPE} "$rootmnt" || panic "${UNIONTYPE} mount failed"
+
+ # Adding other custom mounts
+ if [ -n "${PERSISTENT}" ]; then
+ # directly mount /home
+ # FIXME: add a custom mounts configurable system
+ homecow=$(find_cow_device "${home_persistence}" )
+ if [ -b "${homecow}" ]; then
+ mount -t $(get_fstype "${homecow}") -o rw "${homecow}" "${rootmnt}/home"
+ export HOMEMOUNTED=1 # used to proper calculate free space in do_snap_copy()
+ else
+ [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent home medium"
+ fi
+ # Look for other snapshots to copy in
+ try_snap "${root_snapshot_label}" "${rootmnt}" "ROOT"
+ try_snap "${home_snapshot_label}" "${rootmnt}/home" "HOME"
+ fi
+
+ if [ -n "${SHOWMOUNTS}" ]; then
+ for d in ${rofslist}; do
+ mkdir -p "${rootmnt}/live/${d##*/}"
+ case d in
+ *.dir) # do nothing # mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
+ ;;
+ *) mount --move "${d}" "${rootmnt}/live/${d##*/}"
+ ;;
+ esac
+ done
+ fi
+
+ # shows cow fs on /cow for use by live-snapshot
+ mkdir -p "${rootmnt}/live/cow"
+ mount -o bind /cow "${rootmnt}/live/cow"
+}
+
+check_dev ()
+{
+ sysdev="${1}"
+ devname="${2}"
+ if [ -z "${devname}" ]; then
+ devname=$(sys2dev "${sysdev}")
+ fi
+
+ 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_live_path $mountpoint; then
+ echo $mountpoint
+ return 0
+ else
+ umount $mountpoint
+ fi
+ fi
+
+ 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 "${LIVE_MEDIA}" ]; then
+ if check_dev "null" "${LIVE_MEDIA}"; then
+ return 0
+ fi
+ fi
+ # don't start autodetection before timeout has expired
+ if [ -n "${LIVE_MEDIA_TIMEOUT}" ]; then
+ if [ "${timeout}" -lt "${LIVE_MEDIA_TIMEOUT}" ]; then
+ return 1
+ fi
+ fi
+ # or do the scan of block devices
+ for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
+ devname=$(sys2dev "${sysblock}")
+ fstype=$(get_fstype "${devname}")
+ if /lib/udev/cdrom_id ${devname} > /dev/null; then
+ if check_dev "null" "${devname}" ; then
+ return 0
+ fi
+ elif is_nice_device "${sysblock}" ; then
+ for dev in $(subdevices "${sysblock}"); do
+ if check_dev "${dev}" ; then
+ return 0
+ fi
+ done
+ elif [ "${fstype}" = "squashfs" -o \
+ "${fstype}" = "ext2" -o \
+ "${fstype}" = "ext3" ]; then
+ # This is an ugly hack situation, the block device has
+ # an image directly on it. It's hopefully
+ # live-initramfs, so take it and run with it.
+ ln -s "${devname}" "${devname}.${fstype}"
+ echo "${devname}.${fstype}"
+ return 0
+ fi
+ done
+ return 1
+}
+
+pulsate() {
+ if [ -x /sbin/usplash_write ]; then
+ /sbin/usplash_write "PULSATE"
+ fi
+}
+
+set_usplash_timeout() {
+ if [ -x /sbin/usplash_write ]; then
+ /sbin/usplash_write "TIMEOUT 120"
+ fi
+}
+
+mountroot() {
+ exec 6>&1
+ exec 7>&2
+ exec > live.log
+ exec 2>&1
+
+ Arguments
+
+ set_usplash_timeout
+ [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-premount"
+ pulsate
+ run_scripts /scripts/live-premount
+ [ "$quiet" != "y" ] && log_end_msg
+
+ # Needed here too because some things (*cough* udev *cough*)
+ # changes the timeout
+
+ set_usplash_timeout
+
+ if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ]; then
+ if do_netmount ; then
+ livefs_root="${mountpoint}"
+ else
+ panic "Unable to find a live file system on the network"
+ fi
+ else
+ # Scan local devices for the image
+ 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 [ -n "${livefs_root}" ]; then
+ break
+ fi
+ sleep 1
+ done
+ fi
+
+ if [ -z "${livefs_root}" ]; then
+ panic "Unable to find a medium containing a live file system"
+ fi
+
+ if [ "${TORAM}" ]; then
+ live_dest="ram"
+ elif [ "${TODISK}" ]; then
+ live_dest="${TODISK}"
+ fi
+ if [ "${live_dest}" ]; then
+ log_begin_msg "Copying live media to ${live_dest}"
+ copy_live_to "${livefs_root}" "${live_dest}"
+ log_end_msg
+ fi
+
+ mount_images_in_directory "${livefs_root}" "${rootmnt}"
+
+ log_end_msg
+
+ maybe_break live-bottom
+ [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-bottom"
+
+ pulsate
+ run_scripts /scripts/live-bottom
+ [ "$quiet" != "y" ] && log_end_msg
+
+ exec 1>&6 6>&-
+ exec 2>&7 7>&-
+ cp live.log "${rootmnt}/var/log/"
+}
Deleted: people/daniel/installer-initramfs/scripts/live
===================================================================
--- people/daniel/installer-initramfs/scripts/live 2007-08-11 17:33:25 UTC (rev 2741)
+++ people/daniel/installer-initramfs/scripts/live 2007-08-11 17:40:46 UTC (rev 2742)
@@ -1,894 +0,0 @@
-#!/bin/sh
-
-# set -e
-
-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="/live/image"
-LIVE_MEDIA_PATH="live"
-
-root_persistence="live-rw"
-home_persistence="home-rw"
-root_snapshot_label="live-sn"
-home_snapshot_label="home-sn"
-
-USERNAME="user"
-USERFULLNAME="Live user"
-HOSTNAME="host"
-BUILD_SYSTEM="Custom"
-
-mkdir -p "${mountpoint}"
-
-[ -f /etc/live.conf ] && . /etc/live.conf
-export USERNAME USERFULLNAME HOSTNAME BUILD_SYSTEM
-
-. /scripts/live-helpers
-
-if [ ! -f /live.vars ]; then
- touch /live.vars
-fi
-
-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|*.ext3)
- echo $(setup_loop "$1" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}")
- ;;
- *.dir)
- echo "directory"
- ;;
- *)
- panic "Unrecognized live filesystem: $1"
- ;;
- esac
-}
-
-match_files_in_dir() {
- # Does any files match pattern $1 ?
-
- local pattern="$1"
- if [ "$(echo $pattern)" != "$pattern" ]; then
- return 0
- fi
- return 1
-}
-
-mount_images_in_directory() {
- directory="$1"
- rootmnt="$2"
-
- 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
-}
-
-is_nice_device() {
- sysfs_path="${1#/sys}"
- if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-[^-]*-[ide|scsi|usb])"; then
- return 0
- fi
- return 1
-}
-
-is_supported_fs () {
- # FIXME: do something better like the scan of supported filesystems
- fstype="${1}"
- case ${fstype} in
- vfat|iso9660|udf|ext2|ext3|ntfs)
- return 0
- ;;
- esac
- return 1
-}
-
-copy_live_to() {
- copyfrom="${1}"
- copytodev="${2}"
- copyto="${copyfrom}_swap"
-
- size=$(fs_size "" ${copyfrom} "used")
-
- if [ "${copytodev}" = "ram" ]; then
- # copying to ram:
- freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( cat /proc/meminfo | grep Cached | head -n 1 | awk '/Cached/{print $2}' - ) )
- mount_options="-o size=${size}k"
- free_string="memory"
- fstype="tmpfs"
- dev="/dev/shm"
- else
- # it should be a writable block device
- if [ -b "${copytodev}" ]; then
- dev="${copytodev}"
- free_string="space"
- fstype=$(get_fstype "${dev}")
- freespace=$(fs_size "${dev}")
- else
- [ "$quiet" != "y" ] && log_warning_msg "${copytodev} is not a block device."
- return 1
- fi
- fi
- if [ "${freespace}" -lt "${size}" ] ; then
- [ "$quiet" != "y" ] && log_warning_msg "Not enough free ${free_string} (${freespace}k > ${size}k) to copy live media in ${copytodev}."
- return 1
- fi
-
- # begin copying (or uncompressing)
- mkdir "${copyto}"
- echo "mount -t ${fstype} ${mount_options} ${dev} ${copyto}"
- mount -t "${fstype}" ${mount_options} "${dev}" "${copyto}"
-
- 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
-}
-
-do_netmount() {
- rc=1
-
- modprobe "${MP_QUIET}" af_packet # For DHCP
-
- udevtrigger
- udevsettle
-
- ipconfig ${DEVICE} /tmp/net-${DEVICE}.conf | tee /netboot.config
-
- if [ "${NFSROOT}" = "auto" ]; then
- 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
- rc=0
- elif do_nfsmount ; then
- NETBOOT="nfs"
- export NETBOOT
- rc=0
- fi
-
- [ "$quiet" != "y" ] && log_end_msg
- 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
- if [ -z "${NFSOPTS}" ]; then
- NFSOPTS=""
- fi
-
- [ "$quiet" != "y" ] && log_begin_msg "Trying nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}"
- # FIXME: This for loop is an ugly HACK round an nfs bug
- for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13; do
- nfsmount -o nolock -o ro ${NFSOPTS} "${NFSROOT}" "${mountpoint}" && rc=0 && break
- sleep 1
- done
- return ${rc}
-}
-
-do_cifsmount() {
- rc=1
- if [ -x "/sbin/mount.cifs" ]; then
- if [ -z "${NFSOPTS}" ]; then
- CIFSOPTS="-ouser=root,password="
- else
- CIFSOPTS="${NFSOPTS}"
- fi
-
- [ "$quiet" != "y" ] && log_begin_msg "Trying mount.cifs ${NFSROOT} ${mountpoint} ${CIFSOPTS}"
- modprobe "${MP_QUIET}" cifs
-
- if mount.cifs "${NFSROOT}" "${mountpoint}" "${CIFSOPTS}" ; then
- rc=0
- fi
- fi
- return ${rc}
-}
-
-do_snap_copy ()
-{
- fromdev="${1}"
- todir="${2}"
- snap_type="${3}"
-
- size=$(fs_size "${fromdev}" "" "used")
-
- if [ -b "${fromdev}" ]; then
- # look for free mem
- if [ -n "${HOMEMOUNTED}" -a "${snap_type}" = "HOME" ]; then
- todev=$(cat /proc/mounts | grep -s " $(base_path ${todir}) " | awk '{print $1}' )
- freespace=$(df -k | grep -s ${todev} | awk '{print $4}')
- else
- freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( cat /proc/meminfo | grep Cached | head -n 1 | awk '/Cached/{print $2}' - ))
- fi
-
- tomount="/mnt/tmpsnap"
- if [ ! -d "${tomount}" ] ; then
- mkdir -p "${tomount}"
- fi
-
- fstype=$(get_fstype "${fromdev}")
- if [ -n "${fstype}" ]; then
- # Copying stuff...
- mount -t "${fstype}" -o ro "${fromdev}" "${tomount}"
- cp -a "${tomount}"/* ${todir}
- umount "${tomount}"
- else
- log_warning_msg "Unrecognized fstype: ${fstype} on ${fromdev}:${snap_type}"
- fi
-
- rmdir "${tomount}"
- if echo ${fromdev} | grep -qs loop; then
- losetup -d "${fromdev}"
- fi
- return 0
- else
- return 1
- [ "$quiet" != "y" ] && log_warning_msg "Unable to find the snapshot ${snap_type} medium"
- fi
-}
-
-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 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 ${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\|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"
- return 1
- fi
- else
- # cpio.gz snapshot
- if ! (cd "${snap_mount}" && zcat "${snapback}/${snapfile}" | cpio -i -u -d 2>/dev/null) ; then
- log_warning_msg "Impossible to include the ${snapfile} Snapshot"
- return 1
- fi
- fi
- umount "${snapback}"
- else
- dev=$(find_cow_device "${snap_label}")
- if [ -b ${dev} ]; then
- if echo "${dev}" | grep -qs loop; then
- # strange things happens, user confused?
- snaploop=$( losetup ${dev} | awk '{print $3}' | tr -d '()' )
- snapfile=$(basename ${snaploop})
- snapdev=$(cat /proc/mounts | awk '{print $2,$1}' | grep -es "^$( dirname ${snaploop} )" | cut -f2 -d ' ')
- else
- snapdev="${dev}"
- fi
- if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" ; then
- log_warning_msg "Impossible to include the ${snap_label} Snapshot"
- return 1
- else
- if [ -n "${snapfile}" ]; then
- # it was a loop device, user confused
- umount ${snapdev}
- fi
- fi
- else
- log_warning_msg "Impossible to include the ${snap_label} Snapshot"
- return 1
- fi
- fi
- echo "export ${snap_type}SNAP="${snap_mount}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt
- return 0
-}
-
-setup_unionfs() {
- image_directory="$1"
- rootmnt="$2"
-
- 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,
- # put them in / since move-mounting them into / breaks mono and
- # some other apps.
-
- croot="/"
-
- # Let's just mount the read-only file systems first
- rofsstring=""
- rofslist=""
- if [ "${NETBOOT}" = "nfs" ] ; then
- roopt="nfsro" # go aroung a bug in nfs-unionfs locking
- else
- 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 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%:}
-
- mkdir -p /cow
- cowdevice="tmpfs"
- cow_fstype="tmpfs"
-
- # Looking for "${root_persistence}" device or file
- if [ -n "${PERSISTENT}" ]; then
- cowprobe=$(find_cow_device "${root_persistence}")
- if [ -b "${cowprobe}" ]; then
- cowdevice=${cowprobe}
- cow_fstype=$(get_fstype "${cowprobe}")
- else
- [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent medium"
- fi
- fi
-
- mount ${cowdevice} -t ${cow_fstype} -o rw /cow || panic "Can not mount $cowdevice on /cow"
-
- mount -t ${UNIONTYPE} -o dirs=/cow=rw:$rofsstring ${UNIONTYPE} "$rootmnt" || panic "${UNIONTYPE} mount failed"
-
- # Adding other custom mounts
- if [ -n "${PERSISTENT}" ]; then
- # directly mount /home
- # FIXME: add a custom mounts configurable system
- homecow=$(find_cow_device "${home_persistence}" )
- if [ -b "${homecow}" ]; then
- mount -t $(get_fstype "${homecow}") -o rw "${homecow}" "${rootmnt}/home"
- export HOMEMOUNTED=1 # used to proper calculate free space in do_snap_copy()
- else
- [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent home medium"
- fi
- # Look for other snapshots to copy in
- try_snap "${root_snapshot_label}" "${rootmnt}" "ROOT"
- try_snap "${home_snapshot_label}" "${rootmnt}/home" "HOME"
- fi
-
- if [ -n "${SHOWMOUNTS}" ]; then
- for d in ${rofslist}; do
- mkdir -p "${rootmnt}/live/${d##*/}"
- case d in
- *.dir) # do nothing # mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
- ;;
- *) mount --move "${d}" "${rootmnt}/live/${d##*/}"
- ;;
- esac
- done
- fi
-
- # shows cow fs on /cow for use by live-snapshot
- mkdir -p "${rootmnt}/live/cow"
- mount -o bind /cow "${rootmnt}/live/cow"
-}
-
-check_dev ()
-{
- sysdev="${1}"
- devname="${2}"
- if [ -z "${devname}" ]; then
- devname=$(sys2dev "${sysdev}")
- fi
-
- 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_live_path $mountpoint; then
- echo $mountpoint
- return 0
- else
- umount $mountpoint
- fi
- fi
-
- 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 "${LIVE_MEDIA}" ]; then
- if check_dev "null" "${LIVE_MEDIA}"; then
- return 0
- fi
- fi
- # don't start autodetection before timeout has expired
- if [ -n "${LIVE_MEDIA_TIMEOUT}" ]; then
- if [ "${timeout}" -lt "${LIVE_MEDIA_TIMEOUT}" ]; then
- return 1
- fi
- fi
- # or do the scan of block devices
- for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
- devname=$(sys2dev "${sysblock}")
- fstype=$(get_fstype "${devname}")
- if /lib/udev/cdrom_id ${devname} > /dev/null; then
- if check_dev "null" "${devname}" ; then
- return 0
- fi
- elif is_nice_device "${sysblock}" ; then
- for dev in $(subdevices "${sysblock}"); do
- if check_dev "${dev}" ; then
- return 0
- fi
- done
- elif [ "${fstype}" = "squashfs" -o \
- "${fstype}" = "ext2" -o \
- "${fstype}" = "ext3" ]; then
- # This is an ugly hack situation, the block device has
- # an image directly on it. It's hopefully
- # live-initramfs, so take it and run with it.
- ln -s "${devname}" "${devname}.${fstype}"
- echo "${devname}.${fstype}"
- return 0
- fi
- done
- return 1
-}
-
-pulsate() {
- if [ -x /sbin/usplash_write ]; then
- /sbin/usplash_write "PULSATE"
- fi
-}
-
-set_usplash_timeout() {
- if [ -x /sbin/usplash_write ]; then
- /sbin/usplash_write "TIMEOUT 120"
- fi
-}
-
-mountroot() {
- exec 6>&1
- exec 7>&2
- exec > live.log
- exec 2>&1
-
- Arguments
-
- set_usplash_timeout
- [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-premount"
- pulsate
- run_scripts /scripts/live-premount
- [ "$quiet" != "y" ] && log_end_msg
-
- # Needed here too because some things (*cough* udev *cough*)
- # changes the timeout
-
- set_usplash_timeout
-
- if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ]; then
- if do_netmount ; then
- livefs_root="${mountpoint}"
- else
- panic "Unable to find a live file system on the network"
- fi
- else
- # Scan local devices for the image
- 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 [ -n "${livefs_root}" ]; then
- break
- fi
- sleep 1
- done
- fi
-
- if [ -z "${livefs_root}" ]; then
- panic "Unable to find a medium containing a live file system"
- fi
-
- if [ "${TORAM}" ]; then
- live_dest="ram"
- elif [ "${TODISK}" ]; then
- live_dest="${TODISK}"
- fi
- if [ "${live_dest}" ]; then
- log_begin_msg "Copying live media to ${live_dest}"
- copy_live_to "${livefs_root}" "${live_dest}"
- log_end_msg
- fi
-
- mount_images_in_directory "${livefs_root}" "${rootmnt}"
-
- log_end_msg
-
- maybe_break live-bottom
- [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-bottom"
-
- pulsate
- run_scripts /scripts/live-bottom
- [ "$quiet" != "y" ] && log_end_msg
-
- exec 1>&6 6>&-
- exec 2>&7 7>&-
- cp live.log "${rootmnt}/var/log/"
-}
More information about the debian-live-changes
mailing list