Change output to live-boot.log
[live-boot-grml.git] / scripts / live
index e660ac4..5681362 100755 (executable)
@@ -68,6 +68,10 @@ Arguments ()
                                export DEFCONSOLE
                                ;;
 
+                       BOOTIF=*)
+                               BOOTIF="${x#BOOTIF=}"
+                               ;;
+
                        debug)
                                DEBUG="Yes"
                                export DEBUG
@@ -98,9 +102,9 @@ Arguments ()
                                ;;
 
                        fetch=*)
-                                FETCH="${ARGUMENT#fetch=}"
-                                export FETCH
-                                ;;
+                               FETCH="${ARGUMENT#fetch=}"
+                               export FETCH
+                               ;;
 
                        forcepersistentfsck)
                                FORCEPERSISTENTFSCK="Yes"
@@ -115,7 +119,7 @@ Arguments ()
                        httpfs=*)
                                HTTPFS="${ARGUMENT#httpfs=}"
                                export HTTPFS
-                                ;;
+                               ;;
 
                        iscsi=*)
                                ISCSI="${ARGUMENT#iscsi=}"
@@ -226,6 +230,10 @@ Arguments ()
                                export NONETWORKING
                                ;;
 
+                       ramdisk-size=*)
+                               ramdisk_size="${ARGUMENT#ramdisk-size=}"
+                               ;;
+
                        swapon)
                                SWAPON="Yes"
                                export SWAPON
@@ -262,6 +270,16 @@ Arguments ()
                                export NOPERSISTENT
                                ;;
 
+                       noprompt)
+                               NOPROMPT="Yes"
+                               export NOPROMPT
+                               ;;
+
+                       noprompt=*)
+                               NOPROMPT="${ARGUMENT#noprompt=}"
+                               export NOPROMPT
+                               ;;
+
                        quickusbmodules)
                                QUICKUSBMODULES="Yes"
                                export QUICKUSBMODULES
@@ -321,9 +339,9 @@ Arguments ()
                                ;;
 
                        skipunion)
-                                SKIP_UNION_MOUNTS="Yes"
-                                export SKIP_UNION_MOUNTS
-                                ;;
+                               SKIP_UNION_MOUNTS="Yes"
+                               export SKIP_UNION_MOUNTS
+                               ;;
 
                        root=*)
                                ROOT="${ARGUMENT#root=}"
