TranslateProject/translated/tech/20160626 Backup Photos While Traveling With an Ipad Pro and a Raspberry Pi.md
wxy 1498a6599f 不要改文件名
@jiajia9linuxer @oska874
2016-09-14 13:13:22 +08:00

15 KiB
Executable File
Raw Blame History

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

旅行中备份图片 - Gear.

介绍

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

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

  1. 用一台iPad pro而不是一台笔记本。我喜欢简便的旅行我的旅行大部分是商务的而不是拍摄休闲的这很显然我为什么选择了iPad Pro
  2. 用尽可能少的设备
  3. 设备之间的连接需要很安全。我需要在旅馆和机场使用,所以设备之间的连接需要时封闭的加密的。
  4. 整个过程应该是稳定的安全的,我还用过其他的移动设备,但是效果不太理想1.

设置

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

  1. 29.7寸写作时最棒的又小又轻便的IOS系统的iPad Pro苹果笔不是不许的但是当我在路上进行一些编辑的时候依然需要所有的重活由树莓派做 其他设备通过ssh连接设备
  2. 3 树莓派3包含Raspbian系统
  3. 4Mini SD卡 box/case.
  4. 6128G的优盘对于我是够用了你可以买个更大的你也可以买个移动硬盘但是树莓派没办法给移动硬盘供电你需要额外准备一个供电的hub当然优质的线缆能提供可靠便捷的安装和连接。
  5. 9SD读卡器
  6. 10另外的sd卡SD卡我在用满之前就会立即换一个这样就会让我的照片分布在不同的sd卡上

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

旅行时照片的备份-过程表格.

树莓派会作为一个热点. 它会创建一个WIFI网络当然也可以建立一个Ad Hoc网络更简单一些但是它不会加密设备之间的连接因此我选择创建WIFI网络。

SD卡放进SD读卡器插到树莓派USB端口上128G的大容量优盘一直插在树莓派的USB端口上我选择了一款闪迪的体积比较小。主要的思路就是通过脚本把SD卡的图片备份到优盘上脚本是增量备份而且脚本会自动运行使备份特别快如果你有很多的照片或者拍摄了很多没压缩的照片这个任务量就比较大用ipad来运行Python脚本而且用来浏览SD卡和优盘的文件。

如果给树莓派连上一根能上网的网线那样连接树莓派wifi的设备就可以上网啦

1. 树莓派的设置

这部分要用到命令行模式,我会尽可能详细的介绍,方便大家进行下去。

安装和配置Raspbian

给树莓派连接鼠标键盘和显示器将SD卡插到树莓派上在官网按步骤安装Raspbian 12.

安装完后执行下面的命令:

sudo apt-get update
sudo apt-get upgrade

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

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

这是一个在MAC上建立SSH连接到树莓派上的截图14:

建立WPA2验证的WIFI

这个安装过程是基于这篇文章,只适用于我自己做的例子15.

1. 安装软件包

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

sudo apt-get install hostapd
sudo apt-get install dnsmasq

hostapd用来创建wifidnsmasp用来做dhcp和dns服务很容易设置.

2. 编辑dhcpcd.conf

通过网络连接树莓派网络设置树莓派需要dhcpd首先我们将wlan0设置为一个静态的IP。

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

denyinterfaces wlan0

注意: 必须先配置这个接口才能配置其他接口.

3. 编辑端口

现在设置静态IPsudo nano /etc/network/interfaces打开端口配置文件按照如下信息编辑wlan0选项:

allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

同样, 然后添加wlan1信息:

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

重要: sudo service dhcpcd restart命令重启dhcpd服务sudo ifdown eth0; sudo ifup wlan0命令用来关闭eth0端口再开启用来生效配置文件.

4. 配置Hostapd

接下来我们配置hostapdsudo nano /etc/hostapd/hostapd.conf 用这个命令创建并填写配置信息到文件中:

interface=wlan0

# Use the nl80211 driver with the brcmfmac driver
driver=nl80211

# This is the name of the network
ssid=YOUR_NETWORK_NAME_HERE

# Use the 2.4GHz band
hw_mode=g

# Use channel 6
channel=6

# Enable 802.11n
ieee80211n=1

# Enable QoS Support
wmm_enabled=1

# Enable 40MHz channels with 20ns guard interval
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]

# Accept all MAC addresses
macaddr_acl=0

# Use WPA authentication
auth_algs=1

# Require clients to know the network name
ignore_broadcast_ssid=0

# Use WPA2
wpa=2

# Use a pre-shared key
wpa_key_mgmt=WPA-PSK

# The network passphrase
wpa_passphrase=YOUR_NEW_WIFI_PASSWORD_HERE

# Use AES, instead of TKIP
rsn_pairwise=CCMP

配置完成后,我们需要运行 sudo nano /etc/default/hostapd 命令打开这个配置文件然后找到#DAEMON_CONF="" 替换成DAEMON_CONF="/etc/hostapd/hostapd.conf"以便hostapd服务能够找到对应的配置文件.

5. 配置Dnsmasq

