Jeston Xavier NX 模块将系统迁移到NVME存储

news2024/11/16 13:33:07

        大家好,我是虎哥,最近完成了自己设计的第一个Xavier NX的载板设计和打样,虽然还有一些小的不完善的地方,但是可以正常使用,这里记录和分享一下我自己设计的载板上如何实现系统迁移。

        我自己使用SDK Manager 安装了所有的支持库后,16G的板载EMMC就耗光了,所以我必须将系统转移到NVME存储上。

目录

一、Jetson Xavier NX 系列介绍

1.1 Xavier 般的性能,Nano 般的大小

1.2 适用于重要嵌入式应用

1.3 强大的 21 TOPS AI 性能

1.4、模块参数

二、Jetson Xavier NX 载板N100介绍

三、N100 软件环境说明

3.1 系统版本

3.2查看Jetson TX2 L4T版本

四、N100 软件环境说明

4.1 准备 SSD 并格式化为 GPT

4.2 命令行迁移系统

4.3 手动迁移系统

五、总结


 

一、Jetson Xavier NX 系列介绍

        NVIDIA® Jetson Xavier™ NX通过外形小巧的模组系统(SOM)将超级计算机的性能带到了边缘端。 高达21 TOPS的加速计算能力可并行运行现代神经网络并处理来自多个高分辨率传感器的数据,这是完整AI系统的要求。

1.1 Xavier 般的性能,Nano 般的大小

        Jetson Xavier NX 只有 70 毫米 x 45 毫米,可以将 NVIDIA Xavier SoC 的强大性能封装到 Jetson Nano™ 大小的模组中。这个外形小巧的模组将出色性能和功耗优势与一组丰富的 IO(从高速 CSI 和 PCIe 到低速 I2C 和 GPIO)相结合。利用小巧的外形、传感器众多的接口和出色性能,为您的所有嵌入式 AI 和边缘系统带来新功能。

1.2 适用于重要嵌入式应用

        Jetson Xavier NX 适用于无人机、便携式医疗设备、小型商业机器人、智能摄像头、高分辨率传感器、自动光学检测、智能工厂和其他 IoT 嵌入式系统等高性能 AI 系统。

1.3 强大的 21 TOPS AI 性能

        Jetson Xavier NX 可提供高达 21 TOPS 的性能,是嵌入式和边缘系统中高性能计算和 AI的理想之选。您可以获得384 个 NVIDIA CUDA® Cores、48 个 Tensor Cores、6 块 Carmel ARM CPU 和两个 NVIDIA 深度学习加速器 (NVDLA) 引擎所带来的性能。再加上超过 59.7GB/s 的显存带宽、视频编码和解码等特性,使得 Jetson Xavier NX 成为能够并行运行多个现代神经网络,并同时处理来自多个传感器的高分辨率数据的首选平台。

1.4、模块参数

二、Jetson Xavier NX 载板N100介绍

         N100 载板是我自己设计的,完全兼容官方系统的硬件系统。主要配置的资源有:DB9接口引出了RS232接口,DB9接口引出了CAN接口,千兆网口1路,使用HUB芯片,扩展了4路USB3.0机接口,以及我们常用的HDMI接口和NVME存储接口,和M.2的WIFI网卡接口。

三、N100 软件环境说明

系统我烧写了JetPack 4.6.3

3.1 系统版本

nvidia@nvidia-desktop:~$ sudo lsb_release -a
[sudo] password for nvidia: 
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.6 LTS
Release:    18.04
Codename:   bionic

3.2查看Jetson TX2 L4T版本

head -n 1 /etc/nv_tegra_release
​
# R32 (release), REVISION: 7.3, GCID: 31982016, BOARD: t186ref, EABI: aarch64, DATE: Tue Nov 22 17:32:54 UTC 2022

说明使用R32.7.3的系统版本

四、N100 软件环境说明

NVMe SSD 硬盘仅作为系统盘(rootfs 和用户区),系统的启动引导依然是通过 SD 卡或 EMMC,比如升级设备树 dtb 还是在 SD 卡或 EMMC 中。

4.1 准备 SSD 并格式化为 GPT

#新存储接入系统后,查看存储情况
$ sudo fdisk -l

这里我们主要关注NVMe 存储。

 看到类似信息,说明这块盘还没有格式分区表。接下来,我们手动格式化存储和建立分区表。

#分区: /dev/nvme0n1 是之前查出来的
$ sudo fdisk /dev/nvme0n1

 出现如下命令行。先用m,看看帮助信息

Command (m for help): m
​
Help:
​
  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag
​
  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition
​
  Misc
   m   print this menu
   u   change display/entry units
   x   extra functionality (experts only)
​
  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file
​
  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes
​
  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table

我们是要建立GPT partition table,和进行格式化存储。

#使用g建立分区表
Command (m for help): g
Created a new GPT disklabel (GUID: 8ED2D809-5D3A-DC45-8CFA-A4DA8124D705).
The old ext4 signature will be removed by a write command.
​
Command (m for help): 

使用N命令新增一个分区,除了分区写1,其它都是默认即可

Command (m for help): n
Partition number (1-128, default 1): 1
First sector (2048-500118158, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-500118158, default 500118158): 
​
Created a new partition 1 of type 'Linux filesystem' and of size 238.5 GiB.

使用W命令进行保存

Command (m for help): w
The partition table has been altered.
Syncing disks.

保存之后就会主动退出,这个时候我们再查看一次存储。

$ sudo fdisk -l

 这样的分布说明我们完成了分区的建立。然后我们格式化这个分区

sudo mkfs -t ext4 /dev/nvme0n1p1

一路默认回车即可。

nvidia@nvidia-desktop:~$ sudo mkfs -t ext4 /dev/nvme0n1p1
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done                            
Creating filesystem with 62514513 4k blocks and 15630336 inodes
Filesystem UUID: 87471bb3-2a48-4cb7-80bc-40b3bede09c6
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872
​
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information:          
done
​
nvidia@nvidia-desktop:~$ 

这个时候你在你的命令行查看存储分布还看不到存储,是因为没有挂载。

nvidia@nvidia-desktop:~$ df -hl
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p1   14G   13G   37M 100% /
none            3.5G     0  3.5G   0% /dev
tmpfs           3.8G   40K  3.8G   1% /dev/shm
tmpfs           3.8G   38M  3.8G   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.8G     0  3.8G   0% /sys/fs/cgroup
tmpfs           777M   12K  777M   1% /run/user/120
tmpfs           777M  132K  777M   1% /run/user/1000

这个时候,你登录到桌面系统,在左侧菜单图标栏找到对应存储双击打开一下既可以看到了。

 至此我们就完成了存储的准备工作。

4.2 命令行迁移系统

https://github.com/jetsonhacks大佬工具集合访问地址。这个地址发现有很多工具,可以帮我们方便的实现迁移。

在终端中想办法执行。

git clone https://github.com/jetsonhacks/rootOnNVMe.git
cd rootOnNVMe
./copy-rootfs-ssd.sh
./setup-service.sh
sudo reboot

#执行拷贝脚本
./copy-rootfs-ssd.sh

nvidia@nvidia-desktop:~/Downloads/rootOnNVMe-master$ ./setup-service.sh 
==== AUTHENTICATING FOR org.freedesktop.systemd1.reload-daemon ===
Authentication is required to reload the systemd state.
Authenticating as: nvidia,,, (nvidia)
Password: 
==== AUTHENTICATION COMPLETE ===
Created symlink /etc/systemd/system/default.target.wants/setssdroot.service → /etc/systemd/system/setssdroot.service.
Service to set the rootfs to the SSD installed.
Make sure that you have copied the rootfs to SSD.
Reboot for changes to take effect.

执行设置脚本后,重启系统看看。

 根目录已经成功的替换成了NVME,所以验证这个方法是可行的。

4.3 手动迁移系统

由于我们安装的是JetPack4.6.3的系统,所以迁移我们是可以参考之前TX1个TX2的方法来的。官方主板 Jeston TX1 TX2 ubuntu 18.04 迁移系统至固态SSD_jeston tx2_机器人虎哥的博客-CSDN博客这个是我们之前的方法。其步骤是。

手动将EMMC系统内容拷贝到NVME存储上。

1、查看存储位置

nvidia@nvidia-desktop:~$ df -hl
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p1   14G   13G   37M 100% /
none            3.5G     0  3.5G   0% /dev
tmpfs           3.8G   40K  3.8G   1% /dev/shm
tmpfs           3.8G   38M  3.8G   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.8G     0  3.8G   0% /sys/fs/cgroup
tmpfs           777M   12K  777M   1% /run/user/120
tmpfs           777M  128K  777M   1% /run/user/1000
/dev/nvme0n1p1  234G   61M  222G   1% /media/nvidia/87471bb3-2a48-4cb7-80bc-40b3bede09c6

2、进入NVME存储

cd /media/nvidia/87471bb3-2a48-4cb7-80bc-40b3bede09c6/

3、拷贝全部文件至NVME存储

sudo cp -ax / ./

4、修改NVME存储上的系统启动文件

刚拷贝后,进入NVME系统的boot目录

#进入目录
cd /media/nvidia/87471bb3-2a48-4cb7-80bc-40b3bede09c6/
#进入boot目录
cd /boot/extlinux

#备份和修改启动引导文件
sudo cp extlinux.conf extlinux.conf_bak
#修改extlinux.conf

原始文件内容

TIMEOUT 30
DEFAULT primary
​
MENU TITLE L4T boot options
​
LABEL primary
      MENU LABEL primary kernel
      LINUX /boot/Image
      INITRD /boot/initrd
      APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 nv-auto-config
​
# When testing a custom kernel, it is recommended that you create a backup of
# the original kernel and add a new entry to this file so that the device can
# fallback to the original kernel. To do this:
#
# 1, Make a backup of the original kernel
#      sudo cp /boot/Image /boot/Image.backup
#
# 2, Copy your custom kernel into /boot/Image
#
# 3, Uncomment below menu setting lines for the original kernel
#
# 4, Reboot
​
# LABEL backup
#    MENU LABEL backup kernel
#    LINUX /boot/Image.backup
#    INITRD /boot/initrd
#    APPEND ${cbootargs}

修改后的内容:

TIMEOUT 30
DEFAULT nvmessd
​
MENU TITLE L4T boot options
​
LABEL nvmessd
      MENU LABEL primary kernel
      LINUX /boot/Image
      INITRD /boot/initrd
      APPEND ${cbootargs} quiet root=/dev/nvme0n1p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 nv-auto-config
 LABEL emmc
      MENU LABEL internal Emmc
      LINUX /boot/Image
      INITRD /boot/initrd
      APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 nv-auto-config

4、手动烧写系统至NVME启动

打开虚拟机上的终端。

手动控制模块进入recovery模式

 开始烧写EMMC启动系统

#更新DTB和内核文件,设置NVME启动
sudo ./flash.sh -r -d kernel/dtb/tegra194-p3668-all-p3509-0000.dtb -K kernel/Image jetson-xavier-nx-devkit-emmc nvme0n1p1
#内核文件,设置NVME启动
sudo ./flash.sh -r -K kernel/Image jetson-xavier-nx-devkit-emmc nvme0n1p1
​
#以下做为参考
#重新生成系统,烧写至EMMC
sudo ./flash.sh jetson-xavier-nx-devkit-emmc mmcblk0p1
#使用以有的系统镜像,烧写至EMMC
sudo ./flash.sh -r jetson-xavier-nx-devkit-emmc mmcblk0p1

 至此烧写完毕。系统重启后我们可以看到存储信息

