当前位置: 首页 > ai >正文

【ZYNQ Linux移植】5-根文件系统移植

文章目录

  • 0 写在前面
  • 1 根文件系统介绍
  • 2 SD卡分区
  • 3 不同根文件系统的移植
    • 3.1 Petalinux提供的根文件系统
      • 3.1.1 获取相关文件
      • 3.1.2 Petalinux 系统测试
    • 3.2 Debian系统
      • 3.2.1 获得 Debian 的最小系统
      • 3.2.2 移植内核模块
      • 3.2.3 Debian系统测试
    • 3.3 Ubuntu系统
      • 3.3.1 获得 Ubuntu 的最小系统
      • 3.3.2 移植内核模块
      • 3.3.3 Ubuntu系统测试
  • 4 自动加载内核与启动镜像
  • 5 总结
  • 6 参考资料

0 写在前面

       这是一个系列博客,详细介绍如何在 ZYNQ 与 ZYNQ MP 平台上如何移植 Linux 系统。目前网络上的大部分教程都是全程基于 Petalinux 的开发,虽然这样简化了开发流程,但对于初学者深入理解掌握 Linux 是不利的,所以,有了这个系列的博客,从几乎为 0 开始教大家怎么移植 Linux 系统。

       本人的软件与环境版本:

       Windows 的 Vivado 与 Vitis 版本:2020.2(前期学习 ZYNQ7020 跟随正点原子安装);

       Ubuntu版本:18.04.2

       虚拟机上的 Vivado、Vitis 与 Petalinux 版本:2020.1(前期学习 ZYNQ MP 跟随 Alinx 安装)。

       所有相关的文件存放在虚拟机的以下路径:

~/Linux_tp

       如果后面涉及到一些命令行操作的文件路径,大家可以参考着修改为自己的路径。

在这里插入图片描述

​       此外,我后续的操作与实测都是黑金(Alinx)基于 ZYNQ MP 系列的 zu3eg 操作,但基本也会对 ZYNQ-7000系列的一些不同做一些说明,如果你使用的是 ZYNQ-7000 系列的板卡,可以自己灵活变通一下。

1 根文件系统介绍

​       根文件系统(Root Filesystem)是 Linux/Unix 系统中最顶层的文件系统,是内核启动后挂载的第一个文件系统(挂载点为/),包含了操作系统运行所需的关键目录结构、设备文件、配置文件、命令工具和库等。它是系统运行的基石,所有其他文件系统(如/home/boot等)都直接或间接挂载在其下。

       Linux 根文件系统遵循 **FHS(Filesystem Hierarchy Standard)**规范,常见目录包括:

目录名称描述
/bin存放系统需要的可执行文件
/dev设备文件目录,所有硬件设备都是以文件的形式存在
/etc存放各种服务程序的配置文件
/lib库文件的存放目录
/mnt临时挂载目录,一般SD卡,NFS会临时挂在这
/proc虚拟的文件系统,里面都是临时文件,用来存储系统运行信息文件
/usrUnix Software Resource(不是user)缩写,存放用户级数据和程序
/var存放一些动态的程序数据,如系统日志等
/sbin存放系统管理员常用的管理程序,只有管理员权限才可以使用
/sys最终使用的配置文件
/opt可选的文件、软件存放区
/home普通用户工作目录
/root超级用户的工作目录

       知道了大致的结构,接下来,我们开始移植!

2 SD卡分区

       使用 SD 卡启动 Linux,通常会把 SD 卡分为 FAT 和 EXT4 文件系统两个分区,具体原因,我曾经写过一篇:嵌入式Linux开发为什么要设置FAT与EXT两个分区,这里就只讲分区操作了。

​       把 SD 卡放入读卡器插入电脑,如果用的是虚拟机,需要注意把它连接到虚拟机上,VMWare是在右下角找到设备,右击,选择连接(断开与主机的连接)

​       如果是开启虚拟机后插入,一般会提示让你选择连接到主机还是虚拟机。