dnsmasp配置文件包含很多信息方便你使用它但是我们不需要那么多选项我建议用下面两条命令把它放到别的地方不要删除它然后自己创建一个文件

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

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

interface=wlan0      # Use interface wlan0
listen-address=192.168.1.1 # Explicitly specify the address to listen on
bind-interfaces      # Bind to the interface to make sure we aren't sending things elsewhere
server=8.8.8.8       # Forward DNS requests to Google DNS
domain-needed        # Don't forward short names
bogus-priv           # Never forward addresses in the non-routed address spaces.
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文件将containing net.ipv4.ip_forward=1之前的#号删除,然后重启生效

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

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

我命名了一个hotspot-boot.sh的脚本然后让它可以运行:

sudo chmod 755 hotspot-boot.sh

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

  1. 把文件放到/home/pi/scripts目录下.
  2. 编辑rc.local文件输入sudo nano /etc/rc.local命令将运行脚本命令放到exit0之前16).

下面是实例.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

sudo /home/pi/scripts/hotspot-boot.sh &

exit 0

安装Samba服务和NTFS兼容驱动.

我们要安装下面几个软件使我们能够访问树莓派分享的文件夹ntfs-3g可以使我们能够方位ntfs文件系统的文件.

sudo apt-get install ntfs-3g
sudo apt-get install samba samba-common-bin

你可以参照这些文档来配置Samba17 .

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

2. Python脚本

树莓派配置好后我们需要让脚本拷贝和备份照片的时候真正的起作用脚本只提供了特定的自动化备份进程如果你有基本的cli操作的技能你可以ssh进树莓派然后拷贝你自己的照片从一个设备到另外一个设备用cp或者rsync命令。在脚本里我们用rsync命令这个命令比较可靠而且支持增量备份。

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

mount folder=/media/pi/
destination folder=PDRIVE128GB

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

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

#!/usr/bin/python3

import os
import sys
from sh import rsync

'''
脚本将挂载到/media/pi的sd卡上的内容复制到一个目的磁盘的同名目录下目的驱动器的名字在.conf文件里定义好了.


Argument:  label/name of the mounted SD Card.
'''

CONFIG_FILE = '/home/pi/scripts/backup_photos.conf'
ORIGIN_DEV = sys.argv[1]

def create_folder(path):

    print ('attempting to create destination folder: ',path)
    if not os.path.exists(path):
        try: 
            os.mkdir(path)
            print ('Folder created.')
        except:
            print ('Folder could not be created. Stopping.')
            return
    else:
        print ('Folder already in path. Using that instead.')



confFile = open(CONFIG_FILE,'rU') 
#IMPORTANT: rU Opens the file with Universal Newline Support, 
#so \n and/or \r is recognized as a new line.

confList = confFile.readlines()
confFile.close()


for line in confList:
    line = line.strip('\n')

    try:
        name , value = line.split('=')

        if name == 'mount folder':
            mountFolder = value
        elif name == 'destination folder':
            destDevice = value


    except ValueError:
        print ('Incorrect line format. Passing.')
        pass


destFolder = mountFolder+destDevice+'/'+ORIGIN_DEV
create_folder(destFolder)

print ('Copying files...')

# Comment out to delete files that are not in the origin:
# rsync("-av", "--delete", mountFolder+ORIGIN_DEV, destFolder)
rsync("-av", mountFolder+ORIGIN_DEV+'/', destFolder)

print ('Done.')

3.iPad Pro的配置

树莓派做了最重的活而且iPad Pro根本没参与传输文件我们在iPad上只需要安装上Prompt2来通过ssh连接树莓派就行了这样你既可以运行Python脚本也可以复制文件了。18; 19.

iPad用prompt通过SSH连接树莓派.

我们安装了Samba我们可以通过图形方式通过树莓派连接到USB设备你可以看视频在不同的设备之间复制和移动文件文件浏览器是必须的20 .

4. 将它们都放到一起

我们假设SD32GB-03是连接到树莓派的SD卡名字PDRIVE128GB是那个优盘通过事先的配置文件挂载好如果我们想要备份SD卡上的图片我们需要这么做:

  1. 让树莓派先正常运行,将设备挂载好.
  2. 连接树莓派配置好的WIFI网络.
  3. 用prompt这个app通过ssh连接树莓派21.
  4. 连接好后输入下面的命令:
python3 backup_photos.py SD32GB-03

首次备份需要一些时间基于SD卡的容量你需要保持好设备之间的连接在脚本运行之前你可以通过下面这个命令绕过.

nohup python3 backup_photos.py SD32GB-03 &

运行完成的脚本如图所示.

未来的定制

我在树莓派上安装了vnc服务这样我可以通过ipad连接树莓派的图形界面我安装了bittorrent用来远端备份我的图片当然需要先设置好我会放出这些当我完成这些工作后[2324

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


via: http://www.movingelectrons.net/blog/2016/06/26/backup-photos-while-traveling-with-a-raspberry-pi.html

作者:Editor 译者:jiajia9linuxer 校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出