本文介绍在OKMX8MPQ-C开发板上,基于OK8MP-linux-sdk移植ubuntu 20.04文件系统,实现cli的登录界面,base之前文章飞凌OKMX8MP-C开发板AI项目分享-开箱及WSL2编译环境搭建的编译环境实现,具体步骤如下:
1.准备Ubuntu 20.04镜像
为了方便后续用原有的编译指令合成镜像,我们需要提前将准备好的ubuntu base文件放入以下目录“~/forlinx/OK8MP-linux-sdk/OK8MP-linux-fs”,或者进入“~/forlinx/OK8MP-linux-sdk/OK8MP-linux-fs”目录下载你想要移植的Ubuntu base文件。
进入SDK中放置文件系统的目录
cd ~/forlinx/OK8MP-linux-sdk/OK8MP-linux-fs
用以下指令下载Ubuntu 20.04.05
wget http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.5-base-arm64.tar.gz
2.解压ubuntu base文件系统
将OK8MP-linux-sdk中原有的rootfs重命名为 rootfs_linux
mv rootfs rootfs_linux
并创建一个rootfs名称文件夹存放根文件系统
mkdir rootfs
解压ubuntu base文件系统到rootfs目录
tar -xvf ubuntu-base-20.04.1-base-arm64.tar.gz -C rootfs
如下图
3.安装qemu 模拟器环境
在ubuntu 16.04中使用以下指令安装qemu
sudo apt-get install qemu-user-static
4.将qemu文件拷贝到ubuntu base文件系统
使用以下指令进行拷贝相关文件到usr/bin/目录下
cp /usr/bin/qemu-arm-static rootfs/usr/bin/
cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/
5.配置wsl2的qemu环境
以下两条指令需要在每次打开WSL2终端时输入
sudo update-binfmts --enable qemu-aarch64
sudo update-binfmts --import
如果不输入在后面步骤挂载文件系统,会出现以下异常
chroot: failed to run command '/bin/bash': Exec format error
如下图:
6.拷贝内核驱动、固件到ubuntu base文件系统中
使用以下指令,从原来的linux文件系统中拷贝到ubuntu base目录(rootfs_linux是SDK中原来的文件系统)
mkdir -p rootfs/lib/modules
cp -Ppr rootfs_linux/lib/modules/* rootfs/lib/modules/
cp -Ppr rootfs_linux/lib/firmware/* rootfs/lib/firmware/
7.更换Ubuntu base系统源
为了加速后续需要的依赖包安装,使用以下指令将源更换为中国科学技术大学开源软件镜像
sudo sed -i 's|ports.ubuntu.com|mirrors.ustc.edu.cn|g' rootfs/etc/apt/sources.list
8.创建挂载Ubuntu base的脚本
使用vim或者nano指令创建ch-mount.sh
vim ch-mount.sh
输入以下内容
#!/bin/bash
function mnt() {
echo "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}
}
function umnt() {
echo "UNMOUNTING"
sudo umount ${2}/proc
sudo umount ${2}/sys
sudo umount ${2}/dev/pts
sudo umount ${2}/dev
}
if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
umnt $1 $2
else
echo ""
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 a+x ch-mount.sh
9.挂载Ubuntu-base系统
运行以下指令
./ch-mount.sh -m rootfs
运行成功会提示MOUNTING,并进入root@主机名,如下图
10.更新ubuntu-base软件
在更新前一定要先修改/tmp目录权限否则更新会出现异常,指令如下
chmod 777 /tmp
chmod 777 /dev/null
apt update
apt upgrade
11.安装一些基础包
可以加一些你自己常用的包,此处安装以下内容
apt-get install -y language-pack-en-base sudo ssh net-tools \
network-manager iputils-ping rsyslog bash-completion htop resolvconf \
dialog vim udhcpc udhcpd git v4l-utils alsa-utils git gcc less \
autoconf autopoint libtool bison flex gtk-doc-tools libglib2.0-dev \
libpango1.0-dev libatk1.0-dev kmod pciutils libjpeg-dev \
ifupdown ethtool rsync udev nfs-common psmisc
12.配置网络相关设定
修改网络配置加入两个网卡和无线网卡
vim /etc/network/interfaces
输入以下内容
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet dhcp
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
source-directory /etc/network/interfaces.d
编辑DNS相关配置文件/etc/resolv.conf和/etc/systemd/resolved.conf
vim /etc/resolv.conf
修改或添加以下内容
nameserver 8.8.8.8
nameserver 114.114.114.114
编辑/etc/systemd/resolved.conf
vim /etc/systemd/resolved.conf
将DNS修改如下
[Resolve]
DNS=8.8.8.8 114.114.114.114
设置主机名称
echo "OKMX8MPQ-C" > /etc/hostname
echo "127.0.0.1 localhost" >> /etc/hosts
echo "127.0.0.1 OKMX8MPQ-C" >> /etc/hosts
修改开机等待网络等待5分钟设定
vim /etc/systemd/system/network-online.target.wants/networking.service
将里面的TimeoutStartSec=5min 修改为TimeoutStartSec=2sec
13.配置串口
使用以下指令配置串口
cd /etc/systemd/system/getty.target.wants
ln -s /lib/systemd/system/serial-getty@.service serial-getty@.service
14.修改root用户密码及添加新用户
修改root用户密码
passwd root
添加新用户并设置密码
#新增用户
useradd -s '/bin/bash' -m -G adm,sudo yourusername
#设置新用户密码
passwd yourusername
修改sudo权限
chmod u+w /etc/sudoers
vim /etc/sudoers
然后在root的下一行添加新的用户
root ALL=(ALL:ALL) ALL
yourusername ALL=(ALL:ALL) ALL
启用ssh的root帐号登录
vi /etc/ssh/sshd_config
添加以下内容
PermitRootLogin yes
15.修改系统重启默认等待时间
vim /etc/systemd/system.conf
找到这几行:
#DefaultTimeoutStartSec=90s
#DefaultTimeoutStopSec=90s
#DefaultTRestartSec=100ms
解除注释并将DefaultTimeoutStopSec=90s修改为:
DefaultTimeoutStartSec=90s
DefaultTimeoutStopSec=1s
DefaultTRestartSec=100ms
16.解除ubuntu base文件系统挂载
退出挂载环境
exit
卸载ubuntu base文件系统
./ch-mount.sh -u rootfs
退出成功提示UMOUNTING返回原系统目录,如下图
17.重新打包文件系统
重新打包ok8mp-linux-fs.sdcard
cd ..
sudo chown -R soon:soon OK8MP-linux-fs/rootfs
. environment-setup-aarch64-poky-linux
./build.sh mkfw
耐心等待执行成功如下图
打包成功在~/forlinx/OK8MP-linux-sdk/images目录下会生成新的ok8mp-linux-fs.sdcard
注如果不修改owner会出现以下权限异常提醒
18.烧录新的文件系统
将编译生成的ok8mp-linux-fs.sdcard拷贝到windows下,并使用uuu烧录到开发板,从串口就能进入ubuntu了,如下图:
以上本次移植分享,目前GPU部分没有适配成功,后续如有适配成果在做分享,感谢阅读。