[嵌入式AI从0开始到入土]15_orangepi_aipro欢迎界面、ATC bug修复、镜像导出备份

[嵌入式AI从0开始到入土]嵌入式AI系列教程

注:等我摸完鱼再把链接补上
可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。

第1期 昇腾Altas 200 DK上手
第2期 下载昇腾案例并运行
第3期 官方模型适配工具使用
第4期 炼丹炉的搭建(基于Ubuntu23.04 Desktop)
第5期 炼丹炉的搭建(基于wsl2_Ubuntu22.04)
第6期 Ubuntu远程桌面配置
第7期 下载yolo源码及样例运行验证
第8期 在线Gpu环境训练(基于启智ai协作平台)
第9期 转化为昇腾支持的om离线模型
第10期 jupyter lab的使用
第11期 yolov5在昇腾上推理
第12期 yolov5在昇腾上应用
第13期_orangepi aipro开箱测评
第14期 orangepi_aipro小修补含yolov7多线程案例
第15期 orangepi_aipro欢迎界面、ATC bug修复、镜像导出备份
未完待续…


文章目录

  • [嵌入式AI从0开始到入土]嵌入式AI系列教程
  • 前言
  • 一、ATC报错
    • 1、报错详情
    • 2、解决办法
  • 二、欢迎界面
    • 1、一些有趣的软件
    • 2、效果展示
      • 1、lolcat
      • 2、figlet
      • 3、toilet
      • 4、cowsay
      • 5、sl
      • 6、cmatrix
    • 3、修改欢迎界面
      • 1、源文件
      • 2、添加的内容
      • 3、效果
  • 三、镜像导出
    • 1、折腾历程
    • 2、wsl2环境导出
      • 1、重新编译内核
      • 2、安装驱动
      • 3、导入脚本,安装依赖
      • 4、执行
      • 5、卸载sd卡
    • 3、VMware虚拟机
    • 4、注意事项
  • 四、问题
    • 1、添加的欢迎信息不显示
    • 2、apt报错
  • 总结


前言

注:本文基于orangepi_aipro于2023.2.3公布的ubuntu_desktop镜像
上一期中在atc转换时有个报错,但是不影响结果,这期做一个修复;然后添加本次修补的信息到ssh欢迎界面,以便后续使用;最后是导出我们制作好的镜像,并且压缩备份。

一、ATC报错

1、报错详情

PermissionError: [Errno 13] Permission denied: '/usr/local/Ascend/ascend-toolkit/7.0.0/opp/vendors/customize/op_impl/ai_core/tbe/customize_impl/rescale.py'

我手动寻找了这个文件,发现在/usr/local/Ascend/ascend-toolkit/7.0.0/opp/vendors/customize/op_impl/ai_core/tbe/customize_impl/目录是有这个文件的,这时我怀疑的是权限问题。
于是我去我安装了相同版本CANN的wsl2内去查看,不幸的是发现/usr/local/Ascend/ascend-toolkit/7.0.0/这个目录下就已经没有opp这个文件夹了。
在这里插入图片描述

2、解决办法

后面经过一阵搜索,终于在论坛上找到了办法。

sudo chmod a+rx -R /usr/local/Ascend/ascend-toolkit/7.0.0/opp/vendors/customize/op_impl/

这行命令的意思是以超级用户权限,递归地为指定目录及其所有子目录和文件设置所有用户的读和执行权限
在这里插入图片描述
之后再次运行便不会收到这个错误了。

二、欢迎界面

1、一些有趣的软件

这里系统内置了lolcatfiglet这两个软件。当然,这远远不够我们整活的。于是

sudo apt install -y cowsay sl cmatrix toilet

关于用法直接使用-h参数即可(虽然有些会报错,但你就说给没给说明吧)

2、效果展示

1、lolcat

ll | lolcat
lolcat "This is a test text!"

在这里插入图片描述

2、figlet

figlet

在这里插入图片描述

3、toilet

 toilet -f term -F border --gay "This is a test text!"echo "This is a test text!" | toilet -f term -F border --gay

在这里插入图片描述

4、cowsay

cowsay "toolsmanhehe" | lolcat	#这里结合lolcat实现彩色
echo "This is a test text!" | cowsay

在这里插入图片描述

5、sl

sl

嗯,没错,跑过一辆小火车
在这里插入图片描述

6、cmatrix

cmatrix

经典黑客帝国背景,很帅的啦。
在这里插入图片描述

3、修改欢迎界面

在Ubuntu系统中,SSH登录的欢迎信息通常显示在用户成功通过SSH登录后看到的第一条消息。这个欢迎信息存储在文件/etc/motd中,该文件的名字是“Message of the Day”的缩写。
请注意,这里会有一个动态生成的motd,它会覆盖您直接编辑的/etc/motd文件。在这种情况下,您可能需要修改负责生成这个动态消息的脚本,位于/etc/update-motd.d/目录下的脚本。

我们选其中一种就行了,注意,前面数字越小的越先被执行

sudo vim /etc/update-motd.d/01-orangepi-startup-text #直接修改原来的欢迎界面
sudo vim /etc/update-motd.d/02-user-text	#新建新的信息

1、源文件

我们先来看下原来的内容

#!/bin/sh
figlet -tk -w 120 "Orange Pi"
printf "Welcome to Orange Pi Ai Pro\n"
[ -r /etc/lsb-release ] && . /etc/lsb-releaseif [ -z "$DISTRIB_DESCRIPTION" ] && [ -x /usr/bin/lsb_release ]; then# Fall back to using the very slow lsb_release utilityDISTRIB_DESCRIPTION=$(lsb_release -s -d)
fi
printf "This system is based on %s (%s %s %s)\n" "$DISTRIB_DESCRIPTION" "$(uname -o)" "$(uname -r)" "$(uname -m)"
printf "\n"
printf "This system is only applicable to individual developers and cannot be used for commercial purposes.\n"
printf "\n"
printf "By using this system, you have agreed to the Huawei Software License Agreement.\n"
printf "\n"
printf "Please refer to the agreement for details on https://www.hiascend.com/software/protocol\n"
printf "\n"

2、添加的内容

toilet -f term -F border -w 100 --metal "Fix the bug that the hibernation cannot wake up,configure the vnc desktop  (accessed using ip:5901),add opencv4.9.0 with CANN support enabled,add torch_npu support."
cat /etc/motd.cowsay	#至于为什么这么写,看问题区第一点

3、效果

这是我魔改完的效果
在这里插入图片描述

三、镜像导出

这里我研究了好几天,终于成功导出镜像。不要问我不是有许多工具的吗,随便找一个就好了,不信你试试就好,不缺硬盘的除外。

1、折腾历程

开始,我使用Ascend AI Devkit Imager备份功能进行备份,但是似乎有bug,不管选不选压缩,它都会压缩。这里备份没有问题,备份的镜像也没问题。这里使用了19G左右空间的64G卡备份完的test.img.zip是14G多,比我最后使用的方法获得的打2倍以上。
但是刷入备份镜像的时候你就会发现问题,明明条子读完了,过了一会,却还是没提示烧录完成。通过任务管理器,会发现sd卡还在被写入。
于是我更换balenaEtcher烧录,发现原来是1:1备份的,也就是卡多大,镜像多大
我知道有人会说,啊,用个镜像压缩工具把空白的区域去掉不就行了嘛。于是我掏出了祖传的pishrink.sh,然而挂载img镜像后,执行这个脚本却提示超级块损坏,有人说用win32diskimager备份的镜像就可以。不幸的是,还是1:1备份,而且也是同样的报错提示。
好嘛,那我掏出祖传的DiskGenius,显示第二个分区确实后面没有被使用,那就直接resize,不幸的是,提示文件损坏,无法调整。
好嘛,那我手动压缩(直接去除后面没有使用的空间),行了吧。

