1. 树莓派 4B 开机连接指定网络 headless ?
至于为什么没有尝试headless进入系统进行配置。那是因为这篇博客是我好几天的总结,期间刷了好多次镜像系统。当我终于能headless进入系统时,我还对systemctl一无所知。当我知道systemctl能设置自启动服务时,我发现cloud-init所谓的headless对我没有什么用。又因为我是可以偶尔使用一下显示器的,只是不能常连着。所以就没有在从头再进行检验。由于我水平一般,能力有限,本文不可避免会有各种各样的错误。当然,我也深知小白被卡住时的愤怒。但我希望如果您根据我的过程走,被卡住了,先别骂我。您可以先回复我,我期待与您交流:-)。
1.网上的一些误导和我的解决办法
1.1 对cloud-init的误导。
Ubuntu官方网站胡说八道,我是没想到的。不知道它是否历史上可行,但现在是没用了。这篇名为Raspberry Pi Imager。ubuntu系统可尝试sudo apt install rpi-imager安装。
b. 下载镜像系统,我这里选择ubuntu 20.04 server,因为反正不用屏幕,不需要图形化界面。在这里选择要烧写的镜像Install Ubuntu on a Raspberry Pi。
我选择ubuntu-20.04.4-preinstalled-server-arm64+raspi.img.xz。而ubuntu-18.04.5-preinstalled-server-arm64+raspi4.img.xz 已经不能装在raspberry pi 4上了,启动会报错。
c. 根据1.1节的图片内容,烧写即可。
2.2 headless连接树莓派
烧写好后插卡开机,死等。死等是不可跳过的,因为要等cloud-init初始设置成功。注意死等一段时间,再重启。重启后,在手机的模拟终端APP里或adb shell里多次执行ip neigh,查看已连接设备ip。一旦有一个新ip出现了,就是树莓派来了。此时在主机终端上用这个ip可登录ssh。
ssh <你设置的username>@<树莓派ip> <密码>
树莓派的ip动态变化的话(理论上每次开机都可能变化),ssh登录时可能会触发主机的警觉。输出一堆警告,注意看,复制这堆警告里面的一个命令执行下即可。大概意思是我知道了,我不怕被骗。此时我实在记不清那个命令了,见谅。
到此为止,已经能通过ssh在主机上访问树莓派了。
2.3 ssh进入树莓派,进行系统配置。
a. 禁用cloud-init
因为我们要自己写自启动服务,就不需要cloud-init服务了。禁用即可,如下:
sudo touch /etc/cloud/cloud-init.disabled
参考网页:How to disable cloud-init in Ubuntu
注意,文章里面教的删除cloud可能会出错,进不了系统。
禁用了cloud-init后,就需要自己写一个开机自启动服务,以确保开机后登录系统前,树莓派能连接指定wifi。这样才能无需显示器,使用ssh连接刚开机的树莓派。在介绍怎么创建自启动服务前,先看一个需要用到的命令。
b. 安装nmcli
这个是自启动服务所调用的脚本里,需要用到的命令。手机打开数据,联网安装软件(若只是使用ssh登录树莓派,则无需热点开流量)。
参考网页:Linux命令行连接WiFi(全网最简单的方法) - 简书
#安装nmcli
sudo apt install nmcli
#查看网络设备
sudo nmcli dev
#打开wifi
sudo nmcli r wifi on
#扫描wifi
sudo nmcli dev wifi
#连接wifi
sudo nmcli dev wifi connect "wifi名" password "密码"
c. 配置启动服务
参考网页:Use systemd to Start a Linux Service at Boot (通过一个开机自启动服务来连wifi。找了很多资料跟着做,只有这个成功了。)
注意,这些步骤都是通过ssh在树莓派上做的。
第一步:写一个连接wifi的脚本。若熟悉bash的,可以写的很复杂,加入判断、选择等等。以便让你在合适的地方(比如上班的地方、家里、常去的奶茶店),能接上合适的wifi。不过下面这种每条后面加一个 &&exit0 的写法已经可以解决大多问题了,即只要能连上一个就退出。比如,将上班地点的wifi写第一个,手机热点写第二个,下班时连不上第一个,自动会尝试连第二个。重点是,只要服务配置正确,就算一个没连上也不会损坏系统。
创建文件 test_service.sh
#注意换成你自己的wifi名和密码
#也许你会需要 打开wifi 和 扫描wifi ? 反正我没有用到。
#打开wifi
#sudo nmcli r wifi on
#扫描wifi
#sudo nmcli dev wifi
#连接wifi
nmcli dev wifi connect "wifi1" password "密码1" && exit 0
nmcli dev wifi connect "mi9" password "password:-)" && exit 0
#nmcli dev wifi connect "wifin" password "密码n" && exit 0
第二步:将这个脚本复制到/usr/bin,给它可执行权限。
sudo cp test_service.sh /usr/bin/test_service.sh
sudo chmod +x /usr/bin/test_service.sh
第三步:创建一个Unit file来定义我们的系统服务
创建文件: /lib/systemd/system/myservice.service
[Unit]
Description=Example systemd service.
[Service]
Type=simple
ExecStart=/bin/bash /usr/bin/test_service.sh
[Install]
WantedBy=multi-user.target
第四步:复制Unit file到/etc/systemd/system,给相应权限
sudo cp /lib/systemd/system/myservice.service /etc/systemd/system/myservice.service
sudo chmod 644 /etc/systemd/system/myservice.service
第五部:开启服务,然后查看一下状态
sudo systemctl start myservice
sudo systemctl status myservice
有错的话,比如文件不存在等等,会显示出来。要修改好。没错的话,输出格式大概如下:
我第一次操作时可能有小错,输出格式与此不同,但也不影响自启动。后来,第二次操作,格式就相似了。
第五步:用enable命令让这个服务能自启动。
确认好后,就是最重要的一步了。
sudo systemctl enable myservice
最后,检查再三,确认无误后就可以重启了。
sudo reboot
因为禁用了cloud-init重启会快很多。
用模拟终端APP或ADB等待,过一会运行下 ip neigh。等待树莓派的ip变成REACHABLE(同时一定要测试连ssh)。若一直变不过来且ssh连不上,就说明服务配置失败了。此时若真的没有显示器,就只能从烧写刷镜像开始重做了。若能用一下显示器,则可接入显示器、键盘,输入用户名、密码进入系统查看服务状态。
sudo systemctl status myservice
检查服务状态,正常的话,英文翻译过来大致应该是类似“成功执行,已结束”的状态。错误的话,根据具体错误修改。若想从写脚本开始,重做一遍配置服务,除了删除自己创建的所有文件外,还要
sudo systemctl disable myservice
这样才能删除系统创建的服务文件,一般是一个可执行的myservice文件。
2.4 一些其它的补充
若配置成功则可以愉快的使用ssh连接树莓派了。为了能更愉快的使用树莓派,还有两个小技巧。
一是:通过scp命令在主机、树莓派之间传文件。
#Ubuntu主机终端执行,注意不是在ssh登录后的窗口执行
#从树莓派复制文件 scp <你的树莓派用户名>@<树莓派ip>:/etc/apt/sources.list /home/<你的主机用户名>/
#修改源 gedit /home/<你的主机用户名>/sources.list
#复制文件到树莓派 scp /home/<你的主机用户名>/sources.list <树莓派username>@<树莓派ip>:/home/<你的树莓派用户名>/ #在登录树莓派后的ssh窗口执行 sudo cp /home/<你的树莓派用户名>/sources.list /etc/apt/sources.list
#更新 sudo apt update sudo apt upgrade
二是:源的选择。
不管选择哪家的源,都要跟系统和CPU架构匹配。比如树莓派4B的架构是arm64,安装ubuntu20.04 server版,选择的清华源如下:
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse