Adding debian version 3.0~a1-1.
[live-boot-grml.git] / scripts / live
index 3e7ed03..a17eb42 100755 (executable)
@@ -8,6 +8,7 @@ echo "/root/lib" >> /etc/ld.so.conf
 echo "/root/usr/lib" >> /etc/ld.so.conf
 
 mountpoint="/live/image"
+alt_mountpoint="/media"
 LIVE_MEDIA_PATH="live"
 
 root_persistence="live-rw"
@@ -20,6 +21,7 @@ USERFULLNAME="Live user"
 HOSTNAME="host"
 
 mkdir -p "${mountpoint}"
+tried="/tmp/tried"
 
 # Create /etc/mtab for debug purpose and future syncs
 if [ ! -d /etc ]
@@ -32,9 +34,6 @@ then
        touch /etc/mtab
 fi
 
-[ -f /etc/live.conf ] && . /etc/live.conf
-export USERNAME USERFULLNAME HOSTNAME
-
 . /scripts/live-helpers
 
 if [ ! -f /live.vars ]
@@ -45,37 +44,18 @@ fi
 Arguments ()
 {
        PRESEEDS=""
+       LOCATIONS=""
 
        for ARGUMENT in $(cat /proc/cmdline)
        do
                case "${ARGUMENT}" in
                        skipconfig)
                                NOACCESSIBILITY="Yes"
-                               NOAPPARMOR="Yes"
-                               NOAPTCDROM="Yes"
-                               NOAUTOLOGIN="Yes"
-                               NOCONSOLEKEYBOARD="Yes"
                                NOFASTBOOT="Yes"
                                NOFSTAB="Yes"
-                               NOGNOMEPANEL="Yes"
-                               NOHOSTS="Yes"
-                               NOJOCKEY="Yes"
-                               NOKPERSONALIZER="Yes"
-                               NOLANGUAGESELECTOR="Yes"
-                               NOLOCALES="Yes"
                                NONETWORKING="Yes"
-                               NOPOLKITCONF="Yes"
-                               NOPOWERMANAGEMENT="Yes"
-                               NOPROGRAMCRASHES="Yes"
-                               NOSUDO="Yes"
-                               NOTIMEZONE="Yes"
-                               NOUPDATENOTIFIER="Yes"
-                               NOUSER="Yes"
-                               NOXAUTOCONFIG="Yes"
-                               NOXAUTOLOGIN="Yes"
-                               NOXSCREENSAVER="Yes"
-
-                               export NOACCESSIBILITY NOAPPARMOR NOAPTCDROM NOAUTOLOGIN NOCONSOLEKEYBOARD NOFASTBOOT NOFSTAB NOGNOMEPANEL NOHOSTS NOJOCKEY NOKPERSONALIZER NOLANGUAGESELECTOR NOLOCALES NONETWORKING NOPOLKITCONF NOPOWERMANAGEMENT NOPROGRAMCRASHES NOSUDO NOTIMEZONE NOUPDATENOTIFIER NOUSER NOXAUTOCONFIG NOXAUTOLOGIN NOXSCREENSAVER
+
+                               export NOACCESSIBILITY NOFASTBOOT NOFSTAB NONETWORKING
                                ;;
 
                        access=*)
@@ -95,9 +75,26 @@ Arguments ()
                                set -x
                                ;;
 
+                       dhcp)
+                               # Force dhcp even while netbooting
+                               # Use for debugging in case somebody works on fixing dhclient
+                               DHCP="Force";
+                               export DHCP
+                               ;;
+
+                       nodhcp)
+                               unset DHCP
+                               ;;
+
                        ethdevice=*)
                                DEVICE="${ARGUMENT#ethdevice=}"
-                               export DEVICE
+                               ETHDEVICE="${DEVICE}"
+                               export DEVICE ETHDEVICE
+                               ;;
+
+                       ethdevice-timeout=*)
+                               ETHDEV_TIMEOUT="${ARGUMENT#ethdevice-timeout=}"
+                               export ETHDEV_TIMEOUT
                                ;;
 
                        fetch=*)
@@ -110,11 +107,6 @@ Arguments ()
                                export FORCEPERSISTENTFSCK
                                ;;
 
-                       hook=*)
-                               HOOK="${ARGUMENT#hook=}"
-                               export HOOK
-                               ;;
-
                        ftpfs=*)
                                FTPFS="${ARGUMENT#ftpfs=}"
                                export FTPFS
@@ -123,12 +115,19 @@ Arguments ()
                        httpfs=*)
                                HTTPFS="${ARGUMENT#httpfs=}"
                                export HTTPFS
-                               ;;
+                                ;;
 
-                       hostname=*)
-                               HOSTNAME="${ARGUMENT#hostname=}"
-                               LIVECONF="changed"
-                               export HOSTNAME LIVECONF
+                       iscsi=*)
+                               ISCSI="${ARGUMENT#iscsi=}"
+                               #ip:port - separated by ;
+                               ISCSI_PORTAL="${ISCSI%;*}"
+                               if echo "${ISCSI_PORTAL}" | grep -q , ; then
+                                       ISCSI_SERVER="${ISCSI_PORTAL%,*}"
+                                       ISCSI_PORT="${ISCSI_PORTAL#*,}"
+                               fi
+                               #target name
+                               ISCSI_TARGET="${ISCSI#*;}"
+                               export ISCSI ISCSI_PORTAL ISCSI_TARGET ISCSI_SERVER ISCSI_PORT
                                ;;
 
                        isofrom=*|fromiso=*)
@@ -136,18 +135,6 @@ Arguments ()
                                export FROMISO
                                ;;
 
-                       username=*)
-                               USERNAME="${ARGUMENT#username=}"
-                               LIVECONF="changed"
-                               export USERNAME LIVECONF
-                               ;;
-
-                       userfullname=*)
-                               USERFULLNAME="${ARGUMENT#userfullname=}"
-                               LIVECONF="changed"
-                               export USERFULLNAME LIVECONF
-                               ;;
-
                        ignore_uuid)
                                IGNORE_UUID="Yes"
                                export IGNORE_UUID
@@ -169,31 +156,6 @@ Arguments ()
                                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
@@ -224,17 +186,6 @@ Arguments ()
                                export LIVE_MEDIA_TIMEOUT
                                ;;
 
-                       language=*|debian-installer/language=*)
-                               language=${x#debian-installer/language=}
-                               locale="$(lang2locale "$language")"
-                               set_locale="true"
-                               ;;
-
-                       locale=*|debian-installer/locale=*)
-                               LOCALE="${ARGUMENT#*=}"
-                               export LOCALE
-                               ;;
-
                        module=*)
                                MODULE="${ARGUMENT#module=}"
                                export MODULE
@@ -260,31 +211,6 @@ Arguments ()
                                export NOACCESSIBILITY
                                ;;
 
-                       noapparmor)
-                               NOAPPARMOR="Yes"
-                               export NOAPPARMOR
-                               ;;
-
-                       noaptcdrom)
-                               NOAPTCDROM="Yes"
-                               export NOAPTCDROM
-                               ;;
-
-                       noautologin)
-                               NOAUTOLOGIN="Yes"
-                               export NOAUTOLOGIN
-                               ;;
-
-                       noxautologin)
-                               NOXAUTOLOGIN="Yes"
-                               export NOXAUTOLOGIN
-                               ;;
-
-                       noconsolekeyboard)
-                               NOCONSOLEKEYBOARD="Yes"
-                               export NOCONSOLEKEYBOARD
-                               ;;
-
                        nofastboot)
                                NOFASTBOOT="Yes"
                                export NOFASTBOOT
@@ -295,81 +221,16 @@ Arguments ()
                                export NOFSTAB
                                ;;
 
-                       nognomepanel)
-                               NOGNOMEPANEL="Yes"
-                               export NOGNOMEPANEL
-                               ;;
-
-                       nohosts)
-                               NOHOSTS="Yes"
-                               export NOHOSTS
-                               ;;
-
-                       nokpersonalizer)
-                               NOKPERSONALIZER="Yes"
-                               export NOKPERSONALIZER
-                               ;;
-
-                       nolanguageselector)
-                               NOLANGUAGESELECTOR="Yes"
-                               export NOLANGUAGESELECTOR
-                               ;;
-
-                       nolocales)
-                               NOLOCALES="Yes"
-                               export NOLOCALES
-                               ;;
-
                        nonetworking)
                                NONETWORKING="Yes"
                                export NONETWORKING
                                ;;
 
-                       nopowermanagement)
-                               NOPOWERMANAGEMENT="Yes"
-                               export NOPOWERMANAGEMENT
-                               ;;
-
-                       noprogramcrashes)
-                               NOPROGRAMCRASHES="Yes"
-                               export NOPROGRAMCRASHES
-                               ;;
-
-                       nojockey)
-                               NOJOCKEY="Yes"
-                               export NOJOCKEY
-                               ;;
-
-                       nosudo)
-                               NOSUDO="Yes"
-                               export NOSUDO
-                               ;;
-
                        swapon)
                                SWAPON="Yes"
                                export SWAPON
                                ;;
 
-                       noupdatenotifier)
-                               NOUPDATENOTIFIER="Yes"
-                               export NOUPDATENOTIFIER
-                               ;;
-
-                       nouser)
-                               NOUSER="Yes"
-                               export NOUSER
-                               ;;
-
-                       noxautoconfig)
-                               NOXAUTOCONFIG="Yes"
-                               export NOXAUTOCONFIG
-                               ;;
-
-                       noxscreensaver)
-                               NOXSCREENSAVER="Yes"
-                               export NOXSCREENSAVER
-                               ;;
-
                        persistent)
                                PERSISTENT="Yes"
                                export PERSISTENT
@@ -407,8 +268,8 @@ Arguments ()
                                ;;
 
                        preseed/file=*|file=*)
-                               LOCATION="${ARGUMENT#*=}"
-                               export LOCATION
+                               LOCATIONS="${ARGUMENT#*=} ${LOCATIONS}"
+                               export LOCATIONS
                                ;;
 
                        nopreseed)
@@ -416,25 +277,6 @@ Arguments ()
                                export NOPRESEED
                                ;;
 
-                       url=*)
-                               location="${ARGUMENT#url=}"
-
-                               mount -o bind /sys /root/sys
-                               mount -o bind /proc /root/proc
-                               mount -o bind /dev /root/dev
-
-                               mkdir -p /root/var/run/network
-                               [ "${NETBOOT}" ] || chroot /root dhclient eth0
-                               chroot /root wget -P /tmp "${location}"
-                               [ "${NETBOOT}" ] || chroot /root ifconfig eth0 down
-
-                               umount /root/sys
-                               umount /root/proc
-                               umount /root/dev
-
-                               LOCATION="/tmp/$(basename "${location}")"
-                               ;;
-
                        */*=*)
                                question="${ARGUMENT%%=*}"
                                value="${ARGUMENT#*=}"
@@ -452,21 +294,6 @@ Arguments ()
                                export SILENT
                                ;;
 
-                       textonly)
-                               TEXTONLY="Yes"
-                               export TEXTONLY
-                               ;;
-
-                       timezone=*)
-                               TIMEZONE="${ARGUMENT#timezone=}"
-                               export TIMEZONE
-                               ;;
-
-                       notimezone)
-                               NOTIMEZONE="Yes"
-                               export NOTIMEZONE
-                               ;;
-
                        todisk=*)
                                TODISK="${ARGUMENT#todisk=}"
                                export TODISK
@@ -507,26 +334,6 @@ Arguments ()
                                UNIONTYPE="${ARGUMENT#union=}"
                                export UNIONTYPE
                                ;;
-
-                       utc=*)
-                               UTC="${ARGUMENT#utc=}"
-                               export UTC
-                               ;;
-
-                       xdebconf)
-                               XDEBCONF="Yes"
-                               export XDEBCONF
-                               ;;
-
-                       xdriver=*)
-                               XDRIVER="${ARGUMENT#xdriver=}"
-                               export XDRIVER
-                               ;;
-
-                       xvideomode=*)
-                               XVIDEOMODE="${ARGUMENT#xvideomode=}"
-                               export XVIDEOMODE
-                               ;;
                esac
        done
 
@@ -655,12 +462,15 @@ is_nice_device ()
 {
        sysfs_path="${1#/sys}"
 
-       if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-|platform-mmc)"
+       if /lib/udev/path_id "${sysfs_path}" | egrep -q "ID_PATH=(usb|pci-|platform-orion-ehci|platform-mmc|platform-mxsdhci|)"
        then
                return 0
        elif echo "${sysfs_path}" | grep -q '^/block/vd[a-z]$'
        then
                return 0
+       elif echo ${sysfs_path} | grep -q "^/block/dm-"
+       then
+               return 0
        fi
 
        return 1
@@ -690,7 +500,7 @@ copy_live_to ()
        if [ "${copytodev}" = "ram" ]
        then
                # copying to ram:
-               freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( awk '/\<Cached/{print $2}' /proc/meminfo ) )
+               freespace=$(awk '/^MemFree:/{f=$2} /^Cached:/{c=$2} END{print f+c}' /proc/meminfo)
                mount_options="-o size=${size}k"
                free_string="memory"
                fstype="tmpfs"
@@ -744,7 +554,11 @@ copy_live_to ()
                                rsync -a --progress ${copyfrom}/* ${copyto} 1>/dev/console  # "cp -a" from busybox also copies hidden files
                        else
                                mkdir -p ${copyto}/${LIVE_MEDIA_PATH}
-                               cp -a ${copyfrom}/${LIVE_MEDIA_PATH}/* ${copyto}/${LIVE_MEDIA_PATH}   # "cp -a" from busybox also copies hidden files
+                               cp -a ${copyfrom}/${LIVE_MEDIA_PATH}/* ${copyto}/${LIVE_MEDIA_PATH}
+                               if [ -e ${copyfrom}/${LIVE_MEDIA_PATH}/.disk ]
+                               then
+                                       cp -a ${copyfrom}/${LIVE_MEDIA_PATH}/.disk ${copyto}
+                               fi
                        fi
                fi
 
@@ -756,16 +570,63 @@ copy_live_to ()
        return 0
 }
 
-do_netmount ()
+do_netsetup ()
 {
-       rc=1
-
        modprobe -q af_packet # For DHCP
 
        udevadm trigger
        udevadm settle
 
+       if [ -z "${NETBOOT}" ] && [ -z "${FETCH}" ] && \
+          [ -z "${HTTPFS}" ] && [ -z "${FTPFS}" ]
+       then
+
+       # if ethdevice was not specified on the kernel command line
+       # make sure we try to get a working network configuration
+       # for *every* present network device (except for loopback of course)
+       if [ -z "$ETHDEVICE" ] ; then
+               echo "If you want to boot from a specific device use bootoption ethdevice=..."
+               for device in /sys/class/net/*; do
+                       dev=${device##*/} ;
+                       if [ "$dev" != "lo" ] ; then
+                               ETHDEVICE="$ETHDEVICE $dev"
+                       fi
+               done
+       fi
+
+       # split args of ethdevice=eth0,eth1 into "eth0 eth1"
+       for device in $(echo $ETHDEVICE | sed 's/,/ /g') ; do
+               devlist="$devlist $device"
+       done
+
+       [ -n "$ETHDEV_TIMEOUT" ] || ETHDEV_TIMEOUT=15
+       echo "Using timeout of $ETHDEV_TIMEOUT seconds for network configuration."
+
+       # this is tricky (and ugly) because ipconfig sometimes just hangs/runs into
+       # an endless loop; iff execution fails give it two further tries, that's
+       # why we use '$devlist $devlist $devlist' for the other for loop
+       for dev in $devlist $devlist $devlist ; do
+               echo "Executing ipconfig -t $ETHDEV_TIMEOUT $dev"
+               ipconfig -t "$ETHDEV_TIMEOUT" $dev | tee -a /netboot.config &
+               jobid=$!
+               sleep "$ETHDEV_TIMEOUT" ; sleep 1
+               if [ -r /proc/"$jobid"/status ] ; then
+                       echo "Killing job $jobid for device $dev as ipconfig ran into recursion..."
+                       kill -9 $jobid
+               fi
+
+               # if configuration of device worked we should have an assigned
+               # IP address, iff so let's use the according as $DEVICE for later usage
+               # simple and primitive approach which seems to work fine
+               if ifconfig $dev | grep -q 'inet.*addr:' ; then
+                       export DEVICE="$dev"
+                       break
+               fi
+       done
+
+       else
        ipconfig ${DEVICE} | tee /netboot.config
