Greetings, I am attaching patches for what I believe is a working live-sn setup. I looked through all the options provided and removed many since a working live-sn is essential and one good working way is better than many that do not function or seem to be subsets of the essential need. I believe with /etc/live-snapshot.list you tune in for what you want like /home.
I have tested all the remaining persistent partitions types of live-sn, live-rw, and home-rw and all worked ok on my development machine. There is some tidy up if accepted that would be needed in the live-snapshot man page and also the manual to reflect the available options, but I believe the changes to be worth while. Please consider merging to fix the broken live-sn. P.S. On the live-initramfs.patch it also fixes the eject bug as discussed on irc by remove the else return 0 in do_stop.
--- /etc/init.d/live-initramfs 2009-03-08 09:19:49.000000000 -0500 +++ live-initramfs 2009-05-05 20:33:14.000000000 -0500 @@ -95,19 +95,9 @@ do_stop () { - if ! grep -qs nopersistent /proc/cmdline && grep -qs persistent /proc/cmdline + if ! grep -qs nopersistent /proc/cmdline && grep -qs persistent /proc/cmdline && [ ! -z "${SNAP}" ] then - if [ ! -z "${ROOTSNAP}" ] - then - ${DO_SNAPSHOT} --resync-string="${ROOTSNAP}" - fi - - if [ ! -z "${HOMESNAP}" ] - then - ${DO_SNAPSHOT} --resync-string="${HOMESNAP}" - fi - else - return 0 + ${DO_SNAPSHOT} --resync-string="${SNAP}" fi # check for netboot
--- /sbin/live-snapshot 2009-04-22 14:43:11.000000000 -0500 +++ live-snapshot 2009-05-05 18:25:54.000000000 -0500 @@ -27,8 +27,7 @@ # can be found in /usr/share/common-licenses/GPL-3 file. # declare here two vars from /etc/live.conf because of "set -u" -ROOTSNAP="" -HOMESNAP="" +SNAP="" if [ -n "${LIVE_SNAPSHOT_CHECK_UNBOUND}" ] then @@ -50,9 +49,13 @@ # Needs to be available at run and reboot time SAFE_TMPDIR="/live" +MOUNTP="${SAFE_TMPDIR}/snap-backing" # Permits multiple runs -MOUNTP="$(mktemp -d -p ${SAFE_TMPDIR} live-snapshot-mnt.XXXXXX)" -DEST="${MOUNTP}/live-sn.cpio.gz" +if [ ! -d "${MOUNTP}" ] +then + mkdir "${MOUNTP}" +fi +DEST="/live-sn.cpio.gz" DEF_SNAP_COW="/live/cow" TMP_FILELIST="${PROGRAM}.list" @@ -99,7 +102,6 @@ echo " -o, --output: output image file (default: ${DEST})." echo " -r, --resync-string: internally used to resync previous made snapshots." echo " -f, --refresh: try to sync a running snapshot." - echo " -t, --type: snapshot filesystem type. Options: \"squashfs\", \"ext2\", \"ext3\", \"ext4\", \"jffs2\" or \"cpio\".gz archive (default: ${SNAP_TYPE})" echo echo "Look at live-snapshot(1) man page for more information." @@ -148,13 +150,8 @@ Try_refresh () { FOUND="" - if [ -n "${ROOTSNAP}" ]; then - "${EXECUTABLE}" --resync-string="${ROOTSNAP}" - FOUND="Yes" - fi - - if [ -n "${HOMESNAP}" ]; then - "${EXECUTABLE}" --resync-string="${HOMESNAP}" + if [ -n "${SNAP}" ]; then + "${EXECUTABLE}" --resync-string="${SNAP}" FOUND="Yes" fi @@ -170,7 +167,7 @@ { # Parse command line ARGS="${*}" - ARGUMENTS="$(getopt --longoptions cow:,device:,output,resync-string:,refresh,type:,help,usage,version --name=${PROGRAM} --options c:d:o:t:r:fhuv --shell sh -- ${ARGS})" + ARGUMENTS="$(getopt --longoptions cow:,device:,output,resync-string:,refresh,help,usage,version --name=${PROGRAM} --options c:d:o:t:r:fhuv --shell sh -- ${ARGS})" eval set -- "${ARGUMENTS}" @@ -192,11 +189,6 @@ shift 2 ;; - -t|--type) - SNAP_TYPE="${2}" - shift 2 - ;; - -r|--resync-string) SNAP_RESYNC_STRING="${2}" break @@ -246,55 +238,17 @@ SNAP_TYPE="cpio" ;; - *.squashfs) - SNAP_TYPE="squashfs" - ;; - - *.jffs2) - SNAP_TYPE="jffs2" - ;; - - ""|*.ext2|*.ext3) - SNAP_TYPE="ext2" - ;; - - *.ext4) - SNAP_TYPE="ext4" - ;; - *) Error "unrecognized resync string" ;; esac - elif [ -z "${SNAP_OUTPUT}" ] - then - # Set target file based on image - case "${SNAP_TYPE}" in - cpio) - DEST="${MOUNTP}/live-sn.cpio.gz" - ;; - - squashfs|jffs2|ext2) - DEST="${MOUNTP}/live-sn.${SNAP_TYPE}" - ;; - - ext3) - DEST="${MOUNTP}/live-sn.ext2" - ;; - - ext4) - DEST="${MOUNTP}/live-sn.ext4" - ;; - esac - else - DEST="${SNAP_OUTPUT}" fi } Validate_input () { case "${SNAP_TYPE}" in - cpio|squashfs|jffs2|ext2|ext3|ext4) + cpio) ;; *) @@ -395,59 +349,26 @@ Do_snapshot () { TMP_FILELIST=$(mktemp -p "${SAFE_TMPDIR}" "${TMP_FILELIST}.XXXXXX") - - case "${SNAP_TYPE}" in - squashfs) - echo ".${TMP_FILELIST}" > "${TMP_FILELIST}" - # Removing whiteheads of unionfs - cd "${SNAP_COW}" - find . -name '*.wh.*' >> "${TMP_FILELIST}" - - if [ -e "${EXCLUDE_LIST}" ] - then - # Add explicitly excluded files - grep -v '^#.*$' "${EXCLUDE_LIST}" | grep -v '^ *$' >> "${TMP_FILELIST}" - fi - - cd "${OLDPWD}" - mksquashfs "${SNAP_COW}" "${DEST}" -ef "${TMP_FILELIST}" - ;; - - cpio) - WORKING_DIR=$(Do_filelist "${TMP_FILELIST}") - cd "${WORKING_DIR}" - if [ -e "${EXCLUDE_LIST}" ] - then - # Convert \0 to \n and tag existing (rare but possible) \n in filenames, - # this to let grep -F -v do a proper work in filtering out - cat "${TMP_FILELIST}" | \ - tr '\n' '\1' | \ - tr '\0' '\n' | \ - grep -F -v -f "${EXCLUDE_LIST}" | \ - tr '\n' '\0' | \ - tr '\1' '\n' | \ - cpio --quiet -o0 -H newc | \ - gzip -9c > "${DEST}" || exit 1 - else - cat "${TMP_FILELIST}" | \ - cpio --quiet -o0 -H newc | \ - gzip -9c > "${DEST}" || exit 1 - fi - cd "${OLDPWD}" - ;; - - # ext2|ext3|ext4 and jffs2 does not easily support an exclude list; files - # should be copied to another directory in order to filter content - ext2|ext3|ext4) - DU_DIM="$(du -ks ${SNAP_COW} | cut -f1)" - REAL_DIM="$(expr ${DU_DIM} + ${DU_DIM} / 20)" # Just 5% more to be sure, need something more sophistcated here... - genext2fs --size-in-blocks=${REAL_DIM} --reserved-percentage=0 --root="${SNAP_COW}" "${DEST}" - ;; - - jffs2) - mkfs.jffs2 --root="${SNAP_COW}" --output="${DEST}" - ;; - esac + WORKING_DIR=$(Do_filelist "${TMP_FILELIST}") + cd "${WORKING_DIR}" + if [ -e "${EXCLUDE_LIST}" ] + then + # Convert \0 to \n and tag existing (rare but possible) \n in filenames, + # this to let grep -F -v do a proper work in filtering out + cat "${TMP_FILELIST}" | \ + tr '\n' '\1' | \ + tr '\0' '\n' | \ + grep -F -v -f "${EXCLUDE_LIST}" | \ + tr '\n' '\0' | \ + tr '\1' '\n' | \ + cpio --quiet -o0 -H newc | \ + gzip -9c > "${DEST}" || exit 1 + else + cat "${TMP_FILELIST}" | \ + cpio --quiet -o0 -H newc | \ + gzip -9c > "${DEST}" || exit 1 + fi + cd "${OLDPWD}" if [ -f "${TMP_FILELIST}" ] then @@ -470,21 +391,8 @@ { if [ -z "${SNAP_RESYNC_STRING}" ] then - case ${SNAP_TYPE} in - cpio|ext2|ext3|ext4) - echo "Please move ${DEST} (if is not already in it)" > /dev/null 1>&2 - echo "in a supported writable partition (e.g ext3, vfat)." > /dev/null 1>&2 - ;; - - squashfs) - echo "To use ${DEST} you need to rebuild your media or add it" > /dev/null 1>&2 - echo "to your multisession disc under the \"/live\" directory." > /dev/null 1>&2 - ;; - - jffs2) - echo "Please cat or flashcp ${DEST} to your partition in order to start using it." > /dev/null 1>&2 - ;; - esac + echo "Please move ${DEST} (if is not already in it)" > /dev/null 1>&2 + echo "in a supported writable partition (e.g ext3, vfat)." > /dev/null 1>&2 if grep -qv persistent /proc/cmdline then
--- /usr/share/initramfs-tools/scripts/live 2009-05-04 10:35:39.000000000 -0500 +++ live 2009-05-05 16:52:19.000000000 -0500 @@ -13,7 +13,6 @@ root_persistence="live-rw" home_persistence="home-rw" root_snapshot_label="live-sn" -home_snapshot_label="home-sn" USERNAME="user" USERFULLNAME="Live user" @@ -865,157 +864,54 @@ return ${rc} } -do_snap_copy () -{ - fromdev="${1}" - todir="${2}" - snap_type="${3}" - size=$(fs_size "${fromdev}" "" "used") - - if [ -b "${fromdev}" ] - then - # look for free mem - if [ -n "${HOMEMOUNTED}" -a "${snap_type}" = "HOME" ] - then - todev=$(awk -v pat="$(base_path ${todir})" '$2 == pat { print $1 }' /proc/mounts) - freespace=$(df -k | awk '/'${todev}'/{print $4}') - else - freespace=$( expr $(awk '/MemFree/{print $2}' /proc/meminfo) + $( awk '/\<Cached/{print $2}' /proc/meminfo)) - fi - - tomount="/mnt/tmpsnap" - - if [ ! -d "${tomount}" ] - then - mkdir -p "${tomount}" - fi - - fstype=$(get_fstype "${fromdev}") - - if [ -n "${fstype}" ] - then - # Copying stuff... - 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 - log_warning_msg "Unrecognized fstype: ${fstype} on ${fromdev}:${snap_type}" - fi - - rmdir "${tomount}" - - if echo ${fromdev} | grep -qs loop - then - losetup -d "${fromdev}" - fi - - return 0 - else - return 1 - - 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 ${snal_label}.ext4 ${snap_label}.jffs2") - fi - - if [ -z "${snapdata}" ] - then - snapdata=$(find_cow_device "${snap_label}") - fi - echo "${snapdata}" -} - try_snap () { # copy the contents of previously found snapshot to ${snap_mount} # and remember the device and filename for resync on exit in live-initramfs.init - snapdata="${1}" - snap_mount="${2}" - snap_type="${3}" - - 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 ' ')" + snapdata="${#}" + snap_dev="${1}" + snap_mount="${2}/${3}-dir" + snap_file="${3}.cpio.gz" + + if [ ! -z "${snap_dev}" ] + then + log_success_msg "Trying snapshot with the following parameters: ${snapdata}" RES="" - if ! try_mount "${snapdev}" "${snapback}" "ro" + if [ ! -d "${snap_mount}" ] then - break + mkdir "${snap_mount}" fi - - if echo "${snapfile}" | grep -qs '\(squashfs\|ext2\|ext3\|ext4\|jffs2\)' + if ! try_mount "${snap_dev}" "${snap_mount}" "ro" then - # squashfs, jffs2 or ext2/ext3/ext4 snapshot - dev=$(get_backing_device "${snapback}/${snapfile}") - - do_snap_copy "${dev}" "${snap_mount}" "${snap_type}" - RES=$? - else - # cpio.gz snapshot - 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}" + break fi - umount "${snapback}" || log_warning_msg "failure to \"umount ${snapback}\"" - + # cpio.gz snapshot + log_begin_msg "Attemtping to restore snapshot ${snap_mount}/${snap_file}" + cd "/root" + zcat "${snap_mount}/${snap_file}" | /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 file" - fi + log_warning_msg "failure to \"zcat ${snap_mount}/${snap_file} | /bin/cpio --extract --preserve-modification-time --no-absolute-filenames --sparse --unconditional --make-directories\"" + fi + cd "${OLDPWD}" + umount "${snap_mount}" || log_warning_msg "failure to \"umount ${snap_mount}\"" - 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 + if [ "${RES}" != "0" ] then - # strange things happens, user confused? - snaploop=$( losetup ${dev} | awk '{print $3}' | tr -d '()' ) - snapfile=$(basename ${snaploop}) - snapdev=$(awk -v pat="$( dirname ${snaploop})" '$2 == pat { print $1 }' /proc/mounts) - else - snapdev="${dev}" + log_warning_msg "Impossible to include the ${snap_file} Snapshot file" 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" + log_warning_msg "Impossible to include the ${snap_file} Snapshot" return 1 fi - echo "export ${snap_type}SNAP="${snap_mount}":${snapdev}:${snapfile}" >> /etc/live.conf # for resync on reboot/halt + echo "export SNAP="${snap_mount}":${snap_dev}:${snap_file}" >> /etc/live.conf # for resync on reboot/halt return 0 } @@ -1198,11 +1094,8 @@ PERSISTENCE_IS_ON="1" 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|ext4|jffs2 snapshot types. - home_snapdata=$(find_snap "${home_snapshot_label}" "${blacklistdev}") + # root_snapdata is for live-sn + root_snapdata=$(find_cow_device "${root_snapshot_label}" "${blacklistdev}") if [ -b "${cowprobe}" ] then @@ -1305,9 +1198,7 @@ fi # Look for other snapshots to copy in - try_snap "${root_snapdata}" "${rootmnt}" "ROOT" - # This second type should be removed when snapshot grow smarter - try_snap "${home_snapdata}" "${rootmnt}/home" "HOME" + try_snap "${root_snapdata}" "${mountpoint}" "${root_snapshot_label}" fi if [ -n "${SHOWMOUNTS}" ]