nvidia@nvidia-desktop:~$ df -hl
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  234G   13G  209G   6% /
none            3.5G     0  3.5G   0% /dev
tmpfs           3.8G   40K  3.8G   1% /dev/shm
tmpfs           3.8G   22M  3.8G   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.8G     0  3.8G   0% /sys/fs/cgroup
tmpfs           777M   12K  777M   1% /run/user/120
tmpfs           777M  120K  777M   1% /run/user/1000
/dev/mmcblk0p1   14G  5.0G  8.1G  39% /media/nvidia/a0cb2694-3e4c-4a67-9e05-92f278444e97

说明也成功了。

五、总结

        4.2中提供了一种方法和4.3中提供的方法,显然4.2的要简单自由很多,所以我个人也是很倾向使用4.2,这里大神们的开源精神,特别值得我们学习。4.3做为之前TX1和TX2上我自己常用的方法,在这里也可以使用,感觉纪念一下之后就要被淘汰了。不过我接下来会对两种方法设置的系统进行长期的使用对比,来最终决定使用哪种方法。希望你喜欢今天的分享。

纠错,疑问,交流: 911946883@qq.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c# Invoke使用

在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。 正确的做法是将工作线程中涉…

青少年机器人技术一级考试备考重点(三):简单机械

随着机器人技术的飞速发展,越来越多的青少年开始关注并参与其中。青少年机器人技术考试作为一项评估学生机器人技术水平的重要考试,备受广大青少年和家长的关注。为了更好地备战青少年机器人技术一级考试,了解考试的学习要点和备考重点是非常…

【C++初阶】11. list的使用及模拟实现

1. list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与…

清华青年AI自强作业hw5:基于CNN实现CIFAR10分类任务

清华青年AI自强作业hw5:基于CNN实现CIFAR10分类任务 简述作业实现遇到的问题相关链接 一起学AI系列博客:目录索引 简述 hw5作业为利用深度卷积神经网络实现CIFAR_10数据集十分类问题,帮助理解CNN的前向传播结构。 CIFAR-10是一个常用的彩色图…

现代处理器结构

本文翻译自:Modern Microprocessors A 90-Minute Guide!,,我认为原文是相当好的计算机体系结构方面的概述,与时代相结合是国内计算机课本普遍缺失的一环,本文可作为一个有效的补充,向原作者和其他译者表示感…

青岛大学_王卓老师【数据结构与算法】Week03_09_线性表的链式表示和实现9_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–…

软件测试面试-银行篇

