在基于全志V851se的TinyVision上手动构建 Linux 6.1 + Debian 12 镜像

构建 SyterKit 作为 Bootloader

SyterKit 是一个纯裸机框架,用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板,SyterKit 使用 CMake 作为构建系统构建,支持多种应用与多种外设驱动。同时 SyterKit 也具有启动引导的功能,可以替代 U-Boot 实现快速启动

获取 SyterKit 源码

SyterKit 源码位于GitHub,可以前往下载。

git clone GitHub - YuzukiHD/SyterKit: SyterKit is a baremetal framework, As bootloader, MPU framework, Support T113, V853, H618, T527, Running on SRAM

从零构建 SyterKit

构建 SyterKit 非常简单,只需要在 Linux 操作系统中安装配置环境即可编译。SyterKit 需要的软件包有:

  • gcc-arm-none-eabi
  • CMake

对于常用的 Ubuntu 系统,可以通过如下命令安装

sudo apt-get update
sudo apt-get install gcc-arm-none-eabi cmake build-essential -y

然后新建一个文件夹存放编译的输出文件,并且进入这个文件夹

mkdir build
cd build

然后运行命令编译 SyterKit

cmake ..
make

f6cd8396-6b9e-4171-a32f-b6e908fa1fb9-image.png

编译后的可执行文件位于 build/app 中,这里包括 SyterKit 的多种APP可供使用。

ecd7330e-1281-4296-9de7-0433e12fef2f-image.png

这里我们使用的是 syter_boot 作为启动引导。进入 syter_boot 文件夹,可以看到这些文件

d631adb8-9d69-4f38-99f4-f080a3d04cc4-image.png

由于 TinyVision 是 TF 卡启动,所以我们需要用到 syter_boot_bin_card.bin

0bee1188-3372-4a0a-94c3-5ae19322eab3-image.png

编译 Linux-6.1 内核

由于 Debian 12 配套的内核是 Linux 6.1 LTS,所以这里我们选择构建 Linux 6.1 版本内核。

搭建编译环境

安装一些必要的安装包

sudo apt-get update && sudo apt-get install -y gcc-arm-none-eabi gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf build-essential libncurses5-dev zlib1g-dev gawk flex bison quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lsof

获取内核源码

内核源码托管在 Github 上,可以直接获取到,这里使用 --depth=1 指定 git 深度为 1 加速下载。

git clone GitHub - YuzukiHD/TinyVision: TinyVision - A Tiny Linux Board / IPC / Server / Router / And so on... --depth=1

然后进入内核文件夹

cd kernel/linux-6.1

配置内核选项

应用 defconfig

CROSS_COMPILE=arm-linux-gnueabihf- make ARCH=arm tinyvision_defconfig

进入 menuconfig 配置选项

CROSS_COMPILE=arm-linux-gnueabihf- make ARCH=arm menuconfig

进入 General Setup ->,选中 Control Group Support

image-20231221104449523

image-20231221122711591

前往 File Systems 找到 FUSE (Filesystem in Userspace) support

image-20231221104607368

前往 File Systems 找到 Inotify support for userspace

image-20231221122848948

编译内核

CROSS_COMPILE=arm-linux-gnueabihf- make ARCH=arm

使用 debootstrap 构建 debian rootfs

准备环境,依赖

下载安装依赖环境

sudo apt install debootstrap qemu qemu-user-static qemu-system qemu-utils qemu-system-misc binfmt-support dpkg-cross debian-ports-archive-keyring --no-install-recommends

生成目标镜像,配置环境,这里我们生成一个 1024M 的镜像文件用于存放 rootfs

dd if=/dev/zero of=rootfs.img bs=1M count=1024
mkdir rootfs
mkfs.ext4 rootfs.img
sudo mount rootfs.img rootfs

开始构建基础 rootfs

这里我们选择最新的 debian12 (bookwarm) 作为目标镜像,使用清华源来构建,输出到目标目录 rootfs_data 文件夹中。新版本的 debootstrap 只需要运行一次即可完成两次 stage 的操作,相较于老版本方便许多。

sudo debootstrap --arch=armhf bookworm rootfs_data Index of /debian/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

image-20231221093653561

看到 I: Base system installed successfully. 就是构建完成了

image-20231221094602269

等待构建完成后,使用chroot进入到目录,这里编写一个挂载脚本方便挂载使用,新建文件 ch-mount.sh 并写入以下内容:

#!/bin/bashfunction mnt() {echo "MOUNTING"sudo mount -t proc /proc ${2}procsudo mount -t sysfs /sys ${2}syssudo mount -o bind /dev ${2}devsudo mount -o bind /dev/pts ${2}dev/pts		sudo chroot ${2}
}function umnt() {echo "UNMOUNTING"sudo umount ${2}procsudo umount ${2}syssudo umount ${2}dev/ptssudo umount ${2}dev}if [ "$1" == "-m" ] && [ -n "$2" ] ;
thenmnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
thenumnt $1 $2
elseecho ""echo "Either 1'st, 2'nd or both parameters were missing"echo ""echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"echo ""echo "For example: ch-mount -m /media/sdcard/"echo ""echo 1st parameter : ${1}echo 2nd parameter : ${2}
fi

然后赋予脚本执行的权限

chmod 777 ch-mount.sh
  • 使用 ./ch-mount.sh -m rootfs_data 挂载
  • 使用 ./ch-mount.sh -u rootfs_data 卸载

执行挂载,可以看到进入了 debian 的 rootfs

image-20231221094725953

配置系统字符集,选择 en_US 作为默认字符集

export LC_ALL=en_US.UTF-8
apt-get install locales
dpkg-reconfigure locales

选择一个就可以

image-20231221095332517

直接 OK 下一步

image-20231221095409399

安装 Linux 基础工具

apt install sudo ssh openssh-server net-tools ethtool wireless-tools network-manager iputils-ping rsyslog alsa-utils bash-completion gnupg busybox kmod wget git curl --no-install-recommends

安装编译工具

apt install build-essential

安装 Linux nerd 工具

apt install vim nano neofetch

设置本机入口 ip 地址

cat <<EOF > /etc/hosts
127.0.0.1       localhost
127.0.1.1       $HOST
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
EOF

配置网卡

mkdir -p /etc/network
cat >/etc/network/interfaces <<EOF
auto lo
iface lo inet loopbackauto eth0
iface eth0 inet dhcp
EOF

配置 DNS 地址

cat >/etc/resolv.conf <<EOF
nameserver 1.1.1.1
nameserver 8.8.8.8
EOF

配置分区

cat >/etc/fstab <<EOF
#<file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mmcblk0p1  /boot   vfat    defaults                0       0
/dev/mmcblk0p2  /       ext4    defaults,noatime        0       1
EOF

配置 root 密码

passwd

配置主机名

echo TinyVision > /etc/hostname

退出 chroot

exit

取消挂载 chroot

./ch-mount.sh -u rootfs_data/

拷贝 rootfs 到镜像中

sudo cp -raf rootfs_data/* rootfs

取消挂载

sudo umount rootfs

至此 debian rootfs 就制作好了。

打包固件

编译完成 bootloader,内核,rootfs 后,还需要打包固件成为可以 dd 写入的固件,这里我们使用 genimage 工具来生成构建。

生成刷机镜像

编译内核后,可以在文件夹 arch/arm/boot/dts/allwinner 生成sun8i-v851se-tinyvision.dtb ,在文件夹arch/arm/boot 生成 zImage ,把他们拷贝出来。

33140ec9-fd56-4cef-9250-ffa210b74178.png

然后将 sun8i-v851se-tinyvision.dtb 改名为 sunxi.dtb ,这个设备树名称是定义在 SyterKit 源码中的,如果之前修改了 SyterKit 的源码需要修改到对应的名称,SyterKit 会去读取这个设备树。

然后编写一个 config.txt 作为配置文件

[configs]
bootargs=root=/dev/mmcblk0p2 earlyprintk=sunxi-uart,0x02500000 loglevel=2 initcall_debug=0 rootwait console=ttyS0 init=/sbin/init
mac_addr=4a:13:e4:f9:79:75
bootdelay=3

安装 GENIMAGE

这里我们使用 genimage 作为打包工具

sudo apt-get install libconfuse-dev #安装genimage依赖库
sudo apt-get install genext2fs      # 制作镜像时genimage将会用到
git clone GitHub - pengutronix/genimage: tool to generate multiple filesystem and flash images from a tree
cd genimage
./autogen.sh                        # 配置生成configure
./configure                         # 配置生成makefile
make
sudo make install

编译后运行试一试,这里正常

8dd643b9-5f40-4b9e-a355-457fd80d8c5b.png

使用 GENIMAGE 打包固件

编写 genimage.cfg 作为打包的配置

image boot.vfat {vfat {files = {"zImage","sunxi.dtb","config.txt"}}size = 32M
}image sdcard.img {hdimage {}partition boot0 {in-partition-table = "no"image = "syter_boot_bin_card.bin"offset = 8K}partition boot0-gpt {in-partition-table = "no"image = "syter_boot_bin_card.bin"offset = 128K}partition kernel {partition-type = 0xCbootable = "true"image = "boot.vfat"}partition rootfs {partition-type = 0x83bootable = "true"image = "rootfs.img"}
}

由于genimage的脚本比较复杂,所以编写一个 genimage.sh 作为简易使用的工具

#!/usr/bin/env bashdie() {cat <<EOF >&2
Error: $@Usage: ${0} -c GENIMAGE_CONFIG_FILE
EOFexit 1
}# Parse arguments and put into argument list of the script
opts="$(getopt -n "${0##*/}" -o c: -- "$@")" || exit $?
eval set -- "$opts"GENIMAGE_TMP="${BUILD_DIR}/genimage.tmp"while true ; docase "$1" in-c)GENIMAGE_CFG="${2}";shift 2 ;;--) # Discard all non-option parametersshift 1;break ;;*)die "unknown option '${1}'" ;;esac
done[ -n "${GENIMAGE_CFG}" ] || die "Missing argument"# Pass an empty rootpath. genimage makes a full copy of the given rootpath to
# ${GENIMAGE_TMP}/root so passing TARGET_DIR would be a waste of time and disk
# space. We don't rely on genimage to build the rootfs image, just to insert a
# pre-built one in the disk image.trap 'rm -rf "${ROOTPATH_TMP}"' EXIT
ROOTPATH_TMP="$(mktemp -d)"
GENIMAGE_TMP="$(mktemp -d)"
rm -rf "${GENIMAGE_TMP}"genimage \--rootpath "${ROOTPATH_TMP}"     \--tmppath "${GENIMAGE_TMP}"    \--inputpath "${BINARIES_DIR}"  \--outputpath "${BINARIES_DIR}" \--config "${GENIMAGE_CFG}"

