
这里只做一下关键的笔记,对新手不友好,对老手比较合适。
上一篇在Ubuntu 18.04.4的基础环境中,已经完成了全部SDK的编译动作。目前还不会搞kernel,但是问了一下相关的大佬,说4.19的linux内核,其实也是可以跑Ubuntu 22.04.4的rootfs的,一般也就是内核的新特性没法调用。其它都不会有什么问题。
索性搞了一下,但是一直失败。镜像是可以做出来,但是始终桌面不显示。
编译过程会遇到以下类似错误:
libc-bin is already the newest version (2.35-0ubuntu3.6).
…………
dpkg: error processing package libc-bin (--configure):
installed libc-bin package post-installation script subprocess returned error exit status 139
Errors were encountered while processing:
libc-bin
E: Sub-process /usr/bin/dpkg returned an error code (1) 用这种方法解决过,虽然ERR变成了警告,但是依然是不出桌面的,最好的情况可以进入命令行。
sudo rm /var/lib/dpkg/info/libc-bin*
sudo dpkg --configure -D 777 libc-bin
sudo apt -f install
##这招不行,虽然apt可以正常按各种包了,但还是不正常 这个经过不断的定位,最终发现其实根本原因是qemu与目标rootfs系统的适配问题。
万水千山绕过来,最终发现还是环境问题。
Ubuntu 18.04的qemu
qemu-aarch64-static --version
qemu-aarch64 version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.42)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers

Ubuntu 18.04的qemu版本信息
Ubuntu 22.04的qemu
superx@tspi-pc:/app$ qemu-aarch64-static --version
qemu-aarch64 version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.17)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

