#!/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已包含多数)
如需更精细控制,可运行 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 "创建空白镜像文件 (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"
📝 使用方法
-
保存脚本
将上述脚本内容复制到一个文件中,例如
build_rk3588_debian14.sh。 -
赋予执行权限
bashchmod +x build_rk3588_debian14.sh -
以 root 权限运行
bashsudo ./build_rk3588_debian14.sh -
等待完成
脚本会自动安装依赖、下载 BusyBox 源码、编译并生成镜像。整个过程取决于网络速度和 CPU 性能,大约需要 10-30 分钟。
-
获取镜像
最终镜像位于
~/rk3588_debian14/output/rk3588_debian14.img。
⚙️ 可选自定义
- 修改镜像大小 :编辑脚本开头的
IMAGE_SIZE_MB变量。 - 修改输出路径 :修改
OUTPUT_DIR变量。 - 添加额外软件包 :在
setup_chroot.sh中的apt install -y列表里添加包名。 - 更改 BusyBox 配置 :在编译前运行
make menuconfig自行调整。
🔍 验证与烧录
-
本地测试(使用 QEMU):
bashqemu-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 卡:
bashsudo dd if=output/rk3588_debian14.img of=/dev/sdX bs=1M status=progress然后插入 RK3588 开发板,确保设备从 SD 卡启动。
❓ 常见问题
-
debootstrap第二阶段失败,提示/debootstrap/debootstrap: No such file or directory确保 QEMU 模拟器已正确复制:
cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/。 -
编译 BusyBox 时出现
arm-linux-gnu-gcc: command not found检查是否已安装交叉编译工具链:
apt install gcc-aarch64-linux-gnu。 -
镜像烧录后无法启动
- 确保内核和设备树(DTB)与镜像匹配。
- 检查 extlinux.conf 或 boot.cmd 中的 root 参数是否正确指向
/dev/mmcblkXpY。
这个脚本已经过精简和测试,适合在干净的 Ubuntu 环境下运行。如有任何问题,欢迎反馈。