Manually loading fuse when required.
[live-boot-grml.git] / scripts / live
index 9bbf8be..0fb6adf 100755 (executable)
@@ -49,6 +49,35 @@ Arguments ()
        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
+                               ;;
+
                        access=*)
                                ACCESS="${ARGUMENT#access=}"
                                export ACCESS
@@ -372,6 +401,11 @@ Arguments ()
                                export NOPERSISTENT
                                ;;
 
+                       quickusbmodules)
+                               QUICKUSBMODULES="Yes"
+                               export QUICKUSBMODULES
+                               ;;
+
                        preseed/file=*|file=*)
                                LOCATION="${ARGUMENT#*=}"
                                export LOCATION
@@ -390,9 +424,9 @@ Arguments ()
                                mount -o bind /dev /root/dev
 
                                mkdir -p /root/var/run/network
-                               chroot /root dhclient eth0
+                               [ "${NETBOOT}" ] || chroot /root dhclient eth0
                                chroot /root wget -P /tmp "${location}"
-                               chroot /root ifconfig eth0 down
+                               [ "${NETBOOT}" ] || chroot /root ifconfig eth0 down
 
                                umount /root/sys
                                umount /root/proc
@@ -621,7 +655,7 @@ is_nice_device ()
 {
        sysfs_path="${1#/sys}"
 
-       if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-)"
+       if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-|platform-mmc)"
        then
                return 0
        elif echo "${sysfs_path}" | grep -q '^/block/vd[a-z]$'
@@ -728,16 +762,8 @@ do_netmount ()
 
        modprobe -q af_packet # For DHCP
 
-       if [ -x /sbin/udevadm ]
-       then
-               # lenny
-               udevadm trigger
-               udevadm settle
-       else
-               # etch
-               udevtrigger
-               udevsettle
-       fi
+       udevadm trigger
+       udevadm settle
 
        ipconfig ${DEVICE} | tee /netboot.config
 
@@ -962,7 +988,7 @@ find_snap ()
        if [ "${PERSISTENT}" != "nofiles" ]
        then
                # search for image files
-               snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2 ${snap_label}.ext3 ${snap_label}.ext4 ${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")
        fi
 
        if [ -z "${snapdata}" ]
@@ -1060,7 +1086,25 @@ setup_unionfs ()
        image_directory="${1}"
        rootmnt="${2}"
         addimage_directory="${3}"
-       modprobe -q -b ${UNIONTYPE}
+
+       case ${UNIONTYPE} in
+               aufs|unionfs)
+                       modprobe -q -b ${UNIONTYPE}
+
+                       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,
@@ -1072,15 +1116,13 @@ setup_unionfs ()
        # Let's just mount the read-only file systems first
        rofsstring=""
        rofslist=""
-       minor_kernel_version=$(uname -r|cut -c 5-|sed 's/[^0-9].*//')
 
-       if [ "${NETBOOT}" = "nfs" ] && [ "${minor_kernel_version}" -lt 22 ]
+       if [ "${UNIONTYPE}" = "aufs" ]
        then
-               # go aroung a bug in nfs-unionfs locking for unionfs <= 1.4
-               roopt="nfsro"
-       elif [ "${UNIONTYPE}" = "aufs" ]
+               roopt="rr,noxino"
+       elif [ "${UNIONTYPE}" = "unionfs-fuse" ]
        then
-               roopt="rr"
+               roopt="RO"
        else
                roopt="ro"
        fi
@@ -1194,37 +1236,32 @@ setup_unionfs ()
        # Looking for "${root_persistence}" device or file
        if [ -n "${PERSISTENT}" ] && [ -z "${NOPERSISTENT}" ]
        then
-               # Load USB modules
-               num_block=$(ls -l /sys/block | wc -l)
-               for module in sd_mod uhci-hcd ehci-hcd ohci-hcd usb-storage
-               do
-                       modprobe -q -b ${module}
-               done
-
-               if [ -x /sbin/udevadm ]
+               if [ -z "${QUICKUSBMODULES}" ]
                then
