最近业余有点空闲时间,入手了一台树莓派3B+,想业余时间架点服务,另外尝试一下连接一些外设玩玩。第一次玩,很多不清楚的,所以边玩边写下来。
一 硬件
目前最新的树莓派版本是3B+,今年3月发布,上一代是16年发布的。主要区别在于CPU 频率提升到了1.4G, 网卡升级到了1000M,支持5GWIFI, 蓝牙升级到4.2。
其他树莓派型号如下:
在淘宝上购入,包装非常简单,就一个纸盒子,连一个防静电袋都没没有。 裸机大概230左右。目前主要有E14(中国产)和RS(英国产)版本,网上看主要是产地的区别,配置和功能上没有任何区别。TB上E14稍微贵一点,我买的E14版本。
性能就不说了,博通BCM2873B0, 1G DDR2, 这个配置还比不上3年前的手机。 A53 64位4核,应该和高通S400差不多参数,但是性能就。。。
买回来家里的猫大爷就抱着啃了起来。
在淘宝上买了一个亚克力的盒子,2个散热片和一个风扇和电源。电源的话3B+需要5V/2.5A的电源,目前大多手机充电器或充电宝是2A。如果有2.5A以上电源头的就不需要买了。线的话手机充电的线就可以。插上电树莓派就启动了,所以我买了一个带开关的线。 树莓派本身发热不用风扇应该也行,不过目前三伏天,36,7度还是加上散热片和风扇比较好。
CPU上方的40针接口是GPIO接口(General Purpose Input Output),主要用来连接和控制外部设备的。如果风扇是5V的,那么接在PIN04和PIN06上。
二 连接设备
官网有一系列的Guide图文并茂很容易懂: https://projects.raspberrypi.org/en/projects/raspberry-pi-getting-started
树莓派3B+提供了比较充足的接口,4*USB2.0, HDMI,网卡,音频接口, 相机模块接口,GPIO。
树莓派接通电源后就启动了,所以要正常使用,在通电前要接入已经安装好系统的存储设备。 默认树莓派是使用TF卡作为存储,并且从TF卡中加载系统。所以要准备好一张TF卡并安装系统。接通电源后红色的电源指示灯亮,左边是磁盘读取的指示灯,在读写TF卡时会闪。
存储卡选择
树莓派IO性能还是比较弱的,3B+上对TF卡的写入速度上限在20-30M/S左右,随机读写2-3M/S (http://www.pidramble.com/wiki/benchmarks/microsd-cards),所以不必要选择很贵的高速卡。树莓派至少需要8G的TF卡,我建议至少16G以上。 我买的是三星EVO Plus 64G U3的卡。 写入速度64M, 随机写2M左右。 需要注意的是测试的读写速度是最高的读写速度,不代表持续,所以建议选择U3的卡,这个表示持续写速度在30M以上。
另外TF卡作为系统盘,读写次数是很多的。目前大部分TF卡都是TLC芯片,所以在长时间使用后可能会损坏, 如果对数据要求高的,可以考虑购买MLC芯片的TF卡。现在网上有专门给行车记录仪使用的TF卡,这种应该是MLC芯片,但是速度不知道。也有一些超高速卡应该也是MLC芯片(需确认)。另外的方法就是外接硬盘,把数据挂载到外接硬盘上或定期备份TF卡的数据。
三 系统安装
树莓派是64位 ARM芯片,官方的系统是 RASPBIAN,基于Debian系统。不过官方系统是32位的。 当然还提供了其他很多系统。除了这些之外还有一些他人移植的系统,比如Ubuntu,Windows 10 ARM等等。
第一次用,装一下官方系统体验一下。官方系统主要有2种安装方式,一种是使用NOOBS安装器,一种是制作安装镜像。官网有安装指引:https://www.raspberrypi.org/learning/software-guide/
NOOBS
NOOBS是一个树莓派系统的安装器,适合第一次使用树莓派或者对系统安装不太熟悉的用户,可以通过NOOBS安装不同的系统。网页上提供了NOOBS和NOOBS Lite 2个下载包。 区别在于Lite只有有安装器,而不包括系统,但是下载速度会很慢,所以建议直接下载NOOBS。
格式化TF卡
官方建议使用SD Formatter 4.0 对TF卡进行格式化,不过这里有个问题。如果你的卡是64G或以上,这个工具会格式化成extFAT格式,但是树莓派只支持FAT32格式的TF卡进行引导, 所以需要使用其他工具转格式化或转换为FAT32。 使用SD Formatter格式化时请选择 overwrite format, 否则引导时可能会提示你找不到FAT分区。 (一开始没有看官方引导,弄了半天,官方引导还是很详细)
系统安装
下载完成后解压出来之后,把文件夹内的所有文件拷贝到TG卡下面就可以了。然后TF卡插入到树莓派中,通电。 一切正常的话就可以进入到安装系统界面。第一个界面是系统选择界面,可能有一个或多个系统可以选择。 第一个是系统推荐的,带有桌面程序, 也可以选择没有桌面的Raspbian Lite版(下载的NOOBS好像还有2个系统,并没有Lite版本)。整个安装过程都是图形化界面,没有什么特别说的了。
系统配置
安装过程中可以设置位置、时区、wifi连接、系统更新等等(目前下载的系统好像不是最新的有更新)。另外可以设置用户密码,默认的用户是pi,默认密码是raspberry,可以修改成新的密码。如果使用中文汉字可能会显示乱码,需要下载中文字体,我没有使用桌面版,所以没有处理乱码的问题,需要处理的参考:https://blog.csdn.net/y511374875/article/details/73548195
镜像安装
使用NOOBS安装的系统后,SD卡中会多出一个receovery分区。这个分区有1.4G左右,保存了系统完整的镜像,用来恢复系统用的。 使用镜像安装和安装其他系统也差不多。先下载镜像文件,,这里就有Desktop和Lite版本可以选择。Lite版本只有命令行,没有桌面,但是内存占用非常下。我看了 一下,Desktop版启动后内存使用100M, 而Lite版只有28M。并且Lite版安装完只占用1G左右的空间,而桌面版差不多有4G, 如果使用NOOBS安装桌面版, 8G空间基本只剩下不到1G。 所以如果使用树莓派作为服务器的话建议使用Lite版,说实话桌面版也没什么可玩的。 命令行是第一生产力。
制作
制作镜像可以使用自己熟悉的工具,也可以使用官方推荐的Etcher,这个还是很方便也很简洁,windows和mac下都有。使用要安装系统的TF卡制作好安装盘之后,可以发现TF卡被分成了boot和root两个分区,root就是挂着/的分区,只有1G左右,TF还有很大的剩余空间没有被分区。 这个时候不需要自己分区,在安装系统的时候系统会重新调整root分区的。
安装
安装和NOOBS一样,插入TF卡,通电。 第一次启动后会显示 调整分区,调整完成后会重启。我装了几次碰到或重启后屏幕不亮的情况。断电在通电试试看。应该就可以了。Lite版安装比桌面版快的多。安装完成后直接进入命令行。提示你登陆,默认的用户是pi,默认密码是raspberry。 (树莓派现在也支持从硬盘和U盘的系统启动, 百度一下,之前在官网上看到过,现在一下找不到连接了)
系统配置:
登录后系统有提示你,没有设置国家,所以WIFI无法使用,可以使用raspi-config来进行配置。需要root权限
sudo raspi-config
显示的菜单大概是这个样子。回车是确定,ECS返回或退出。
- 进入Localisation Option中设置国家,区域,时区,键盘布局等 (注意一定要修改一下键盘布局,默认是英国布局,有些按键按出来是不对的。键盘类型可以不变或选择对应的,然后布局选other,修改成美国的,后面都选默认的就行了)
- 进入Network Options中可以设置WIFI,输入wifi的名字和密码,系统就会自动连接上wifi了
- 进入Interfacing Option中可以开启SSH\
- 进入Change User Password可以修改当前密码
- 设置wan
整个raspi-config用起来还是很方便,把这些设置的功能都包装起来了,不需要自己输入命令。上面设置完成后,如果成功连接上了WIFI,我们就可以通过SSH来远程控制树莓派了。
pi@raspberrypi-cc:~ $ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether b8:27:eb:89:27:b2 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:dc:72:e7 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.86/24 brd 10.0.0.255 scope global wlan0
valid_lft forever preferred_lft forever
inet6 fe80::efa4:b9e5:4ca4:9fd0/64 scope link
valid_lft forever preferred_lft forever
通过上面命令看到wlan0已经有了IP地址,就可以进行远程连接了。
四 系统设置
开启root账户
默认root账户是被禁用的,所以可以通过下面命令开启root账户
#设置root密码
pi@raspberrypi-cc:~ $ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
#启用root账号
pi@raspberrypi-cc:~ $ sudo passwd --unlock root
passwd: password expiry information changed.
#切换到root
pi@raspberrypi-cc:~ $ su root
Password:
root@raspberrypi-cc:/home/pi#
安装VIM
不太喜欢自带的vim.tiny和nano编辑器,安装标准的vim
pi@raspberrypi-cc:~ $ sudo apt install vim
更新软件
检查软件更新,用apt代替apt-get。
pi@raspberrypi-cc:~ $ sudo apt update
Hit:1 http://archive.raspberrypi.org/debian stretch InRelease
Hit:2 http://raspbian.raspberrypi.org/raspbian stretch InRelease
Reading package lists... Done
Building dependency tree
Reading state information... Done
22 packages can be upgraded. Run 'apt list --upgradable' to see them.
更新软件,速度很一般几十K到300K的速度,我可是300M的宽带啊。
pi@raspberrypi-cc:~ $ sudo apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
ca-certificates dpkg dpkg-dev file libdpkg-perl libmagic-mgc libmagic1 libpam-systemd libraspberrypi-bin
libraspberrypi-dev libraspberrypi-doc libraspberrypi0 libsystemd0 libudev1 patch raspberrypi-bootloader
raspberrypi-kernel shared-mime-info systemd systemd-sysv tzdata udev
22 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 80.2 MB of archives.
After this operation, 239 kB of additional disk space will be used.
Do you want to continue? [Y/n]
更换apt源
pi@raspberrypi-cc:~ $ sudo cat /etc/apt/sources.list
deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
pi@raspberrypi-cc:~ $ sudo cat /etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ stretch main ui
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspberrypi.org/debian/ stretch main ui
上面两个文件中的地址修改为:
sudo vim /etc/apt/sources.list
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
sudo vim /etc/apt/sources.list.d/raspi.list
deb http://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui
deb-src http://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui
#更新一下源
sudo apt update
更新后速度3M/S,秒下。
查看内存
目前没跑什么,只使用了38M。
pi@raspberrypi-cc:~ $ free -h
total used free shared buff/cache available
Mem: 927M 38M 196M 11M 692M 814M
Swap: 99M 0B 99M
交换分区只有99M,有点小。实际内存1G,交换分区也扩展到1G。准备修改fstab,结果发现备注写了,这里swap不是一个分区,请使用dphys-swapfile
pi@raspberrypi-cc:~ $ sudo cat /etc/fstab
proc /proc proc defaults 0 0
PARTUUID=5f2dcb49-01 /boot vfat defaults 0 2
PARTUUID=5f2dcb49-02 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
树莓派要修改swap是修改/etc/dphys-swapfile配置文件,修改下面配置,设置为1024
CONF_SWAPSIZE=100
重启dphys-swapfile服务后查看一下交换分区,大小已经变了(- -! 怎么1023)
pi@raspberrypi-cc:~ $ sudo service dphys-swapfile restart
pi@raspberrypi-cc:~ $ free -m
total used free shared buff/cache available
Mem: 927 39 194 11 693 813
Swap: 1023 0 1023
查看内存占用排序
ps -aux | sort -k4,4n
查看磁盘分区
pi@raspberrypi-cc:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 59G 2.1G 55G 4% /
devtmpfs 460M 0 460M 0% /dev
tmpfs 464M 0 464M 0% /dev/shm
tmpfs 464M 12M 452M 3% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 464M 0 464M 0% /sys/fs/cgroup
/dev/mmcblk0p1 43M 22M 21M 52% /boot
tmpfs 93M 0 93M 0% /run/user/1000
结合fstab和fdisk的信息, TF卡被分成了2个分区。其中mmcblk0p1
分区挂载到了/boot目录下,FAT32格式,而mmcblk0p2
分区挂载到了/ 根目录下,ext4格式。系统更新之后,目前只使用了2G空间。
pi@raspberrypi-cc:~ $ sudo cat /etc/fstab
proc /proc proc defaults 0 0
PARTUUID=5f2dcb49-01 /boot vfat defaults 0 2
PARTUUID=5f2dcb49-02 / ext4 defaults,noatime 0 1
pi@raspberrypi-cc:~ $ fdisk -l
Disk /dev/mmcblk0: 59.6 GiB, 64021856256 bytes, 125042688 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5f2dcb49
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 96663 88472 43.2M c W95 FAT32 (LBA)
/dev/mmcblk0p2 98304 125042687 124944384 59.6G 83 Linux
科学上网
有很多软件或代码被墙,所以必须能科学上网。 访问一下google,被墙。还好VPS已经搭建了Shadowsock,树莓派上也设置一下就可以上网了。
pi@raspberrypi-cc:~ $ wget www.google.com --2018-07-30 02:08:00-- http://www.google.com/ Resolving www.google.com (www.google.com)... 31.13.64.1, 2404:6800:4005:80d::2004 Connecting to www.google.com (www.google.com)|31.13.64.1|:80...
安装shadowsock客户端
最常用的shadowsock软件有用python写的shadowsock 和 c写的shadowsocks-libev
pip install shadowsocks
apt-get install shadowsocks-libev
cpan Net::Shadowsocks
我这里使用shadowsocks-libev
pi@raspberrypi-cc:/ $ sudo apt install shadowsocks-libev
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
apg libcork16 libcorkipset1 libev4 libmbedcrypto0 libsodium18 libudns0
The following NEW packages will be installed:
apg libcork16 libcorkipset1 libev4 libmbedcrypto0 libsodium18 libudns0 shadowsocks-libev
0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded.
Need to get 563 kB of archives.
After this operation, 1,664 kB of additional disk space will be used.
Do you want to continue? [Y/n]
安装后配置SS服务器信息,填入自己服务器的地址、端口和加密方式
# sudo vim /etc/shadowsocks-libev/config.json
{
"server":"0.0.0.0",
"server_port":10098,
"local_port":1080,
"password":"****",
"timeout":60,
"method":""aes-256-cfb""
}
shadowsocks-libev 支持服务端和客户端,默认是服务端,需要修改为客户端。标红的为修改的。如果不修改,会报错显示地址绑定失败。错误log可以去/var/log/syslog中看
#sudo vim /lib/systemd/system/shadowsocks-libev.service
[Unit]
Description=Shadowsocks-libev Default Server Service
Documentation=man:shadowsocks-libev(8)
After=network.target
[Service]
Type=simple
EnvironmentFile=/etc/default/shadowsocks-libev
User=root
Group=root
LimitNOFILE=32768
#ExecStart=/usr/bin/ss-server -c CONFFILEDAEMON_ARGS
ExecStart=/usr/bin/ss-local -c CONFFILEDAEMON_ARGS
[Install]
WantedBy=multi-user.target
启动客户端服务, 查看一下进程已经启动了。查看一下1080端口,也在监听中
sudo service shadowsocks-libev start
pi@raspberrypi-cc:~ $ ps aux | grep shadowsock
root 14983 0.0 0.1 4256 1004 ? Ss 01:54 0:00 /usr/bin/ss-local -c /etc/shadowsocks-libev/config.json -u
pi 14988 0.0 0.0 4372 536 pts/0 S+ 01:54 0:00 grep --color=auto shadowsock
pi@raspberrypi-cc:~ $ netstat -napt|grep 1080
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:1080 0.0.0.0:* LISTEN -的
但是这个时候还不能上,因为shadowsock是socks5代理,无法直接使用。所以使用polipo作为http二级代理,把http请求转发给ss-local然后在发送给VPS。
sudo apt install polipo
sudo vim /etc/polipo/config
配置文件增加
logSyslog = true
logFile = /var/log/polipo/polipo.log
proxyAddress = "0.0.0.0"
socksParentProxy = "127.0.0.1:1080"
socksProxyType = socks5
chunkHighMark = 50331648
objectHighMark = 16384
serverMaxSlots = 64
serverSlots = 16
serverSlots1 = 32
重启服务,并设置HTTP代理, polipo代理端口是8123
sudo service polipo restart
pi@raspberrypi-cc:~ export http_proxy="http://127.0.0.1:8123/"
pi@raspberrypi-cc:~ export https_proxy="http://127.0.0.1:8123/"
访问一下google
pi@raspberrypi-cc:~ $ wget www.google.com
--2018-07-30 02:06:48-- http://www.google.com/
Connecting to 127.0.0.1:8123... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’
index.html [ <=> ] 11.77K --.-KB/s in 0.05s
2018-07-30 02:06:48 (241 KB/s) - ‘index.html’ saved [12057]
如果不想用代理,清空代理就可以了。
pi@raspberrypi-cc:~ export http_proxy=
pi@raspberrypi-cc:~ export https_proxy=
为了方便开关科学上网简单些了个脚本:
#!/bin/bash
shadowsockOn(){
echo "Switch Shadowsock On"
sudo service shadowsocks-libev start
sudo service polipo start
export http_proxy="http://127.0.0.1:8123/"
export http_proxy="http://127.0.0.1:8123/"
}
shadowsockOff(){
echo "Switch Shadowsock Off"
sudo service shadowsocks-libev stop
sudo service polipo stop
export http_proxy=
export http_proxy=
}
if [ "1" = "on" ];
then
shadowsockOn
elif [ "1" = "off" ];
then
shadowsockOff
else
echo "Invalid param. Should be [off|on]"
fi
使用source执行脚本。参数是on或者off
source shadowsock.sh on