Adding preparations for booting through syslinux memdisk.
[live-boot-grml.git] / scripts / live
index 4169c90..5b5a3b9 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"
@@ -33,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 ]
@@ -53,19 +51,11 @@ Arguments ()
                case "${ARGUMENT}" in
                        skipconfig)
                                NOACCESSIBILITY="Yes"
-                               NOAPTCDROM="Yes"
-                               NOAUTOLOGIN="Yes"
-                               NOCONSOLEKEYBOARD="Yes"
                                NOFASTBOOT="Yes"
                                NOFSTAB="Yes"
-                               NOHOSTS="Yes"
-                               NOLOCALES="Yes"
                                NONETWORKING="Yes"
-                               NOTIMEZONE="Yes"
-                               NOXAUTOCONFIG="Yes"
-                               NOXAUTOLOGIN="Yes"
 
-                               export NOACCESSIBILITY NOAPTCDROM NOAUTOLOGIN NOCONSOLEKEYBOARD NOFASTBOOT NOFSTAB NOHOSTS NOLOCALES NONETWORKING NOTIMEZONE NOXAUTOCONFIG NOXAUTOLOGIN
+                               export NOACCESSIBILITY NOFASTBOOT NOFSTAB NONETWORKING
                                ;;
 
                        access=*)
@@ -85,6 +75,17 @@ 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
@@ -118,6 +119,19 @@ Arguments ()
                        httpfs=*)
                                HTTPFS="${ARGUMENT#httpfs=}"
                                export HTTPFS
+                                ;;
+
+                       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=*)
@@ -125,18 +139,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
@@ -158,31 +160,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
@@ -213,17 +190,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
@@ -249,26 +215,6 @@ Arguments ()
                                export NOACCESSIBILITY
                                ;;
 
-                       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
@@ -279,16 +225,6 @@ Arguments ()
                                export NOFSTAB
                                ;;
 
-                       nohosts)
-                               NOHOSTS="Yes"
-                               export NOHOSTS
-                               ;;
-
-                       nolocales)
-                               NOLOCALES="Yes"
-                               export NOLOCALES
-                               ;;
-
                        nonetworking)
                                NONETWORKING="Yes"
                                export NONETWORKING
@@ -299,16 +235,6 @@ Arguments ()
                                export SWAPON
                                ;;
 
-                       noxautoconfig)
-                               NOXAUTOCONFIG="Yes"
-                               export NOXAUTOCONFIG
-                               ;;
-
-                       noxscreensaver)
-                               NOXSCREENSAVER="Yes"
-                               export NOXSCREENSAVER
-                               ;;
-
                        persistent)
                                PERSISTENT="Yes"
                                export PERSISTENT
@@ -355,25 +281,6 @@ Arguments ()
                                export NOPRESEED
                                ;;
 
-                       url=*)
-                               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 "${URL_LOCATION}"
-                               [ "${NETBOOT}" ] || chroot /root ifconfig eth0 down
-
-                               umount /root/sys
-                               umount /root/proc
-                               umount /root/dev
-
-                               LOCATIONS="/tmp/$(basename ${URL_LOCATION}) ${LOCATIONS}"
-                               ;;
-
                        */*=*)
                                question="${ARGUMENT%%=*}"
                                value="${ARGUMENT#*=}"
@@ -391,21 +298,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
@@ -446,21 +338,6 @@ Arguments ()
                                UNIONTYPE="${ARGUMENT#union=}"
                                export UNIONTYPE
                                ;;
-
-                       xdebconf)
-                               XDEBCONF="Yes"
-                               export XDEBCONF
-                               ;;
-
-                       xdriver=*)
-                               XDRIVER="${ARGUMENT#xdriver=}"
-                               export XDRIVER
-                               ;;
-
-                       xvideomode=*)
-                               XVIDEOMODE="${ARGUMENT#xvideomode=}"
-                               export XVIDEOMODE
-                               ;;
                esac
        done
 
@@ -697,10 +574,8 @@ copy_live_to ()
        return 0
 }
 
-do_netmount ()
+do_netsetup ()
 {
-       rc=1
-
        modprobe -q af_packet # For DHCP
 
        udevadm trigger
@@ -763,6 +638,11 @@ do_netmount ()
        [ -z ${HOSTNAME} ] && HOSTNAME=${OLDHOSTNAME}
        export HOSTNAME
 
+       if [ -n "${DEVICE}" ]
+       then
+               HWADDR="$(cat /sys/class/net/${DEVICE}/address)"
+       fi
+
        # 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 && \
@@ -772,16 +652,23 @@ do_netmount ()
        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" ]
@@ -805,22 +692,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
@@ -848,9 +789,16 @@ do_httpmount ()
                                                fi
                                                modprobe fuse
                                                $FUSE_MOUNT "${url}" "${dest}"
+                                               FUSE_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
                                        ;;
 
@@ -863,7 +811,18 @@ 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
+               if [ -n "${FUSE_PID}" ] ; then
+                       echo "${FUSE_PID}" > ${mountpoint}/root.pid
+               fi
        fi
 
        return ${rc}
@@ -1737,11 +1696,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 ]
@@ -1833,8 +1809,4 @@ mountroot ()
        exec 2>&7 7>&-
        kill ${tailpid}
        [ -w "${rootmnt}/var/log/" ] && cp live.log "${rootmnt}/var/log/" 2>/dev/null
-       if [ -f /etc/live.conf ]
-       then
-               cp /etc/live.conf "${rootmnt}/etc/"
-       fi
 }