立创泰山派训练营学习笔记--Ubuntu22.04.4 rootfs根文件系统制作-Linux SDK编译(二)
夜魔009
编辑于 2024年11月10日 11:47
收录于文集
共4篇

这里只做一下关键的笔记,对新手不友好,对老手比较合适。

上一篇在Ubuntu 18.04.4的基础环境中,已经完成了全部SDK的编译动作。目前还不会搞kernel,但是问了一下相关的大佬,说4.19的linux内核,其实也是可以跑Ubuntu 22.04.4的rootfs的,一般也就是内核的新特性没法调用。其它都不会有什么问题。

索性搞了一下,但是一直失败。镜像是可以做出来,但是始终桌面不显示。

编译过程会遇到以下类似错误:

关于libc-bin的:

代码块
Shell
自动换行
复制代码
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变成了警告,但是依然是不出桌面的,最好的情况可以进入命令行。

代码块
Shell
自动换行
复制代码
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

代码块
Shell
自动换行
复制代码
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

代码块
Shell
自动换行
复制代码
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版本信息

真相大白了吧!编译环境的操作系统要升级,本人小白,不知道在Ubuntu18.04里怎么把qemu的6.2版本装进去,18.04里最高的qemu版本只有2.11,没法兼容Ubuntu22.04。所以最简单就是把编译环境升高到和rootfs目标版本一致。

经过我的试验,Ubuntu22.04.4的rootfs在Ubuntu22.04.4的desktop环境中成功编译打包成功了。

关于source.list的坑:

以前很少用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,做个记录:

代码块
Shell
自动换行
复制代码
#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/*

rootfs制作成功:

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

Ubuntu22.04.4 apt安装正常

apt 安装成功

环境初始化:

Ubuntu 22.04.4 desktop依然还是最小化安装,分区启用lvm卷管理。完成后,安装以下组件,以确保脚本执行顺利。

代码块
Shell
自动换行
复制代码
#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

代码块
Shell
自动换行
复制代码
#!/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

代码块
Shell
自动换行
复制代码
#!/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=&quot;apt-get install -fy --allow-downgrades&quot;

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 &quot;s|^#	AutomaticLogin=.*|AutomaticLogin=lckfb|&quot; /etc/gdm3/custom.conf
  sed -i &quot;s|^#	AutomaticLoginEnable=.*|AutomaticLoginEnable=true|&quot; /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=&quot;\$(awk '\$1 == &quot;%sudo&quot; { print \$1 }' /etc/sudoers)&quot;
if [ -z &quot;\$SUDOEXISTS&quot; ]; then
  # append sudo entry to sudoers
  echo &quot;# Members of the sudo group may gain root privileges&quot; >> /etc/sudoers
  echo &quot;%sudo ALL=(ALL) NOPASSWD: ALL&quot; >> /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 &quot;normal exit&quot;
复制成功

mk-rootfs-tspi.sh

代码块
Shell
自动换行
复制代码
#!/bin/bash -e

TARGET_ROOTFS_DIR=&quot;binary&quot;

case &quot;${ARCH:-$1}&quot; in
	arm|arm32|armhf)
		ARCH=armhf
		;;
	*)
		ARCH=arm64
		;;
esac

echo -e &quot;\033[36m Building for $ARCH \033[0m&quot;

if [ ! $VERSION ]; then
	VERSION=&quot;release&quot;
fi

if [ -e $TARGET_ROOTFS_DIR ]; then
	sudo rm -rf $TARGET_ROOTFS_DIR
fi

if [ ! -e ubuntu22.04-whole.tar.gz ]; then
	echo &quot;\033[36m Run mk-base-ubuntu.sh first \033[0m&quot;
	exit -1
fi

finish() {
	sudo umount $TARGET_ROOTFS_DIR/dev
	exit -1
}
trap finish ERR

echo -e &quot;\033[36m Extract image \033[0m&quot;
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 [ &quot;$VERSION&quot; == &quot;debug&quot; ]; 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 [[ &quot;$ARCH&quot; == &quot;armhf&quot; && &quot;$VERSION&quot; == &quot;debug&quot; ]]; then
	sudo cp -f overlay-debug/usr/local/share/adb/adbd-32 $TARGET_ROOTFS_DIR/usr/bin/adbd
elif [[ &quot;$ARCH&quot; == &quot;arm64&quot; && &quot;$VERSION&quot; == &quot;debug&quot; ]]; 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 &quot;*.ko&quot; | \
    xargs -n1 -i sudo cp {} $TARGET_ROOTFS_DIR/system/lib/modules/

echo -e &quot;\033[36m Change root.....................\033[0m&quot;
if [ &quot;$ARCH&quot; == &quot;armhf&quot; ]; then
	sudo cp /usr/bin/qemu-arm-static $TARGET_ROOTFS_DIR/usr/bin/
elif [ &quot;$ARCH&quot; == &quot;arm64&quot;  ]; 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=&quot;apt-get install -fy --allow-downgrades&quot;

#---------------Pre-packages --------------
\${APT_INSTALL} bsdmainutils parole
apt remove -fy firefox totem

#---------------Rga--------------
\${APT_INSTALL} /packages/rga/*.deb

echo -e &quot;\033[36m Setup Video.................... \033[0m&quot;
\${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 &quot;\033[36m Install camera.................... \033[0m&quot;
\${APT_INSTALL} cheese v4l-utils
#\${APT_INSTALL} /packages/rkisp/*.deb
\${APT_INSTALL} /packages/rkaiq/*.deb
\${APT_INSTALL} /packages/libv4l/*.deb

#---------Xserver---------
echo -e &quot;\033[36m Install Xserver.................... \033[0m&quot;
#\${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 &quot;\033[36m Install libdrm.................... \033[0m&quot;
\${APT_INSTALL} /packages/libdrm/*.deb

#------------------libdrm-cursor------------
echo -e &quot;\033[36m Install libdrm-cursor.................... \033[0m&quot;
\${APT_INSTALL} /packages/libdrm-cursor/*.deb

# Only preload libdrm-cursor for X
sed -i &quot;/libdrm-cursor.so/d&quot; /etc/ld.so.preload
sed -i &quot;1aexport LD_PRELOAD=libdrm-cursor.so.1&quot; /usr/bin/X

#------------------blueman------------
echo -e &quot;\033[36m Install blueman.................... \033[0m&quot;
\${APT_INSTALL} /packages/blueman/*.deb

#------------------rkwifibt------------
echo -e &quot;\033[36m Install rkwifibt.................... \033[0m&quot;
\${APT_INSTALL} /packages/rkwifibt/*.deb
ln -s /system/etc/firmware /vendor/etc/

if [ &quot;$VERSION&quot; == &quot;debug&quot; ]; then
#------------------glmark2------------
echo -e &quot;\033[36m Install glmark2.................... \033[0m&quot;
\${APT_INSTALL} glmark2-es2
fi

#------------------rknpu2------------
echo -e &quot;\033[36m Install rknpu2.................... \033[0m&quot;
tar xvf /packages/rknpu2/*.tar -C /

#------------------rktoolkit------------
echo -e &quot;\033[36m Install rktoolkit.................... \033[0m&quot;
\${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 &quot;/exit 0/i \ echo 3 > /sys/class/graphics/fb0/blank&quot; /etc/rc.local

#------remove unused packages------------
apt remove --purge -fy linux-firmware*

#---------------Clean--------------
if [ -e &quot;/usr/lib/arm-linux-gnueabihf/dri&quot; ]; 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 &quot;/usr/lib/aarch64-linux-gnu/dri&quot; ]; 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

代码块
Shell
自动换行
复制代码
#!/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 &quot;\e[31m MAKE ROOTFS FAILED.\e[0m&quot;
	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

代码块
Shell
自动换行
复制代码
#!/bin/bash -e

TARGET_DIR=$1
shift

RK_LEGACY_PARTITIONS=&quot; \
	${RK_OEM_FS_TYPE:+oem:/oem:${RK_OEM_FS_TYPE}}
	${RK_USERDATA_FS_TYPE:+userdata:/userdata:${RK_USERDATA_FS_TYPE}}
&quot;

# <dev>:<mount point>:<fs type>:<source dir>, for example:
# RK_EXTRA_PARTITIONS=&quot;oem:/oem:ext2:oem_normal userdata:/userdata:vfat:userdata_empty&quot;
RK_EXTRA_PARTITIONS=${RK_EXTRA_PARTITIONS:-${RK_LEGACY_PARTITIONS}}

function fixup_root()
{
	echo &quot;Fixing up rootfs type: $1&quot;

	FS_TYPE=$1
	sed -i &quot;s#\([[:space:]]/[[:space:]]\+\)\w\+#\1${FS_TYPE}#&quot; \
		${TARGET_DIR}/etc/fstab
}

function fixup_part()
{
	echo &quot;Fixing up partition: $@&quot;

	if echo $1 | grep -qE &quot;^/&quot;; then
		DEV=$1
	else
		DEV=&quot;PARTLABEL=$1&quot;
	fi

	MOUNT=${2:-/$1}
	FS_TYPE=${3:-auto}
	OPT=${4:-defaults}

	sed -i &quot;#[[:space:]]${MOUNT}[[:space:]]#d&quot; ${TARGET_DIR}/etc/fstab

	echo -e &quot;${DEV}\t${MOUNT}\t${FS_TYPE}\t${OPT}\t0 2&quot; >> \
		${TARGET_DIR}/etc/fstab

	mkdir -p ${TARGET_DIR}/${MOUNT} 
}

function fixup_fstab()
{
	echo &quot;Fixing up /etc/fstab...&quot;

	case &quot;${RK_ROOTFS_TYPE}&quot; in
		ext[234])
			fixup_root ${RK_ROOTFS_TYPE}
			;;
		*)
			fixup_root auto
			;;
	esac

	for part in ${RK_EXTRA_PARTITIONS}; do
		fixup_part $(echo &quot;${part}&quot; | xargs -d':')
	done
}

function add_build_info()
{
	[ -f ${TARGET_DIR}/etc/os-release ] && \
		sed -i &quot;/^BUILD_ID=/d&quot; ${TARGET_DIR}/etc/os-release

	echo &quot;Adding build-info to /etc/os-release...&quot;
	echo &quot;BUILD_INFO=\&quot;$(whoami)@$(hostname) $(date)${@:+ - $@}\&quot;&quot; >> \
		${TARGET_DIR}/etc/os-release
}

function add_dirs_and_links()
{
	echo &quot;Adding dirs and links...&quot;

	cd ${TARGET_DIR}
	mkdir -p mnt/sdcard mnt/usb0
	ln -sf media/usb0 udisk
	ln -sf mnt/sdcard sdcard
	ln -sf userdata data
}

echo &quot;Executing $(basename $0)...&quot;

add_build_info $@
[ -f ${TARGET_DIR}/etc/fstab ] && fixup_fstab
add_dirs_and_links

exit 0
复制成功

构建过程:

代码块
Shell
自动换行
复制代码
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

复制成功