@@ -462,7 +480,7 @@ is_nice_device ()
 {
        sysfs_path="${1#/sys}"
 
-       if /lib/udev/path_id "${sysfs_path}" | egrep -q "ID_PATH=(usb|pci-|platform-orion-ehci|platform-mmc|platform-mxsdhci|)"
+       if /lib/udev/path_id "${sysfs_path}" | egrep -q "ID_PATH=(usb|pci-|platform-sata_mv|platform-orion-ehci|platform-mmc|platform-mxsdhci|)"
        then
                return 0
        elif echo "${sysfs_path}" | grep -q '^/block/vd[a-z]$'
@@ -471,6 +489,9 @@ is_nice_device ()
        elif echo ${sysfs_path} | grep -q "^/block/dm-"
        then
                return 0
+       elif echo ${sysfs_path} | grep -q "^/block/mtdblock"
+       then
+               return 0
        fi
 
        return 1
@@ -525,6 +546,13 @@ copy_live_to ()
                return 1
        fi
 
+       # Custom ramdisk size
+       if [ -z "${mount_options}" ] && [ -n "${ramdisk_size}" ]
+       then
+               # FIXME: should check for wrong values
+               mount_options="-o size=${ramdisk_size}"
+       fi
+
        # begin copying (or uncompressing)
        mkdir "${copyto}"
        log_begin_msg "mount -t ${fstype} ${mount_options} ${dev} ${copyto}"
@@ -577,10 +605,61 @@ do_netsetup ()
        udevadm trigger
        udevadm settle
 
+       [ -n "$ETHDEV_TIMEOUT" ] || ETHDEV_TIMEOUT=15
+       echo "Using timeout of $ETHDEV_TIMEOUT seconds for network configuration."
+
        if [ -z "${NETBOOT}" ] && [ -z "${FETCH}" ] && \
           [ -z "${HTTPFS}" ] && [ -z "${FTPFS}" ]
        then
 
+
+       # support for Syslinux IPAPPEND parameter
+       # it sets the BOOTIF variable on the kernel parameter
+
+       if [ -n "${BOOTIF}" ]
+       then
+               # pxelinux sets BOOTIF to a value based on the mac address of the
+               # network card used to PXE boot, so use this value for DEVICE rather
+               # than a hard-coded device name from initramfs.conf. this facilitates
+               # network booting when machines may have multiple network cards.
+               # pxelinux sets BOOTIF to 01-$mac_address
+
+               # strip off the leading "01-", which isn't part of the mac
+               # address
+               temp_mac=${BOOTIF#*-}
+
+               # convert to typical mac address format by replacing "-" with ":"
+               bootif_mac=""
+               IFS='-'
+               for x in $temp_mac
+               do
+                       if [ -z "$bootif_mac" ]
+                       then
+                               bootif_mac="$x"
+                       else
+                               bootif_mac="$bootif_mac:$x"
+                       fi
+               done
+               unset IFS
+
+               # look for devices with matching mac address, and set DEVICE to
+               # appropriate value if match is found.
+
+               for device in /sys/class/net/*
+               do
+                       if [ -f "$device/address" ]
+                       then
+                               current_mac=$(cat "$device/address")
+
+                               if [ "$bootif_mac" = "$current_mac" ]
+                               then
+                                       DEVICE=${device##*/}
+                                       break
+                               fi
+                       fi
+               done
+       fi
+
        # 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)
@@ -599,9 +678,6 @@ do_netsetup ()
                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
@@ -625,45 +701,57 @@ do_netsetup ()
        done
 
        else
-       ipconfig ${DEVICE} | tee /netboot.config
-       fi
-
-       # source relevant ipconfig output
-       OLDHOSTNAME=${HOSTNAME}
-       . /tmp/net-${DEVICE}.conf
-       [ -z ${HOSTNAME} ] && HOSTNAME=${OLDHOSTNAME}
-       export HOSTNAME
-
-       if [ -n "${DEVICE}" ]
-       then
-               HWADDR="$(cat /sys/class/net/${DEVICE}/address)"
+               for interface in ${DEVICE}; do
+                       ipconfig -t "$ETHDEV_TIMEOUT" ${interface} | tee /netboot-${interface}.config
+                       [ -e /tmp/net-${interface}.conf ] && . /tmp/net-${interface}.conf
+                       if [ "$IPV4ADDR" != "0.0.0.0" ]
+                       then
+                               break
+                       fi
+               done
        fi
 
-       if [ ! -e "/etc/resolv.conf" ]
-       then
-               echo "Creating /etc/resolv.conf"
+       for interface in ${DEVICE}; do
+               # source relevant ipconfig output
+               OLDHOSTNAME=${HOSTNAME}
+               [ -e /tmp/net-${interface}.conf ] && . /tmp/net-${interface}.conf
+               [ -z ${HOSTNAME} ] && HOSTNAME=${OLDHOSTNAME}
+               export HOSTNAME
 
-               if [ -n "${DNSDOMAIN}" ]
+               if [ -n "${interface}" ]
                then
-                       echo "domain ${DNSDOMAIN}" > /etc/resolv.conf
-                       echo "search ${DNSDOMAIN}" > /etc/resolv.conf
+                       HWADDR="$(cat /sys/class/net/${interface}/address)"
                fi
 
-               for i in ${IPV4DNS0} ${IPV4DNS1} ${IPV4DNS1}
-               do
-                       echo "nameserver $i" >> /etc/resolv.conf
-               done
-       fi
+               if [ ! -e "/etc/resolv.conf" ]
+               then
+                       echo "Creating /etc/resolv.conf"
 
-       # Check if we have a network device at all
-       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
+                       if [ -n "${DNSDOMAIN}" ]
+                       then
+                               echo "domain ${DNSDOMAIN}" > /etc/resolv.conf
+                               echo "search ${DNSDOMAIN}" >> /etc/resolv.conf
+                       fi
+
+                       for i in ${IPV4DNS0} ${IPV4DNS1} ${IPV4DNS1}
+                       do
+                               if [ -n "$i" ] && [ "$i" != 0.0.0.0 ]
+                               then
+                                       echo "nameserver $i" >> /etc/resolv.conf
+                               fi
+                       done
+               fi
+
+               # Check if we have a network device at all
+               if ! ls /sys/class/net/"$interface" > /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
+       done
 }
 
 do_netmount()
@@ -713,7 +801,7 @@ do_iscsi()
        [ "${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
+       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
@@ -896,6 +984,8 @@ do_snap_copy ()
 
        if [ -b "${fromdev}" ]
        then
+               log_success_msg "Copying snapshot ${fromdev} to ${todir}..."
+
                # look for free mem
                if [ -n "${HOMEMOUNTED}" -a "${snap_type}" = "HOME" ]
                then
@@ -933,9 +1023,8 @@ do_snap_copy ()
 
                return 0
        else
-               return 1
-
                log_warning_msg "Unable to find the snapshot ${snap_type} medium"
+               return 1
        fi
 }
 
@@ -943,28 +1032,39 @@ find_snap ()
 {
        # Look for ${snap_label}.* in block devices
        snap_label="${1}"
+       black_listed_devices="${2}"
 
        if [ "${PERSISTENT}" != "nofiles" ]
        then
                # search for image files
-               snapdata=$(find_files "${PERSISTENT_PATH}${snap_label}.squashfs ${PERSISTENT_PATH}${snap_label}.cpio.gz ${PERSISTENT_PATH}${snap_label}.ext2 ${PERSISTENT_PATH}${snap_label}.ext3 ${PERSISTENT_PATH}${snap_label}.ext4 ${PERSISTENT_PATH}${snap_label}.jffs2")
+               snapdata=$(find_files "${PERSISTENT_PATH}${snap_label}.squashfs ${PERSISTENT_PATH}${snap_label}.cpio.gz ${PERSISTENT_PATH}${snap_label}.ext2 ${PERSISTENT_PATH}${snap_label}.ext3 ${PERSISTENT_PATH}${snap_label}.ext4 ${PERSISTENT_PATH}${snap_label}.jffs2" "${black_listed_devices}")
        fi
 
        if [ -z "${snapdata}" ]
        then
-               snapdata=$(find_cow_device "${snap_label}")
+               snapdata=$(find_cow_device "${snap_label}" "${black_listed_devices}")
        fi
        echo "${snapdata}"
 }
 
 try_snap ()
 {
-        # copy the contents of previously found snapshot to ${snap_mount}
+       # copy the contents of previously found snapshot to ${snap_mount}
        # and remember the device and filename for resync on exit in live-boot.init
 
        snapdata="${1}"
        snap_mount="${2}"
        snap_type="${3}"
+       snap_relpath="${4}"
+
+       if [ -z "${snap_relpath}" ]
+       then
+               # root snapshot, default usage
+               snap_relpath="/"
+       else
+               # relative snapshot (actually used just for "/home" snapshots)
+               snap_mount="${2}${snap_relpath}"
+       fi
 
        if [ -n "${snapdata}" ] && [ ! -b "${snapdata}" ]
        then
@@ -1002,8 +1102,16 @@ try_snap ()
                                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 [ -s "${snapback}/${snapfile}" ]
+                       then
+                               BEFOREDIR="$(pwd)"
+                               cd "${snap_mount}" && zcat "${snapback}/${snapfile}" | $cpiopath $cpioargs --extract --preserve-modification-time --no-absolute-filenames --sparse 2>/dev/null
+                               RES="$?"
+                               cd "${BEFOREDIR}"
+                       else
+                               log_warning_msg "${snapback}/${snapfile} is empty, adding it for sync on reboot."
+                               RES="0"
+                       fi
 
                        if [ "${RES}" != "0" ]
                        then
@@ -1035,7 +1143,7 @@ try_snap ()
 
                if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}"
                then
-                       log_warning_msg "Impossible to include the ${snap_type} Snapshot"
+                       log_warning_msg "Impossible to include the ${snap_type} Snapshot (i)"
                        return 1
                else
                        if [ -n "${snapfile}" ]
@@ -1045,11 +1153,11 @@ try_snap ()
                        fi
                fi
        else
-               log_warning_msg "Impossible to include the ${snap_type} Snapshot"
+               log_warning_msg "Impossible to include the ${snap_type} Snapshot (o)"
                return 1
        fi
 
-       echo "export ${snap_type}SNAP="/cow${snap_mount#$rootmnt}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt
+       echo "export ${snap_type}SNAP=${snap_relpath}:${snapdev}:${snapfile}" >> snapshot.conf # for resync on reboot/halt
        return 0
 }
 
@@ -1057,7 +1165,7 @@ setup_unionfs ()
 {
        image_directory="${1}"
        rootmnt="${2}"
-        addimage_directory="${3}"
+       addimage_directory="${3}"
 
        case ${UNIONTYPE} in
                aufs|unionfs)
