本节以 Ubuntu 20.04 为例,详细介绍 Ubuntu 根文件系统的制作流程,涵盖系统安装、网络配置、用户管理、打包镜像及调试等内容。其他版本的根文件系统制作流程与此类似,可参考本指南进行移植。
准备工作
安装qemu模拟器
由于泰山派的RK3566为ARM内核,而我们的PC机通常为X86,为了能够在 x86 机器上构建在ARM上跑的Ubuntu根文件系统,需要安装 QEMU 模拟器。
bash
sudo apt-get install qemu-user-static

下载并解压 Ubuntu 20.04 根文件系统
下载 Ubuntu 官方提供的 rootfs 版本,下载链接如下:
https://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.1-base-arm64.tar.gz
下载完成后,执行如下命令创建目录并解压
bash
mkdir ubuntu20_04
tar -xpf ubuntu-base-20.04.1-base-arm64.tar.gz -C ubuntu20_04/
复制wifi固件
由于我们新创建的根文件系统中并没有包含wifi的固件,因此需要我们手动将相关文件复制进来
首先进入到kernel目录下,执行如下命令,进入菜单页
bash
make arch=ARM64 menuconfig
在其中找到wifi相关的设置
从上图可以看到,当前跟WiFi相关的文件是存放在vendor目录下的,我们在SDK的buildroot目录下找到相关文件,并复制到ubuntu根文件目录下
bash
#cp -r -p external/rkwifibt/firmware/broadcom/all/wifi/ ubuntu20_04/lib/firmware/
mkdir ubuntu20_04/vendor
cp -r buildroot/output/rockchip_rk3566/target/system ubuntu20_04/vendor
安装模块
之后,我们进入kernel目录,编译模块并将其安装到ubuntu根文件目录中
bash
make ARCH=arm64 modules_install INSTALL_MOD_PATH=../ubuntu20_04
准备网络和qemu
执行如下命令,将网络相关文件和qemu相关文件复制到ubuntu根文件目录中
bash
cp -b /etc/resolv.conf ubuntu20_04/etc/resolv.conf
cp /usr/bin/qemu-aarch64-static ubuntu20_04/usr/bin/
创建脚本
之后我们创建进入根文件目录的脚本文件,并赋予其执行权限
bash
touch rootfs-mount.sh
sudo chmod +x rootfs_mount.sh
将如下内容复制到我们创建的rootfs-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 chroot ${2}
}
function umnt() {
echo "UNMOUNTING"
sudo umount ${2}/proc
sudo umount ${2}/sys
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
修改根文件系统
执行如下命令,进入根文件目录
bash
sudo bash rootfs_mount.sh -m ubuntu20_04
更新并安装功能包
在虚拟环境中安装系统更新
bash
apt-get update
apt-get upgrade

之后根据自己的需要,安装相关的的功能包
bash
apt-get install sudo git ssh ethtool rsyslog bash-completion htop net-tools wireless-tools network-manager iputils-ping
apt-get install ffmpeg vim language-pack-en-base ifupdown inetutils-ping cutecom audacity v4l-utils cheese chromium-browser wpasupplicant
配置网络
执行如下命令,编辑/etc/network/interfaces文件
bash
vim /etc/network/interfaces
在/etc/network/interfaces文件中添加如下内容
source-directory /etc/network/interfaces.d #以太网
auto eth0
iface eth0 inet dhcp
#wifi
auto wlan0
iface wlan0 inet dhcp
#wpa-conf /etc/wpa_config.conf

配置DNS
执行如下命令,编辑/etc/resolv.conf文件
bash
vim /etc/resolv.conf
在/etc/resolv.conf文件中添加如下内容
nameserver 8.8.8.8
nameserver 114.114.114.114

用户设置
执行如下命令,添加自定义用户,其中zxfeng是我们的用户名
bash
useradd -s '/bin/bash' -m -G adm,sudo zxfeng
执行如下命令,给zxfeng用户和root用户设置密码
bash
passwd zxfeng
#12345678
passwd root
#root

退出根文件系统
以上设置完成后,执行如下命令,退出根文件系统
bash
exit
制作rootfs镜像
查看目录大小
首先执行如下命令,查看我们的ubuntu20_04的大小
bash
sudo du -h --max-depth=1

可以看到当前它的大小为1.9G
制作镜像
执行如下命令,将我们制作的根文件系统打包为linuxroot.img镜像
bash
mkdir rootfs
dd if=/dev/zero of=linuxroot.img bs=1M count=8000
mkfs.ext4 linuxroot.img
sudo mount linuxroot.img rootfs/
sudo rsync -aAX --exclude={"/proc/*","/sys/*","/dev/*","/run/*"} /home/SDK/tspi/ubuntu20_04/ rootfs/
#sudo cp -rfp /home/SDK/tspi/ubuntu20_04/* rootfs/
sudo umount rootfs/
e2fsck -p -f linuxroot.img
resize2fs -M linuxroot.img
其中需满足 bs*count>我们的ubuntu20_04目录大小。由于bs=1M且ubuntu20_04的大小为1.9G。为保险起见,我这里设置count=6000,远大于1900。
rootfs替换
制作完成后,我们将rockdev目录下的rootfs.img替换为我们前面生成的linuxroot.img。
镜像烧录
打包镜像
类似地,执行如下命令,将所有镜像打包进update.img
bash
./build.sh updateimg

镜像下载
镜像打包完成后,我们可以使用upgrade_tool进行镜像的下载
上板测试
镜像烧录完成后,我们使用串口连接开发板,测试系统是否能够正常使用
执行如下命令,查看内核版本以及文件系统
bash
uname -r
lsb_release -a
#cat /etc/issue

可以看到当前已经为Ubuntu20.04了。
其它问题
hostname修改
使用vim编辑/etc/hostname文件
bash
vi /etc/hostname
将其中内容改为自己想要设置的名称,并reboot重启系统,即可看到当前的hostname已被修改
小结
在本节中,我们以 Ubuntu 20.04 为例,详细介绍 Ubuntu 根文件系统的制作流程。并成功在泰山派上移植Ubuntu20.04。