旅行時通過樹莓派和 iPad Pro 備份圖片
旅行中備份圖片 - 組件
介紹
我在很長的時間內一直在尋找一個旅行中備份圖片的理想方法,把 SD 卡放進你的相機包會讓你暴露在太多的風險之中:SD 卡可能丟失或者被盜,數據可能損壞或者在傳輸過程中失敗。比較好的一個選擇是複製到另外一個介質中,即使它也是個 SD 卡,並且將它放到一個比較安全的地方去,備份到遠端也是一個可行的辦法,但是如果去了一個沒有網路的地方就不太可行了。
我理想的備份步驟需要下面的工具:
- 用一台 iPad pro 而不是一台筆記本。我喜歡輕裝旅行,我的大部分旅程都是商務相關的(而不是拍攝休閑的),我痛恨帶著個人筆記本的時候還得帶著商務本。而我的 iPad 卻一直帶著,這就是我為什麼選擇它的原因。
- 用儘可能少的硬體設備。
- 設備之間的連接需要很安全。我需要在旅館和機場使用這套設備,所以設備之間的連接需要是封閉而加密的。
- 整個過程應該是可靠穩定的,我還用過其他的路由器/組合設備,但是效果不太理想。
設備
我配置了一套滿足上麵條件並且在未來可以擴充的設備,它包含下面這些部件的使用:
- 9.7 英寸的 iPad Pro,這是本文寫作時最強大、輕薄的 iOS 設備,蘋果筆不是必需的,但是作為零件之一,當我在路上可以做一些編輯工作,所有的重活由樹莓派做 ,其他設備只能通過 SSH 連接就行。
- 安裝了 Raspbian 操作系統樹莓派 3(LCTT 譯註:Raspbian 是基於 Debian 的樹莓派操作系統)。
- 樹莓派的 Mini SD卡 和 盒子/外殼。
- 128G 的優盤,對於我是夠用了,你可以買個更大的。你也可以買個像這樣的移動硬碟,但是樹莓派沒法通過 USB 給移動硬碟提供足夠的電量,這意味你需要額外準備一個供電的 USB hub 以及電纜,這就破壞了我們讓設備輕薄的初衷。
- SD 讀卡器
- 另外的 SD 卡,我會使用幾個 SD 卡,在用滿之前就會立即換一個,這樣就會讓我在一次旅途當中的照片散布在不同的 SD 卡上。
下圖展示了這些設備之間如何相互連接。
旅行時照片的備份-流程圖
樹莓派會作為一個安全的熱點。它會創建一個自己的 WPA2 加密的 WIFI 網路,iPad Pro 會連入其中。雖然有很多在線教程教你如何創建 Ad Hoc 網路(計算機到計算機的單對單網路),還更簡單一些,但是它的連接是不加密的,而且附件的設備很容易就能連接進去。因此我選擇創建 WIFI 網路。
相機的 SD 卡通過 SD 讀卡器插到樹莓派 USB 埠之一,128G 的大容量優盤一直插在樹莓派的另外一個 USB 埠上,我選擇了一款閃迪的,因為體積比較小。主要的思路就是通過 Python 腳本把 SD 卡的照片備份到優盤上,備份過程是增量備份,每次腳本運行時都只有變化的(比如新拍攝的照片)部分會添加到備份文件夾中,所以這個過程特別快。如果你有很多的照片或者拍攝了很多 RAW 格式的照片,在就是個巨大的優勢。iPad 將用來運行 Python 腳本,而且用來瀏覽 SD 卡和優盤的文件。
作為額外的好處,如果給樹莓派連上一根能上網的網線(比如通過乙太網口),那麼它就可以共享互聯網連接給那些通過 WIFI 連入的設備。
1. 樹莓派的設置
這部分需要你捲起袖子親自動手了,我們要用到 Raspbian 的命令行模式,我會儘可能詳細的介紹,方便大家進行下去。
安裝和配置 Raspbian
給樹莓派連接滑鼠、鍵盤和 LCD 顯示器,將 SD 卡插到樹莓派上,按照樹莓派官網的步驟安裝 Raspbian。
安裝完後,打開 Raspbian 的終端,執行下面的命令:
sudo apt-get update
sudo apt-get upgrade
這將升級機器上所有的軟體到最新,我將樹莓派連接到本地網路,而且為了安全更改了默認的密碼。
Raspbian 默認開啟了 SSH,這樣所有的設置可以在一個遠程的設備上完成。我也設置了 RSA 驗證,但這是可選的功能,可以在這裡查看更多信息。
這是一個在 Mac 上在 iTerm 里建立 SSH 連接到樹莓派上的截圖14。(LCTT 譯註:原文圖丟失。)
建立 WPA2 加密的 WIFI AP
安裝過程基於這篇文章,根據我的情況進行了調整。
1. 安裝軟體包
我們需要安裝下面的軟體包:
sudo apt-get install hostapd
sudo apt-get install dnsmasq
hostapd 用來使用內置的 WiFi 來創建 AP,dnsmasp 是一個組合的 DHCP 和 DNS 服務其,很容易設置。
2. 編輯 dhcpcd.conf
通過乙太網連接樹莓派,樹莓派上的網路介面配置由 dhcpd
控制,因此我們首先忽略這一點,將 wlan0
設置為一個靜態的 IP。
用 sudo nano /etc/dhcpcd.conf
命令打開 dhcpcd 的配置文件,在最後一行添加上如下內容:
denyinterfaces wlan0
注意:它必須放在如果已經有的其它介面行之上。
3. 編輯介面
現在設置靜態 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
服務,然後用 sudo ifdown eth0; sudo ifup wlan0
命令來重載wlan0
的配置。
4. 配置 Hostapd
接下來,我們需要配置 hostapd,使用 sudo 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
配置完成後,我們需要告訴dhcpcd
在系統啟動運行時到哪裡尋找配置文件。 使用 sudo nano /etc/default/hostapd
命令打開默認配置文件,然後找到#DAEMON_CONF=""
替換成DAEMON_CONF="/etc/hostapd/hostapd.conf"
。
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
文件,將包含 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
該腳本應該在樹莓派啟動的時候運行。有很多方法實現,下面是我實現的方式:
- 把文件放到
/home/pi/scripts
目錄下。 - 輸入
sudo nano /etc/rc.local
命令編輯rc.local
文件,將運行該腳本的命令放到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 %sn" "$_IP"
fi
sudo /home/pi/scripts/hotspot-boot.sh &
exit 0
安裝 Samba 服務和 NTFS 兼容驅動
我們要安裝下面幾個軟體來啟用 samba 協議,使文件瀏覽器能夠訪問樹莓派分享的文件夾,ntfs-3g
可以使我們能夠訪問移動硬碟中 ntfs 文件系統的文件。
sudo apt-get install ntfs-3g
sudo apt-get install samba samba-common-bin
你可以參照這些文檔來配置 Samba。
重要提示:參考的文檔介紹的是掛載外置硬碟到樹莓派上,我們不這樣做,是因為在這篇文章寫作的時候,樹莓派在啟動時的 auto-mounts 功能同時將 SD 卡和優盤掛載到/media/pi/
上,該文章有一些多餘的功能我們也不會採用。
2. Python 腳本
樹莓派配置好後,我們需要開發腳本來實際拷貝和備份照片。注意,這個腳本只是提供了特定的自動化備份進程,如果你有基本的 Linux/樹莓派命令行操作的技能,你可以 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')
#重要:: rU 選項將以統一換行模式打開文件,
#所以 n 和/或 r 都被識別為一個新行。
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.')
3. iPad Pro 的配置
因為重活都由樹莓派幹了,文件不通過 iPad Pro 傳輸,這比我之前嘗試的一種方案有巨大的優勢。我們在 iPad 上只需要安裝上 Prompt2 來通過 SSH 連接樹莓派就行了,這樣你既可以運行 Python 腳本也可以手動複製文件了。
iPad 用 Prompt2 通過 SSH 連接樹莓派
因為我們安裝了 Samba,我們可以以更圖形化的方式訪問連接到樹莓派的 USB 設備,你可以看視頻,在不同的設備之間複製和移動文件,文件瀏覽器對於這種用途非常完美。(LCTT 譯註:原文視頻丟失。)
4. 將它們結合在一起
我們假設SD32GB-03
是連接到樹莓派 USB 埠之一的 SD 卡的卷標,PDRIVE128GB
是那個優盤的卷標,也連接到設備上,並在上面指出的配置文件中定義好。如果我們想要備份 SD 卡上的圖片,我們需要這麼做:
- 給樹莓派加電打開,將驅動器自動掛載好。
- 連接樹莓派配置好的 WIFI 網路。
- 用 Prompt2 這個 app 通過 SSH 連接到樹莓派。
- 連接好後輸入下面的命令:
python3 backup_photos.py SD32GB-03
首次備份需要一些時間,這依賴於你的 SD 卡使用了多少容量。這意味著你需要一直保持樹莓派和 iPad 設備連接不斷,你可以在腳本運行之前通過 nohup
命令解決:
nohup python3 backup_photos.py SD32GB-03 &
運行完成的腳本如圖所示
未來的定製
我在樹莓派上安裝了 vnc 服務,這樣我可以通過其它計算機或在 iPad 上用 Remoter App連接樹莓派的圖形界面,我安裝了 BitTorrent Sync 用來遠端備份我的圖片,當然需要先設置好。當我有了可以運行的解決方案之後,我會補充我的文章。
你可以在下面發表你的評論和問題,我會在此頁下面回復。
作者:Lenin 譯者:jiajia9linuxer 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive