Advertisement
alexs77

btrfs-snapshots.sh

May 2nd, 2013
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.46 KB | None | 0 0
  1. #!/bin/sh
  2.  
  3. # btrfs-snapshots.sh
  4. # Erzeuge hourly, daily, weekly, and monthly Snapshots der btrfs Dateisysteme
  5.  
  6. # Basiert auf http://article.gmane.org/gmane.comp.file-systems.btrfs/12609
  7. # Here's my crontab:
  8. # 0 * * * * /usr/local/bin/snapshot hourly 6
  9. # 0 0 * * * /usr/local/bin/snapshot daily 7
  10. # 0 0 * * 0 /usr/local/bin/snapshot weekly 4
  11.  
  12. if [ "$#" -ne 2 ]; then
  13.     echo "Usage: $0 SNAPSHOT_PREFIX NUM_SNAPSHOTS"
  14.     exit 1
  15. fi
  16.  
  17. SNAPSHOT_PREFIX="$1"
  18. NUM_SNAPSHOTS="$2"
  19.  
  20. #a@ewzw032:~$ sudo btrfs subv snaps -r /.backup /.backup/.blub ; sudo btrfs subv snaps -r /.backup/Syno /.backup/Syno/.blub
  21.  
  22. snap_prefix=".snapshot:$SNAPSHOT_PREFIX:"
  23. snap_name="$snap_prefix`date +%Y-%m-%d--%H.%M.%S.%N`"
  24.  
  25. # Finde alle btrfs
  26. df -T | grep ' btrfs ' | perl -p -e 's,^(.*?) .* (/.*)$,$1 $2,' | while read dev mp; do
  27.     # Find alle subvolumes dieses btrfs
  28.     # z.B.: ID 268 gen 3176 top level 5 path foo/bar
  29.     # Zeige alle subvolumes und zusätzliche alle "readonly" (snapshot)
  30.     # Volumes. Filtere dann das raus, was doppelt angezeigt wurde; das
  31.     # sind die snapshots. Dadurch werden nur die "richtigen" Volumes
  32.     # angezeigt.
  33.     ( btrfs subv list -r "$mp" ; btrfs subv list "$mp" ) | sort | uniq -u | while read id Id gen Gen top level Toplevel path Path; do
  34.         # Erzeuge den Snapshot
  35.         #echo "`date +%Y-%m-%d--%H.%M.%S.%N`: Erzeuge Snapshot $mp/$Path/$snap_name fuer $mp/$Path"
  36.         set -x; btrfs subv snapshot -r "$mp/$Path" "$mp/$Path/$snap_name"; set +x
  37.     done
  38.    
  39.     # Lösche alte Snapshot(s)
  40.     # Zeige alle read only Subvolumes an. Und zusätzlich "doppelt" die letzten
  41.     # $NUM_SNAPSHOTS Snapshots. Führt dazu, das die gewünchte Anzahl an zu
  42.     # behaltenden Snapshots doppelt angezeigt wird.
  43.     # Nun sortiere die Liste und zeige nur die an, die nur 1x vorkommen.
  44.     # Das sind die Snapshots, die gelöscht werden sollen.
  45.     # ID 257 gen 28590 top level 256 path a
  46.     # a@ewzw032:~$ ( sudo btrfs subv list -r /.backup/ | grep ' \.boing:' | tail -$n ; sudo btrfs subv list -r /.backup/ | grep ' \.boing:' ) | sort | uniq -u
  47.  
  48.     ( btrfs subv list -r "$mp" | grep " path $snap_prefix" | tail -"$n"; sudo btrfs subv list -r "$mp" | grep " path $snap_prefix" ) | sort | uniq -u | while read id Id gen Gen top level Toplevel path Path; do
  49.         #echo "`date +%Y-%m-%d--%H.%M.%S.%N`: Entferne Snapshot $mp/$Path/$snap_name fuer $mp/$Path"
  50.         set -x; btrfs subv delete "$mp/$Path"; set +x
  51.     done
  52.    
  53.     echo
  54. done
  55.  
  56. exit 0
  57. # EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement