树莓派开发环境准备汇总

由于经常要折腾Raspbian,所以打算在这里汇总一下树莓派环境初始化要做的工作。

1 系统安装及配置

1.1 Headless下的WiFi及ssh配置

按树莓派官方说明在SD卡上写入镜像,然后进行Headless配置:

配置WIFI,需要在SD卡根目录下新建一个名为wpa_supplicant.conf的文件:

1
touch /Volumes/boot/wpa_supplicant.conf

写入WIFI配置:

1
2
3
4
5
6
7
8
country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="<YOUR-NETWORK-NAME>"
psk="<YOUR-NETWORK-PASSWORD>"
}

开启SSH,只需在SD卡根目录下新建一个名为ssh的空文件即可:

1
touch /Volumes/boot/ssh


或者直接将本地编辑好的wpa_supplicant.confssh文件拷贝到SD卡上:

1
2
3
# 本地存储卡初始化
cp ~/Raspberrypi/wpa_supplicant.conf /Volumes/boot
touch /Volumes/boot/ssh


配置完成后正常启动树莓派即可自动连接WIFI,SSH可以正常登录。
注:如果不知道设备IP,可以使用ping raspberry.local查找。

如果这个IP上曾经还有过其他树莓派前辈,那么要先删除本机上的ssh信任主机,比如我的树莓派一直用固定IP配在108上:

1
2
3
4
ssh-keygen -R 192.168.1.108

# 树莓派插卡启动,上传本地秘钥方便ssh登录
ssh-copy-id pi@192.168.1.108

第一次用pi登录后默认密码为raspberry,应该直接使用passwd修改密码。或是使用sudo raspi-config,通过树莓派管理工具修改密码、主机名、地区、时区等信息。

1.2 换国内镜像源

解决升级慢或Cannot initiate the connection to mirrors.opencas.cn问题:

1
sudo vi /etc/apt/sources.list

修改sources.list,注释第一行,在最后添加国内镜像站:

1
2
deb http://mirrors.aliyun.com/raspbian/raspbian/ stretch main non-free contrib
deb-src http://mirrors.aliyun.com/raspbian/raspbian/ stretch main non-free contrib

也可以使用其他镜像站,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 中科大
deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
# 清华
deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
# 大连东软
deb http://mirrors.neusoft.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
# 重庆大学
deb http://mirrors.cqu.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
# 浙江大学
deb http://mirrors.zju.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
# 阿里云
deb http://mirrors.aliyun.com/raspbian/raspbian/ stretch main contrib non-free rpi
# 搜狐
deb http://mirrors.sohu.com/raspbian/raspbian/ stretch main contrib non-free rpi
# 元智大学(中国台湾)
deb http://ftp.cse.yzu.edu.tw/Linux/raspbian/raspbian/ stretch main contrib non-free rpi
# 新加坡国立大学
deb http://mirror.nus.edu.sg/raspbian/raspbian/ stretch main contrib non-free rpi
# 北陆先端科学技术大学院大学(日本知名镜像站,日常出口带宽2g)
deb http://ftp.jaist.ac.jp/raspbian/ stretch main contrib non-free rpi
# 牛津大学
deb http://mirror.ox.ac.uk/sites/archive.raspbian.org/archive/raspbian/ stretch main contrib non-free rpi
# 美国Berkely大学
deb http://mirrors.ocf.berkeley.edu/raspbian/raspbian/ stretch main contrib non-free rpi
# 美国俄克拉荷马大学
deb http://reflection.oss.ou.edu/raspbian/raspbian/ stretch main contrib non-free rpi
# 南非知名软件源
deb http://mirror.liquidtelecom.com/raspbian/raspbian/ stretch main contrib non-free rpi
# 默认源(带重定向by mirrorbrain)
deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi
# 官方源
deb https://archive.raspbian.org/raspbian/ stretch main contrib non-free rpi

同样的,修改raspi.list,树莓派的软件包源仅有清华和中科大镜像:

1
sudo vi /etc/apt/sources.list.d/raspi.list

注释第一行,在最后添加:

1
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui


或者直接在树莓派上执行:

1
2
sudo sed -i 's#://raspbian.raspberrypi.org#s://mirrors.tuna.tsinghua.edu.cn/raspbian#g' /etc/apt/sources.list
sudo sed -i 's#://archive.raspberrypi.org/debian#s://mirrors.tuna.tsinghua.edu.cn/raspberrypi#g' /etc/apt/sources.list.d/raspi.list

如果嫌麻烦的话,上面这些需要配置的东西可以写成文件,再用脚本执行:

1
2
3
4
5
6
# 将本地编写好的配置文件拷贝到树莓派上
scp ~/Raspberrypi/raspi.list ~/Raspberrypi/sources.list pi@192.168.1.108:./

# 树莓派上拷贝配置文件到相应目录
sudo mv ~/sources.list /etc/apt/sources.list
sudo mv ~/raspi.list /etc/apt/sources.list.d/raspi.list


固件升级(谨慎操作,可能会踩到奇怪的编译坑):

1
sudo rpi-update && sudo reboot -h now

软件包升级:

1
time sudo apt-get update && time sudo apt-get upgrade && time sudo apt-get dist-upgrade

软件包清理,顺便装个vim和tmux:

1
2
sudo apt clean
sudo apt install -y vim tmux

我的tmux的配置只有一行set -g mouse on,可以将本地编写好的tmux配置文件上传到树莓派家目录,不需要再移动位置:

1
scp ~/Raspberrypi/.tmux.conf pi@192.168.1.108:./

可以直接拷贝到树莓派上

2 搭建科学上网环境

2.1 安装SS

安装shadowsocks命令行客户端(推荐用pipapt,快一些):

1
2
3
4
5
6
7
8
pip install shadowsocks
sudo apt install -y shadowsocks-libev
# 或cpan安装
# 更新CPAN
sudo cpan install CPAN
# 重载CPAN
sudo cpan reload CPAN
sudo cpan Net::Shadowsocks

2.2 配置防火墙

安装ufw以方便调整防火墙策略,其实是我不会用iptables

1
sudo apt-get install -y ufw

更新防火墙策略:

1
2
3
4
5
6
7
sudo ufw allow proto tcp to 0.0.0.0/0 port 22 comment "sshd listen port"
sudo ufw allow proto tcp to 0.0.0.0/0 port 1080 comment "Shadowsocks server listen port"
sudo ufw allow proto tcp to 0.0.0.0/0 port 5900 comment "vnc server listen port"
# 有时候需要用python -m http.server 8000传文件,开个口比较方便
sudo ufw allow proto tcp to 0.0.0.0/0 port 8000 comment "for python -m http.server 8000"
sudo ufw default deny
sudo ufw enable

2.3 socks5代理

/etc/shadowsocks-libev/xxx.json下配置科学上网服务器:

1
2
3
4
5
6
7
8
9
{
"server": "<your-remote-server>",
"server_port": <your-remote-server-port>,
"timeout": 60,
"password": "<your-password>",
"method": "aes-256-cfb",
"local_address": "0.0.0.0",
"local_port": 1080
}


当然,也可以把配置文件在本地写好,再上传树莓派:

1
2
3
4
# 本地上传
scp ~/Raspberrypi/jiasd.json pi@192.168.1.108:./
# 在树莓派上将配置文件移动到相应目录
sudo mv ~/jiasd.json /etc/shadowsocks-libev/jiasd.json


检查默认端口占用,通常SS安装完成后会自动使用默认配置(/etc/shadowsocks-libev/config.json)启动ss-server进程,因此8388端口通常会被占用。
而我们在树莓派上使用SS仅仅是为了加速,因此不需要启动ss-server:

1
2
3
4
# 测试端口连通性
nc -zv 127.0.0.1 8388
# 或检查进程占用端口
netstat -nap | grep 8388

停止默认ss服务端:

