查看: 5856|回复: 0

系统备份脚本---抛砖引玉,欢迎大家一起完善

[复制链接]

6

主题

23

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2015-12-5 11:34:57 | 显示全部楼层 |阅读模式
     这是本人学习shell编程的第一个小作品,制作的初衷:苦于每次备份系统都得整卡备份,备份和恢复都需要不少时间,而且备份出来的镜像不一定能刷到其他卡上,如16G卡备份无法刷到8G,甚至4G的卡上,于是就有此想法。
   由于新手,代码可能不严谨,效率也不高,这里权当抛砖引玉,希望各编程高手优化它,使它成为香橙派的一个工具。虽然不能像大神那样制作镜像,但也能让大家做出好用的镜像然后备份共享出来。
   原则上不是loboris的镜像,可以把u-boot_OPI.fex和boot0_OPI.fex两个文件拷入/boot下,把fs_resize(主要是用于扩展空间)放入/usr/local/bin加权限后,也可以使用脚本备份。
使用中有什么问题,可以联系我QQ147579532


  1. #!/bin/sh
  2. _DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) > /dev/null 2>&1
  3. cd $_DIR

  4. image_name=Orangepi_backup.img

  5. p2_used=`df -h -m | sed -n '/mmcblk0p2/p' | awk '{print $3}' `

  6. image_size=$(expr $p2_used + 450)
  7. disk_used=$(expr $p2_used + 64)
  8. loopdevice=/dev/loop9
  9. mount_path=/media/Obackup
  10. back_path=$_DIR/$image_name

  11. if [ ! -f /boot/boot0_OPI.fex ]; then
  12.     echo "Error: boot0_OPI.fex not found."
  13.     exit 1
  14. fi

  15. if [ ! -f /boot/u-boot_OPI.fex ]; then
  16.     echo "Error: u-boot_OPI.fex not found."
  17.     exit 1
  18. fi

  19. sudo mkdir -p $mount_path

  20. echo ""
  21. echo "Intalling software ..."
  22. sudo apt-get -y -q install dosfstools dump kpartx parted > /dev/null 2>&1

  23. echo ""
  24. echo -e "The system has already used ($disk_used)MB.\nWe are going to create ($image_size)MB blank image for backup ..."

  25. sudo dd if=/dev/zero of=$image_name bs=1MB count=$image_size > /dev/null 2>&1
  26. losetup $loopdevice $image_name  > /dev/null 2>&1

  27. echo ""
  28. echo "Fdisking image  ..."
  29. echo -e "o\nw" | fdisk ${loopdevice} > /dev/null 2>&1

  30. sudo parted ${loopdevice}  --script -- mklabel msdos
  31. sudo parted ${loopdevice}  --script -- mkpart primary fat32 40960s 172031s
  32. sudo parted ${loopdevice}  --script -- mkpart primary ext4 172032s -1
  33. partprobe -s ${loopdevice} > /dev/null 2>&1

  34. sleep 1

  35. sudo losetup -d ${loopdevice}
  36. losetup ${loopdevice} $image_name > /dev/null 2>&1

  37. device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -n 1` > /dev/null 2>&1
  38. device="/dev/mapper/${device}"
  39. partBoot="${device}p1"
  40. partRoot="${device}p2"

  41. sleep 3
  42. echo ""
  43. echo "Formating fat partition ..."
  44. mkfs.vfat -n BOOT ${partBoot} > /dev/null 2>&1
  45. echo "fat partition formated."

  46. sleep 1

  47. echo ""
  48. echo "Formating linux partition (ext4), please wait ..."
  49. mkfs.ext4 -L linux ${partRoot} > /dev/null 2>&1
  50. if [ $? -ne 0 ]; then
  51.    echo "ERROR formating ext4 partition."
  52.    sudo kpartx -d ${loopdevice}
  53.    sudo losetup -d ${loopdevice}
  54.    exit 1
  55. fi
  56. echo "linux partition formated."

  57. echo ""
  58. echo "Instaling u-boot to Image ..."
  59. dd if=/boot/boot0_OPI.fex of=${loopdevice} bs=1k seek=8 > /dev/null 2>&1
  60. if [ $? -ne 0 ]; then
  61.     echo "ERROR installing boot0."
  62.     sudo kpartx -d ${loopdevice}
  63.     sudo losetup -d ${loopdevice}
  64.     exit 1
  65. fi

  66. dd if=/boot/u-boot_OPI.fex of=${loopdevice} bs=1k seek=16400 > /dev/null 2>&1
  67. if [ $? -ne 0 ]; then
  68.    echo "ERROR installing u-boot."
  69.    sudo kpartx -d ${loopdevice}
  70.    sudo losetup -d ${loopdevice}
  71.    exit 0

  72. fi

  73. echo "Backuping system file to image ..."
  74. sudo mount $partBoot $mount_path/
  75. sudo cp -rfp /media/boot/* $mount_path
  76. sleep 1
  77. sudo umount $mount_path

  78. sudo mount -t ext4 $partRoot $mount_path/
  79. cd $mount_path
  80. sudo dump -0uaf - / | sudo restore -rf -
  81. if [ $? -ne 0 ]; then
  82.     echo "  ERROR backuping system file."
  83.     sudo umount $mount_path/
  84.     sudo kpartx -d ${loopdevice}
  85.     sudo losetup -d ${loopdevice}
  86.     exit 1
  87. fi

  88. sleep 1

  89. cat > $mount_path/usr/local/bin/fs_resize_warning << _EOF_
  90. #!/bin/sh
  91. echo -e "\033[31m\033[1m****************************************"
  92. echo -e "WARNING: TO RESIZE FILESYSTEM RUN:"
  93. echo -e "sudo fs_resize"
  94. echo -e "to remove this message run:"
  95. echo -e "sudo rm /usr/local/bin/fs_resize_warning"
  96. echo -e "*******************************************************\033[22m\033[37m"
  97. setterm -default
  98. _EOF_

  99. cd
  100. sudo umount $mount_path/
  101. sudo rm -r /media/$mount_path > /dev/null 2>&1
  102. sudo kpartx -d ${loopdevice}
  103. sudo losetup -d ${loopdevice}

  104. echo "Backup complete! image path: $back_path"
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表