旅行时,如何通过树莓派和iPad Pro备份图片

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

介绍

我在很长的时间内一直在寻找一个旅行中备份图片的理想方法,把 SD 卡放进你的相机包会让你暴露在太多的风险之中:SD 卡可能丢失或者被盗,数据可能损坏或者在传输过程中失败。比较好的一个选择是复制到另外一个介质中,即使它也是个 SD 卡,并且将它放到一个比较安全的地方去,备份到远端也是一个可行的办法,但是如果去了一个没有网络的地方就不太可行了。

我理想的备份步骤需要下面的工具:

  1. 用一台 iPad pro 而不是一台笔记本。我喜欢轻装旅行,我的大部分旅程都是商务相关的(而不是拍摄休闲的),我痛恨带着个人笔记本的时候还得带着商务本。而我的 iPad 却一直带着,这就是我为什么选择它的原因。
  2. 用尽可能少的硬件设备。
  3. 设备之间的连接需要很安全。我需要在旅馆和机场使用这套设备,所以设备之间的连接需要是封闭而加密的。
  4. 整个过程应该是可靠稳定的,我还用过其他的路由器/组合设备,但是效果不太理想。

设备

我配置了一套满足上面条件并且在未来可以扩充的设备,它包含下面这些部件的使用:

  1. 9.7 英寸的 iPad Pro,这是本文写作时最强大、轻薄的 iOS 设备,苹果笔不是必需的,但是作为零件之一,当我在路上可以做一些编辑工作,所有的重活由树莓派做 ,其他设备只能通过 SSH 连接就行。
  2. 安装了 Raspbian 操作系统树莓派 3(LCTT 译注:Raspbian 是基于 Debian 的树莓派操作系统)。
  3. 树莓派的 Mini SD卡 和 盒子/外壳。
  4. 128G 的优盘,对于我是够用了,你可以买个更大的。你也可以买个像这样的移动硬盘,但是树莓派没法通过 USB 给移动硬盘提供足够的电量,这意味你需要额外准备一个供电的 USB hub 以及电缆,这就破坏了我们让设备轻薄的初衷。
  5. SD 读卡器
  6. 另外的 SD 卡,我会使用几个 SD 卡,在用满之前就会立即换一个,这样就会让我在一次旅途当中的照片散布在不同的 SD 卡上。

下图展示了这些设备之间如何相互连接。

 旅行时照片的备份-流程图

树莓派会作为一个安全的热点。它会创建一个自己的 WPA2 加密的 WIFI 网络,iPad Pro 会连入其中。虽然有很多在线教程教你如何创建 Ad Hoc 网络(计算机到计算机的单对单网络),还更简单一些,但是它的连接是不加密的,而且附件的设备很容易就能连接进去。因此我选择创建 WIFI 网络。

相机的 SD 卡通过 SD 读卡器插到树莓派 USB 端口之一,128G 的大容量优盘一直插在树莓派的另外一个 USB 端口上,我选择了一款闪迪的,因为体积比较小。主要的思路就是通过 Python 脚本把 SD 卡的照片备份到优盘上,备份过程是增量备份,每次脚本运行时都只有变化的(比如新拍摄的照片)部分会添加到备份文件夹中,所以这个过程特别快。如果你有很多的照片或者拍摄了很多 RAW 格式的照片,在就是个巨大的优势。iPad 将用来运行 Python 脚本,而且用来浏览 SD 卡和优盘的文件。

作为额外的好处,如果给树莓派连上一根能上网的网线(比如通过以太网口),那么它就可以共享互联网连接给那些通过 WIFI 连入的设备。

一、树莓派的设置

这部分需要你卷起袖子亲自动手了,我们要用到 Raspbian 的命令行模式,我会尽可能详细的介绍,方便大家进行下去。

安装和配置 Raspbian

给树莓派连接鼠标、键盘和 LCD 显示器,将 SD 卡插到树莓派上,按照树莓派官网的步骤安装 Raspbian。

安装完后,打开 Raspbian 的终端,执行下面的命令:


  
  
  1. sudo apt-get update 
  2. sudo apt-get upgrade 

这将升级机器上所有的软件到最新,我将树莓派连接到本地网络,而且为了安全更改了默认的密码。

Raspbian 默认开启了 SSH,这样所有的设置可以在一个远程的设备上完成。我也设置了 RSA 验证,但这是可选的功能,可以在这里查看更多信息。

这是一个在 Mac 上在 iTerm 里建立 SSH 连接到树莓派上的截图14。(LCTT 译注:原文图丢失。)

建立 WPA2 加密的 WIFI AP

安装过程基于这篇文章,根据我的情况进行了调整。

1. 安装软件包

我们需要安装下面的软件包:


  
  
  1. sudo apt-get install hostapd 
  2. sudo apt-get install dnsmasq 