1
2
3
4
5
6
7
8
# 检查ss默认系统服务
systemctl list-unit-files # 或 systemctl -a
# 检查ss服务状态
systemctl status shadowsocks-libev.service
# 停止服务
sudo systemctl stop shadowsocks-libev.service
sudo systemctl disable shadowsocks-libev.service
systemctl status shadowsocks-libev.service

启动ss客户端:

1
2
3
4
# 后台
nohup ss-local -v -c /etc/shadowsocks-libev/jiasd.json &
# 或前台
ss-local -v -s <your-remote-server> -p <your-remote-server-port> -l 1080 -k <your-password> -m aes-256-cfb

测试ss客户端的socks5是否正常:

1
curl -I --socks5 localhost:1080 google.com

停止ss客户端:

1
sudo kill -TERM 5914 && rm nohup.out

编写快捷脚本

启动脚本ss-s

1
2
sudo touch /usr/local/bin/ss-s
sudo chmod +x /usr/local/bin/ss-s

1
2
3
4
#!/bin/bash

nohup ss-local -v -c /etc/shadowsocks-libev/jiasd.json > ~/nohup.log 2>&1 &
echo $! > ~/ss-pid.txt

停止ss-t

1
2
sudo touch /usr/local/bin/ss-t
sudo chmod +x /usr/local/bin/ss-t

1
2
3
4
#!/bin/bash

kill -s TERM `cat ~/ss-pid.txt`
rm ~/ss-pid.txt

当然,也可以把配置文件在本地写好,再上传树莓派:

1
2
3
4
5
6
7
# 本地上传
scp ~/Raspberrypi/ss-s ~/Raspberrypi/ss-t pi@192.168.1.108:./
# 然后再修改文件属性并放置在相应目录下
chmod +x ss-s
chmod +x ss-t
sudo mv ss-s /usr/local/bin/ss-s
sudo mv ss-t /usr/local/bin/ss-t


2.4 proxychains-ng

ProxyChains是一个使用方便的代理工具,它只会代理指定的程序,下载:

1
2
mkdir misc && cd misc
git clone https://github.com/rofl0r/proxychains-ng

安装:

1
2
3
4
5
6
7
8
cd proxychains-ng/
./configure --prefix=/usr --sysconfdir=/etc
# 若是macOS下安装可能会遇到/usr/lib因SIP保护禁止写入的问题,需要更改配置为:
#./configure --prefix=/usr/local --sysconfdir=/etc
# ref: https://apple.stackexchange.com/questions/208764/cant-write-to-usr-lib
make
sudo make install
sudo make install-config

配置/etc/proxychains.conf,将最后一行修改为shadowsocks的端口:

1
socks5 127.0.0.1 1080

测试wget,返回网页源码:

1
proxychains4 wget -qO- https://www.google.com

3 安装科学计算环境

使用pipenv作为环境管理器:

1
sudo apt install -y pipenv

关于这个pipenv不得不说一下,要想在默认Python版本是3.7的buster上安装3.6的环境,你必须先sudo apt install python3.6,问题是不论3.6还是3.7的Python,其distutils包都不全,我也不知道这是bug还是buster特供版Python,反正pipenv没法正常的用buster中apt安装的版本运行。

要解决这个问题,对3.7来说还好办,sudo apt install python3-distutils就行了,通过dpkg -L python3-distutils查看就知道它在/usr/lib/python3.7/distutils里装了一些东西。要想让3.6也能正常用pipenv,只能手动sudo cp -r /usr/lib/python3.7/distutils/* /usr/lib/python3.6/distutils/了。

3 安装Python科学计算环境

注意:berryconda也只更新到python3.6,而新的raspbian buster已经自带python3.7了,所以下面的安装可以酌情考虑。

我习惯使用conda环境,因此下载了berryconda

1
proxychains4 wget https://github.com/jjhelmus/berryconda/releases/download/v2.0.0/Berryconda3-2.0.0-Linux-armv7l.sh

安装berryconda:

1
2
chmod +x Berryconda3-2.0.0-Linux-armv7l.sh
./Berryconda3-2.0.0-Linux-armv7l.sh

更新conda

1
proxychains4 conda update -y --all

新建名叫doa的环境:

1
conda create -n doa python=3.6

激活环境:

1
source activate doa

退出环境:

1
source deactivate

安装Numpy,需要比较长的时间:

1
conda install numpy

关于不使用pip而,使用conda进行安装的原因可以参考这里(简单的说,是由于编译选项问题导致conda安装的Python与pip安装的Numpy不兼容)。

最后,需要知道的一个坑,不知道为什么我的jupyter notebook不能正确的识别conda中已安装的环境,也就是新建的环境在笔记本中无法新建或者切换,我做了如下操作:

  1. 把笔记本的运行时配置/Users/<your-user>/Library/Jupyter/中的所有内容清空。
  2. 在新建的环境py36中手动添加,参考Conda environments not showing up in Jupyter Notebook
    Ask
    1
    (py36) ➜  ~ python -m ipykernel install --user --name py36 --display-name "Python (py36)"

总结

把安装conda前的操作汇总一下:

需要在本地执行的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 插SD卡,准备wifi和ssh
cp ~/Raspberrypi/wpa_supplicant.conf /Volumes/boot
touch /Volumes/boot/ssh

# 删除前一次的known-hosts指纹
ssh-keygen -R 192.168.1.108

# 上传本地秘钥
ssh-copy-id pi@192.168.1.108

# 上传更新源
scp ~/Raspberrypi/raspi.list ~/Raspberrypi/sources.list pi@192.168.1.108:./

# 上传SS配置
scp ~/Raspberrypi/jiasd.json pi@192.168.1.108:./

# 上传SS启停脚本
scp ~/Raspberrypi/ss-s ~/Raspberrypi/ss-t pi@192.168.1.108:./

# 上传proxychains配置
scp ~/Raspberrypi/proxychains.conf pi@192.168.1.108:./

需要在树莓派上执行的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 移动更新源
sudo mv ~/sources.list /etc/apt/sources.list
sudo mv ~/raspi.list /etc/apt/sources.list.d/raspi.list

# 更新树莓派
time sudo apt update && time sudo apt upgrade && time sudo apt dist-upgrade
# 清理
sudo apt clean

# 安装shadowsocks和vim
pip install shadowsocks
sudo apt install -y shadowsocks-libev vim

# 安装防火墙
sudo apt-get install -y ufw
# 更新防火墙策略
sudo ufw allow proto tcp to 0.0.0.0/0 port 22 comment "sshd listen port"
sudo ufw allow proto tcp to 0.0.0.0/0 port 5900 comment "vnc server listen port"
sudo ufw allow proto tcp to 0.0.0.0/0 port 1080 comment "Shadowsocks server listen port"
# 有时候需要用python -m http.server 8000传文件,开个口比较方便
sudo ufw allow proto tcp to 0.0.0.0/0 port 8000 comment "for python -m http.server 8000"
sudo ufw default deny
sudo ufw enable

# 关闭ss-server
sudo systemctl stop shadowsocks-libev.service
sudo systemctl disable shadowsocks-libev.service
systemctl status shadowsocks-libev.service

# 移动SS配置
sudo mv ~/jiasd.json /etc/shadowsocks-libev/jiasd.json
# 添加可执行权限
chmod +x ss-s
chmod +x ss-t
sudo mv ~/ss-s /usr/local/bin/ss-s
sudo mv ~/ss-t /usr/local/bin/ss-t

# 安装proxychains
mkdir misc && cd misc
git clone https://github.com/rofl0r/proxychains-ng
cd proxychains-ng/
./configure --prefix=/usr --sysconfdir=/etc
make
sudo make install
sudo make install-config
cd ~

# 移动proxychains配置
sudo mv ~/proxychains.conf /etc/proxychains.conf
分享到