目录
前言
在ZYNQ上跑Linux系统其实已经不是什么新鲜事了,Xilinx官方提供的Petalinux工具能够很好的制做定制版本的Linux系统。但是如果要进行软件开发部分,总感觉多多少少有些麻烦。所以一直有个执念就是要给ZYNQ装一个Ubuntu系统,但是网上搜索到的系统的版本都比较老,无奈之下尝试着自己制作系统。希望能给大家一点参考。
软件版本:
- 操作环境:WSL-Ubuntu18.04
- 目标芯片:XCZ4EV
- Petalinux:2020.2
- Vivado:2020.2
一、主要流程
在系统的启动流程中,最先运行的是Bootloader程序,负责初始化初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC等)拷贝到DDR中,最后启动Linux内核。对于ZYNQ而言,其Bootloader程序分为两个部分。在启动引导过程中,先运行FSBL来设置PS,然后运行U-Boot用于加载Linux内核映像并引导Linux,所以U-boot对于ZYNQ而言是第二阶段引导程序,FSBL是第一阶段引导程序。等U-Boot程序执行完成之后,就会启动内存中的Linux内核,内核在完成启动之后,会挂载根文件系统(rootfs)执行其中的初始化文件,同时根文件系统中也包含了系统的关键软件。
U-Boot、Linux-kernel和rootfs这三者一起构成了一个完整的Linux系统,而最终决定Linux系统是什么发行版的是rootfs,所以只要替换适配好的rootfs,ZYNQ是可以运行几乎所有的发行版本,如CentOS、ArchLinux和Ubuntu等。正如你所想,Petalinux也是其中一个发行版本。
PS:如果接触过Ubuntu系统更换系统内核的,可能会更容易明白内核和发行版系统是分离的这个概念。
大致的流程是:
- 使用Vivado生成定制的硬件描述文件
- 利用Vitis生成定制的FSBL (可选,本文不进行此步骤,使用原版自带的)
- 导入硬件描述文件到Petalinux工程,并配置启动顺序、U-Boot和内核
- 使用Petalinux编译FSBL、U-Boot和内核
- 适配Ubuntu的根文件系统
- 制作SD卡启动
二、制作FSBL、U-Boot和内核
这个过程不进行详细描述,仅对关键部分进行解释,与制作Petlinux的系统的步骤一致,可以参考网上资料。
记住必须确认在命令petalinux-config
的配置中,选择以SD卡启动,并正确填写rootfs的位置。我的SD卡为第二个设备,然后rootfs在其第二个分区,所以是mmcblk1p2
→ Image Packaging Configuration
→ Root filesystem type()
( ) INITRAMFS
( ) INITRD
( ) JFFS2
( ) NFS
(X) EXT4 (SD/eMMC/SATA/USB)
( ) other
→ Image Packaging Configuration
(/dev/mmcblk1p2) Device node of SD device
配置完事后,直接编译就可以得到相关的文件,在$(petalinu-project)/images/linux
下。
三、获得Ubuntu基本rootfs
3.1 利用debootstrap工具
参考Ubuntu提供的网站:https://wiki.ubuntu.com/ARM/RootfsFromScratch/QemuDebootstrap
首先在PC主机Ubuntu系统中安装qemu模拟器:
sudo apt-get install qemu-user-static
利用下面的命令获得一个基本的Ubuntu裸文件系统:
sudo mkdir ~/ubuntu-rootfs
sudo qemu-debootstrap --arch arm64 trusty ~/ubuntu-rootfs/ --variant=minbase --verbose
qemu-debootstrap调用debootstrap函数,并且把qemu-user-static的二进制文件qemu-arm-static复制到目标目录中以用于跨平台编译。
qemu-debootstrap的参数选项和debootstrap相同,具体指令可以查看debootstrap的帮助文档。下面是对我的命令的解释。
debootstrap --arch [平台] [发行版本代号] [存放目录] --variant=minbase[附加变量:最小包] --verbose[不关闭wget输出]
等待一段时间下载完成。
3.2 从Ubuntu官网下载
从Ubuntu官方网站下载其提供的最小裸文件系统。
新建目录
mkdir ~/ubuntu-rootfs
cd ubuntu-rootfs
下载 Ubuntu Core rootfs
wget http://cdimage.ubuntu.com/ubuntu-base/releases/18.04.5/release/ubuntu-base-18.04.5-base-arm64.tar.gz
解压 Ubuntu Core rootfs tar包,注意一定要用sudo
sudo tar -xzvf ubuntu-core-14.04-core-armhf.tar.gz
# 退回到上一级目录
cd ..
由于我们要chroot,所以需要能够在chroot环境执行arm64版本的binary,所以我们要接触linux的binfmt机制和qemu static解释器
sudo apt-get install qemu-user-static
sudo cp /usr/bin/qemu-aarch64-static ~/ubuntu-rootfs/usr/bin/
四、挂载相关文件系统并chroot
先将本机的dns配置复制到目标rootfs,后面联网时会用到。同时修改apt软件源
sudo cp -b /etc/resolv.conf ~/ubuntu-rootfs/etc/resolv.conf
sudo vim ~/ubuntu-rootfs/etc/apt/source.list
中科大源(arm64)。这里不使用https的软件源,因为缺少安装包,会连接失败。
#中科大源
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main universe restricted
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main universe restricted
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
挂载proc, sys, dev, dev/pts等文件系统,可以编写一个bash脚本ch-mount.sh来完成挂载和后面的卸载操作。脚本内容如下所示:
#!/bin/bash
function help() {
echo ""
echo "usage: ch-mount.sh [-m <path>] [-u <path>] <command> [<args>]"
echo ""
echo "For example: bash ch-mount.sh -m /media/sdcard/"
echo ""
}
while getopts "m:u:" arg
do
case $arg in
m)
echo "I:MOUNTING"
sudo mount -t proc /proc ${2}proc
sudo mount -t sysfs /sys ${2}sys
sudo mount -o bind /dev ${2}dev
sudo mount -o bind /dev/pts ${2}dev/pts
sudo chroot ${2}
;;
u)
echo "I:UNMOUNTING"
sudo umount ${2}proc
sudo umount ${2}sys
sudo umount ${2}dev/pts
sudo umount ${2}dev
;;
?)
echo "E:Unknow parameter"
help
exit 1
esac
done
保存好shell脚本,并在终端中执行。其中-m
为挂载后面跟目录,-u
为解挂同样跟目录。
sudo bash ch-mount.sh -m ~/ubuntu-rootfs/
五、安装所需软件包
apt-get install language-pack-en-base sudo ssh net-tools ethtool wireless-tools ifupdown network-manager iputils-ping rsyslog bash-completion htop vim resolvconf --no-install-recommends
# 推荐软件
# language-pack-en-base 英文翻译的mo文件
# sudo sudo命令
# ssh ssh的client和server
# net-tools ifconfig,netstat,route,arp等
# ethtool ethtool命令,显示、修改以太网设置
# wireless-tools iwconfig等,显示、修改无线设置
# ifupdown ifup,ifdown等工具
# network-manager Network Manager服务和框架,高级网络管理
# iputils-ping ping和ping6
# rsyslog 系统log服务
# bash-completion bash命令行补全
# htop htop工具,交互式进程查看器
六、用户设置
添加用户
adduser xxx(填用户名) # 根据提示设置密码。
修改/etc/sudoers
里面的内容,在root行下加上这句,然后你创建的用户就可以用sudo获得root权限了。
xxx(用户名) ALL=(ALL:ALL) ALL
设置主机名称
echo "ubuntu-arm-zynq">/etc/hostname
设置本机入口ip:
echo "127.0.0.1 localhost">>/etc/hosts
echo "127.0.1.1 ubuntu-arm-zynq">>/etc/hosts
允许自动更新dns:
dpkg-reconfigure resolvconf
设置时区:
dpkg-reconfigure tzdata
七、配置串口调试服务和SD卡分区挂载
在用debootstrap制作的rootfs里,是不包含有串口登陆tty的。需要添加一个/etc/init/ttyPS0.conf
文件才能从串口登陆。否则你会在串口看见Kernel的输出信息,但就是等不到登陆提示。
如果没有/etc/init/ttyPS0.conf
,则自行创建。文件夹没有的也需要自行创建。在其中写入以下内容。
start on stoppedrc or RUNLEVEL=[12345]
stop on runlevel[!12345]
respawn
exec /sbin/getty -L 115200 ttyPS0 vt102
由于使用SD卡在板子上启动,需要修改/etc/fstab
的内容,以便根文件系统能够正确地挂载,否则不能正确挂载根文件系统将导致系统无法启动。由于在内核中设置的根文件系统的挂载目录是SD卡(地二个设备)的第二分区,于是修改/etc/fstab
的内容:
# <file system> <dir> <type> <options> <dump> <pass>
/dev/mmcblk1p2 / ext4 defaults,noatime,errors=remount-ro 0 1
/dev/mmcblk1p1 /boot/uboot vfat defaults,noatime 0 0
八、网络设置
打开/etc/network/interfaces
文件,注释掉source-directory /etc/network/interfaces.d
行,并在其中添加以下内容
# 本地回环
auto lo
iface lo inet loopback
# 两种方法任选一个
# 1、获取动态配置:
auto eth0
iface eth0 inet dhcp
# 2、获取静态配置:
# auto eth0
# iface eth0 inet static
# address 192.168.0.1
# netmask 255.255.255.0
# gateway 192.168.0.1
九、制作SD卡启动系统
输入exit
退出chroot,执行命令卸载相关文件系统。
sudo bash ch-mount.sh -u ubuntu-rootfs/
把$(petalinu-project)/images/linux
下的BOOT.BIN,boot.scr和image.ub拷贝到SD卡的FAT分区,然后把制作好的roofs拷贝到SD卡的ext4分区。
接上串口,上电运行就可以看到如下输出。至于为什么是20.04 LTS是因为我完成后又自己升级了一下,但是就是能直接运行。
参考文献
[1] 定制适用于ARM平台的Ubuntu rootfs(根文件系统)
[2] Zynq-7000 AP SoC - Installing the Ubuntu Desktop on PetaLinux and Demo Tech Tip
[3] 正点原子启明星ZYNQ之嵌入式Linux开发指南 V1.5.1.pdf 附录A5 Ubuntu-base根文件系统构建