准备完成,文件如下所示

8986491d-003b-479e-9ef0-01f3c93ca43c.png

运行命令进行打包

chmod 777 genimage.sh
./genimage.sh -c genimage.cfg

1ad6cdd4-59b6-4089-a5f4-2aac0e3538ef.png

打包完成,可以找到 sdcard.img

使用软件烧录固件到TF卡上

d06e037d-102f-46cc-80c1-49b47f72b8b1.png

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

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

相关文章

mysql数据类型和常用函数

目录 1.整型 1.1参数signed和unsigned 1.2参数zerofill 1.3参数auto_increment 2.数字类型 2.1floor()向下取整 2.2随机函数rand() 2.3重复函数repeat() 3.字符串类型 3.1length()查看字节长度&#xff0c;char_length()查看字符长度 3.2字符集 3.2.1查看默认字符…

海外舆情监控的重要性以及云手机的推荐

海外市场不仅有着无尽的商机&#xff0c;同时也存在着各种各样的挑战。例如&#xff0c;海外市场舆情的复杂变化给企业带来了潜在风险&#xff0c;尤其在新媒体技术快速发展的时代&#xff0c;舆论对企业品牌形象的影响日益巨大。本文将详细探讨海外舆情监控的重要性以及为大家…

FlorisBoard:Android开源键盘的现代化选择

FlorisBoard&#xff1a;Android开源键盘的现代化选择 简介 FlorisBoard是一款免费且开源的安卓键盘&#xff0c;适用于Android 7.0及以上版本的设备。它的现代化设计和用户友好的界面使其在众多键盘应用中脱颖而出。FlorisBoard的独特之处在于它注重用户体验的同时&#xff0…

抖音视频提取工具可导出视频分享链接|视频爬虫批量下载

抖音无水印视频批量下载工具操作指南 一、工具介绍 我们开发了一款功能强大的视频批量下载工具&#xff0c;不仅能够通过单个视频链接进行提取&#xff0c;还可以通过关键词进行视频搜索&#xff0c;Q:290615413实现批量提取和有选择性的下载。 二、操作步骤 2.1 关键词批量…

IO网络通信

IO Bio&#xff1a; 同步阻塞&#xff0c;一个线程一次连接&#xff0c;基于字符流/字节流 Nio&#xff1a;同步非阻塞 一个线程多个连接&#xff0c;多个请求注册到多路复用selector上&#xff0c;多路复用器轮训连接 面向缓冲区&#xff0c; 从某通道读取数据到缓存区&…

Android:adb命令

执行adb命令的窗口如下 Mac或Linux系统里的终端窗口&#xff1b; window系统运行输入cmd打开的指令窗口&#xff1b; Android Studio 里控制下面的Terminal窗口 1. 查看已链接的设备和模拟器 adb devices -l 2. 查看Android内核版本号 adb shell getprop ro.build.version.re…

数据结构和算法:哈希表

哈希表 哈希表&#xff08;hash table&#xff09;&#xff0c;又称散列表&#xff0c;它通过建立键 key 与值 value 之间的映射&#xff0c;实现高效的元素查询。具体而言&#xff0c;向哈希表中输入一个键 key &#xff0c;则可以在 &#x1d442;(1) 时间内获取对应的值 va…

