--- title: Backing up and restoring whole block devices date: 2015-02-14 08:30:51 tags: [raspberry pi, hardware] --- SD cards are not really a reliable storage, especially when used constantly e.g. while sitting in always powered-on Raspberry Pi. Because of that I've recently needed to perform lots of backup/restore operations ;) I wrote this script for backing up: ``` #!/bin/bash if [[ -z $1 ]]; then echo "usage: $0 device_to_clone" exit fi device=$1 timestamp=`date +%Y%m%d` dest_file="/tmp/$timestamp.dd.xz" echo "about to clone $device to $dest_file" echo "ctrl-c or [enter]" read sudo umount $device? sudo umount $device sudo sync sudo pv -tpreb $device | dd bs=4M | pixz > $dest_file sudo sync ``` And this one for restoring: ``` #!/bin/bash if [[ -z $1 ]] || [[ -z $2 ]]; then echo "usage: $0 restore_file.xz device_to_restore_to" exit fi source_file=$1 if [[ ! -f $source_file ]]; then echo "cannot open $source_file" exit fi device=$2 echo "about to restore $source_file onto $device" echo "ctrl-c or [enter]" read sudo umount $device? sudo umount $device pv -tpreb $source_file | pixz -d | sudo dd bs=4M of=$device sudo sync sudo eject $device ``` Some of the more fun features include progressbars and making sure you've unmounted the device properly before ;) This also uses parallel threads to deflate the data, so the XZ compression should not be a bottleneck on any modern machine. The scripts above were used to backup and restore SD cards but will work for any block device, be it an external or internal disk drive, etc. usage example [remember to use the whole device, not just its partition as an argument]: ``` ./backup_sdcard /dev/sdc about to clone /dev/sdc to /tmp/20150214.dd.xz ctrl-c or [enter] [sudo] password for cyryl: umount: /dev/sdc1: not mounted umount: /dev/sdc2: not mounted umount: /dev/sdc: not mounted 19,6MiB 0:00:02 [9,72MiB/s] [> ] 0% ETA 0:52:26 ```