From: Alexander Skwar <alexanders.mailinglists+nospam@gmail.com>
To: linux-btrfs@vger.kernel.org
Subject: Script for creating/managing snapshots of all subvolumes of all filesystems
Date: Fri, 3 May 2013 11:43:18 +0000 (UTC) [thread overview]
Message-ID: <loom.20130503T133254-992@post.gmane.org> (raw)
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
next reply other threads:[~2013-05-03 11:43 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-03 11:43 Alexander Skwar [this message]
2013-05-05 17:36 ` Script for creating/managing snapshots of all subvolumes of all filesystems Kai Krakow
2013-05-05 19:26 ` Alexander Skwar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=loom.20130503T133254-992@post.gmane.org \
--to=alexanders.mailinglists+nospam@gmail.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox