X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Flive;h=f539f52343005992399de5efe743f85981896b89;hb=d0fbcc9b3747ab4339f7487e7d845b467962139c;hp=04243d7c4ad09ca74eef93a4c9cb0c1b262c0a4f;hpb=3d52fbcb4fe70132ade14759d76573b471294800;p=live-boot-grml.git diff --git a/scripts/live b/scripts/live index 04243d7..f539f52 100755 --- a/scripts/live +++ b/scripts/live @@ -7,7 +7,8 @@ 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=/live_media +mountpoint=/live/image +LIVE_MEDIA_PATH="/live" root_persistence="live-rw" home_persistence="home-rw" @@ -32,115 +33,291 @@ fi parse_cmdline () { - PRESEEDS= - # looking for live-initramfs specifics options as kernel parameters - for x in $(cat /proc/cmdline); do - case $x in - userfullname=*) - export USERFULLNAME=${x#userfullname=} - export LIVECONF="changed" - ;; - hostname=*) - export HOSTNAME=${x#hostname=} - export LIVECONF="changed" - ;; - username=*) - export USERNAME=${x#username=} - export LIVECONF="changed" - ;; - netboot*) - export NETBOOT=${x#netboot=} ;; - access=*) - export ACCESS=${x#access=} ;; - xdebconf) - export XDEBCONF="Yes" ;; - xvideomode=*) - export XVIDEOMODE="${x#xvideomode=}" ;; - toram) - export TORAM="Yes" ;; - todisk=*) - export TODISK=${x#todisk=} ;; - swapoff) - export SWAPOFF="Yes" ;; - showmounts) - export SHOWMOUNTS="Yes" ;; - persistent) - export PERSISTENT="Yes" ;; - nopersistent) - export PERSISTENT="" ;; - ip*) - STATICIP=${x#ip=} - if [ "${STATICIP}" == "" ]; then - STATICIP="frommedia" - fi - export STATICIP ;; - live-getty) - export LIVE_GETTY=1 ;; - bootfrom=*|live-media=*) - export LIVE_MEDIA=${x#*=} ;; - live-media-encryption=*|encryption=*) - export LIVE_MEDIA_ENCRYPTION=${x#*=} ;; - live-media-timeout=*) - export LIVE_MEDIA_TIMEOUT=${x#live-media-timeout=} ;; - live-media-offset=*) - export LIVE_MEDIA_OFFSET=${x#live-media-offset=} ;; - locale=*|debian-installer/locale=*) - export LOCALE=${x#*=} ;; - keyb=*|kbd-chooser/method=*) - export KBD=${x#*=} ;; - klayout=*|console-setup/layoutcode=*) - export KLAYOUT=${x#*=} ;; - koptions=*) - export KOPTIONS=${x#koptions=} ;; - kvariant=*|console-setup/variantcode=*) - export KVARIANT=${x#*=} ;; - kmodel=*|console-setup/modelcode=*) - export KMODEL=${x#*=} ;; - module=*) - export MODULE=${x#module=} ;; - preseed/file=*|file=*) - export LOCATION="${x#*=}" ;; - */*=*) - question="${x%%=*}" - value="${x#*=}" - PRESEEDS="${PRESEEDS}\"${question}=${value}\" " - ;; - console=*) - export DEFCONSOLE="${x#*=}" ;; - 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=order - fi + 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-path=*) + LIVE_MEDIA_PATH="${x#live-media-path=}" + export LIVE_MEDIA_PATH + ;; + + 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 + ;; + + url=*) + LOCATION="${x#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="${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 + ;; + + utc=*) + UTC="${x#utc=}" + export UTC + ;; + + 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() { - 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 +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) + *.squashfs|*.ext2|*.ext3) echo $(setup_loop "$1" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}") ;; *.dir) @@ -165,10 +342,11 @@ 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 @@ -230,7 +408,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 -o move ${copyto} ${copyfrom} + mount -r --move ${copyto} ${copyfrom} rmdir ${copyto} return 0 } @@ -249,6 +427,14 @@ do_netmount() { NFSROOT=${ROOTSERVER}:${ROOTPATH} fi + # source relevant ipconfig output + . /tmp/net-${DEVICE}.conf + export HOSTNAME + + 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 @@ -350,13 +536,13 @@ try_snap () 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" @@ -403,7 +589,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, @@ -421,23 +607,35 @@ setup_unionfs() { roopt="ro" fi - # Read image names from ${MODULE}.lst if it exists - if [ -e "${image_directory}/${MODULE}.lst" ]; then - for image in $(cat "${image_directory}/${MODULE}.lst"); do - image_string="${image_string} ${image_directory}/${image}"; - done - else - # If ${MODULE}.lst does not exist, create a list of images - for image_type in "ext2" "squashfs" "dir"; do - for image in "${image_directory}"/*."${image_type}"; 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 + # 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 in ${image_string}; do @@ -475,7 +673,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 @@ -499,15 +697,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 fi # shows cow fs on /cow for use by live-snapshot - mkdir -p "${rootmnt}/cow" - mount -o bind /cow "${rootmnt}/cow" + mkdir -p "${rootmnt}/live/cow" + mount -o bind /cow "${rootmnt}/live/cow" } check_dev () @@ -569,8 +767,8 @@ 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 # live-initramfs, so take it and run with it. @@ -640,7 +838,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