losetup /dev/loop0 test.img	#使用losetup将.img文件映射为一个块设备。
fdisk -l /dev/loop0			#使用fdisk或parted查看分区的详细信息
parted /dev/loop0			#使用parted工具来缩小第二个分区的大小。resizepart 2 20GB   # 假设要将分区缩小到20GBq                   # 退出parted
e2fsck -f /dev/loop0p2  	# 检查文件系统
resize2fs /dev/loop0p2 20GB  # 调整文件系统大小
dd if=/dev/loop0 of=test_resized.img	#使用dd命令备份修改后的分区到新的镜像文件。
losetup -d /dev/loop0		#卸载分区并删除loop设备

然而不幸的是,在调整文件系统大小这一步报错。到这里我心态真的要崩溃了,复制一次源文件就得60G的样子,搞了快10次。

然后我就好奇官方的镜像是如何出来的,于是翻文档,终于,成功了,导出镜像6G多一点。

2、wsl2环境导出

1、重新编译内核

尽管我们通过usbipd-win项目能够将usb设备连接到wsl,而且WSL2-Linux-Kernel内核中已经包含USB驱动,但不幸的是默认内核配置并没有自动加载USB存储驱动模块。所以,还得自己动手编译内核。
在wsl内执行以下命令

su
apt update
apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool	#安装依赖
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git	#下不动用下面的码云镜像仓库
git clone https://gitee.com/mirrors/WSL2-Linux-Kernel.git
cd WSL2-Linux-Kernel
git checkout linux-msft-wsl-$(uname -r | cut -d- -f1)	#切换到我们当前版本内核分支
cp /proc/config.gz config.gz	#复制当前内核的配置文件
gunzip config.gz
mv config .config
make menuconfig

Device Drivers --> USB support ---> USB Mass Storage support开启usb驱动加载
使用方向键上下移动,回车进入,找到后按两下空格,使其变为<*>,然后方向键向右移动到save,保存,最后,移动到exit,一步步退出,直到提示configuration witten to.config
在这里插入图片描述
接下来需要修改一个配置,确保CONFIG_X86_X32没有被开启

vim .config

在这里插入图片描述
接下来就让你的电脑风扇咆哮吧

sudo make -j$(nproc)
sudo make modules_install -j$(nproc)
sudo make install -j$(nproc)

大概5-10分钟就可以编译完成。编译结果如下
在这里插入图片描述
接着把这个vmlinux文件放到win上,我是放到了存放wsl文件的地方,cp命令或者直接资源管理器复制都可以。
然后来到win用户根目录,也就是C:\Users\xxx,新建.wslconfig文件

[wsl2]
kernel=D:\\wsl\\vmlinux	#路径自行修改

然后重新启动wsl就可以了,注意,应该使用wsl --shutdown命令关闭。

2、安装驱动

WSL 本身并不支持连接 USB 设备,因此你需要安装开源 usbipd-win 项目。
注意,必须是wsl2,否则无法挂载usb设备到wsl内。什么,你还没有,那么按照我之前的这篇教程安装一下吧,很快的。
首先安装驱动,详情请查看官方文档,在powershell内执行(为了方便,请直接使用管理员权限打开)

wget https://github.com/dorssel/usbipd-win/releases/download/v4.1.0/usbipd-win_4.1.0.msi	#下载完记得手动安装一下
winget install --interactive --exact dorssel.usbipd-win	#github下载慢的话用这个

不幸的是这俩我都下的十分缓慢,这里疑似版权问题,CSDN不让我发。
安装之后,我们继续在powershell内执行(假设我现在需要连接的设备是2-6)
在这里插入图片描述

usbipd list		#列出所有连接到 Windows 的 USB 设备
usbipd bind --busid 2-6	#将其设为共享状态
usbipd list		#确保其状态变为share
usbipd attach --wsl --busid 2-6	#将USB设备连接到wsl

在这里插入图片描述
连接成功应有如下提示
在这里插入图片描述
注意,应该确保 WSL 命令提示符处于打开状态。 请注意,只要 USB 设备连接到 WSL,Windows 将无法使用它。 附加到 WSL 后,任何作为 WSL 2 运行的分发版本都可以使用 USB 设备。
然后在wsl内执行

lsusb
lsblk

在这里插入图片描述

3、导入脚本,安装依赖