今天参加了一场比较正式的面试,汇丰银行的视频面试。在这里把面试的流程记录一下,结果还不确定,但是面试也是自我学习和成长的过程,所以记录下来大家也可以互相探讨一下。 请你做一下自我介绍?(汇丰要求英…

如何在VUE项目中使用svg图标

一文带你搞定svg图标的使用! 文章目录 前言一、SVG相较于字体图标的优点二、使用步骤1.新建一个vue2项目2.安装项目依赖3 .在src目录下新建文件夹4.创建svg-icon组件5.在main.js中引入icons下的index.js6.配置 vue.config.js7.步骤完毕,检验成果 总结 前…

LoadRunner负载均衡与IP欺骗

目录 前言: 一、IP wizard 二、一个IP欺骗测试脚本 三、Controller与Runtime setting设置 四、mdrv.dat配置调整 五、查看实现效果 【结语】 前言: 在使用 LoadRunner 进行负载测试时,负载均衡和 IP 欺骗是两个重要的概念。 这次出差…

【UE Unreal Camera】【保姆级教程】手把手教你通过UE打开摄像头/预览图像画面

【UE Unreal Camera】【保姆级教程】手把手教你通过UE打开摄像头/预览图像画面 概述 最近在做一个游戏的开发,需要通过UE去打开用户的摄像头(ios,android上的手机摄像头;windows,mac上的电脑摄像头),预览图像&#xf…

NLP(五十七)LangChain使用Google Search Agent

大模型存在的问题 大模型在给人带来眼前一亮的表现,深深地震撼各行各业人们的同时,其本身也存在着不少问题。   以OpenAI的ChatGPT模型为例,其存在的问题有: 事实错误,容易一本正经地胡说八道,造成幻觉问…

重定向爬虫和多线程爬虫

前言 重定向爬虫是指在抓取网页时,如果目标网站内部存在重定向机制,即当你访问一个网页时,服务器会把你重定向到另一个目标网页。重定向爬虫可以帮助我们发现这种重定向链接,从而更有效地抓取目标网站的内容。 要实现重定向爬虫…

分享一些关于 CSS Grid 基础入门知识

网格系统(CSS Grid)是CSS中最重要的特性之一。它能够以简单的方式将元素对齐到列和行中。CSS网格使得设计复杂且响应式的网页变得更加容易,无需使用浮动、表格或定位。它还具有许多更强大的功能,如果你多加练习,就能发…

北京大学2018计算机学科夏令营上机考试

目录 A:计算两个日期之间的天数【暴力不水】 B:回文子串【暴力不水】 C:The Die Is Cast【DFS】 D:Euro Efficiency【看不懂】 E:重要逆序对【归并排序】 F:Tram【看不懂】 G:食物链【图】 H:DFS spanning tree【不会】 A:计算两个日期之间的天数【暴力不水】 //…

《微服务架构设计模式》第四章 使用Saga管理事务

内容总结自《微服务架构设计模式》 使用Saga管理事务 一、XA解决方案存在问题二、使用Saga管理事务Saga是什么补偿事务是什么Saga协调模式协同式Saga编排式Saga 隔离性Saga结构 三、总结 一、XA解决方案存在问题 在多个服务、数据库和消息代理之间维持数据一致性的传统方式是采…

小黑重庆归来,眼睛复查顺利,见到了三年没见的线上同门的leetcode之旅:剑指 Offer II 015. 字符串中的所有变位词

小黑代码1:滑动窗口 class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:# 字符串长度n_s len(s)n_p len(p)if n_s < n_p:return []# 差值数组arr [0] * 26# 初始窗口for i in range(n_p):arr[ord(p[i])-97] - 1arr[ord(s[i])-97] 1# 计算初始窗口…

Web服务器群集:Tomcat配置https证书

目录 一、理论 1.SSL 2.HTTPS协议和HTTP协议的区别 3.https证书配置 4.tomcat强制使用https 二、实验 1.https证书配置过程 2.tomcat强制使用https 三、总结 一、理论 1.SSL &#xff08;1&#xff09;概念 SSL是网络加密传输协议&#xff0c;是支持在网络服务器(主…

chatgpt赋能python:烧录代码过程是怎样的

烧录代码过程是怎样的 烧录代码是将编写好的程序代码烧录进内置闪存器件&#xff08;Flash&#xff09;或外部存储器&#xff08;SD卡、EEPROM等&#xff09;中的过程。本文将介绍烧录代码的具体过程和常用工具&#xff0c;以及一些注意事项。 烧录代码的步骤 步骤一&#x…

分布式负载均衡 Ribbon

一、Ribbon简介 是Netfix发布的负载均衡&#xff0c;Eureka一般配合Ribbon进行使用&#xff0c;基于HTTP和TCP的客户端负载均衡工具。 只有负载均衡的能力&#xff0c;不具有发送请求的能力&#xff0c;要配合服务通信组件。 RestTemplate 针对各种类型的 HTTP 请求都提供了相…

青少年机器人技术一级考试备考重点(一):机器人常识

随着机器人技术的飞速发展&#xff0c;越来越多的青少年开始关注并参与其中。青少年机器人技术考试作为一项评估学生机器人技术水平的重要考试&#xff0c;备受广大青少年和家长的关注。为了更好地备战青少年机器人技术一级考试&#xff0c;了解考试的学习要点和备考重点是非常…