-
Notifications
You must be signed in to change notification settings - Fork 0
Jetson Nano 网络与 SSH
Jetson Nano 运行 Unbuntu 系统,可以说本身是一台功能完全的电脑。但实际开发过程中,Jetson 往往被部署在机器人上,即使要操作,也需要外接显示器、键盘、鼠标,因此,我们往往使用自己的电脑,通过 SSH 远程命令行、CLion 远程开发(remote development)等,远程执行操作,再结合 Wi-Fi,可以实现远程连接、调试。
本文将介绍几种网络配置方式,包括有线和无线。大部分方案在配置完成后,Jetson 启动后即可连接,但初始配置依然需要显示器、鼠标、键盘。
SSH,Secure Shell Protocol,是一种网络加密协议,其常见的一个用途是通过网络登陆另一台计算机,运行命令行。
受控端平台运行 SSH 服务端,Linux 系统一般自带 sshd 且自动启动,不需要特别的配置。操作平台运行 SSH 客户端,Linux 系统一般自带 ssh,Windows 系统可以使用 PuTTY。
以 Linux 平台为例,在终端中执行以下命令:
ssh <用户名>@<IP 地址>
例如,登陆 IP 地址为 192.168.0.1 的 root 用户:
其中,IP 地址不一定是这种标准格式,也可能是一个类似域名的名称,例如,localhost
与本机 127.0.0.1 相同。
SSH 可以通过多种方式认证,例如使用用户密码登陆,值得注意的是,输入密码时字符不会显示,但内容实际有输入。
SSH Key 是另一种 SSH 认证方式。简单来说,操作端生成一对密钥,公钥公开,部署到被控制端,SSH 时,操作端的私钥与部署好的公钥匹配,匹配成功则认证成功。
一般来讲,一组密钥对应一台设备(而非使用者),例如,一台电脑上的私钥对应这台设备,而对应的公钥可以同时用于 SSH Jetson、SSH 其他服务器、GitHub 认证等等。当你使用另一台设备时,则应该生成另一组密钥,而不是将本机的密钥共享,即使使用者都是你。
Linux/macOS 系统下,SSH Key 默认储存在用户目录下 .ssh 文件夹。在终端使用以下命令:
ls -a ~/.ssh
如果之前生成过 SSH Key,你可能会看到 id_rsa
和 id_rsa.pub
,其中 .pub 文件即为公钥。如果之前没有生成过,可使用以下命令:
ssh-keygen -t rsa -C "[email protected]"
选项均使用默认即可,passphrase 可留空(否则之后每次使用此 Key 前都需要输入 passphrase)。更多关于 ssh-keygen
,可参考:Generating a new SSH key and adding it to the ssh-agent - GitHub Docs。
要将 SSH Key 公钥部署到 Jetson Nano,使用以下命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
要求输入 meta 用户的密码,依然,输入密码时不会显示字符,但实际已输入。
SSH Key 不仅可以用于 SSH 登陆,也可用于 Github 认证。对于使用 SSH 克隆的 Git repo(clone 时地址以 .git 结尾,而非以 http 开头),pull 和 push 时的认证会自动使用生成的 SSH Key。
通过将公钥部署到 GitHub 上,授权一对 Key 账户或 repo 的读写权限。例如,要授权一对 Key 读写某个 repo 的权限,进入该 repo 的 settings,在 deploy keys 中加入密钥公钥:
无论是通过 Wi-Fi 还是有线连接,要通过电脑远程控制 Jetson,两个设备需要处于同一个局域网内(代理、内网穿透等,在此不讨论),并且电脑需要知道 Jetson 的局域网 IP 地址(一般为 192.168 开头)。
如果使用动态 IP,查看 Jetson 的 IP 地址有多种方法。在 Jetson 侧,方法包括 Ubuntu 桌面查看、使用 ifconfig 命令查看;可使用路由器管理页面查看;在电脑端,可通过扫描局域网等方式。
但是,当 Jetson 部署在机器人上时,外接显示器和鼠标并不方便,不知道 IP 地址也就无法连接 SSH 来运行 ifconfig,其他方法也有其不可靠之处。而另一个选择:设置静态 IP,则需要比较细致的 IP 地址管理,避免地址冲突。
幸运的是,Jetson Nano 自带局域网广播,它会将一个 .local
结尾的网址与自己 IP 绑定,并告知局域网内其他设备。例如,设备名称为 meta-jetson-nano-1
,则局域网内的设备可以通过 meta-jetson-nano-1.local
作为 “IP 地址”来找到它,例如:
# SSH 登陆 meta-jetson-nano-1 的 meta 用户
ssh [email protected]
# Telnet 连接 meta-jetson-nano-1 的 2021 TCP 端口
telnet meta-jetson-nano-1.local 2021
使用该方法,Jetson 设置动态 IP 也能被找到,这对于无线和有线连接构成的局域网均适用。
Wi-Fi 方案是目前最为简单、灵活的方案。Jetson Nano 和电脑同处一个 Wi-Fi,组成局域网,可以部署 SSH 连接、CLion remote development,若 Wi-Fi 连接广域网,Jetson 和电脑均可以上网。Wi-Fi 连接不需要网线、机器人可以自由移动。
此方案需要部署一个 Wi-Fi 路由器,最好能够连接广域网。注意,校园网 Wi-Fi 对于 SSH 有隔离,不能满足该需求。选择 Wi-Fi 路由器时,应当选择覆盖广、穿透强的,如果连接校网,需要能登陆认证。
Jetson Nano 需要部署无线网卡,应当选择高增益网卡,一般带天线,迷你 USB 网卡往往信号不佳。
- 接上显示器、鼠标、键盘,连接 Wi-Fi。That's it!
Ubuntu 会默认自动连接已连接过的 Wi-Fi,如果存在多个 Wi-Fi,可在网络配置中将不需要自动连接的 Wi-Fi 删除,或关闭其自动连接。
- 连接同一个 Wi-Fi。That's it!
当没有 Wi-Fi 路由器时,网线直连构成局域网是需求最小的连接方式,它只需要电脑和 Jetson 使用一条网线直接相连。
网线直连只是构成一个局域网,不能让 Jetson 上网,但可以通过电脑端配置网络共享(下一章节)实现让 Jetson 通过电脑上网。
TODO: 此部分是在发现 .local
前书写的,因此配置了静态 IP。动态 IP 需要有设备负责 IP 地址的分配,要么在电脑端运行 DHCP 服务(不太方便),要么在 Jetson 端设置 Link-Local Only(具体原理还不了解)。如果事实证明 Link-Local Only 更简单的话,请更新此部分内容。
-
右上角网络连接 - Edit Connections... - 左下角新建 - Ethernet - 命名为 Meta。
-
General - 勾选 Automatically connect to this network when it is available.
- thernet - Device - eth0。
- IPv4 Settings:
- Method: Manual
- Add 增加一个固定 IP
- Address: 与 ONES 文档一致,需在 192.168.*.* 网段内
- Netmask 16
- Gateway: 留空
- 保存。
- 将有线连接设置为手动,IP 为 192.168.0.1,子网掩码为 255.255.0.0。以 macOS 为例:
当需要通过有线网来上网时,记得恢复成 DHCP。
网线直连只构成一个局域网,Jetson 并不能上网。但是,如果 PC 端支持,可以通过网络共享,例如将 Wi-Fi 网络共享到有线网,让 Jetson 通过 PC 上网。
- 首先,完成网线直连方案 Jetson 侧配置.
- 右上角网络连接 - Edit Connections... - 选中默认的 Wired connection 1 - 左下角设置 - 重命名为 DHCP。
- General - 取消 Automatically connect to this network when it is available.
- IPv4 Settings:
- Method 保持 Automatic
- Add 增加一个固定 IP
- Address: 与前面 Meta 配置一致
- Netmask 16
- Gateway: 留空
- 断开有线连接,开启 PC 侧网络共享。以 macOS 为例:System Preferences - Sharing - Internet Sharing - Share your connection from: Wi-Fi - To computer using: 有线网适配器 - 勾选左侧 Internet Sharing。
-
按PC 侧配置在 PC 端配置固定 IP。
-
此时,Jetson 侧依然使用的是 Meta 连接(静态 IP),还未使用到共享的网络。通过先前配置的固定 IP SSH 到 Jetson。
- 通过命令行切换到 DHCP 配置:
sudo nmcli connection up 'DHCP'
此时,Jetson 应该可以使用 PC 共享的网络了,而配置的静态 IP 也同样可以使用。
当 PC 和 Jetson 处于同一个局域网内时,如果 PC 上配置了代理,可通过将流量转发至 PC 代理端口,允许 Jetson 使用 PC 的代理。
PC 端代理工具可能需要配置代理端口,配置代理端口时,本地的 IP 如果设置为 127.0.0.1(或 localhost),则该端口只能被本机访问。如果设置为 0.0.0.0,则可以被本机和局域网内其他设备访问。
例如,PC 在局域网的地址为 192.168.0.1,在 1087 端口上开放 HTTP 协议的代理,则在 Jetson 终端中,运行以下命令:
export all_proxy=http://192.168.0.1:1087
则该终端中后续命令(apt、pip、curl、wget 等)都会使用这一代理。但某些程序可能有其自己设置代理的方式,例如 git、snap 等。
类似的,使用 socks 协议的代理:
export all_proxy=socks5://192.168.0.1:1086
要确认代理是否生效,可通过检测本机公网 IP 实现:
curl cip.cc
要取消当前终端中的代理:
unset all_proxy
- 2021.06.12 liuzikai 初始版本。