一、简介

之前有介绍到 ARM 平台移植 ubuntu 的操作流程,在 RK 系列的平台同样适用,所以这里就不介绍怎么一步步的去对 ubuntu 进行移植,而是怎么将移植的过程编写成脚本,这样便可以在 SDK 中通过一行命令即可生成 rootfs.img 镜像,管理起来也也比较方便,需要裁剪摸个工具时也很便捷。

可能没有进行过系统移植的小伙伴看着比较困难,建议先从前面的笔记看着来,在看这篇笔记就会发现很简单,也可以理解 RK 平台的 SDK 是怎么回事。

二、准备材料

我使用的芯片是RK3588,小伙伴可以根据自己的情况选择开发版。

开发环境:VMware

操作系统:ubuntu

开发版:RK3588

三、Debian 目录

因为 RK 平台的 SDK 中是已经支持 Debian 的,所以我们可以根据 Debian 系统的编译方式来模仿 ubuntu 脚本的编写,这样大大降低了操作的难度,还可以明白系统移植是的流程。

目录 作用
overlay 适配Rockchip平台共性配置⽂件
overlay-debug 系统常使⽤的调试⼯具
overlay-firmware ⼀些设备firmware的存放,⽐如npu/dp等
packages 包含armhf arm64系统适配硬加速使⽤的预编译的包
packages-patches 预编包,基于官⽅打上的补丁
ubuntu-build-service 从官⽅获取Debian发⾏版,可依赖包和定制安装相关包
mk-base-debian.sh 获取Debian基础包和编译
mk-image.sh 打包⽣成ext4的固件
mk-rootfs-buster/bullseye.sh 适配Rockchip相关硬件加速包
mk-rootfs.sh 指向具体Rootfs版本,⽬前有Buster、Bullseye两个版本
readme.md ⽂档指引

注意: 以上这些文件都是与外设相关的,也就是解决安装第三方系统后与硬件环境不兼容问题的关键,这里应该会有小伙伴和一样好奇,这里面的文件是怎么来的,我也没仔细去研究过,但是一定是从官方提供的 external 中编程出来的。

  • 配置文件、 .so、.a 文件:可以与 buildroot 进行对比,没猜错的话,一定能在 buildroot 编译输出的目录中能找到。
  • deb 工具包:这里就不用过多的介绍了,看我之前的笔记便可明白
  • ubuntu-build-service/packages 目录下的 deb:这里需要注意一下,这里面的包是编译时宿主机必须具备的环境,并不是厂商提供的,而是从网上下载的,路径如下
    live-build_*.deb来源https://mirrors.ustc.edu.cn/debian/pool/main/l/live-build/
    debootstrap_*.deb来源https://mirrors.ustc.edu.cn/debian/pool/main/d/debootstrap/

    当然也是可以通过 apt 命令进行安装。

了解这些基本信息后,变可以仿照编写一个 ubuntu 编译的脚本。这个工程量还是有点大的,难度虽然不大,但是也是一个比较费时的事,不过好在我在网上找了一下,找到了野火已经编写好了,这里我们就不用重复造轮子了,在这里感谢野火的无私奉献。

四、编译 ubuntu

  1. 下载地址

    https://github.com/LubanCat/ubuntu/tree/ubuntu22.04
  2. 编译

    ./mk-base-ubuntu.sh
    ./mk-ubuntu-rootfs.sh

