前言

上文已经起了一个arm的debian虚拟机,现在要在这个debian虚拟机中期构建arm64 的Ubuntu rootfs。

构建arm64 的Ubuntu18.04 rootfs步骤

下面的步骤都是在debian虚拟机中操作的

下载ubuntu18.04 arm64 base image

下载地址:ubuntu cdimg ,选择下载 ubuntu-base-18.04.5-base-arm64.tar.gz。

  • wget http://cdimage.ubuntu.com/ubuntu-base/releases/18.04/release/ubuntu-base-18.04-base-arm64.tar.gz

创建temp目录,解压文件到temp

  • mkdir temp
  • tar -xvf ubuntu-base-18.04.5-base-arm64.tar.gz -C temp

拷贝dns域名解析文件

  • cp -b /etc/resolv.conf temp/etc/resolv.conf

准备chroot脚本,并执行

vim 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

chmod +x rootfs-mount.sh

bash rootfs-mount.sh -m temp

  • 执行完这个后,就已经chroot到这个temp目录了

更新及安装一些包(预制自己需要的功能)

这里我是部分参考泰山派官方文档去安装,但是我只安装了一部分,免得rootfs太臃肿,之后有需要可以再安装

apt-get update
apt-get install ssh
apt-get install ethtool
apt-get install rsyslog
apt-get install bash-completion
apt-get install htop
apt-get install net-tools
apt-get install wireless-tools
apt-get install network-manager
apt-get install iputils-ping
apt-get install vim #语言包
apt-get install language-pack-en-base #这个必须要否则无法生成/etc/network/interfaces配网文件
apt-get install ifupdown
# ping
apt-get install inetutils-ping #串口
# wifi
apt-get install wpasupplicant
apt install kmod

添加用户及设置密码

- useradd -s '/bin/bash' -m -G adm,sudo lckfb
- passwd lckfb

修改完自己的根文件系统就可以exit退出chroot了,然后再执行下脚本。

  • bash rootfs-mount.sh -u temp

这里指出泰山派官方文档的小错误,他创建了lckfb用户,但是改密码时使用的passwd tspi
在这里插入图片描述

制作根文件系统

制作自己的根文件系统,大小依据自己的根文件系统而定,注意依据 temp 文件夹的大小来修改 count 值,因为我们这里的大小为3.5G所以count=5000*bs=1M保证大于我们的temp

mkdir rootfs
dd if=/dev/zero of=linuxroot.img bs=1M count=6000
mkfs.ext4 linuxroot.img
sudo mount linuxroot.img rootfs/
sudo cp -rfp temp/* rootfs/
sudo umount rootfs/
e2fsck -p -f linuxroot.img
resize2fs -M linuxroot.img

这样 linuxroot.img 就是最终的根文件系统映像文件了。

构建arm64 的Ubuntu22.04 rootfs

泰山派官方文档中做的镜像是ubuntu 18.04,但是这个版本比较老,其中的源中有一些新包都不支持,没法直接apt安装。比如python3-libgpiod包在ubuntu 18.04中一直装不上。所有这里做一个新一点的版本Ubuntu22.04。

制作步骤和ubuntu 18.04基本一样,只是需要去官方下载ubuntu22.04 arm64 base image就ok了,下载地址下面给出

下载ubuntu22.04 arm64 base image

  • https://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-arm64.tar.gz

其余步骤(同ubuntu 18.04)

替换ubuntu22.04 apt源

使用阿里云的源,比较快,而且要选ubuntu22.04(jammy) arm64的,选错了有坑,会有很多包没有。这里是ds查的,比较给力,这里贴出一版。实测非常ok。注意,不同ubuntu版本的源也不一样,根据实际的版本去搜索,这里是ubuntu22.04的
修改 /etc/apt/sources.list文件

deb http://mirrors.aliyun.com/ubuntu-ports/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
# deb httprors.aliyun.com/ubuntu-ports/ jammy-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy-backports main restricted universe multiverse

遗留坑点(做出的完整镜像没有wifi网卡)

我使用上面的步骤制作出了ubuntu的rootfs,然后利用制作buildroot镜像的其他部分去执行./build.sh updateimg去打包可以烧录到sd中的完整镜像update.img,结果打包出来的镜像没有wlan0的wifi网卡设备。。。。这里不知道泰山派官方文档上是不是忽略了相关步骤,他们给出的ubuntu的镜像wifi网络是ok。或者是我参考文档的姿势不对或者遗漏了哪里。。。。。

下一个文档就自己琢磨着添加wifi驱动。


新

上面制作的镜像没有适配Rockchip的一些库,比如:mpp,libdrm等,导致无法使用Rockchip的硬件加速,使用gstreamer或者浏览器性能极差。还需要参考文档去添加对应的库。

可以参考官方制作debian镜像的脚本,但是更好是参考鲁班猫的ubuntu制作文档,包可以适配:https://github.com/LubanCat/ubuntu。鲁班猫的文档写非常完善,之后可以多参考

参考

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