旅行時(shí),如何通過樹莓派和iPad Pro備份圖片
介紹
我在很長的時(shí)間內(nèi)一直在尋找一個(gè)旅行中備份圖片的理想方法,把 SD 卡放進(jìn)你的相機(jī)包會(huì)讓你暴露在太多的風(fēng)險(xiǎn)之中:SD 卡可能丟失或者被盜,數(shù)據(jù)可能損壞或者在傳輸過程中失敗。比較好的一個(gè)選擇是復(fù)制到另外一個(gè)介質(zhì)中,即使它也是個(gè) SD 卡,并且將它放到一個(gè)比較安全的地方去,備份到遠(yuǎn)端也是一個(gè)可行的辦法,但是如果去了一個(gè)沒有網(wǎng)絡(luò)的地方就不太可行了。
我理想的備份步驟需要下面的工具:
- 用一臺(tái) iPad pro 而不是一臺(tái)筆記本。我喜歡輕裝旅行,我的大部分旅程都是商務(wù)相關(guān)的(而不是拍攝休閑的),我痛恨帶著個(gè)人筆記本的時(shí)候還得帶著商務(wù)本。而我的 iPad 卻一直帶著,這就是我為什么選擇它的原因。
- 用盡可能少的硬件設(shè)備。
- 設(shè)備之間的連接需要很安全。我需要在旅館和機(jī)場使用這套設(shè)備,所以設(shè)備之間的連接需要是封閉而加密的。
- 整個(gè)過程應(yīng)該是可靠穩(wěn)定的,我還用過其他的路由器/組合設(shè)備,但是效果不太理想。
設(shè)備
我配置了一套滿足上面條件并且在未來可以擴(kuò)充的設(shè)備,它包含下面這些部件的使用:
- 9.7 英寸的 iPad Pro,這是本文寫作時(shí)最強(qiáng)大、輕薄的 iOS 設(shè)備,蘋果筆不是必需的,但是作為零件之一,當(dāng)我在路上可以做一些編輯工作,所有的重活由樹莓派做 ,其他設(shè)備只能通過 SSH 連接就行。
- 安裝了 Raspbian 操作系統(tǒng)樹莓派 3(LCTT 譯注:Raspbian 是基于 Debian 的樹莓派操作系統(tǒng))。
- 樹莓派的 Mini SD卡 和 盒子/外殼。
- 128G 的優(yōu)盤,對(duì)于我是夠用了,你可以買個(gè)更大的。你也可以買個(gè)像這樣的移動(dòng)硬盤,但是樹莓派沒法通過 USB 給移動(dòng)硬盤提供足夠的電量,這意味你需要額外準(zhǔn)備一個(gè)供電的 USB hub 以及電纜,這就破壞了我們讓設(shè)備輕薄的初衷。
- SD 讀卡器
- 另外的 SD 卡,我會(huì)使用幾個(gè) SD 卡,在用滿之前就會(huì)立即換一個(gè),這樣就會(huì)讓我在一次旅途當(dāng)中的照片散布在不同的 SD 卡上。
下圖展示了這些設(shè)備之間如何相互連接。
旅行時(shí)照片的備份-流程圖
樹莓派會(huì)作為一個(gè)安全的熱點(diǎn)。它會(huì)創(chuàng)建一個(gè)自己的 WPA2 加密的 WIFI 網(wǎng)絡(luò),iPad Pro 會(huì)連入其中。雖然有很多在線教程教你如何創(chuàng)建 Ad Hoc 網(wǎng)絡(luò)(計(jì)算機(jī)到計(jì)算機(jī)的單對(duì)單網(wǎng)絡(luò)),還更簡單一些,但是它的連接是不加密的,而且附件的設(shè)備很容易就能連接進(jìn)去。因此我選擇創(chuàng)建 WIFI 網(wǎng)絡(luò)。
相機(jī)的 SD 卡通過 SD 讀卡器插到樹莓派 USB 端口之一,128G 的大容量優(yōu)盤一直插在樹莓派的另外一個(gè) USB 端口上,我選擇了一款閃迪的,因?yàn)轶w積比較小。主要的思路就是通過 Python 腳本把 SD 卡的照片備份到優(yōu)盤上,備份過程是增量備份,每次腳本運(yùn)行時(shí)都只有變化的(比如新拍攝的照片)部分會(huì)添加到備份文件夾中,所以這個(gè)過程特別快。如果你有很多的照片或者拍攝了很多 RAW 格式的照片,在就是個(gè)巨大的優(yōu)勢。iPad 將用來運(yùn)行 Python 腳本,而且用來瀏覽 SD 卡和優(yōu)盤的文件。
作為額外的好處,如果給樹莓派連上一根能上網(wǎng)的網(wǎng)線(比如通過以太網(wǎng)口),那么它就可以共享互聯(lián)網(wǎng)連接給那些通過 WIFI 連入的設(shè)備。
一、樹莓派的設(shè)置
這部分需要你卷起袖子親自動(dòng)手了,我們要用到 Raspbian 的命令行模式,我會(huì)盡可能詳細(xì)的介紹,方便大家進(jìn)行下去。
安裝和配置 Raspbian
給樹莓派連接鼠標(biāo)、鍵盤和 LCD 顯示器,將 SD 卡插到樹莓派上,按照樹莓派官網(wǎng)的步驟安裝 Raspbian。
安裝完后,打開 Raspbian 的終端,執(zhí)行下面的命令:
- sudo apt-get update
- sudo apt-get upgrade
這將升級(jí)機(jī)器上所有的軟件到最新,我將樹莓派連接到本地網(wǎng)絡(luò),而且為了安全更改了默認(rèn)的密碼。
Raspbian 默認(rèn)開啟了 SSH,這樣所有的設(shè)置可以在一個(gè)遠(yuǎn)程的設(shè)備上完成。我也設(shè)置了 RSA 驗(yàn)證,但這是可選的功能,可以在這里查看更多信息。
這是一個(gè)在 Mac 上在 iTerm 里建立 SSH 連接到樹莓派上的截圖14。(LCTT 譯注:原文圖丟失。)
建立 WPA2 加密的 WIFI AP
安裝過程基于這篇文章,根據(jù)我的情況進(jìn)行了調(diào)整。
1. 安裝軟件包
我們需要安裝下面的軟件包:
- sudo apt-get install hostapd
- sudo apt-get install dnsmasq
hostapd 用來使用內(nèi)置的 WiFi 來創(chuàng)建 AP,dnsmasp 是一個(gè)組合的 DHCP 和 DNS 服務(wù)其,很容易設(shè)置。
2. 編輯 dhcpcd.conf
通過以太網(wǎng)連接樹莓派,樹莓派上的網(wǎng)絡(luò)接口配置由 dhcpd 控制,因此我們首先忽略這一點(diǎn),將 wlan0 設(shè)置為一個(gè)靜態(tài)的 IP。
用 sudo nano /etc/dhcpcd.conf 命令打開 dhcpcd 的配置文件,在最后一行添加上如下內(nèi)容:
- denyinterfaces wlan0
注意:它必須放在如果已經(jīng)有的其它接口行之上。
3. 編輯接口
現(xiàn)在設(shè)置靜態(tài) IP,使用 sudo 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服務(wù),然后用 sudo ifdown eth0; sudo ifup wlan0 命令來重載wlan0的配置。
4. 配置 Hostapd
接下來,我們需要配置 hostapd,使用 sudo nano /etc/hostapd/hostapd.conf 命令創(chuàng)建一個(gè)新的配置文件,內(nèi)容如下:
- 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
配置完成后,我們需要告訴dhcpcd 在系統(tǒng)啟動(dòng)運(yùn)行時(shí)到哪里尋找配置文件。 使用 sudo nano /etc/default/hostapd 命令打開默認(rèn)配置文件,然后找到#DAEMON_CONF="" 替換成DAEMON_CONF="/etc/hostapd/hostapd.conf"。
5. 配置 Dnsmasq
自帶的 dnsmasp 配置文件包含很多信息方便你使用它,但是我們不需要那么多選項(xiàng),我建議把它移動(dòng)到別的地方(而不要?jiǎng)h除它),然后自己創(chuàng)建一個(gè)新文件:
- 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. 設(shè)置 IPv4 轉(zhuǎn)發(fā)
最后我們需要做的事就是配置包轉(zhuǎn)發(fā),用 sudo nano /etc/sysctl.conf 命令打開 sysctl.conf 文件,將包含 net.ipv4.ip_forward=1的那一行之前的#號(hào)刪除,它將在下次重啟時(shí)生效。
我們還需要給連接到樹莓派的設(shè)備通過 WIFI 分享互聯(lián)網(wǎng)連接,做一個(gè) wlan0和 eth0 之間的 NAT。我們可以參照下面的腳本來實(shí)現(xiàn)。
- 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
我命名這個(gè)腳本名為 hotspot-boot.sh,然后讓它可以執(zhí)行:
- sudo chmod 755 hotspot-boot.sh
該腳本應(yīng)該在樹莓派啟動(dòng)的時(shí)候運(yùn)行。有很多方法實(shí)現(xiàn),下面是我實(shí)現(xiàn)的方式:
- 把文件放到/home/pi/scripts目錄下。
- 輸入sudo nano /etc/rc.local命令編輯 rc.local 文件,將運(yùn)行該腳本的命令放到 exit 0之前。(更多信息參照這里)。
編輯后rc.local看起來像這樣:
- #!/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 服務(wù)和 NTFS 兼容驅(qū)動(dòng)
我們要安裝下面幾個(gè)軟件來啟用 samba 協(xié)議,使文件瀏覽器能夠訪問樹莓派分享的文件夾,ntfs-3g 可以使我們能夠訪問移動(dòng)硬盤中 ntfs 文件系統(tǒng)的文件。
- sudo apt-get install ntfs-3g
- sudo apt-get install samba samba-common-bin
你可以參照這些文檔來配置 Samba。
重要提示:參考的文檔介紹的是掛載外置硬盤到樹莓派上,我們不這樣做,是因?yàn)樵谶@篇文章寫作的時(shí)候,樹莓派在啟動(dòng)時(shí)的 auto-mounts 功能同時(shí)將 SD 卡和優(yōu)盤掛載到/media/pi/上,該文章有一些多余的功能我們也不會(huì)采用。
二、 Python 腳本
樹莓派配置好后,我們需要開發(fā)腳本來實(shí)際拷貝和備份照片。注意,這個(gè)腳本只是提供了特定的自動(dòng)化備份進(jìn)程,如果你有基本的 Linux/樹莓派命令行操作的技能,你可以 ssh 進(jìn)樹莓派,然后創(chuàng)建需要的文件夾,使用cp或rsync命令拷貝你自己的照片從一個(gè)設(shè)備到另外一個(gè)設(shè)備上。在腳本里我們用rsync命令,這個(gè)命令比較可靠而且支持增量備份。
這個(gè)過程依賴兩個(gè)文件,腳本文件自身和backup_photos.conf這個(gè)配置文件,后者只有幾行包含被掛載的目的驅(qū)動(dòng)器(優(yōu)盤)和應(yīng)該掛載到哪個(gè)目錄,它看起來是這樣的:
- mount folder=/media/pi/
- destination folder=PDRIVE128GB
重要提示:在這個(gè)符號(hào)=前后不要添加多余的空格,否則腳本會(huì)失效。
下面是這個(gè) Python 腳本,我把它命名為backup_photos.py,把它放到了/home/pi/scripts/目錄下,我在每行都做了注釋可以方便的查看各行的功能。
- #!/usr/bin/python3
- import os
- import sys
- from sh import rsync
- '''
- 腳本將掛載到 /media/pi 的 SD 卡上的內(nèi)容復(fù)制到目的磁盤的同名目錄下,目的磁盤的名字在 .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')
- #重要:: rU 選項(xiàng)將以統(tǒng)一換行模式打開文件,
- #所以 \n 和/或 \r 都被識(shí)別為一個(gè)新行。
- 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...')
- # 取消這行備注將刪除不在源處的文件
- # rsync("-av", "--delete", mountFolder+ORIGIN_DEV, destFolder)
- rsync("-av", mountFolder+ORIGIN_DEV+'/', destFolder)
- print ('Done.')
三、iPad Pro 的配置
因?yàn)橹鼗疃加蓸漭筛闪?,文件不通過 iPad Pro 傳輸,這比我之前嘗試的一種方案有巨大的優(yōu)勢。我們?cè)?iPad 上只需要安裝上 Prompt2 來通過 SSH 連接樹莓派就行了,這樣你既可以運(yùn)行 Python 腳本也可以手動(dòng)復(fù)制文件了。

iPad 用 Prompt2 通過 SSH 連接樹莓派
因?yàn)槲覀儼惭b了 Samba,我們可以以更圖形化的方式訪問連接到樹莓派的 USB 設(shè)備,你可以看視頻,在不同的設(shè)備之間復(fù)制和移動(dòng)文件,文件瀏覽器對(duì)于這種用途非常完美。(LCTT 譯注:原文視頻丟失。)
四、將它們結(jié)合在一起
我們假設(shè)SD32GB-03是連接到樹莓派 USB 端口之一的 SD 卡的卷標(biāo),PDRIVE128GB是那個(gè)優(yōu)盤的卷標(biāo),也連接到設(shè)備上,并在上面指出的配置文件中定義好。如果我們想要備份 SD 卡上的圖片,我們需要這么做:
- 給樹莓派加電打開,將驅(qū)動(dòng)器自動(dòng)掛載好。
- 連接樹莓派配置好的 WIFI 網(wǎng)絡(luò)。
- 用 Prompt2 這個(gè) app 通過 SSH 連接到樹莓派。
- 連接好后輸入下面的命令:python3 backup_photos.py SD32GB-03
首次備份需要一些時(shí)間,這依賴于你的 SD 卡使用了多少容量。這意味著你需要一直保持樹莓派和 iPad 設(shè)備連接不斷,你可以在腳本運(yùn)行之前通過 nohup 命令解決:
- nohup python3 backup_photos.py SD32GB-03 &
運(yùn)行完成的腳本如圖所示
未來的定制
我在樹莓派上安裝了 vnc 服務(wù),這樣我可以通過其它計(jì)算機(jī)或在 iPad 上用 Remoter App連接樹莓派的圖形界面,我安裝了 BitTorrent Sync 用來遠(yuǎn)端備份我的圖片,當(dāng)然需要先設(shè)置好。當(dāng)我有了可以運(yùn)行的解決方案之后,我會(huì)補(bǔ)充我的文章。
你可以在下面發(fā)表你的評(píng)論和問題,我會(huì)在此頁下面回復(fù)。