I have a Raspberry Pi providing household automation and productivity services – WebDav, Backups and Calendar. I always worry about a jolt of power, a failed byte and something that is unrecoverable. Time for a Backup solution.
I plugged in a USB stick – 64GB, and immediately checked the file system is there and visible as SDA (unmounted).
pi@raspberrypi:~# sudo su - root@raspberrypi:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 58.2G 1 disk └─sda1 8:1 1 58.2G 1 part mmcblk0 179:0 0 14.9G 0 disk ├─mmcblk0p1 179:1 0 43.9M 0 part /boot └─mmcblk0p2 179:2 0 14.8G 0 part /
I check to see which one is assigned to the SD card slot (mmc), I really don’t want to reformat Raspbian. I see the USB stick is on /dev/sda. All of my subsequent commands use /dev/sda as part of the command.
root@raspberrypi:~# parted -ls Warning: The driver descriptor says the physical block size is 2048 bytes, but Linux says it is 512 bytes. Model: JetFlash Transcend 64GB (scsi) Disk /dev/sda: 62.5GB Sector size (logical/physical): 512B/512B Partition Table: unknown Disk Flags: Model: SD SC16G (sd/mmc) Disk /dev/mmcblk0: 15.9GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 4194kB 50.2MB 46.0MB primary fat32 lba 2 50.3MB 15.9GB 15.9GB primary ext4
If you don’t see the relevant information on your HD or run into issues formatting the hard-drive, install hdparm. and check with hdparm -r0 /dev/sda .
TIP: I did run into an issue with an ISO written to a USB drive which locks the partition table and makes it unwriteable.
root@raspberrypi:~# apt-get install hdparm Reading package lists… Done Building dependency tree Reading state information… Done The following package was automatically installed and is no longer required: realpath Use 'apt autoremove' to remove it. The following additional packages will be installed: powermgmt-base Suggested packages: apmd The following NEW packages will be installed: hdparm powermgmt-base 0 upgraded, 2 newly installed, 0 to remove and 148 not upgraded. Need to get 114 kB of archives. After this operation, 278 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://raspbian.mirror.constant.com/raspbian stretch/main armhf hdparm armhf 9.51+ds-1+deb9u1 [105 kB] Get:2 http://raspbian-us.ngc292.space/raspbian stretch/main armhf powermgmt-base all 1.31+nmu1 [9,240 B] Fetched 114 kB in 0s (120 kB/s) Selecting previously unselected package hdparm. (Reading database … 135688 files and directories currently installed.) Preparing to unpack …/hdparm_9.51+ds-1+deb9u1_armhf.deb … Unpacking hdparm (9.51+ds-1+deb9u1) … Selecting previously unselected package powermgmt-base. Preparing to unpack …/powermgmt-base_1.31+nmu1_all.deb … Unpacking powermgmt-base (1.31+nmu1) … Setting up powermgmt-base (1.31+nmu1) … Setting up hdparm (9.51+ds-1+deb9u1) … Processing triggers for man-db (2.7.6.1-2) … Preparing to unpack …/hdparm_9.51+ds-1+deb9u1_armhf.deb … Unpacking hdparm (9.51+ds-1+deb9u1) … Selecting previously unselected package powermgmt-base. Preparing to unpack …/powermgmt-base_1.31+nmu1_all.deb … Unpacking powermgmt-base (1.31+nmu1) … Setting up powermgmt-base (1.31+nmu1) … Setting up hdparm (9.51+ds-1+deb9u1) … Processing triggers for man-db (2.7.6.1-2) …
root@raspberrypi:~# hdparm -r0 /dev/sda /dev/sda: setting readonly to 0 (off) readonly = 0 (off)
Now that I know the drive is writeable, I need to create the partition. I used
cfdisk
Navigate through the menu and select the maximum size
Disk: /dev/sda
Size: 58.2 GiB, 62495129600 bytes, 122060800 sectors
Label: dos, identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
>> /dev/sda1 2048 122060799 122058752 58.2G 83 Linux
Once you see “Syncing disks.”, you can format the disk. I formatted the partition sda1 with ext4 (I may want to encrypt in the future). Unmount and then format.
root@raspberrypi:~# umount /dev/sda1
root@raspberrypi:~# mkfs.ext4 /dev/sda1
mke2fs 1.43.4 (31-Jan-2017)
Found a dos partition table in /dev/sda1
Proceed anyway? (y,N) y
Creating filesystem with 2828032 4k blocks and 707136 inodes
Filesystem UUID: 363f1b4a-b0f5-4c7b-bf91-66f3823032d6
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@raspberrypi:~#
Make the backup directory, edit fstab and mount the directory. Insert into fstab with your uuid “UUID=363f1b4a-b0f5-4c7b-bf91-66f3823032d6 /backups auto nosuid,nodev,nofail 0 0
” The second to last avoids backup and the last one enables fsck on reboot.
root@raspberrypi:~# blkid
/dev/mmcblk0p1: LABEL="boot" UUID="DDAB-3A15" TYPE="vfat" PARTUUID="b53687e8-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="5fa1ec37-3719-4b25-be14-1f7d29135a13" TYPE="ext4" PARTUUID="b53687e8-02"
/dev/mmcblk0: PTUUID="b53687e8" PTTYPE="dos"
/dev/sdb: UUID="363f1b4a-b0f5-4c7b-bf91-66f3823032d6" TYPE="ext4"
root@raspberrypi:~# mkdir /backups
root@raspberrypi:~# vim /etc/fstab
root@raspberrypi:~# mount -a
root@raspberrypi:~# mount
UUID=363f1b4a-b0f5-4c7b-bf91-66f3823032d6 /backups auto nosuid,nodev,nofail 0 0
You should see backups listed. (Note: I bricked my Raspberry Pi with a bad FSTAB entry, and mounted it on my Mac using Paragon and removed the bad fstab entry. )
Update Crontab with daily backups.
crontab -e
Setup an editor for crontab.
root@raspberrypi:~# crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]: 3
crontab: installing new crontab
I added this line and copied it to /etc/cron.daily/
0 1 * * * /usr/bin/rsync -r /data/ /backups/`date +%w-%A`
crontab -l > pi-backup
mv /root/pi-backup /etc/cron.daily
run-parts /etc/cron.daily
Note, I had to add #!/bin/bash after I copied and remove the timing of the job.
Also, check to see if rsync is installed with which rsync and apt-get install rsync.
This enables backups on a daily basis rotating every 7 days.
Check back on the following day to see your backups
root@raspberrypi:~# /usr/bin/rsync -r /data/ /backups/`date +%w-%A`
root@raspberrypi:~# find /backups
/backups
/backups/lost+found
/backups/0-Sunday
/backups/0-Sunday/startup.sh
Good luck, I hope this helps you with your Raspberry Pi.
References
- HDParam https://askubuntu.com/a/138051
- Formatting in Debian https://www.thomas-krenn.com/en/wiki/Hard_Disk_Formatting/Partitioning_and_Mounting_in_Debian_Linux
- Rsync http://www.mikerubel.org/computers/rsync_snapshots/
- Fstab https://wiki.debian.org/fstab
- Rsync Trick https://stackoverflow.com/questions/29784625/how-do-i-rotate-daily-backups-using-rsync
- (If you run into cron issues) https://askubuntu.com/questions/216692/where-is-the-user-crontab-stored
- CronTab Test https://superuser.com/questions/402781/what-is-run-parts-in-etc-crontab-and-how-do-i-use-it