hostapd 用来使用内置的 WiFi 来创建 AP,dnsmasp 是一个组合的 DHCP 和 DNS 服务其,很容易设置。

2. 编辑 dhcpcd.conf

通过以太网连接树莓派,树莓派上的网络接口配置由 dhcpd 控制,因此我们首先忽略这一点,将 wlan0 设置为一个静态的 IP。

用 sudo nano /etc/dhcpcd.conf 命令打开 dhcpcd 的配置文件,在最后一行添加上如下内容:


  
  
  1. denyinterfaces wlan0 

注意:它必须放在如果已经有的其它接口行之上。

3. 编辑接口

现在设置静态 IP,使用 sudo nano /etc/network/interfaces 打开接口配置文件,按照如下信息编辑wlan0部分:


  
  
  1. allow-hotplug wlan0 
  2. iface wlan0 inet static 
  3.     address 192.168.1.1 
  4.     netmask 255.255.255.0 
  5.     network 192.168.1.0 
  6.     broadcast 192.168.1.255 
  7. #    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf 

同样,然后 wlan1 编辑如下:


  
  
  1. #allow-hotplug wlan1 
  2. #iface wlan1 inet manual 
  3. #    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf 

重要: 使用 sudo service dhcpcd restart 命令重启 dhcpd服务,然后用 sudo ifdown eth0; sudo ifup wlan0 命令来重载wlan0的配置。

4. 配置 Hostapd

接下来,我们需要配置 hostapd,使用 sudo nano /etc/hostapd/hostapd.conf 命令创建一个新的配置文件,内容如下:


  
  
  1. interface=wlan0 
  2. # Use the nl80211 driver with the brcmfmac driver 
  3. driver=nl80211 
  4. # This is the name of the network 
  5. ssid=YOUR_NETWORK_NAME_HERE 
  6. # Use the 2.4GHz band 
  7. hw_mode=g 
  8. # Use channel 6 
  9. channel=6 
  10. # Enable 802.11n 
  11. ieee80211n=1 
  12. # Enable QoS Support 
  13. wmm_enabled=1 
  14. # Enable 40MHz channels with 20ns guard interval 
  15. ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40] 
  16. # Accept all MAC addresses 
  17. macaddr_acl=0 
  18. # Use WPA authentication 
  19. auth_algs=1 
  20. # Require clients to know the network name 
  21. ignore_broadcast_ssid=0 
  22. # Use WPA2 
  23. wpa=2 
  24. # Use a pre-shared key 
  25. wpa_key_mgmt=WPA-PSK 
  26. # The network passphrase 
  27. wpa_passphrase=YOUR_NEW_WIFI_PASSWORD_HERE 
  28. # Use AES, instead of TKIP 
  29. rsn_pairwise=CCMP 

配置完成后,我们需要告诉dhcpcd 在系统启动运行时到哪里寻找配置文件。 使用 sudo nano /etc/default/hostapd 命令打开默认配置文件,然后找到#DAEMON_CONF="" 替换成DAEMON_CONF="/etc/hostapd/hostapd.conf"。

5. 配置 Dnsmasq

自带的 dnsmasp 配置文件包含很多信息方便你使用它,但是我们不需要那么多选项,我建议把它移动到别的地方(而不要删除它),然后自己创建一个新文件:


  
  
  1. sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig   
  2. sudo nano /etc/dnsmasq.conf   

粘贴下面的信息到新文件中:


  
  
  1. interface=wlan0      # Use interface wlan0 
  2. listen-address=192.168.1.1 # Explicitly specify the address to listen on 
  3. bind-interfaces      # Bind to the interface to make sure we aren't sending things elsewhere 
  4. server=8.8.8.8       # Forward DNS requests to Google DNS 
  5. domain-needed        # Don't forward short names 
  6. bogus-priv           # Never forward addresses in the non-routed address spaces. 
  7. dhcp-range=192.168.1.50,192.168.1.100,12h # Assign IP addresses in that range  with a 12 hour lease time 

6. 设置 IPv4 转发

最后我们需要做的事就是配置包转发,用 sudo nano /etc/sysctl.conf 命令打开 sysctl.conf 文件,将包含 net.ipv4.ip_forward=1的那一行之前的#号删除,它将在下次重启时生效。

我们还需要给连接到树莓派的设备通过 WIFI 分享互联网连接,做一个 wlan0和 eth0 之间的 NAT。我们可以参照下面的脚本来实现。


  
  
  1. sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE   
  2. sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT   
  3. sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT   

我命名这个脚本名为 hotspot-boot.sh,然后让它可以执行:


  
  
  1. sudo chmod 755 hotspot-boot.sh 

