Adding live-initramfs 1.91.4-1.
[live-boot-grml.git] / scripts / live
index 9ab1ac5..35ba702 100755 (executable)
@@ -7,17 +7,22 @@ export PATH=/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:/usr/bin:/usr/sbin
 echo "/root/lib" >> /etc/ld.so.conf
 echo "/root/usr/lib" >> /etc/ld.so.conf
 
-mountpoint=/cdrom
+mountpoint=/live/image
+
+root_persistence="live-rw"
+home_persistence="home-rw"
+root_snapshot_label="live-sn"
+home_snapshot_label="home-sn"
 
 USERNAME=user
-USERFULLNAME="Live session user"
-HOST=live
+USERFULLNAME="Live user"
+HOSTNAME=host
 BUILD_SYSTEM=Custom
 
 mkdir -p $mountpoint
 
 [ -f /etc/live.conf ] && . /etc/live.conf
-export USERNAME USERFULLNAME HOST BUILD_SYSTEM
+export USERNAME USERFULLNAME HOSTNAME BUILD_SYSTEM
 
 . /scripts/live-helpers
 
@@ -25,22 +30,265 @@ if [ ! -f /live.vars ]; then
     touch /live.vars
 fi
 
-is_casper_path() {
-    path=$1
-    if [ -d "$path/live" ]; then
-        if [ "$(echo $path/live/*.squashfs)" != "$path/live/*.squashfs" ] ||
-            [ "$(echo $path/live/*.ext2)" != "$path/live/*.ext2" ] ||
-            [ "$(echo $path/live/*.dir)" != "$path/live/*.dir" ]; then
-            return 0
-        fi
-    fi
-    return 1
+parse_cmdline ()
+{
+       PRESEEDS=
+
+       # looking for live-initramfs specifics options as kernel parameters
+
+       for x in $(cat /proc/cmdline)
+       do
+               case $x in
+                       access=*)
+                               ACCESS=${x#access=}
+                               export ACCESS
+                               ;;
+
+                       console=*)
+                               DEFCONSOLE="${x#*=}"
+                               export DEFCONFSOLE
+                               ;;
+
+                       debug)
+                               DEBUG="Yes"
+                               export DEBUG
+
+                               set -x
+                               ;;
+
+                       hostname=*)
+                               HOSTNAME=${x#hostname=}
+                               LIVECONF="changed"
+                               export HOSTNAME LIVECONF
+                               ;;
+
+                       username=*)
+                               USERNAME=${x#username=}
+                               LIVECONF="changed"
+                               export USERNAME LIVECONF
+                               ;;
+
+                       userfullname=*)
+                               USERFULLNAME=${x#userfullname=}
+                               LIVECONF="changed"
+                               export USERFULLNAME LIVECONF
+                               ;;
+
+                       ip*)
+                               STATICIP=${x#ip=}
+
+                               if [ -z "${STATICIP}" ]
+                               then
+                                       STATICIP="frommedia"
+                               fi
+
+                               export STATICIP
+                               ;;
+
+                       keyb=*|kbd-chooser/method=*)
+                               KBD=${x#*=}
+                               export KBD
+                               ;;
+
+                       klayout=*|console-setup/layoutcode=*)
+                               KLAYOUT=${x#*=}
+                               export KLAYOUT
+                               ;;
+
+                       kvariant=*|console-setup/variantcode=*)
+                               KVARIANT=${x#*=}
+                               export KVARIANT
+                               ;;
+
+                       kmodel=*|console-setup/modelcode=*)
+                               KMODEL=${x#*=}
+                               export KMODEL
+                               ;;
+
+                       koptions=*)
+                               KOPTIONS=${x#koptions=}
+                               export KOPTIONS
+                               ;;
+
+                       live-getty)
+                               LIVE_GETTY=1
+                               export LIVE_GETTY
+                               ;;
+
+                       live-media=*|bootfrom=*)
+                               LIVE_MEDIA=${x#*=}
+                               export LIVE_MEDIA
+                               ;;
+
+                       live-media-encryption=*|encryption=*)
+                               LIVE_MEDIA_ENCRYPTION=${x#*=}
+                               export LIVE_MEDIA_ENCRYPTION
+                               ;;
+
+                       live-media-offset=*)
+                               LIVE_MEDIA_OFFSET=${x#live-media-offset=}
+                               export LIVE_MEDIA_OFFSET
+                               ;;
+
+                       live-media-timeout=*)
+                               LIVE_MEDIA_TIMEOUT=${x#live-media-timeout=}
+                               export LIVE_MEDIA_TIMEOUT
+                               ;;
+
+                       locale=*|debian-installer/locale=*)
+                               LOCALE=${x#*=}
+                               export LOCALE
+                               ;;
+
+                       module=*)
+                               MODULE=${x#module=}
+                               export MODULE
+                               ;;
+
+                       netboot*)
+                               NETBOOT=${x#netboot=}
+                               export NETBOOT
+                               ;;
+
+                       nfsopts=*)
+                               NFSOPTS=${x#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="${x#*=}"
+                               export LOCATION
+                               ;;
+
+                       */*=*)
+                               question="${x%%=*}"
+                               value="${x#*=}"
+                               PRESEEDS="${PRESEEDS}\"${question}=${value}\" "
+
+                               export PRESEEDS
+                               ;;
+
+                       showmounts)
+                               SHOWMOUNTS="Yes"
+                               export SHOWMOUNTS
+                               ;;
+
+                       timezone=*)
+                               TIMEZONE="${x#timezone=}"
+                               export TIMEZONE
+                               ;;
+
+                       todisk=*)
+                               TODISK=${x#todisk=}
+                               export TODISK
+                               ;;
+
+                       toram)
+                               TORAM="Yes"
+                               export TORAM
+                               ;;
+
+                       union=*)
+                               UNIONTYPE="${x#union=}"
+                               export UNIONTYPE
+                               ;;
+
+                       xdebconf)
+                               XDEBCONF="Yes"
+                               export XDEBCONF
+                               ;;
+
+                       xvideomode=*)
+                               XVIDEOMODE="${x#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 ]
+       then
+               for FILESYSTEM in squashfs ext2 ext3 xfs dir
+               do
+                       if [ "`echo ${DIRECTORY}/live/*.${FILESYSTEM}`" != "${DIRECTORY}/live/*.${FILESYSTEM}" ]
+                       then
+                               return 0
+                       fi
+               done
+       fi
+
+       return 1
 }
 
 get_backing_device() {
     case "$1" in
-        *.squashfs|*.ext2)
-            echo $(setup_loop "$1" "loop" "/sys/block/loop*")
+        *.squashfs|*.ext2|*.ext3)
+            echo $(setup_loop "$1" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}")
             ;;
         *.dir)
             echo "directory"
@@ -66,6 +314,7 @@ mount_images_in_directory() {
     rootmnt="$2"
     if match_files_in_dir "$directory/live/*.squashfs" ||
         match_files_in_dir "$directory/live/*.ext2" ||
+        match_files_in_dir "$directory/live/*.ext3" ||
         match_files_in_dir "$directory/live/*.dir"; then
         setup_unionfs "$directory/live" "$rootmnt"
     else
@@ -129,7 +378,7 @@ copy_live_to() {
     mount -t "${fstype}" ${mount_options} "${dev}" "${copyto}"
     cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files
     umount ${copyfrom}
-    mount -r -move ${copyto} ${copyfrom}
+    mount -r --move ${copyto} ${copyfrom}
     rmdir ${copyto}
     return 0
 }
@@ -243,19 +492,19 @@ do_snap_copy ()
 try_snap ()
 {
     # Look for $snap_label.* in block devices and copy the contents to $snap_mount
-    #   and remember the device and filename for resync on exit in casper.init
+    #   and remember the device and filename for resync on exit in live-initramfs.init
 
     snap_label="${1}"
     snap_mount="${2}"
     snap_type="${3}"
 
-    snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2")
+    snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2 ${snap_label}.ext3")
     if [ ! -z "${snapdata}" ]; then
         snapdev="$(echo ${snapdata} | cut -f1 -d ' ')"
         snapback="$(echo ${snapdata} | cut -f2 -d ' ')"
         snapfile="$(echo ${snapdata} | cut -f3 -d ' ')"
-        if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\)'; then
-            # squashfs or ext2 snapshot
+        if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\|ext3\)'; then
+            # squashfs or ext2/ext3 snapshot
             dev=$(get_backing_device "${snapback}/${snapfile}")
             if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}"; then
                  log_warning_msg "Impossible to include the ${snapfile} Snapshot"
@@ -302,7 +551,7 @@ setup_unionfs() {
     image_directory="$1"
     rootmnt="$2"
 
-    modprobe "${MP_QUIET}" -b unionfs
+    modprobe "${MP_QUIET}" -b ${UNIONTYPE}
 
     # run-init can't deal with images in a subdir, but we're going to
     # move all of these away before it runs anyway.  No, we're not,
@@ -320,24 +569,52 @@ setup_unionfs() {
         roopt="ro"
     fi
 
+       # Read image names from ${MODULE}.module if it exists
+       if [ -e "${image_directory}/filesystem.${MODULE}.module" ]
+       then
+               for IMAGE in `cat ${image_directory}/filesystem.${MODULE}.module`
+               do
+                       image_string="${image_string} ${image_directory}/${image}"
+               done
+       elif [ -e "${image_directory}/${MODULE}.module" ]
+       then
+               for IMAGE in `cat ${image_directory}/${MODULE}.module`
+               do
+                       image_string="${image_string} ${image_directory}/${image}"
+               done
+       else
+               # ${MODULE}.module does not exist, create a list of images
+               for FILESYSTEM in squashfs ext2 ext3 xfs dir
+               do
+                       for IMAGE in "${image_directory}"/*."${FILESYSTEM}"
+                       do
+                               if [ -e "${IMAGE}" ]
+                               then
+                                       image_string="${image_string} ${IMAGE}"
+                               fi
+                       done
+               done
+
+               # Now sort the list
+               image_string="`echo ${image_string} | sed -e 's/ /\n/g' | sort `"
+       fi
+
     mkdir -p "${croot}"
-    for image_type in "ext2" "squashfs" "dir" ; do
-        for image in "${image_directory}"/*."${image_type}"; do
-            imagename=$(basename "${image}")
-            if [ -d "${image}" ]; then
-                # it is a plain directory: do nothing
-                rofsstring="${image}=${roopt}:${rofsstring}"
-                rofslist="${image} ${rofslist}"
-            elif [ -f "${image}" ]; then
-                backdev=$(get_backing_device "$image")
-                fstype=$(get_fstype "${backdev}")
-                if [ "${fstype}" = "unknown" ]; then
-                    panic "Unknown file system type on ${backdev} (${image})"
-                fi
-                mkdir -p "${croot}/${imagename}"
-                mount -t "${fstype}" -o ro "${backdev}" "${croot}/${imagename}" || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}"
-            fi
-        done
+    for image in ${image_string}; do
+        imagename=$(basename "${image}")
+        if [ -d "${image}" ]; then
+            # it is a plain directory: do nothing
+            rofsstring="${image}=${roopt}:${rofsstring}"
+            rofslist="${image} ${rofslist}"
+        elif [ -f "${image}" ]; then
+            backdev=$(get_backing_device "$image")
+            fstype=$(get_fstype "${backdev}")
+            if [ "${fstype}" = "unknown" ]; then
+                panic "Unknown file system type on ${backdev} (${image})"
+             fi
+            mkdir -p "${croot}/${imagename}"
+            mount -t "${fstype}" -o ro "${backdev}" "${croot}/${imagename}" || panic "Can not mount $backdev ($image) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}"
+        fi
     done
     rofsstring=${rofsstring%:}
 
@@ -358,7 +635,7 @@ setup_unionfs() {
 
     mount ${cowdevice} -t ${cow_fstype} -o rw /cow || panic "Can not mount $cowdevice on /cow"
 
-    mount -t unionfs -o dirs=/cow=rw:$rofsstring unionfs "$rootmnt" || panic "Unionfs mount failed"
+    mount -t ${UNIONTYPE} -o dirs=/cow=rw:$rofsstring ${UNIONTYPE} "$rootmnt" || panic "${UNIONTYPE} mount failed"
 
     # Adding other custom mounts
     if [ -n "${PERSISTENT}" ]; then
@@ -382,21 +659,15 @@ setup_unionfs() {
             case d in
                 *.dir) # do nothing # mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
                     ;;
-                *) mount -move "${d}" "${rootmnt}/live/${d##*/}"
+                *) mount --move "${d}" "${rootmnt}/live/${d##*/}"
                     ;;
             esac
         done
