关键词:树莓派, Ubuntu, 网线, ssh, 静态IP
这天早上醒来突然发现自己的 MacBook Pro 连不上学校的无线网了。具体表现为
Wi-Fi has the self assigned IP address 169.254.xxx.xxx and will not be able to connect to the Internet.
而且这个问题仅在学校这个特定无线网络上发生,我的所有其他设备(手机,iPad 等)在此网络上都可以正常工作。而偏偏我的 MacBook Pro 不行(也就是说在除校园网以外的所有其他网络上,比如手机热点,MacBook Pro 均正常工作)。Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved
发生了这个问题,我的第一反应是电脑的毛病。尝试了网上针对这个问题的大部分解决方法,如:
以上方法均宣告失败。
所以做了两手准备,一方面接着尝试解决问题,另一方面开始怀疑问题并不出在我的电脑,而是学校的路由器。于是给学校发了邮件询问,并且同时准备把尘封已久(快两年了)的树莓派拿出来,做一个 Wi-Fi repeater(也叫 Wi-Fi extender)。
简单来说,就是:
MacBook Pro <~~~> Raspberry Pi 3B <~~~> Router
由树莓派接收路由器无线网络信号,并同时将网络分享给 MacBook Pro。当然,我也不知道这种方法是否能 work,只是觉得应该尝试一下。Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved
而要完成这个工作,首先就需要对树莓派进行配置。因为我的树莓派 3B 并没有配置显示屏或输入设备,只是一个光板,所以我寻求配置树莓派的方法就是用网线将树莓派与笔记本连接起来,通过 ssh(这也就是本文的内容)。这个方法两年前我第一次拿到树莓派的时候用 MacBook Pro 做过,当时也是磕磕绊绊勉强可以连,但现在是怎么也连不上了。好在我今年年初的时候因为对经典 ThinkPad 笔记本的执念,购入了一台旧 T420,并安装了 Lubuntu 系统,现在正好用来与树莓派进行连接。
如果不用网线直连树莓派和电脑,还有一个方法是手动配置使树莓派自行连接无线网,再通过网上 ssh 进行连接,但这个更麻烦,因为学校无线网使用的是 WPA2-Enterprise 安全标准,在配置树莓派中的 /etc/wpa_supplicant/wpa_supplicant.conf
文件的时候要填写的就不仅仅是网络用户名和密码了;SSID,phase1,phase2,各种参数都需要填写。我最后放弃了这个方案。
而要将树莓派通过网线与 Linux 笔记本直连,需要配置静态 IP。至于准备工作,我将通过硬件与软件两方面介绍:
硬件:
软件:
sudo apt install nmap
sudo apt install net-tools
sudo apt install dnsmasq
注:安装 ifconfig 是因为 Lubuntu 18.04 并不自带这个命令。另外对于 dnsmasq,安装后可能会有服务无法启动的报错信息,这是因为默认的 DNS 端口 53 是占用状态,冲突了。这个本文后面会解决。
推荐使用全新的系统,我树莓派上的 SD 卡还装着两年前的 Raspbian 系统,事后分析,我认为这是在配置树莓派时让我耗费了很长时候却依然无法成功的一个主要原因。所以我建议重新烧录一个系统。我选择的是 Raspberry Pi OS with desktop and recommended software - 2020-02-13,巧的是在我成功配置后的第二天,最新一版的 Raspberry Pi OS - 2020-05-27 就发布了。不过本文操作应该不会受影响。
烧录新的系统,我使用的是 Etcher。在烧录成功后,会有两个分区,boot
和 rootfs
。
首先,我们要在 boot
分区中新建一个空白文件,名为 ssh
,不需要后缀名,也不需要内容,这个空白文件的作用就是在树莓派通电启动时告诉 OS 打开 ssh 服务,因为默认该服务是关闭的。
接着我们需要为 Pi 配置静态 IP,这里我选择的是 A 类私有地址 10.42.0.x。
在命令行中打开树莓派的 rootfs
,修改 etc/dhcpcd.conf
(sudo vim etc/dhcpcd.conf
),将 44-48 行的 Example Static IP configuration 去掉注释,改成下面的格式:
# Example static IP configuration:
interface eth0
static ip_address=10.42.0.64/24
static routers=10.42.0.1
static domain_name_servers=10.42.0.1 8.8.8.8 fd51:42f8:caae:d92e::1
保存更改并退出 Vim,SD 卡此时也可以推出系统了,我们不需要再在 Pi 的系统文件里做更多设置。Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved
首先我们要解决 dnsmasq 的配置问题。因为默认的 53 端口是占用状态,dnsmasq 并不能成功启动(使用 systemctl status dnsmasq
查看 dnsmasq 当前运行状态)。
所以我们首先去修改一下系统的 Host 文件(sudo vim /etc/hosts
),在 127.0.0.1 下面添加一行:
127.0.0.1 localhost
10.42.0.1 dnsmasq
这里 dnsmasq 对应的 IP 就是之前在 Pi 中设置的 routers 的 IP。保存修改后退出 Vim。
接下来修改 dnsmasq.conf(sudo vim /etc/dnsmasq.conf
):
首先是第 10 行,取消注释,将端口号设置为 5353:
port=5353
接下来取消第 111 行的注释,改为如下 2 行:
listen-address=127.0.0.1
listen-address=10.42.0.1
接着重启 dnsmasq 服务(sudo /etc/init.d/dnsmasq restart
),这回应该就能顺利启动了,然后我们关闭 dnsmasq 服务(systemctl stop dnsmasq
)Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved
虽然我认为 Ubuntu 及其衍生系统默认已经安装了 Network Manager(就是系统设置中的网络),但对于特殊情况,这里还是补充一下安装 Network Manager 的命令:sudo apt install network-manager
。Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved
我们需要修改的文件是 NetworkManager.conf(sudo vim /etc/NetworkManager/NetworkManager.conf
),在 [main] 后面添加 DNS=dnsmasq
:
[main]
DNS=dnsmasq
plugins=ifupdown,keyfile
保存修改后退出 Vim。接着重启电脑。
注:这里对于不重启电脑而选择 重启 dnsmasq 服务 + 重启 Network Manager(sudo service network-manager restart
)的方案,我并不清楚是否有效。所以还是建议直接重启电脑。
重启后点击网络设置,选择新建有线连接,将 IPv4 设置中 DHCP 改为 “分享给其他电脑”:Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved
保存修改。
将树莓派通电开机,并用网线将 Pi 和电脑连接起来,等待一会后应该会提示刚刚建立的有线连接已经连接成功。
我们可以使用 ifconfig
查看当前的有线连接状态,我们关注的应该是名为 enp0s25
或是 eth0
的项:
enp0s25: [...]
inet 10.42.0.1 netmask 255.255.255.0 broadcast 10.42.0.255
inet6 [...]
[...]
可以看到这个 IP 就是我们为树莓派设置的路由地址,接下来我们就需要确认树莓派本身的 IP 地址,不出意外的话应该是 10.42.0.64
:
# 使用 nmap 查找树莓派的 IP 地址
$> nmap -sn 10.42.0/24
Starting Nmap 7.80 (https://nmap.org) at 2020-05-29 16:31 PDT
Nmap scan report for dnsmasq (10.42.0.1)
Host is up (0.015s latency).
map scan report for 10.42.0.64
Host is up (0.015s latency).
Nmap done: 256 IP addresses (2 host up) scanned in 2.30 seconds
可以看到找到了 10.42.0.64
,于是我们 ssh 过去:
$> ssh [email protected]
成功连接!至此本文结束。
[1] https://stackoverflow.com/questions/16040128/hook-up-raspberry-pi-via-ethernet-to-laptop-without-router#answer-54374837
[2] https://graspingtech.com/dnsmasq-ubuntu-18-04/
(Copyright © https://blog.csdn.net/s_gy_zetrov. All Rights Reserved)