5使用Git和SD卡副本备份代码

在本章中,您将学习到以下内容:

  • 代码是如何破坏或丢失的
  • 策略 1 – 将代码保存在电脑上并上传
  • 策略 2:使用 Git 回溯历史
  • 策略 3 – 制作 SD 卡备份

5.1 代码是如何破坏或丢失的

代码和它的近亲–配置,都需要时间和艰苦的努力。代码需要配置才能运行,例如 Raspberry Pi 操作系统配置、额外软件和必要的数据文件。两者都需要研究和学习,需要设计、制作、测试和调试。

很多糟糕的情况会导致代码丢失。我在经过数周的工作后,在带机器人去参加展会的前一周就遇到过这种情况。那么,您的代码会发生什么情况呢?

5.1.1 SD 卡数据丢失和损坏

SD 卡损坏是指 SD 卡中用来保存代码、Raspberry Pi 操作系统和任何你准备好的东西的数据被破坏。文件无法读取,或者卡无法使用。SD 卡上的信息可能会永久丢失。

如果 Raspberry Pi 意外断电,SD 卡可能会损坏,导致数据丢失。发热的 Pi 会慢慢烘烤 SD卡,损坏它。Pi 上的视觉处理就容易发热。如果Pi通过GPIO引脚或电源发生严重的电气故障,SD 卡也会受损。

5.1.2代码或配置更改

编码意味着尝试。有些会成功,有些则会失败。在这种情况下,你会想回头看看你都改了些什么。

错误的配置也会让机器人失去作用,比如 Pi 无法联网或启动。系统软件包升级可能会出错,导致代码无法工作,或者需要对代码进行大量修改才能重新工作。

这些问题结合在一起可能会造成真正的噩梦。我曾见过代码的修改导致机器人行为失常,并以损坏 SD 卡的方式损坏自身。在一次重要的机器人活动前两周,我一直在更新操作系统的软件包,结果把电源线弄断了,导致 SD 卡损坏,Raspberry Pi 操作系统也随之损坏,重建操作系统的过程非常痛苦。这是一次惨痛的教训。

5.2 策略 1 – 将代码保存在电脑上并上传

通过安全文件传输协议(SFTP),您可以将文件从电脑传输到 Pi。这种策略可以让你在电脑上编写代码,然后上传到 Raspberry Pi。您可以选择自己的编辑器,并安全地拥有多个副本。
编辑代码需要专门设计的软件。针对Python推荐使用Mu、Microsoft VS Code、WingIDE、Geany、Notepad++ 和 PyCharm。

SFTP 使用 SSH 通过网络在 Raspberry Pi 上复制文件。让我们来看看如何操作:

  • 首先,在 PC 上创建一个文件夹,用于存储机器人代码;例如,my_robot_project。

  • 在该文件夹中,用编辑器制作一个测试文件,只需打印一段文字即可。将这段代码放入名为 hello.py 的文件中:

print("Raspberry Pi is alive")
  • 我们将把它复制到机器人上并运行。您可以使用 https://filezilla-project.org 上的 SFTP 工具 FileZilla 进行复制。下载并按照安装说明操作:

  • 插入Raspberry Pi并启动电源。你会发现在右侧面板底部,FileZilla显示”未连接”。
  • 在”Host”框中,键入您在无头设置中为机器人Pi提供的本地主机名,前缀为ftp://;例如,sftp://myrobot.local。
  • 在用户名框中输入pi,在密码框中输入之前设置的密码。
  • 单击 Quickconnect 按钮连接Raspberry Pi。
  • 连接完成后,你会在右侧的远程站点面板中看Raspberry Pi的文件,如图 5.2 所示:

  • 使用左侧的本地站点面板进入你电脑上的代码。

  • 现在单击图左上方突出显示的 hello.py,并将其拖动到右下角面板,将其放到Raspberry Pi上:

  • 你拖动文件时,你会在”已排队文件”部分看到它。由于文件较小,它只会在队列状态中停留一瞬间。你也可以对整个文件夹使用同样的系统。你很快就能在远程站点(Raspberry Pi)看到文件,如图右侧面板所示。

  • 要运行这段代码,请使用 PuTTY 登录 Pi 并尝试执行以下命令:

$ python3 hello.pyRaspberry Pi is alive

这一策略是让代码更安全的良好开端。通过在笔记本电脑/PC 上工作并复制到Pi上,你可以保证除了机器人上的那个副本外,总有一个副本。你还可以在电脑上使用任何你喜欢的代码编辑器,并在错误传到树莓派之前就发现它们。

5.2 策略2:使用Git回溯历史

Git是一种流行的源代码控制形式,是记录代码修改历史的一种方式。你可以回溯修改,查看修改内容,还原旧版本,并在注释日志中记录修改原因。Git 能将代码存储在多个位置,以防硬盘出现故障。Git将代码及其历史存储在仓库(或称 repos)中。在Git中,你可以创建分支,即整套代码的副本,与你的代码并行尝试各种想法,之后再将这些想法合并回主分支。

我将带你开始使用Git,但这部分内容只能让你了解Git的一些皮毛。让我们开始吧:

如果你使用的是Windows或macOS,我建议你使用GitHub应用程序,这样设置会更简单。

  • Git要求你在电脑上使用命令行设置身份:
> git config --global user.name ""> git config --global user.email 
  • 要将这个项目置于源代码控制之下,我们需要初始化它并提交第一段代码。请确保您已进入代码文件夹(my_robot_project),然后在计算机命令行中键入以下内容:
> git init .Initialized empty Git repository in C:/Users/danny/workspace/my_robot_project/.git/> git add hello.py> git commit -m "Adding the starter code"[master (root-commit) 11cc8dc] Adding the starter code1 file changed, 1 insertion(+)create mode 100644 hello.py

“git init .”命令Git将文件夹创建为Git仓库。”git add”将hello.py文件保存在仓库。

  • 现在我们可以用”git log”查看日志了:
> git logcommit 11cc8dc0b880b1dd8302ddda8adf63591bf340fe (HEAD ->master)Author: Your Name Date: Adding the starter code
  • 现在修改 hello.py 中的代码,将其改成这样:
import socketprint('%s is alive!' % socket.gethostname())

让我们看看这段代码与之前有什么不同:

> git diff hello.pydiff --git a/hello.py b/hello.pyindex 3eab0d8..fa3db7c 100644--- a/hello.py+++ b/hello.py@@ -1 +1,2 @@-print("Raspberry Pi is alive")+import socket+print('%s is alive!' % socket.gethostname())

以上是Git显示差异的方式。Git将这些改动理解为去掉了打印行,取而代之的是导入和打印行。我们可以把它添加到Git中,生成一个新版本,然后再用 git log查看两个版本:

> git add hello.py> git commit -m "Show the robot hostname"[master 912f4de] Show the robot hostname1 file changed, 2 insertions(+), 1 deletion(-)> git logcommit 912f4de3fa866ecc9d2141e855333514d9468151 (HEAD ->master)Author: Your Name Date: Show the robot hostnamecommit 11cc8dc0b880b1dd8302ddda8adf63591bf340fe (HEAD ->master)Author: Your Name Date: Adding the starter code

这样你就可以回溯到以前的版本,或只是比较版本,并保护自己免受可能会让你后悔的改动。

现在,我们可以回溯和向前(至少对我们的代码而言),我们可以更自信地进行修改。只要记住频繁提交–尤其是在完成某些工作之后!

5.3 策略3-制作 SD 卡备份

开始之前,请正确关闭 Raspberry Pi,取出 SD 卡并将其放入电脑。这些干净的镜像文件很大,所以不要把它们放到 Git 仓库中。在任何情况下,根据镜像文件的大小不同,这项操作都需要 20-30 分钟。

5.3.1 Windows

Windows上将使用Win32DiskImager。因此,我们的第一步就是安装和设置它。继续:

从https://sourceforge.net/projects/win32diskimager获取安装程序。

在”文件名”方框中将图像命名为myrobot.img。然后单击”打开”按钮确认:

单击”读取”按钮开始复制图像。在读取图像的过程中,你会看到一个进度条和剩余时间估算。图像复制完成后,Win32 Disk Imager会告诉你读取成功,然后你就可以退出软件了:

参考资料

  • 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
  • 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
  • python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
  • Raspberry Pi(树莓派4B)4轻松入门(上)-安装 https://www.cnblogs.com/testing-/p/17604049.html
  • Raspberry Pi 基金会安装 Raspberry Pi 操作系统指南:https://www.raspberrypi.org/documentation/installation/installing-images/README.md。
  • 《Raspberry Pi By Example》,Ashwin Pajankar和Arush Kakkar,Packt Publishing,其中有一节介绍Raspberry Pi的替代操作系统,以及许多令人兴奋的 Raspberry Pi项目。
  • Raspberry Pi GPIO 引脚输出 (https://pinout.xyz/): 它介绍了不同电路板与Raspberry Pi的实际引脚连接方式。
  • GitHub 上的《Git 手册》:https://guides.github.com/introduction/git-handbook/。该文档全面介绍了 Git 是什么、它能解决什么问题,以及使用其功能的起点。
  • 手把手教你使用 Git 进行版本控制:https://www.packtpub.com/application-development/hands-version-control-git-video。这是一个关于如何使用Git的视频教程。
  • GitHub 指南:https://guides.github.com/。一系列关于如何充分利用Git和GitHub的指南。
  • GitLab基础:https://docs.gitlab.com/ee/gitlab-basics/。GitLab是GitHub的绝佳替代品,拥有庞大的社区和一些出色的Git使用指南。

5.3.2 Mac

MacOS有一种制作SD卡和磁盘镜像的内置方法。这就是使用内置的磁盘工具。让我们来看看它是如何工作的:

单击 “查看 “菜单:

现在点击显示所有设备选项。选择包含启动卷的设备:

在菜单栏中,选择文件 | 新映像:

在此菜单下,选择 “从 映像”:

磁盘工具将显示一个对话框。设置文件名和位置,并格式化为 DVD/CD 母盘:

磁盘工具为这些文件提供 .cdr 扩展名:

将其重命名为 .iso:

您需要确认是否需要这样做:

现在,你可以在 macOS 上创建SD镜像文件,以便与balenaEtcher 一起使用。

5.3.3 Linux

在Linux下,备份SD卡可以通过命令行dd命令完成。在了解如何操作之前,我们首先需要找到设备的位置。让我们开始吧:

插入卡并键入以下命令查找设备的位置:

$ dmesg

该命令将输出很多内容,但您只对接近末尾的一行感兴趣,该行内容如下:

sd 3:0:0:0: [sdb] Attached SCSI removable disk

卡在方括号[sdb]中,在你的电脑上可能有所不同。SD卡的位置将是/dev/,例如/dev/sdb。

请注意正确的位置,因为您可能会破坏SD卡或计算机硬盘中的内容。如果不确定,请勿使用此方法。

确定SD卡位置(如 /dev/sdb 或 /dev/disk1)后,就可以使用 dd 命令启动克隆。该命令可将数据转入或转出驱动器:

$ sudo dd if=/dev/sdb of=~/myrobot.img bs=32MPassword:474+2 records in474+2 records out15931539456 bytes (16 GB, 15 GiB) copied, 4132.13 s, 3.9MB/s

if参数为输入文件,本例中为SD卡。of参数是输出文件,即克隆卡中的myrobot.img文件。

bs参数是区块大小,因此将其设置为32M,会使操作更快。

你需要输入用户密码才能启动。dd命令会将myrobot.img文件创建为主目录下整个SD卡的克隆文件。dd在完成之前不会有任何输出,然后会显示有关操作的统计信息。

钉钉或微信号: pythontesting 微信公众号:pythontesting