-        # shows cow fs on /cow for use by live-snapshot
-        mkdir -p "${rootmnt}/cow"
-        mount -o bind /cow "${rootmnt}/cow"
     fi
 
-    # move the first mount; no head in busybox-initramfs
-    for d in $(mount -t squashfs | cut -d\  -f 3); do
-        mkdir -p "${rootmnt}/rofs"
-        mount -o move "${d}" "${rootmnt}/rofs"
-        break
-    done
+    # shows cow fs on /cow for use by live-snapshot
+    mkdir -p "${rootmnt}/live/cow"
+    mount -o bind /cow "${rootmnt}/live/cow"
 }
 
 check_dev ()
@@ -407,15 +678,15 @@ check_dev ()
         devname=$(sys2dev "${sysdev}")
     fi
 
-    if [ -n "${LIVEMEDIA_OFFSET}" ]; then
-        loopdevname=$(setup_loop "${devname}" "loop" "/sys/block/loop*" "${LIVEMEDIA_OFFSET}")
-        devname="${loopdevname}" 
+    if [ -n "${LIVE_MEDIA_OFFSET}" ]; then
+        loopdevname=$(setup_loop "${devname}" "loop" "/sys/block/loop*" "${LIVE_MEDIA_OFFSET}" '')
+        devname="${loopdevname}"
     fi
 
     fstype=$(get_fstype "${devname}")
     if is_supported_fs ${fstype}; then
         mount -t ${fstype} -o ro "${devname}" $mountpoint || continue
