項(xiàng)目需要一個(gè)爬蟲,正好朋友有一個(gè)閑置樹莓派3b+拿來用带欢。事實(shí)再一次證明邮府,任何看起來很簡(jiǎn)單的事情其實(shí)都很復(fù)雜。而那些可能會(huì)發(fā)生的錯(cuò)誤則一定會(huì)發(fā)生 (`⌒′メ)
環(huán)境:
- Raspberry Pi 3b+
- Raspbian 操作系統(tǒng) (基于 Debian stretch9)
顯示問題
無信號(hào)
首當(dāng)其沖的是接好屏幕卻無信號(hào)咏尝,光是這個(gè)問題就折騰了一小時(shí)压语。根據(jù)經(jīng)驗(yàn),這種詭異的問題其原因往往非常簡(jiǎn)單编检,這次也不例外无蜂。因?yàn)橹挥幸粔K顯示器,所以要樹莓派與電腦輪流使用蒙谓。不巧斥季,這東西不支持 HDMI 熱插拔,開機(jī)時(shí)沒檢測(cè)到 HDMI 之后就默認(rèn)為模擬輸出了累驮。找到問題對(duì)癥下藥就好啦酣倾,編輯系統(tǒng) sd 卡根目錄下的 Config
文件:
# 找到這行配置,刪除前面的#取消注釋就好啦谤专。
# 這會(huì)強(qiáng)制使用 HDMI 輸出無論是否連接了顯示器躁锡。
hdmi_force_hotplug=1
分辨率無法調(diào)節(jié)
默認(rèn)分辨率很低,以至于設(shè)置窗口都顯示不全置侍。無論是直接編輯配置文件還是使用 UI 修改均無效映之。又是一個(gè)多小時(shí)的折騰,了解到它會(huì)自適應(yīng)顯示屏來調(diào)節(jié)分辨率忽略用戶設(shè)置蜡坊。同時(shí)猜測(cè)是不支持熱插拔的緣故杠输,導(dǎo)致無法正確識(shí)別顯示器分辨率。同樣繼續(xù)編輯配置文件:
# 加入下面這行忽略自動(dòng)調(diào)節(jié)
hdmi_ignore_edid=0xa5000080
hdmi_group=1 # 1是CEA多用于電視秕衙,2是DMT多用于顯示器
hdmi_mode=52 # 根據(jù)顯示器分辨率調(diào)節(jié)蠢甲,具體代碼含義網(wǎng)上有很多資料。
# 比如: http://shumeipai.nxez.com/2013/08/31/custom-display-resolution-raspberry-pie.html
這下顯示問題終于搞定了据忘。
切換源
眾所周知的鹦牛,先把源 切換成國(guó)內(nèi)來節(jié)約時(shí)間搞糕,這里使用清華開源鏡像站,直接根據(jù)幫助文檔操作就好曼追。
修改 /etc/apt/sources.list
窍仰,注釋掉原來的所有內(nèi)容,用下面內(nèi)容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main non-free contrib
然后修改 /etc/apt/sources.list.d/raspi.list
礼殊,用下面內(nèi)容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ stretch main
最后執(zhí)行 sudo apt-get update
更新下軟件源列表就好啦辈赋。
Docker
為了快速配置運(yùn)行環(huán)境,首先想到的方案就是 Docker膏燕。根據(jù)官方文檔進(jìn)行安裝钥屈。
最后發(fā)現(xiàn) x86 打包的鏡像是不能在 ARM 上使用的,交叉編譯太太太折騰坝辫,遂放棄 docker 方案篷就。
警告 根據(jù) Docker 文檔,Raspbian 不能使用 apt 直接安裝近忙,而應(yīng)該手動(dòng)進(jìn)行竭业,推薦使用 docker 提供的便攜腳本。
執(zhí)行下面命令下載便攜腳本并開始安裝:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun # 使用阿里云鏡像加速安裝
樹莓派默認(rèn)使用 pi
用戶登錄及舍,我們需要將它添加到 docker
用戶組未辆,這樣每次管理容器的時(shí)候不需要都加 sudo
了:
sudo usermod -aG docker pi # 注意需要注銷重新登錄來生效
最后設(shè)置下開機(jī)自動(dòng)啟動(dòng):
sudo systemctl enable docker
這樣 docker 環(huán)境就裝好了。
升級(jí) Python
Docker 不行就回到原生 Python 環(huán)境吧锯玛。默認(rèn)安裝的還是 2.x咐柜,把它升級(jí)成 3.6。首先更新軟件包并安裝所需依賴:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev
下載所需版本 Python 并解壓:
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
tar -zxvf Python-3.6.8.tgz
編譯安裝一氣呵成攘残,速度有點(diǎn)慢可以去喝杯奶茶:
cd Python-3.6.8
sudo ./configure & sudo make & sudo make install
完成后執(zhí)行 python3 --version
測(cè)試下是不是裝好了拙友。但是 python
還是調(diào)用 2.x 的版本。執(zhí)行 which python
定位一下歼郭,發(fā)現(xiàn)位于 /usr/bin/python
遗契。那就好辦了,刪除然后重新創(chuàng)建一個(gè)軟鏈接:
sudo rm /usr/bin/python
sudo ln -s /usr/bin/python3 /usr/bin/python
# 執(zhí)行 `which python3` 可獲得 python3 的位置
這樣 Python 就搞定了病曾。
令人崩潰的 pip
用過 py 的肯定知道 pip 的重要性牍蜂,這次偏偏就不好使了。執(zhí)行 pip 直接報(bào)錯(cuò) ImportError: cannot import name 'main'
泰涂。最終從網(wǎng)上找了一個(gè)看起來不靠譜的方案鲫竞,但實(shí)際很有效果。修改 sudo vim /user/bin/pip
负敏,將原先的代碼改成下面這樣的:
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())
如此一來 pip 總算可以跑起來了贡茅。接著是另一個(gè)老生常談的問題,找不到 ssl 模塊其做,導(dǎo)致無法連接 https 導(dǎo)致 pip 無法安裝或更新顶考。網(wǎng)上常見的編譯加 --with-ssl
并沒有什么幫助。
最后又是一個(gè)看起來不是很靠譜但真的很管用的方法:
首先確保所需的依賴已經(jīng)安裝了:
sudo apt-get install openssl
sudo apt-get install libssl-dev
在進(jìn)行過一次編譯之后妖泄,編輯 py 解壓的安裝包目錄下 ./Modules/Steup
文件驹沿,搜索 SSL
關(guān)鍵字,找到下面內(nèi)容并取消代碼的注釋(共4行):
# Socket module helper for socket(2)
_socket socketmodule.c # ←取消這行注釋
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
_ssl _ssl.c \ # ←取消這行注釋
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ # ←取消這行注釋
-L$(SSL)/lib -lssl -lcrypto # ←取消這行注釋
然后重新編譯安裝 sudo make & sudo make install
即可蹈胡。
Screen
個(gè)人習(xí)慣渊季,到手 linux 必備 screen,樹莓派也不例外罚渐。screen 可以幫助管理遠(yuǎn)程會(huì)話却汉,即使斷開連接也不會(huì)終止正在執(zhí)行的任務(wù)。重新連接可以快速恢復(fù)之前的會(huì)話荷并。
安裝 Screen 非常簡(jiǎn)單合砂,直接 sudo apt-get install screen
就可以了。
Screen 的基礎(chǔ)使用也很簡(jiǎn)單源织。執(zhí)行 screen
可以新建一個(gè)會(huì)話翩伪,這會(huì)打開一個(gè)全屏 shell 窗口程序,在其中可以執(zhí)行任意操作谈息,就像 ssh 窗口那樣缘屹。
Screen 的基本單位是窗口。創(chuàng)建會(huì)話時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè)窗口侠仇,一個(gè)會(huì)話可以有多個(gè)窗口轻姿。若關(guān)閉/斷開的是當(dāng)前會(huì)話的最后一個(gè)窗口,則自動(dòng)關(guān)閉/斷開會(huì)話逻炊。
Screen 的命令用 Ctrl+a
激活踢代。因?yàn)槟J(rèn)按鍵信息會(huì)發(fā)往 shell 窗口,所以需要一個(gè)組合鍵來通知 Screen 下面是命令操作嗅骄。神奇的地方來了胳挎,使用 C-a d
可以暫時(shí)斷開當(dāng)前窗口,并將其留在后臺(tái)溺森,其任務(wù)也會(huì)繼續(xù)執(zhí)行慕爬。此時(shí)可以放心地?cái)嚅_ ssh 連接。重新連接后使用 screen -r
可以快速恢復(fù)之前斷開的會(huì)話(如果有且只有一個(gè)會(huì)話)屏积,這樣執(zhí)行一個(gè)長(zhǎng)期任務(wù)就不用擔(dān)心斷掉了医窿。
如果有多個(gè)會(huì)話,使用 screen -ls
查看會(huì)話列表炊林,前面都是數(shù)字就是 id姥卢,使用 screen -r [id]
可以恢復(fù)會(huì)話。也可以使用 screen -S [name]
創(chuàng)建一個(gè)自定義名稱的會(huì)話,這樣可以使用 screen -r [name]
來快速恢復(fù)独榴。
下面是在 Screen 窗口中的常用的操作:
操作 | 功能 |
---|---|
C-a ? | 幫助 |
C-a d | 暫時(shí)斷開當(dāng)前窗口 |
C-a k | 關(guān)閉當(dāng)前窗口 |
C-a A(注意大寫) | 重命名當(dāng)前窗口 |
C-a w | 顯示窗口列表 |
C-a c | 創(chuàng)建并且到一個(gè)新窗口 |
C-a C-a | 切換到之前窗口僧叉,可在兩個(gè)窗口間快速切換 |
C-a n/p/[0,9] | 切換到下一個(gè)/上一個(gè)/指定的窗口 |
C-a a | 發(fā)送C-a 到窗口,有點(diǎn)轉(zhuǎn)義字符的感覺 |
更多的 Screen 教程推薦這個(gè)棺榔。