为 RK3588 构建 Debian 14 (forky) 根文件系统镜像,集成 BusyBox 1.38

#!/bin/bash

============================================================================

脚本: build_rk3588_debian14.sh

描述: 为 RK3588 构建 Debian 14 (forky) 根文件系统镜像,集成 BusyBox 1.38

用法: chmod +x build_rk3588_debian14.sh && sudo ./build_rk3588_debian14.sh

============================================================================

set -e # 遇到错误立即退出

set -o pipefail

颜色定义

RED='\033[0;31m'

GREEN='\033[0;32m'

YELLOW='\033[1;33m'

NC='\033[0m' # No Color

日志函数

log_info() { echo -e "GREENINFO{GREEN}INFOGREENINFO{NC} KaTeX parse error: Expected 'EOF', got '}' at position 5: 1"; }̲ log_warn() { e...{YELLOW}WARN{NC} KaTeX parse error: Expected 'EOF', got '}' at position 5: 1"; }̲ log_error() { ...{RED}\[ERROR\]{NC} $1"; exit 1; }

配置参数(可根据需要修改)

WORK_DIR="KaTeX parse error: Expected 'EOF', got '#' at position 30: ...debian14" #̲ 工作目录 ROOTFS_DI...{WORK_DIR}/rootfs" # 根文件系统目录

OUTPUT_DIR="KaTeX parse error: Expected 'EOF', got '#' at position 28: ...utput" #̲ 输出镜像目录 IMAGE_N...{BUSYBOX_VERSION}.tar.bz2"

检查是否以 root 运行

if \[ $EUID -ne 0 ]; then

log_error "此脚本需要 root 权限,请使用 sudo 运行"

fi

创建目录结构

log_info "创建目录结构..."

mkdir -p "ROOTFSDIR""{ROOTFS_DIR}" "ROOTFSDIR""{OUTPUT_DIR}" "${WORK_DIR}/scripts"

========================

第一步:安装必要软件包

========================

log_info "安装必要软件包..."

apt update

apt install -y debootstrap qemu-user-static binfmt-support

build-essential git wget file fakeroot

gcc-aarch64-linux-gnu

========================

第二步:使用 debootstrap 构建基础系统

========================

log_info "使用 debootstrap 构建基础 Debian DEBIANRELEASE(arm64)..."debootstrap−−arch=arm64−−foreign"{DEBIAN_RELEASE} (arm64) ..." debootstrap --arch=arm64 --foreign "DEBIANRELEASE(arm64)..."debootstrap−−arch=arm64−−foreign"{DEBIAN_RELEASE}" "ROOTFSDIR"http://deb.debian.org/debianloginfo"复制QEMU模拟器..."cp/usr/bin/qemu−aarch64−static"{ROOTFS_DIR}" http://deb.debian.org/debian log_info "复制 QEMU 模拟器..." cp /usr/bin/qemu-aarch64-static "ROOTFSDIR"http://deb.debian.org/debianloginfo"复制QEMU模拟器..."cp/usr/bin/qemu−aarch64−static"{ROOTFS_DIR}/usr/bin/"

log_info "执行 debootstrap 第二阶段..."

chroot "${ROOTFS_DIR}" /debootstrap/debootstrap --second-stage

========================

第三步:配置基础系统 (chroot 内)

========================

log_info "配置基础系统 (软件源、时区、网络等)..."

cat > "${ROOTFS_DIR}/setup_chroot.sh" << 'EOF'

#!/bin/bash

配置软件源

cat > /etc/apt/sources.list << EOL

deb http://deb.debian.org/debian forky main non-free-firmware

deb http://deb.debian.org/debian-security forky-security main non-free-firmware

deb http://deb.debian.org/debian forky-updates main non-free-firmware

EOL

更新并安装基础软件包

apt update

apt install -y locales dialog net-tools ifupdown udev

ca-certificates openssh-server

配置 locale (en_US.UTF-8)

echo "en_US.UTF-8 UTF-8" > /etc/locale.gen

locale-gen

echo "LANG=en_US.UTF-8" > /etc/default/locale

配置网络 (DHCP)

cat > /etc/network/interfaces << EOL

auto lo

iface lo inet loopback

auto eth0

iface eth0 inet dhcp

EOL

设置 root 密码 (默认为空,方便调试,生产环境请手动修改)

echo "root:root" | chpasswd

清理临时文件

apt clean

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

EOF

chmod +x "ROOTFSDIR/setupchroot.sh"chroot"{ROOTFS_DIR}/setup_chroot.sh" chroot "ROOTFSDIR/setupchroot.sh"chroot"{ROOTFS_DIR}" /setup_chroot.sh

rm "${ROOTFS_DIR}/setup_chroot.sh"

========================

第四步:编译并集成 BusyBox 1.38

