跳到主内容

树莓派无显示屏安装配置

之前还没有 HDMI 显示屏没有路由器,但是需要把一个树莓派设置起来,于是就有了这篇文章。

注:无显示屏也被称作 headless(无头?),搜索时可尝试这样搜。

需要的工具

  • 一个支持 USB Tethering 的手机。

  • 网线连接的网络(因为树莓派的无线网卡用来开热点了,不能连 WiFi)。

步骤

准备 TF

按照一般的树莓派安装系统流程配置好 TF 卡。 在 TF 卡的第一个分区(Windows 下也只能访问到第一个分区)里创建一个名为 ssh 的文件。

准备手机 SSH 客户端

ConnectBot 看起来会出错。 总之用了 JuiceSSH。

开机连接

把树莓派开起来,用手机通过 USB 连接连上树莓派,开启 USB Tethering。 如果手机能够访问 /proc/net/arp 这个文件的话,就看看这个文件的内容找到树莓派的 IP 地址。 (如果不行的话,那就只能找个扫描 IP 地址的工具软件了,印象中 F-Droid 上是有的。)

通过先前下载的手机端 SSH 客户端登陆到树莓派。

设置树莓派热点

$ sudo apt update
$ sudo apt install git screen hostapd
$ git clone https://github.com/garywill/linux-router.git
$ cd linux-router
$ screen  # 下面的设置只是我个人的偏好,请自行查阅 GNU Screen 的相关内容
$ echo "screen -RR" >> ~/.bashrc

开启热点:

$ sudo ./lnxrouter --ap wlan0 <WiFi名称> -p <WiFi密码>

电脑连 SSH

电脑连上热点,手机的 Tethering 暂时还别断。 此时如果你用的是需要各种网页来登陆的网络(如校园网),那么你需要自己寻找一个登陆脚本,这里不细说。

现在基本的网络已经好了:

  • 树莓派提供一个热点以方便接入(在不知道有线网络 IP 地址的情况下)。

  • 树莓派连接有线网络,如果校园网提供公网地址(IPv6 也行)就更加方便了。

看看有没有公网地址 IPv6

$ ip addr list

找到树莓派 IPv6 地址后,电脑可以断开热点,连接校园网测试连接。

持久化配置

校园网登陆

持续连接

过一段时间登陆一下,避免一些校园网的超时踢出机制。

$ sudo crontab -e

不用 sudo 也行,但是会需要 sudo loginctl enable-linger <用户名> 设置一下 linger。

开机自动连接

需要用到 systemd 配置。这里不多介绍:

# /etc/systemd/system/some_net.service
[Unit]
Description=Login
After=network.target nss-lookup.target

[Service]
Type=oneshot
WorkingDirectory=工作目录
ExecStart=执行的登陆命令

[Install]
WantedBy=multi-user.target

然后就是熟悉的 systemd 命令了:

$ sudo systemctl daemon-reload
$ sudo systemctl start tunet.service
$ sudo systemctl status tunet.service
$ sudo systemctl enable tunet.service

自动开启热点

[Unit]
Description=Lnxrouter Hotspot
After=network.target nss-lookup.target

