Jetson Nano快速起步

NVIDIA Jetson Nano Developer Kit是一个小型AI计算机,面向创客、学习者和开发者。使用这个mini设备,可以构建AI应用,超酷的AI机器人,甚至更多的 Jetson 社区项目

备注

2021年初,我重新 部署Jetson Nano Server 来作为 ARM架构Kubernetes 集群工作节点。有一些部署改进和调整,请参考。

下载和准备启动

Jetson Download Center 下载

  • Jetson Nano Developer Kit SD Card Image 现已改名为 NVIDIA JetPack SDK ,然后使用如下命令刻录到SD Card:

早期实践记录:

unzip nv-jetson-nano-sd-card-image-r32.3.1.zip
sudo dd if=sd-blob-b01.img of=/dev/rdisk2 bs=100m

2024年3月实践:

  • NVIDIA JetPack SDK JetPack 5.0.2 : JetPack 5.0.2 是生产级质量版本,包括搭载 Linux 内核 5.10 的 Jetson Linux 35.1 BSP、基于 Ubuntu 20.04 的根文件系统、基于 UEFI 的引导加载程序以及作为可信执行环境的 OP-TEE。新版计算栈,配备了 CUDA 11.4、TensorRT 8.4.1 和 cuDNN 8.4.1

  • NVIDIA JetPack SDK JetPack 6 Preview ,操作系统版本和相应软件堆栈有进一步提升: Linux Kernel 5.15, UEFI based bootloader, Ubuntu 22.04 based root file system, NVIDIA drivers, necessary firmwares, toolchain and more.

备注

由于NVIDIA不支持 JetPack 5 升级到 6,并且我也为了能够体验最新技术,我实践安装了 JetPack 6 Preview

制作JetPack启动U盘
unzip jp60dp-orin-nano-sd-card-image.zip
dd if=sd-blob.img of=/dev/sdb bs=200MB

JetPack使用了很多分区,执行 fdisk -l /dev/sdb 可以看到:

JetPack的分需众多,初始显示如下
Disk /dev/sdb: 59.48 GiB, 63864569856 bytes, 124735488 sectors
Disk model: MassStorageClass
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D286F765-5ECA-43C3-AF2E-11825261E3A8

Device       Start      End  Sectors   Size Type
/dev/sdb1  3057664 57065471 54007808  25.8G Linux filesystem
/dev/sdb2     2048   264191   262144   128M Linux filesystem
/dev/sdb3   264192   265727     1536   768K Linux filesystem
/dev/sdb4   266240   331007    64768  31.6M Linux filesystem
/dev/sdb5   331776   593919   262144   128M Linux filesystem
/dev/sdb6   593920   595455     1536   768K Linux filesystem
/dev/sdb7   595968   660735    64768  31.6M Linux filesystem
/dev/sdb8   661504   825343   163840    80M Linux filesystem
/dev/sdb9   825344   826367     1024   512K Linux filesystem
/dev/sdb10  827392   958463   131072    64M EFI System
/dev/sdb11  958464  1122303   163840    80M Linux filesystem
/dev/sdb12 1122304  1123327     1024   512K Linux filesystem
/dev/sdb13 1124352  1255423   131072    64M Linux filesystem
/dev/sdb14 1255424  2074623   819200   400M Linux filesystem
/dev/sdb15 2074624  3056639   982016 479.5M Linux filesystem

Partition table entries are not in disk order.

电源跳线

Jetson Nano有3种供电方式:

  • 通过Micro-USB接口供电:这种USB供电可以提供 5V⎓2A 电力,通常对于不带附件的方式已经足够电力。可以很方便移动使用。

  • 独立外接电源: 5V⎓4A 适合带动周边附件,例如,将Jetson Nano连接外接磁盘设备

备注

主板上 J48 跳线是用来切换外接电源还是Micro-USB供电。默认是使用Micro-USB供电(跳线没有使用),如果要使用外接电源,务必将该跳线连接上。

详情参考 Power supply considerations for Jetson Nano Developer Kit

初始化

NVIDIA Jetson Nano Developer Kit操作系统提示问题:

  • APP Patition Size 配置,这是因为安装镜像初始时候只占据大约13G, dd 到SD卡之后,初始化时提示可以扩展到整个SD卡存储空间。不过,我为了能够后续通过磁盘卷管理更好分配磁盘空间,所以只设置扩展到 24G 空间 (28896MB)

  • Select Nvpmodel Mode - 该选项是电源管理,有两种模式 MAXN - (Default) (默认最大性能主频,使用4个CPU核心) / 5W (节能模式,只使用2个CPU核心并且降低主频),选择默认就可以。这个配置在以后可以通过 nvpmodel 命令行或者GUI程序进行修改

早期发行版本要求在线连接Internet进行初始化,所以要确保Jetson Nano的主机已经连接到能够访问Internet的局域网,并且通过DHCP获得主机IP地址。这个过程是自动化的,并且如果不能获得互联网连接,就会导致启动任务死循环无法结束。不过,2021年7月我下载的最新镜像已经可以离线初始化,也就是可以在完成初始设置之后,再设置网络联网进行更新。

登陆界面是Gnome 3,所以图形界面比较沉重,甚至我觉得在ARM处理器的4G内存规格下,运行这么复杂的图形桌面实在是浪费了系统资源。

登陆初始化提供了选择键盘、时区以及初始账号功能,并且提供了通过网络连接Internet进行更新的选项。如果设备安装了无线网卡,则会提示设置连接WiFi。建议连接网络进行更新。

我的初始设置比较简单,就是将有线网卡设置为固定IP地址 192.168.6.10 ,这样我就可以通过笔记本的有线网络连接到Jetson系统中,并进行远程操作。这样可以不需要连接显示器。

桌面修改

桌面改为轻量级桌面, Jetson运行Xfce4桌面 :

  • 这个步骤首先完成,可以节约大量磁盘空间和内存占用,同时也避免了大量桌面软件更新

  • 默认启动到字符界面,可以按需使用 startx 命令启动桌面;也可以使用 X持久化远程应用Xpra 远程运行图形程序,可以最大程度节约系统资源

瘦身

NVIDIA Jetson nano的官方发行版默认安装了实际上对于我平时使用并没有用处的Office软件,所以我准备清理掉不需要的软件包:

sudo apt remove --purge libreoffice* -y
sudo apt remove --purge thunderbird* -y
sudo apt clean -y
sudo apt autoremove -y
sudo apt update

安装必要工具软件:

sudo apt install curl screen nmon lsof dnsmasq
# 可选安装Xfce4桌面 - 我最终将jetson作为Kubernetes节点运行,所以没有安装任何桌面,配置成字符界面运行
sudo apt install xfce4 xfce4-terminal
# 以下可选
sudo apt install fcitx-bin fcitx-googlepinyin
sudo apt install bluez-tools blueman
sudo apt install synergy keepassx

你可以选择轻量级 xfce ,也可以 部署Jetson Nano Server ,将主机加入到 Kubernetes Atlas 作为worker节点。

备注

实际上我是将Jetson作为 Kubernetes Atlas 的工作节点来运行的,所以不需要图形桌面系统。我在2021年初再次重装时,选择移除Gnome桌面,但是也不安装任何桌面系统。系统保留了一些基础的X window程序,供后续通过 远程访问Linux桌面X持久化远程应用Xpra 来实现远程桌面访问。或者,我可以部署一个 Jupyter - 数据科学开发平台 的Hub模式,通过浏览器来使用图形系统。

电源管理

为能够获得较好的桌面性能,按照 ARM cpufreq(DVFS) 设置CPU按照performance模式运行:

sudo apt-get install cpufrequtils
echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
sudo systemctl disable ondemand

网络

使用Netplan配置网络(未成功)

netplan网络配置 是Ubuntu 20.04开始主要的网络配置工具,比较简单易用。使用netplan作为前端配置工具,后端可以使用NetworkManager,也可以使用 syatemd-networkd 进行网络配置。对于比较简单的网络配置,特别是在 ARM Atlas 运行环境,我希望尽量少占用系统资源,所以倾向于使用 systemd-networkd 避免再多安装一个 NetwrokManager 服务。

按照 netplan网络配置 配置网络,但是目前遇到无法调用systemd-networkd生成正确配置,暂时放弃。

使用Network Manager配置无线(旧版)

备注

当前我已经改为采用 netplan网络配置 来配置管理网络,主要原因是最新的Ubuntu 20.04默认采用netplan配置,我在 树莓派4b运行64位Ubuntu 就采用了netplan,所以在Jetson上尝试netplan没有成功,所以目前还使用 NetworkManager 配置网络。

Jetson Nano主板没有集成无线网卡,不过,主板m2接口可以安装笔记本通用的无线网卡。我选购的是Intel 8265AC NGW无线网卡,同时集成了蓝牙 4.2。

安装 Intel Wireless-AC8265无线模块 之后,使用 lspci 命令检查可以看到无线网络设备:

01:00.0 Network controller: Intel Corporation Wireless 8265 / 8275 (rev 78)

NVIDIA的Jetson Nano官方镜像是基于Ubuntu 18.04.3 LT构建:

lsb_release -a

默认已经激活使用了NetworkManager: systemctl status NetworkManager

所以,采用 nmcli 命令可以配置无线网络:

sudo nmcli device wifi list
  • 增加wifi类型连接,连接到名为 HOME 的AP上(配置设置成名为 MYHOME ):

    nmcli con add con-name MYHOME ifname wlan0 type wifi ssid HOME \
    wifi-sec.key-mgmt wpa-psk wifi-sec.psk MYPASSWORD
    
  • 指定配置 MYHOME 进行连接:

    nmcli con up MYHOME
    
  • 增加公司无线配置 OFFICE 的AP上(配置设置成名为 MYOFFICE ):

    nmcli con add con-name MYOFFICE ifname wlp3s0 type wifi ssid OFFICE \
    wifi-sec.key-mgmt wpa-eap 802-1x.eap peap 802-1x.phase2-auth mschapv2 \
    802-1x.identity "USERNAME" 802-1x.password "MYPASSWORD"
    

备注

详细配置可参考 设置无线网络

使用Network Manager配置无线(新版)

2021年下半年,由于TF存储卡损坏,不得不重新安装了一次操作系统。此时我发现,网络配置管理默认已经改成了 Systemd Networkd服务 ,所以需要配置 Systemd Networkd服务使用systemd-networkd配置无线

jetson_nano_startup/10-eth0.network
1[Match]
2MACAddress=00:00:00:00:00:01
3
4[Network]
5Address=192.168.6.10/24
6#Gateway=192.168.6.200
7#DNS=192.168.6.200
jetson_nano_startup/20-wlan0.network
1[Match]
2MACAddress=<original MAC>
3
4[Link]
5MACAddress=<spoofed MAC>
6NamePolicy=kernel database onboard slot path
7
8[Network]
9DHCP=yes
  • 配置5GHz无线网络的国家代码 /etc/default/crda

    REGDOMAIN=CN
    
  • 创建 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf :

jetson_nano_startup/wpa_supplicant-wlan0.conf
 1ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
 2update_config=1
 3
 4network={
 5  ssid="office"
 6  key_mgmt=WPA-EAP
 7  identity="USERNAME"
 8  password="PASSWORD"
 9}
10network={
11  ssid="home"
12  key_mgmt=WPA-PSK
13  psk="PASSWORD"
14}
  • 由于在 20-wlan0.network 中配置了MAC spoof,所以需要重启一次 systemd-networkd

    systemctl daemon-reload
    systemctl restart systemd-networkd
    

完成后检查一下 wlan0 接口是否正确修正了MAC地址

  • 启用 systemd-networkdwpa_supplicant 服务:

    systemctl enable wpa_supplicant@wlan0
    systemctl start wpa_supplicant@wlan0
    
  • 然后检查 systemd 服务:

    systemctl status wpa_supplicant@wlan0
    

然后检查 ip addr

蓝牙(可选)

  • 安装蓝牙管理工具:

    apt install bluetools blueman
    
  • 然后启动蓝牙服务:

    systemctl start bluetooth
    

Jetson运行Xfce4桌面 中可以使用blueman图形管理工具直接管理蓝牙设备。

备注

如果使用蓝牙键盘,可以采用上述简单的方式在图形系统中支持使用蓝牙键盘。

初始设置

  • 修改 /etc/sudoers 将个人账号所在的 sudo 组设置为无需密码:

    # Allow members of group sudo to execute any command
    #%sudo  ALL=(ALL:ALL) ALL
    %sudo   ALL=(ALL:ALL) NOPASSWD:ALL
    

软件更新

为了能够更好使用Jetson Nano,建议经常更新系统保持和官方软件版本同步。

备注

在国内访问NVIDIA的软件仓库非常缓慢,甚至无法连接。不过,在墙内现在VPN访问阻塞得非常严重,所以我采用 tethering共享VPN加速 方式来加速软件更新。

  • 升级系统:

    sudo apt update
    sudo apt upgrade
    
  • 清理掉不需要的软件包:

    sudo apt autoremove
    

远程访问

Xpra远程X应用(推荐)

为了能够随时进入开发状态,我现在采用 X持久化远程应用Xpra 来实现远程X window程序运行,非常轻量级的融合VNC和X window的远程图形运行方案。

我在 通过Xpra使用Jetson Nano图形桌面 中详细记录在ARM架构下实践。

远程桌面(可选)

备注

如果你需要完整的桌面系统,可以选择采用xrdp方式的远程桌面,如本小节概述。这是我最初远程访问Jetson的方法,并且也是比较通用桌面访问方法(客户端跨平台,特别是对Windows用户非常友好)。

不过,我现在比较喜欢采用 X持久化远程应用Xpra 方式,可以单个或多个应用程序无缝融合到本地桌面操作系统,类似于 Seamless RDP使用Windows应用 实现。

虽然Jetson nano可以通过直接连接键盘鼠标和显示器进行操作,但是我更希望将这个设备作为远程访问的的边缘AI设备。所以, 远程访问Jetson 可以方便我们以图形界面方式使用。

备注

如果你把Jetson Nano作为桌面系统使用,基本上轻量级的使用没有任何问题。主要的限制是磁盘IO,如果没有快速的TF卡支持,或者通过外接SSD磁盘运行系统,日常使用中IO Wait会导致系统卡顿。但是,只要你能够使用快速的存储系统,则Jetson作为个人桌面系统完全没有压力。

参考