X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Flive;h=0fa3900c5e7af3d3891e3dbc380c21b271ab8d82;hb=75340e130768563c2282806aaa3e80f5f7b97b32;hp=d125eae1e9d1b876ac7cdadcf002b92cb215154b;hpb=3887dbd9d63cf5a694849a4f916eefd2c16057c5;p=live-boot-grml.git diff --git a/scripts/live b/scripts/live index d125eae..0fa3900 100755 --- a/scripts/live +++ b/scripts/live @@ -71,6 +71,11 @@ Arguments () export FETCH ;; + forcepersistentfsck) + FORCEPERSISTENTFSCK="Yes" + export FORCEPERSISTENTFSCK + ;; + hook=*) HOOK="${ARGUMENT#hook=}" export HOOK @@ -345,6 +350,13 @@ Arguments () export PERSISTENT_PATH ;; + persistent-subtext=*) + root_persistence="${root_persistence}-${ARGUMENT#persistent-subtext=}" + home_persistence="${home_persistence}-${ARGUMENT#persistent-subtext=}" + root_snapshot_label="${root_snapshot_label}-${ARGUMENT#persistent-subtext=}" + home_snapshot_label="${home_snapshot_label}-${ARGUMENT#persistent-subtext=}" + ;; + nopersistent) NOPERSISTENT="Yes" export NOPERSISTENT @@ -599,7 +611,7 @@ is_nice_device () { sysfs_path="${1#/sys}" - if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-[^-]*-(ide|scsi|usb))" + if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-)" then return 0 elif echo "${sysfs_path}" | grep -q '^/block/vd[a-z]$' @@ -618,7 +630,7 @@ copy_live_to () if [ -z "${MODULETORAM}" ] then - size=$(fs_size "" ${copyfrom} "used") + size=$(fs_size "" ${copyfrom}/${LIVE_MEDIA_PATH} "used") else MODULETORAMFILE="${copyfrom}/${LIVE_MEDIA_PATH}/${MODULETORAM}" @@ -661,7 +673,7 @@ copy_live_to () # begin copying (or uncompressing) mkdir "${copyto}" - echo "mount -t ${fstype} ${mount_options} ${dev} ${copyto}" + log_begin_msg "mount -t ${fstype} ${mount_options} ${dev} ${copyto}" mount -t "${fstype}" ${mount_options} "${dev}" "${copyto}" if [ "${extension}" = "tgz" ] @@ -674,9 +686,22 @@ copy_live_to () else if [ -n "${MODULETORAMFILE}" ] then - cp ${MODULETORAMFILE} ${copyto} # copy only the filesystem module + if [ -x /bin/rsync ] + then + echo " * Copying $MODULETORAMFILE to RAM" 1>/dev/console + rsync -a --progress ${MODULETORAMFILE} ${copyto} 1>/dev/console # copy only the filesystem module + else + cp ${MODULETORAMFILE} ${copyto} # copy only the filesystem module + fi else - cp -a ${copyfrom}/* ${copyto} # "cp -a" from busybox also copies hidden files + if [ -x /bin/rsync ] + then + echo " * Copying whole medium to RAM" 1>/dev/console + rsync -a --progress ${copyfrom}/* ${copyto} 1>/dev/console # "cp -a" from busybox also copies hidden files + else + mkdir -p ${copyto}/${LIVE_MEDIA_PATH} + cp -a ${copyfrom}/${LIVE_MEDIA_PATH}/* ${copyto}/${LIVE_MEDIA_PATH} # "cp -a" from busybox also copies hidden files + fi fi umount ${copyfrom} @@ -773,9 +798,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 ;; *) @@ -925,7 +952,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 ${snal_label}.ext4 ${snap_label}.jffs2") + snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2 ${snap_label}.ext3 ${snap_label}.ext4 ${snap_label}.jffs2") fi if [ -z "${snapdata}" ] @@ -944,7 +971,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 ' ')" @@ -983,12 +1010,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? @@ -1049,37 +1075,26 @@ setup_unionfs () roopt="ro" fi - # Read image names from ${MODULE}.module if it exists - if [ -e "${image_directory}/filesystem.${MODULE}.module" ] + if [ -z "${PLAIN_ROOT}" ] 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 ext4 xfs jffs2 dir - do - for IMAGE in "${image_directory}"/*."${FILESYSTEM}" + # 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 - if [ -e "${IMAGE}" ] - then - image_string="${image_string} ${IMAGE}" - fi + image_string="${image_string} ${image_directory}/${IMAGE}" done - done - - if [ -n "${addimage_directory}" ] && [ -d "${addimage_directory}" ] + 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 ext4 xfs jffs2 dir do - for IMAGE in "${addimage_directory}"/*."${FILESYSTEM}" + for IMAGE in "${image_directory}"/*."${FILESYSTEM}" do if [ -e "${IMAGE}" ] then @@ -1087,58 +1102,80 @@ setup_unionfs () fi done done - fi - # Now sort the list - image_string="$(echo ${image_string} | sed -e 's/ /\n/g' | sort )" - fi + if [ -n "${addimage_directory}" ] && [ -d "${addimage_directory}" ] + then + for FILESYSTEM in squashfs ext2 ext3 ext4 xfs jffs2 dir + do + for IMAGE in "${addimage_directory}"/*."${FILESYSTEM}" + do + if [ -e "${IMAGE}" ] + then + image_string="${image_string} ${IMAGE}" + fi + done + done + fi + + # Now sort the list + image_string="$(echo ${image_string} | sed -e 's/ /\n/g' | sort )" + fi [ -n "${MODULETORAMFILE}" ] && image_string="${image_directory}/$(basename ${MODULETORAMFILE})" - mkdir -p "${croot}" + mkdir -p "${croot}" - for image in ${image_string} - do - imagename=$(basename "${image}") + for image in ${image_string} + 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 + 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 - rofsstring="${image}=${roopt}:${rofsstring}" - rofslist="${image} ${rofslist}" - elif [ -f "${image}" ] - then - if losetup --help 2>&1 | grep -q -- "-r\b" + if [ -d "${image}" ] then - backdev=$(get_backing_device "${image}" "-r") - else - backdev=$(get_backing_device "${image}") - fi - fstype=$(get_fstype "${backdev}") - - if [ "${fstype}" = "unknown" ] + # it is a plain directory: do nothing + rofsstring="${image}=${roopt}:${rofsstring}" + rofslist="${image} ${rofslist}" + elif [ -f "${image}" ] then - panic "Unknown file system type on ${backdev} (${image})" - fi + if losetup --help 2>&1 | grep -q -- "-r\b" + then + backdev=$(get_backing_device "${image}" "-r") + else + backdev=$(get_backing_device "${image}") + fi + fstype=$(get_fstype "${backdev}") - if [ -z "${fstype}" ] - then - fstype="${imagename##*.}" - log_warning_msg "Unknown file system type on ${backdev} (${image}), assuming ${fstype}." - fi + if [ "${fstype}" = "unknown" ] + then + panic "Unknown file system type on ${backdev} (${image})" + fi - mkdir -p "${croot}/${imagename}" - log_begin_msg "Mounting \"${image}\" on \"${croot}${imagename}\" via \"${backdev}\"" - mount -t "${fstype}" -o ro,noatime "${backdev}" "${croot}/${imagename}" || panic "Can not mount ${backdev} (${image}) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}" - log_end_msg - fi - done + if [ -z "${fstype}" ] + then + fstype="${imagename##*.}" + log_warning_msg "Unknown file system type on ${backdev} (${image}), assuming ${fstype}." + fi + + mkdir -p "${croot}/${imagename}" + log_begin_msg "Mounting \"${image}\" on \"${croot}${imagename}\" via \"${backdev}\"" + mount -t "${fstype}" -o ro,noatime "${backdev}" "${croot}/${imagename}" || panic "Can not mount ${backdev} (${image}) on ${croot}/${imagename}" && rofsstring="${croot}/${imagename}=${roopt}:${rofsstring}" && rofslist="${croot}/${imagename} ${rofslist}" + log_end_msg + fi + done + else + # we have a plain root system + mkdir -p "${croot}/filesystem" + log_begin_msg "Mounting \"${image_directory}\" on \"${croot}/filesystem\"" + mount -t $(get_fstype "${image_directory}") -o ro,noatime "${image_directory}" "${croot}/filesystem" || panic "Can not mount ${image_directory} on ${croot}/filesystem" && rofsstring="${croot}/filesystem=${roopt}:${rofsstring}" && rofslist="${croot}/filesystem ${rofslist}" + # probably broken: + mount -o bind ${croot}/filesystem $mountpoint + log_end_msg + fi rofsstring=${rofsstring%:} @@ -1209,6 +1246,11 @@ setup_unionfs () cowdevice=${cowprobe} cow_fstype=$(get_fstype "${cowprobe}") cow_mountopt="rw,noatime" + + if [ "${FORCEPERSISTENTFSCK}" = "Yes" ] + then + fsck -y ${cowdevice} + fi else log_warning_msg "Unable to find the persistent medium" cowdevice="tmpfs" @@ -1285,6 +1327,9 @@ setup_unionfs () ${rootmnt} failed with option noatime,dirs=/cow=rw:${rofsstring}" fi + # Correct the permissions of /: + chmod 0755 "${rootmnt}" + # tmpfs file systems touch /etc/fstab mkdir -p "${rootmnt}/live" @@ -1402,26 +1447,30 @@ find_livefs () # first look at the one specified in the command line case "${LIVE_MEDIA}" in - removable) + removable-usb) 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 + if readlink ${sysblock} | grep -q usb || + readlink ${sysblock}/device | grep -q usb # linux < 2.6.29 + then + for dev in $(subdevices "${sysblock}") + do + if check_dev "${dev}" + then + return 0 + fi + done + fi fi done ;; - removable-usb) + removable) for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -vE "/(loop|ram|dm-|fd)") do - if [ "$(cat ${sysblock}/removable)" = "1" ] && readlink ${sysblock}/device | grep -q usb + if [ "$(cat ${sysblock}/removable)" = "1" ] then for dev in $(subdevices "${sysblock}") do @@ -1606,7 +1655,7 @@ mountroot () log_end_msg fi - if [ -n "${MODULETORAMFILE}" ] + if [ -n "${MODULETORAMFILE}" ] || [ -n "${PLAIN_ROOT}" ] then setup_unionfs "${livefs_root}" "${rootmnt}" else