[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/home/pi/linux-router/lnxrouter --ap wlan0 <WiFi名称> -p <WiFi密码>

[Install]
WantedBy=multi-user.target
$ sudo nano /etc/systemd/system/lnxrouter.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable lnxrouter.service
$ sudo reboot

常见设置

SSH 配置

不多说,见 link://slug/linux-maintenance 。

国内镜像

https://mirrors.tuna.tsinghua.edu.cn/help/debian/

删除 swap 文件

$ sudo nano /etc/dphys-swapfile
$ sudo dphys-swapfile swapoff
$ sudo dphys-swapfile uninstall
$ sudo systemctl disable dphys-swapfile.service

风扇等外设

呼吸灯

用于确认存活状态。

$ sudo apt install python3-gpiozero
$ mkdir scripts
$ nano scripts/breathing.py
$ chmod a+x scripts/breathing.py
$ sudo nano /etc/systemd/system/breathing.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable breathing.service
$ sudo systemctl start breathing.service
#!/bin/python3
from gpiozero import OutputDevice
from time import sleep
import signal
import sys

# 编号见 https://pinout.xyz/ 的 GPIO N
led = OutputDevice(4)

def cleanup(sig = None, stack = None):
    led.close()
    print("Exiting")
    sys.exit(0)

signal.signal(signal.SIGTERM, cleanup)

try:
    while True:
        led.off()
        sleep(2)
        led.on()
        sleep(2)
except KeyboardInterrupt:
    cleanup()

风扇

先略过。

防火墙

不多说,见 link://slug/linux-maintenance 。

定时关机

毕竟很多学校都会定时断电,所以需要在断电之前让树莓派自动关机。 使用 cron:

# 周五、周六晚不断电
40 23 * * SUN-THU /sbin/shutdown -P -h +10

限制日志大小

/etc/systemd/journald.conf 里设置 SystemMaxUse=128M ,然后重启 systemd-journald.service

/tmp

神奇的是似乎树莓派没有默认挂载 /tmp ,需要手动设置:

编辑 /etc/fstab 加入 tmpfs /tmp tmpfs defaults,noatime 0 0

mitigations=off

暂时没有用。其实也有安全风险。

Watchdog 开启

Watchdog,也译作看门狗,总之就是在系统无响应的时候自动重启的一个功能。 时间可以自己选择,但不要超过 15 秒(硬件最多支持到 15 还是 16 秒左右)。

编辑 /etc/systemd/system.conf ,把 RuntimeWatchdogSec 一行改为 RuntimeWatchdogSec=15RebootWatchdogSec 也需要改。 设置完后 sudo systemctl daemon-reload 即可。

自动上传 IP 到 Neocities

注册一个 Neocities 账号,打开网页 https://用户名:密码@neocities.org/api/key 获取一个 API Key:

API Key 就是输出里的类似 da77c3530c30593663bf7b797323e48c 的一串东西:

{
  "result": "success",
  "api_key": "da77c3530c30593663bf7b797323e48c"
}

脚本:

#!/bin/sh
while true; do
    if ping baidu.com -c 1 -W 3; then
        break
    fi
    sleep 1
done

ip=$(ip -6 addr list dev eth0 | grep inet6 | awk -F" +|/" '{print $3}' \
    | grep -v '^fe80')
echo "$ip @ $(date)" > /tmp/ip
curl -H "Authorization: Bearer 这里填上你的APIKey" \
     -F "ip.html=@/tmp/ip" "https://neocities.org/api/upload"

然后和前面一样,弄个 SystemD 自启以及 Crontab 就可以了。

Caddy

# apt install -y debian-keyring debian-archive-keyring apt-transport-https
# curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
# curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
# apt update
# apt install caddy libnss3-tools
# nano /etc/caddy/Caddyfile
# systemctl restart caddy.service

Cloudflare Algo Tunnel

下面的命令大概有点问题,暂时懒得回忆之前具体执行了什么命令了。

# mkdir -p --mode=0755 /usr/share/keyrings
# curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

# # Add this repo to your apt repositories
# echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bullseye main' | tee /etc/apt/sources.list.d/cloudflared.list

# # Install cloudflared
# apt-get update && apt-get install cloudflared

$ cloudflared tunnel login
$ cloudflared tunnel create 名称
$ nano /home/pi/.cloudflared/config.yaml
$ cloudflared tunnel route dns 对应的UUID 对应的域名
$ cloudflared tunnel run 名称

# cloudflared --config .cloudflared/config.yaml service install
# cloudflared --config /etc/cloudflared/config.yml service install

评论

This one-pixel image serves as a page view tracker and nothing more. This feedback keeps me motivated, because very few people ever comment.