Hi FWIW, I've also written a script which creates and "manages" (ie. deletes old) snapshots. It figures out all the available filesystems and creates snaps for all the available (sub)volumes. It's also on https://copy.com/WI9AXqTH2nD4 and http://pastebin.com/YX8WKcsR to avoid line break issues and also with comments. Regards, Alexander ----- cut here #!/bin/sh echo "Usage: $0 SNAPSHOT_TAG NUM_SNAPSHOTS Create hourly, daily, weekly, and monthly snapshots of btrfs filesystems. Based somewhat on http://article.gmane.org/gmane.comp.file- systems.btrfs/12609 Here's my crontab: 00,15,30,45 * * * * $0 frequently 4 38 * * * * $0 hourly 24 08 00 * * * $0 daily 7 08 12 * * 0 $0 weekly 4" exit 1 fi SNAPSHOT_TAG="$1" NUM_SNAPSHOTS="$2" snap_prefix="snapshot:$SNAPSHOT_TAG:" snap_date="`date +%Y-%m-%d--%H.%M.%S.%N`" script_name=`basename "$0"` log_fac="local5" log_tag="$script_name" btrfs_progs_dev_path="/home/a/Copy/Computerkram/Programme/btrfs- progs.dev/bin" PATH="$btrfs_progs_dev_path:$PATH" btrfs fi show 2>/dev/null | awk '/ path / {print $NF}' | while read dev; do set -- `btrfs fi show 2>/dev/null | grep -B2 " path $dev" | \ grep "Label:" | sed 's,.*: \(.*\) uuid: \(.*\),\1 \2,'` label="$1" uuid="$2" logger -t "$log_tag" -p "$log_fac.info" -- \ "Processing filesystem with label $label and uuid $uuid on $dev" safe_dev=`echo "$dev" | tr / .` tmp_mount_dir=`mktemp -d "/tmp/.btrfs.mount.$uuid.$safe_dev.XXXXXX"` if ! mount -t btrfs "$dev" "$tmp_mount_dir"; then logger -t "$log_tag" -p "$log_fac.err" -- \ "Error! Could not do: mount -t btrfs $dev $tmp_mount_dir" exit 1 fi _snap_name="$tmp_mount_dir/,$snap_prefix$snap_date" if ! btrfs subv snaps -r "$tmp_mount_dir" "$_snap_name" > /dev/null; then logger -t "$log_tag" -p "$log_fac.err" -- \ "Error! Could not do: btrfs subv snaps -r $tmp_mount_dir $_snap_name" exit 1 else logger -t "$log_tag" -p "$log_fac.info" -- \ "Created snapshot $Path,$snap_prefix$snap_date for root volume of fs with uuid $uuid" fi (btrfs subv list -r "$tmp_mount_dir" | grep " path ,$snap_prefix" \ | tail -"$NUM_SNAPSHOTS" btrfs subv list -r "$tmp_mount_dir" | grep " path ,$snap_prefix") \ | sort | uniq -u \ | while read __id IdDel __gen GenDel __top __level ToplevelDel __path PathDel; do if ! btrfs subv del "$tmp_mount_dir/$PathDel" > /dev/null; then logger -t "$log_tag" -p "$log_fac.err" -- \ "Error! Could not do: btrfs subv del $tmp_mount_dir/$PathDel" exit 1 else logger -t "$log_tag" -p "$log_fac.info" -- \ "Removed snapshot $PathDel" fi done (btrfs subv list -ar $tmp_mount_dir; btrfs subv list -a $tmp_mount_dir) \ | sort | uniq -u \ | while read _id Id _gen Gen _top _level Toplevel _path Path; do _snap_name="$tmp_mount_dir/$Path,$snap_prefix$snap_date" if ! btrfs subv snaps -r "$tmp_mount_dir/$Path" "$_snap_name" > /dev/null; then logger -t "$log_tag" -p "$log_fac.err" -- \ "Error! Could not do: btrfs subv snaps -r $tmp_mount_dir/$Path $_snap_name" exit 1 else logger -t "$log_tag" -p "$log_fac.info" -- \ "Created snapshot $Path,$snap_prefix$snap_date for subvolume $Path" fi (btrfs subv list -r "$tmp_mount_dir" \ | grep " path $Path,$snap_prefix" | tail -"$NUM_SNAPSHOTS" btrfs subv list -r "$tmp_mount_dir"|grep " path $Path,$snap_prefix") \ | sort | uniq -u \ | while read __id IdDel __gen GenDel __top __level ToplevelDel __path PathDel; do if ! btrfs subv del "$tmp_mount_dir/$PathDel" > /dev/null; then logger -t "$log_tag" -p "$log_fac.err" -- \ "Error! Could not do: btrfs subv del $tmp_mount_dir/$PathDel" exit 1 else logger -t "$log_tag" -p "$log_fac.info" -- \ "Removed snapshot $PathDel" fi done done if ! umount "$tmp_mount_dir"; then logger -t "$log_tag" -p "$log_fac.err" -- \ "Error! Could not do: umount$tmp_mount_dir" fi if ! rmdir "$tmp_mount_dir"; then logger -t "$log_tag" -p "$log_fac.err" -- \ "Error! Could not do: rmdir $tmp_mount_dir" fi done exit 0 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
