3 # live-snapshot - utility to manage Debian Live systems snapshots
5 # This program mount a device (fallback to /tmpfs under /mnt/snapshot
6 # and save the /live/cow (or a different dir) filesystem in it for reusing
7 # in another live-initramfs session. Look at manpage for more info.
9 # Copyright (C) 2006 Marco Amadori <marco.amadori@gmail.com>
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
21 # You should have received a copy of the GNU General Public License
22 # along with this program; if not, write to the Free Software
23 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 # On Debian systems, the complete text of the GNU General Public License
26 # can be found in /usr/share/common-licenses/GPL-2 file.
28 PROGRAM="$(basename $0)"
32 if [ -e /etc/live.conf ]
36 USERNAME=$(cat /etc/passwd | grep "999" | cut -f1 -d ':')
40 export USERNAME USERFULLNAME HOSTNAME
42 # Source helper functions
43 helpers="/usr/share/initramfs-tools/scripts/live-helpers"
45 if [ -e "${helpers}" ]
49 echo "Error: I cannot found helper functions \"${helpers}\"."
53 # Define LSB log_* functions.
54 # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
55 . /lib/lsb/init-functions
60 DEST="${MOUNTP}/live-sn.cpio.gz"
66 echo "${PROGRAM} - utility to do Debian Live snapshots"
68 echo "Usage: ${PROGRAM} [-c|--cow DIRECTORY] [-d|--device DEVICE] [-o|--output FILE] [-t|--type TYPE]"
69 echo "Usage: ${PROGRAM} [-r|--resync-string STRING]"
70 echo "Usage: ${PROGRAM} [-h|--help]"
71 echo "Usage: ${PROGRAM} [-u|--usage]"
72 echo "Usage: ${PROGRAM} [-v|--version]"
82 echo "Try \"${PROGRAM} --help\" for more information."
84 if [ ! -z "${MESSAGE}" ]
86 /bin/echo -e "${MESSAGE}"
99 echo " -c, --cow: specifies the copy on write directory (default: /live/cow)."
100 echo " -d, --device: specifies the output snapshot device (default: none)."
101 echo " -o, --output: specifies the output image file (default: ${type} dependent)."
102 echo " -r, --resync-string: internally used to resync previous made snapshots."
103 echo " -t, --type: specifies the snapshot type between \"squashfs\", \"ext2\", \"ext3\", \"jffs2\" or \"cpio\".gz archive (default: cpio)"
104 /bin/echo -e "\nLook at live-snapshot(1) man page for more information."
111 echo "${PROGRAM}, version ${VERSION}"
113 echo "Copyright (C) 2006 Marco Amadori <marco.amadori@gmail.com>"
115 echo "This program is free software; you can redistribute it and/or modify"
116 echo "it under the terms of the GNU General Public License as published by"
117 echo "the Free Software Foundation; either version 2 of the License, or"
118 echo "(at your option) any later version."
120 echo "This program is distributed in the hope that it will be useful,"
121 echo "but WITHOUT ANY WARRANTY; without even the implied warranty of"
122 echo "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"
123 echo "GNU General Public License for more details."
125 echo "You should have received a copy of the GNU General Public License"
126 echo "along with this program; if not, write to the Free Software"
127 echo "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA"
129 echo "On Debian systems, the complete text of the GNU General Public License"
130 echo "can be found in /usr/share/common-licenses/GPL-2 file."
132 echo "Homepage: <http://debian-live.alioth.debian.org/>"
141 echo "./tmp/exclude_list" > /tmp/exclude_list
142 ( cd "${COW}" && find . -name '*.wh.*' >> /tmp/exclude_list )
143 mksquashfs "${COW}" "${DEST}" -ef /tmp/exclude_list || exit 1
148 ( cd "${COW}" && find . -path '*.wh.*' -prune -o -print0 | cpio --quiet -o0 -H newc | gzip -9c > "${DEST}" ) || exit 1
152 DU_DIM="$(du -ks ${COW} | cut -f1)"
153 REAL_DIM="$(expr ${DU_DIM} + ${DU_DIM} / 20)" # Just 5% more to be sure, need something more sophistcated here...
154 genext2fs --size-in-blocks=${REAL_DIM} --reserved-blocks=0 --root="${COW}" "${DEST}" || exit 1
158 mkfs.jffs2 --root="${COW}" --output="${DEST}" || exit 1
162 echo "Internal error."
170 dir1="$(Base_path ${1})"
171 dir2="$(Base_path ${2})"
173 if [ "${dir1}" = "${dir2}" ]
185 ARGUMENTS="$(getopt --longoptions cow:,device:,output,resync-string:,type:,help,usage,version --name=${PROGRAM} --options c:d:o:t:r:,h,u,v --shell sh -- ${ARGS})"
189 echo "Terminating." >&2
193 eval set -- "${ARGUMENTS}"
241 echo "Internal error."; exit 1 ;;
251 if [ ! -d "${MOUNTP}" ]
259 mount -t tmpfs -o rw tmpfs "${MOUNTP}"
261 if [ ! -L /home/${USERNAME}/Desktop/live-snapshot ]
263 ln -s "${MOUNTP}" /home/${USERNAME}/Desktop/live-snapshot
268 try_mount "${dev}" "${MOUNTP}" rw
275 MOUNTP="/mnt/live-snapshot"
278 DEST="${MOUNTP}/live-sn.cpio.gz"
280 DESKTOP_LINK=/home/${USERNAME}/Desktop/live-snapshot
282 if [ -n "${SNAP_RSTRING}" ]
284 COW=$(echo "${SNAP_RSTRING}" | cut -f1 -d ':')
285 DEV=$(echo "${SNAP_RSTRING}" | cut -f2 -d ':')
286 DEST=$(echo "${SNAP_RSTRING}" | cut -f3 -d ':')
306 Usage "Unregognized String"
312 # Bad options handling
313 if [ -z "${SNAP_COW}" ]
320 case "${SNAP_TYPE}" in
321 "cpio"|"squashfs"|"ext2"|"ext3"|"jffs2")
330 Usage "Error: unrecognized snapshot type"
336 DEST="${MOUNTP}/live-sn.cpio.gz"
340 DEST="${MOUNTP}/live-sn.squashfs"
344 DEST="${MOUNTP}/live-sn.ext2"
348 echo "Internal error."
357 Usage "Error: ${COW} is not a directory"