CSS样式表 样式优先级 选择器以及选择器的权重优先级

CSS组成 css由选择符和声明组成&#xff0c;声明又分为属性和属性值 属性必须放在花括号里面&#xff0c;属性与属性值必用冒号连接 每条声明用分号结束 当一个属性有多个属性值的时候&#xff0c;属性值与属性值部分先后顺序&#xff0c;用空格隔开 在书写样式过程中、空格、换…

软文营销塑造品牌形象,迅推客助力企业成功求发展

企业可以选择适合自身的新闻宣传方法。迅推客作为互联网整合营销机构&#xff0c;积极推动软文营销&#xff0c;助力企业塑造高端品牌形象。 1、新闻稿战略规划。 新闻宣传前要有明确的战略规划。在新闻稿的创作过程中&#xff0c;企业的需求与消费者的需求巧妙地融合在一起。…

室内3D模型选择指南:哪家更值得信赖?

如今室内设计的3D模型已经成为了一种重要的设计工具。它们能够帮助设计师们更好地向客户展示他们的设计想法&#xff0c;同时也让客户能够更直观地理解他们的需求。然而&#xff0c;面对市场上众多的室内3D模型网站&#xff0c;我们该如何选择呢? 室内3D模型选择指南&#xff…

echarts系列:echarts增加loading

背景 最近在大屏项目研发时&#xff0c;存在多个echarts图表&#xff0c;有些接口获取数据较慢&#xff0c;需要加loading样式&#xff1b; 解决方案 翻阅api&#xff0c;找到showLoading可进行设置 参考&#xff1a; 加载动画效果 显示加载动画效果。可以在加载数据前手动…

10个优秀的Github开源项目

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板 EX-chatGPT-精准搜索工具 feishu-chatgpt-飞一般的工作体验工具 Knife4j-是一个集Swagger2 和 OpenAPI3为一体的增强解决方案 Kooder 是 Gitee 团队开发的一个代码搜索系统 mtbird 是一款低代码可视化页面生成器 S…

docker一键部署若依前后端分离版本

比如这里把文件放到/xin/docker/jiaoZ/的目录下&#xff0c;jar包和下面的配置文件都放在这个文件夹下。 注意要把jar端口改为你实际启动的&#xff0c;映射端口也可以改为你想要的。 这里的映射端口为&#xff1a;nginx监听80端口&#xff0c;jar在8620端口&#xff0c;mysq…

Emotion Prompt-LLM能够理解并能通过情感刺激得以增强

Large Language Models Understand and Can be Enhanced by Emotional Stimuli 情感智能对我们的日常行为和互动产生了显著的影响。尽管大型语言模型&#xff08;LLMs&#xff09;被视为向人工通用智能迈进的一大步&#xff0c;在许多任务中表现出色&#xff0c;但目前尚不清楚…

matlab 条件数的倒数

目录 一、概述1、算法概述2、主要函数3、参考文献二、条件设置错误的矩阵的敏感度三、求解单位矩阵的条件四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 1、算法概述

.locked勒索病毒是什么,企业数据被加密了如何恢复?

.locked勒索病毒介绍 .locked勒索病毒是一种恶意软件&#xff0c;它利用加密技术锁定用户的数据或系统&#xff0c;并以此进行勒索。用户一旦感染此病毒&#xff0c;将无法访问其重要文件&#xff0c;病毒会要求用户支付一笔赎金以获取解密密钥。这种病毒通常使用强大的加密算法…

PMP证书可以挂靠?

PMP项目管理是由美国项目管理协会&#xff08;PMI&#xff09;提出的&#xff0c;针对项目管理专业人士的资格认证。它被公认为全球项目管理领域含金量最高的认证&#xff0c;与MBA、MPA并列为三大就业金字招牌。PMP认证在全球190多个国家及地区得到高度认可。通过PMP认证考试可…

面试常问:为什么 Vite 速度比 Webpack 快

前言 最近作者在学习 webpack 相关的知识&#xff0c;之前一直对这个问题不是特别了解&#xff0c;甚至讲不出个123....&#xff0c;这个问题在面试中也是常见的&#xff0c;作者在学习的过程当中总结了以下几点&#xff0c;在这里分享给大家看一下&#xff0c;当然最重要的是…

什么是Java语言的反射机制?

什么是反射 反射&#xff08;Reflection&#xff09;主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。&#xff08;就像照镜子反射一样&#xff09; Java反射机制是指在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&…

docker -compose运行时端口被占用异常

解决方法&#xff1a;在docker-compose.yml文件中去掉端口的配置&#xff08;去掉下图圈住部分&#xff09;&#xff0c;我们要启动5个&#xff0c;配置了端口我们只能启动一个&#xff0c;所以就会报错