五、ubuntu 制作过程

  1. 下载 ubuntu 系统

        if [ ! -d $TARGET_ROOTFS_DIR ] ; then
    sudo mkdir -p $TARGET_ROOTFS_DIR if [ ! -e ubuntu-base-20.04.5-base-$ARCH.tar.gz ]; then
    echo -e "\033[47;36m wget ubuntu-base-20.04-base-x.tar.gz \033[0m"
    wget -c http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.5-base-$ARCH.tar.gz
    fi
    sudo tar -xzf ubuntu-base-20.04.5-base-$ARCH.tar.gz -C $TARGET_ROOTFS_DIR/
    sudo cp sources.list $TARGET_ROOTFS_DIR/etc/apt/sources.list
    sudo cp -b /etc/resolv.conf $TARGET_ROOTFS_DIR/etc/resolv.conf if [ "$ARCH" == "armhf" ]; then
    sudo cp -b /usr/bin/qemu-arm-static $TARGET_ROOTFS_DIR/usr/bin/
    elif [ "$ARCH" == "arm64" ]; then
    sudo cp -b /usr/bin/qemu-aarch64-static $TARGET_ROOTFS_DIR/usr/bin/
    fi
    fi

    不难看出来,这个环节下载 ubuntu 系统,不论选择的版本类型是什么,下载的都是 base 版。

  2. 构建独立环境

    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
    }

    通过挂载 proc、sysfs 和 /dev 是为了构建一个隔离的运行环境,让 chroot 内的程序以为自己运行在一个独立的系统环境中,而不是主机的实际系统环境。

    • 挂载 /proc 文件系统: /proc 是一个虚拟文件系统,提供了关于系统内核和进程的信息。
    • 挂载 /sys 文件系统: /sys 文件系统包含了关于系统硬件、设备和驱动程序的信息。
    • 绑定挂载 /dev 目录: /dev 目录包含了设备文件,用于访问系统的各种硬件设备。
  3. 进入 chroot 环境

    cat <<EOF | sudo chroot $TARGET_ROOTFS_DIR/
    
    export APT_INSTALL="apt-get install -fy --allow-downgrades"
    
    export LC_ALL=C.UTF-8
    
    apt-get -y update
    apt-get -f -y upgrade
    ......
    ......
    ......
    EOF

    前面已经准备好了独立的 chroot 环境,现在需要的做便是进入 chroot 环境后,安装自己需要的组件即可

  4. 安装自己所需的工具

    if [ "$TARGET" == "gnome" ]; then
    DEBIAN_FRONTEND=noninteractive apt install -y ubuntu-desktop-minimal rsyslog sudo dialog apt-utils ntp evtest onboard
    mv /var/lib/dpkg/info/ /var/lib/dpkg/info_old/
    mkdir /var/lib/dpkg/info/
    apt-get update
    DEBIAN_FRONTEND=noninteractive apt install -y ubuntu-desktop-minimal rsyslog sudo dialog apt-utils ntp evtest onboard
    mv /var/lib/dpkg/info_old/* /var/lib/dpkg/info/
    elif [ "$TARGET" == "xfce" ]; then
    DEBIAN_FRONTEND=noninteractive apt install -y xubuntu-core onboard rsyslog sudo dialog apt-utils ntp evtest udev
    mv /var/lib/dpkg/info/ /var/lib/dpkg/info_old/
    mkdir /var/lib/dpkg/info/
    apt-get update
    DEBIAN_FRONTEND=noninteractive apt install -y xubuntu-core onboard rsyslog sudo dialog apt-utils ntp evtest udev
    mv /var/lib/dpkg/info_old/* /var/lib/dpkg/info/
    elif [ "$TARGET" == "lite" ]; then
    DEBIAN_FRONTEND=noninteractive apt install -y rsyslog sudo dialog apt-utils ntp evtest acpid
    elif [ "$TARGET" == "gnome-full" ]; then
    DEBIAN_FRONTEND=noninteractive apt install -y ubuntu-desktop-minimal rsyslog sudo dialog apt-utils ntp evtest onboard
    mv /var/lib/dpkg/info/ /var/lib/dpkg/info_old/
    mkdir /var/lib/dpkg/info/
    apt-get update
    DEBIAN_FRONTEND=noninteractive apt install -y ubuntu-desktop-minimal rsyslog sudo dialog apt-utils ntp evtest onboard
    mv /var/lib/dpkg/info_old/* /var/lib/dpkg/info/
    elif [ "$TARGET" == "xfce-full" ]; then
    DEBIAN_FRONTEND=noninteractive apt install -y xubuntu-desktop onboard rsyslog sudo dialog apt-utils ntp evtest udev
    mv /var/lib/dpkg/info/ /var/lib/dpkg/info_old/
    mkdir /var/lib/dpkg/info/
    apt-get update
    DEBIAN_FRONTEND=noninteractive apt install -y xubuntu-desktop onboard rsyslog sudo dialog apt-utils ntp evtest udev
    mv /var/lib/dpkg/info_old/* /var/lib/dpkg/info/
    fi \${APT_INSTALL} net-tools openssh-server ifupdown alsa-utils ntp network-manager gdb inetutils-ping libssl-dev \
    vsftpd tcpdump can-utils i2c-tools strace vim iperf3 ethtool netplan.io toilet htop pciutils usbutils curl \
    whiptail gnupg bc xinput gdisk parted gcc sox libsox-fmt-all gpiod libgpiod-dev python3-pip python3-libgpiod \
    guvcview \${APT_INSTALL} ttf-wqy-zenhei xfonts-intl-chinese if [[ "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    apt purge ibus firefox -y echo -e "\033[47;36m Install Chinese fonts.................... \033[0m"
    \${APT_INSTALL} language-pack-zh-hans fonts-noto-cjk-extra gnome-user-docs-zh-hans language-pack-gnome-zh-hans # set default xinput for fcitx
    \${APT_INSTALL} fcitx fcitx-table fcitx-googlepinyin fcitx-pinyin fcitx-config-gtk
    sed -i 's/default/fcitx/g' /etc/X11/xinit/xinputrc \${APT_INSTALL} ipython3 jupyter
    fi if [[ "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    # Uncomment zh_CN.UTF-8 for inclusion in generation
    sed -i 's/^# *\(zh_CN.UTF-8\)/\1/' /etc/locale.gen
    echo "LANG=zh_CN.UTF-8" >> /etc/default/locale # Generate locale
    locale-gen zh_CN.UTF-8 # Export env vars
    echo "LC_ALL=zh_CN.UTF-8" >> /etc/environment
    echo "LANG=zh_CN.UTF-8" >> /etc/environment
    echo "LANGUAGE=zh_CN:zh:en_US:en" >> /etc/environment echo "export LC_ALL=zh_CN.UTF-8" >> /etc/profile.d/zh_CN.sh
    echo "export LANG=zh_CN.UTF-8" >> /etc/profile.d/zh_CN.sh
    echo "export LANGUAGE=zh_CN:zh:en_US:en" >> /etc/profile.d/zh_CN.sh \${APT_INSTALL} $(check-language-support)
    fi if [[ "$TARGET" == "gnome" || "$TARGET" == "gnome-full" ]]; then
    \${APT_INSTALL} mpv acpid gnome-sound-recorder
    elif [[ "$TARGET" == "xfce" || "$TARGET" == "xfce-full" ]]; then
    \${APT_INSTALL} mpv acpid gnome-sound-recorder
    elif [ "$TARGET" == "lite" ]; then
    \${APT_INSTALL}
    fi pip3 install python-periphery Adafruit-Blinka -i https://mirrors.aliyun.com/pypi/simple/

    不难看出来,这里的操作都是为了,安装自己所需要的工具,所以需要新增或者裁减时,直接在这里添加即可。

  5. 创建用户

    HOST=lubancat
    
    # Create User
    useradd -G sudo -m -s /bin/bash cat
    passwd cat <<IEOF
    temppwd
    temppwd
    IEOF
    gpasswd -a cat video
    gpasswd -a cat audio
    passwd root <<IEOF
    root
    root
    IEOF
  6. 允许 root 登录

    sed -i '/pam_securetty.so/s/^/# /g' /etc/pam.d/login
  7. 设置主机名

    echo lubancat > /etc/hostname
  8. 设置本地时间

    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  9. 禁用指定服务的等待在线服务单元,以防止启动过程中等待网络服务在线的延迟

    services=(NetworkManager systemd-networkd)
    for service in ${services[@]}; do
    systemctl mask ${service}-wait-online.service
    done
  10. 通过禁用这些单元,系统将不会自动启动相关的 wpa_supplicant 服务

    systemctl mask wpa_supplicant-wired@
    systemctl mask wpa_supplicant-nl80211@
    systemctl mask wpa_supplicant@
  11. 调整 systemd 日志级别

    # 将 /etc/systemd/system.conf 文件中的日志级别从 info 改为 warning,减少系统日志的输出。
    sed -i 's/#LogLevel=info/LogLevel=warning/' \
    /etc/systemd/system.conf # 将日志目标从 journal-or-kmsg 改为 journal,将日志发送到 journal。
    sed -i 's/#LogTarget=journal-or-kmsg/LogTarget=journal/' \
    /etc/systemd/system.conf
  12. 检查以确保 sudoers 文件具有 sudo 组的 ref

    SUDOEXISTS="$(awk '$1 == "%sudo" { print $1 }' /etc/sudoers)"
    if [ -z "$SUDOEXISTS" ]; then
    # append sudo entry to sudoers
    echo "# Members of the sudo group may gain root privileges" >> /etc/sudoers
    echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
    fi
  13. 确保为 %sudo 设置了 NOPASSWD

    sed -i -e '
    /\%sudo/ c \
    %sudo ALL=(ALL) NOPASSWD: ALL
    ' /etc/sudoers
  14. 清理安装包后退出 chroot 环境

    apt-get clean
    rm -rf /var/lib/apt/lists/* sync
  15. 卸载 proc、sysfs 和 /dev

    ./ch-mount.sh -u $TARGET_ROOTFS_DIR
  16. 打包系统进行保存

    DATE=$(date +%Y%m%d)
    echo -e "\033[47;36m Run tar pack ubuntu-base-$TARGET-$ARCH-$DATE.tar.gz \033[0m"
    sudo tar zcf ubuntu-base-$TARGET-$ARCH-$DATE.tar.gz $TARGET_ROOTFS_DIR

注意: 看我之前的笔记,你将会发现上面脚本执行的流程和手动操作的环节是一样的。所以这里已经可以将系统打包成镜像后下载测试,建议各位小伙伴都测试一下,加深对系统移植的理解。

测试完成后,便会发现有很多问题,比如硬件环境基本不能使用,界面起不来等各种问题。不要慌,接下来便开始处理这些不兼容的问题,操作方式也很简单,第一篇笔记已经介绍到了,这里就不在赘述了,看操作。

六、平台适配

  1. 环境准备

    # 通过选择设置 SOC 和 TARGET 变量的值
    if [ ! $SOC ]; then
    echo "---------------------------------------------------------"
    echo "please enter soc number:"
    echo "请输入要构建CPU的序号:"
    echo "[0] Exit Menu"
    echo "[1] rk3566/rk3568"
    echo "[2] rk3588/rk3588s"
    echo "---------------------------------------------------------"
    read input case $input in
    0)
    exit;;
    1)
    SOC=rk356x
    ;;
    2)
    SOC=rk3588
    ;;
    *)
    echo 'input soc number error, exit !'
    exit;;
    esac
    echo -e "\033[47;36m set SOC=$SOC...... \033[0m"
    fi if [ ! $TARGET ]; then
    echo "---------------------------------------------------------"
    echo "please enter TARGET version number:"
    echo "请输入要构建的根文件系统版本:"
    echo "[0] Exit Menu"
    echo "[1] gnome"
    echo "[2] xfce"
    echo "[3] lite"
    echo "[4] gnome-full"
    echo "[5] xfce-full"
    echo "---------------------------------------------------------"
    read input case $input in
    0)
    exit;;
    1)
    TARGET=gnome
    ;;
    2)
    TARGET=xfce
    ;;
    3)
    TARGET=lite
    ;;
    4)
    TARGET=gnome-full
    ;;
    5)
    TARGET=xfce-full
    ;;
    *)
    echo -e "\033[47;36m input TARGET version number error, exit ! \033[0m"
    exit;;
    esac
    echo -e "\033[47;36m set TARGET=$TARGET...... \033[0m"
    fi # 设置 MALI 和 ISP 以及 MIRROR 变量的值
    install_packages() {
    case $SOC in
    rk3399|rk3399pro)
    MALI=midgard-t86x-r18p0
    ISP=rkisp
    ;;
    rk3328|rk3528)
    MALI=utgard-450
    ISP=rkisp
    ;;
    rk356x|rk3566|rk3568)
    MALI=bifrost-g52-g13p0
    ISP=rkaiq_rk3568
    MIRROR=carp-rk356x
    ;;
    rk3588|rk3588s)
    ISP=rkaiq_rk3588
    MALI=valhall-g610-g13p0
    MIRROR=carp-rk3588
    ;;
    esac
    } # 设置 ARCH 变量的值,默认为 arm64
    case "${ARCH:-$1}" in
    arm|arm32|armhf)
    ARCH=armhf
    ;;
    *)
    ARCH=arm64
    ;;
    esac echo -e "\033[47;36m Building for $ARCH \033[0m" # 设置 VERSION 变量
    if [ ! $VERSION ]; then
    VERSION="release"
    fi echo -e "\033[47;36m Building for $VERSION \033[0m" # 判断文件是否存在
    if [ ! -e ubuntu-base-"$TARGET"-$ARCH-*.tar.gz ]; then
    echo "\033[41;36m Run mk-base-ubuntu.sh first \033[0m"
    exit -1
    fi # 错误时执行此函数
    finish() {
    sudo umount $TARGET_ROOTFS_DIR/dev
    exit -1
    }
    trap finish ERR # 将文件 ubuntu-base-$TARGET-$ARCH-*.tar.gz,之前的操作压缩时,文件便是 TARGET_ROOTFS_DIR,所以不用指定目录
    echo -e "\033[47;36m Extract image \033[0m"
    sudo rm -rf $TARGET_ROOTFS_DIR
    sudo tar -xpf ubuntu-base-$TARGET-$ARCH-*.tar.gz

    这里的操作没啥好说的,主要将之前打包的系统再次解压出来,并配置一些变量

  2. 拷贝相关的 deb 包

    # 将文件 ubuntu-base-$TARGET-$ARCH-*.tar.gz,之前的操作压缩时,文件便是 TARGET_ROOTFS_DIR,所以不用指定目录
    echo -e "\033[47;36m Extract image \033[0m"
    sudo rm -rf $TARGET_ROOTFS_DIR
    sudo tar -xpf ubuntu-base-$TARGET-$ARCH-*.tar.gz # 将 所有的 deb 文件拷贝到指定目录
    # packages folder
    sudo mkdir -p $TARGET_ROOTFS_DIR/packages
    sudo cp -rpf packages/$ARCH/* $TARGET_ROOTFS_DIR/packages # 根据 SOC 拷贝 GPU/CAMERA 对应的 deb 包
    #GPU/CAMERA packages folder
    install_packages
    sudo mkdir -p $TARGET_ROOTFS_DIR/packages/install_packages
    sudo cp -rpf packages/$ARCH/libmali/libmali-*$MALI*-x11*.deb $TARGET_ROOTFS_DIR/packages/install_packages
    sudo cp -rpf packages/$ARCH/${ISP:0:5}/camera_engine_$ISP*.deb $TARGET_ROOTFS_DIR/packages/install_packages #linux kernel deb
    if [ -e ../linux-headers* ]; then
    Image_Deb=$(basename ../linux-headers*)
    sudo mkdir -p $TARGET_ROOTFS_DIR/boot/kerneldeb
    sudo touch $TARGET_ROOTFS_DIR/boot/build-host
    sudo cp -vrpf ../${Image_Deb} $TARGET_ROOTFS_DIR/boot/kerneldeb
    sudo cp -vrpf ../${Image_Deb/headers/image} $TARGET_ROOTFS_DIR/boot/kerneldeb
    fi # overlay folder
    sudo cp -rpf overlay/* $TARGET_ROOTFS_DIR/ # overlay-firmware folder
    sudo cp -rpf overlay-firmware/* $TARGET_ROOTFS_DIR/ # overlay-debug folder
    # adb, video, camera test file
    if [ "$VERSION" == "debug" ]; then
    sudo cp -rpf overlay-debug/* $TARGET_ROOTFS_DIR/
    fi
    ## hack the serial
    sudo cp -f overlay/usr/lib/systemd/system/serial-getty@.service $TARGET_ROOTFS_DIR/lib/systemd/system/serial-getty@.service # adb
    if [[ "$ARCH" == "armhf" && "$VERSION" == "debug" ]]; then
    sudo cp -f overlay-debug/usr/local/share/adb/adbd-32 $TARGET_ROOTFS_DIR/usr/bin/adbd
    elif [[ "$ARCH" == "arm64" && "$VERSION" == "debug" ]]; then
    sudo cp -f overlay-debug/usr/local/share/adb/adbd-64 $TARGET_ROOTFS_DIR/usr/bin/adbd
    fi echo -e "\033[47;36m Change root.....................\033[0m"
    if [ "$ARCH" == "armhf" ]; then
    sudo cp /usr/bin/qemu-arm-static $TARGET_ROOTFS_DIR/usr/bin/
    elif [ "$ARCH" == "arm64" ]; then
    sudo cp /usr/bin/qemu-aarch64-static $TARGET_ROOTFS_DIR/usr/bin/
    fi
  3. 进入 chroot 环境

    sudo mount -o bind /dev $TARGET_ROOTFS_DIR/dev
    
    # 使用 stat 命令获取指定文件或目录的用户 ID,并将其存储在变量 ID 中, 默认情况下是 0
    ID=$(stat --format %u $TARGET_ROOTFS_DIR) cat << EOF | sudo chroot $TARGET_ROOTFS_DIR # 修复程序所有者
    # Fixup owners
    if [ "$ID" -ne 0 ]; then
    find / -user $ID -exec chown -h 0:0 {} \;
    fi
    for u in \$(ls /home/); do
    chown -h -R \$u:\$u /home/\$u
    done # 根据 $MIRROR 变量的值配置 Embedfire 的软件源
    if [ $MIRROR ]; then
    mkdir -p /etc/apt/keyrings
    curl -fsSL https://Embedfire.github.io/keyfile | gpg --dearmor -o /etc/apt/keyrings/embedfire.gpg
    chmod a+r /etc/apt/keyrings/embedfire.gpg
    echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/embedfire.gpg] https://cloud.embedfire.com/mirrors/ebf-debian carp-lbc main" | tee /etc/apt/sources.list.d/embedfire-lbc.list > /dev/null
    echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/embedfire.gpg] https://cloud.embedfire.com/mirrors/ebf-debian $MIRROR main" | tee /etc/apt/sources.list.d/embedfire-$MIRROR.list > /dev/null
    fi export LC_ALL=C.UTF-8 apt-get update
    apt-get upgrade -y chmod o+x /usr/lib/dbus-1.0/dbus-daemon-launch-helper
    chmod +x /etc/rc.local export APT_INSTALL="apt-get install -fy --allow-downgrades"
  4. 配置桌面

    echo -e "\033[47;36m ---------- LubanCat -------- \033[0m"
    \${APT_INSTALL} fire-config u-boot-tools logrotate
    if [[ "$TARGET" == "gnome" || "$TARGET" == "gnome-full" ]]; then
    \${APT_INSTALL} gdisk fire-config-gui
    #Desktop background picture
    ln -sf /usr/share/xfce4/backdrops/lubancat-wallpaper.png /usr/share/backgrounds/warty-final-ubuntu.png
    elif [[ "$TARGET" == "xfce" || "$TARGET" == "xfce-full" ]]; then
    \apt-get remove -y gnome-bluetooth
    \${APT_INSTALL} bluez bluez-tools fire-config-gui
    #Desktop background picture
    ln -sf /usr/share/xfce4/backdrops/lubancat-wallpaper.png /usr/share/xfce4/backdrops/xubuntu-wallpaper.png
    elif [ "$TARGET" == "lite" ]; then
    \${APT_INSTALL} bluez bluez-tools
    fi
  5. 安装平台工具包

    apt install -fy --allow-downgrades /packages/install_packages/*.deb
    
    apt install -fy --allow-downgrades /boot/kerneldeb/* || true
    
    if [[ "$TARGET" == "gnome" ||  "$TARGET" == "xfce" || "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    echo -e "\033[47;36m ----- power management ----- \033[0m"
    \${APT_INSTALL} pm-utils triggerhappy bsdmainutils
    cp /etc/Powermanager/triggerhappy.service /lib/systemd/system/triggerhappy.service
    fi echo -e "\033[47;36m ----------- RGA ----------- \033[0m"
    \${APT_INSTALL} /packages/rga2/*.deb if [[ "$TARGET" == "gnome" || "$TARGET" == "xfce" || "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    echo -e "\033[47;36m ------ Setup Video---------- \033[0m"
    \${APT_INSTALL} gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-tools gstreamer1.0-alsa gstreamer1.0-plugins-base-apps qtmultimedia5-examples
    \${APT_INSTALL} /packages/mpp/*
    \${APT_INSTALL} /packages/gst-rkmpp/*.deb
    \${APT_INSTALL} /packages/gstreamer/*.deb
    # \${APT_INSTALL} /packages/gst-plugins-base1.0/*.deb
    # \${APT_INSTALL} /packages/gst-plugins-bad1.0/*.deb
    # \${APT_INSTALL} /packages/gst-plugins-good1.0/*.deb
    fi if [[ "$TARGET" == "gnome" || "$TARGET" == "xfce" || "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    echo -e "\033[47;36m ----- Install Camera ----- - \033[0m"
    \${APT_INSTALL} cheese v4l-utils
    \${APT_INSTALL} /packages/libv4l/*.deb
    elif [ "$TARGET" == "lite" ]; then
    echo -e "\033[47;36m ----- Install Camera ----- - \033[0m"
    \${APT_INSTALL} v4l-utils
    \${APT_INSTALL} /packages/mpp/*
    fi if [[ "$TARGET" == "gnome" || "$TARGET" == "gnome-full" ]]; then
    echo -e "\033[47;36m ----- Install Xserver------- \033[0m"
    \${APT_INSTALL} /packages/xserver/xserver-xorg-*.deb
    apt-mark hold xserver-xorg-core xserver-xorg-legacy
    elif [[ "$TARGET" == "xfce" || "$TARGET" == "xfce-full" ]]; then
    echo -e "\033[47;36m ----- Install Xserver------- \033[0m"
    \${APT_INSTALL} /packages/xserver/*.deb
    apt-mark hold xserver-common xserver-xorg-core xserver-xorg-legacy
    fi if [[ "$TARGET" == "gnome" || "$TARGET" == "xfce" || "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    echo -e "\033[47;36m ------ update chromium ----- \033[0m"
    \${APT_INSTALL} /packages/chromium/*.deb
    # echo -e "\033[47;36m --------- firefox-esr ------ \033[0m"
    # \${APT_INSTALL} /packages/firefox/*.deb
    fi echo -e "\033[47;36m ------- Install libdrm ------ \033[0m"
    \${APT_INSTALL} /packages/libdrm/*.deb if [[ "$TARGET" == "gnome" || "$TARGET" == "xfce" || "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    echo -e "\033[47;36m ------ libdrm-cursor -------- \033[0m"
    \${APT_INSTALL} /packages/libdrm-cursor/*.deb
    # Only preload libdrm-cursor for X
    sed -i "/libdrm-cursor.so/d" /etc/ld.so.preload
    sed -i "1aexport LD_PRELOAD=libdrm-cursor.so.1" /usr/bin/X
    fi if [[ "$TARGET" == "gnome" || "$TARGET" == "xfce" || "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    if [ "$VERSION" == "debug" ]; then
    echo -e "\033[47;36m ------ Install glmark2 ------ \033[0m"
    \${APT_INSTALL} glmark2-es2
    fi
    fi if [ -e "/usr/lib/aarch64-linux-gnu" ] ; then
    echo -e "\033[47;36m ------- move rknpu2 --------- \033[0m"
    mv /packages/rknpu2/*.tar /
    fi echo -e "\033[47;36m ----- Install rktoolkit ----- \033[0m"
    \${APT_INSTALL} /packages/rktoolkit/*.deb if [[ "$TARGET" == "gnome" || "$TARGET" == "xfce" || "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    echo -e "\033[47;36m ------ Install ffmpeg ------- \033[0m"
    \${APT_INSTALL} ffmpeg
    \${APT_INSTALL} /packages/ffmpeg/*.deb
    fi if [[ "$TARGET" == "gnome" || "$TARGET" == "xfce" || "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    echo -e "\033[47;36m ------- Install mpv --------- \033[0m"
    \apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install -y /packages/mpv/*.deb
    fi if [[ "$TARGET" == "gnome-full" || "$TARGET" == "xfce-full" ]]; then
    echo -e "\033[47;36m ------ Install scratch ------- \033[0m"
    \${APT_INSTALL} /packages/embedfire/scratch_*.deb
    fi

    是不是发现这个环节也是挺简单的,需要对平台资源的移植的裁剪时,直接更改这里的操作即可。

  6. 自定义脚本

    echo -e "\033[47;36m ------- Custom Script ------- \033[0m"
    systemctl mask systemd-networkd-wait-online.service
    systemctl mask NetworkManager-wait-online.service
    systemctl disable hostapd
    rm /lib/systemd/system/wpa_supplicant@.service
  7. 清除后退出 chroot 环境

    echo -e "\033[47;36m  ---------- Clean ----------- \033[0m"
    if [ -e "/usr/lib/arm-linux-gnueabihf/dri" ] ;
    then
    cd /usr/lib/arm-linux-gnueabihf/dri/
    cp kms_swrast_dri.so swrast_dri.so /
    rm /usr/lib/arm-linux-gnueabihf/dri/*.so
    mv /*.so /usr/lib/arm-linux-gnueabihf/dri/
    elif [ -e "/usr/lib/aarch64-linux-gnu/dri" ];
    then
    cd /usr/lib/aarch64-linux-gnu/dri/
    cp kms_swrast_dri.so swrast_dri.so /
    rm /usr/lib/aarch64-linux-gnu/dri/*.so
    mv /*.so /usr/lib/aarch64-linux-gnu/dri/
    rm /etc/profile.d/qt.sh
    fi
    rm -rf /home/$(whoami)
    rm -rf /var/lib/apt/lists/*
    rm -rf /var/cache/
    rm -rf /packages/
    rm -rf /boot/*

注意: 关于上面提到平台相关的 deb 是怎么来的,在文章的开头变介绍了,这里就不过多描述。可以多参看一下 buildroot 的操作过程,熟悉后,基本可以轻松了解整个环节

七、镜像打包

#!/bin/bash -e

TARGET_ROOTFS_DIR=./binary
MOUNTPOINT=./rootfs
ROOTFSIMAGE=ubuntu-$IMAGE_VERSION-rootfs.img echo Making rootfs! if [ -e ${ROOTFSIMAGE} ]; then
rm ${ROOTFSIMAGE}
fi
if [ -e ${MOUNTPOINT} ]; then
rm -r ${MOUNTPOINT}
fi sudo ./post-build.sh $TARGET_ROOTFS_DIR # Create directories
mkdir ${MOUNTPOINT}
dd if=/dev/zero of=${ROOTFSIMAGE} bs=1M count=0 seek=7000 finish() {
sudo umount ${MOUNTPOINT} || true
echo -e "[ MAKE ROOTFS FAILED. ]"
exit -1
} echo Format rootfs to ext4
mkfs.ext4 ${ROOTFSIMAGE} echo Mount rootfs to ${MOUNTPOINT}
sudo mount ${ROOTFSIMAGE} ${MOUNTPOINT}
trap finish ERR echo Copy rootfs to ${MOUNTPOINT}
sudo cp -rfp ${TARGET_ROOTFS_DIR}/* ${MOUNTPOINT} echo Umount rootfs
sudo umount ${MOUNTPOINT} echo Rootfs Image: ${ROOTFSIMAGE} e2fsck -p -f ${ROOTFSIMAGE}
resize2fs -M ${ROOTFSIMAGE}

将会发现整个打包的过程也比较简单,前面也有笔记进行介绍。

八、总结

到此我们对于 ARM 环境中安装系统的操作基本结束了,看到这里都没什么问题的小伙伴也彻底掌握了移植的流程和移植过程中的问题处理。剩下的就是时间问题。

给大家的建议也很简单,在学习的时候,一定要多练习,有时候脑子是明白了,一操作感觉又啥都不会,在练习的过程中,可以帮助自己理解。

这里我们再次感谢野火的无私奉献,他们的脚本,帮助我们快速学习 ubuntu 环境的安装,大大省去了自己编写脚本的过程,特别像我们这样对编写 shell 脚本熟练不是很高的小伙伴,话的时间会更久。

最后便可以学习 android 和 鸿蒙系统的安装,由于我也在学习的过程中,还要自己的工作要处理,所以后面的笔记出的会慢一些。也欢迎大家一起加入学习的队伍中来,相互分型,共同加快学习的速度。

RK 平台安装 ubuntu 系统的更多相关文章

  1. VirtualBox虚拟机安装ubuntu系统(图文详解)

    不多说,直接上干货! 想简单说下,想必大家有的喜欢玩一下linux操作系统,但是又不想实际安装在物理机上.那我们就需要用到虚拟机了,这里我们介绍一下如何用VirtualBox安装ubuntu的方法. ...

  2. 2016031901 - U盘安装ubuntu系统

    使用U盘安装ubuntu系统 01.进入u盘安装 个人使用的是闪迪U盘安装 02. 个人重装ubuntu 03.进入ubuntu安装界面 04.进入语言界面 05.准备安装ubuntu 06.ubun ...

  3. [置顶] 使用U盘安装ubuntu系统

    使用U盘安装ubuntu系统 在网上找了很多教程,都不起效,提示:“从光盘上读取数据出错”. 总结出了几个关键点. 首先,版本,Ubuntu 12.04 Server,一般的U盘安装都会报:“从光盘上 ...

  4. 安装ubuntu系统及ubuntu安装Python的几点心得

    一.安装ubuntu系统 1.ubuntu系统是Linux系统的一种,和centos差别不大,但是个人还是建议大家安装ubuntu,它更适合国内使用习惯,换句话说更亲切. 2.安装方法不再赘述,网上有 ...

  5. 如何安装ubuntu系统

    https://www.cnblogs.com/Chinasf/archive/2010/05/06/1728840.html    [Ubuntu 下挂ISO到虚拟光驱的方法] 各种方法参考如下论坛 ...

  6. U盘上安装Ubuntu系统 便捷式系统 - 赖大大

    简单介绍: U盘可以作为电脑的磁盘使用,在U盘上安装Ubuntu系统,只要有电脑,就可以轻松打开自己的系统, 方便又快捷,非常适合出差工作,学习使用. 另外,插入U盘后,需要我们就入电脑的Blos模式 ...

  7. 安装ubuntu系统 ——分区

    安装ubuntu 系统主要分四个区 目录 建议大小 格式 描述 / 10G-20G ext4 根目录 swap <2048M swap 交换空间 /boot 400M左右 ext4 Linux的 ...

  8. 使用VMWare12.0安装Ubuntu系统

    使用VMWare12.0安装Ubuntu系统 Vmware12的虚拟机的文档说明: http://pubs.vmware.com/workstation-12/index.jsp#com.vmware ...

  9. win10安装ubuntu系统出现的一些问题以及解决方案

    前言 在win10系统进行安装新的ubuntu环境的时候遇到的一些问题,以及解决方案,供以后参考. 准备 从ubuntu官网下载最近版本的ubuntu系统,Ubuntu最新版本下载地址 操作系统:wi ...

  10. 用VirtualBox代替VMWare安装Ubuntu系统图文教程总结

    文章目录 为什么使用VirtualBox,而不是VMWare? 图文教程 安装VirtualBox 下载Ubuntu镜像 新建虚拟机 安装Ubuntu系统 总结 为什么使用VirtualBox,而不是 ...

随机推荐

  1. 计算机网络-Keep Alive

    问题背景 介绍两个经典的网络问题, 问题1: 访问位于Azure Application Gateway之后的nodejs server, 偶尔会触发502 问题2: 请求一个Azure App Se ...

  2. springboot mybatis 多数据源整合

    1.在application.properties中配置两个数据库: # db01 database spring.datasource.db01.jdbc-url=jdbc:oracle:thin: ...

  3. 源自opencore的fifo的IP核解析

    fifo的IP核学习与解析 1.fifo的基本原理 fifo,就是缓存器,可以理解为升级版的D触发器.D触发器是在时钟信号的控制下,数据等时间间隔刷新.对于fifo而言,数据也是需要刷新的,不过有一个 ...

  4. exist和left join 性能对比

    今天遇到一个性能问题,再调优过程中发现耗时最久的计划是exist 部分涉及的三个表. 然后计划用left join 来替换exist,然后查询了很多资料,大部分都说exist和left join 性能 ...

  5. KingbaseES 支持自定义异常

    KingbaseES PLSQL 从 V8R6C4 版本开始,支持用户自定义异常.具体例子如下: create or replace procedure p_test() as error_numbe ...

  6. Scala 函数至简原则

    (1)return 可以省略,Scala 会使用函数体的最后一行代码作为返回值(2)如果函数体只有一行代码,可以省略花括号(3)返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)(4) ...

  7. MySQL索引Innodb存储引擎

    MySQL索引优化 一.基础理解 MySQL语句的查询效率主要和索引树的高度有关,想要降低查询的次数提高查询的速度,减少直接对磁盘的I/O流的次数,就要让索引树的高度越低越好. 索引的定义:索引是帮助 ...

  8. AndroidStudio配置 | 菜鸟教程

    https://www.runoob.com/android/android-studio-install.html

  9. OpenHarmony创新赛 | 您有一份创新激励奖待领取 请查收!

      2023开源和信息消费大赛 开放原子开源大赛OpenHarmony创新赛 (以下简称"OpenHarmony创新赛") 正如火如荼的进行当中 赛程也即将进入到提交作品的关键阶段 ...

  10. Python将依赖包导出到requirements.txt文件

    代码 # 查询环境中已经安装的库 pip list # 将所有依赖库导出到 requirements.txt 文件 pip freeze > requirements.txt