【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 | 虚拟的文件系统,里面都是临时文件,用来存储系统运行信息文件 |
/usr | Unix 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-内核移植 中获取的Image 、system-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》