使用 Linux 进行 Raspberry Pi Headless 设置 [一步一步]
分步指南展示了如何在没有键盘和显示器的情况下安装 Raspberry Pi,即使用 Linux 进行 Raspberry Pi 的无头设置。
从 Linux 系统在 Raspberry Pi 上安装 Raspbian 并不是一件困难的任务。 Raspberry Pi 基金会提供了执行此操作所需的信息,除非您需要安装无头(也称为没有连接显示器和键盘)和无线(又称为通过 Wi-Fi)的 Raspberry Pi。而这恰好是我的情况。
我将在本教程中向您展示如何执行 Raspberry Pi 的无头设置。我还制作了一个步骤视频来帮助您了解实际情况。
无头设置 Raspberry Pi
我认为由于您要进行无头安装,因此您对 Linux 命令行有点熟悉,因为您将在这里广泛使用它。我在本教程中使用了 Debian Linux。
第 1 步:将 Raspberry Pi Foundation 下载签名密钥导入到您的密钥环中
由于我不喜欢在不检查其真实性的情况下安装软件,因此我们首先将验证 Raspbian 映像所需的密钥添加到您的 GPG 密钥环中。
截至今天,Raspberry Pi 基金会下载的签名密钥指纹为 54C3DD610D9D1B4AF82A37758738CD6B956F460C。 我强烈建议您使用其他来源进行交叉检查。由于密钥将于 2019 年 4 月 10 日到期,如果您在该日期之后阅读本文,则该日期将会有所不同。
gpg --recv-key 54C3DD610D9D1B4AF82A37758738CD6B956F460C
第 2 步:下载 Raspberry OS 映像及其签名
最新版本的 Raspberry OS(以前称为 Raspbian)始终可以在此地址获取。
但这只是一个重定向。您需要真实地址,以便下载图像和相应的分离签名文件。
最好的方法是使用一些高级的 curl
黑魔法:
URL=https://downloads.raspberrypi.org/raspbian_lite_latest
EFFECTIVE_URL=$(curl -w "%{url_effective}\n" -I -L -s -S $URL -o /dev/null)
echo $EFFECTIVE_URL
我必须承认,我总是很难记住该命令,因此对于交互式使用,我经常回退到一个简单的 wget
命令,其重定向计数有限:
URL=https://downloads.raspberrypi.org/raspbian_lite_latest
EFFECTIVE_URL=$(wget --max-redirect=0 $URL 2>&1 | sed -En 's/Location: ([^ ]*).*$/\1/p')
echo $EFFECTIVE_URL
(实际上,在这种特殊情况下应该是 --max-redirect=1
,尽管如此,仅经过第一级重定向就足以满足我们的需求)
此时,您已拥有下载图像及其分离签名所需的有效 URL:
wget "$EFFECTIVE_URL"{,.sig}
如果您的互联网连接像我一样不可靠,您可以考虑明确添加比默认 900 秒更激进的超时,就像我在录制视频时所做的那样)
第三步:检查签名
片刻之后,下载完成,当前目录中应该有这两个文件:
ls *raspbian*
2017-11-29-raspbian-stretch-lite.zip 2017-11-29-raspbian-stretch-lite.zip.sig
您现在可以使用 GPG 检查签名是否与文件相对应以及签名是否由您可以信任的机构颁发:
gpg --verify 2017-11-29-raspbian-stretch-lite.zip{.sig,}
gpg: Signature made Thu 30 Nov 2017 02:48:51 PM CET
gpg: using RSA key 8738CD6B956F460C
gpg: Good signature from "Raspberry Pi Downloads Signing Key" [full]
在此阶段,除了“Raspberry Pi 下载签名密钥”的良好签名以外的任何其他内容都应该警告您正在发生奇怪的事情。
作为满足我们好奇心的一个例子,让我们伪造该文件,看看在这种情况下 GPG 到底会报告什么:
# Add just one byte to the file
(cat 2017-11-29-raspbian-stretch-lite.zip; echo) > 2017-11-29-raspbian-stretch-lite.zip.fake
gpg --verify 2017-11-29-raspbian-stretch-lite.zip{.sig,.fake}
gpg: Signature made Thu 30 Nov 2017 02:48:51 PM CET
gpg: using RSA key 8738CD6B956F460C
gpg: BAD signature from "Raspberry Pi Downloads Signing Key" [full]
为什么我不使用 sha256 文件指纹?
您可能已经注意到 Raspbian 下载页面显示了文件的 sha256 校验和。您可以使用它来检查文件完整性以防止无害的下载错误。但是,在这种情况下,它不能用于检查文件的真实性。因此它不会保护您免受恶意行为的侵害。例如,如果攻击者破坏了存储 Raspbian 图像的服务器,则它有可能获得对 Web 服务器的控制权以显示他选择的 sha256 和。另一方面,GPG 签名将检查文件完整性及其真实性。
第 4 步:复制图像
一旦您确定 Raspbian 映像是正版映像,就可以将其复制到存储卡上。
但是,首先,您需要知道内核用来识别存储卡的设备名称。因此,请确保您的存储卡不在读卡器中。然后,在监视模式下启动 dmesg 实用程序:
sudo dmesg -w
现在,将卡放入读卡器中。此时,dmesg 显示有关该卡的一些信息,包括其设备名称:
mmc0: new SDHC card at address e624
mmcblk0: mmc0:e624 SC16G 14.8 GiB
mmcblk0: p1
在这里,您可以看到我的存储卡可以通过名称 /dev/mmcblk0
访问。目前它仅包含一个分区 (p1
),您可以通过 /dev/mmcblk0p1
进行访问。
如果您的 dmesg 版本不支持 -w 标志,请以相反的方式执行操作:首先将卡放入读卡器,然后使用 dmesg 查看消息。
有些系统可能会“自动挂载”您的卡,因此在进一步操作之前明确检查这一点会更安全:
sudo umount /dev/mmcblk0*
最后,是时候复制文件本身了:
unzip -p 2017-11-29-raspbian-stretch-lite.zip |
sudo dd of=/dev/mmcblk0 conv=fsync
复制文件可能会很长,因此,如果您的终端似乎挂起很长时间,请不要惊慌。
复制完成后,要求内核重新加载设备的分区表会更安全,因为它在此过程中已发生更改。这将避免稍后出现一些难以诊断的问题,导致您无法将存储卡分区安装到系统上:
sudo partprobe /dev/mmcblk0
步骤 5:启动时启用 ssh
要在启动时启用 SSH,您只需在卡启动分区上创建一个哨兵文件。文件的内容毫无意义。它必须存在。
sudo mount /dev/mmcblk0p1 /mnt -o umask=000
touch /mnt/ssh
第 6 步:启动时启用 Wi-Fi
wpa_supplicant 是您的计算机用来访问 Wi-Fi 接入点的软件。它预装在 Raspbian 上,但需要一些配置才能工作。
最基本的 wpa_supplicant.conf 文件仅包含您所在位置的国家/地区代码,以确保符合当地法规:
cat > /mnt/wpa_supplicant.conf << EOT
country=FR
EOT
根据您是否希望允许非 root 软件(例如 wpa_cli
)更改配置,您可以添加 ctrl_interface=...
选项,最后添加 update=1
选项允许非 root 客户端覆盖 wpa_supplicant.conf
以使更改永久生效。查看随附的视频以获取前者的示例,您可以在网络上轻松找到后者的示例。
最后,有关所有可能的配置设置的参考,请检查此处:
https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf
在所有情况下,您都需要添加必要的凭据,以便 wpa_supplicant
可以连接到接入点。我不喜欢将密码存储为纯文本,因此我将使用 wpa_passphrase
来做到这一点:
SSID=my_wifi # This is your Wi-Fi AP SSID (the "name" of your Wi-Fi)
(
# Disable echoing
stty_orig=$(stty -g);
trap 'stty $stty_orig' EXIT;
stty -echo;
# Read password from the terminal
read -rp 'Enter your password: ';
echo $REPLY
) | wpa_passphrase $SSID | sed '/^[[:space:]]*#/d' >> /mnt/wpa_supplicant.conf
我让你检查一下是否一切正常:
cat /mnt/wpa_supplicant.conf
如果没问题,只需卸载
该卡并将其从读卡器中取出:
sudo umount /mnt
第 7 步:启动开发板
您几乎已准备好启动开发板。
但要通过 SSH 访问它,您将需要它的 IP 地址。有不同的解决方案来获取该信息。您可以在板上使用静态 IP 地址。
或者,您可以检查 DHCP 服务器的日志,以识别与该板相关的租约(一旦板获得该租约)。
或者您可以使用 nmap
扫描整个网络。
在这里,我将使用 tcpdump,因为这侵入性较小且具有一定的教育意义。
因此,在启动开发板之前,在网络连接的计算机上启动 tcpdump
:
sudo tcpdump -lenqti any port 68 or arp | grep "^ B"
在这里,我要求 tcpdump
监视 DHCP(端口 68)和 ARP 相关流量。我采取了“懒惰”的方法来监听任何接口。这有一些缺点,例如无法直接从 tcpdump 过滤广播数据包,因此需要额外的 grep 进程。但这不应该是一个严重的问题,除非您有非常高的 ARP 和 DHCP 流量直接针对您的计算机。
数据包捕获工具准备就绪后,您现在可以启动开发板。几秒钟后,tcpdump
将捕获来自主板的一些流量。首先找到 DHCP 服务器,然后检查 DHCP 提供的 IP 地址是否可用,最后将自己通告为该 IP 地址的新所有者。
我强烈建议您观看视频的相应部分以观看活动直播。
确定开发板的 IP 地址后,您现在可以像往常一样通过 SSH 连接到它:
ssh pi@IP_OF_THE_BOARD
此时,主板仍在使用默认股票密码运行,因此更改它应该是您的首要任务之一:
passwd
您已经完成了:您的开发板已完全设置完毕,可以通过本地 Wi-Fi 网络通过 SSH 进行访问,并准备好执行您可能想要使用它执行的所有操作。但这是你工作的一部分!因此,请随时告诉我们您使用 Raspberry Pi 做了什么,以及您在设置过程中最终可能遇到的困难。并敬请期待更多!