创龙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"shiftfor dir in "$CHIP_DIR/$(basename "$DIR")/" "$DIR"; do[ -d "$dir" ] || continuefor hook in $(find "$dir" -maxdepth 1 -name "*.sh" | sort); do"$hook" $@ && continueHOOK_RET=$?err_handler $HOOK_RET "${FUNCNAME[0]} $*" "$hook $*"exit $HOOK_RETdonedone
}run_build_hooks()
{# Don't log these hookscase "$1" ininit | pre-build | make-* | usage | support-cmds)run_hooks "$RK_BUILD_HOOK_DIR" $@ || truereturn 0;;esacLOG_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 ]; thenerr_handler $HOOK_RET "${FUNCNAME[0]} $*" "$@"exit $HOOK_RETfi
}main()
{[ -z "$DEBUG" ] || set -xtrap 'err_handler' ERRset -eE# Save intial envionmentsunset INITIAL_SESSIONINITIAL_ENV=$(mktemp -u)if [ -z "$RK_SESSION" ]; thenINITIAL_SESSION=1env > "$INITIAL_ENV"fiexport LC_ALL=Cexport 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 Makefilecase "$@" inmake-targets | make-usage)run_build_hooks "$@"rm -f "$INITIAL_ENV"exit 0 ;;esac# Prepare firmware dirsmkdir -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.xmlrm -f envsetup.shOPTIONS="${@:-allsave}"# Options checkingCMDS="$(run_build_hooks support-cmds all | xargs)"for opt in $OPTIONS; docase "$opt" inhelp | h | -h | --help | usage | \?) usage ;;shell | cleanall)# Check single optionsif [ "$opt" = "$OPTIONS" ]; thenbreakfiecho "ERROR: $opt cannot combine with other options!";;post-rootfs)if [ "$opt" = "$1" -a -d "$2" ]; then# Hide other args from build stagesOPTIONS=$optbreakfiecho "ERROR: $opt should be the first option followed by rootfs dir!";;*)# Make sure that all options are handledif option_check "$CMDS" $opt; thencontinuefiecho "ERROR: Unhandled option: $opt";;esacusagedone# Prepare log dirsif [ ! -d "$RK_LOG_DIR" ]; thenrm -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"echofi# Drop old logscd "$RK_LOG_BASE_DIR"rm -rf $(ls -t | sed '1,10d')cd "$SDK_DIR"# Save initial envionmentsif [ "$INITIAL_SESSION" ]; thenrm -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 $OPTIONSrm -f "$RK_OUTDIR/.tmpconfig*"# No need to go furtherCMDS="$(run_build_hooks support-cmds pre-build build \post-build | xargs) shell cleanall post-rootfs"option_check "$CMDS" $OPTIONS || return 0# Force exporting config environmentsset -a# Load config environmentssource "$RK_CONFIG"cp "$RK_CONFIG" "$RK_LOG_DIR"if [ -z "$INITIAL_SESSION" ]; then# Inherit session environmentssed -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 environmentsrm -f "$RK_CUSTOM_ENV"for cfg in $(grep "^RK_" "$RK_INITIAL_ENV" || true); doenv | grep -q "^${cfg//\"/}$" || \echo "$cfg" >> "$RK_CUSTOM_ENV"done# Allow custom environments overridingif [ -e "$RK_CUSTOM_ENV" ]; thenln -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"; thenecho -e "\e[31mCustom RK_KERNEL_VERSION ignored!\e[0m"load_config RK_KERNEL_VERSIONfiif grep -q "^RK_ROOTFS_SYSTEM=" "$RK_CUSTOM_ENV"; thenecho -e "\e[31mCustom RK_ROOTFS_SYSTEM ignored!\e[0m"load_config RK_ROOTFS_SYSTEMfififisource "$PARTITION_HELPER"rk_partition_initset +aexport PYTHON3=/usr/bin/python3if [ "$RK_KERNEL_CFG" ]; thenexport 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 commandscase "$OPTIONS" inshell)echo -e "\e[35mDoing this is dangerous and for developing only.\e[0m"# No error handling in develop shell.set +e; trap ERR/bin/bashecho -e "\e[35mExit from $BASH_SOURCE shell.\e[0m"exit 0 ;;cleanall)run_build_hooks cleanrm -rf "$RK_OUTDIR" "$SDK_DIR/rockdev"finish_build cleanallexit 0 ;;post-rootfs)shiftrun_post_hooks $@finish_build post-rootfsexit 0 ;;esac# Save final environmentsrm -f "$RK_FINAL_ENV"env > "$RK_FINAL_ENV"ln -rsf "$RK_FINAL_ENV" "$RK_OUTDIR/"# Log configsechoecho "=========================================="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=" | sortecho# Pre-build stage (submodule configuring, etc.)run_build_hooks pre-build $OPTIONS# No need to go furtherCMDS="$(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 furtherCMDS="$(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 directlymain $@
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 0ROOTFS_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 debianif [ ! -f linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz ]; thenRELEASE=$RK_DEBIAN_VERSION TARGET=desktop ARCH=$ARCH \./mk-base-debian.shln -sf linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz \linaro-$RK_DEBIAN_VERSION-$ARCH.tar.gzfiVERSION=debug ARCH=$ARCH ./mk-xwrootfs-$RK_DEBIAN_VERSION.sh. mk-xwsysroot.sh./mk-image.shln -rsf "$PWD/linaro-rootfs.img" $ROOTFS_DIR/rootfs.ext4finish_build build_debian $@
}
build_hook()
{check_config RK_ROOTFS_TYPE || return 0if [ -z "$1" -o "$1" = rootfs ]; thenROOTFS=${RK_ROOTFS_SYSTEM:-buildroot}elseROOTFS=$1fiROOTFS_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" inyocto) build_yocto "$ROOTFS_DIR" ;;debian) build_debian "$ROOTFS_DIR" ;;buildroot) build_buildroot "$ROOTFS_DIR" ;;*) usage ;;esacif [ ! -f "$ROOTFS_DIR/$ROOTFS_IMG" ]; thenecho "There's no $ROOTFS_IMG generated..."exit 1fiif [ "$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"elseln -rsf "$ROOTFS_DIR/$ROOTFS_IMG" "$RK_FIRMWARE_DIR/rootfs.img"fifinish_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}" inarm|arm32|armhf)ARCH=armhf;;*)ARCH=arm64;;
esacecho -e "\033[36m Building for $ARCH \033[0m"if [ ! $VERSION ]; thenVERSION="release"
fiecho -e "\033[36m Building for $VERSION \033[0m"if [ ! -e linaro-bullseye-alip-*.tar.gz ]; thenecho "\033[36m Run mk-base-debian.sh first \033[0m"exit -1
fi# 卸载挂载的目录,binary/dev
finish() {sudo umount $TARGET_ROOTFS_DIR/devexit -1
}
# 错误处理
trap finish ERRecho -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" ]; thensudo 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/etcsudo 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" ]; thensudo cp /usr/bin/qemu-arm-static $TARGET_ROOTFS_DIR/usr/bin/
elif [ "$ARCH" == "arm64"  ]; thensudo 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 ]; thenfind / -user $ID -exec chown -h 0:0 {} \;
fi
# 设置 /home 目录下各用户的主目录所有权
for u in \$(ls /home/); dochown -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.listapt-get update
apt-get upgrade -yapt-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 -yapt-get install docker.io -yln -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/msleepapt-get install python3-dev python3-pip python3-libevdev -y
ln -s /usr/bin/python3 /usr/bin/python
pip3 install evdevapt-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 -ychmod o+x /usr/lib/dbus-1.0/dbus-daemon-launch-helper
chmod +x /etc/rc.localexport 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/*.debecho -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/*.debapt-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
fiif [ -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/*.debecho -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" >> ~/.bashrcsource ~/.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.localcp /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 Xsed -i "1aexport LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libdrm-cursor.so.1" /usr/bin/Xcd /usr/lib/arm-linux-gnueabihf/dri/cp kms_swrast_dri.so swrast_dri.so rockchip_dri.so /rm /usr/lib/arm-linux-gnueabihf/dri/*.somv /*.so /usr/lib/arm-linux-gnueabihf/dri/
elif [ -e "/usr/lib/aarch64-linux-gnu/dri" ];
then# Only preload libdrm-cursor for Xsed -i "1aexport LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libdrm-cursor.so.1" /usr/bin/Xcd /usr/lib/aarch64-linux-gnu/dri/cp kms_swrast_dri.so swrast_dri.so rockchip_dri.so /rm /usr/lib/aarch64-linux-gnu/dri/*.somv /*.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.linkEOF# 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@.servicesudo umount $TARGET_ROOTFS_DIR/dev

流程

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

mk-sysroot.sh

源码

#!/bin/bash -eTARGET_ARM_DIR="./sysroots/armv8a-linux"
TARGET_x86_DIR="./sysroots/x86_64-linux"LOCAL_PATH=$(pwd)
SDK_PATH_=$(dirname "$PWD")export DEBIAN_PATH=$LOCAL_PATHif [ -d "sysroots" ]; thensudo 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.dsudo 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/environmentENV_PATH=$LOCAL_PATH/sysroots/environmentecho "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" ]; thenfor envfile in $_SDK_PATH/debian/sysroots/x86_64-linux/environment-setup.d/*.sh; do. $envfiledone
fi' | sudo tee -a $ENV_PATHsudo touch $TARGET_x86_DIR/environment-setup.d/qt5.shQT5_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_PATHsource ./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 -eTARGET_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} ]; thenrm ${ROOTFSIMAGE}
fifor script in ./post-build.sh ../device/rockchip/common/post-build.sh; do[ -x $script ] || continuesudo $script "$(realpath "$TARGET_ROOTFS_DIR")"
donedd 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 
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理者管理上班摸鱼

管理者管理上班摸鱼的问题,实际上涉及到员工工作态度、时间管理、团队文化等方面。以下是一些有效的管理策略: 明确期望与目标 确保每个员工了解他们的工作职责、目标以及衡量工作表现的标准。明确的期望有助于避免模糊空间,让员工知道自己的任务和责任,不容易找到摸鱼的借…

聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载

聆听音乐手机版是面向广大音乐爱好者的移动应用程序&#xff0c;用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能&#xff0c;让用户在手机上畅享更舒适的音乐体验&#xff0c;每位用户都能享受精彩纷呈的收听体验。此外&#xff0c;软件还支持无损音质音乐…

day-104 组合总和 Ⅳ

思路 动态规划 解题过程 假设dfs(target)表示组成target的组合数&#xff0c;可得转换方程dfs(target)dfs(target-nums[0])dfs(target-nums[1])…以此类推 注意&#xff1a;nums[i]需要小于等于当前的target Code class Solution {public int combinationSum4(int[] nums, i…

汽车燃油软件标定测试

油箱测试 确定油箱的参数&#xff1a; 总容积&#xff0c;额定容积&#xff0c;不可用容积等。油泵测试&#xff08;静态&#xff09; 分为加油测试&#xff0c;减油测试&#xff0c;1L或者500ml增减&#xff1b; 分别测试油泵的阻值输出&#xff0c;类似&#xff1a; 油量 阻…

MATLAB中binopdf函数用法

目录 语法 说明 示例 计算并绘制二项概率密度函数 binopdf函数的功能是计算二项概率密度函数。 语法 y binopdf(x,n,p) 说明 y binopdf(x,n,p) 使用 n 中对应的试验次数和 p 中每次试验的成功概率&#xff0c;计算 x 中每个值处的二项概率密度函数。 x、n 和 p 可以是…

linux tar 文件解压压缩

文件压缩和解压 tar -c: 建立压缩档案 -x&#xff1a;解压 -t&#xff1a;查看内容 -r&#xff1a;向压缩归档文件末尾追加文件 -u&#xff1a;更新原压缩包中的文件 -z&#xff1a;有gzip属性的 -j&#xff1a;有bz2属性的 -v&#xff1a;显示所有过程 -O&#xff1a;…

Spring Boot日志处理

文章目录 Spring Boot日志处理1. 日志存入数据库&#xff08;AOP&#xff09;2. 日志控制台打印与写入文件&#xff08;logback&#xff09; Spring Boot日志处理 1. 日志存入数据库&#xff08;AOP&#xff09; 引入aop依赖 <dependency><groupId>org.springfram…

vite6+vue3+ts+prettier+eslint9配置前端项目(后台管理系统、移动端H5项目通用配置)

很多小伙伴苦于无法搭建一个规范的前端项目&#xff0c;导致后续开发不规范&#xff0c;今天给大家带来一个基于Vite6TypeScriptVue3ESlint9Prettier的搭建教程。 目录 一、基础配置1、初始化项目2、代码质量风格的统一2.1、配置prettier2.2、配置eslint2.3、配置typescript 3、…

GitHub的简单操作

引言 今天开始就要开始做项目了&#xff0c;上午是要把git搭好。搭的过程中遇到好多好多的问题。下面就说一下git的简单操作流程。我们是使用的GitHub,下面也就以这个为例了 一、GitHub账号的登录注册 https://github.com/ 通过这个网址可以来到GitHub首页 点击中间绿色的S…

详细的一条SQL语句的执行流程

SQL 语句的执行流程会因数据库管理系统的不同而略有差异&#xff0c;但一般来说&#xff0c;主要包括以下几个阶段&#xff1a; 查询解析 词法分析&#xff1a;数据库系统首先将输入的 SQL 语句按字符流进行扫描&#xff0c;依据词法规则把它分割成一个个的单词&#xff0c;如…

基于CentOS的Docker + Nginx + Gitee + Jenkins部署总结

一、部署环境概述 本文阐述在CentOS系统上运用PowerShell命令部署Docker、Nginx、Gitee&#xff08;文中未详细提及Gitee相关配置&#xff0c;可根据实际情况与其他代码托管平台类比&#xff09;和Jenkins&#xff0c;实现前端自动化部署的流程&#xff0c;包含从系统环境准备…

OpenCV调整图像亮度和对比度

【欢迎关注编码小哥&#xff0c;学习更多实用的编程方法和技巧】 1、基本方法---线性变换 // 亮度和对比度调整 cv::Mat adjustBrightnessContrast(const cv::Mat& src, double alpha, int beta) {cv::Mat dst;src.convertTo(dst, -1, alpha, beta);return dst; }// 使用…

《机器学习》——逻辑回归(下采样)

文章目录 什么是下采样&#xff1f;为什么在逻辑回归中要使用下采样&#xff1f;使用下采样和不使用下采样的区别实例1、实例内容2、实例步骤 什么是下采样&#xff1f; 下采样&#xff08;Down - Sampling&#xff09;是一种数据处理技术&#xff0c;主要用于处理数据集中不同…

Python实现接口签名调用

目录: 1、第三方接口签名调用2、调用结果 1、第三方接口签名调用 import json import requests import hashlib import time import hmac access_key xxxxxxxxxxxxxxx secret_key xxxxxxxxxxxxxxx # 应用信息 def _wps4_sig(method, url, date, body): print(body)if bod…

什么是.net framework,什么是.net core,什么是.net5~8,版本对应关系

我不知道有多少人和我一样&#xff0c;没学习过.netCore&#xff0c;想要学习&#xff0c;但是版本号太多就蒙了&#xff0c;不知道学什么了&#xff0c;这里解释下各个版本的关系 我们一般开始学习微软的时候&#xff0c;都是开始学习的.netframework&#xff0c;常用的就是4…

对比式机器学习揭示了跨物种共享和特异性的脑功能结构|文献速递-视觉大模型医疗图像应用

Title 题目 Contrastive machine learning reveals species -shared and -specific brain functional architecture 对比式机器学习揭示了跨物种共享和特异性的脑功能结构 01 文献速递介绍 猕猴被广泛作为人类的动物模型&#xff0c;用于研究大脑和行为的关键方面&#xf…

中药和西药的区别

中药和西药的区别 一、定义与来源 &#xff08;一&#xff09;中药 中药主要是在中国传统医学理论指导下用于预防、诊断、治疗疾病或调节人体机能的药物。它的来源广泛&#xff0c;包括植物药、动物药、矿物药等。植物药是中药的主要组成部分&#xff0c;例如人参&#xff0…

PostgreSQL学习笔记(一):PostgreSQL介绍和安装

目录 概念 PostgreSQL简介 PostgreSQL的关键特性 1. 标准兼容性 2. 扩展性 3. 数据完整性和可靠性 4. 丰富的数据类型 5. 查询能力 6. 事务和并发控制 7. 扩展和插件 8. 跨平台和多语言支持 9. 高可用性和扩展性 常用场景 安装 Linux apt安装 下载安装包安装 客…

Python跨年烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

ABP框架8——仓储的作用及其基础Demo

一、使用仓储的好处 1.提高CRUD接口复用性2.解耦业务逻辑&#xff08;BLL&#xff09;和增删改查&#xff08;CRUD&#xff09;&#xff0c;换ORM特别方便&#xff0c;不需要改应用层&#xff0c;直接改仓储层3.做复杂查询4.事务支持 二、Demo public class BookRepository …