+       fi
 
        # source relevant ipconfig output
        OLDHOSTNAME=${HOSTNAME}
@@ -773,24 +634,53 @@ do_netmount ()
        [ -z ${HOSTNAME} ] && HOSTNAME=${OLDHOSTNAME}
        export HOSTNAME
 
+       if [ -n "${DEVICE}" ]
+       then
+               HWADDR="$(cat /sys/class/net/${DEVICE}/address)"
+       fi
+
+       if [ ! -e "/etc/resolv.conf" ]
+       then
+               echo "Creating /etc/resolv.conf"
+
+               if [ -n "${DNSDOMAIN}" ]
+               then
+                       echo "domain ${DNSDOMAIN}" > /etc/resolv.conf
+                       echo "search ${DNSDOMAIN}" > /etc/resolv.conf
+               fi
+
+               for i in ${IPV4DNS0} ${IPV4DNS1} ${IPV4DNS1}
+               do
+                       echo "nameserver $i" >> /etc/resolv.conf
+               done
+       fi
+
        # Check if we have a network device at all
-       if ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
+       if ! ls /sys/class/net/"$DEVICE" > /dev/null 2>&1 && \
+          ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
           ! ls /sys/class/net/wlan0 > /dev/null 2>&1 && \
           ! ls /sys/class/net/ath0 > /dev/null 2>&1 && \
           ! ls /sys/class/net/ra0 > /dev/null 2>&1
        then
                panic "No supported network device found, maybe a non-mainline driver is required."
        fi
+}
+
+do_netmount()
+{
+       do_netsetup
 
        if [ "${NFSROOT}" = "auto" ]
        then
                NFSROOT=${ROOTSERVER}:${ROOTPATH}
        fi
 
-       if ( [ -n "${FETCH}" ] || [ -n "${HTTPFS}" ] || [ -n "${FTPFS}" ] ) && do_httpmount
+       rc=1
+
+       if ( [ -n "${FETCH}" ] || [ -n "${HTTPFS}" ] || [ -n "${FTPFS}" ] )
        then
-               rc=0
-               return ${rc}
+               do_httpmount
+               return $?
        fi
 
        if [ "${NFSROOT#*:}" = "${NFSROOT}" ] && [ "$NETBOOT" != "cifs" ]
@@ -814,22 +704,76 @@ do_netmount ()
        return ${rc}
 }
 
+do_iscsi()
+{
+       do_netsetup
+       #modprobe ib_iser
+       modprobe iscsi_tcp
+       local debugopt=""
+       [ "${DEBUG}" == "Yes" ] && debugopt="-d 8"
+       #FIXME this name is supposed to be unique - some date + ifconfig hash?
+       ISCSI_INITIATORNAME="iqn.1993-08.org.debian.live:01:$(echo "${HWADDR}" | sed -e s/://g)"
+        export ISCSI_INITIATORNAME
+       if [ -n "${ISCSI_SERVER}" ] ; then
+               iscsistart $debugopt -i "${ISCSI_INITIATORNAME}" -t "${ISCSI_TARGET}" -g 1 -a "${ISCSI_SERVER}" -p "${ISCSI_PORT}"
+       else
+               iscsistart $debugopt -i "${ISCSI_INITIATORNAME}" -t "${ISCSI_TARGET}" -g 1 -a "${ISCSI_PORTAL}" -p 3260
+       fi
+       if [ $? != 0 ]
+       then
+               panic "Failed to log into iscsi target"
+       fi
+       local host="$(ls -d /sys/class/scsi_host/host*/device/iscsi_host:host* \
+                           /sys/class/scsi_host/host*/device/iscsi_host/host* | sed -e 's:/device.*::' -e 's:.*host::')"
+       if [ -n "${host}" ]
+       then
+               local devices=""
+               local i=0
+               while [ -z "${devices}" -a $i -lt 60 ]
+               do
+                       sleep 1
+                       devices="$(ls -d /sys/class/scsi_device/${host}*/device/block:* \
+                                        /sys/class/scsi_device/${host}*/device/block/* | sed -e 's!.*[:/]!!')"
+                       i=$(expr $i + 1)
+                       echo -ne $i\\r
+               done
+               for dev in $devices
+               do
+                       if check_dev "null" "/dev/$dev"
+                       then
+                               NETBOOT="iscsi"
+                               export NETBOOT
+                               return 0;
+                       fi
+               done
+               panic "Failed to locate a live device on iSCSI devices (tried: $devices)."
+       else
+               panic "Failed to locate iSCSI host in /sys"
+       fi
+}
+
 do_httpmount ()
 {
        rc=1
-       dest="${mountpoint}/${LIVE_MEDIA_PATH}"
-       mount -t ramfs ram "${mountpoint}"
-       mkdir -p "${dest}"
 
        for webfile in HTTPFS FTPFS FETCH
        do
-               url="$(eval echo \"\$\{${webfile}\}\")"
-               extension="$(echo "${url}" | sed 's/\(.*\)\.\(.*\)/\2/')"
+               local url="$(eval echo \"\$\{${webfile}\}\")"
+               local extension="$(echo "${url}" | sed 's/\(.*\)\.\(.*\)/\2/')"
 
                if [ -n "$url" ]
                then
                        case "${extension}" in
-                               squashfs|tgz|tar)
+                               iso|squashfs|tgz|tar)
+                                       if [ "${extension}" = "iso" ]
+                                       then
+                                               mkdir -p "${alt_mountpoint}"
+                                               dest="${alt_mountpoint}"
+                                       else
+                                               local dest="${mountpoint}/${LIVE_MEDIA_PATH}"
+                                               mount -t ramfs ram "${mountpoint}"
+                                               mkdir -p "${dest}"
+                                       fi
                                        if [ "${webfile}" = "FETCH" ]
                                        then
                                                case "$url" in
@@ -857,9 +801,16 @@ do_httpmount ()
                                                fi
                                                modprobe fuse
                                                $FUSE_MOUNT "${url}" "${dest}"
+                                               ROOT_PID="$(minips h -C "$FUSE_MOUNT" | { read x y ; echo "$x" ; } )"
                                        fi
                                        [ ${?} -eq 0 ] && rc=0
                                        [ "${extension}" = "tgz" ] && live_dest="ram"
