1. 树莓派 4B 开机连接指定网络 headless ?


        丑话说在前面。我没有完全不用显示器(老外称其headless?),进行所有配置。但是我在不用显示器的情况下,可以连接ssh,进入系统。也做到了用显示器进入系统,然后进行以下所有配置。所以理论上是可以的。当然理论上可以的很多东西,实际是不可以的:-(。
        至于为什么没有尝试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