​       此时需要以此从上至下点击框选处才能连上。

       连接成功后,点击左下角的显示应用程序,在搜索栏中输入disk:

​       点击磁盘或disk进入:

​       选择对应的 SD 卡,不管原来有多少个分区,这里都建议先全部删除注意备份重要文件!

​       删除完后,点击 + 重新添加分区:

​       我这里给 FAT 分区分配 5G 空间

​       剩下的空间留下1G不做分配,其余的全分配给EXT分区:

​       分区完了,记得给两个分区进行挂载,这样才能往里面进行读写。

​       至此,就完成了 SD 卡分区。

3 不同根文件系统的移植

       移植根文件系统主要围绕以下三个问题进行:

       (1)首先是怎么得到文件系统

​       (2)然后是怎么让根文件系统活起来(与Linux内核有机结合起来)?

​       (3)最后是怎么在电脑/虚拟机上给系统安装软件以及进行配置

       先给出前面两问的答案:如果用 Petalinux,Xilinx已经为我们一条龙安排好了,直接用即可。如果不用 Xilinx 官方的,自己也不会写,那就使用别人做好的根文件系统,再把上一篇:【ZYNQ Linux移植】4-内核移植 中编译好的内核的模块文件放进根文件系统。

3.1 Petalinux提供的根文件系统

3.1.1 获取相关文件

​       当我们使用 Petalinux-build 命令完成对于工程的编译后,会在以下目录生成 Petalinux 为我们准备好的根文件系统:

工程根目录/images/linux

​       我们要做的,就是使用下面命令把它里面的内容解压到我们上面挂载的 EXT 分区(目录根据自己情况修改):

sudo tar -zxvf /home/chj/peta_prj/linuxPsBase/petalinux/images/linux/rootfs.tar.gz -C /media/chj/EXT

​       同时,需要把三个文件复制到 FAT 分区:

cp /home/chj/peta_prj/linuxPsBase/petalinux/images/linux/boot.scr /home/chj/peta_prj/linuxPsBase/petalinux/images/linux/BOOT.BIN /home/chj/peta_prj/linuxPsBase/petalinux/images/linux/image.ub /media/chj/FAT

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

       都完成后,再执行以下命令,完成同步

sudo sync

3.1.2 Petalinux 系统测试

​       调整板卡至 SD 卡启动模式,上电启动,如果前面跟着操作的话,这里可能因为我们修改了 bootargs 环境变量导致无法直接启动系统,这时输入以下命令,把环境变量先恢复默认:

env default -a
saveenv

​       再重新上电,应该就可以正常启动了,如果还不行,就重新用 Petalinux 编译生成 BOOT.BIN 再重新拷贝。

​       正常启动后如下:

在这里插入图片描述

       我原来在根文件系统进行了设置,直接登录,如果需要输入账号密码,则两者都是 root

       由于是一个全新的系统,当前用户目录下是没有文件的,所以 ls 没有结果,不要为此以为出了什么问题,可以进入根目录看看,后面的系统也是一样的:

cd /
ls

3.2 Debian系统

3.2.1 获得 Debian 的最小系统

​       在第一篇:【ZYNQ Linux移植】1-前期准备 中,我们已经获取了 Debian 的最小系统,这里不再赘述,没有获取的可以进去参考一下。

3.2.2 移植内核模块

       首先我们需要先清除掉 SD 卡中原有的文件,FAT 分区直接图形化界面删除较快,EXT 分区需要使用命令(**注意确保当前路径在 EXT 分区下!!!**建议直接在 EXT 分区右键打开终端):

sudo rm -rf *

​       再把【ZYNQ Linux移植】3-u-boot移植 中获取的 BOOT.bin 以及【ZYNQ Linux移植】4-内核移植 中获取的Imagesystem-dtb 放入 SD 卡 FAT 分区:

       最后明确一下,内核模块在哪里!它的位置为:

内核源码/lib

       当然,首先得保证已经编译成功了。我们要做的是把这个目录下所有文件都复制到我们在第一篇:【ZYNQ Linux移植】1-前期准备 中解压出来的 debian 根文件系统的 lib 目录