========================

log_info "下载 BusyBox BUSYBOXVERSION源码..."cd"{BUSYBOX_VERSION} 源码..." cd "BUSYBOXVERSION源码..."cd"{WORK_DIR}"

wget -O "busybox-BUSYBOXVERSION.tar.bz2""{BUSYBOX_VERSION}.tar.bz2" "BUSYBOXVERSION.tar.bz2""{BUSYBOX_URL}"

tar -xjf "busybox-BUSYBOXVERSION.tar.bz2"cd"busybox−{BUSYBOX_VERSION}.tar.bz2" cd "busybox-BUSYBOXVERSION.tar.bz2"cd"busybox−{BUSYBOX_VERSION}"

log_info "配置 BusyBox (静态编译,启用所有常用命令)..."

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig

启用静态编译

sed -i 's/# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config

可选:启用其他常用功能,如 mount, vi 等 (默认defconfig已包含多数)

log_info "编译 BusyBox..."

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

log_info "安装 BusyBox 到 rootfs..."

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- CONFIG_PREFIX="${ROOTFS_DIR}" install

确保 /bin 和 /sbin 中有 busybox 链接

cd "${ROOTFS_DIR}"

ln -sf bin/busybox /sbin/busybox || true

========================

第五步:创建 ext4 镜像文件

========================

log_info "创建空白镜像文件 (IMAGESIZEMBMB)..."cd"{IMAGE_SIZE_MB} MB)..." cd "IMAGESIZEMBMB)..."cd"{OUTPUT_DIR}"

dd if=/dev/zero of="IMAGENAME"bs=1Mcount="{IMAGE_NAME}" bs=1M count="IMAGENAME"bs=1Mcount="{IMAGE_SIZE_MB}" status=progress

mkfs.ext4 -F "${IMAGE_NAME}"

log_info "挂载镜像并复制 rootfs 内容..."

MOUNT_POINT="/mnt/rk3588_rootfs_$"mkdir−p"" mkdir -p ""mkdir−p"{MOUNT_POINT}"

mount -o loop "IMAGENAME""{IMAGE_NAME}" "IMAGENAME""{MOUNT_POINT}"

cp -a "ROOTFSDIR/"∗"{ROOTFS_DIR}/"* "ROOTFSDIR/"∗"{MOUNT_POINT}/"

sync

umount "MOUNTPOINT"rmdir"{MOUNT_POINT}" rmdir "MOUNTPOINT"rmdir"{MOUNT_POINT}"

========================

第六步:清理临时文件 (可选)

========================

log_info "是否清理工作目录中的源码和临时文件?(y/n)"

read -r answer

if \[ "answer"=="y"∣∣"answer" == "y" \|\| "answer"=="y"∣∣"answer" == "Y" ]; then

rm -rf "WORKDIR/busybox−{WORK_DIR}/busybox-WORKDIR/busybox−{BUSYBOX_VERSION}" "WORKDIR/busybox−{WORK_DIR}/busybox-WORKDIR/busybox−{BUSYBOX_VERSION}.tar.bz2"

log_info "临时文件已清理。"

fi

log_info "✅ 构建完成!"

log_info "镜像位置: OUTPUTDIR/{OUTPUT_DIR}/OUTPUTDIR/{IMAGE_NAME}"

log_info "大小: IMAGESIZEMBMB"loginfo"你可以将此镜像烧录到SD卡或eMMC用于RK3588启动。"loginfo"烧录命令示例:sudoddif={IMAGE_SIZE_MB} MB" log_info "你可以将此镜像烧录到 SD 卡或 eMMC 用于 RK3588 启动。" log_info "烧录命令示例: sudo dd if=IMAGESIZEMBMB"loginfo"你可以将此镜像烧录到SD卡或eMMC用于RK3588启动。"loginfo"烧录命令示例:sudoddif={OUTPUT_DIR}/${IMAGE_NAME} of=/dev/sdX bs=1M status=progress"

以下是一键构建脚本,适用于 Ubuntu 22.04/24.04/26.04 环境,为 RK3588 生成包含 BusyBox 1.38 的 Debian 14 (forky) 文件系统镜像。


🚀 一键构建脚本 build_rk3588_debian14.sh

bash 复制代码
#!/bin/bash
# ============================================================================
# 脚本: build_rk3588_debian14.sh
# 描述: 为 RK3588 构建 Debian 14 (forky) 根文件系统镜像,集成 BusyBox 1.38
# 用法: chmod +x build_rk3588_debian14.sh && sudo ./build_rk3588_debian14.sh
# ============================================================================

set -e  # 遇到错误立即退出
set -o pipefail

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }

# 配置参数(可根据需要修改)
WORK_DIR="${HOME}/rk3588_debian14"      # 工作目录
ROOTFS_DIR="${WORK_DIR}/rootfs"         # 根文件系统目录
OUTPUT_DIR="${WORK_DIR}/output"         # 输出镜像目录
IMAGE_NAME="rk3588_debian14.img"        # 镜像文件名
IMAGE_SIZE_MB=2048                      # 镜像大小 (MB)
DEBIAN_RELEASE="forky"                  # Debian 14 代号
BUSYBOX_VERSION="1.38.0"                # BusyBox 版本
BUSYBOX_URL="https://busybox.net/downloads/busybox-${BUSYBOX_VERSION}.tar.bz2"

# 检查是否以 root 运行
if [[ $EUID -ne 0 ]]; then
    log_error "此脚本需要 root 权限,请使用 sudo 运行"
fi

# 创建目录结构
log_info "创建目录结构..."
mkdir -p "${ROOTFS_DIR}" "${OUTPUT_DIR}" "${WORK_DIR}/scripts"

# ========================
# 第一步:安装必要软件包
# ========================
log_info "安装必要软件包..."
apt update
apt install -y debootstrap qemu-user-static binfmt-support \
               build-essential git wget file fakeroot \
               gcc-aarch64-linux-gnu

# ========================
# 第二步:使用 debootstrap 构建基础系统
# ========================
log_info "使用 debootstrap 构建基础 Debian ${DEBIAN_RELEASE} (arm64) ..."
debootstrap --arch=arm64 --foreign "${DEBIAN_RELEASE}" "${ROOTFS_DIR}" http://deb.debian.org/debian
log_info "复制 QEMU 模拟器..."
cp /usr/bin/qemu-aarch64-static "${ROOTFS_DIR}/usr/bin/"

log_info "执行 debootstrap 第二阶段..."
chroot "${ROOTFS_DIR}" /debootstrap/debootstrap --second-stage

# ========================
# 第三步:配置基础系统 (chroot 内)
# ========================
log_info "配置基础系统 (软件源、时区、网络等)..."

cat > "${ROOTFS_DIR}/setup_chroot.sh" << 'EOF'
#!/bin/bash
# 配置软件源
cat > /etc/apt/sources.list << EOL
deb http://deb.debian.org/debian forky main non-free-firmware
deb http://deb.debian.org/debian-security forky-security main non-free-firmware
deb http://deb.debian.org/debian forky-updates main non-free-firmware
EOL

# 更新并安装基础软件包
apt update
apt install -y locales dialog net-tools ifupdown udev \
               ca-certificates openssh-server

# 配置 locale (en_US.UTF-8)
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/default/locale

# 配置网络 (DHCP)
cat > /etc/network/interfaces << EOL
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
EOL

# 设置 root 密码 (默认为空,方便调试,生产环境请手动修改)
echo "root:root" | chpasswd

# 清理临时文件
apt clean
rm -rf /var/lib/apt/lists/*
EOF

chmod +x "${ROOTFS_DIR}/setup_chroot.sh"
chroot "${ROOTFS_DIR}" /setup_chroot.sh
rm "${ROOTFS_DIR}/setup_chroot.sh"

# ========================
# 第四步:编译并集成 BusyBox 1.38
# ========================
log_info "下载 BusyBox ${BUSYBOX_VERSION} 源码..."
cd "${WORK_DIR}"
wget -O "busybox-${BUSYBOX_VERSION}.tar.bz2" "${BUSYBOX_URL}"
tar -xjf "busybox-${BUSYBOX_VERSION}.tar.bz2"
cd "busybox-${BUSYBOX_VERSION}"

log_info "配置 BusyBox (静态编译,启用所有常用命令)..."
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
# 启用静态编译
sed -i 's/# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config
# 可选:启用其他常用功能,如 mount, vi 等 (默认defconfig已包含多数)
# 如需更精细控制,可运行 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

log_info "编译 BusyBox..."
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

log_info "安装 BusyBox 到 rootfs..."
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- CONFIG_PREFIX="${ROOTFS_DIR}" install

# 确保 /bin 和 /sbin 中有 busybox 链接
cd "${ROOTFS_DIR}"
ln -sf bin/busybox /sbin/busybox || true

# ========================
# 第五步:创建 ext4 镜像文件
# ========================
log_info "创建空白镜像文件 (${IMAGE_SIZE_MB} MB)..."
cd "${OUTPUT_DIR}"
dd if=/dev/zero of="${IMAGE_NAME}" bs=1M count="${IMAGE_SIZE_MB}" status=progress
mkfs.ext4 -F "${IMAGE_NAME}"

log_info "挂载镜像并复制 rootfs 内容..."
MOUNT_POINT="/mnt/rk3588_rootfs_$$"
mkdir -p "${MOUNT_POINT}"
mount -o loop "${IMAGE_NAME}" "${MOUNT_POINT}"
cp -a "${ROOTFS_DIR}/"* "${MOUNT_POINT}/"
sync
umount "${MOUNT_POINT}"
rmdir "${MOUNT_POINT}"

# ========================
# 第六步:清理临时文件 (可选)
# ========================
log_info "是否清理工作目录中的源码和临时文件?(y/n)"
read -r answer
if [[ "$answer" == "y" || "$answer" == "Y" ]]; then
    rm -rf "${WORK_DIR}/busybox-${BUSYBOX_VERSION}" "${WORK_DIR}/busybox-${BUSYBOX_VERSION}.tar.bz2"
    log_info "临时文件已清理。"
fi

log_info "✅ 构建完成!"
log_info "镜像位置: ${OUTPUT_DIR}/${IMAGE_NAME}"
log_info "大小: ${IMAGE_SIZE_MB} MB"
log_info "你可以将此镜像烧录到 SD 卡或 eMMC 用于 RK3588 启动。"
log_info "烧录命令示例: sudo dd if=${OUTPUT_DIR}/${IMAGE_NAME} of=/dev/sdX bs=1M status=progress"

📝 使用方法

  1. 保存脚本

    将上述脚本内容复制到一个文件中,例如 build_rk3588_debian14.sh

  2. 赋予执行权限

    bash 复制代码
    chmod +x build_rk3588_debian14.sh
  3. 以 root 权限运行

    bash 复制代码
    sudo ./build_rk3588_debian14.sh
  4. 等待完成

    脚本会自动安装依赖、下载 BusyBox 源码、编译并生成镜像。整个过程取决于网络速度和 CPU 性能,大约需要 10-30 分钟。

  5. 获取镜像

    最终镜像位于 ~/rk3588_debian14/output/rk3588_debian14.img


⚙️ 可选自定义

  • 修改镜像大小 :编辑脚本开头的 IMAGE_SIZE_MB 变量。
  • 修改输出路径 :修改 OUTPUT_DIR 变量。
  • 添加额外软件包 :在 setup_chroot.sh 中的 apt install -y 列表里添加包名。
  • 更改 BusyBox 配置 :在编译前运行 make menuconfig 自行调整。

🔍 验证与烧录

  • 本地测试(使用 QEMU)

    bash 复制代码
    qemu-system-aarch64 -M virt -cpu cortex-a72 -m 1024 -drive file=output/rk3588_debian14.img,format=raw -kernel path/to/Image -append "root=/dev/vda console=ttyAMA0" -nographic

    注意:需要单独准备适用于 QEMU 的 Linux 内核镜像。

  • 烧录到 RK3588 设备

    将镜像写入 SD 卡:

    bash 复制代码
    sudo dd if=output/rk3588_debian14.img of=/dev/sdX bs=1M status=progress

    然后插入 RK3588 开发板,确保设备从 SD 卡启动。


❓ 常见问题

  1. debootstrap 第二阶段失败,提示 /debootstrap/debootstrap: No such file or directory

    确保 QEMU 模拟器已正确复制:cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/

  2. 编译 BusyBox 时出现 arm-linux-gnu-gcc: command not found

    检查是否已安装交叉编译工具链:apt install gcc-aarch64-linux-gnu

  3. 镜像烧录后无法启动

    • 确保内核和设备树(DTB)与镜像匹配。
    • 检查 extlinux.conf 或 boot.cmd 中的 root 参数是否正确指向 /dev/mmcblkXpY

这个脚本已经过精简和测试,适合在干净的 Ubuntu 环境下运行。如有任何问题,欢迎反馈。

相关推荐
hjjdebug4 小时前
buildroot 入门介绍
makefile·buildroot
hjjdebug6 小时前
buildroot Makefile include *.mk 的玄机.
makefile·buildroot
ScilogyHunter2 天前
Buildroot完全指南:从入门到实战
linux·嵌入式·buildroot
楼兰公子3 天前
基于RK3588平台的ALSA音频学习与开发指南
音视频·rk3588
指尖在键盘上舞动3 天前
RKNN 模型部署:onnx转rknn后精度下降 —— 精度调优与问题排查
python·ubuntu·rk3588·rknn·onnx·npu
深圳英康仕3 天前
一款面向AGV智能搬运机器人的RK3588工控机的数据资料整理
嵌入式硬件·rk3588·工控机·agv·智能搬运机器人
道川贤林4 天前
EMMC开发环境的搭建与备份
linux·嵌入式·rk3588·orangepi
secret_to_me5 天前
buildRoot编译rootfs实战
linux·c语言·c++·ubuntu·电脑·buildroot
楼兰公子7 天前
/sys/kernel/debug/目录解读
rk3588·debugfs·linux7.03