该脚本应该在树莓派启动的时候运行。有很多方法实现,下面是我实现的方式:

  1. 把文件放到/home/pi/scripts目录下。
  2. 输入sudo nano /etc/rc.local命令编辑 rc.local 文件,将运行该脚本的命令放到 exit 0之前。(更多信息参照这里)。

编辑后rc.local看起来像这样:


  
  
  1. #!/bin/sh -e 
  2. # rc.local 
  3. # This script is executed at the end of each multiuser runlevel. 
  4. # Make sure that the script will "exit 0" on success or any other 
  5. # value on error. 
  6. In order to enable or disable this script just change the execution 
  7. # bits. 
  8. By default this script does nothing. 
  9. # Print the IP address 
  10. _IP=$(hostname -I) || true 
  11. if [ "$_IP" ]; then 
  12.   printf "My IP address is %s\n" "$_IP" 
  13. fi 
  14. sudo /home/pi/scripts/hotspot-boot.sh & 
  15. exit 0 

安装 Samba 服务和 NTFS 兼容驱动

我们要安装下面几个软件来启用 samba 协议,使文件浏览器能够访问树莓派分享的文件夹,ntfs-3g 可以使我们能够访问移动硬盘中 ntfs 文件系统的文件。


  
  
  1. sudo apt-get install ntfs-3g 
  2. sudo apt-get install samba samba-common-bin 

你可以参照这些文档来配置 Samba。

重要提示:参考的文档介绍的是挂载外置硬盘到树莓派上,我们不这样做,是因为在这篇文章写作的时候,树莓派在启动时的 auto-mounts 功能同时将 SD 卡和优盘挂载到/media/pi/上,该文章有一些多余的功能我们也不会采用。

二、 Python 脚本

树莓派配置好后,我们需要开发脚本来实际拷贝和备份照片。注意,这个脚本只是提供了特定的自动化备份进程,如果你有基本的 Linux/树莓派命令行操作的技能,你可以 ssh 进树莓派,然后创建需要的文件夹,使用cp或rsync命令拷贝你自己的照片从一个设备到另外一个设备上。在脚本里我们用rsync命令,这个命令比较可靠而且支持增量备份。

这个过程依赖两个文件,脚本文件自身和backup_photos.conf这个配置文件,后者只有几行包含被挂载的目的驱动器(优盘)和应该挂载到哪个目录,它看起来是这样的:


  
  
  1. mount folder=/media/pi/ 
  2. destination folder=PDRIVE128GB 

重要提示:在这个符号=前后不要添加多余的空格,否则脚本会失效。