sudo cp -av /home/chj/Linux_tp/linux-xlnx-xlnx_rebase_v5.4/lib/* /home/chj/Linux_tp/debian96/lib/

​       然后把处理后的 debian 根文件系统复制到 EXT 分区:

sudo cp -av /home/chj/Linux_tp/debian96/* /media/chj/EXT

​       ​最后也不要忘了同步:

sudo sync

3.2.3 Debian系统测试

​       调整板卡至 SD 卡启动模式,上电启动,跟上面出现一样的问题:

​       因为上面用 Petalinux 测试了,所以这里需要把环境变量改回来:

setenv bootargs 'console=ttyPS0,115200 root=/dev/mmcblk1p2'
saveenv

​       再重新上电或者使用 u-boot 命令重启

reset

​       后续像验证 Linux 内核一样,尝试启动镜像:

fatload mmc 1:1 2000000 image
fatload mmc 1:1 1000000 system-top.dtb
booti 0x2000000 - 0x1000000

​       最后就启动成功了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

​       就如第一篇:【ZYNQ Linux移植】1-前期准备 所说,debian 会在登录时提示默认的账号和密码,我们直接输入就可以了,不需要记住

​       与 Petalinux 移植的系统一样,进入根目录,看看文件:

cd /
ls

​       至此,debian 系统移植完毕。

3.3 Ubuntu系统

3.3.1 获得 Ubuntu 的最小系统

​​       在第一篇:【ZYNQ Linux移植】1-前期准备 中,我们已经获取了 Ubuntu 的最小系统,这里不再赘述,没有获取的可以进去参考一下。

3.3.2 移植内核模块

​​       与前面一样,我们需要先清除掉 SD 卡中原有的文件,如果前面也尝试了移植 Debian 系统,这里 FAT 分区 内容不变即可,EXT 分区需要使用命令(**注意确保当前路径在 EXT 分区下!!!**建议直接在 EXT 分区右键打开终端):

sudo rm -rf *

​       把内核模块复制到解压出来的 ubuntu 根文件系统的 lib 目录

sudo cp -av /home/chj/Linux_tp/linux-xlnx-xlnx_rebase_v5.4/lib/* /home/chj/Linux_tp/ubuntu/lib/

​       然后把处理后的 ubuntu 根文件系统复制到 EXT 分区:

sudo cp -av /home/chj/Linux_tp/ubuntu/* /media/chj/EXT

​       最后也不要忘了同步:

sudo sync

3.3.3 Ubuntu系统测试

​​       调整板卡至 SD 卡启动模式,如果跟着 3.3.2 设置了环境变量,就能直接启动,如果没有,可以回去看 3.3.2 节修改相关的环境变量(bootargs)。

​       同样地,像验证 Linux 内核一样,尝试启动镜像:

fatload mmc 1:1 2000000 image
fatload mmc 1:1 1000000 system-top.dtb
booti 0x2000000 - 0x1000000

​​       最后就启动成功了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

​​       ubuntu 的话打印的 log 会少一些,默认进入的就是根目录,可以自己执行一些命令查看一下:

pwd
cd /
ls

​​       至此,ubuntu 也移植成功了。

4 自动加载内核与启动镜像

​​       大家可能会发现,我们一路下来,移植都要手动地在 u-boot 输入相关的命令才能启动 Linux,这好像与我们预想的不符,真正运用时,总不能连上串口,通过串口输命令来启动吧,下面来解决这个问题。

​​​       前面,我们已经通过修改 u-boot 的环境变量 bootargs 来修改启动的位置(根文件系统的位置),这里涉及的是另一个环境变量——bootcmd

​​​       我们先看看默认情况下,它是什么:

在这里插入图片描述

​​​       结果为:run default_bootcmd,字面意思就是用默认的启动命令,其实,它是我们在第三篇:【ZYNQ Linux移植】3-u-boot移植 中创建板卡配置文件时,加在最后面的。那这个 default_bootcmd 是什么呢?不知道,我们就打印一下:

print default_bootcmd

​​​       结果为:run sdboot

在这里插入图片描述
       好吧,这个我们也看不明白,继续深入:

print sdboot

       输出的内容为:

if mmcinfo; then run uenvboot; echo Copying Linux from SD to RAM... && load mmc 0 ${kernel_load_address} ${kernel_image} && bootm ${kernel_load_address}; fi

​​       解析一下就是说如果检测 SD 卡是否存在,不存在就直接退出,存在则执行 uenvboot(初始化环境),打印信息“Copying Linux from SD to RAM…” 并且从 mmc0 加载内核到内存,最后启动内核。

​​       而实际上,我们 ZYNQ 的 mmc0 一般都是配置为 EMMC 的,SD卡作为 mmc1。

在这里插入图片描述

​​       那做法就显而易见了,为了避免环境变量间的耦合,我们这里就直接修改 bootcmd,再保存重启即可:

setenv bootcmd 'fatload mmc 1 ${kernel_addr_r} Image; fatload mmc 1 ${fdt_addr_r} system-top.dtb; booti ${kernel_addr_r} - ${fdt_addr_r}'
saveenv
reset

​​       然后就会发现u-boot 已经可以自动加载内核启动系统了。

5 总结

​​       ubuntu 的话打印的 log 会少一些,默认进入的就是根目录,可以自己执行一些命令查看一下:移植根文件系统的步骤可以总结如下:

​​​       1,将 SD 卡分为 FAT 与 EXT 两个分区,前者存放启动相关文件,后者存放根文件系统;

​​       2,把编译好的 Linux 内核模块都复制到对应系统根目录的 lib 文件夹下(Petalinux不需要,相当于它帮我们做了);

​​       3,把根文件系统完全拷贝至 EXT 分区,把 BOOT.bin 、image 和 .dtb 拷贝至 FAT 分区。

​​       4,如果需要上电 u-boot 启动后直接加载镜像与启动系统,可以对 u-boot 的环境变量 bootcmd 做一定修改。

6 参考资料

1,DeepSeeker相关搜索结果;

2,《正点原子 MPSoC-P5B之嵌入式Linux开发指南_V1.0》

http://www.xdnf.cn/news/5554.html

相关文章:

  • C++匿名函数
  • Babylon.js学习之路《三、创建你的第一个 3D 场景:立方体、球体与平面》
  • MyBatis 动态 SQL 核心标签教程:_if_, _where_, _foreach_
  • 第六节第一部分:认识抽象类及其好处
  • 字节高效图像定制生成模型框架:DreamO论文速读
  • 【数据结构】map_set前传:二叉搜索树(C++)
  • Window、CentOs、Ubuntu 安装 docker
  • 学习黑客5 分钟深入浅出理解Windows System Configuration
  • 【免费】2005-2018年各省人均财政收支数据
  • Qt for Android申请允许管理所有文件权限
  • n8n 修改或者智能体用文档知识库创建pdf
  • SSRF相关
  • 单片机ESP32天气日历闹铃语音播报
  • 《Python星球日记》 第66天:序列建模与语言模型
  • 【类拷贝文件的运用】
  • Kubernetes控制平面组件:Kubelet 之 Static 静态 Pod
  • 添加购物车-02.代码开发
  • flutter使用命令生成BinarySize分析图
  • 【漫话机器学习系列】255.独立同分布(Independent and Identically Distributed,简称 IID)
  • 原生的 XMLHttpRequest 和基于 jQuery 的 $.ajax 方法的异同之处以及使用场景
  • MiMo-7B-RL调研
  • 【数据结构入门训练DAY-32】LETTERS
  • 【C++进阶篇】多态
  • 设计杂谈-工厂模式
  • 象限法思维
  • 2025年AI工程师认证深度解析:AAIA认证体系全景指南与实战策略
  • css3响应式布局
  • 将语言融入医学视觉识别与推理:一项综述|文献速递-深度学习医疗AI最新文献
  • 初识 Pandas:Python 数据分析的利器
  • 质控脚本来喽