创龙3588——debian根文件系统制作

文章目录

  • build.sh debian 执行流程
    • build.sh
      • 源码
      • 流程
    • 30-rootfs.sh
      • 源码
      • 流程
    • mk-rootfs-bullseys.sh
      • 源码
      • 流程
    • mk-sysroot.sh
      • 源码
      • 流程
    • mk-image.sh
      • 源码
      • 流程
    • post-build.sh
  • 大致流程
  • 系统制作步骤

build.sh debian 执行流程

build.sh

源码

run_hooks()
{
	DIR="$1"
	shift

	for dir in "$CHIP_DIR/$(basename "$DIR")/" "$DIR"; do
		[ -d "$dir" ] || continue

		for hook in $(find "$dir" -maxdepth 1 -name "*.sh" | sort); do
			"$hook" $@ && continue
			HOOK_RET=$?
			err_handler $HOOK_RET "${FUNCNAME[0]} $*" "$hook $*"
			exit $HOOK_RET
		done
	done
}

run_build_hooks()
{
	# Don't log these hooks
	case "$1" in
		init | pre-build | make-* | usage | support-cmds)
			run_hooks "$RK_BUILD_HOOK_DIR" $@ || true
			return 0
			;;
	esac

	LOG_FILE="$(start_log "$1")"

	echo -e "# run hook: $@\n" >> "$LOG_FILE"
	run_hooks "$RK_BUILD_HOOK_DIR" $@ 2>&1 | tee -a "$LOG_FILE"
	HOOK_RET=${PIPESTATUS[0]}
	if [ $HOOK_RET -ne 0 ]; then
		err_handler $HOOK_RET "${FUNCNAME[0]} $*" "$@"
		exit $HOOK_RET
	fi
}

main()
{
	[ -z "$DEBUG" ] || set -x

	trap 'err_handler' ERR
	set -eE

	# Save intial envionments
	unset INITIAL_SESSION
	INITIAL_ENV=$(mktemp -u)
	if [ -z "$RK_SESSION" ]; then
		INITIAL_SESSION=1
		env > "$INITIAL_ENV"
	fi

	export LC_ALL=C

	export SCRIPTS_DIR="$(dirname "$(realpath "$BASH_SOURCE")")"
	export COMMON_DIR="$(realpath "$SCRIPTS_DIR/..")"
	export SDK_DIR="$(realpath "$COMMON_DIR/../../..")"
	export DEVICE_DIR="$SDK_DIR/device/rockchip"
	export CHIPS_DIR="$DEVICE_DIR/.chips"
	export CHIP_DIR="$DEVICE_DIR/.chip"

	export RK_DATA_DIR="$COMMON_DIR/data"
	export RK_TOOL_DIR="$COMMON_DIR/tools"
	export RK_IMAGE_DIR="$COMMON_DIR/images"
	export RK_KBUILD_DIR="$COMMON_DIR/linux-kbuild"
	export RK_CONFIG_IN="$COMMON_DIR/configs/Config.in"

	export RK_BUILD_HOOK_DIR="$COMMON_DIR/build-hooks"
	export BUILD_HELPER="$RK_BUILD_HOOK_DIR/build-helper"
	export RK_POST_HOOK_DIR="$COMMON_DIR/post-hooks"
	export POST_HELPER="$RK_POST_HOOK_DIR/post-helper"

	export PARTITION_HELPER="$SCRIPTS_DIR/partition-helper"

	export RK_SESSION="${RK_SESSION:-$(date +%F_%H-%M-%S)}"

	export RK_OUTDIR="$SDK_DIR/output"
	export RK_SESSION_DIR="$RK_OUTDIR/sessions"
	export RK_LOG_BASE_DIR="$RK_OUTDIR/log"
	export RK_LOG_DIR="$RK_SESSION_DIR/$RK_SESSION"
	export RK_INITIAL_ENV="$RK_LOG_DIR/initial.env"
	export RK_CUSTOM_ENV="$RK_LOG_DIR/custom.env"
	export RK_FINAL_ENV="$RK_LOG_DIR/final.env"
	export RK_ROCKDEV_DIR="$SDK_DIR/rockdev"
	export RK_FIRMWARE_DIR="$RK_OUTDIR/firmware"
	export RK_SECURITY_FIRMWARE_DIR="$RK_OUTDIR/security-firmware"
	export RK_CONFIG="$RK_OUTDIR/.config"
	export RK_DEFCONFIG_LINK="$RK_OUTDIR/defconfig"

	# For Makefile
	case "$@" in
		make-targets | make-usage)
			run_build_hooks "$@"
			rm -f "$INITIAL_ENV"
			exit 0 ;;
	esac

	# Prepare firmware dirs
	mkdir -p "$RK_FIRMWARE_DIR" "$RK_SECURITY_FIRMWARE_DIR"

	cd "$SDK_DIR"
	[ -f README.md ] || ln -rsf "$COMMON_DIR/README.md" .

	# TODO: Remove it in the repo manifest.xml
	rm -f envsetup.sh

	OPTIONS="${@:-allsave}"

	# Options checking
	CMDS="$(run_build_hooks support-cmds all | xargs)"
	for opt in $OPTIONS; do
		case "$opt" in
			help | h | -h | --help | usage | \?) usage ;;
			shell | cleanall)
				# Check single options
				if [ "$opt" = "$OPTIONS" ]; then
					break
				fi

				echo "ERROR: $opt cannot combine with other options!"
				;;
			post-rootfs)
				if [ "$opt" = "$1" -a -d "$2" ]; then
					# Hide other args from build stages
					OPTIONS=$opt
					break
				fi

				echo "ERROR: $opt should be the first option followed by rootfs dir!"
				;;
			*)
				# Make sure that all options are handled
				if option_check "$CMDS" $opt; then
					continue
				fi

				echo "ERROR: Unhandled option: $opt"
				;;
		esac

		usage
	done

	# Prepare log dirs
	if [ ! -d "$RK_LOG_DIR" ]; then
		rm -rf "$RK_LOG_BASE_DIR" "$RK_LOG_DIR" "$RK_SESSION_DIR/latest"
		mkdir -p "$RK_LOG_DIR"
		ln -rsf "$RK_SESSION_DIR" "$RK_LOG_BASE_DIR"
		ln -rsf "$RK_LOG_DIR" "$RK_SESSION_DIR/latest"
		echo -e "\e[33mLog saved at $RK_LOG_DIR\e[0m"
		echo
	fi

	# Drop old logs
	cd "$RK_LOG_BASE_DIR"
	rm -rf $(ls -t | sed '1,10d')
	cd "$SDK_DIR"

	# Save initial envionments
	if [ "$INITIAL_SESSION" ]; then
		rm -f "$RK_INITIAL_ENV"
		mv "$INITIAL_ENV" "$RK_INITIAL_ENV"
		ln -rsf "$RK_INITIAL_ENV" "$RK_OUTDIR/"
	fi

	# Init stage (preparing SDK configs, etc.)
	run_build_hooks init $OPTIONS
	rm -f "$RK_OUTDIR/.tmpconfig*"

	# No need to go further
	CMDS="$(run_build_hooks support-cmds pre-build build \
		post-build | xargs) shell cleanall post-rootfs"
	option_check "$CMDS" $OPTIONS || return 0

	# Force exporting config environments
	set -a

	# Load config environments
	source "$RK_CONFIG"
	cp "$RK_CONFIG" "$RK_LOG_DIR"

	if [ -z "$INITIAL_SESSION" ]; then
		# Inherit session environments
		sed -n 's/^\(RK_.*=\)\(.*\)/\1"\2"/p' "$RK_FINAL_ENV" > \
			"$INITIAL_ENV"
		source "$INITIAL_ENV"
		rm -f "$INITIAL_ENV"
	else
		# Detect and save custom environments

		# Find custom environments
		rm -f "$RK_CUSTOM_ENV"
		for cfg in $(grep "^RK_" "$RK_INITIAL_ENV" || true); do
			env | grep -q "^${cfg//\"/}$" || \
				echo "$cfg" >> "$RK_CUSTOM_ENV"
		done

		# Allow custom environments overriding
		if [ -e "$RK_CUSTOM_ENV" ]; then
			ln -rsf "$RK_CUSTOM_ENV" "$RK_OUTDIR/"

			echo -e "\e[31mWARN: Found custom environments: \e[0m"
			cat "$RK_CUSTOM_ENV"

			echo -e "\e[31mAssuming that is expected, please clear them if otherwise.\e[0m"
			read -t 10 -p "Press enter to continue."
			source "$RK_CUSTOM_ENV"

			if grep -q "^RK_KERNEL_VERSION=" "$RK_CUSTOM_ENV"; then
				echo -e "\e[31mCustom RK_KERNEL_VERSION ignored!\e[0m"
				load_config RK_KERNEL_VERSION
			fi

			if grep -q "^RK_ROOTFS_SYSTEM=" "$RK_CUSTOM_ENV"; then
				echo -e "\e[31mCustom RK_ROOTFS_SYSTEM ignored!\e[0m"
				load_config RK_ROOTFS_SYSTEM
			fi
		fi
	fi

	source "$PARTITION_HELPER"
	rk_partition_init

	set +a

	export PYTHON3=/usr/bin/python3

	if [ "$RK_KERNEL_CFG" ]; then
		export RK_KERNEL_TOOLCHAIN="$(get_toolchain "$RK_KERNEL_ARCH")"

		CPUS=$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1)
		export KMAKE="make -C "$SDK_DIR/kernel/" -j$(( $CPUS + 1 )) \
			CROSS_COMPILE=$RK_KERNEL_TOOLCHAIN ARCH=$RK_KERNEL_ARCH"

		export RK_KERNEL_VERSION_REAL=$(kernel_version_real)
	fi

	# Handle special commands
	case "$OPTIONS" in
		shell)
			echo -e "\e[35mDoing this is dangerous and for developing only.\e[0m"
			# No error handling in develop shell.
			set +e; trap ERR
			/bin/bash
			echo -e "\e[35mExit from $BASH_SOURCE shell.\e[0m"
			exit 0 ;;
		cleanall)
			run_build_hooks clean
			rm -rf "$RK_OUTDIR" "$SDK_DIR/rockdev"
			finish_build cleanall
			exit 0 ;;
		post-rootfs)
			shift
			run_post_hooks $@
			finish_build post-rootfs
			exit 0 ;;
	esac

	# Save final environments
	rm -f "$RK_FINAL_ENV"
	env > "$RK_FINAL_ENV"
	ln -rsf "$RK_FINAL_ENV" "$RK_OUTDIR/"

	# Log configs
	echo
	echo "=========================================="
	echo "          Final configs"
	echo "=========================================="
	env | grep -E "^RK_.*=.+" | grep -vE "PARTITION_[0-9]" | \
		grep -vE "=\"\"$|_DEFAULT=y" | \
		grep -vE "^RK_CONFIG|_BASE_CFG=|_LINK=|DIR=|_ENV=|_NAME=" | sort
	echo

	# Pre-build stage (submodule configuring, etc.)
	run_build_hooks pre-build $OPTIONS

	# No need to go further
	CMDS="$(run_build_hooks support-cmds build post-build | xargs)"
	option_check "$CMDS" $OPTIONS || return 0

	# Build stage (building, etc.)
	run_build_hooks build $OPTIONS

	# No need to go further
	CMDS="$(run_build_hooks support-cmds post-build | xargs)"
	option_check "$CMDS" $OPTIONS || return 0

	# Post-build stage (firmware packing, etc.)
	run_build_hooks post-build $OPTIONS
}

if [ "$0" != "$BASH_SOURCE" ]; then
	# Sourced, executing it directly
	"$BASH_SOURCE" ${@:-shell}
elif [ "$0" == "$BASH_SOURCE" ]; then
	# Executed directly
	main $@
fi

流程

  1. 设置导出环境变量

  2. make-targets | make-usage 参数的执行分支

  3. 创建输出目录,软连接redme等

  4. 获取支持的命令

    1. CMDS="$(run_build_hooks support-cmds all | xargs)"
      通过调用run_build_hooks 并传入参数support-cmds all 最后输出通过xargs处理,赋值给CMDS
      这个字符串包含了所有支持的命令或选项。
      
  5. 遍历选项

    1. help | h | -h | --help | usage 等调用 usage 输出帮助
    2. shell | cleanall:如果选项是shellcleanall,则执行一段检查代码,确保这些选项不是与其他选项组合使用的。如果是单独使用(即$opt等于$OPTIONS),则跳出循环;否则,显示错误信息。
    3. post-rootfs:如果选项是post-rootfs,则检查它是否是第一个选项,并且后面跟着一个目录参数。如果是,将OPTIONS设置为post-rootfs并跳出循环;否则,显示错误信息。
    4. *:对于所有其他选项,使用option_check函数检查它们是否在$CMDS中定义的支持命令列表中。如果是,则继续循环;否则,显示错误信息。
  6. 日志相关

  7. 初始化

  8. 加载配置环境变量等

  9. 设置环境变量,处理特殊命令等

  10. 输出显示最终配置信息

  11. 开始构建,最终进入run_build_hooks 传入参数 build debian

    1. 在这里插入图片描述
  12. run_build_hooks 函数

    1. 匹配分支 init | pre-build | make-* | usage | support-cmds
    2. 日志记录
    3. 调用 run_hooks device/rockchip/common/build-hook debian
  13. run_hooks

    1. 调用device/rockchip/common/build-hook 下面的sh文件

30-rootfs.sh

源码

build_debian()
{
	check_config RK_DEBIAN_VERSION || return 0

	ROOTFS_DIR="${1:-$RK_OUTDIR/debian}"
	ARCH=${RK_DEBIAN_ARCH:-armhf}

	"$SCRIPTS_DIR/check-debian.sh"

	echo "=========================================="
	echo "          Start building $RK_DEBIAN_VERSION($ARCH)"
	echo "=========================================="

	cd debian
	if [ ! -f linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz ]; then
		RELEASE=$RK_DEBIAN_VERSION TARGET=desktop ARCH=$ARCH \
			./mk-base-debian.sh
		ln -sf linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz \
			linaro-$RK_DEBIAN_VERSION-$ARCH.tar.gz
	fi

	VERSION=debug ARCH=$ARCH ./mk-xwrootfs-$RK_DEBIAN_VERSION.sh
	. mk-xwsysroot.sh
	./mk-image.sh

	ln -rsf "$PWD/linaro-rootfs.img" $ROOTFS_DIR/rootfs.ext4

	finish_build build_debian $@
}
build_hook()
{
	check_config RK_ROOTFS_TYPE || return 0

	if [ -z "$1" -o "$1" = rootfs ]; then
		ROOTFS=${RK_ROOTFS_SYSTEM:-buildroot}
	else
		ROOTFS=$1
	fi

	ROOTFS_IMG=rootfs.${RK_ROOTFS_TYPE}
	ROOTFS_DIR="$RK_OUTDIR/rootfs"

	echo "=========================================="
	echo "          Start building rootfs($ROOTFS)"
	echo "=========================================="

	rm -rf "$ROOTFS_DIR"
	mkdir -p "$ROOTFS_DIR"

	case "$ROOTFS" in
		yocto) build_yocto "$ROOTFS_DIR" ;;
		debian) build_debian "$ROOTFS_DIR" ;;
		buildroot) build_buildroot "$ROOTFS_DIR" ;;
		*) usage ;;
	esac

	if [ ! -f "$ROOTFS_DIR/$ROOTFS_IMG" ]; then
		echo "There's no $ROOTFS_IMG generated..."
		exit 1
	fi

	if [ "$RK_ROOTFS_INITRD" ]; then
		/usr/bin/time -f "you take %E to pack initrd image" \
			"$SCRIPTS_DIR/mk-ramdisk.sh" "$ROOTFS_DIR/$ROOTFS_IMG" \
			"$ROOTFS_DIR/boot.img" "$RK_BOOT_FIT_ITS"
		ln -rsf "$ROOTFS_DIR/boot.img" "$RK_FIRMWARE_DIR/boot.img"
	else
		ln -rsf "$ROOTFS_DIR/$ROOTFS_IMG" "$RK_FIRMWARE_DIR/rootfs.img"
	fi

	finish_build build_rootfs $@
}

流程

  1. build_hook()
    1. 进入分支build_debian
  2. build_debian
    1. 执行
    2. mk-rootfs-bullseys.sh
    3. mk-xwsysroot.sh
    4. mk-image.sh.

mk-rootfs-bullseys.sh

源码

#!/bin/bash -e

# Directory contains the target rootfs
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

echo -e "\033[36m Building for $VERSION \033[0m"

if [ ! -e linaro-bullseye-alip-*.tar.gz ]; then
	echo "\033[36m Run mk-base-debian.sh first \033[0m"
	exit -1
fi

# 卸载挂载的目录,binary/dev
finish() {
	sudo umount $TARGET_ROOTFS_DIR/dev
	exit -1
}
# 错误处理
trap finish ERR

echo -e "\033[36m Extract image \033[0m"
sudo tar -xpf linaro-bullseye-alip-*.tar.gz

# packages folder  devmem2直接物理内存读写工具等
sudo mkdir -p $TARGET_ROOTFS_DIR/packages
sudo cp -rpf packages/$ARCH/* $TARGET_ROOTFS_DIR/packages
sudo cp -f packages/arm64/devmem2/devmem2 $TARGET_ROOTFS_DIR/usr/bin/

# overlay folder wqy-zenhei.ttf特定的字体文件
sudo cp -rpf overlay/* $TARGET_ROOTFS_DIR/
sudo cp -f overlay/usr/share/wqy-zenhei.ttf $TARGET_ROOTFS_DIR/usr/share/fonts/

# overlay-firmware folder 存放设备固件bin lib share,不能删除去掉
sudo cp -rpf overlay-firmware/* $TARGET_ROOTFS_DIR/

# overlay-debug folder
# adb, video, camera  test file 如 adb(Android Debug Bridge)、视频和相机测试文件等,可以删除
if [ "$VERSION" == "debug" ]; then
	sudo cp -rpf overlay-debug/* $TARGET_ROOTFS_DIR/
fi

# bt/wifi firmware 用于存放蓝牙和WiFi固件, 下面cp可以删除
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/

#这行代码将在终端中打印青色的 "Change root....................." 文本。
echo -e "\033[36m Change root.....................\033[0m"
#QEMU 用户模式模拟器
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
# DNS 解析器配置
sudo cp -f /etc/resolv.conf $TARGET_ROOTFS_DIR/etc/

#这行代码使用 sudo mount -o bind 命令将主机的 /dev 目录绑定挂载到 $TARGET_ROOTFS_DIR/dev。
#绑定挂载是一种特殊的挂载类型,它允许你将一个已存在的目录树挂载到另一个位置,而不需要复制文件。这对于在 chroot 环境中运行程序时访问设备文件非常有用
sudo mount -o bind /dev $TARGET_ROOTFS_DIR/dev

#获取目录所有者用户ID
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
# 设置 /home 目录下各用户的主目录所有权
for u in \$(ls /home/); do
	chown -h -R \$u:\$u /home/\$u
done

# 更新软件包列表并升级已安装的软件包
echo "deb http://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib non-free" >> /etc/apt/sources.list
echo "deb-src http://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib non-free" >> /etc/apt/sources.list

apt-get update
apt-get upgrade -y

apt-get install xinput-calibrator microcom xinput rt-tests iperf3 stress lmbench udhcpc udhcpd fio hostapd nfs-common tftp-hpa gdb gdbserver fbset ca-certificates curl gnupg lsb-release mosquitto mosquitto-clients dos2unix binutils libmosquitto-dev sqlite3 telnet vsftpd mtd-utils -y

apt-get install docker.io -y

ln -sf /usr/lib/lmbench/bin/bw_mem /usr/bin/bw_mem
ln -sf /usr/lib/lmbench/bin/stream /usr/bin/stream
ln -sf /usr/lib/lmbench/bin/msleep /usr/bin/msleep

apt-get install python3-dev python3-pip python3-libevdev -y
ln -s /usr/bin/python3 /usr/bin/python
pip3 install evdev

apt-get install  libxkbcommon-x11-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-shape0-dev libxcb-sync0-dev libxcb-xfixes0-dev libxcb-xinerama0-dev libssl-dev libsqlite3-dev -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"

# enter root username without password
sed -i "s~\(^ExecStart=.*\)~# \1\nExecStart=-/bin/sh -c '/bin/bash -l </dev/%I >/dev/%I 2>\&1'~" /usr/lib/systemd/system/serial-getty@.service

#---------------power management --------------
\${APT_INSTALL} pm-utils triggerhappy bsdmainutils
cp /etc/Powermanager/triggerhappy.service  /lib/systemd/system/triggerhappy.service

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

echo -e "\033[36m Setup Video.................... \033[0m"
\${APT_INSTALL} gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-ugly 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
\${APT_INSTALL} /packages/gst-plugins-ugly1.0/*.deb
\${APT_INSTALL} /packages/gst-libav1.0/*.deb

#---------Camera---------
echo -e "\033[36m Install camera.................... \033[0m"
\${APT_INSTALL} cheese v4l-utils
\${APT_INSTALL} /packages/libv4l/*.deb
\${APT_INSTALL} /packages/cheese/*.deb

#---------Xserver---------
echo -e "\033[36m Install Xserver.................... \033[0m"
\${APT_INSTALL} /packages/xserver/*.deb

apt-mark hold xserver-common xserver-xorg-core xserver-xorg-legacy

#---------------Openbox--------------
echo -e "\033[36m Install openbox.................... \033[0m"
\${APT_INSTALL} /packages/openbox/*.deb

#---------update chromium-----
\${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

#------------------blueman------------
echo -e "\033[36m Install blueman.................... \033[0m"
\${APT_INSTALL} blueman
echo exit 101 > /usr/sbin/policy-rc.d
chmod +x /usr/sbin/policy-rc.d
\${APT_INSTALL} blueman
rm -f /usr/sbin/policy-rc.d

#------------------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} /packages/glmark2/*.deb
fi

if [ -e "/usr/lib/aarch64-linux-gnu" ] ;
then
#------------------rknpu2------------
echo -e "\033[36m move rknpu2.................... \033[0m"
mv /packages/rknpu2/*.tar  /
fi

#------------------rktoolkit------------
echo -e "\033[36m Install rktoolkit.................... \033[0m"
\${APT_INSTALL} /packages/rktoolkit/*.deb

echo -e "\033[36m Install Chinese fonts.................... \033[0m"
# 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

# Export env vars
echo "export LANG=C.UTF-8" >> ~/.bashrc

source ~/.bashrc

\${APT_INSTALL} ttf-wqy-zenhei fonts-aenigma
\${APT_INSTALL} xfonts-intl-chinese

# HACK debian11.3 to fix bug
\${APT_INSTALL} fontconfig --reinstall

#\${APT_INSTALL} xfce4
#ln -sf /usr/bin/startxfce4 /etc/alternatives/x-session-manager

# HACK to disable the kernel logo on bootup 禁用启动时的内核logo
#sed -i "/exit 0/i \ echo 3 > /sys/class/graphics/fb0/blank" /etc/rc.local

cp /packages/libmali/libmali-*-x11*.deb /
cp -rf /packages/rkisp/*.deb /
cp -rf /packages/rkaiq/*.deb /
cp -rf /usr/lib/firmware/rockchip/ /

# reduce 500M size for rootfs
rm -rf /usr/lib/firmware
mkdir -p /usr/lib/firmware/
mv /rockchip /usr/lib/firmware/

# mark package to hold  锁定已安装的软件包,以防止它们被自动更新
apt list --installed | grep -v oldstable | cut -d/ -f1 | xargs apt-mark hold

#---------------Custom Script-------------- 禁用自启动的一些服务,wifi等
systemctl mask systemd-networkd-wait-online.service
systemctl mask NetworkManager-wait-online.service
rm /lib/systemd/system/wpa_supplicant@.service

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

#---------------Clean--------------
if [ -e "/usr/lib/arm-linux-gnueabihf/dri" ] ;
then
        # Only preload libdrm-cursor for X
        sed -i "1aexport LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libdrm-cursor.so.1" /usr/bin/X
        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
        # Only preload libdrm-cursor for X
        sed -i "1aexport LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libdrm-cursor.so.1" /usr/bin/X
        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 -

rm -rf /var/lib/apt/lists/*
rm -rf /var/cache/
rm -rf /packages/

# Remove usb network card rules
rm /usr/lib/systemd/network/73-usb-net-by-mac.link


EOF

# let root user can autologin and enter the ~ directory
sudo sed -i 's|ExecStart=-/bin/sh -c '\''/bin/bash -l </dev/%I >/dev/%I 2>&1'\''|ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM|' $TARGET_ROOTFS_DIR/lib/systemd/system/serial-getty@.service

sudo umount $TARGET_ROOTFS_DIR/dev

流程

  1. 进行文件系统构建,安装库,等

mk-sysroot.sh

源码

#!/bin/bash -e

TARGET_ARM_DIR="./sysroots/armv8a-linux"
TARGET_x86_DIR="./sysroots/x86_64-linux"

LOCAL_PATH=$(pwd)
SDK_PATH_=$(dirname "$PWD")

export DEBIAN_PATH=$LOCAL_PATH

if [ -d "sysroots" ]; then
  sudo rm -r sysroots
fi

# Create sysroot
echo "----------copy binary-----------"
sudo mkdir -p sysroots
sudo mkdir -p $TARGET_ARM_DIR
sudo mkdir -p $TARGET_x86_DIR
sudo mkdir -p $TARGET_x86_DIR/environment-setup.d

sudo cp -r ./binary/usr/lib $TARGET_ARM_DIR
sudo cp -r ./binary/{boot,etc,opt,proc,run,srv,sys,tmp,usr,var} $TARGET_ARM_DIR

# Copy toolchain lib
TOOLCHAIN_PATH=../extra-tools/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu
sudo mkdir -p $TARGET_ARM_DIR/usr/lib64
sudo mkdir -p $TARGET_ARM_DIR/lib64
sudo cp $TOOLCHAIN_PATH/aarch64-linux-gnu/lib64/* $TARGET_ARM_DIR/usr/lib64 -r
sudo cp $TOOLCHAIN_PATH/aarch64-linux-gnu/lib64/* $TARGET_ARM_DIR/lib64 -r
sudo cp $TOOLCHAIN_PATH/aarch64-linux-gnu/libc/lib/libm.so.6 $TOOLCHAIN_PATH/aarch64-linux-gnu/libc/lib/libc.so.6 $TARGET_ARM_DIR/lib64

# Create environment
# Used to set environment variables
sudo touch $LOCAL_PATH/sysroots/environment

ENV_PATH=$LOCAL_PATH/sysroots/environment

echo "export _SDK_PATH=$SDK_PATH_" | sudo tee -a $ENV_PATH
echo 'export PATH=$_SDK_PATH/extra-tools/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin:$PATH' | sudo tee -a $ENV_PATH
echo 'export CC=aarch64-linux-gnu-gcc' | sudo tee -a $ENV_PATH
echo 'export CXX=aarch64-linux-gnu-g++' | sudo tee -a $ENV_PATH
echo 'export AR=aarch64-linux-gnu-ar' | sudo tee -a $ENV_PATH
echo 'export OBJCOPY=aarch64-linux-gnu-objcopy' | sudo tee -a $ENV_PATH
echo 'export NM=aarch64-linux-gnu-nm' | sudo tee -a $ENV_PATH
echo 'export STRIP=aarch64-linux-gnu-strip' | sudo tee -a $ENV_PATH
echo 'if [ -d "$_SDK_PATH/debian/sysroots/x86_64-linux/environment-setup.d" ]; then
    for envfile in $_SDK_PATH/debian/sysroots/x86_64-linux/environment-setup.d/*.sh; do
        . $envfile
    done
fi' | sudo tee -a $ENV_PATH


sudo touch $TARGET_x86_DIR/environment-setup.d/qt5.sh

QT5_PATH="$TARGET_x86_DIR/environment-setup.d/qt5.sh"
echo 'export SDK_QMAKE_CC="$CC"' | sudo tee -a $QT5_PATH
echo 'export SDK_QMAKE_CXX="$CXX"' | sudo tee -a $QT5_PATH
echo 'export SDK_QMAKE_LINK="$CXX"' | sudo tee -a $QT5_PATH
echo 'export SDK_QMAKE_AR="$AR"' | sudo tee -a $QT5_PATH
echo 'export SDK_QMAKE_STRIP="$STRIP"' | sudo tee -a $QT5_PATH
echo 'export SDK_QMAKE_OBJCOPY="$OBJCOPY"' | sudo tee -a $QT5_PATH

source ./sysroots/environment

# Establish library soft link
sudo rm ./sysroots/armv8a-linux/lib/aarch64-linux-gnu/libpthread.a
sudo rm ./sysroots/armv8a-linux/lib/aarch64-linux-gnu/libdl.a
cd ./sysroots/armv8a-linux/usr/lib/aarch64-linux-gnu/
sudo ln -sf ../../lib/aarch64-linux-gnu/libz.so.1.2.11 libz.so
sudo ln -sf libsystemd.so.0 libsystemd.so
sudo ln -sf ../../lib/aarch64-linux-gnu/liblzma.so.5.2.5 liblzma.so
sudo ln -sf libgcrypt.so.20 libgcrypt.so
sudo ln -sf libgpg-error.so.0 libgpg-error.so
sudo ln -sf libstdc++.so.6 libstdc++.so
sudo ln -sf libbsd.so.0 libbsd.so
sudo ln -sf libmd.so.0 libmd.so
sudo rm libdl.so
sudo ln -sf libdl.so.2 libdl.so
sudo rm libm.so
sudo ln -sf libm.so.6 libm.so
sudo ln -sf libxcb-util.so.1 libxcb-util.so
sudo rm libpcre.so
sudo ln -sf libpcre.so.3 libpcre.so
sudo rm libpthread.a
sudo rm libpthread.so
sudo ln -sf libpthread.so.0 libpthread.so
cd -

echo "----------copy binary success-----------"

# Compile Qt
#cd ./packages/arm64/qt5
#source qt-build.sh

#sudo mkdir -p $(pwd)/binary/usr/lib/qt-5.15.8
#QT5_LIB=$(pwd)/binary/usr/lib/qt-5.15.8

#sudo cp $TARGET_x86_DIR/lib $QT5_LIB -r
#sudo cp $TARGET_x86_DIR/plugins $QT5_LIB -r
#sudo mkdir -p $TARGET_ARM_DIR/usr/lib/qt-5.15.8
#sudo cp $TARGET_x86_DIR/lib $TARGET_ARM_DIR/usr/lib/qt-5.15.8 -r
#sudo cp $TARGET_x86_DIR/include $TARGET_ARM_DIR/usr/lib/qt-5.15.8 -r
#sudo cp $TARGET_x86_DIR/bin $TARGET_ARM_DIR/usr/lib/qt-5.15.8 -r
#sudo cp $TARGET_x86_DIR/mkspecs $TARGET_ARM_DIR/usr/lib/qt-5.15.8 -r
##sudo cp $TARGET_x86_DIR/plugins $TARGET_ARM_DIR/usr/lib/qt-5.15.8 -r

# Set Qt environment variables
#QT5SH_PATH=$LOCAL_PATH/binary/etc/profile.d/qt5.15.8.sh

#sudo touch $QT5SH_PATH
#echo "export QT_ROOT=/usr/lib/qt-5.15.8" | sudo tee -a $QT5SH_PATH
#echo "export QT_QPA_FONTDIR=/usr/share/fonts" | sudo tee -a $QT5SH_PATH
#echo 'export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins' | sudo tee -a $QT5SH_PATH
#echo 'export QT_PLUGIN_PATH=$QT_ROOT/plugins' | sudo tee -a $QT5SH_PATH
#echo 'export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms' | sudo tee -a $QT5SH_PATH

流程

  1. cp 跟文件系统的库,制作交叉编译环境
  2. 制作交叉编译,配置文件
  3. 配置,编译qt,并cp到跟文件系统

mk-image.sh

源码

#!/bin/bash -e

TARGET_ROOTFS_DIR=./binary
ROOTFSIMAGE=linaro-rootfs.img
EXTRA_SIZE_MB=300
IMAGE_SIZE_MB=$(( $(sudo du -sh -m ${TARGET_ROOTFS_DIR} | cut -f1) + ${EXTRA_SIZE_MB} ))


echo Making rootfs!

if [ -e ${ROOTFSIMAGE} ]; then
	rm ${ROOTFSIMAGE}
fi

for script in ./post-build.sh ../device/rockchip/common/post-build.sh; do
	[ -x $script ] || continue
	sudo $script "$(realpath "$TARGET_ROOTFS_DIR")"
done

dd if=/dev/zero of=${ROOTFSIMAGE} bs=1M count=0 seek=${IMAGE_SIZE_MB}

sudo mkfs.ext4 -d ${TARGET_ROOTFS_DIR} ${ROOTFSIMAGE}

echo Rootfs Image: ${ROOTFSIMAGE}

流程

  1. 运行2个 post-build.sh
  2. 制作打包跟文件系统

post-build.sh

后续的配置信息

  1. 文件系统的挂载信息修改添加
  2. 执行 device/rockchip/common/post-hooks 下的sh,启动一些服务?
    1. 02-usb.sh
    2. 05-udev.sh
    3. 06-async-commit.sh
    4. 10-os-release.sh
    5. 20-info.sh
    6. 30-fstab.sh
    7. 40-busybox-reboot.sh
    8. 50-locale.sh
    9. 60-dirs.sh
    10. 90-overlay.sh
    11. 95-partitions.sh
    12. 99-owner.sh

大致流程

  1. 编译安装必要库drm,npu等
    1. 进入文件系统,然后gtp命令安装
  2. 然后cp ln等,qt编译安装
  3. 文件系统制作

系统制作步骤

  1. 解压 debian,原始根文件系统

    sudo tar -xpf linaro-bullseye-alip-20240903-1.tar.gz 
    
  2. 获取文件系统大小,然后+300

    sudo du -sh -m ./binary | cut -f1
    
  3. 创建文件

    dd if=/dev/zero of=linaro-rootfsxw.img bs=1M count=0 seek=2385
    
  4. 写入内容并格式化ext4

    sudo mkfs.ext4 -d ./binary linaro-rootfsxw.img 
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947997.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全之高防IP的实时监控精准防护

高防IP是一种网络安全设备&#xff0c;用于保护网络服务不受到各类攻击的影响&#xff0c;确保业务的持续稳定运行。它通过监控、识别和封锁恶意攻击流量&#xff0c;提供高级别的防护&#xff0c;降低业务被攻击的风险&#xff0c;并提升网络的稳定性和可靠性。 一、实时监控的…

aardio —— 虚表 —— 使用ownerDrawCustom列类型制作喜马拉雅播放器列表

不会自绘也能做漂亮列表&#xff0c;你相信吗&#xff1f; 看看这个例子&#xff0c;虚表_vlistEx_ColType_OwnerDrawCustom列类型&#xff0c;移植自godking.customPlus&#xff0c;简单好用&#xff0c;做漂亮列表的大杀器&#xff0c;玩aardio必备利器&#xff01; 请更新…

JavaScript的数据类型及检测方式

目录 一、JS数据类型 1.基本数据类型 2.引用数据类型 二、堆和栈 三、数据类型检测 1.typeof 2.instanceof 3.constructor 4.Object.prototype.toString.call() JavaScript 中的数据类型主要分为两大类&#xff1a;原始数据类型(也称基本数据类型)和引用数据类型。 一…

高阶数据结构----布隆过滤器和位图

&#xff08;一&#xff09;位图 位图是用来存放某种状态的&#xff0c;因为一个bit上只能存0和1所以一般只有两种状态的情况下适合用位图&#xff0c;所以非常适合判断数据在或者不在&#xff0c;而且位图十分节省空间&#xff0c;很适合于海量数据&#xff0c;且容易存储&…

Leetcode 最大正方形

java 实现 class Solution {public int maximalSquare(char[][] matrix) {//处理特殊情况if(matrix null || matrix.length 0 || matrix[0].length 0) return 0;int rows matrix.length;int cols matrix[0].length;int[][] dp new int[rows][cols]; //dp[i][j]的含义是以…

Redis--缓存穿透、击穿、雪崩以及预热问题(面试高频问题!)

缓存穿透、击穿、雪崩以及预热问题 如何解决缓存穿透&#xff1f;方案一&#xff1a;缓存空对象方案二&#xff1a;布隆过滤器什么是布隆过滤器&#xff1f;优缺点 方案三&#xff1a;接口限流 如何解决缓存击穿问题&#xff1f;方案一&#xff1a;分布式锁方案一改进成双重判定…

嵌入式 Linux LED 驱动开发实验

一、Linux 下 LED 灯驱动原理 a)地址映射 在编写驱动之前,我们需要先简单了解一下 MMU 这个神器, MMU 全称叫做 Memory Manage Unit,也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU,但是现在 Linux 内核已经支持无 MMU 的处理器了。 MMU 主要完成的功能如…

网络安全:交换机技术

单播&#xff0c;组播广播 单播(unicast): 是指封包在计算机网络的传输中&#xff0c;目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛&#xff0c;通常所使用的网络协议或服务大多采用单播传输&#xff0c;例如一切基于TCP的协议。组播(multicast): 也叫多播&am…

C# 在PDF中添加和删除水印注释 (Watermark Annotation)

目录 使用工具 C# 在PDF文档中添加水印注释 C# 在PDF文档中删除水印注释 PDF中的水印注释是一种独特的注释类型&#xff0c;它通常以透明的文本或图片形式叠加在页面内容之上&#xff0c;为文档添加标识或信息提示。与传统的静态水印不同&#xff0c;水印注释并不会永久嵌入…

fpga系列 HDL:verilog 常见错误与注意事项 位宽不匹配+case 语句中没有覆盖所有情况

位宽不匹配问题 信号或操作数的位宽不匹配&#xff0c;可能导致仿真或综合错误。 module top (input wire [3:0] a,output wire [7:0] b );assign b a; endmodulecase 语句中没有覆盖所有情况 module top (input wire [1:0] sel,input wire [7:0] a,input wire [7:0] b,in…

groupby 操作的不同参数

groupby 是数据分析中一个非常强大的操作&#xff0c;可以根据指定的规则将数据拆分成多个组&#xff0c;并对每个组进行聚合、转换或过滤等操作。我们逐个解释这些参数的作用&#xff0c;并通过数值举例进行说明。 参数解释 by&#xff1a;分组依据 by 参数指定了分组的依据&…

鸢尾花种类预测--数据集介绍

1.6 案例&#xff1a;鸢尾花种类预测--数据集介绍 学习目标 目标 知道sklearn中获取数据集的方法知道sklearn中对数据集的划分方法 本实验介绍了使用Python进行机器学习的一些基本概念。 在本案例中&#xff0c;将使用K-Nearest Neighbor&#xff08;KNN&#xff09;算法对鸢尾…

基于深度学习的视觉检测小项目(二) 环境和框架搭建

一、环境和框架要求 SAM的环境要求&#xff1a; Python>3.7 PyTorch>1.7 torchvision>0.8 YOLO V8的环境要求&#xff1a;YOLO集成在ultralytics库中&#xff0c;ultralytics库的环境要求&#xff1a; Python>3.7 PyTorch>1.10.0 1、确定pytorch版本…

Javascript算法——回溯算法(组合问题)

相关资料来自《代码随想录》&#xff0c;版权归原作者所有&#xff0c;只是学习记录 回溯 回溯模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点…

Java Excel转PDF POI+Itext5

由于现在存在需求&#xff0c;通过Java将数据文本生成特点格式Excel&#xff0c;再输出为PDF。 调研了一些方案&#xff0c;最终决定使用POI写入Excel,再使用Itext5生成PDF。 在网上找了一些Itext的转换工具类&#xff0c;进行了一些改动。 目前市面上 Excel 转 PDF 的组件…

linux nginx maccms管理后台无法进入页面不存在和验证码不显示的问题

windows中运行maccms非常顺利&#xff0c;轻松搭建了。并一切正常。而我在linux中搭建缺遇到了一个非常奇怪的问题。进入管理后台&#xff0c;明明"admin.php"(比如重命名成a.php)的页面是存在的&#xff0c;访问时缺提示页面不存在&#xff01;稍后就自动跳到首页了…

C# 服务调用RFC函数获取物料信息,并输出生成Excel文件

这个例子是C#服务调用RFC函数&#xff0c;获取物料的信息&#xff0c;并生成Excel文件 上接文章&#xff1a;C#服务 文章目录 创建函数创建结构编写源代码创建批处理文件运行结果-成功部署服务器C#代码配置文件注意&#xff01;&#xff01; 创建函数 创建结构 编写源代码 创建…

在 SQL 中,区分 聚合列 和 非聚合列(nonaggregated column)

文章目录 1. 什么是聚合列&#xff1f;2. 什么是非聚合列&#xff1f;3. 在 GROUP BY 查询中的非聚合列问题示例解决方案 4. 为什么 only_full_group_by 要求非聚合列出现在 GROUP BY 中&#xff1f;5. 如何判断一个列是聚合列还是非聚合列&#xff1f;6. 总结 在 SQL 中&#…

Postman测试big-event

报错500。看弹幕&#xff0c;知道可能是yml或sql有问题。 所以检查idea工作台&#xff0c; 直接找UserMapper检查&#xff0c;发现完全OK。 顺着这个error发现可能是sql有问题。因为提示是sql问题&#xff0c;而且是有now()的那个sql。 之后通过给的课件&#xff0c;复制课件…

SpringBoot 2.6 集成es 7.17

引言 在现代应用开发中&#xff0c;Elasticsearch作为一个强大的搜索引擎和分析引擎&#xff0c;已经成为许多项目不可或缺的一部分。Spring Boot作为Java生态中最受欢迎的微服务框架之一&#xff0c;其对Elasticsearch的支持自然也是开发者关注的焦点。本文将详细介绍如何在S…