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`"
33 if [ -e /etc/live.conf ]; then
36 USERNAME=$(cat /etc/passwd | grep "999" | cut -f1 -d ':')
41 export USERNAME USERFULLNAME HOSTNAME BUILD_SYSTEM
43 # Source helper functions
44 helpers="/usr/share/initramfs-tools/scripts/live-helpers"
45 if [ -e "${helpers}" ]; then
48 echo "Error: I cannot found helper functions \"${helpers}\"."
52 # Define LSB log_* functions.
53 # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
54 . /lib/lsb/init-functions
65 echo "${PROGRAM} - utility to do Debian Live snapshots"
67 echo "Usage: ${PROGRAM} [-c|--cow DIRECTORY] [-d|--device DEVICE] [-o|--output FILE] [-t|--type TYPE]"
68 echo "Usage: ${PROGRAM} [-r|--resync-string STRING]"
69 echo "Usage: ${PROGRAM} [-h|--help]"
70 echo "Usage: ${PROGRAM} [-u|--usage]"
71 echo "Usage: ${PROGRAM} [-v|--version]"
79 echo "Try \"${PROGRAM} --help\" for more information."
80 if [ ! -z "${MESSAGE}" ]; then
93 echo " -c, --cow: specifies the copy on write directory (default: /live/cow)."
94 echo " -d, --device: specifies the output snapshot device (default: none)."
95 echo " -o, --output: specifies the output image file (default: $type dependent)."
96 echo " -r, --resync-string: internally used to resync previous made snapshots."
97 echo " -t, --type: specifies the snapshot type between \"squashfs\", \"ext2\", \"ext3\" or \"cpio\".gz archive (default: cpio)"
98 echo -e "\nLook at live-snapshot(1) man page for more information."
104 echo "${PROGRAM}, version ${VERSION}"
106 echo "Copyright (C) 2006 Marco Amadori <marco.amadori@gmail.com>"
108 echo "This program is free software; you can redistribute it and/or modify"
109 echo "it under the terms of the GNU General Public License as published by"
110 echo "the Free Software Foundation; either version 2 of the License, or"
111 echo "(at your option) any later version."
113 echo "This program is distributed in the hope that it will be useful,"
114 echo "but WITHOUT ANY WARRANTY; without even the implied warranty of"
115 echo "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"
116 echo "GNU General Public License for more details."
118 echo "You should have received a copy of the GNU General Public License"
119 echo "along with this program; if not, write to the Free Software"
120 echo "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA"
122 echo "On Debian systems, the complete text of the GNU General Public License"
123 echo "can be found in /usr/share/common-licenses/GPL-2 file."
125 echo "Homepage: <http://debian-live.alioth.debian.org/>"
133 echo "./tmp/exclude_list" > /tmp/exclude_list
134 ( cd "${COW}" && find . -name '*.wh.*' >> /tmp/exclude_list )
135 mksquashfs "${COW}" "${DEST}" -ef /tmp/exclude_list || exit 1
139 ( cd "${COW}" && find . -path '*.wh.*' -prune -o -print0 | cpio --quiet -o0 -H newc | gzip -9c > "${DEST}" ) || exit 1
142 DU_DIM="`du -ks ${COW} | cut -f1`"
143 REAL_DIM="`expr ${DU_DIM} + ${DU_DIM} / 20`" # Just 5% more to be sure, need something more sophistcated here...
144 genext2fs --size-in-blocks=${REAL_DIM} --reserved-blocks=0 --root="${COW}" "${DEST}" || exit 1
147 echo "Internal error."
155 dir1="`Base_path $1`"
156 dir2="`Base_path $2`"
157 if [ "${dir1}" = "${dir2}" ]; then
168 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}`"
170 if [ "$?" != "0" ]; then
171 echo "Terminating." >&2
175 eval set -- "${ARGUMENTS}"
180 SNAP_COW="$2"; shift 2 ;;
182 SNAP_DEV="$2"; shift 2 ;;
184 SNAP_OUTPUT="$2"; shift 2 ;;
186 SNAP_TYPE="$2"; shift 2 ;;
188 SNAP_RSTRING="$2"; break ;;
198 echo "Internal error."; exit 1 ;;
207 if [ ! -d "${MOUNTP}" ]; then
211 if [ -z "${dev}" ]; then
213 mount -t tmpfs -o rw tmpfs "${MOUNTP}"
214 if [ ! -L /home/$USERNAME/Desktop/live-snapshot ]; then
215 ln -s "${MOUNTP}" /home/$USERNAME/Desktop/live-snapshot
218 if [ -b "${dev}" ] ; then
219 try_mount "${dev}" "${MOUNTP}" rw
226 MOUNTP="/mnt/live-snapshot"
229 DEST="${MOUNTP}/live-sn.cpio.gz"
231 DESKTOP_LINK=/home/$USERNAME/Desktop/live-snapshot
233 if [ -n "${SNAP_RSTRING}" ]; then
234 COW=$(echo "${SNAP_RSTRING}" | cut -f1 -d ':')
235 DEV=$(echo "${SNAP_RSTRING}" | cut -f2 -d ':')
236 DEST=$(echo "${SNAP_RSTRING}" | cut -f3 -d ':')
248 Usage "Unregognized String" ;;
252 # Bad options handling
253 if [ -z "${SNAP_COW}" ]; then
259 case "${SNAP_TYPE}" in
260 "cpio"|"squashfs"|"ext2"|"ext3")
266 Usage "Error: unrecognized snapshot type"
274 if [ ! -d "${COW}" ]; then
275 Usage "Error: ${COW} is not a directory"
284 if [ -n "$DEV" ]; then