这两天收拾杂货堆,找到一块当年上学时候导师申请到的I.MX6QSDB开发板,原本出厂的时候是在SD卡里刷了个安卓系统,后来我把NXP官方的Yocto linux刷到了emmc里,用来做一些驱动开发的学习,再后来就一直吃灰。现在有了一点捣腾设备的能力,想适配一下ubuntu系统,把之前性能比较低的玩客云换下来。
首先从NXP官网下载这块开发板的相关资源文件,包括官方做的Linux6.1工具包和用户手册User Guide。其中官方的Linux工具包中包括了这块开发板的设备树、u-boot以及linux kernel等文件,由于需要自己适配ubuntu,所以rootfs文件就不需要了。User Guide则用来指导一些硬件相关的操作,包括拨码开关设置、镜像烧录地址等。
ubuntu的移植本质上是根文件系统的移植,和kernel、u-boot等无关。这部分可以参考这篇文章。
从ubuntu官方的ubuntu-base文件系统网站下载需要的文件。这里笔者下载的是ubuntu22.04版本的根文件系统,需要根据自己的硬件平台及版本需求自行选择。
官方的根文件系统还是稍微有一点简陋,需要先进行一些修改,方便后续移植到板子上的使用。将下载的文件在ubuntu中解压到一个文件夹下,相关的文件如下:
可以看出和常用的linux根文件目录区别不大,按照移植案例中的步骤,首先使用以下命令安装运行模拟器:
sudo apt install qemu-user-static
然后拷贝CPU架构为ARM的模拟器到根文件系统:
sudo cp /usr/bin/qemu-arm-static ./usr/bin/
接着拷贝主机下的DNS配置文件,没有这个文件无法使用apt-get下载软件:
sudo cp /etc/resolv.conf ./etc/resolv.conf
然后更换源地址:
注:这里更换源地址时建议先备份原本的源地址文件,方便后续出错时恢复。
cp ./etc/apt/sources.list ./etc/apt/sources.list.bak
vim ./etc/apt/sources.list
修改源地址时,将此文件中的ubuntu官方源前缀换成国内源即可,后面的后缀可以不用修改,例如官方源原本是deb http://ports.ubuntu.com/ubuntu-ports/ jammy multiverse
,只需要将前面的http://ports.ubuntu.com
换成国内的阿里云、清华源、华为源的地址即可。前缀可选:
http://mirrors.aliyun.com
https://mirrors.ustc.edu.cn
https://mirrors.tuna.tsinghua.edu.cn
修改完成后保存并退出,然后按照案例中的流程,将ubuntu主机中的相关目录挂载到此目录下:
sudo mount -t proc /proc ./proc
sudo mount -t sysfs /sysfs ./sys
sudo mount -o bind /dev ./dev
sudo mount -o bind /dev/pts ./dev/pts
然后将文件系统切换到此目录下:
sudo chroot ./
更新并安装相关应用:
apt-get update
apt-get upgrade
apt-get install -y sudo vim kmod net-tools ethtool ifupdown language-pack-en-base rsyslog htop iputils-ping dosfstools systemd
注:
如果在更新时报错Couldn’t create temporary file /tmp/apt.conf.AdvpMV for passing ***,如下图所示,在当前窗口执行chmod 777 /tmp
即可解决。
继续按照案例中的流程走,设置板卡的登录密码、主机名称,并适配串口等。
设置密码:
passwd root
设置主机名称:
echo "usr-name" > /etc/hostname
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 usr-name" >> /etc/hosts
设置串口终端:以串口1为例,它的设备文件名称为ttymxc0,所以使用ln命令创建一个软链接文件指向/lib/systemd/system/[email protected]:
ln -s /lib/systemd/system/[email protected] /etc/systemd/system/getty.target.wants/[email protected]
注:这里需要根据自己的板卡串口进行修改,可以先启动到官方的u-boot中使用print env命令查看相关参数。
配置网络自启:
echo auto eth0 > /etc/network/interfaces.d/eth0
echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
最后,退出当前文件系统,取消挂载proc、sys、dev、dev/pts这四个目录和文件:
exit
sudo umount ./proc
sudo umount ./sys
sudo umount ./dev/pts
sudo umount ./dev
将根文件系统打包成xxx.tar.bz2格式的文件。
进入到根文件系统所在的目录,执行以下命令:
tar -cvjf my_rootfs.tar.bz2 *
NXP系列的板子烧写有三种可选方式:dd命令、uuu工具、mfgtool工具。
在linux下,将存储介质按照要求进行分区,然后将zImage、dtb文件、u-boot文件、rootfs分别烧写到对应的分区即可。这种方式的优点是方便快捷,直接使用对应的命令即可,而且可以一个一个文件分别烧写。缺点是只能烧写到sd卡设备中。具体的操作方式可以到NXP官方网站,下载对应的User Guide查阅。
uuu工具可以理解为mfgtool的升级版,官方的mfgtool工具只能烧录完整的Yocto镜像,如果想要烧写自己的镜像,需要按照要求打包成对应的文件,或者修改烧写脚本中的逻辑。uuu工具则可以单独烧录u-boot等文件,并且烧写速度有较大提升。
不过笔者在按照官方介绍进行烧写时,遇到了一些问题:使用uuu工具可以单独烧写u-boot文件,但是不能单独烧写其他的kernel、rootfs等。咨询了一下,官方说如果想用uuu烧写自己的镜像,必须将kernel、dtb、rootfs打包成Yocto形式的.wic文件。又查阅了相关的手册和介绍,如果想要打包成这种格式,需要安装很多工具链及编译环境等,所以最后笔者还是放弃了这种方式。
最终笔者还是选择了这种最常用的方式,虽然烧录速度慢一点,但是操作起来也比较方便。笔者下载的是正点原子资源包中的mfgtool,官方下载的在烧写过程中总是找不到设备,不清楚什么原因。将官方资源包中的kernel、dtb和u-boot,以及移植后打包的ubuntu rootfs文件复制到mfgtool的资源文件夹中,运行对应的烧写脚本即可。
DIP1 - DIP6 | 烧写介质 |
---|---|
11010110 | emmc |
10000010 | SD卡槽2 |
01000010 | SD卡槽3、烧写模式 |
00000100 | sata |
当笔者烧写到emmc进行启动,并检测无误后,又将官方的原版Yocto镜像写入到了一张sd卡中备用,当笔者启动此镜像时,竟意外发现官方的镜像是基于Debain系统移植的,白白花费两个晚上捣鼓ubuntu,不过也算是积累了开发板移植ubutnu的经验(就这么安慰自己吧)。