X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Flive;h=a73da84a600018f445a14f5fdb8141ef2c98788e;hb=refs%2Ftags%2Fupstream%2F1.95.3;hp=9ab1ac59079443700357d7b25fb3994afa3e1a3f;hpb=d70b77f919f85511936645abb95d710b80c10c74;p=live-boot-grml.git diff --git a/scripts/live b/scripts/live index 9ab1ac5..a73da84 100755 --- a/scripts/live +++ b/scripts/live @@ -2,22 +2,28 @@ # set -e -export PATH=/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:/usr/bin:/usr/sbin:/bin:/sbin +export PATH="/root/usr/bin:/root/usr/sbin:/root/bin:/root/sbin:/usr/bin:/usr/sbin:/bin:/sbin" echo "/root/lib" >> /etc/ld.so.conf echo "/root/usr/lib" >> /etc/ld.so.conf -mountpoint=/cdrom +mountpoint="/live/image" +LIVE_MEDIA_PATH="live" -USERNAME=user -USERFULLNAME="Live session user" -HOST=live -BUILD_SYSTEM=Custom +root_persistence="live-rw" +home_persistence="home-rw" +root_snapshot_label="live-sn" +home_snapshot_label="home-sn" -mkdir -p $mountpoint +USERNAME="user" +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 +31,296 @@ 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 +Arguments () +{ + PRESEEDS="" + + for ARGUMENT in `cat /proc/cmdline` + do + case "${ARGUMENT}" in + access=*) + ACCESS="${ARGUMENT#access=}" + export ACCESS + ;; + + console=*) + DEFCONSOLE="${ARGUMENT#*=}" + export DEFCONFSOLE + ;; + + debug) + DEBUG="Yes" + export DEBUG + + set -x + ;; + + fetch=*) + FETCH="${ARGUMENT#fetch=}" + export FETCH + ;; + + hostname=*) + HOSTNAME="${ARGUMENT#hostname=}" + LIVECONF="changed" + export HOSTNAME LIVECONF + ;; + + username=*) + USERNAME="${ARGUMENT#username=}" + LIVECONF="changed" + export USERNAME LIVECONF + ;; + + userfullname=*) + USERFULLNAME="${ARGUMENT#userfullname=}" + LIVECONF="changed" + export USERFULLNAME LIVECONF + ;; + + ip=*) + STATICIP="${ARGUMENT#ip=}" + + if [ -z "${STATICIP}" ] + then + STATICIP="frommedia" + fi + + 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 + ;; + + live-media=*|bootfrom=*) + LIVE_MEDIA="${ARGUMENT#*=}" + export LIVE_MEDIA + ;; + + live-media-encryption=*|encryption=*) + LIVE_MEDIA_ENCRYPTION="${ARGUMENT#*=}" + export LIVE_MEDIA_ENCRYPTION + ;; + + live-media-offset=*) + LIVE_MEDIA_OFFSET="${ARGUMENT#live-media-offset=}" + export LIVE_MEDIA_OFFSET + ;; + + live-media-path=*) + LIVE_MEDIA_PATH="${ARGUMENT#live-media-path=}" + export LIVE_MEDIA_PATH + ;; + + live-media-timeout=*) + LIVE_MEDIA_TIMEOUT="${ARGUMENT#live-media-timeout=}" + export LIVE_MEDIA_TIMEOUT + ;; + + locale=*|debian-installer/locale=*) + LOCALE="${ARGUMENT#*=}" + export LOCALE + ;; + + module=*) + MODULE="${ARGUMENT#module=}" + export MODULE + ;; + + netboot=*) + NETBOOT="${ARGUMENT#netboot=}" + export NETBOOT + ;; + + nfsopts=*) + NFSOPTS="${ARGUMENT#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="${ARGUMENT#*=}" + export LOCATION + ;; + + url=*) + location="${ARGUMENT#url=}" + + mount -n -o bind /sys /root/sys + mount -n -o bind /proc /root/proc + mount -n -o bind /dev /root/dev + + mkdir -p /root/var/run/network + chroot /root ifup -a + chroot /root wget -P /tmp "$location" + chroot /root ifdown -a + + umount /root/sys + umount /root/proc + umount /root/dev + + LOCATION="/tmp/$(basename "$location")" + ;; + + */*=*) + question="${ARGUMENT%%=*}" + value="${ARGUMENT#*=}" + PRESEEDS="${PRESEEDS}\"${question}=${value}\" " + export PRESEEDS + ;; + + showmounts) + SHOWMOUNTS="Yes" + export SHOWMOUNTS + ;; + + timezone=*) + TIMEZONE="${ARGUMENT#timezone=}" + export TIMEZONE + ;; + + todisk=*) + TODISK="${ARGUMENT#todisk=}" + export TODISK + ;; + + toram) + TORAM="Yes" + export TORAM + ;; + + union=*) + UNIONTYPE="${ARGUMENT#union=}" + export UNIONTYPE + ;; + + utc=*) + UTC="${ARGUMENT#utc=}" + export UTC + ;; + + xdebconf) + XDEBCONF="Yes" + export XDEBCONF + ;; + + xvideomode=*) + XVIDEOMODE="${ARGUMENT#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_MEDIA_PATH}" ] + then + for FILESYSTEM in squashfs ext2 ext3 xfs dir + do + if [ "`echo ${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}`" != "${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${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" @@ -64,10 +344,12 @@ match_files_in_dir() { mount_images_in_directory() { directory="$1" rootmnt="$2" - if match_files_in_dir "$directory/live/*.squashfs" || - match_files_in_dir "$directory/live/*.ext2" || - match_files_in_dir "$directory/live/*.dir"; then - setup_unionfs "$directory/live" "$rootmnt" + + if match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.squashfs" || + match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.ext2" || + match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.ext3" || + match_files_in_dir "$directory/${LIVE_MEDIA_PATH}/*.dir"; then + setup_unionfs "$directory/${LIVE_MEDIA_PATH}" "$rootmnt" else : fi @@ -123,13 +405,22 @@ copy_live_to() { return 1 fi - # begin copying.. + # begin copying (or uncompressing) mkdir "${copyto}" echo "mount -t ${fstype} ${mount_options} ${dev} ${copyto}" mount -t "${fstype}" ${mount_options} "${dev}" "${copyto}" - cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files - umount ${copyfrom} - mount -r -o move ${copyto} ${copyfrom} + + if [ "$extension" == "tgz" ]; then + cd "${copyto}" + tar zxf "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})" + rm -f "${copyfrom}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})" + mount -r --move "${copyto}" "${rootmnt}" + cd "${OLDPWD}" + else + cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files + umount ${copyfrom} + mount -r --move ${copyto} ${copyfrom} + fi rmdir ${copyto} return 0 } @@ -148,6 +439,19 @@ do_netmount() { NFSROOT=${ROOTSERVER}:${ROOTPATH} fi + # source relevant ipconfig output + . /tmp/net-${DEVICE}.conf + export HOSTNAME + + if [ -n "${FETCH}" ] && do_httpmount; then + rc=0 + return ${rc} + fi + + if [ "${NFSROOT#*:}" = "$NFSROOT" ] && [ "$NETBOOT" != "cifs" ]; then + NFSROOT=${ROOTSERVER}:${NFSROOT} + fi + [ "$quiet" != "y" ] && log_begin_msg "Trying netboot from ${NFSROOT}" if [ "${NETBOOT}" != "nfs" ] && do_cifsmount ; then @@ -162,6 +466,23 @@ do_netmount() { return ${rc} } +do_httpmount() { + rc=1 + extension=`echo "${FETCH}" | sed 's/\(.*\)\.\(.*\)/\2/'` + case "${extension}" in + squashfs|tgz|tar) + [ "$quiet" != "y" ] && log_begin_msg "Trying wget ${FETCH} -O ${mountpoint}/$(basename ${FETCH})" + mkdir -p "${mountpoint}/${LIVE_MEDIA_PATH}" + wget "${FETCH}" -O "${mountpoint}/${LIVE_MEDIA_PATH}/$(basename ${FETCH})" + [ $? -eq 0 ] && rc=0 + [ "${extension}" == "tgz" ] && live_dest="ram" + ;; + *) + [ "$quiet" != "y" ] && log_begin_msg "Unrecognized archive extension for ${FETCH}" + esac + return ${rc} +} + do_nfsmount() { rc=1 modprobe "${MP_QUIET}" nfs @@ -243,19 +564,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 +623,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, @@ -314,30 +635,60 @@ setup_unionfs() { # Let's just mount the read-only file systems first rofsstring="" rofslist="" - if [ "${NETBOOT}" = "nfs" ] ; then - roopt="nfsro" # go aroung a bug in nfs-unionfs locking + minor_kernel_version=`uname -r|cut -c 5-|sed 's/[^0-9].*//'` + if [ "${NETBOOT}" = "nfs" ] && [ "${minor_kernel_version}" -lt 22 ]; then + # go aroung a bug in nfs-unionfs locking for unionfs <= 1.4 + roopt="nfsro" else 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 +709,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 +733,15 @@ setup_unionfs() { case d in *.dir) # do nothing # mount -o bind "${d}" "${rootmnt}/live/${d##*/}" ;; - *) mount -o 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 +752,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 +768,7 @@ check_dev () fi fi - if [ -n "${LIVEMEDIA_OFFSET}" ]; then + if [ -n "${LIVE_MEDIA_OFFSET}" ]; then losetup -d "${loopdevname}" fi return 1 @@ -432,14 +777,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 +803,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 +834,8 @@ mountroot() { exec > live.log exec 2>&1 + Arguments + set_usplash_timeout [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/live-premount" pulsate @@ -500,7 +847,7 @@ mountroot() { set_usplash_timeout - if [ ! -z "${NETBOOT}" ]; then + if [ ! -z "${NETBOOT}" ] || [ ! -z "${FETCH}" ]; then if do_netmount ; then livefs_root="${mountpoint}" else @@ -508,9 +855,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 +874,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