Alexander Skwar
2013-May-03 11:43 UTC
Script for creating/managing snapshots of all subvolumes of all filesystems
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@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Kai Krakow
2013-May-05 17:36 UTC
Re: Script for creating/managing snapshots of all subvolumes of all filesystems
Alexander Skwar <alexanders.mailinglists+nospam@gmail.com> schrieb:> 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.You should change the calls of "btrfs subv del" etc to use unabbreviated versions of the commands. Otherwise you expose your script to erratic behavior as soon as new commands are added to btrfs that make your usage of the commands ambigious. Regards, Kai -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Alexander Skwar
2013-May-05 19:26 UTC
Re: Script for creating/managing snapshots of all subvolumes of all filesystems
Hi On Sun, May 5, 2013 at 7:36 PM, Kai Krakow <hurikhan77+btrfs@gmail.com> wrote:> Alexander Skwar <alexanders.mailinglists+nospam@gmail.com> schrieb: > >> 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. > > You should change the calls of "btrfs subv del" etc to use unabbreviated > versions of the commands. Otherwise you expose your script to erraticOh, yes. Very good point. And there really isn''t any benefit in using abbreviated versions of the command names in a script anyway. On the command line: Yes, less to type = better. But in a script? Thanks. Very good point indeed! Alexander -- => Google+ => http://plus.skwar.me <==> Chat (Jabber/Google Talk) => a.skwar@gmail.com <=-- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html