+                                       if [ "${extension}" = "iso" ]
+                                       then
+                                               isoloop=$(setup_loop "${dest}/$(basename "${url}")" "loop" "/sys/block/loop*" "" '')
+                                               mount -t iso9660 "${isoloop}" "${mountpoint}"
+                                               rc=${?}
+                                       fi
                                        break
                                        ;;
 
@@ -872,7 +823,15 @@ do_httpmount ()
 
        if [ ${rc} != 0 ]
        then
-           umount "${mountpoint}"
+               if [ -d "${alt_mountpoint}" ]
+               then
+                       umount "${alt_mountpoint}"
+                       rmdir "${alt_mountpoint}"
+               fi
+               umount "${mountpoint}"
+       elif [ "${webfile}"  != "FETCH" ] ; then
+               NETBOOT="${webfile}"
+               export NETBOOT
        fi
 
        return ${rc}
@@ -943,7 +902,7 @@ do_snap_copy ()
                        todev=$(awk -v pat="$(base_path ${todir})" '$2 == pat { print $1 }' /proc/mounts)
                        freespace=$(df -k | awk '/'${todev}'/{print $4}')
                else
-                       freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( awk '/\<Cached/{print $2}' /proc/meminfo))
+                       freespace=$(awk '/^MemFree:/{f=$2} /^Cached:/{c=$2} END{print f+c}' /proc/meminfo)
                fi
 
                tomount="/mnt/tmpsnap"
@@ -1001,7 +960,7 @@ find_snap ()
 try_snap ()
 {
         # copy the contents of previously found snapshot to ${snap_mount}
-       # and remember the device and filename for resync on exit in live-initramfs.init
+       # and remember the device and filename for resync on exit in live-boot.init
 
        snapdata="${1}"
        snap_mount="${2}"
@@ -1014,29 +973,42 @@ try_snap ()
                snapback="$(echo ${snapdata} | cut -f2 -d ' ')"
                snapfile="$(echo ${snapdata} | cut -f3 -d ' ')"
 
-               RES=""
                if ! try_mount "${snapdev}" "${snapback}" "ro"
                then
                        break
                fi
 
+               RES="0"
+
                if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\|ext3\|ext4\|jffs2\)'
                then
                        # squashfs, jffs2 or ext2/ext3/ext4 snapshot
                        dev=$(get_backing_device "${snapback}/${snapfile}")
 
                        do_snap_copy "${dev}" "${snap_mount}" "${snap_type}"
-                       RES=$?
+                       RES="$?"
                else
                        # cpio.gz snapshot
-                       cd "${snap_mount}"
-                       zcat "${snapback}/${snapfile}" | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories > /dev/null 2>&1
-                       RES=$?
+
+                       # Unfortunately klibc's cpio is incompatible with the
+                       # rest of the world; everything else requires -u -d,
+                       # while klibc doesn't implement them. Try to detect
+                       # whether it's in use.
+                       cpiopath="$(which cpio)" || true
+                       if [ "$cpiopath" ] && grep -aq /lib/klibc "$cpiopath"
+                       then
+                               cpioargs=
+                       else
+                               cpioargs='--unconditional --make-directories'
+                       fi
+
+                       cd "${snap_mount}" && zcat "${snapback}/${snapfile}" | $cpiopath $cpioargs --extract --preserve-modification-time --no-absolute-filenames --sparse 2>/dev/null
+                       RES="$?"
+
                        if [ "${RES}" != "0" ]
                        then
-                               log_warning_msg "failure to \"zcat ${snapback}/${snapfile} | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories\""
+                               log_warning_msg "failure to \"zcat ${snapback}/${snapfile} | $cpiopath $cpioargs --extract --preserve-modification-time --no-absolute-filenames --sparse\""
                        fi
-                       cd "${OLDPWD}"
                fi
 
                umount "${snapback}" ||  log_warning_msg "failure to \"umount ${snapback}\""
@@ -1077,7 +1049,7 @@ try_snap ()
                return 1
        fi
 
-       echo "export ${snap_type}SNAP="${snap_mount}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt
+       echo "export ${snap_type}SNAP="/cow${snap_mount#$rootmnt}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt
        return 0
 }
 
@@ -1093,11 +1065,19 @@ setup_unionfs ()
 
                        if ! cut -f2 /proc/filesystems | grep -q "^${UNIONTYPE}\$" && [ -x /bin/unionfs-fuse ]
                        then
+                               echo "${UNIONTYPE} not available, falling back to unionfs-fuse."
+                               echo "This might be really slow."
+
                                UNIONTYPE="unionfs-fuse"
                        fi
                        ;;
        esac
 
+       if [ "${UNIONTYPE}" = unionfs-fuse ]
+       then
+               modprobe fuse
+       fi
+
        # 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
@@ -1111,7 +1091,8 @@ setup_unionfs ()
 
        if [ "${UNIONTYPE}" = "aufs" ]
        then
-               roopt="rr,noxino"
+               roopt="rr"
+               noxino_opt="noxino,"
        elif [ "${UNIONTYPE}" = "unionfs-fuse" ]
        then
                roopt="RO"
@@ -1358,6 +1339,8 @@ setup_unionfs ()
                        case "${UNIONTYPE}" in
                                unionfs-fuse)
                                        (ulimit -n 16384; unionfs-fuse -o cow -o noinitgroups -o default_permissions -o allow_other -o use_ino -o suid /cow=RW:${exposedrootfs}${dir} "${rootmnt}${dir}" || panic "mount ${UNIONTYPE} on ${rootmnt}${dir} failed with option cow,noinitgroups,default_permissions,allow_other,use_ino,suid=/cow=RW:${exposedrootfs}${dir}")
+                                       mkdir -p /dev/.initramfs/varrun
+                                       pidof unionfs-fuse >> /dev/.initramfs/varrun/sendsigs.omit || true
                                        ;;
 
                                *)
@@ -1369,10 +1352,12 @@ setup_unionfs ()
                case "${UNIONTYPE}" in
                        unionfs-fuse)
                                (ulimit -n 16384; unionfs-fuse -o cow -o noinitgroups -o default_permissions -o allow_other -o use_ino -o suid /cow=RW:${rofsstring} "${rootmnt}" || panic "mount ${UNIONTYPE} on ${rootmnt} failed with option cow,noinitgroups,default_permissions,allow_other,use_ino,suid=/cow:RW:${rofsstring}")
+                               mkdir -p /dev/.initramfs/varrun
+                               pidof unionfs-fuse >> /dev/.initramfs/varrun/sendsigs.omit || true
                                ;;
 
                        *)
-                               mount -t ${UNIONTYPE} -o noatime,dirs=/cow=rw:${rofsstring} ${UNIONTYPE} "${rootmnt}" || panic "mount ${UNIONTYPE} on ${rootmnt} failed with option noatime,dirs=/cow=rw:${rofsstring}"
+                               mount -t ${UNIONTYPE} -o noatime,${noxino_opt}dirs=/cow=rw:${rofsstring} ${UNIONTYPE} "${rootmnt}" || panic "mount ${UNIONTYPE} on ${rootmnt} failed with option noatime,${noxino_opt}dirs=/cow=rw:${rofsstring}"
                                ;;
                esac
        fi
@@ -1445,12 +1430,31 @@ check_dev ()
        # support for fromiso=.../isofrom=....
        if [ -n "$FROMISO" ]
        then
-               mkdir /isofrom
-               ISO_DEVICE="$(echo $FROMISO | sed 's|\(/dev/[a-z]*[0-9]*\).*|\1|')"
-               mount "$ISO_DEVICE" /isofrom
-               ISO_NAME="$(echo $FROMISO | sed 's|/dev/[a-z]*[0-9]*/||')"
-               loopdevname=$(setup_loop "/isofrom/${ISO_NAME}" "loop" "/sys/block/loop*" "" '')
-               devname="${loopdevname}"
+               ISO_DEVICE=$(dirname $FROMISO)
+               if ! [ -b $ISO_DEVICE ]
+               then
+                       # to support unusual device names like /dev/cciss/c0d0p1
+                       # as well we have to identify the block device name, let's
+                       # do that for up to 15 levels
+                       i=15
+                       while [ -n "$ISO_DEVICE" ] && [ "$i" -gt 0 ]
+                       do
+                               ISO_DEVICE=$(dirname ${ISO_DEVICE})
+                               [ -b "$ISO_DEVICE" ] && break
+                               i=$(($i -1))
+                       done
+               fi
+
+               if [ "$ISO_DEVICE" = "/" ]
+               then
+                       echo "Warning: device for bootoption isofrom= ($FROMISO) not found.">>/live.log
+               else
+                       mkdir /isofrom
+                       mount "$ISO_DEVICE" /isofrom
+                       ISO_NAME="$(echo $FROMISO | sed "s|$ISO_DEVICE||")"
+                       loopdevname=$(setup_loop "/isofrom/${ISO_NAME}" "loop" "/sys/block/loop*" "" '')
+                       devname="${loopdevname}"
+               fi
        fi
 
        if [ -z "${devname}" ]
@@ -1470,6 +1474,7 @@ check_dev ()
                        umount $mountpoint
                fi
        fi
+       [ -e "$devname" ] || continue
 
        if [ -n "${LIVE_MEDIA_OFFSET}" ]
        then
@@ -1481,7 +1486,10 @@ check_dev ()
 
        if is_supported_fs ${fstype}
        then
+               devuid=$(blkid -o value -s UUID "$devname")
+               [ -n "$devuid" ] && grep -qs "\<$devuid\>" $tried && continue
                mount -t ${fstype} -o ro,noatime "${devname}" ${mountpoint} || continue
+               [ -n "$devuid" ] && echo "$devuid" >> $tried
 
                if is_live_path ${mountpoint} && \
                        ([ "${skip_uuid_check}" ] || matches_uuid ${mountpoint})
@@ -1566,9 +1574,22 @@ find_livefs ()
        esac
 
        # or do the scan of block devices
-       for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)")
+       # prefer removable devices over non-removable devices, so scan them first
+       for sysblock in $(echo /sys/block/* | tr ' ' '\n' | egrep -v "/(loop|ram|dm-|fd)")
+       do
+               if [ "$(cat ${sysblock}/removable)" = "1" ]
+               then
+                       removable_devices_to_scan="$removable_devices_to_scan $sysblock"
+               else
+                       nonremovable_devices_to_scan="$nonremovable_devices_to_scan $sysblock"
+               fi
+       done
+       devices_to_scan="$removable_devices_to_scan $nonremovable_devices_to_scan"
+
+       for sysblock in $devices_to_scan
        do
                devname=$(sys2dev "${sysblock}")
+               [ -e "$devname" ] || continue
                fstype=$(get_fstype "${devname}")
 
                if /lib/udev/cdrom_id ${devname} > /dev/null
@@ -1587,6 +1608,7 @@ find_livefs ()
                                fi
                        done
                elif [ "${fstype}" = "squashfs" -o \
+                       "${fstype}" = "btrfs" -o \
                        "${fstype}" = "ext2" -o \
                        "${fstype}" = "ext3" -o \
                        "${fstype}" = "ext4" -o \
@@ -1594,7 +1616,7 @@ find_livefs ()
                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.
+                       # live-boot, so take it and run with it.
                        ln -s "${devname}" "${devname}.${fstype}"
                        echo "${devname}.${fstype}"
                        return 0
@@ -1640,6 +1662,14 @@ integrity_check ()
        fi
 }
 
+start_usplash_pulse ()
+{
+       if [ -x /sbin/usplash_write ]
+       then
+               /sbin/usplash_write "PULSELOGO"
+       fi
+}
+
 mountroot ()
 {
         if [ -x /scripts/local-top/cryptroot ]; then
@@ -1659,6 +1689,7 @@ mountroot ()
        Arguments
 
        set_usplash_timeout
+       start_usplash_pulse
 
        maybe_break live-premount
        log_begin_msg "Running /scripts/live-premount"
@@ -1679,11 +1710,28 @@ mountroot ()
                        panic "Unable to find a live file system on the network"
                fi
        else
-               if [ -n "${PLAIN_ROOT}" ] && [ -n "${ROOT}" ]
+               if [ -n "${ISCSI_PORTAL}" ]
+               then
+                       do_iscsi && livefs_root="${mountpoint}"
+               elif [ -n "${PLAIN_ROOT}" ] && [ -n "${ROOT}" ]
                then
                        # Do a local boot from hd
                        livefs_root=${ROOT}
                else
+                       if [ -x /usr/bin/memdiskfind ]
+                       then
+                               MEMDISK=$(/usr/bin/memdiskfind)
+
+                               if [ $? -eq 0 ]
+                               then
+                                       # We found a memdisk, set up phram
+                                       modprobe phram phram=memdisk,${MEMDISK}
+
+                                       # Load mtdblock, the memdisk will be /dev/mtdblock0
+                                       modprobe mtdblock
+                               fi
+                       fi
+
                        # Scan local devices for the image
                        i=0
                        while [ "$i" -lt 60 ]
@@ -1744,6 +1792,11 @@ mountroot ()
                mount_images_in_directory "${livefs_root}" "${rootmnt}" "${mac}"
        fi
 
+
+       if [ -n "${ROOT_PID}" ] ; then
+               echo "${ROOT_PID}" > "${rootmnt}"/live/root.pid
+       fi
+
        log_end_msg
 
        # unionfs-fuse needs /dev to be bind-mounted for the duration of
@@ -1753,6 +1806,13 @@ mountroot ()
                mount -n -o bind /dev "${rootmnt}/dev"
        fi
 
+       # Move to the new root filesystem so that programs there can get at it.
+       if [ ! -d /root/live/image ]
+       then
+               mkdir -p /root/live/image
+               mount --move /live/image /root/live/image
+       fi
+
        maybe_break live-bottom
        log_begin_msg "Running /scripts/live-bottom\n"