@@ -1086,7 +1194,6 @@ setup_unionfs ()
        croot="/"
 
        # Let's just mount the read-only file systems first
-       rofsstring=""
        rofslist=""
 
        if [ "${UNIONTYPE}" = "aufs" ]
@@ -1146,7 +1253,7 @@ setup_unionfs ()
                        image_string="$(echo ${image_string} | sed -e 's/ /\n/g' | sort )"
                fi
 
-       [ -n "${MODULETORAMFILE}" ] && image_string="${image_directory}/$(basename ${MODULETORAMFILE})"
+               [ -n "${MODULETORAMFILE}" ] && image_string="${image_directory}/$(basename ${MODULETORAMFILE})"
 
                mkdir -p "${croot}"
 
@@ -1163,7 +1270,6 @@ setup_unionfs ()
                        if [ -d "${image}" ]
                        then
                                # it is a plain directory: do nothing
-                               rofsstring="${image}=${roopt}:${rofsstring}"
                                rofslist="${image} ${rofslist}"
                        elif [ -f "${image}" ]
                        then
@@ -1186,9 +1292,17 @@ setup_unionfs ()
                                        log_warning_msg "Unknown file system type on ${backdev} (${image}), assuming ${fstype}."
                                fi
 
-                               mkdir -p "${croot}/${imagename}"
-                               log_begin_msg "Mounting \"${image}\" on \"${croot}${imagename}\" via \"${backdev}\""
-                               mount -t "${fstype}" -o ro,noatime "${backdev}" "${croot}/${imagename}" || panic "Can not mount ${backdev} (${image}) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}"
+                               if [ "${UNIONTYPE}" != "unionmount" ]
+                               then
+                                       mpoint="${croot}/${imagename}"
+                                       rofslist="${mpoint} ${rofslist}"
+                               else
+                                       mpoint="${rootmnt}"
+                                       rofslist="${rootmnt} ${rofslist}"
+                               fi
+                               mkdir -p "${mpoint}"
+                               log_begin_msg "Mounting \"${image}\" on \"${mpoint}\" via \"${backdev}\""
+                               mount -t "${fstype}" -o ro,noatime "${backdev}" "${mpoint}" || panic "Can not mount ${backdev} (${image}) on ${mpoint}"
                                log_end_msg
                        fi
                done
@@ -1196,14 +1310,14 @@ setup_unionfs ()
                # we have a plain root system
                mkdir -p "${croot}/filesystem"
                log_begin_msg "Mounting \"${image_directory}\" on \"${croot}/filesystem\""
-               mount -t $(get_fstype "${image_directory}") -o ro,noatime "${image_directory}" "${croot}/filesystem" || panic "Can not mount ${image_directory} on ${croot}/filesystem" && rofsstring="${croot}/filesystem=${roopt}:${rofsstring}" && rofslist="${croot}/filesystem ${rofslist}"
+               mount -t $(get_fstype "${image_directory}") -o ro,noatime "${image_directory}" "${croot}/filesystem" || \
+                       panic "Can not mount ${image_directory} on ${croot}/filesystem" && \
+                       rofslist="${croot}/filesystem ${rofslist}"
                # probably broken:
                mount -o bind ${croot}/filesystem $mountpoint
                log_end_msg
        fi
 
-       rofsstring=${rofsstring%:}
-
        mkdir -p /cow
 
        # Looking for "${root_persistence}" device or file
@@ -1302,29 +1416,33 @@ setup_unionfs ()
                cow_mountopt="rw,noatime,mode=755"
        fi
 
-       if [ "${cow_fstype}" = "nfs" ]
+       if [ "${UNIONTYPE}" != "unionmount" ]
        then
-               log_begin_msg \
-                       "Trying nfsmount ${nfs_cow_opts} ${cowdevice} /cow"
-               nfsmount ${nfs_cow_opts} ${cowdevice} /cow || \
-                       panic "Can not mount ${cowdevice} (n: ${cow_fstype}) on /cow"
-       else
-               mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || \
-                       panic "Can not mount ${cowdevice} (o: ${cow_fstype}) on /cow"
+
+               if [ "${cow_fstype}" = "nfs" ]
+               then
+                       log_begin_msg \
+                               "Trying nfsmount ${nfs_cow_opts} ${cowdevice} /cow"
+                       nfsmount ${nfs_cow_opts} ${cowdevice} /cow || \
+                               panic "Can not mount ${cowdevice} (n: ${cow_fstype}) on /cow"
+               else
+                       mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || \
+                               panic "Can not mount ${cowdevice} (o: ${cow_fstype}) on /cow"
+               fi
        fi
 
        rofscount=$(echo ${rofslist} |wc -w)
 
