mirror of
				https://github.com/ItsDrike/dotfiles.git
				synced 2025-10-31 07:56:36 +00:00 
			
		
		
		
	Add btrfs backup/snapshot script
This commit is contained in:
		
							parent
							
								
									dc4d6fd43f
								
							
						
					
					
						commit
						d7bf3a044d
					
				
					 1 changed files with 110 additions and 0 deletions
				
			
		
							
								
								
									
										110
									
								
								root/usr/local/bin/btrfs-backup
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										110
									
								
								root/usr/local/bin/btrfs-backup
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,110 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| usage() { | ||||
|   cat <<EOF | ||||
| Create a btrfs snapshot | ||||
| 
 | ||||
| Usage btrfs-backup <subvolume> <backup_dir> [options] | ||||
| 
 | ||||
| Will create a snapshot of given subvolume in given backup_dir. | ||||
| 
 | ||||
| Options: | ||||
| -h | --help: Display this message | ||||
| -t | --total: Total amount of allowed backups in the same backup_dir | ||||
| -n | --name: Name of the snapshot (appended after date) | ||||
| 
 | ||||
| Example for crontab (/etc/crontab): | ||||
| 15,30,45 * * * * 	 root 	 /usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/quaterly --total 4 | ||||
| 15,30,45 * * * * 	 root 	 /usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/quaterly --total 4 | ||||
| 15,30,45 * * * * 	 root 	 /usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/quaterly --total 4 | ||||
| 15,30,45 * * * * 	 root 	 /usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/quaterly --total 4 | ||||
| 
 | ||||
| 0 * * * * 	root 	 /usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/hourly --total 8 | ||||
| 0 * * * * 	root 	 /usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/hourly --total 8 | ||||
| 0 * * * * 	root 	 /usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/hourly --total 8 | ||||
| 0 * * * * 	root 	 /usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/hourly --total 8 | ||||
| 
 | ||||
| Example for Anacrontab (/etc/anacrontab): | ||||
| @daily   	 10 	 snapshot.daily.@      	 /usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/daily --total 8 | ||||
| @daily   	 10 	 snapshot.daily.@home  	 /usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/daily --total 8 | ||||
| @daily   	 10 	 snapshot.daily.@data  	 /usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/daily --total 8 | ||||
| @daily   	 10 	 snapshot.daily.@log   	 /usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/daily --total 8 | ||||
| 
 | ||||
| @weekly  	 20 	 snapshot.weekly.@     	 /usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/weekly --total 5 | ||||
| @weekly  	 20 	 snapshot.weekly.@home 	 /usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/weekly --total 5 | ||||
| @weekly  	 20 	 snapshot.weekly.@data 	 /usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/weekly --total 5 | ||||
| @weekly  	 20 	 snapshot.weekly.@log  	 /usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/weekly --total 5 | ||||
| 
 | ||||
| @monthly 	 30 	 snapshot.monthly.@     	/usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/monthly --total 3 | ||||
| @monthly 	 30 	 snapshot.monthly.@home 	/usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/monthly --total 3 | ||||
| @monthly 	 30 	 snapshot.monthly.@data 	/usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/monthly --total 3 | ||||
| @monthly 	 30 	 snapshot.monthly.@log  	/usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/monthly --total 3 | ||||
| EOF | ||||
| } | ||||
| 
 | ||||
| backup() { | ||||
|   local now="$(date '+%Y_%M_%dT%H_%M_%S')" | ||||
|   local name="$now" | ||||
|   if [[ "$SNAPSHOT_NAME" ]]; then | ||||
|     name="$name-$SNAPSHOT_NAME" | ||||
|   fi | ||||
|   btrfs subvolume snapshot -r "$SUBVOLUME" "$BACKUP_DIR/$name" | ||||
| 
 | ||||
|   # Clean up older snapshots | ||||
|   if [[ "$TOTAL_BACKUPS" -ne 0 ]]; then | ||||
|     for i in $(find "$BACKUP_DIR" -maxdepth 1 | sort | head -n -"${TOTAL_BACKUPS}"); do | ||||
|       btrfs subvolume delete "$i" | ||||
|     done | ||||
|   fi | ||||
| } | ||||
| 
 | ||||
| # Extract the last two arguments | ||||
| SUBVOLUME="$1" | ||||
| BACKUP_DIR="$2" | ||||
| shift | ||||
| shift | ||||
| 
 | ||||
| if [[ -z "$SUBVOLUME" || -z "$BACKUP_DIR" ]]; then | ||||
|   echo "Error: Both subvolume and backup_dir must be provided." | ||||
|   usage | ||||
|   exit 1 | ||||
| fi | ||||
| 
 | ||||
| if [[ ! -d "$SUBVOLUME" ]]; then | ||||
|   echo "Error: Specified subvolume path isn't a valid directory." | ||||
|   exit 1 | ||||
| fi | ||||
| 
 | ||||
| if [[ ! -d "$BACKUP_DIR" ]]; then | ||||
|   echo "Error: Specified backup directory path isn't a valid directory." | ||||
|   exit 1 | ||||
| fi | ||||
| 
 | ||||
| TOTAL_BACKUPS=0 | ||||
| SNAPSHOT_NAME="" | ||||
| 
 | ||||
| while [[ "$1" ]]; do | ||||
|   case "$1" in | ||||
|   -h | --help) | ||||
|     usage | ||||
|     exit 0 | ||||
|     ;; | ||||
|   -t | --total) | ||||
|     shift | ||||
|     TOTAL_BACKUPS="$1" | ||||
|     shift | ||||
|     ;; | ||||
|   -n | --name) | ||||
|     shift | ||||
|     SNAPSHOT_NAME="$1" | ||||
|     shift | ||||
|     ;; | ||||
|   *) | ||||
|     echo "Error: Unknown argument: $1" | ||||
|     usage | ||||
|     exit 1 | ||||
|     ;; | ||||
|   esac | ||||
| done | ||||
| 
 | ||||
| backup | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue