Jetson Xavier NX 试玩 (一)
Jetson Xavier NX 试玩 (一)
环境搭建
0 前言
NVIDIA家的Jetson系列是业内嵌入式边缘计算机的代表作,体积小,功能强是其最主要的优点。
学院入手了一款Jeston Xavier NX,本意是想买官方原版,奈何实在是缺货,由是购入了另一个版本,该版本的镜像烧录方式与官方版本不同,它不支持SD卡烧录。现在,趁着还没毕业,抓紧时间踩踩坑。
这个版本的NX的主板模组的原型应该是微雪电子(waveshare)针对官方NX模组开发的一个扩展版本,可以看他们的官网查看详情。
虽然不是官方版本的,但是其改动不大,因此可玩性还是很高的。
接下来,我要先把基础开发环境搭好。
1 镜像烧录
教程可以参考微雪的官方指导以及各种野生博客。
由于没法使用SD卡,就没法跟着英伟达官方教程走了,看微雪的说明,我们只能使用官方SDK Manager工具烧录,但是这个软件只能在linux系统环境下使用,而我手头没有linux主机,所以要先装个虚拟机,我用的是VMware Player 16。
系统的话我选的是ubuntu18.04,其他符合SDK Manager要求的系统也可(大概)。
在虚拟机里安装好SDK Manager,启动,按官方教程下载即可,简单总结一下,步骤如下:
- 1 需要一个 NVDIA Developer 账号,没有的话要先注册一个。
- 2 打开 SDK Manager 要先登录,在跳出的网页输入账户和密码即可
- 3 将板子的FC REC( Force Recovery Mode pins)引脚接地,然后通过MicroUSB连接主机,usb选择连接到虚拟机,然后,SDK Manager 应该就可以检测到Jetson型号
- 4 然后跟步骤下载镜像即可(虚拟机的系统可用空间理论上应该至少有20G,在创建虚拟机时尽量选择大一些的磁盘空间,我选的50G)
我烧的镜像版本是jetpack 4.6.2,对应的系统是ubuntu18.04,由于选的pre-config,所以应该是烧完即用的那种。
接上屏幕,鼠标,键盘就可以操作啦,现在的桌面环境应该是官方unity,就是绿色的那个,还是挺帅的。
理论上,至此镜像烧录好了,我们可以愉快的玩耍了。然而,博主不太喜欢抱着屏幕,并且应用于嵌入式场景往往没有接入屏幕的条件,如无人机导航场景,因此接下来我要找个合适的远程桌面方法,便于我在本地主机快速稳定访问jetson。
2 配置远程连接
官方镜像下载完后,我们的首要任务就是利用屏幕、键盘、鼠标这些外设先给jetson连上网络,并且知道它的ip地址(方便起见,可以设置个静态ip)。
当然,如果手头没有这些外设,也是可以配置网络的,我们利用usb线与我们的主机相连,然后使用串口建立连接,我使用的软件是 MobaXterm,可以开串口连接功能,同时有不错的命令行ui。详情可以见 官方指导 中的Initial Setup Headless Mode模块中了解一下。
个人试了一下,连了usb后,也可以直接使用ssh协议进行连接,使用的ip地址是192.168.55.1,这应该不是真正的网络ip,似乎是官方配置的一种虚拟ip,这个物理层上应该还是走串口,因为信息的流动还是通过硬件usb来建立的。
然后,可以借助nmcli(Network Manager Command-Line)这个软件来管理网络,软件是系统自带的,有这个需求的童鞋可以自行百度了解下用法。
配好网络后,就可以利用tcp/ip连接来进行远程访问了。一般来讲可以利用ssh协议进行连接,这是个应用层协议。ssh一般工作在网络端口22,如果要对应OSI模型的话,应该处于传输层(Transport),这一层提供端到端的服务,所谓的端到端是指应用进程到应用进程。换言之,只要两台主机都运行了ssh进程,就能从一台主机的ssh进程自上而下,依次通过传输层、网络层、数据链路层、物理层,再自下而上通过物理层、数据链路层、网络层、传输层到达另一台主机的ssh进程,这样,就借助网络实现了两台主机的连接,这种连接当然可以是无线的,无线电磁波嘛,最熟悉的应该就是WiFi了。
烧录好的系统中已经有openssh服务了,也就是说,系统里有运行的ssh服务,所以在本地使用ssh协议就可轻松远程访问它。
ssh协议如何使用呢?有很多软件都可以使用,我使用的是 MobaXterm。利用jetson的ip地址和用户密码即可。如图:
理论上,ssh已经完全够用了,满足我们的远程连接需求。但空洞的命令行实在是有些无趣,要是能搞一个远程桌面就十分的舒适优雅了。不过,就博主的一些浅薄经验来看,使用VNC是不太行的,一个重要的原因是,它的时延太大了(可能是jetson的问题,也可能是配置问题),用起来很不舒服。找啊找,终于找到了一个不错的解决方案,就是 Nomachine+Xfce4 的方案,这种方法的远程桌面使用起来非常流畅,时延很小,令我十分滴舒服。如图:
教程可以见nomachine官方,Tips for using NoMachine on NVIDIA Jetson。
也可以看国外友人的视频,更直观易懂,HOW TO SETUP NO MACHINE IN JETSON NANO。
自己简单解释一下,
nomachine就是一种远程桌面软件,即下即用,jetson NX的cpu是arm V8架构,据此下载对应的软件版本即可。Xfce4则是一种轻量级桌面环境,使用它是nomachine推荐的,相比于原桌面,这种桌面的的远程连接明显更流畅。
至此,远程桌面算是配置完了,但是还需要注意两点:
- 问题1.每次jetson重启后,有个输入用户密码的界面,只有输入密码登录后,jetson才能建立网络连接,然后才能借此进行远程连接,因此必须想办法自动登录,或者跳过这个界面。
- 问题2.当jetson的hdmi接口没有检测到屏幕时,远程桌面是失效的。
我来自未来,这里做个补充,问题1我的描述可能有些问题,jetson是否能建立网络连接和这个Login界面没有关系,即就算我卡在Login界面也是可以联网的。
实际上,上述两个问题是同一个问题,即在无屏幕状态(hdmi没有接到屏幕)下,远程桌面无法使用。所以,解决问题2即可,不必再研究如何自动跳过Login界面了。
这两个问题的解决方案如下:
- 1.借鉴Ubuntu 20.04的方法,修改/etc/gdm3/custom.conf文件,详情见How to Enable/Disable Automatic Login in Ubuntu 20.04 LTS。ps:试过官方的帖子的方法,但是没有成功🙁
- 2.既然一定要检测到屏幕,那就让它检测到,买个hdmi欺骗器直接插上,问题解决(朴实无华是这样的)。
接下来,就扔掉屏幕,来愉快地玩耍吧。
3 设置系统从固态硬盘启动
由于镜像系统是烧在jetson的eMMC里的,这里只有16GB,有些小了。同时,我这个版本的jetson NX买时送了一个128GB的固态硬盘,因此我们需要利用起这个有利资源来。
微雪官方给的指导我没有执行成功。
参考了csdn的一个博客,NVIDIA JETSON XAVIER NX 从SSD盘启动。这个帖子使用了一个开源脚本,其作者是JetsonHacks,是jetson的开发者之一,膜拜一下。
直接说一下我的流程吧,
3.1 格式化ssd
虽然是新的,不必格式化,但是我一开始是跟微雪官方说的方法走的,就先格式化了,不过也无伤大雅。
sudo mkfs.ext4 /dev/nvme0n1
nvme0n1就是指ssd存储硬盘
3.2 创建分区
格式化后硬盘,就要重新设置分区,就和设置windows上的C盘、D盘差不多吧。
用到了一些命令行知识,见这里,Ubuntu下移动硬盘的分区、格式化、挂载操作。
设置分区的命令
sudo fdisk /dev/nvme0n1
然后输入:n、p、1、回车、回车、w。
这样就建立了一个分区,大小为硬盘大小,名字默认为nvme0n1p1,这个在后面的脚本中有用到,因此也必须是这个名字。
创建完新分区,先格式化一下,
sudo mkfs.ext4 /dev/nvme0n1p1
3.3 使用脚本
脚本是JetsonHacks开源在Github上的,地址是 https://github.com/jetsonhacks/rootOnNVMe.git
使用步骤如下:
git clone https://github.com/jetsonhacks/rootOnNVMe.git
cd rootOnNVMe/
./copy-rootfs-ssd.sh
./setup-service.sh
reboot
在Github上clone仓库的时候可能会遇到网络的问题,解决方案有很多,我的方法是设置了全局https的代理,所谓代理,就是找一个可以访问所需网站的主机(或者说服务器),将他作为流量转发的中间媒介,大概可以这么说吧,嗯大概。
简单说一下就是,使用这个命令
export https_proxy="http://xxx.xxx.xxx.xxx:xxx/"
xxx.xxx.xxx.xxx:xxx就是服务器ip地址加端口号
我来自未来,这里纠正个错误,git是不会走系统全局代理的,为git设置全局代理有特殊的方法
git config --global https.proxy http://xxx.xxx.xxx.xxx:xxx git config --global http.proxy http://xxx.xxx.xxx.xxx:xxx
最终查看一下,确实成功了