-       if [ -n "${EXPOSED_ROOT}" ]
+       if [ ${rofscount} -ne 1 ]
        then
-               if [ ${rofscount} -ne 1 ]
-               then
-                       panic "only one RO file system supported with exposedroot: ${rofslist}"
-               fi
-               exposedrootfs=${rofslist%% }
+               panic "only one RO file system supported with exposedroot: ${rofslist}"
+       fi
+       rofs=${rofslist%% }
 
-               mount --bind ${exposedrootfs} ${rootmnt} || \
-                       panic "bind mount of ${exposedrootfs} failed"
+       if [ -n "${EXPOSED_ROOT}" ]
+       then
+               mount --bind ${rofs} ${rootmnt} || \
+                       panic "bind mount of ${rofs} failed"
 
                if [ -z "${SKIP_UNION_MOUNTS}" ]
                then
@@ -1332,35 +1450,49 @@ setup_unionfs ()
                else
                        cow_dirs=''
                fi
+       else
+               cow_dirs="/"
+       fi
 
-               for dir in ${cow_dirs}; do
-                       mkdir -p /cow${dir}
+       if [ "${cow_fstype}" != "tmpfs" ] && [ "${cow_dirs}" != "/" ] && [ "${UNIONTYPE}" = "unionmount" ]
+       then
+               true # FIXME: Maybe it does, I don't really know.
+               #panic "unionmount does not support subunions (${cow_dirs})."
+       fi
 
-                       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
-                                       ;;
+       unionmountopts=""
+       unionmountpoint=""
 
-                               *)
-                                       mount -t ${UNIONTYPE} -o rw,noatime,dirs=/cow${dir}=rw:${exposedrootfs}${dir}=ro ${UNIONTYPE} "${rootmnt}${dir}" || panic "mount ${UNIONTYPE} on ${rootmnt}${dir} failed with option rw,noatime,dirs=/cow${dir}=rw:${exposedrootfs}${dir}=ro"
-                                       ;;
-                       esac
-               done
-       else
+       for dir in ${cow_dirs}; do
+               mkdir -p /cow${dir}
+
+               unionmountpoint="${rootmnt}${dir}"
+               unionrw="/cow${dir}"
+               unionro="${rofs}${dir}"
+               # We don't handle spaces and other junk gracefully here, hopefully not needed.
                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
+                               unionmountopts="-o cow -o noinitgroups -o default_permissions -o allow_other -o use_ino -o suid"
+                               unionmountopts="${unionmountopts} ${unionrw}=RW:${unionro}=RO"
+                               ( sysctl -w fs.file-max=391524 ; ulimit -HSn 16384
+                               unionfs-fuse ${unionmountopts} "${unionmountpoint}" ) && \
+                                       ( mkdir -p /run/initramfs
+                               pidof unionfs-fuse >> /run/initramfs/sendsigs.omit || true )
                                ;;
 
+                       unionmount)
+                               unionmountopts="-t ${cow_fstype} -o noatime,union,${cow_mountopt} ${cowdevice}"
+                               mount_full $unionmountopts "${unionmountpoint}"
+                               ;;
+
+
                        *)
-                               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}"
+                               unionmountopts="-o noatime,${noxino_opt}dirs=${unionrw}=rw:${unionro}=${roopt}"
+                               mount -t ${UNIONTYPE} ${unionmountopts} ${UNIONTYPE} "${unionmountpoint}"
                                ;;
-               esac
-       fi
+               esac || \
+                       panic "mount ${UNIONTYPE} on ${unionmountpoint} failed with option ${unionmountopts}"
+       done
 
        # Correct the permissions of /:
        chmod 0755 "${rootmnt}"
@@ -1387,7 +1519,7 @@ setup_unionfs ()
                # Look for other snapshots to copy in
                try_snap "${root_snapdata}" "${rootmnt}" "ROOT"
                # This second type should be removed when snapshot grow smarter
-               try_snap "${home_snapdata}" "${rootmnt}/home" "HOME"
+               try_snap "${home_snapdata}" "${rootmnt}" "HOME" "/home"
        fi
 
        if [ -n "${SHOWMOUNTS}" ]
@@ -1447,13 +1579,19 @@ check_dev ()
 
                if [ "$ISO_DEVICE" = "/" ]
                then
