backup.sh 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/bin/sh
  2. targetnode="/dev/disk/by-uuid/MY-UUID"
  3. targetmp="/mnt/backup/target"
  4. targetsub="datensicherung"
  5. sourcepath="/mnt/backup/snapshots/root"
  6. btrfs=1
  7. die()
  8. {
  9. local msg1="$1"
  10. local msg2="$2"
  11. if [ -n "$msg1" ]; then
  12. echo "$msg1" >&2
  13. fi
  14. echo >&2
  15. echo >&2
  16. echo >&2
  17. echo >&2
  18. echo "### FEHLER! FEHLER! FEHLER! ###" >&2
  19. echo "###" >&2
  20. if [ -n "$msg2" ]; then
  21. echo "### $msg2" >&2
  22. else
  23. echo "### Die Datensicherung wurde abgebrochen und ist unvollständig!" >&2
  24. fi
  25. echo "###" >&2
  26. echo "### FEHLER! FEHLER! FEHLER! ###" >&2
  27. echo >&2
  28. read -p "" x
  29. exit 1
  30. }
  31. # Become root.
  32. mypath="$(realpath -e "$0")"
  33. if [ "$(id -u)" != "0" ]; then
  34. if [ "$1" = "SECOND_STAGE" ]; then
  35. die "Second stage failed."
  36. else
  37. exec sudo "$mypath" SECOND_STAGE
  38. exit 1
  39. fi
  40. fi
  41. # Setup cleanup handler.
  42. cleanup()
  43. {
  44. umount -f "$targetmp" >/dev/null 2>&1
  45. if [ $btrfs -ne 0 ]; then
  46. btrfs subvolume delete "$sourcepath" >/dev/null 2>&1
  47. fi
  48. }
  49. trap cleanup EXIT
  50. # Create the snapshot
  51. if [ $btrfs -ne 0 ]; then
  52. btrfs subvolume delete "$sourcepath" >/dev/null 2>&1
  53. btrfs subvolume snapshot -r / "$sourcepath" ||\
  54. die "btrfs snapshot failed"
  55. fi
  56. # Mount the backup drive.
  57. mkdir -p "$targetmp" || die "mkdir target failed."
  58. if ! [ -b "$targetnode" ]; then
  59. die "dev node not present" "The Backup-Festplatte ist nicht angeschlossen!"
  60. fi
  61. umount -f "$targetnode" >/dev/null 2>&1
  62. umount -f "$targetmp" >/dev/null 2>&1
  63. mount "$targetnode" "$targetmp" || die "target mount failed"
  64. # Sync the backup drive with the source drive.
  65. mkdir -p "$targetmp/$targetsub" || die
  66. while true; do
  67. rsync -aHAX --inplace --delete-before --progress \
  68. "$sourcepath"/ \
  69. "$targetmp/$targetsub"
  70. res=$?
  71. [ $res -eq 24 ] && continue
  72. [ $res -ne 0 ] && die
  73. break
  74. done
  75. if [ $btrfs -ne 0 ]; then
  76. while true; do
  77. rsync -aHAX --inplace --delete-before --progress \
  78. /boot/ \
  79. "$targetmp/$targetsub"_boot
  80. res=$?
  81. [ $res -eq 24 ] && continue
  82. [ $res -ne 0 ] && die
  83. break
  84. done
  85. fi
  86. umount "$targetmp" || die "umount failed"
  87. if [ $btrfs -ne 0 ]; then
  88. btrfs subvolume delete "$sourcepath" ||\
  89. die "btrfs snapshot delete failed"
  90. fi
  91. echo
  92. echo
  93. echo
  94. echo "########################################################"
  95. echo "### Alles Ok! ###"
  96. echo "### Die Festplatte kann jetzt abgesteckt werden. ###"
  97. echo "########################################################"
  98. read -p "" x