X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=scripts%2Flive;h=0f4ef0d1378921cec5d5b51f2a46d4bcacbb4c00;hb=56d7b4e9c17311dfa071a5ac5cc80a2f1ff8e79f;hp=08810cbf2925d324ba855eca1a45498546745c14;hpb=a50ce9d0fcbf4b6fcc8c4ac97fcfe5625b174a19;p=live-boot-grml.git diff --git a/scripts/live b/scripts/live index 08810cb..0f4ef0d 100755 --- a/scripts/live +++ b/scripts/live @@ -326,6 +326,15 @@ Arguments () export PERSISTENT ;; + persistent=*) + PERSISTENT="${ARGUMENT#persistent=}" + if [ -z "${PERSISTENT}" ] + then + PERSISTENT="Yes" + fi + export PERSISTENT + ;; + nopersistent) NOPERSISTENT="Yes" export NOPERSISTENT @@ -855,7 +864,7 @@ do_snap_copy () if [ -n "${fstype}" ] then # Copying stuff... - mount -t "${fstype}" -o ro,noatime "${fromdev}" "${tomount}" || log_warning_msg "Error in 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 @@ -877,15 +886,32 @@ do_snap_copy () 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 @@ -895,6 +921,10 @@ try_snap () 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 @@ -908,46 +938,50 @@ try_snap () 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 "failure to \"zcat ${snapback}/${snapfile} | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories\"" + fi cd "${OLDPWD}" fi - umount "${snapback}" + umount "${snapback}" || log_warning_msg "failure to \"umount ${snapback}\"" if [ "${RES}" != "0" ] then log_warning_msg "Impossible to include the ${snapfile} Snapshot file" fi - else - dev=$(find_cow_device "${snap_label}") - if [ -b ${dev} ] + 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 - 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 + # 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 - if ! do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" + 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 - 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 + # it was a loop device, user confused + umount ${snapdev} fi - else - log_warning_msg "Impossible to include the ${snap_label} Snapshot" - return 1 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 @@ -1108,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 @@ -1197,7 +1254,6 @@ setup_unionfs () then # directly mount /home # FIXME: add a custom mounts configurable system - homecow=$(find_cow_device "${home_persistence}" ) if [ -b "${homecow}" ] then @@ -1208,8 +1264,9 @@ setup_unionfs () 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}" ]