我提取了相关脚本,上传至本文置顶资源。
同时我们也可以从产品详情页下载源码。
在这里插入图片描述
在这里插入图片描述
我们只需要这两个文件

su
apt update
apt-get install -y qemu qemu-user qemu-user-static binfmt-support xz-utils
cp library/* /usr/lib64/	#这两个文件我放在我的压缩包跟目录了,自己改下路径
tar zxf image-builder.tar.gz
cd image-builder/src/compress/
vim base.sh
#修改419行
xz -ck -T0 -9 -vv "$3" > "$3".xz || return 1
#改成
xz -c -T$(nproc) -vv "$3" > "$3".xz || return 1

这里做了三个更改

  • 去除-k参数,这样就不会保留原始的linux.img,反正我们一般也不会保留压缩前的,第一次使用这个脚本建议还是留着
  • T0改为T$(nproc):这样使用全部cpu核心去执行压缩操作,加快速度
  • 去除-9这个参数,这个参数表示最大压缩率,虽然去除会导致压缩后的文件变大一些,但是能有效减少内存占用。实测大约需要20G内存执行-9这个压缩级别。内存不够会导致报错。

4、执行

bash base.sh -c ubuntu/22.04 /dev/sdX linux.img		#ubuntu
bash base.sh -c openEuler/22.03/ /dev/sdX linux.img	#openEuler

说明:此处的sdX是上面第二步lsblk显示的编号,或者用fdisk -l查找,就是可能比较乱
等待其提示[COMPRESS] sd card compress success!
然后我们可以在image-builder/src/compress目录下看到linux.imglinux.img.xz两个文件。当然我们选择只保存后者啦。

5、卸载sd卡

在 WSL 中完成设备使用后,可物理断开 USB 设备,或者从 PowerShell 运行
二选一,效果一样

usbipd unbind -b 2-6		#停止共享
usbipd detach --busid 2-6	#卸载这个设备

3、VMware虚拟机

这里遇到一个问题,不知道是不是vm17的问题,我把sd卡连接到虚拟机,提示我驱动不兼容,然后虚拟机内看不到,物理机也看不到。
解决办法很简单,添加物理磁盘就行了。
使用管理员权限启动VMware
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关于设备问题,0一般都是你的系统盘,不知道就都试一下,添加后看大小就行了。
其他步骤和wsl内一致。

4、注意事项

导出的镜像不包含你的wifi连接信息,或者说包含,但是首次启动时会写入官方的配置导致无法自动连接wifi。需要通过串口或者网口重新配网。

四、问题

1、添加的欢迎信息不显示

这里我使用以下命令,在终端执行是正常的,但加入motd后不显示

cowsay -W 35 Mirror production time: 24.02.19 Made by toolsmanhehe | toilet -f term --gay

在这里插入图片描述
后面经过查询,得知motd不支持动态输入,但是我们可以曲线实现,把动态输入变为静态。

cowsay -g -W 35 "Mirror production time: 24.02.19" "Made by toolsmanhehe" | toilet -f term --gay > /etc/motd.cowsay	#-g是把眼镜变成$

之后看一下效果,并加入motd内容中

cat /etc/motd.cowsay

在这里插入图片描述

2、apt报错

报错内容如下

Failed to retrieve available kernel versions.
Failed to check for processor microcode upgrades.

虽然不影响使用,但是作为强迫症晚期患者,眼不见为净

sudo vim /etc/needrestart/needrestart.conf
#找到kernelhints和ucodehints,去掉注释,并将其改为
$nrconf{kernelhints} = 0;
$nrconf{ucodehints} = 0;

究极解决办法

sudo apt-get purge needrestart

总结

emmm,现在应该只剩下硬件问题了,这个是真的要费脑子了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

notepad++运行python闪一下就没啦

问题&#xff1a;Notepad直接快捷键运行Python代码,出现闪一下就没了 解决措施&#xff1a; ①点击菜单运行(Run) --> 运行(Run)弹出的对话框 ②把 cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT 粘贴进入这个对话框内 ③点击保存&a…

Rust Vs Go:从头构建一个web服务

Go 和 Rust 之间的许多比较都强调它们在语法和初始学习曲线上的差异。然而&#xff0c;最终的决定性因素是重要项目的易用性。 “Rust 与 Go”争论 Rust vs Go 是一个不断出现的话题&#xff0c;并且已经有很多关于它的文章。部分原因是开发人员正在寻找信息来帮助他们决定下…

EventStream获得数据流,前端配置获得推送的流

如上图所示&#xff0c;请求一个接口&#xff0c;接口以数据流的方式向客户端推送数据&#xff0c;默认需要消息收集一条&#xff0c;在原来的基础上追加&#xff0c;在create-react-app生成的工程中&#xff0c;如果代理使用了中间件http-proxy-middleware&#xff0c;同时dev…

强化学习(GPS)

GPS——Guided Policy Search引导策略搜索 基于模型的强化学习算法 GPS目前被作为基础算法广泛应用于各种强化学习任务中&#xff0c;其出发点在于纯粹的策略梯度方法在更新参数时不会用到环境模型因而属于一种无模型强化学习算法。由于没有利用任何环境的内在属性&#xff0…

stm32cubemx简单介绍

&#xff08;本文为简单介绍&#xff0c;内容源于网络&#xff09; STM32CubeMX是STMicroelectronics推出的一款用于STM32微控制器系列的图形化配置工具&#xff0c;旨在简化嵌入式软件开发过程。本文将对STM32CubeMX进行简要介绍&#xff0c;包括其功能特点、优势以及在嵌入式…

猫头虎分享已解决Bug || RuntimeError: size mismatch, m1: [32 x 100], m2: [500 x 10]

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2.22学习总结

1.营救 2.租用游艇 3.砍树 4.买礼物 5.刷题统计 砍树https://www.dotcpp.com/oj/problem3157.html 题目描述 给定一棵由 n 个结点组成的树以及 m 个不重复的无序数对 (a1, b1), (a2, b2), . . . , (am, bm)&#xff0c;其中 ai 互不相同&#xff0c;bi 互不相同&#xff0c;ai…

Spring 类型转换、数值绑定与验证(一)— DataBinder

DataBinder 是Spring用于数据绑定、类型转换及验证的类。使用场景有&#xff1a;1&#xff09;xml配置文件定义bean,Spring 内部使用DataBinder 来完成属性的绑定&#xff1b;2&#xff09;Web请求参数绑定&#xff0c;在Spring MVC 中&#xff0c;Controller的方法参数通常会自…

还在为选择办公软件而烦恼吗?不妨试试ONLYofficeV8.0

目录 一.优势一DOC 1.丰富的文字处理功能 2.按用户既定的规则编辑 3.使用AI助手 4.保持创意 5.深入分析文本 6.改善团队工作流程 7.轻松对比文档 8.扩展编辑功能 二.优势二sheet 1.数据分析 2.轻松实现精准计算 3.轻松分析数据 4.可视化呈现数据 5.增强团队协作…

opencv图像放缩与插值-resize函数

在OpenCV中&#xff0c;resize函数用于对图像进行尺寸调整&#xff08;放大或缩小&#xff09;&#xff0c;这个过程中通常需要用到插值方法来计算新尺寸下图像像素的值。插值方法对于放缩的质量有着直接影响。 void resize(InputArray src, OutputArray dst, Size dsize, dou…

谷粒商城篇章9 ---- P248-P261/P292-P294 ---- 消息队列【分布式高级篇六】

目录 1 消息队列(Message Queue)简介 1.1 概述 1.2 消息服务中两个重要概念 1.3 消息队列主要有两种形式的目的地 1.4 JMS和AMQP对比 1.5 应用场景 1.6 Spring支持 1.7 SpringBoot自动配置 1.7 市面上的MQ产品 2 RabbitMQ 2.1 RabbitMQ简介 2.1.1 RabbitMQ简介 2…

软件测试之测试用例超详细总结

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、通用测试用例八要素   1、用例编号&#xff1b;    2、测试项目&#xff1b;   3、测…