X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Flive;h=683afa2a8b2e924868c050ac889a37dc11d063dc;hb=371b63f7dae515c56b777b2c2dca5135dd67781d;hp=bf20ffc98f9a8c8ab2ca0aaf77bf39823ddaa4d2;hpb=c1bc23946b2034868212410dfdcf80fe0bef30b3;p=live-boot-grml.git diff --git a/scripts/live b/scripts/live index bf20ffc..683afa2 100755 --- a/scripts/live +++ b/scripts/live @@ -109,6 +109,11 @@ Arguments () export IGNORE_UUID ;; + integrity-check) + INTEGRITY_CHECK="Yes" + export INTEGRITY_CHECK + ;; + ip=*) STATICIP="${ARGUMENT#ip=}" @@ -335,6 +340,11 @@ Arguments () export PERSISTENT ;; + persistent-path=*) + PERSISTENT_PATH="${ARGUMENT#persistent-path=}" + export PERSISTENT_PATH + ;; + nopersistent) NOPERSISTENT="Yes" export NOPERSISTENT @@ -381,6 +391,11 @@ Arguments () export SHOWMOUNTS ;; + silent) + SILENT="Yes" + export SILENT + ;; + textonly) TEXTONLY="Yes" export TEXTONLY @@ -422,6 +437,11 @@ Arguments () export PLAIN_ROOT ;; + skipunion) + SKIP_UNION_MOUNTS="Yes" + export SKIP_UNION_MOUNTS + ;; + root=*) ROOT="${ARGUMENT#root=}" export ROOT @@ -487,7 +507,7 @@ is_live_path () if [ -d "${DIRECTORY}"/"${LIVE_MEDIA_PATH}" ] then - for FILESYSTEM in squashfs ext2 ext3 xfs dir jffs2 + for FILESYSTEM in squashfs ext2 ext3 ext4 xfs dir jffs2 do if [ "$(echo ${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM})" != "${DIRECTORY}/${LIVE_MEDIA_PATH}/*.${FILESYSTEM}" ] then @@ -527,7 +547,7 @@ matches_uuid () get_backing_device () { case "${1}" in - *.squashfs|*.ext2|*.ext3|*.jffs2) + *.squashfs|*.ext2|*.ext3|*.ext4|*.jffs2) echo $(setup_loop "${1}" "loop" "/sys/block/loop*" '0' "${LIVE_MEDIA_ENCRYPTION}" "${2}") ;; @@ -564,13 +584,14 @@ mount_images_in_directory () 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}/*.ext4" || match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.jffs2" || match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.dir" then [ -n "${mac}" ] && adddirectory="${directory}/${LIVE_MEDIA_PATH}/${mac}" setup_unionfs "${directory}/${LIVE_MEDIA_PATH}" "${rootmnt}" "${adddirectory}" else - : + panic "No supported filesystem images found at /${LIVE_MEDIA_PATH}." fi } @@ -658,7 +679,6 @@ copy_live_to () cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files fi - livefs_root umount ${copyfrom} mount -r -o move ${copyto} ${copyfrom} fi @@ -692,6 +712,15 @@ do_netmount () [ -z ${HOSTNAME} ] && HOSTNAME=${OLDHOSTNAME} export HOSTNAME + # Check if we have a network device at all + if ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \ + ! ls /sys/class/net/wlan0 > /dev/null 2>&1 && \ + ! ls /sys/class/net/ath0 > /dev/null 2>&1 && \ + ! ls /sys/class/net/ra0 > /dev/null 2>&1 + then + panic "No supported network device found, maybe a non-mainline driver is required." + fi + if [ "${NFSROOT}" = "auto" ] then NFSROOT=${ROOTSERVER}:${ROOTPATH} @@ -744,9 +773,11 @@ do_httpmount () then case "$url" in tftp*) - ip="$(dirname $url | sed -e 's|tftp://||g')" - log_begin_msg "Trying tftp -g -b 10240 -r $(basename ${url}) -l ${dest}/$(basename ${url}) $ip" - tftp -g -b 10240 -r $(basename ${url}) -l ${dest}/$(basename ${url}) $ip + ip="$(dirname $url | sed -e 's|tftp://||g' -e 's|/.*$||g')" + rfile="$(echo $url | sed -e "s|tftp://$ip||g")" + lfile="$(basename $url)" + log_begin_msg "Trying tftp -g -b 10240 -r $rfile -l ${dest}/$lfile $ip" + tftp -g -b 10240 -r $rfile -l ${dest}/$lfile $ip ;; *) @@ -896,7 +927,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}.jffs2") + snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2 ${snap_label}.ext3 ${snal_label}.ext4 ${snap_label}.jffs2") fi if [ -z "${snapdata}" ] @@ -915,7 +946,7 @@ try_snap () snap_mount="${2}" snap_type="${3}" - if [ ! -z "${snapdata}" ] + if [ -n "${snapdata}" ] && [ ! -b "${snapdata}" ] then log_success_msg "found snapshot: ${snapdata}" snapdev="$(echo ${snapdata} | cut -f1 -d ' ')" @@ -928,9 +959,9 @@ try_snap () break fi - if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\|ext3\|jffs2\)' + if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\|ext3\|ext4\|jffs2\)' then - # squashfs, jffs2 or ext2/ext3 snapshot + # squashfs, jffs2 or ext2/ext3/ext4 snapshot dev=$(get_backing_device "${snapback}/${snapfile}") do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" @@ -954,12 +985,11 @@ try_snap () log_warning_msg "Impossible to include the ${snapfile} Snapshot file" fi - elif [ -b "${snapdata}" ] then # Try to find if it could be a snapshot partition dev="${snapdata}" - log_success_msg "found snapshot device on ${dev}" + log_success_msg "found snapshot ${snap_type} device on ${dev}" if echo "${dev}" | grep -qs loop then # strange things happens, user confused? @@ -1035,7 +1065,7 @@ setup_unionfs () done else # ${MODULE}.module does not exist, create a list of images - for FILESYSTEM in squashfs ext2 ext3 xfs jffs2 dir + for FILESYSTEM in squashfs ext2 ext3 ext4 xfs jffs2 dir do for IMAGE in "${image_directory}"/*."${FILESYSTEM}" do @@ -1048,7 +1078,7 @@ setup_unionfs () if [ -n "${addimage_directory}" ] && [ -d "${addimage_directory}" ] then - for FILESYSTEM in squashfs ext2 ext3 xfs jffs2 dir + for FILESYSTEM in squashfs ext2 ext3 ext4 xfs jffs2 dir do for IMAGE in "${addimage_directory}"/*."${FILESYSTEM}" do @@ -1072,6 +1102,12 @@ setup_unionfs () do imagename=$(basename "${image}") + export image devname + maybe_break live-realpremount + log_begin_msg "Running /scripts/live-realpremount" + run_scripts /scripts/live-realpremount + log_end_msg + if [ -d "${image}" ] then # it is a plain directory: do nothing @@ -1166,7 +1202,7 @@ setup_unionfs () root_snapdata=$(find_snap "${root_snapshot_label}" "${blacklistdev}") # This second type should be removed when snapshot will get smarter, # hence when "/etc/live-snapshot*list" will be supported also by - # ext2|ext3|jffs2 snapshot types. + # ext2|ext3|ext4|jffs2 snapshot types. home_snapdata=$(find_snap "${home_snapshot_label}" "${blacklistdev}") if [ -b "${cowprobe}" ] @@ -1229,8 +1265,12 @@ setup_unionfs () mount --bind ${exposedrootfs} ${rootmnt} || \ panic "bind mount of ${exposedrootfs} failed" - cow_dirs='/var/tmp /var/lock /var/run /var/log /var/spool - /home /var/lib/live' + if [ -z "${SKIP_UNION_MOUNTS}" ] + then + cow_dirs='/var/tmp /var/lock /var/run /var/log /var/spool /home /var/lib/live' + else + cow_dirs='' + fi for dir in ${cow_dirs}; do mkdir -p /cow${dir} @@ -1352,15 +1392,6 @@ find_livefs () { timeout="${1}" - # first look at the one specified in the command line - if [ ! -z "${LIVE_MEDIA}" ] - then - if check_dev "null" "${LIVE_MEDIA}" "skip_uuid_check" - then - return 0 - fi - fi - # don't start autodetection before timeout has expired if [ -n "${LIVE_MEDIA_TIMEOUT}" ] then @@ -1370,6 +1401,54 @@ find_livefs () fi fi + # first look at the one specified in the command line + case "${LIVE_MEDIA}" in + removable-usb) + for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)") + do + if [ "$(cat ${sysblock}/removable)" = "1" ] + then + if readlink ${sysblock}/device | grep -q usb + then + for dev in $(subdevices "${sysblock}") + do + if check_dev "${dev}" + then + return 0 + fi + done + fi + fi + done + ;; + + removable) + for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)") + do + if [ "$(cat ${sysblock}/removable)" = "1" ] + then + for dev in $(subdevices "${sysblock}") + do + if check_dev "${dev}" + then + return 0 + fi + done + fi + done + ;; + + *) + if [ ! -z "${LIVE_MEDIA}" ] + then + if check_dev "null" "${LIVE_MEDIA}" "skip_uuid_check" + then + return 0 + fi + fi + ;; + esac + # or do the scan of block devices for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)") do @@ -1394,6 +1473,7 @@ find_livefs () elif [ "${fstype}" = "squashfs" -o \ "${fstype}" = "ext2" -o \ "${fstype}" = "ext3" -o \ + "${fstype}" = "ext4" -o \ "${fstype}" = "jffs2" ] then # This is an ugly hack situation, the block device has @@ -1418,6 +1498,32 @@ set_usplash_timeout () fi ; fi } +integrity_check () +{ + media_mountpoint="${1}" + + log_begin_msg "Checking media integrity" + + cd ${media_mountpoint} + /bin/md5sum -c md5sum.txt < /dev/tty8 > /dev/tty8 + RC="${?}" + + log_end_msg + + if [ "${RC}" -eq 0 ] + then + log_success_msg "Everything ok, will reboot in 10 seconds." + sleep 10 + cd / + umount ${media_mountpoint} + sync + echo u > /proc/sysrq-trigger + echo b > /proc/sysrq-trigger + else + panic "Not ok, a media defect is likely, switch to VT8 for details." + fi +} + mountroot () { if [ -x /scripts/local-top/cryptroot ]; then @@ -1484,6 +1590,11 @@ mountroot () panic "Unable to find a medium containing a live file system" fi + if [ "${INTEGRITY_CHECK}" ] + then + integrity_check "${livefs_root}" + fi + if [ "${TORAM}" ] then live_dest="ram" @@ -1511,7 +1622,7 @@ mountroot () log_end_msg maybe_break live-bottom - log_begin_msg "Running /scripts/live-bottom" + log_begin_msg "Running /scripts/live-bottom\n" run_scripts /scripts/live-bottom log_end_msg @@ -1519,5 +1630,5 @@ mountroot () exec 1>&6 6>&- exec 2>&7 7>&- kill ${tailpid} - cp live.log "${rootmnt}/var/log/" + [ -w "${rootmnt}/var/log/" ] && cp live.log "${rootmnt}/var/log/" 2>/dev/null }