-                       # lenny
+                       # Load USB modules
+                       num_block=$(ls -l /sys/block | wc -l)
+                       for module in sd_mod uhci-hcd ehci-hcd ohci-hcd usb-storage
+                       do
+                               modprobe -q -b ${module}
+                       done
+
                        udevadm trigger
                        udevadm settle
-               else
-                       # etch
-                       udevtrigger
-                       udevsettle
-               fi
 
-               # For some reason, udevsettle does not block in this scenario,
-               # so we sleep for a little while.
-               #
-               # See https://bugs.launchpad.net/ubuntu/+source/casper/+bug/84591
-               for timeout in 5 4 3 2 1
-               do
-                       sleep 1
+                       # For some reason, udevsettle does not block in this scenario,
+                       # so we sleep for a little while.
+                       #
+                       # See https://bugs.launchpad.net/ubuntu/+source/casper/+bug/84591
+                       for timeout in 5 4 3 2 1
+                       do
+                               sleep 1
 
-                       if [ $(ls -l /sys/block | wc -l) -gt ${num_block} ]
-                       then
-                               break
-                       fi
-               done
+                               if [ $(ls -l /sys/block | wc -l) -gt ${num_block} ]
+                               then
+                                       break
+                               fi
+                       done
+               fi
 
                # search for label and files (this could be hugely optimized)
                cowprobe=$(find_cow_device "${root_persistence}")
@@ -1325,16 +1362,27 @@ setup_unionfs ()
 
                for dir in ${cow_dirs}; do
                        mkdir -p /cow${dir}
-                       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"
+
+                       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}")
+                                       ;;
+
+                               *)
+                                       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
-               mount -t ${UNIONTYPE} -o noatime,dirs=/cow=rw:${rofsstring} \
-                       ${UNIONTYPE} "${rootmnt}" || panic "mount ${UNIONTYPE} on \
-                       ${rootmnt} failed with option noatime,dirs=/cow=rw:${rofsstring}"
+               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}")
+                               ;;
+
+                       *)
+                               mount -t ${UNIONTYPE} -o noatime,dirs=/cow=rw:${rofsstring} ${UNIONTYPE} "${rootmnt}" || panic "mount ${UNIONTYPE} on ${rootmnt} failed with option noatime,dirs=/cow=rw:${rofsstring}"
+                               ;;
+               esac
        fi
 
        # Correct the permissions of /:
@@ -1377,7 +1425,15 @@ setup_unionfs ()
                                        ;;
 
                                *)
-                                       mount -o move "${d}" "${rootmnt}/live/${d##*/}"
+                                       case "${UNIONTYPE}" in
+                                               unionfs-fuse)
+                                                       mount -o bind "${d}" "${rootmnt}/live/${d##*/}"
+                                                       ;;
+
+                                               *)
+                                                       mount -o move "${d}" "${rootmnt}/live/${d##*/}"
+                                                       ;;
+                                       esac
                                        ;;
                        esac
                done
@@ -1486,6 +1542,7 @@ find_livefs ()
                                        fi
                                fi
                        done
+                       return 1
                        ;;
 
                removable)
@@ -1502,6 +1559,7 @@ find_livefs ()
                                        done
                                fi
                        done
+                       return 1
                        ;;
 
                *)
@@ -1696,12 +1754,24 @@ mountroot ()
 
        log_end_msg
 
+       # unionfs-fuse needs /dev to be bind-mounted for the duration of
+       # live-bottom; udev's init script will take care of things after that
+       if [ "${UNIONTYPE}" = unionfs-fuse ]
+       then
+               mount -n -o bind /dev "${rootmnt}/dev"
+       fi
+
        maybe_break live-bottom
        log_begin_msg "Running /scripts/live-bottom\n"
 
        run_scripts /scripts/live-bottom
        log_end_msg
 
+       if [ "${UNIONFS}" = unionfs-fuse ]
+       then
+               umount "${rootmnt}/dev"
+       fi
+
        exec 1>&6 6>&-
        exec 2>&7 7>&-
        kill ${tailpid}