-        if is_casper_path $mountpoint; then
+        if is_live_path $mountpoint; then
             echo $mountpoint
             return 0
         else
@@ -423,7 +694,7 @@ check_dev ()
         fi
     fi
 
-    if [ -n "${LIVEMEDIA_OFFSET}" ]; then
+    if [ -n "${LIVE_MEDIA_OFFSET}" ]; then
         losetup -d "${loopdevname}"
     fi
     return 1
@@ -432,14 +703,14 @@ check_dev ()
 find_livefs() {
     timeout="${1}"
     # first look at the one specified in the command line
-    if [ ! -z "${LIVEMEDIA}" ]; then
-        if check_dev "null" "${LIVEMEDIA}"; then
+    if [ ! -z "${LIVE_MEDIA}" ]; then
+        if check_dev "null" "${LIVE_MEDIA}"; then
             return 0
         fi
     fi
     # don't start autodetection before timeout has expired
-    if [ -n "${LIVEMEDIA_TIMEOUT}" ]; then
-        if [ "${timeout}" -lt "${LIVEMEDIA_TIMEOUT}" ]; then
+    if [ -n "${LIVE_MEDIA_TIMEOUT}" ]; then
+        if [ "${timeout}" -lt "${LIVE_MEDIA_TIMEOUT}" ]; then
             return 1
         fi
     fi
@@ -458,11 +729,11 @@ find_livefs() {
                 fi
             done
         elif [ "${fstype}" = "squashfs" -o \
-                "${fstype}" = "ext3" -o \
-                "${fstype}" = "ext2" ]; then
+                "${fstype}" = "ext2" -o \
+                "${fstype}" = "ext3" ]; then
             # This is an ugly hack situation, the block device has
             # an image directly on it.  It's hopefully
-            # casper, so take it and run with it.
+            # live-initramfs, so take it and run with it.
             ln -s "${devname}" "${devname}.${fstype}"
             echo "${devname}.${fstype}"
             return 0
@@ -489,6 +760,8 @@ mountroot() {
     exec > live.log
     exec 2>&1
 
+    parse_cmdline
+
     set_usplash_timeout
     [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-premount"
     pulsate
@@ -508,9 +781,9 @@ mountroot() {
         fi
     else
         # Scan local devices for the image
-        for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13; do
+        for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do
             livefs_root=$(find_livefs $i)
-            if [ "${livefs_root}" ]; then
+            if [ -n "${livefs_root}" ]; then
                 break
             fi
             sleep 1
@@ -527,7 +800,7 @@ mountroot() {
         live_dest="${TODISK}"
     fi
     if [ "${live_dest}" ]; then
-        log_begin_msg "Copying live_media to ${live_dest}"
+        log_begin_msg "Copying live media to ${live_dest}"
         copy_live_to "${livefs_root}" "${live_dest}"
         log_end_msg
     fi