Ubuntu 22.04的qemu版本信息
经过我的试验,Ubuntu22.04.4的rootfs在Ubuntu22.04.4的desktop环境中成功编译打包成功了。
以前很少用Ubuntu,主要用CentOS和Redhat系的linux。这次在这个上面,犯了简直堪称低级错误。最先遇到的其实就是这个坑。
默认一搞, 先来一把镜像加速,镜像加速很简单啊,url的域名一换就完事儿对吧。这事儿在Ubuntu上还真不行。yum的源基本上就是url一换就完事儿,版本对上就行。
18.04里编译Ubuntu20.4的rootfs时,source.list用的北外语的http://mirrors.bfsu.edu.cn源。没仔细看。新建环境的时候,又搞。直接把20.4的北外的source.list配置给了22.04。然后就是各种版本报错,libc-bin也在其中,都是目标软件版本低,当前版本高。查了很久都不知道问题在哪。最后才发现,是发行代号没有换。换掉后,就会发现libc-bin与qemu兼容性的坑了。
这里贴个Ubuntu22.04.4正确的source.list,做个记录:
#Ubuntu ports V22.04 注意发行代号jammy
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.bfsu.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb-src http://mirrors.bfsu.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb http://mirrors.bfsu.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.bfsu.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb http://mirrors.bfsu.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.bfsu.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
deb http://mirrors.bfsu.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.bfsu.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse 如果你发现apt install时一大堆版本低了,高了的提示,最好查一下,自己的source和系统版本是否匹配。
注意看Debian文件夹里的mk rootfs的脚本,里面有复制这个路径下的内核文件。搭建编译环境的时候,要把这个kernel的子目录按路径拷贝到自己的环境,另外把Debian文件夹(已经完整编译过的哦)拷贝到自己的环境就够了。其它都不需要。
只需要照猫画虎core换成Ubuntu的,source.list换成Ubuntu的,里面复制的那些驱动啊,扩展包啊,都还是保留。桌面换成xface就ok。
注意这个路径,一定要复制上
../kernel/drivers/net/wireless/rockchip_wlan/*

烧录点亮Ubuntu22.04.4桌面出来了


Ubuntu22.04.4 apt安装正常

apt 安装成功
Ubuntu 22.04.4 desktop依然还是最小化安装,分区启用lvm卷管理。完成后,安装以下组件,以确保脚本执行顺利。
#Ubuntu 22.04.4
sudo apt install -y build-essential crossbuild-essential-arm64 bash-completion vim sudo locales time rsync bc python2 python-is-python3
sudo apt install -y repo git ssh libssl-dev liblz4-tool lib32stdc++6
sudo apt install -y expect patchelf chrpath gawk texinfo diffstat binfmt-support
sudo apt install -y qemu-user-static live-build bison flex fakeroot cmake
sudo apt install -y unzip device-tree-compiler python-pip ncurses-dev python3-pyelftools
sudo apt install -y subversion asciidoc w3m dblatex graphviz python3-matplotlib cpio
sudo apt install -y libparse-yapp-perl default-jre patchutils swig expect-dev u-boot-tools
sudo apt install -y bear whiptail
sudo apt update
sudo apt install -y -f
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
}
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"
echo ""
echo "For example: ch-mount.sh -m /media/sdcard"
echo ""
echo 1st parameter : ${1}
echo 2nd parameter : ${2}
fi
mk-base-ubuntu-tspi.sh
#!/bin/bash -e
if [ "$ARCH" == "armhf" ]; then
ARCH='armhf'
elif [ "$ARCH" == "arm64" ]; then
ARCH='arm64'
else
echo -e "\033[36m please input the os type,armhf or arm64...... \033[0m"
fi
VERSION="debug"
TARGET_ROOTFS_DIR="binary"
user_install_list=(
"rsyslog" #系统日志
"dialog" #交互对话框
"sudo" #超级用户(root)的权限执行命令
"vim" #装个vim方便修改文件
"apt-utils" #包管理工具
"net-tools" #网络工具的软件包,包含ifconfig、arp、netstat 等
"inetutils-ping" #ping 我习惯用了但是好像被遗废掉了
"onboard" #虚拟键盘
"evtest" #事件工具
"udev" #设备管理的子系统
"language-pack-zh-hans" #中文语言支持,包括界面、帮助文件等。
)
if [ -e ubuntu22.04-whole.tar.gz ]; then
sudo rm -rf ubuntu22.04-whole.tar.gz
fi
if [ -d $TARGET_ROOTFS_DIR ] ; then
sudo rm -rf $TARGET_ROOTFS_DIR
fi
if [ ! -d $TARGET_ROOTFS_DIR ] ; then
sudo mkdir -p $TARGET_ROOTFS_DIR
if [ ! -e ubuntu-base-22.04.4-base-$ARCH.tar.gz ]; then
echo "\033[36m wget ubuntu-base-22.04-base-x.tar.gz \033[0m"
wget -c http://cdimage.ubuntu.com/ubuntu-base/releases/22.04.4/release/ubuntu-base-22.04.4-base-$ARCH.tar.gz
fi
sudo tar -xzvf ubuntu-base-22.04.4-base-$ARCH.tar.gz -C $TARGET_ROOTFS_DIR/
sudo cp -b /etc/resolv.conf $TARGET_ROOTFS_DIR/etc/resolv.conf
sudo cp -b sources.list $TARGET_ROOTFS_DIR/etc/apt/
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
finish() {
./ch-mount.sh -u $TARGET_ROOTFS_DIR
echo -e "error exit"
exit -1
}
trap finish ERR
echo "\033[36m Change root.....................\033[0m"
./ch-mount.sh -m $TARGET_ROOTFS_DIR
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
#--------- Xfce -----
DEBIAN_FRONTEND=noninteractive apt install -y xubuntu-core
#------------------user isntall------------
\${APT_INSTALL} ${user_install_list[@]}
HOST=lckfb
# Create User
useradd -G sudo -m -s /bin/bash lckfb
passwd lckfb <<IEOF
lckfb
lckfb
IEOF
gpasswd -a lckfb video
gpasswd -a lckfb audio
passwd root <<IEOF
root
root
IEOF
# Enable lightdm autologin for linaro user
if [ -e /etc/gdm3/custom.conf ]; then
sed -i "s|^# AutomaticLogin=.*|AutomaticLogin=lckfb|" /etc/gdm3/custom.conf
sed -i "s|^# AutomaticLoginEnable=.*|AutomaticLoginEnable=true|" /etc/gdm3/custom.conf
fi
# workaround 90s delay
services=(NetworkManager systemd-networkd)
for service in \${services[@]}; do
systemctl mask \${service}-wait-online.service
done
# disbale the wire/nl80211
systemctl mask wpa_supplicant-wired@
systemctl mask wpa_supplicant-nl80211@
systemctl mask wpa_supplicant@
# Make systemd less spammy
sed -i 's/#LogLevel=info/LogLevel=warning/' \
/etc/systemd/system.conf
sed -i 's/#LogTarget=journal-or-kmsg/LogTarget=journal/' \
/etc/systemd/system.conf
# check to make sure sudoers file has ref for the sudo group
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
# make sure that NOPASSWD is set for %sudo
# expecially in the case that we didn't add it to /etc/sudoers
# just blow the %sudo line away and force it to be NOPASSWD
sed -i -e '
/\%sudo/ c \
%sudo ALL=(ALL) NOPASSWD: ALL
' /etc/sudoers
sync
EOF
./ch-mount.sh -u $TARGET_ROOTFS_DIR
sudo tar zcvf ubuntu22.04-whole.tar.gz $TARGET_ROOTFS_DIR
sudo rm $TARGET_ROOTFS_DIR -r
echo -e "normal exit"
mk-rootfs-tspi.sh
#!/bin/bash -e
TARGET_ROOTFS_DIR="binary"
case "${ARCH:-$1}" in
arm|arm32|armhf)
ARCH=armhf
;;
*)
ARCH=arm64
;;
esac
echo -e "\033[36m Building for $ARCH \033[0m"
if [ ! $VERSION ]; then
VERSION="release"
fi
if [ -e $TARGET_ROOTFS_DIR ]; then
sudo rm -rf $TARGET_ROOTFS_DIR
fi
if [ ! -e ubuntu22.04-whole.tar.gz ]; then
echo "\033[36m Run mk-base-ubuntu.sh first \033[0m"
exit -1
fi
finish() {
sudo umount $TARGET_ROOTFS_DIR/dev
exit -1
}
trap finish ERR
echo -e "\033[36m Extract image \033[0m"
sudo tar -xpf ubuntu22.04-whole.tar.gz
# packages folder
sudo mkdir -p $TARGET_ROOTFS_DIR/packages
sudo cp -rpf packages/$ARCH/* $TARGET_ROOTFS_DIR/packages
# 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 -rf overlay-debug/* $TARGET_ROOTFS_DIR/
fi
## 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
# bt/wifi firmware
sudo mkdir -p $TARGET_ROOTFS_DIR/system/lib/modules/
sudo mkdir -p $TARGET_ROOTFS_DIR/vendor/etc
sudo find ./kernel/drivers/net/wireless/rockchip_wlan/* -name "*.ko" | \
xargs -n1 -i sudo cp {} $TARGET_ROOTFS_DIR/system/lib/modules/
echo -e "\033[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
sudo cp -f /etc/resolv.conf $TARGET_ROOTFS_DIR/etc/
sudo cp -f sources.list $TARGET_ROOTFS_DIR/etc/apt/
sudo mount -o bind /dev $TARGET_ROOTFS_DIR/dev
sudo mount -o bind /dev/pts $TARGET_ROOTFS_DIR/dev/pts
cat << EOF | sudo chroot $TARGET_ROOTFS_DIR
export LC_ALL=C.UTF-8
apt-get update
apt-get upgrade -y
apt-get install -fy
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"
#---------------Pre-packages --------------
\${APT_INSTALL} bsdmainutils parole
apt remove -fy firefox totem
#---------------Rga--------------
\${APT_INSTALL} /packages/rga/*.deb
echo -e "\033[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
#---------Camera---------
echo -e "\033[36m Install camera.................... \033[0m"
\${APT_INSTALL} cheese v4l-utils
#\${APT_INSTALL} /packages/rkisp/*.deb
\${APT_INSTALL} /packages/rkaiq/*.deb
\${APT_INSTALL} /packages/libv4l/*.deb
#---------Xserver---------
echo -e "\033[36m Install Xserver.................... \033[0m"
#\${APT_INSTALL} /packages/xserver/*.deb
dpkg -i /packages/xserver/*.deb
apt install -f -y
apt-mark hold xserver-xorg-core
#---------update chromium-----
\${APT_INSTALL} libjsoncpp-dev libminizip1
\${APT_INSTALL} /packages/chromium/*.deb
#------------------libdrm------------
echo -e "\033[36m Install libdrm.................... \033[0m"
\${APT_INSTALL} /packages/libdrm/*.deb
#------------------libdrm-cursor------------
echo -e "\033[36m Install 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
#------------------blueman------------
echo -e "\033[36m Install blueman.................... \033[0m"
\${APT_INSTALL} /packages/blueman/*.deb
#------------------rkwifibt------------
echo -e "\033[36m Install rkwifibt.................... \033[0m"
\${APT_INSTALL} /packages/rkwifibt/*.deb
ln -s /system/etc/firmware /vendor/etc/
if [ "$VERSION" == "debug" ]; then
#------------------glmark2------------
echo -e "\033[36m Install glmark2.................... \033[0m"
\${APT_INSTALL} glmark2-es2
fi
#------------------rknpu2------------
echo -e "\033[36m Install rknpu2.................... \033[0m"
tar xvf /packages/rknpu2/*.tar -C /
#------------------rktoolkit------------
echo -e "\033[36m Install rktoolkit.................... \033[0m"
\${APT_INSTALL} /packages/rktoolkit/*.deb
#------------------apt-utils------------
apt-get install -y apt-utils
apt-get install -y dialog
#------------------ffmpeg------------
\${APT_INSTALL} /packages/ffmpeg/*.deb
#------------------mpv------------
\${APT_INSTALL} smplayer
\${APT_INSTALL} /packages/mpv/*.deb
mv /etc/mpv/mpv-rk.conf /etc/mpv/mpv.conf
cp /packages/libmali/libmali-*-x11*.deb /
cp -rf /packages/rkaiq/*.deb /
# reduce 500M size for rootfs
rm -rf /usr/lib/firmware
sed -i "/exit 0/i \ echo 3 > /sys/class/graphics/fb0/blank" /etc/rc.local
#------remove unused packages------------
apt remove --purge -fy linux-firmware*
#---------------Clean--------------
if [ -e "/usr/lib/arm-linux-gnueabihf/dri" ]; then
cd /usr/lib/arm-linux-gnueabihf/dri/
cp kms_swrast_dri.so swrast_dri.so rockchip_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 rockchip_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
cd -
# mark package to hold
apt list --installed | grep -v oldstable | cut -d/ -f1 | xargs apt-mark hold
#---------------Custom Script--------------
systemctl mask systemd-networkd-wait-online.service
systemctl mask NetworkManager-wait-online.service
rm /lib/systemd/system/wpa_supplicant@.service
EOF
sudo umount $TARGET_ROOTFS_DIR/dev
mk-image.sh
#!/bin/bash -e
TARGET_ROOTFS_DIR=./binary
MOUNTPOINT=./rootfs
ROOTFSIMAGE=ubuntu-jammy.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=8000
finish() {
sudo umount ${MOUNTPOINT} || true
echo -e "\e[31m MAKE ROOTFS FAILED.\e[0m"
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}
post-build.sh
#!/bin/bash -e
TARGET_DIR=$1
shift
RK_LEGACY_PARTITIONS=" \
${RK_OEM_FS_TYPE:+oem:/oem:${RK_OEM_FS_TYPE}}
${RK_USERDATA_FS_TYPE:+userdata:/userdata:${RK_USERDATA_FS_TYPE}}
"
# <dev>:<mount point>:<fs type>:<source dir>, for example:
# RK_EXTRA_PARTITIONS="oem:/oem:ext2:oem_normal userdata:/userdata:vfat:userdata_empty"
RK_EXTRA_PARTITIONS=${RK_EXTRA_PARTITIONS:-${RK_LEGACY_PARTITIONS}}
function fixup_root()
{
echo "Fixing up rootfs type: $1"
FS_TYPE=$1
sed -i "s#\([[:space:]]/[[:space:]]\+\)\w\+#\1${FS_TYPE}#" \
${TARGET_DIR}/etc/fstab
}
function fixup_part()
{
echo "Fixing up partition: $@"
if echo $1 | grep -qE "^/"; then
DEV=$1
else
DEV="PARTLABEL=$1"
fi
MOUNT=${2:-/$1}
FS_TYPE=${3:-auto}
OPT=${4:-defaults}
sed -i "#[[:space:]]${MOUNT}[[:space:]]#d" ${TARGET_DIR}/etc/fstab
echo -e "${DEV}\t${MOUNT}\t${FS_TYPE}\t${OPT}\t0 2" >> \
${TARGET_DIR}/etc/fstab
mkdir -p ${TARGET_DIR}/${MOUNT}
}
function fixup_fstab()
{
echo "Fixing up /etc/fstab..."
case "${RK_ROOTFS_TYPE}" in
ext[234])
fixup_root ${RK_ROOTFS_TYPE}
;;
*)
fixup_root auto
;;
esac
for part in ${RK_EXTRA_PARTITIONS}; do
fixup_part $(echo "${part}" | xargs -d':')
done
}
function add_build_info()
{
[ -f ${TARGET_DIR}/etc/os-release ] && \
sed -i "/^BUILD_ID=/d" ${TARGET_DIR}/etc/os-release
echo "Adding build-info to /etc/os-release..."
echo "BUILD_INFO=\"$(whoami)@$(hostname) $(date)${@:+ - $@}\"" >> \
${TARGET_DIR}/etc/os-release
}
function add_dirs_and_links()
{
echo "Adding dirs and links..."
cd ${TARGET_DIR}
mkdir -p mnt/sdcard mnt/usb0
ln -sf media/usb0 udisk
ln -sf mnt/sdcard sdcard
ln -sf userdata data
}
echo "Executing $(basename $0)..."
add_build_info $@
[ -f ${TARGET_DIR}/etc/fstab ] && fixup_fstab
add_dirs_and_links
exit 0
构建过程:
Ubuntu 22.04.4 ARM64
export ARCH=arm64 RELEASE=jammy
./mk-base-ubuntu-tspi.sh
export VERSION=debug ARCH=arm64
./mk-rootfs-tspi.sh
./mk-image.sh