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

        丑话说在前面。我没有完全不用显示器(老外称其headless?),进行所有配置。但是我在不用显示器的情况下,可以连接ssh,进入系统。也做到了用显示器进入系统,然后进行以下所有配置。所以理论上是可以的。当然理论上可以的很多东西,实际是不可以的:-(。
        至于为什么没有尝试headless进入系统进行配置。那是因为这篇博客是我好几天的总结,期间刷了好多次镜像系统。当我终于能headless进入系统时,我还对systemctl一无所知。当我知道systemctl能设置自启动服务时,我发现cloud-init所谓的headless对我没有什么用。又因为我是可以偶尔使用一下显示器的,只是不能常连着。所以就没有在从头再进行检验。由于我水平一般,能力有限,本文不可避免会有各种各样的错误。当然,我也深知小白被卡住时的愤怒。但我希望如果您根据我的过程走,被卡住了,先别骂我。您可以先回复我,我期待与您交流:-)。

1.网上的一些误导和我的解决办法

  1.1 对cloud-init的误导。

        Ubuntu官方网站胡说八道,我是没想到的。不知道它是否历史上可行,但现在是没用了。这篇名为《How to install Ubuntu Server on your Raspberry Pi》的文章,它第三节教你如何headless连ssh;更牛的是,第四节一本正经的教你,如何在局域网内查树莓派的地址。

        但根据我实际操作,得出的第一个结论是:只修改network-config文件,没用!你还得修改,user-data文件。
        第二个结论是:修改了user-data也没用!我知道stackoverflow的大牛说有用,还把模板发github上了。但我亲测无效。可能最新的树莓派系统方面有修改?
        第三个结论是:只能在烧写镜像的时候(用树莓派官方指定的软件),先选系统和tf卡。选好后会出现一个齿轮图标,点这个设置才有用(在这里指定手机热点的wifi)。

 

 

     等写好后,打开tf卡看看network-config文件和user-data文件内容。

#network-config
version: 2 wifis: renderer: networkd wlan0: dhcp4: true optional: true access-points: "mi9": password: "a218835c4d23401d004e590c410fba360d2c643710ef33b2eefc190baacc77b5"
#cloud-config
hostname: raspberrypi
manage_etc_hosts: true
packages:
- avahi-daemon
apt:
  conf: |
    Acquire {
      Check-Date "false";
    };

users:
- name: ubuntu
  groups: users,adm,dialout,audio,netdev,video,plugdev,cdrom,games,input,gpio,spi,i2c,render,sudo
  shell: /bin/bash
  lock_passwd: false
  passwd: $5$ECxCISJ7Bf$IrH/GAEr57L.RFd/cfm/xyUjZrN8Qy/AMBeX6IkygT3

ssh_pwauth: true

timezone: Asia/Shanghai
runcmd:
- sed -i 's/^s*REGDOMAIN=S*/REGDOMAIN=GB/' /etc/default/crda || true
- rm -f /etc/xdg/autostart/piwiz.desktop
- localectl set-x11-keymap "us" pc105
- setupcon -k --force || true

        原来network-config里的密码给你加密了。这点是直接修改network-config文件很难做到的吧?我亲测改回未加密密码,系统无法启动。另外,user-data文件也被做了修改。

        等这些做完后,通电开机,然后就是等。连上显示器的话,你会发现cloud-init在疯狂初始设置。等到你认为差不多了(难不成要十分钟?),然后尝试连下ssh(查ip的方法和ssh的用法下边有)。没连上是正常的,网上的说法是cloud-init第一次配置慢,等它好了,已经错过连wifi的时机了。解决方法就是关闭电源再打开,第二次启动树莓派,应该就正常了。

       1.2 对自启动服务的误导。

        自启动服务可用systemctl命令配置,我的建议是忘记rc.local。现在ubuntu系统默认都不带它了,网上还一堆自己创建这个文件的。更有甚者,用systemctl配置个自启动服务,还起它的名字。你明明可以就叫test.sh啊。关于用systemctl配置自启动服务,下边有介绍。

        1.3 对查看树莓派ip的误导

        headless的话,即使树莓派启动成功了,连上指定wifi了,你也是不知道它的ip的。当然让主机也连接指定wifi,查看主机ip,可以确定树莓派所在子网。然后《How to install Ubuntu Server on your Raspberry Pi》又胡说八道了,它让你用arp查看树莓派ip。我用arp -a只能看到网关地址。上网查了下,这个arp是查缓存记录。如果你是一台新买的树莓派,第一次连接指定wifi(即主机没和树莓派通信过),你查个什么缓存?
        树莓派官网上的一篇文章《Remote Access》就靠谱很多,它的几个方法总结起来就是查看路由器或者扫描端口。扫描端口的思想就是把子网里所有ip都尝试连接一遍(当然有工具的),显然太麻烦。查看路由器就是进入路由器配置页面,直接查看已连接设备的ip了,差不多像这样。

 

 

         可以查看连接这台设备的小米9的ip,另一个设备是有线连的电脑,就不看了。但,连显示屏都没有的你,会有路由器吗?:-)

        1.4 用手机做路由器 

        啥都没有的我们别忘了,我们还有手机。它开个热点就是路由器,打开数据就能让连接的设备上网。所以可以指定树莓派开机自动连接手机wifi。因为此时手机作为一个路由器,它有权查看已连接设备的ip。通过adb shell,输入ip neigh命令可以查看。更方便的是下载一个模拟终端APP,同样的ip neigh命令也可查看。

        模拟终端APP,大概像这样:

          打开后,大概像这样:

 

 

        adb shell,大概像这样:

 

        等树莓派启动成功,主机也连接指定wifi。以手机为跳板,借助查获的树莓派ip,主机可以通过ssh连接树莓派。

2. 开始实操

        2.1 刷入树莓派系统

        a. 根据主机系统,选择安装镜像烧写软件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

 

posted @ 2022-04-20 17:18  BrawlStarsFan  阅读(457)  评论(0编辑  收藏  举报