X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Fcasper;h=545942e81edb1643376d062ecbfed41d144587d0;hb=b6a918ee42b1ae85ccd5fc3cd19b78dc8a42492a;hp=32c4517a0331367035636901a463b5972d3d0d15;hpb=40c6f4508ec0868d331e346e9d7b1c44cce01966;p=live-boot-grml.git diff --git a/scripts/casper b/scripts/casper index 32c4517..545942e 100644 --- a/scripts/casper +++ b/scripts/casper @@ -14,7 +14,7 @@ home_snapshot_label="home-sn" USERNAME="casper" USERFULLNAME="Live session user" HOSTNAME="live" -BUILD_SYSTEM="Debian" +BUILD_SYSTEM="Custom" mkdir -p $mountpoint @@ -23,8 +23,13 @@ export USERNAME USERFULLNAME HOSTNAME BUILD_SYSTEM . /scripts/casper-helpers +if [ ! -f /casper.vars ]; then + touch /casper.vars +fi + parse_cmdline () { + PRESEEDS= # looking for casper specifics options as kernel parameters for x in $(cat /proc/cmdline); do case $x in @@ -42,14 +47,20 @@ parse_cmdline () ;; netboot*) export NETBOOT=${x#netboot=} ;; + access=*) + export ACCESS=${x#access=} ;; + xdebconf) + export XDEBCONF="Yes" ;; toram) - export TORAM=1 ;; + export TORAM="Yes" ;; todisk=*) export TODISK=${x#todisk=} ;; showmounts) - export SHOWMOUNTS=1 ;; + export SHOWMOUNTS="Yes" ;; persistent) - export PERSISTENT=1 ;; + export PERSISTENT="Yes" ;; + nopersistent) + export PERSISTENT="" ;; ip*) STATICIP=${x#ip=} if [ "${STATICIP}" == "" ]; then @@ -58,26 +69,37 @@ parse_cmdline () export STATICIP ;; casper-getty) export CASPERGETTY=1 ;; + bootfrom=*|live-media=*) + export LIVEMEDIA=${x#*=} ;; + live-media-encryption=*|encryption=*) + export LIVEMEDIA_ENCRYPTION=${x#*=} ;; + live-media-timeout=*) + export LIVEMEDIA_TIMEOUT=${x#live-media-timeout=} ;; + live-media-offset=*) + export LIVEMEDIA_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=$(sed -e 's%.*console=%console=%' /proc/cmdline) ;; - bootfrom=*) - export LIVEMEDIA=${x#bootfrom=} ;; - live-media=*) - export LIVEMEDIA=${x#live-media=} ;; - debian-installer/locale=*) - export LOCALE=${x#debian-installer/locale=} ;; - locale=*) - export LOCALE=${x#locale=} ;; - kbd-chooser/method=*) - export KBD=${x#kbd-chooser/method=} ;; - keyb=*) - export KBD=${x#keyb=} ;; - console-setup/layoutcode=*) - export CSLAYOUT=${x#console-setup/layoutcode=} ;; - console-setup/variantcode=*) - export CSVARIANT=${x#console-setup/variantcode=} ;; - console-setup/modelcode=*) - export CSMODEL=${x#console-setup/modelcode=} ;; + export DEFCONSOLE="${x#*=}" ;; esac done @@ -91,6 +113,10 @@ parse_cmdline () export NETBOOT fi fi + + if [ -z "${MODULE}" ]; then + MODULE=order + fi } is_casper_path() { @@ -108,7 +134,7 @@ is_casper_path() { get_backing_device() { case "$1" in *.squashfs|*.ext2) - echo $(setup_loop "$1" "loop" "/sys/block/loop*") + echo $(setup_loop "$1" "loop" "/sys/block/loop*" '0' "${LIVEMEDIA_ENCRYPTION}") ;; *.dir) echo "directory" @@ -149,8 +175,7 @@ is_nice_device() { return 1 } -is_supported_fs () -{ +is_supported_fs () { # FIXME: do something better like the scan of supported filesystems fstype="${1}" case ${fstype} in @@ -208,7 +233,7 @@ do_netmount() { modprobe "${MP_QUIET}" af_packet # For DHCP - ipconfig ${DEVICE} /tmp/net-${DEVICE}.conf + ipconfig ${DEVICE} /tmp/net-${DEVICE}.conf | tee /netboot.config if [ "${NFSROOT}" = "auto" ]; then NFSROOT=${ROOTSERVER}:${ROOTPATH} @@ -380,34 +405,52 @@ setup_unionfs() { # Let's just mount the read-only file systems first rofsstring="" rofslist="" - if [ "${NETBOOT}" == "nfs" ] ; then + if [ "${NETBOOT}" = "nfs" ] ; then roopt="nfsro" # go aroung a bug in nfs-unionfs locking else 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 + 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}" + 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 - done + 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%:} mkdir -p /cow + cowdevice="tmpfs" cow_fstype="tmpfs" @@ -466,6 +509,12 @@ check_dev () if [ -z "${devname}" ]; then devname=$(sys2dev "${sysdev}") fi + + if [ -n "${LIVEMEDIA_OFFSET}" ]; then + loopdevname=$(setup_loop "${devname}" "loop" "/sys/block/loop*" "${LIVEMEDIA_OFFSET}" '') + devname="${loopdevname}" + fi + fstype=$(get_fstype "${devname}") if is_supported_fs ${fstype}; then mount -t ${fstype} -o ro "${devname}" $mountpoint || continue @@ -476,16 +525,27 @@ check_dev () umount $mountpoint fi fi + + if [ -n "${LIVEMEDIA_OFFSET}" ]; then + losetup -d "${loopdevname}" + fi return 1 } find_livefs() { + timeout="${1}" # first look at the one specified in the command line if [ ! -z "${LIVEMEDIA}" ]; then if check_dev "null" "${LIVEMEDIA}"; then return 0 fi fi + # don't start autodetection before timeout has expired + if [ -n "${LIVEMEDIA_TIMEOUT}" ]; then + if [ "${timeout}" -lt "${LIVEMEDIA_TIMEOUT}" ]; then + return 1 + fi + fi # or do the scan of block devices for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do devname=$(sys2dev "${sysblock}") @@ -501,7 +561,7 @@ find_livefs() { fi done elif [ "${fstype}" = "squashfs" -o \ - "${fstype}" = "ext3" ] -o \ + "${fstype}" = "ext3" -o \ "${fstype}" = "ext2" ]; then # This is an ugly hack situation, the block device has # an image directly on it. It's hopefully @@ -553,9 +613,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 - livefs_root=$(find_livefs) - if [ ! -z "${livefs_root}" ]; then + 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 [ -n "${livefs_root}" ]; then break fi sleep 1 @@ -566,15 +626,15 @@ mountroot() { panic "Unable to find a medium containing a live file system" fi - if [ -n "${TORAM}" ]; then + if [ "${TORAM}" ]; then live_dest="ram" - elif [ -n "${TODISK}" ]; then + elif [ "${TODISK}" ]; then live_dest="${TODISK}" fi - if [ -n "${live_dest}" ]; then - [ "$quiet" != "y" ] && log_begin_msg "Copying live_media to ${live_dest}" + if [ "${live_dest}" ]; then + log_begin_msg "Copying live_media to ${live_dest}" copy_live_to "${livefs_root}" "${live_dest}" - [ "$quiet" != "y" ] && log_end_msg + log_end_msg fi mount_images_in_directory "${livefs_root}" "${rootmnt}"