由于经常要折腾Raspbian,所以打算在这里汇总一下树莓派环境初始化要做的工作。
1 系统安装及配置
1.1 Headless下的WiFi及ssh配置
按树莓派官方说明在SD卡上写入镜像,然后进行Headless配置:
配置WIFI,需要在SD卡根目录下新建一个名为wpa_supplicant.conf的文件:
touch /Volumes/boot/wpa_supplicant.conf写入WIFI配置:
country=USctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdevupdate_config=1
network={ ssid="<YOUR-NETWORK-NAME>" psk="<YOUR-NETWORK-PASSWORD>"}开启SSH,只需在SD卡根目录下新建一个名为ssh的空文件即可:
touch /Volumes/boot/ssh或者直接将本地编辑好的wpa_supplicant.conf、ssh文件拷贝到SD卡上:
# 本地存储卡初始化cp ~/Raspberrypi/wpa_supplicant.conf /Volumes/boottouch /Volumes/boot/ssh配置完成后正常启动树莓派即可自动连接WIFI,SSH可以正常登录。
注:如果不知道设备IP,可以使用ping raspberry.local查找。
如果这个IP上曾经还有过其他树莓派前辈,那么要先删除本机上的ssh信任主机,比如我的树莓派一直用固定IP配在108上:
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问题:
sudo vi /etc/apt/sources.list修改sources.list,注释第一行,在最后添加国内镜像站:
deb http://mirrors.aliyun.com/raspbian/raspbian/ stretch main non-free contribdeb-src http://mirrors.aliyun.com/raspbian/raspbian/ stretch main non-free contrib也可以使用其他镜像站,比如:
# 中科大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,树莓派的软件包源仅有清华和中科大镜像:
sudo vi /etc/apt/sources.list.d/raspi.list注释第一行,在最后添加:
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui或者直接在树莓派上执行:
sudo sed -i 's#://raspbian.raspberrypi.org#s://mirrors.tuna.tsinghua.edu.cn/raspbian#g' /etc/apt/sources.listsudo sed -i 's#://archive.raspberrypi.org/debian#s://mirrors.tuna.tsinghua.edu.cn/raspberrypi#g' /etc/apt/sources.list.d/raspi.list如果嫌麻烦的话,上面这些需要配置的东西可以写成文件,再用脚本执行:
# 将本地编写好的配置文件拷贝到树莓派上scp ~/Raspberrypi/raspi.list ~/Raspberrypi/sources.list pi@192.168.1.108:./
# 树莓派上拷贝配置文件到相应目录sudo mv ~/sources.list /etc/apt/sources.listsudo mv ~/raspi.list /etc/apt/sources.list.d/raspi.list固件升级(谨慎操作,可能会踩到奇怪的编译坑):
sudo rpi-update && sudo reboot -h now软件包升级:
time sudo apt -y update && time sudo apt -y upgrade && time sudo apt -y dist-upgrade软件包清理,顺便装个vim和tmux:
sudo apt cleansudo apt install -y vim tmux我的tmux的配置只有一行set -g mouse on,可以将本地编写好的tmux配置文件上传到树莓派家目录,不需要再移动位置:
scp ~/Raspberrypi/.tmux.conf pi@192.168.1.108:./可以直接拷贝到树莓派上
2 搭建科学上网环境
2.1 安装SS
安装shadowsocks命令行客户端(推荐用pip和apt,快一些):
pip install shadowsockssudo apt install -y shadowsocks-libev# 或cpan安装# 更新CPANsudo cpan install CPAN# 重载CPANsudo cpan reload CPANsudo cpan Net::Shadowsocks2.2 配置防火墙
安装ufw以方便调整防火墙策略,其实是我不会用iptables:
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 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 denysudo ufw enable2.3 socks5代理
在/etc/shadowsocks-libev/xxx.json下配置科学上网服务器:
{ "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}当然,也可以把配置文件在本地写好,再上传树莓派:
# 本地上传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:
# 测试端口连通性nc -zv 127.0.0.1 8388# 或检查进程占用端口netstat -nap | grep 8388停止默认ss服务端:
# 检查ss默认系统服务systemctl list-unit-files # 或 systemctl -a# 检查ss服务状态systemctl status shadowsocks-libev.service# 停止服务sudo systemctl stop shadowsocks-libev.servicesudo systemctl disable shadowsocks-libev.servicesystemctl status shadowsocks-libev.service启动ss客户端:
# 后台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是否正常:
curl -I --socks5 localhost:1080 google.com停止ss客户端:
sudo kill -TERM 5914 && rm nohup.out编写快捷脚本
启动脚本ss-s:
sudo touch /usr/local/bin/ss-ssudo chmod +x /usr/local/bin/ss-s#!/bin/bash
nohup ss-local -v -c /etc/shadowsocks-libev/jiasd.json > ~/nohup.log 2>&1 &echo $! > ~/ss-pid.txt停止ss-t:
sudo touch /usr/local/bin/ss-tsudo chmod +x /usr/local/bin/ss-t#!/bin/bash
kill -s TERM `cat ~/ss-pid.txt`rm ~/ss-pid.txt当然,也可以把配置文件在本地写好,再上传树莓派:
# 本地上传scp ~/Raspberrypi/ss-s ~/Raspberrypi/ss-t pi@192.168.1.108:./# 然后再修改文件属性并放置在相应目录下chmod +x ss-schmod +x ss-tsudo mv ss-s /usr/local/bin/ss-ssudo mv ss-t /usr/local/bin/ss-t2.4 proxychains-ng
ProxyChains是一个使用方便的代理工具,它只会代理指定的程序,下载:
mkdir misc && cd miscgit clone https://github.com/rofl0r/proxychains-ng安装:
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-libmakesudo make installsudo make install-config配置/etc/proxychains.conf,将最后一行修改为shadowsocks的端口:
socks5 127.0.0.1 1080测试wget,返回网页源码:
proxychains4 wget -qO- https://www.google.com3 安装科学计算环境
使用pipenv作为环境管理器:
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:
proxychains4 wget https://github.com/jjhelmus/berryconda/releases/download/v2.0.0/Berryconda3-2.0.0-Linux-armv7l.sh安装berryconda:
chmod +x Berryconda3-2.0.0-Linux-armv7l.sh./Berryconda3-2.0.0-Linux-armv7l.sh更新conda:
proxychains4 conda update -y --all新建名叫doa的环境:
conda create -n doa python=3.6激活环境:
source activate doa退出环境:
source deactivate安装Numpy,需要比较长的时间:
conda install numpy关于不使用pip而,使用conda进行安装的原因可以参考这里(简单的说,是由于编译选项问题导致conda安装的Python与pip安装的Numpy不兼容)。
最后,需要知道的一个坑,不知道为什么我的jupyter notebook不能正确的识别conda中已安装的环境,也就是新建的环境在笔记本中无法新建或者切换,我做了如下操作:
- 把笔记本的运行时配置
/Users/<your-user>/Library/Jupyter/中的所有内容清空。 - 在新建的环境
py36中手动添加,参考Conda environments not showing up in Jupyter Notebook Ask:
(py36) ➜ ~ python -m ipykernel install --user --name py36 --display-name "Python (py36)"总结
把安装conda前的操作汇总一下:
需要在本地执行的操作:
# 插SD卡,准备wifi和sshcp ~/Raspberrypi/wpa_supplicant.conf /Volumes/boottouch /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:./
# 上传tmux配置scp ~/Raspberrypi/.tmux.conf pi@192.168.1.108:./需要在树莓派上执行的操作:
# 移动更新源sudo mv ~/sources.list /etc/apt/sources.listsudo mv ~/raspi.list /etc/apt/sources.list.d/raspi.list
# 更新树莓派time sudo apt -y update && time sudo apt -y upgrade && time sudo apt -y dist-upgrade# 清理sudo apt -y autoremovesudo apt -y clean
# 安装shadowsocks、vim、tmuxpip install shadowsockssudo apt install -y shadowsocks-libev vim tmux
# 安装防火墙sudo apt-get install -y ufw# buster默认有两个iptables,选择老版才能和ufw兼容sudo update-alternatives --set iptables /usr/sbin/iptables-legacy# 更新防火墙策略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 denysudo ufw enable
# 关闭ss-serversudo systemctl stop shadowsocks-libev.servicesudo systemctl disable shadowsocks-libev.servicesystemctl status shadowsocks-libev.service
# 移动SS配置sudo mv ~/jiasd.json /etc/shadowsocks-libev/jiasd.json# 添加可执行权限chmod +x ss-schmod +x ss-tsudo mv ~/ss-s /usr/local/bin/ss-ssudo mv ~/ss-t /usr/local/bin/ss-t
# 安装proxychainsmkdir misc && cd miscgit clone https://github.com/rofl0r/proxychains-ngcd proxychains-ng/./configure --prefix=/usr --sysconfdir=/etcmakesudo make installsudo make install-configcd ~
# 移动proxychains配置sudo mv ~/proxychains.conf /etc/proxychains.conf