
除了好玩, 和学习, 我在想, 它到底能干什么? 我觉得最重要特点就是: 他是一台小的linux系统。可以24小时开。它不费电。
程序员折腾学习树莓派指南
今天升级树莓派,不知道哪里做错了,无法开机。于是只好重新开始折腾pi。正好。把整个过程整理下来。看看pi这个程序员的高级玩具现在有哪些新花样。
刚好这些天在学习IPv6。于是就把pi做为一个IPv6的实验场。
目标如下:
- nginx
- dns
- unbound
- dnscrypt-proxy
- iptables
- kodi
- pi-hole
安装树莓派。
下载最新buster版。用键盘显示器网线连接。
登录默认账号密码为:pi/raspberry
运行sudo raspi-config打开ssh。这样即可通过远程连接树莓派了。
buster版本的新特性是更新时自动寻找快速的镜像。不用换源了。
使用清华的镜像:
https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/
https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/
- apt update
- apt upgrade
- apt dist-upgrade
安装必要的软件:
apt install kodi
安装常用命令。
apt install dnsutils # 可以使用nslookup, dig,等命令。
- dig
- ping6
- traceroute
- nslookup
- systemctl list-sockets
- grep -V “^#” a.file | more # 去除注释展示一个文件。
- curl -x socks5h://127.0.0.1:1080 http://a.web.com/
- route
- ipset
- iptables
- ip6tables
- ip addr
- dmesg
安装3.5寸屏驱动:
git clone https://github.com/goodtft/LCD-show.git
./LCD35-show
./LCD-hdmi # 换回使用HDMI接口。
apt install lightdm
apt install nmon
安装图形界面(从lite到desktop)
apt-get install raspberrypi-ui-mods
重要的文件:
- /boot/cmdline.txt
- /boot/config.txt
- /etc/dhcpcd.conf # 这里是最新的IP获取方式
- /etc/sysctl.conf # 这里存放的是内核参数
- /etc/rc.local # 这里放一些启动的命令
他其它可以做的事情:
智能家居
智能家居肯定是未来的趋势,但那还会是在未来。也许3-5年,也许30-50年之后。现在用树莓派来管理智能家居?还需要很多的创造力和想象力。
电视盒子
安装kodi。这个功能实用。
私有云: nextcloud
当然可以安装私有云。但pi的处理速度太慢。于是我把云牵到了VPS上。
下载管理
aria2。由于放弃了NAS和nextcloud。所以这个功能也放弃了。打算把这个功能移到安装了openwrt的路由上去。这样移动硬盘的单独供电问题就解决了。必定路由器的电源功率高些。
aria2c 只要一条命令即可下载。问题的关键在于:你要输入很多参数。
aria2c -d /root/download/ "https://swupdate.openvpn.org/community/releases/openvpn-install-2.4.7-I607-Win10.exe"
于是,你可以把这些参数放到一个配置文件里。
/etc/aria2/aria2.conf
touch /etc/aria2/aria2.session
aria2c --conf-path=/etc/aria2/aria2.conf "https://swupdate.openvpn.org/community/releases/openvpn-install-2.4.7-I607-Win10.exe"
如果未指定配置文件位置,则会去寻找~/.aria2/aria2.conf
使用界面的远程下载时,要启动aria2c为守护进程模式。这样它可以接收远程的RPC json串做为调用指令。
aria2c --enable-rpc -D # 可以把这个命令放到rc.local里
为了在系统开机时,即启动这个守护进程 。可以在他放到以下的位置里:
/etc/init.d
老式的系统进程会在这里。
/lib/systemd/system
新式的系统进程已经放到了这里面。
systemctl enable ss-libev-redir@config_11100 #@传递的是参数。可以指定不同的配置文件。
/etc/rc.local
这里可以放一些系统启动完全后执行的命令。
百度云下载插件
BT下载
使用BT如果没有速度的原因是:要想办法获得最新的tracker。
dnsmasq
dnsmasq用于过滤广告。DNS查询交给了unbound。同时使用dnscrypt-proxy做过DNS的备份。
server=127.0.0.1#5353
NAS
NAS功能经测试后,并不方便。原因如下:移动硬盘需要单独供电。使用派的电源会总是造成电量过低的问题。
除非使用2.5A的专用树莓派电源。
crontab
Python学习
Linux学习
热点
- dhcpcd:动态获得IP地址的,客户端。
- hostap:创建热点的
- dnsmasq:
- wpa_supplicant: 配置无线网卡的
可以把树莓派的WIFI配置成热点。对于热点,有两种工作方式:网桥模式和网关模式。网桥模式是直接把内网做扩展。网关模式则是把现有设备做成一个可以上网的网关。
apt install hostapd
配置热点,并启动。
hostapd -dd /etc/hostapd/hostapd.conf
使用dnsmasq配置DHCP。
配置路由转发规则。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
把路由器规则写入到rc.local
无线网卡
systemctl disable hostapd
/etc/dhcpcd.conf # 去掉wlan0的静态配置。
/etc/wpa_supplicant/wpa_supplicant.conf # 在这里配置无线的账号密码
网桥
网桥即虚拟交换机。网桥可以把两个网络连接成一个网络。如果要创建一个网桥,就可以把不同的物理设备添加到网桥里,同时需要建立一系列的配置文件来配置这个网桥。
apt install bridge-utils
当创建了网桥br0后,即可以把wlan0和eth0全部添加到这个网桥里。
The wlan0
and eth0
no longer have IP addresses, as they are now controlled by the bridge. It is possible to use a static IP address for the bridge if required。
ipset
ipset可以实现特殊的路由规则。
- ipset create dns4 hash:ip family inet
- ipset create dns6 hash:ip family inet6
- ipset create dns list:set
- ipset add dns dns4
- ipset add dns dns6
- ipset add dns4 192.168.1.1/32
- ipset add dns6 ::1/128
- ipset list dns6
- ipset distroy dns
iptables
路由表是由表,链,连接的状态,处理方式,网络接口组成的命令。
表: filter表、nat表、mangle表和raw表
链:INPUT OUTPUT FORWARD PREOUTING POSTOUTING
连接状态:established ,related,new
处理方式:drop | accept | reject
MASQUERADE : 动态的地址转换。
iptables -L # 查看现在路由规则。
- filter 定义允许或者不允许的,只能做在3个链上:INPUT ,FORWARD ,OUTPUT
- nat 定义地址转换的,也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
查看硬件信息
ls系列命令:lsusb,lsmod,lspci,lsof
ctl系列命令:systemctl,networkctl,bluetoothctl,brctl
cat系列命令:zcat,cat,netcat(nc)
网络的几个过程
/etc/network/if-pre-up.d/ # 网络在启动之前执行的角本,可以放一些路由规则。
PAN
利用蓝牙做网卡的技术。又名Personal Area Network. 可以制做Bluetooth network。最多支持7台客户端。最大下载速度700Kb/s。使用SSH连接足够。
树莓派的对外接口有:一个网口,4个USB口,一个WIFI,一个蓝牙,一个GPIO口。
需要安装如下包:
apt install bridge-utils bluez
apt-get install bluez-tools
bluetoothctl # 蓝牙管理工具
要点:
使用bluez-tools提供的工具管理蓝牙。使用bt-agent设置蓝牙为不用交互方式配对,并设置可被发现为1。使用bt-network设置蓝牙网络为NAP模式,即网关模式。创建pan0的网桥。当每一个设置连接蓝牙时即创benp*的设备,并把他加入网桥。
systemd-networkd
bnep0 & pan0
bnep*为每一台蓝牙所创建的网络。
pan0为网桥。是创建的一个虚拟设备。
三种模式
蓝牙网关工作有三种模式。
- NAP :网关模式。让蓝牙表现得像一台路由器。
- PANU :终端模式。让蓝牙表现得像一台客户端。
- GN:集线器模式。让蓝牙表现得像一台集线器。
操做步骤:
1 添加网络设备
/etc/systemd/network/pan0.netdev
[NetDev]
Name=pan0
Kind=bridge
2 添加网络
/etc/systemd/network/pan0.network
[Match]
Name=pan0
[Network]
Address=172.20.1.1/24
DHCPServer=yes
3 添加蓝牙管理
/etc/systemd/system/bt-agent.service
[Unit]
Description=Bluetooth Auth Agent
[Service]
ExecStart=/usr/bin/bt-agent -c NoInputNoOutput
Type=simple
[Install]
WantedBy=multi-user.target
4 添加蓝牙网络管理
/etc/systemd/system/bt-network.service
[Unit]
Description=Bluetooth NEP PAN
After=pan0.network
[Service]
ExecStart=/usr/bin/bt-network -s nap pan0
Type=simple
[Install]
WantedBy=multi-user.target
5 开启服务
sudo systemctl enable systemd-networkd
sudo systemctl enable bt-agent
sudo systemctl enable bt-network
sudo systemctl start systemd-networkd
sudo systemctl start bt-agent
sudo systemctl start bt-network
6 连接设备
bt-adapter --set Discoverable 1
问题排查
- arp -n
- ifconfig wlan0 down
- ip addr
- ip link
- ip link add br0 type bridge
- ip link set br0 up
- ping -6
- ping6
- route
- iptables
- ip6tables
问题描述:最后还是无法ping通网络,只能获取IP地址。
检查:ifconfig,route,iptables,arp,ping
怀疑的问题:mtrics为0是不是因为路由引起的?需要查看路由相关的知识。arp表未得到正确的mac地址?手动添加mac映射不成功。路由表里有两条目标为169.254.0.0的记录,会有问题么?是不是网桥建立的不正确?
可以做的尝试:ping不通目标地址可以做的事情?查看日志:dmesg,btmon。
纯手工做一次操作:
brctl addbr pan1
ifconfig pan1 192.168.222.1
bt-network -s nap pan1
连接蓝牙设备
brctl addif pan1 bnep0
最后问题依然没有解决。我决定暂时放置这个问题。如果高手知道原因,欢迎来指正。
配置路由:
route del -net 172.20.1.0/24 gw 0.0.0.0 pan0
iptables -t nat -A POSTROUTING -i eth0 -o pan0 -j MASQUERADE
Metric用于指出路由的成本。值越大代表路由成本越高。优先级越低。通过指定不同的Metric值可以指定两个以上的默认网关。
路由分为主机路由,网络路由,默认路由。
虚拟设备:tun,tap,bridge
蓝牙相关的包:
bluez
blueman
bluez-compat
rfcomm
树莓派使用串口联接
USB转TTL口。这样即可以使用PUTTY连接。
还有一种把蓝牙当成串口的神奇操做。
树莓派是程序员的高级大玩具。
4B型对比3B型有了更多的改进:双miniHDMI接口。三种内存容量选择1G,2G,4G。type-c供电。千兆网卡。支持WIFI5G。USB升级到了3.0。
使用树莓派的错误方法:
1 安装openwrt或LEDE。为什么不买一台路由器?
2 用树莓派来挖矿。挖矿是算力的竞争。以树莓派的运算力?那是来玩的吧?
3 network manager大家族:dhcpcd5
, dhclient
, dhcpcd
, networkmanager
, and systemd-networkd
. 网络管理的组件太多了。不要被这些插件弄错了。
rpi-update #请谨慎运行此命令。除非你十分清楚在做什么。
rpi-eeprom-update #请谨慎运行此命令。除非你十分清楚在做什么。
If your Raspberry Pi 4 will not boot, it is possible that the SPI EEPROM has become corrupted.
一些感受:
Things seem to have changed quite a lot recently.
网络上的技术更新迭代速度在加快。一些资料和文章可能还没有得到普及就已经有新的尝试方法手段出现。Linux世界里往往出现了在一定的框架下百花齐放的景象。一个功能有N种的软件去实现。新旧理念在不同的linux发行版本里自然的出现了共存,淘汰和新的尝试的现像。github的出现更让这些个人的软件有了一席之地。各种问题,各种想法,各种尝试都有被人去试过。一些不是最优化的作法可能被各个blog之间相互抄袭。
而一些重要的而正确的知识和想法很可能在某个角落里。硬件在进化,软件在进化。理念在进化。知识在成指数级的出现和堆积。而Linux在处理复杂系统,软硬件管理时表现出了一种十分优异的理念。处处体现着合理,规则和灵活的设置。
而在接触像路由,网络管理,蓝牙的演化,网关,DNS解析,IPV6等新的知识时。如何从一个感性认识到,了解系统的一个框架,到了解所有的重要方面,再到了解事情的一些小细节。再到遇到的困惑。每一步,每一次的尝试,都是探索的寻找的一个课题。
2年前的文章?已经有技术过时的可能了。
参考:
- https://www.home-assistant.io/
- https://www.w3cschool.cn/ipv6/
- https://www.w3cschool.cn/python/
- https://aria2.github.io/manual/en/html/aria2c.html
- https://wangchujiang.com/linux-command/c/iptables.html
- https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md
- https://elinux.org/Bluetooth_Network
- https://raspberrypi.stackexchange.com/questions/29504/how-can-i-set-up-a-bluetooth-pan-connection-with-a-raspberry-pi-and-an-ipod
- https://wiki.archlinux.org/index.php/Systemd-networkd
- http://blog.fraggod.net/2015/03/28/bluetooth-pan-network-setup-with-bluez-5x.html
- http://bluez.sourceforge.net/contrib/HOWTO-PAN
- https://hacks.mozilla.org/2017/02/headless-raspberry-pi-configuration-over-bluetooth/