-                       echo "Warning: device for bootoption isofrom= ($FROMISO) not found.">>/live.log
+                       echo "Warning: device for bootoption isofrom= ($FROMISO) not found.">>/live-boot.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}"
+                       fs_type=$(get_fstype "${ISO_DEVICE}")
+                       if is_supported_fs ${fs_type}
+                       then
+                               mkdir /isofrom
+                               mount -t $fs_type "$ISO_DEVICE" /isofrom
+                               ISO_NAME="$(echo $FROMISO | sed "s|$ISO_DEVICE||")"
+                               loopdevname=$(setup_loop "/isofrom/${ISO_NAME}" "loop" "/sys/block/loop*" "" '')
+                               devname="${loopdevname}"
+                       else
+                               echo "Warning: unable to mount $ISO_DEVICE." >>/live-boot.log
+                       fi
                fi
        fi
 
@@ -1529,8 +1667,7 @@ find_livefs ()
                        do
                                if [ "$(cat ${sysblock}/removable)" = "1" ]
                                then
-                                       if readlink ${sysblock} | grep -q usb ||
-                                          readlink ${sysblock}/device | grep -q usb # linux < 2.6.29
+                                       if readlink ${sysblock} | grep -q usb
                                        then
                                                for dev in $(subdevices "${sysblock}")
                                                do
@@ -1626,16 +1763,6 @@ find_livefs ()
        return 1
 }
 
-set_usplash_timeout ()
-{
-       if [ -x /sbin/usplash_write ]
-       then
-               /sbin/usplash_write "TIMEOUT 120"
-       else if [ -x /sbin/splashy_update ] ; then
-               /sbin/splashy_update "TIMEOUT 120"
-       fi ; fi
-}
-
 integrity_check ()
 {
        media_mountpoint="${1}"
@@ -1662,25 +1789,17 @@ 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
+       if [ -x /scripts/local-top/cryptroot ]; then
            /scripts/local-top/cryptroot
        fi
 
        exec 6>&1
        exec 7>&2
-       exec > live.log
+       exec > live-boot.log
        exec 2>&1
-       tail -f live.log >&7 &
+       tail -f live-boot.log >&7 &
        tailpid="${!}"
 
        # Ensure 'panic' function is overridden
@@ -1688,9 +1807,6 @@ mountroot ()
 
        Arguments
 
-       set_usplash_timeout
-       start_usplash_pulse
-
        maybe_break live-premount
        log_begin_msg "Running /scripts/live-premount"
        run_scripts /scripts/live-premount
@@ -1699,8 +1815,6 @@ mountroot ()
        # Needed here too because some things (*cough* udev *cough*)
        # changes the timeout
 
-       set_usplash_timeout
-
        if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ] || [ ! -z "${HTTPFS}" ] || [ ! -z "${FTPFS}" ]
        then
                if do_netmount
@@ -1819,6 +1933,25 @@ mountroot ()
        # when booting FAI, this simple workaround solves it
        ls /root/* >/dev/null 2>&1
 
+       # copy snapshot configuration if exists
+       if [ -f snapshot.conf ]
+       then
+               log_begin_msg "Copying snapshot.conf to ${rootmnt}/etc/live/boot.d"
+               if [ ! -d "${rootmnt}/etc/live/boot.d" ]
+               then
+                       mkdir -p "${rootmnt}/etc/live/boot.d"
+               fi
+               cp snapshot.conf "${rootmnt}/etc/live/boot.d/"
+               log_end_msg
+       fi
+
+       if [ -f /etc/resolv.conf ] && [ ! -s ${rootmnt}/etc/resolv.conf ]
+       then
+               log_begin_msg "Copying /etc/resolv.conf to ${rootmnt}/etc/resolv.conf"
+               cp -v /etc/resolv.conf ${rootmnt}/etc/resolv.conf
+               log_end_msg
+       fi
+
        maybe_break live-bottom
        log_begin_msg "Running /scripts/live-bottom\n"
 
@@ -1833,5 +1966,5 @@ mountroot ()
        exec 1>&6 6>&-
        exec 2>&7 7>&-
        kill ${tailpid}
-       [ -w "${rootmnt}/var/log/" ] && cp live.log "${rootmnt}/var/log/" 2>/dev/null
+       [ -w "${rootmnt}/var/log/" ] && cp live-boot.log "${rootmnt}/var/log/" 2>/dev/null
 }