下面是这个 Python 脚本,我把它命名为backup_photos.py,把它放到了/home/pi/scripts/目录下,我在每行都做了注释可以方便的查看各行的功能。


  
  
  1. #!/usr/bin/python3 
  2. import os 
  3. import sys 
  4. from sh import rsync 
  5. ''
  6. 脚本将挂载到 /media/pi 的 SD 卡上的内容复制到目的磁盘的同名目录下,目的磁盘的名字在 .conf文件里定义好了。 
  7. Argument:  label/name of the mounted SD Card. 
  8. ''
  9. CONFIG_FILE = '/home/pi/scripts/backup_photos.conf' 
  10. ORIGIN_DEV = sys.argv[1] 
  11. def create_folder(path): 
  12.     print ('attempting to create destination folder: ',path) 
  13.     if not os.path.exists(path): 
  14.         try:  
  15.             os.mkdir(path) 
  16.             print ('Folder created.'
  17.         except
  18.             print ('Folder could not be created. Stopping.'
  19.             return 
  20.     else
  21.         print ('Folder already in path. Using that instead.'
  22. confFile = open(CONFIG_FILE,'rU')  
  23. #重要:: rU 选项将以统一换行模式打开文件, 
  24. #所以 \n 和/或 \r 都被识别为一个新行。 
  25. confList = confFile.readlines() 
  26. confFile.close() 
  27. for line in confList: 
  28.     line = line.strip('\n'
  29.     try: 
  30.         name , value = line.split('='
  31.         if name == 'mount folder'
  32.             mountFolder = value 
  33.         elif name == 'destination folder'
  34.             destDevice = value 
  35.     except ValueError: 
  36.         print ('Incorrect line format. Passing.'
  37.         pass 
  38. destFolder = mountFolder+destDevice+'/'+ORIGIN_DEV 
  39. create_folder(destFolder) 
  40. print ('Copying files...'
  41. # 取消这行备注将删除不在源处的文件 
  42. # rsync("-av""--delete", mountFolder+ORIGIN_DEV, destFolder) 
  43. rsync("-av", mountFolder+ORIGIN_DEV+'/', destFolder) 
  44. print ('Done.'

三、iPad Pro 的配置

因为重活都由树莓派干了,文件不通过 iPad Pro 传输,这比我之前尝试的一种方案有巨大的优势。我们在 iPad 上只需要安装上 Prompt2 来通过 SSH 连接树莓派就行了,这样你既可以运行 Python 脚本也可以手动复制文件了。

iPad 用 Prompt2 通过 SSH 连接树莓派

 iPad 用 Prompt2 通过 SSH 连接树莓派

因为我们安装了 Samba,我们可以以更图形化的方式访问连接到树莓派的 USB 设备,你可以看视频,在不同的设备之间复制和移动文件,文件浏览器对于这种用途非常完美。(LCTT 译注:原文视频丢失。)

四、将它们结合在一起

我们假设SD32GB-03是连接到树莓派 USB 端口之一的 SD 卡的卷标,PDRIVE128GB是那个优盘的卷标,也连接到设备上,并在上面指出的配置文件中定义好。如果我们想要备份 SD 卡上的图片,我们需要这么做:

  1. 给树莓派加电打开,将驱动器自动挂载好。
  2. 连接树莓派配置好的 WIFI 网络。
  3. 用 Prompt2 这个 app 通过 SSH 连接到树莓派。
  4. 连接好后输入下面的命令:python3 backup_photos.py SD32GB-03

首次备份需要一些时间,这依赖于你的 SD 卡使用了多少容量。这意味着你需要一直保持树莓派和 iPad 设备连接不断,你可以在脚本运行之前通过 nohup 命令解决:


  
  
  1. nohup python3 backup_photos.py SD32GB-03 & 

运行完成的脚本如图所示

 运行完成的脚本如图所示

未来的定制

我在树莓派上安装了 vnc 服务,这样我可以通过其它计算机或在 iPad 上用 Remoter App连接树莓派的图形界面,我安装了 BitTorrent Sync 用来远端备份我的图片,当然需要先设置好。当我有了可以运行的解决方案之后,我会补充我的文章。

你可以在下面发表你的评论和问题,我会在此页下面回复。




作者:Lenin
来源:51CTO
目录
相关文章
|
网络协议 Ubuntu Linux
在IPad Pro上怎么实现代码自由,如何让IPad Pro变成你的生产力工具?
如何让IPad Pro变成你的生产力工具?在IPad上用Vscode写代码搞开发
322 1
在IPad Pro上怎么实现代码自由,如何让IPad Pro变成你的生产力工具?
|
7月前
|
网络协议 Ubuntu Linux
iPad Pro “买后生产力” - 在iPad上远程连接服务器编程写代码【公网远程】
iPad Pro “买后生产力” - 在iPad上远程连接服务器编程写代码【公网远程】
136 1
|
网络协议 Ubuntu Linux
闲置iPad Pro打造真正的生产力工具!使用vscode编程写代码
闲置iPad Pro打造真正的生产力工具!使用vscode编程写代码
701 0
|
固态存储 iOS开发
浅析iPad Pro的生产力方向走对了吗?
前几天苹果上架了2020款的MacBook Air和iPad Pro,两款产品同时降价并且提升性价比。其实从去年的iPhone11降价和MacBook Pro 16寸提升性价比开始,我们就应该发现苹果不再是以前的苹果了。
160 0
浅析iPad Pro的生产力方向走对了吗?
|
存储 vr&ar iOS开发
苹果春季新品、心心念念的iPad Pro
由于最近的国际形势。苹果居然悄悄在官网上线了好几款新品,这大半夜的感觉摸了摸我的钱包。今天我的iMac开机开了半个小时,这是暗示我要换“下一台电脑”?
191 0
苹果春季新品、心心念念的iPad Pro
「镁客早报」美国国会议员表示不会在今年通过无人车驾驶法案;苹果证实今年出货的iPad Pro有轻微弯曲
京东到家无人货架“倒闭”,回应称在调整;天津三星手机工厂年底关停,大量员工等待安置方案。
420 0
「镁客早报」谷歌无人驾驶汽车开始向乘客收费;新iPad Pro首用自研图形芯片
基于向乘客收费的模式,Waymo成为首个推出商业化服务的自动驾驶汽车开发商。
229 0
|
iOS开发
【搞机】9.7英寸iPad Pro 上手开箱(图文)
前言 话说,去年就一直想买个iPad ,但是苦于iPad air 2 出的太早,马上就要更新了,就没有买。 今年出了9.7英寸的iPad Pro ,看到增加了这么多新特性,就按耐不住心情预订了~ 还刻了字~ 然后在今天(2016年04月01日),也就是正式发售的第二天到货啦~ 真开...
932 0
|
iOS开发
【浪潮】从 Win10 新品发布会看 iPad Pro
iPad Pro 自发布以来,承受了太多的非议和无脑喷,我想,是时候写一些自己的感悟给它正名了。 昨天晚上,北京时间2015年10月6号,微软发布了 Surface Pro 4、Surface Book 以及其他一些新品(不是本文重点,暂不提) Sur...
1117 0