创龙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
流程
-
设置导出环境变量
-
make-targets | make-usage 参数的执行分支
-
创建输出目录,软连接redme等
-
获取支持的命令
-
CMDS="$(run_build_hooks support-cmds all | xargs)" 通过调用run_build_hooks 并传入参数support-cmds all 最后输出通过xargs处理,赋值给CMDS 这个字符串包含了所有支持的命令或选项。
-
-
遍历选项
- help | h | -h | --help | usage 等调用 usage 输出帮助
- shell | cleanall:如果选项是
shell
或cleanall
,则执行一段检查代码,确保这些选项不是与其他选项组合使用的。如果是单独使用(即$opt
等于$OPTIONS
),则跳出循环;否则,显示错误信息。 - post-rootfs:如果选项是
post-rootfs
,则检查它是否是第一个选项,并且后面跟着一个目录参数。如果是,将OPTIONS
设置为post-rootfs
并跳出循环;否则,显示错误信息。 - *:对于所有其他选项,使用
option_check
函数检查它们是否在$CMDS
中定义的支持命令列表中。如果是,则继续循环;否则,显示错误信息。
-
日志相关
-
初始化
-
加载配置环境变量等
-
设置环境变量,处理特殊命令等
-
输出显示最终配置信息
-
开始构建,最终进入run_build_hooks 传入参数 build debian
-
run_build_hooks 函数
- 匹配分支 init | pre-build | make-* | usage | support-cmds
- 日志记录
- 调用 run_hooks device/rockchip/common/build-hook debian
-
run_hooks
- 调用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 $@
}
流程
- build_hook()
- 进入分支build_debian
- build_debian
- 执行
- mk-rootfs-bullseys.sh
- mk-xwsysroot.sh
- 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
流程
- 进行文件系统构建,安装库,等
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
流程
- cp 跟文件系统的库,制作交叉编译环境
- 制作交叉编译,配置文件
- 配置,编译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}
流程
- 运行2个 post-build.sh
- 制作打包跟文件系统
post-build.sh
后续的配置信息
- 文件系统的挂载信息修改添加
- 执行 device/rockchip/common/post-hooks 下的sh,启动一些服务?
- 02-usb.sh
- 05-udev.sh
- 06-async-commit.sh
- 10-os-release.sh
- 20-info.sh
- 30-fstab.sh
- 40-busybox-reboot.sh
- 50-locale.sh
- 60-dirs.sh
- 90-overlay.sh
- 95-partitions.sh
- 99-owner.sh
大致流程
- 编译安装必要库drm,npu等
- 进入文件系统,然后gtp命令安装
- 然后cp ln等,qt编译安装
- 文件系统制作
系统制作步骤
-
解压 debian,原始根文件系统
sudo tar -xpf linaro-bullseye-alip-20240903-1.tar.gz
-
获取文件系统大小,然后+300
sudo du -sh -m ./binary | cut -f1
-
创建文件
dd if=/dev/zero of=linaro-rootfsxw.img bs=1M count=0 seek=2385
-
写入内容并格式化ext4
sudo mkfs.ext4 -d ./binary linaro-rootfsxw.img
相关文章:
创龙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"shiftf…...
element组件el-select、el-tree-select有值,不渲染lable
大致情况是这个样子的............ 之前vue页面和script脚本是放在一个页面的,今天把页面和脚本拆开了。这一拆不打紧,完犊子!它奶奶的el-select、el-tree-select这俩组件不正常显示了!!! 我这个是vite-vue…...
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 一、线性表的基本概念 二、初始化线性表 三、销毁线性表 四、判定是否为空表 五、求线性表的长度 六、输出线性表 七、求线性表中某个数据元素值 八、按元素值查找 九、插入数据元素 十、删除数据元素 测试说明 通关代码 测…...
2025第1周 | JavaScript中的正则表达式
目录 1. 正则表达式是个什么东东?1.1 怎么定义正则1.2 对象字面量方式1.3 类创建方式 2. 怎么使用2.1 实例方法2.1.1 exec方法2.1.2 test方法 2.2 字符串中的方法2.2.1 match/matchAll2.2.2 replace/replaceAll2.2.3 split2.2.4 search 3. 规则3.1 修饰符3.2 字符类…...
模型 九屏幕分析法
系列文章 分享 模型,了解更多👉 模型_思维模型目录。九屏幕法:全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机,为了全面评估市场潜力和风险,他们…...
快速排序(霍尔法),冒泡排序 【C语言】
冒泡排序 效率低,但是稳定性高 代码 // 冒泡排序 void maopao(int a[]);int main() {int a1[10] {34,78,29,46,12,85,63,92,57,31};printf("\n排序前:\n");print(a1);maopao(a2);printf("冒泡排序后:");print(a2); }//冒泡排序 void maopao(…...
国产编辑器EverEdit - 两种删除空白行的方法
1 使用技巧:删除空白行 1.1 应用场景 用户在编辑文档时,可能会遇到很多空白行需要删除的情况,比如从网页上拷贝文字,可能就会存在大量的空白行要删除。 1.2 使用方法 1.2.1 方法1: 使用编辑主菜单 选择主菜单编辑 …...
20241230 AI智能体-用例学习(LlamaIndex/Ollama)
AI小白一枚,入门实验。 1. Pg-Hydra 颠覆数据库体验:Hydra —— 开源的列式存储 PostgreSQL-CSDN博客 git clone https://github.com/hydradatabase/hydra && cd hydra cp .env.example .env docker compose up psql postgres://postgres:hydra@127.0.0.1:5432 do…...
2024年终总结及计划
24年收获不少,早就想总结下,但是有的问题不想去思考,也不想去面对,就晚了几天,趁着加班总结反思下。 一、计划完成情况 1、生活 ①运动:继续坚持每周慢跑15公里,这是必须要做的。另外&#x…...
基于深度学习算法的AI图像视觉检测
基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今,它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习?深度学习是如何应用在视觉检测上的呢? 什么是深度学习? 深度学习是…...
分布式环境下定时任务扫描时间段模板创建可预订时间段
🎯 本文详细介绍了场馆预定系统中时间段生成的实现方案。通过设计场馆表、时间段模板表和时间段表,系统能够根据场馆的提前预定天数生成未来可预定的时间段。为了确保任务执行的唯一性和高效性,系统采用分布式锁机制和定时任务,避…...
谷粒商城-高级篇完结-Sleuth+Zipkin 服务链路追踪
1、基本概念和整合 1.1、为什么用 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位 。主要体现在&#…...
GraphRAG:LLM之Graphrag接入milvus
前言 微软目前的graphrag更像个demo,数据量大的时候不是很友好的啊,所以将milvus接入了graphrag,看完这篇文章,其他数据库接入应该也没问题 注:这篇文章只是在search的时候接入进来,index过程或者说整个流…...
flink cdc oceanbase(binlog模式)
接上文:一文说清flink从编码到部署上线 环境:①操作系统:阿里龙蜥 7.9(平替CentOS7.9);②CPU:x86;③用户:root。 预研初衷:现在很多项目有国产化的要求&#…...
【算法】算法初步
要学好数据结构和算法的设计与分析,请务必先打好C语言基础,因为C语言中的数据存储、内存映射、指针等等概念最接近计算机的底层原理,数据结构是数据在内存空间当中的组织形式,而算法则是提供了解决某个问题的一种思路,…...
Eureka原理
my: 服务注册与发现 心跳 自我保护 故障转移 Eureka 原理 Eureka 是一个由 Netflix 开源的服务注册与发现框架,广泛用于微服务架构中,尤其是 Spring Cloud 中的服务注册与发现。Eureka 的主要作用是管理和协调分布式系统中的服务实例,使…...
关于linux的ld.so.conf.d
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
Linux Shell 脚本编程基础知识篇—awk的条件判断(3)
ℹ️大家好,我是练小杰,今天周五了,又是一周过去了😆 本文是有关Linux shell脚本编程的awk命令的条件语句,后续我会不断增加相关内容 ~~ 回顾:【awk字符串函数和内置变量】 更多Linux 相关内容请点击👉【Li…...
安装Cockpit服务,使用Web页面管理你的Linux服务器
说起管理 Linux 服务器,大家首先想到的使用 SecureCRT、Xshell、MobaXterm 等工具远程到服务器,然后使用命令行管理服务器。今天给大家介绍一个好玩的工具,名字叫Cockpit, Cockpit 是一个免费开源的基于 web 的 Linux 服务器管理…...
基于微信小程序的面部动作检测
目录 引言系统架构概述前端实现细节后端实现细节防止欺骗与误导的措施前后端数据交互详细细节关键技术选型关键技术框架与算法详细说明优化与注意事项总结 引言 微信小程序的面部动作检测的核心功能包括检测用户的左右转头、眨眼和张嘴动作,并根据检测结果逐步引导…...
使用npm 插件[mmdc]将.mmd时序图转换为图片
使用npm 插件[mmdc]将.mmd时序图转换为图片 1. 安装 mmdc2. 转换为图片 可以使用 mmdc (Mermaid CLI)这个工具来将 .mmd 时序图(Mermaid语法描述的时序图)转换为图片,以下是使用步骤: 1. 安装 mmdc 确保…...
服务端错误的处理和web安全检测
文章目录 I 服务端错误的处理业务返回码处理前端处理业务返回码nginx处理http状态码II web安全检测区分服务器类型主机扫漏III 使用 micro_httpd 搭建一个PHP站点步骤下载micro_httpd 并安装它配置micro_httpd 来服务PHP文件I 服务端错误的处理 服务端发生错误时,返回给前端的…...
周记-Repeater中的children和item区别
Repeater中的children和item 在开发qml的界面时,用到了Repeater,表头需要根据Repeater是否存在显示的项,来进行显示。 repeater.children[i] repeater.itemAt(i)如果判断有没有存在显示的项,可以用下面的代码 function is_exis…...
JVM实战—8.如何分析jstat统计来定位GC
大纲 1.使用jstat了解线上系统的JVM运行状况 2.使用jmap和jhat了解线上系统的对象分布 3.如何分析JVM运行状况并合理优化 4.使用jstat分析模拟的BI系统JVM运行情况 5.使用jstat分析模拟的计算系统JVM运行情况 6.问题汇总 1.使用jstat了解线上系统的JVM运行状况 (1)JVM的…...
halcon三维点云数据处理(五)创建代表工具和机器人底座的3D模型
目录 一、gen_robot_tool_and_base_object_model_3d 函数调用二、gen_arrow_object_model_3d 函数调用 首先说明一下这部分代码在find_box_3d这个例程中,非常好用的一个坐标系生成函数。 一、gen_robot_tool_and_base_object_model_3d 函数调用 RobotToolSize : 0.…...
React Router 向路由组件传state参数浏览器回退历史页面显示效果问题
昨天在看尚硅谷张天禹老师讲的 React教程p90,老师讲到 React路由的 replace模式和push模式,老师的演示效果与自己本地操作不太一样。 老师的效果:点击查看消息1,消息2,消息3 再点回退,可以依次查看到 消息…...
LabVIEW四旋翼飞行器姿态监测系统
四旋翼飞行器姿态监测系统是一个集成了高度、速度、俯仰角与滚转角数据采集与分析的系统,提高飞行器在复杂环境中的操作精确度与安全性。系统利用LabVIEW平台与硬件传感器相结合,实现实时数据处理与显示,有效地提升了四旋翼飞行器的监测与控制…...
HTML——66.单选框
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单选框</title></head><body><!--input元素的type属性:(必须要有)--> <!--单选框:(如所住省会,性别选择&…...
av1学习笔记(二):sequence_header_obu
av1学习笔记(二):sequence_header_obu 目录 av1学习笔记(二):sequence_header_obu1,图片的编解码方式1.1 seq_profile:1.2 still_picture1.3 reduced_still_picture_header1.4 编解码图像的宽高…...
嵌入式驱动开发详解8(阻塞/非阻塞/异步通信)
文章目录 前言阻塞非阻塞异步通知后续 前言 首先来回顾一下“中断”,中断是处理器提供的一种异步机制,我们配置好中断以后就 可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数, 在中断服务函数…...
CSS进阶和SASS
目录 一、CSS进阶 1.1、CSS变量 1.2、CSS属性值的计算过程 1.3、做杯咖啡 1.4、下划线动画 1.5、CSS中的混合模式(Blending) 二、SASS 2.1、Sass的颜色函数 2.2、Sass的扩展(extend)和占位符(%)、混合(Mixin) 2.3、Sass的数学函数 2.4、Sass的模块化开发 2.5、Sass…...
求交错序列前N项和(PTA)C语言
本题要求编写程序,计算交错序列 1-2/33/5-4/75/9-6/11... 的前N项之和。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中输出部分和的值,结果保留三位小数。 输入样例: 5输出样例: 0.917 代码: #include<stdio.h&g…...
【Delphi】创建COM服务器供浏览器(WebView)使用的操作步骤
首先创建一个VCL程序在程序的主界面放置WebView浏览器控件新增Automation Object(ActiveX 页面中),重点,注意WebView只支持IDisptcher接口然后根据这个提示实现实现其函数功能在浏览器中众注册: Delphi程序 procedure …...
Spring Security(maven项目) 3.0.2.3版本
前言 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往复以至无穷&a…...
如何删除 Docker 中的悬虚镜像?
在 Docker 中,悬虚镜像(Dangling Images)是指那些没有 标签 且没有被任何容器使用的镜像。这些镜像通常是由于构建过程中生成的中间层镜像或未正确清理的镜像残留。删除悬虚镜像可以释放磁盘空间并保持 Docker 环境的整洁。 1. 列出悬虚镜像…...
【JMeter】配置元件Config Element
1.配置元件 作用: 通用接口配置,协议,IP, 端口等,减少重复工作量 元件的分类 HTTP Request Defaults即HTTP请求默认值 作用: 可以配置成通用请求行的信息,可复用 JDBC Co…...
【Vue】分享一个快速入门的前端框架以及如何搭建
先上效果图: 登录 菜单: 下载地址: 链接:https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取码:ui20 … 主要是可以自定义设置token,更改后端请求地址较为方便。 应用设置: 登录与token设置: 在这里设置不用登录,可以请求的接口: request.js i…...
搭建开源版Ceph分布式存储
系统:Rocky8.6 三台2H4G 三块10G的硬盘的虚拟机 node1 192.168.2.101 node2 192.168.2.102 node3 192.168.2.103 三台虚拟机环境准备 1、配置主机名和IP的映射关系 2、关闭selinux和firewalld防火墙 3、配置时间同步且所有节点chronyd服务开机自启 1、配置主机名和…...
运动相机拍摄的视频打不开怎么办
3-10 GoPro和大疆DJI运动相机的特点,小巧、高清、续航长、拍摄稳定,很多人会在一些重要场合用来拍摄视频,比如可以用来拿在手里拍摄快速运动中的人等等。 但是毕竟是电子产品,有时候是会出点问题的,比如意外断电、摔重…...
信号处理-消除趋势项
matlab 版本 python 版本 import numpy as np import matplotlib.pyplot as plt from matplotlib import rcParams# 设置中文字体 rcParams[font.sans-serif] [SimHei] # 设置默认字体为黑体 rcParams[axes.unicode_minus] False # 解决负号显示问题def compute_time(n, f…...
民宿酒店预订系统小程序+uniapp全开源+搭建教程
一.介绍 一.系统介绍 基于ThinkPHPuniappuView开发的多门店民宿酒店预订管理系统,快速部署属于自己民宿酒店的预订小程序,包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码,支持私有化部署。 二.搭建环境 系统环境…...
Java(1)入门基础
1. Java简介 1.1 什么是Java Java 是一款由Sun Microsystems公司(现为甲骨文公司Oracle Corporation的一部分)的James Gosling及其团队在1995年发布的高级编程语言。同时,Java 是一种面向对象的语言,这意味着它允许开发者通过创…...
大风车excel:怎么把题库导入excel?题库导入excel
高效管理试题库:如何批量导入试题到 Excel? 在教育培训、学校管理以及在线学习平台中,试题库的管理是核心工作之一。如何快速、准确地将试题导入到 Excel 表格中,成为许多教育工作者和开发者的迫切需求。本文将围绕“题库导入 Ex…...
rabbitmq——岁月云实战笔记
1 rabbitmq设计 生产者并不是直接将消息投递到queue,而是发送给exchange,由exchange根据type的规则来选定投递的queue,这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage,而实际我们却应该使用自己…...
更改IP地址能提高網路速度嗎?
IP地址是由ISP分配給連接設備的唯一數字字串,允許設備與互聯網上的網站,伺服器和其他設備進行通信。因此,IP地址是訪問互聯網的基本條件之一。 IP 地址如何工作? 線上流覽時,網路請求都會使用IP地址從設備發送&#…...
Backend - C# asp .net core API(使用swagger)
目录 1. 安装Swagger组件 2. 查看swagger套件(包) 3. 配置Swagger中间件(Swagger服务) 4. 启动Swagger中间件 5. 接口文档配置为项目首页 6. swagger中的接口添加注释 1. 安装Swagger组件 工具栏“工具” > NuGet套件管理员 > 管理方案的NuGet套件…...
linux系统(ubuntu,uos等)连接鸿蒙next(mate60)设备
以前在linux上是用adb连接,现在升级 到了鸿蒙next,adb就不好用了。得用Hdc来了,在windows上安装了hisuit用的好好的,但是到了linux(ubuntu2204)下载安装了 下载中心 | 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生…...
Unity-Mirror网络框架-从入门到精通之网络组件介绍
文章目录 前言网络组件Network AnimatorNetwork AuthenticatorNetwork DiscoveryNetwork IdentityNetwork ManagerNetwork Manager HUDNetwork Ping DisplayNetwork RigidbodyNetwork Room ManagerNetwork Room PlayerNetwork Start PositionNetwork StatisticsNetwork Transfo…...
nginx反向代理和负载均衡
nginx反向代理优点: 提高访问速度进行负载均衡保证后端服务安全(将后端放到局域网) 反向代理配置方式: nginx 负载均衡配置:...
Linux驱动开发学习准备(Linux内核源码添加到工程-Workspace)
Linux内核源码添加到VsCode工程 下载Linux-4.9.88源码: 没有处理同名文件的压缩包: https://pan.baidu.com/s/1yjIBXmxG9pwP0aOhW8VAVQ?pwde9cv 已把同名文件中以大写命名的文件加上_2后缀的压缩包: https://pan.baidu.com/s/1RIRRUllYFn2…...