X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Flive;h=0f4ef0d1378921cec5d5b51f2a46d4bcacbb4c00;hb=56d7b4e9c17311dfa071a5ac5cc80a2f1ff8e79f;hp=d3c86a20427126cd5beb6f84a47f72e654d2aab7;hpb=5a46a4fcda2e25bdca6492fc5c128ad8251f73b3;p=live-boot-grml.git diff --git a/scripts/live b/scripts/live index d3c86a2..0f4ef0d 100755 --- a/scripts/live +++ b/scripts/live @@ -21,6 +21,17 @@ HOSTNAME="host" mkdir -p "${mountpoint}" +# Create /etc/mtab for debug purpose and future syncs +if [ ! -d /etc ] +then + mkdir /etc/ +fi + +if [ ! -f /etc/mtab ] +then + touch /etc/mtab +fi + [ -f /etc/live.conf ] && . /etc/live.conf export USERNAME USERFULLNAME HOSTNAME @@ -285,9 +296,9 @@ Arguments () export NOSUDO ;; - noswap) - NOSWAP="Yes" - export NOSWAP + swapon) + SWAPON="Yes" + export SWAPON ;; noupdatenotifier) @@ -315,6 +326,15 @@ Arguments () export PERSISTENT ;; + persistent=*) + PERSISTENT="${ARGUMENT#persistent=}" + if [ -z "${PERSISTENT}" ] + then + PERSISTENT="Yes" + fi + export PERSISTENT + ;; + nopersistent) NOPERSISTENT="Yes" export NOPERSISTENT @@ -333,9 +353,9 @@ Arguments () 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 + mount -o bind /sys /root/sys + mount -o bind /proc /root/proc + mount -o bind /dev /root/dev mkdir -p /root/var/run/network chroot /root dhclient eth0 @@ -538,7 +558,7 @@ mount_images_in_directory () { directory="${1}" rootmnt="${2}" - mac="${3}" + mac="${3}" if match_files_in_dir "${directory}/${LIVE_MEDIA_PATH}/*.squashfs" || @@ -607,14 +627,14 @@ copy_live_to () fstype=$(get_fstype "${dev}") freespace=$(fs_size "${dev}") else - [ "$quiet" != "y" ] && log_warning_msg "${copytodev} is not a block device." + log_warning_msg "${copytodev} is not a block device." return 1 fi fi if [ "${freespace}" -lt "${size}" ] then - [ "${quiet}" != "y" ] && log_warning_msg "Not enough free ${free_string} (${freespace}k free, ${size}k needed) to copy live media in ${copytodev}." + log_warning_msg "Not enough free ${free_string} (${freespace}k free, ${size}k needed) to copy live media in ${copytodev}." return 1 fi @@ -688,7 +708,7 @@ do_netmount () NFSROOT=${ROOTSERVER}:${NFSROOT} fi - [ "${quiet}" != "y" ] && log_begin_msg "Trying netboot from ${NFSROOT}" + log_begin_msg "Trying netboot from ${NFSROOT}" if [ "${NETBOOT}" != "nfs" ] && do_cifsmount then @@ -700,7 +720,7 @@ do_netmount () rc=0 fi - [ "${quiet}" != "y" ] && log_end_msg + log_end_msg return ${rc} } @@ -725,20 +745,17 @@ do_httpmount () case "$url" in tftp*) ip="$(dirname $url | sed -e 's|tftp://||g')" - [ "${quiet}" != "y" ] && 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 ;; *) - [ "${quiet}" != "y" ] && log_begin_msg "Trying wget ${url} -O ${dest}/$(basename ${url})" wget "${url}" -O "${dest}/$(basename ${url})" ;; esac else - [ "${quiet}" != "y" ] && - log_begin_msg "Trying to mount ${url} on ${dest}/$(basename ${url})" + log_begin_msg "Trying to mount ${url} on ${dest}/$(basename ${url})" if [ "${webfile}" = "FTPFS" ] then FUSE_MOUNT="curlftpfs" @@ -755,7 +772,7 @@ do_httpmount () ;; *) - [ "${quiet}" != "y" ] && log_begin_msg "Unrecognized archive extension for ${url}" + log_begin_msg "Unrecognized archive extension for ${url}" ;; esac fi @@ -780,7 +797,7 @@ do_nfsmount () NFSOPTS="" fi - [ "${quiet}" != "y" ] && log_begin_msg "Trying nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}" + log_begin_msg "Trying nfsmount -o nolock -o ro ${NFSOPTS} ${NFSROOT} ${mountpoint}" # FIXME: This for loop is an ugly HACK round an nfs bug for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 @@ -805,7 +822,7 @@ do_cifsmount () CIFSOPTS="${NFSOPTS}" fi - [ "${quiet}" != "y" ] && log_begin_msg "Trying mount.cifs ${NFSROOT} ${mountpoint} ${CIFSOPTS}" + log_begin_msg "Trying mount.cifs ${NFSROOT} ${mountpoint} ${CIFSOPTS}" modprobe -q cifs if mount.cifs "${NFSROOT}" "${mountpoint}" "${CIFSOPTS}" @@ -847,7 +864,7 @@ do_snap_copy () if [ -n "${fstype}" ] then # Copying stuff... - mount -t "${fstype}" -o ro,noatime "${fromdev}" "${tomount}" + mount -o ro -t "${fstype}" "${fromdev}" "${tomount}" || log_warning_msg "Error in mount -t ${fstype} -o ro ${fromdev} ${tomount}" cp -a "${tomount}"/* ${todir} umount "${tomount}" else @@ -865,76 +882,106 @@ do_snap_copy () else return 1 - [ "${quiet}" != "y" ] && log_warning_msg "Unable to find the snapshot ${snap_type} medium" + log_warning_msg "Unable to find the snapshot ${snap_type} medium" + fi +} + +find_snap () +{ + # Look for ${snap_label}.* in block devices + snap_label="${1}" + + 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") + fi + + if [ -z "${snapdata}" ] + then + snapdata=$(find_cow_device "${snap_label}") fi + echo "${snapdata}" } try_snap () { - # Look for ${snap_label}.* in block devices and copy the contents to ${snap_mount} + # copy the contents of previously found snapshot to ${snap_mount} # and remember the device and filename for resync on exit in live-initramfs.init - snap_label="${1}" + snapdata="${1}" snap_mount="${2}" snap_type="${3}" - snapdata=$(find_files "${snap_label}.squashfs ${snap_label}.cpio.gz ${snap_label}.ext2 ${snap_label}.ext3 ${snap_label}.jffs2") if [ ! -z "${snapdata}" ] then + log_success_msg "found snapshot: ${snapdata}" snapdev="$(echo ${snapdata} | cut -f1 -d ' ')" snapback="$(echo ${snapdata} | cut -f2 -d ' ')" snapfile="$(echo ${snapdata} | cut -f3 -d ' ')" + RES="" + if ! try_mount "${snapdev}" "${snapback}" "ro" + then + break + fi + if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\|ext3\|jffs2\)' then # squashfs, jffs2 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" - return 1 - fi + do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" + RES=$? else # cpio.gz snapshot - if ! (cd "${snap_mount}" && zcat "${snapback}/${snapfile}" | cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories > /dev/null 2>&1) + cd "${snap_mount}" + zcat "${snapback}/${snapfile}" | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories > /dev/null 2>&1 + RES=$? + if [ "${RES}" != "0" ] then - log_warning_msg "Impossible to include the ${snapfile} Snapshot" - return 1 + log_warning_msg "failure to \"zcat ${snapback}/${snapfile} | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories\"" fi + cd "${OLDPWD}" fi - umount "${snapback}" - else - dev=$(find_cow_device "${snap_label}") + umount "${snapback}" || log_warning_msg "failure to \"umount ${snapback}\"" - if [ -b ${dev} ] + if [ "${RES}" != "0" ] then - if echo "${dev}" | grep -qs loop - then - # strange things happens, user confused? - snaploop=$( losetup ${dev} | awk '{print $3}' | tr -d '()' ) - snapfile=$(basename ${snaploop}) - snapdev=$(cat /proc/mounts | awk '{print $2,$1}' | grep -es "^$( dirname ${snaploop} )" | cut -f2 -d ' ') - else - snapdev="${dev}" - fi + log_warning_msg "Impossible to include the ${snapfile} Snapshot file" + fi - if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" - then - log_warning_msg "Impossible to include the ${snap_label} Snapshot" - return 1 - else - if [ -n "${snapfile}" ] - then - # it was a loop device, user confused - umount ${snapdev} - fi - 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}" + if echo "${dev}" | grep -qs loop + then + # strange things happens, user confused? + snaploop=$( losetup ${dev} | awk '{print $3}' | tr -d '()' ) + snapfile=$(basename ${snaploop}) + snapdev=$(cat /proc/mounts | awk '{print $2,$1}' | grep -es "^$( dirname ${snaploop} )" | cut -f2 -d ' ') else - log_warning_msg "Impossible to include the ${snap_label} Snapshot" + snapdev="${dev}" + fi + + if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" + then + log_warning_msg "Impossible to include the ${snap_type} Snapshot" return 1 + else + if [ -n "${snapfile}" ] + then + # it was a loop device, user confused + umount ${snapdev} + fi fi + else + log_warning_msg "Impossible to include the ${snap_type} Snapshot" + return 1 fi echo "export ${snap_type}SNAP="${snap_mount}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt @@ -1043,9 +1090,16 @@ setup_unionfs () panic "Unknown file system type on ${backdev} (${image})" fi + if [ -z "${fstype}" ] + then + fstype="${imagename##*.}" + log_warning_msg "Unknown file system type on ${backdev} (${image}), assuming ${fstype}." + fi + mkdir -p "${croot}/${imagename}" - echo "debug: Mounting backdev \"${backdev}\" (image = ${image}) on croot/imagename \"${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 @@ -1088,7 +1142,30 @@ setup_unionfs () fi done + # search for label and files (this could be hugely optimized) cowprobe=$(find_cow_device "${root_persistence}") + if [ -b "${cowprobe}" ] + then + # Blacklist /cow device, to avoid inconsistent setups for overlapping snapshots + # makes sense to have both persistence for /cow and /home mounted, maybe also with + # snapshots to be sure to really store some e.g key config files, + # but not on the same media + blacklistdev="${cowprobe}" + PERSISTENCE_IS_ON="Yes" + export PERSISTENCE_IS_ON + fi + # homecow just mount something on /home, this should be generalized some way + homecow=$(find_cow_device "${home_persistence}" "${blacklistdev}") + if [ -b "${homecow}" ] + then + PERSISTENCE_IS_ON="Yes" + export PERSISTENCE_IS_ON + fi + 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. + home_snapdata=$(find_snap "${home_snapshot_label}" "${blacklistdev}") if [ -b "${cowprobe}" ] then @@ -1096,7 +1173,7 @@ setup_unionfs () cow_fstype=$(get_fstype "${cowprobe}") cow_mountopt="rw,noatime" else - [ "${quiet}" != "y" ] && log_warning_msg "Unable to find the persistent medium" + log_warning_msg "Unable to find the persistent medium" cowdevice="tmpfs" cow_fstype="tmpfs" cow_mountopt="rw,noatime,mode=755" @@ -1128,7 +1205,7 @@ setup_unionfs () if [ "${cow_fstype}" = "nfs" ] then - [ "${quiet}" != "y" ] && log_begin_msg \ + log_begin_msg \ "Trying nfsmount ${nfs_cow_opts} ${cowdevice} /cow" nfsmount ${nfs_cow_opts} ${cowdevice} /cow || \ panic "Can not mount ${cowdevice} (n: ${cow_fstype}) on /cow" @@ -1168,6 +1245,7 @@ setup_unionfs () fi # tmpfs file systems + touch /etc/fstab mkdir -p "${rootmnt}/live" mount -t tmpfs tmpfs ${rootmnt}/live @@ -1176,19 +1254,19 @@ setup_unionfs () then # directly mount /home # FIXME: add a custom mounts configurable system - homecow=$(find_cow_device "${home_persistence}" ) if [ -b "${homecow}" ] then mount -t $(get_fstype "${homecow}") -o rw,noatime "${homecow}" "${rootmnt}/home" export HOMEMOUNTED=1 # used to proper calculate free space in do_snap_copy() else - [ "${quiet}" != "y" ] && log_warning_msg "Unable to find the persistent home medium" + log_warning_msg "Unable to find the persistent home medium" fi # Look for other snapshots to copy in - try_snap "${root_snapshot_label}" "${rootmnt}" "ROOT" - try_snap "${home_snapshot_label}" "${rootmnt}/home" "HOME" + try_snap "${root_snapdata}" "${rootmnt}" "ROOT" + # This second type should be removed when snapshot grow smarter + try_snap "${home_snapdata}" "${rootmnt}/home" "HOME" fi if [ -n "${SHOWMOUNTS}" ] @@ -1211,7 +1289,7 @@ setup_unionfs () # shows cow fs on /cow for use by live-snapshot mkdir -p "${rootmnt}/live/cow" - mount -o move /cow "${rootmnt}/live/cow" || mount -o bind /cow "${rootmnt}/live/cow" || [ "${quiet}" != "y" ] && log_warning_msg "Unable to move or bind /cow to ${rootmnt}/live/cow" + mount -o move /cow "${rootmnt}/live/cow" >/dev/null 2>&1 || mount -o bind /cow "${rootmnt}/live/cow" || log_warning_msg "Unable to move or bind /cow to ${rootmnt}/live/cow" } check_dev () @@ -1333,12 +1411,13 @@ set_usplash_timeout () if [ -x /sbin/usplash_write ] then /sbin/usplash_write "TIMEOUT 120" - fi + else if [ -x /sbin/splashy_update ] ; then + /sbin/splashy_update "TIMEOUT 120" + fi ; fi } mountroot () { - if [ -x /scripts/local-top/cryptroot ]; then /scripts/local-top/cryptroot fi @@ -1350,12 +1429,17 @@ mountroot () tail -f live.log >&7 & tailpid="${!}" + # Ensure 'panic' function is overridden + . /scripts/live-functions + Arguments set_usplash_timeout - [ "${quiet}" != "y" ] && log_begin_msg "Running /scripts/live-premount" + + maybe_break live-premount + log_begin_msg "Running /scripts/live-premount" run_scripts /scripts/live-premount - [ "${quiet}" != "y" ] && log_end_msg + log_end_msg # Needed here too because some things (*cough* udev *cough*) # changes the timeout @@ -1423,10 +1507,10 @@ mountroot () log_end_msg maybe_break live-bottom - [ "${quiet}" != "y" ] && log_begin_msg "Running /scripts/live-bottom" + log_begin_msg "Running /scripts/live-bottom" run_scripts /scripts/live-bottom - [ "${quiet}" != "y" ] && log_end_msg + log_end_msg exec 1>&6 6>&- exec 2>&7 7>&-