radxa rsdk 2 - rootfs编译和镜像制作

https://radxaos-sdk.github.io/rsdk/tutorials/usage.html

[1/3] 编译镜像

使用国内镜像地址

https://docs.radxa.com/rock5/rock5a/radxa-os/using-apt#中国仓库镜像

改了镜像地址,但是有个pkgs.json没有,改源码注释掉:

...
-                    wget -O "$1/etc/rsdk/80-radxa-%(product_soc)s.pkgs.json" %(radxa_url)s%(product_soc)s-%(suite)s/pkgs.json
...

改成使用rock-5b cli

src/share/rsdk/configs/products.json:

-        "supported_edition": ["kde"]
+        "supported_edition": ["cli"]

编译

export PATH="$PWD/src/bin:$PWD/node_modules/.bin:$PATH"
rsdk devcon
/workspaces/rsdk/src/libexec/rsdk/rsdk-build --no-cache -d -M https://mirrors.lzu.edu.cn/radxa-apt/ rock-5b
/workspaces/rsdk/src/libexec/rsdk/rsdk-build -d -M https://mirrors.lzu.edu.cn/radxa-apt/ -d rock-5b

基本过程

- gen rootfs
    - jsonnet "${JSONNET_ARGS[@]}" "$SCRIPT_DIR/../../share/rsdk/build/rootfs.jsonnet" -o "$RSDK_TEMP/rootfs.json"
    - sudo bdebstrap "${BDEBSTRAP_ARGS[@]}" -c "$RSDK_TEMP/rootfs.json" --name "$OUTPUT" --force
- gen images
    - jsonnet "${JSONNET_ARGS[@]}" "$SCRIPT_DIR/../../share/rsdk/build/image.jsonnet" -o "$OUTPUT/build-image"
    - pushd "$OUTPUT"
    - ./build-image
    - popd

[2/3] gen rootfs

rootfs.json

{
  "metadata": {
    "architecture": "arm64",
    "build_date": "2025-05-14T03:00:56+00:00",
    "distro_mirror": "",
    "edition": "cli",
    "firmware_override": "",
    "install_vscodium": false,
    "linux_override": "",
    "mode": "root",
    "output_dir": "/workspaces/rsdk/out/rock-5b_bookworm_cli",
    "product": "rock-5b",
    "radxa_mirror": "https://mirrors.lzu.edu.cn/radxa-apt/",
    "radxa_repo_suffix": "",
    "rootfs": "rootfs",
    "rsdk_rev": "",
    "sdboot": false,
    "suite": "bookworm",
    "temp_dir": "/tmp/rsdk.rock-5b_bookworm_cli.UdJ5bW0G",
    "variant": "apt",
    "vendor_packages": true
  },
  "mmdebstrap": {
    "architectures": [
      "arm64"
    ],
    "mode": "root",
    "suite": "bookworm",
    "target": "rootfs",
    "variant": "apt",
    "hostname": "rock-5b",
    "mirrors": [
      "https://deb.debian.org/debian"
    ],
    "components": [
      "main",
      "contrib",
      "non-free",
      "non-free-firmware"
    ],
    "keyrings": [
      "/tmp/rsdk.rock-5b_bookworm_cli.UdJ5bW0G/keyrings/"
    ],
    "setup-hooks": [
      "# updates archive\nhead -n 1 \"$1/etc/apt/sources.list\" | sed -E -e \"s/(bookworm)/\\\\1-updates/\" > \"$1/etc/apt/sources.list.d/50-bookworm-updates.list\"\n# backports archive\nhead -n 1 \"$1/etc/apt/sources.list\" | sed -E -e \"s/(bookworm)/\\\\1-backports/\" > \"$1/etc/apt/sources.list.d/50-bookworm-backports.list\"\n# security archive\nhead -n 1 \"$1/etc/apt/sources.list\" | sed -E -e \"s/(bookworm)/\\\\1-security/\" -e \"s|/debian |/debian-security |\" > \"$1/etc/apt/sources.list.d/50-bookworm-security.list\"\n# main archive\nmv \"$1/etc/apt/sources.list\" \"$1/etc/apt/sources.list.d/50-bookworm.list\"\n",
      "mkdir -p \"$1/etc/rsdk/\"",
      "set -e\nmkdir -p \"$1/srv/\"\ncp -R \"/tmp/rsdk.rock-5b_bookworm_cli.UdJ5bW0G/debs/.\" \"$1/srv/local-apt-repository\"\npushd \"$1/srv/local-apt-repository\"\napt-ftparchive packages . > ./Packages\napt-ftparchive -o \"APT::FTPArchive::Release::Origin=local-apt-repository\" release . > ./Release\npopd\necho \"deb [trusted=yes] file://$1/srv/local-apt-repository ./\" > \"$1/etc/apt/sources.list.d/99-local-apt-repository.list\"\ncat << EOF > \"$1/etc/apt/preferences.d/local-apt-repository\"\nPackage: *\nPin: release o=local-apt-repository\nPin-Priority: 1999\nEOF\n",
      "echo deb https://mirrors.lzu.edu.cn/radxa-apt/rk3588-bookworm rk3588-bookworm main > \"$1/etc/apt/sources.list.d/80-radxa-rk3588.list\"\n",
      "echo deb https://mirrors.lzu.edu.cn/radxa-apt/bookworm bookworm main > \"$1/etc/apt/sources.list.d/70-radxa.list\"\n"
    ],
    "essential-hooks": [
      "set -e\n\nAPT_CONFIG=\"$MMDEBSTRAP_APT_CONFIG\" \\\napt-get install -oDPkg::Chroot-Directory=\"$1\" -y \\\nrsetup radxa-bootutils python-is-python3 initramfs-tools\n\nmkdir -p \"$1/boot/efi\"\nmount -t tmpfs rsdk \"$1/boot/efi\"\n",
      "echo 'Skip systemd-boot installation.'",
      "set -e\nexport SYSTEMD_RELAX_ESP_CHECKS=1\n\nAPT_CONFIG=\"$MMDEBSTRAP_APT_CONFIG\" \\\napt-get install -oDPkg::Chroot-Directory=\"$1\" -y \\\nu-boot-rock-5b linux-headers-rock-5b\n\nAPT_CONFIG=\"$MMDEBSTRAP_APT_CONFIG\" \\\napt-get install -oDPkg::Chroot-Directory=\"$1\" -y \\\nlinux-image-rock-5b\n\nAPT_CONFIG=\"$MMDEBSTRAP_APT_CONFIG\" \\\napt-get install -oDPkg::Chroot-Directory=\"$1\" -y \\\n-oDpkg::Options::=--force-confnew --install-recommends \\\ntask-rock-5b\n\nAPT_CONFIG=\"$MMDEBSTRAP_APT_CONFIG\" \\\napt-get full-upgrade -oDPkg::Chroot-Directory=\"$1\" -y \\\n-oDpkg::Options::=--force-confnew --allow-downgrades\n"
    ],
    "customize-hooks": [
      "set -e\nexport SYSTEMD_RELAX_ESP_CHECKS=1\n\nAPT_CONFIG=\"$MMDEBSTRAP_APT_CONFIG\" apt-get update -oDPkg::Chroot-Directory=\"$1\"\nAPT_CONFIG=\"$MMDEBSTRAP_APT_CONFIG\" DEBIAN_FRONTEND=noninteractive NEEDRESTART_SUSPEND=1 apt-get full-upgrade -oDPkg::Chroot-Directory=\"$1\" -y --allow-downgrades\nAPT_CONFIG=\"$MMDEBSTRAP_APT_CONFIG\" DEBIAN_FRONTEND=noninteractive NEEDRESTART_SUSPEND=1 apt-get autoremove -oDPkg::Chroot-Directory=\"$1\" -y --purge\nsed -i \"s|^deb|deb [signed-by=\\\"/usr/share/keyrings/radxa-archive-keyring.gpg\\\"]|g\" \"$1\"/etc/apt/sources.list.d/*-radxa*.list\nrm \"$1/etc/apt/sources.list.d/99-local-apt-repository.list\"\nrm \"$1/srv/local-apt-repository/Packages\"\nrm \"$1/srv/local-apt-repository/Release\"\n",
      "chroot \"$1\" update-alternatives --set regulatory.db /lib/firmware/regulatory.db-upstream",
      "echo \"127.0.1.1\trock-5b\" >> \"$1/etc/hosts\"",
      "cp \"/workspaces/rsdk/out/rock-5b_bookworm_cli/config.yaml\" \"$1/etc/rsdk/\"",
      "echo \"FINGERPRINT_VERSION='2'\" > \"$1/etc/radxa_image_fingerprint\"",
      "echo \"RSDK_BUILD_DATE='$(date -R)'\" >> \"$1/etc/radxa_image_fingerprint\"",
      "echo \"RSDK_REVISION=''\" >> \"$1/etc/radxa_image_fingerprint\"",
      "echo \"RSDK_CONFIG='/etc/rsdk/config.yaml'\" >> \"$1/etc/radxa_image_fingerprint\"",
      "chroot \"$1\" sh -c \"SYSTEMD_RELAX_ESP_CHECKS=1 update-initramfs -c -k all\"",
      "chroot \"$1\" sh -c \"u-boot-update\"",
      "cp -aR \"$1/boot/efi\" \"$1/boot/efi2\"\nchmod 0755 \"$1/boot/efi2\"\numount \"$1/boot/efi\"\nrmdir \"$1/boot/efi\"\nmv \"$1/boot/efi2\" \"$1/boot/efi\"\n",
      "mkdir -p \"/workspaces/rsdk/out/rock-5b_bookworm_cli/seed\"\ncp \"$1/etc/radxa_image_fingerprint\" \"/workspaces/rsdk/out/rock-5b_bookworm_cli/seed\"\ncp \"$1/etc/rsdk/\"* \"/workspaces/rsdk/out/rock-5b_bookworm_cli/seed\"\ntar Jvcf \"/workspaces/rsdk/out/rock-5b_bookworm_cli/seed.tar.xz\" -C \"/workspaces/rsdk/out/rock-5b_bookworm_cli/seed\" .\nrm -rf \"/workspaces/rsdk/out/rock-5b_bookworm_cli/seed\"\n"
    ],
    "cleanup-hooks": [
      "rm -rf \"$1/etc/resolv.conf\"",
      "rm -rf \"$1/var/lib/apt/lists\"/*",
      "rm -rf \"$1/etc/machine-id\" \"$1/var/lib/dbus/machine-id\"",
      "rm -rf \"$1/var/log/journal\"/*"
    ],
    "packages": [
      ...
    ]
  }
}

mmdebstraphttps://manpages.debian.org/bookworm/mmdebstrap/mmdebstrap.1.en.html

脚本中的$1: 如果 command 是 $PATH 中的现有可执行文件 , 或者如果 command 不包含任何 shell 元字符,则 command 直接执行,并将 chroot 目录的路径作为第一个参数传递

如output.log:

I: 74006 1451 running --setup-hook in shell: sh -c 'mkdir -p "$1/etc/rsdk/"' exec /workspaces/rsdk/out/rock-5b_bookworm_cli/rootfs

hook执行顺序

setup-hook, extract-hook, essential-hook -> install packages -> customize-hook

脚本输出(执行过程)

...
+ main --no-cache -M https://mirrors.lzu.edu.cn/radxa-apt/ rock-5b
+ local SCRIPT_DIR
+++ realpath /workspaces/rsdk/src/libexec/rsdk/rsdk-build
++ dirname /workspaces/rsdk/src/libexec/rsdk/rsdk-build
+ SCRIPT_DIR=/workspaces/rsdk/src/libexec/rsdk
+ source /workspaces/rsdk/src/libexec/rsdk/../../lib/rsdk/utils.sh
++ set -euo pipefail
++ shopt -s nullglob
++ LC_ALL=C
++ LANG=C.UTF-8
++ LANGUAGE=C.UTF-8
++ EXIT_SUCCESS=0
++ EXIT_UNKNOWN_OPTION=1
++ EXIT_TOO_FEW_ARGUMENTS=2
++ EXIT_UNSUPPORTED_OPTION=3
++ EXIT_SUDO_PERMISSION=4
++ EXIT_BLKDEV_NO_ROOTDEV=5
++ EXIT_DEV_SHM_TOO_SMALL=6
++ EXIT_RUNNING_AS_ROOT=7
++ EXIT_MISSING_SUBCOMMAND=8
++ EXIT_FILE_NOT_EXIST=9
++ EXIT_AUTHENTICATION_FAILED=10
++ EXIT_NOT_BLOCK_DEVICE=11
++ EXIT_RUNNING_IN_CONTAINER=12
+ local TEMP
++ getopt -o hdTm:M:i:k:f:p:s: -l no-efi,help,debug,test-repo,mirror:,image-name:,no-cache,override-kernel:,override-firmware:,override-product:,no-vendor-packages,debs:,sdboot,sector-size: -n /work
+ eval set -- ' --no-cache -M '\''https://mirrors.lzu.edu.cn/radxa-apt/'\'' -- '\''rock-5b'\'''
++ set -- --no-cache -M https://mirrors.lzu.edu.cn/radxa-apt/ -- rock-5b
+ local RSDK_OPTION_EFI=true
+ local RSDK_OPTION_DEBUG=false
+ local RSDK_OPTION_REPO_SUFFIX=
+ local RSDK_OPTION_DISTRO_MIRROR=
+ local RSDK_OPTION_RADXA_MIRROR=
+ local RSDK_OPTION_ROOTFS=rootfs.tar
++ /workspaces/rsdk/src/libexec/rsdk/../../bin/rsdk config build.default_image_name
+ local RSDK_OPTION_IMAGE_NAME=output.img
+ local RSDK_OPTION_CACHE=true
+ local RSDK_OPTION_KERNEL_OVERRIDE=
+ local RSDK_OPTION_FIRMWARE_OVERRIDE=
+ local RSDK_OPTION_PRODUCT_OVERRIDE=
+ local RSDK_OPTION_VENDOR_PACKAGES=true
+ local RSDK_OPTION_LOCAL_APT_ARCHIVE=
+ local RSDK_OPTION_SYSTEMD_BOOT=false
+ local RSDK_OPTION_SECTOR_SIZE=512
+ true
+ TEMP=--no-cache
+ shift
+ case "$TEMP" in
+ RSDK_OPTION_CACHE=false
+ true
+ TEMP=-M
+ shift
+ case "$TEMP" in
+ RSDK_OPTION_RADXA_MIRROR=https://mirrors.lzu.edu.cn/radxa-apt/
+ shift
+ true
+ TEMP=--
+ shift
+ case "$TEMP" in
+ break
+ (( 1 == 0 ))
+ local PRODUCT=rock-5b SUITE EDITION
+ jq -er --arg product rock-5b '.[] | select(.product == $product)' /workspaces/rsdk/src/libexec/rsdk/../../share/rsdk/configs/products.json
++ jq -er --arg product rock-5b '.[] | select(.product == $product).supported_suite[0]' /workspaces/rsdk/src/libexec/rsdk/../../share/rsdk/configs/products.json
+ SUITE=bookworm
++ jq -er --arg product rock-5b '.[] | select(.product == $product).supported_edition[0]' /workspaces/rsdk/src/libexec/rsdk/../../share/rsdk/configs/products.json
+ EDITION=kde
+ local OUTPUT=/workspaces/rsdk/out/rock-5b_bookworm_kde
+ mkdir -p /workspaces/rsdk/out/rock-5b_bookworm_kde
+ echo 'Building rock-5b bookworm kde...'
+ [[ false == \f\a\l\s\e ]]
+ sudo rm -rf /workspaces/rsdk/out/rock-5b_bookworm_kde/rootfs.tar
+ /usr/bin/env sudo --preserve-env=PATH -s rm -rf /workspaces/rsdk/out/rock-5b_bookworm_kde/rootfs.tar
+ [[ ! -e /workspaces/rsdk/out/rock-5b_bookworm_kde/rootfs.tar ]]
+ generate_rootfs
+ local RSDK_TEMP
++ mktemp -d /tmp/rsdk.rock-5b_bookworm_kde.XXXXXXXX
+ RSDK_TEMP=/tmp/rsdk.rock-5b_bookworm_kde.01UepVjk
+ chmod 0755 /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk
+ [[ false == \t\r\u\e ]]
++ date --iso-8601=s
+ JSONNET_ARGS=('--tla-str' 'product=rock-5b' '--tla-str' 'suite=bookworm' '--tla-str' 'edition=kde' '--tla-str' 'temp_dir=/tmp/rsdk.rock-5b_bookworm_kde.01UepVjk' '--tla-str' 'output_dir=/workspace
+ BDEBSTRAP_ARGS=()
+ local BDEBSTRAP_ARGS
+ [[ false == \t\r\u\e ]]
+ [[ -n rootfs.tar ]]
+ JSONNET_ARGS+=("--tla-str" "rootfs=$RSDK_OPTION_ROOTFS")
+ [[ -n '' ]]
+ [[ -n https://mirrors.lzu.edu.cn/radxa-apt/ ]]
+ JSONNET_ARGS+=("--tla-str" "radxa_mirror=$RSDK_OPTION_RADXA_MIRROR")
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ [[ -n true ]]
+ JSONNET_ARGS+=("--tla-code" "vendor_packages=$RSDK_OPTION_VENDOR_PACKAGES")
+ [[ -n false ]]
+ JSONNET_ARGS+=("--ext-code" "sdboot=$RSDK_OPTION_SYSTEMD_BOOT")
+ prepare_keyrings /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings/
+ OUTPUT_DIR=/tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings/
+ mkdir -p /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings/
+ [[ -e /usr/share/keyrings/ ]]
+ cp -r /usr/share/keyrings/. /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings/
+ local keyrings=/workspaces/rsdk/src/libexec/rsdk/../../../externals/keyrings
+ [[ -e /workspaces/rsdk/src/libexec/rsdk/../../../externals/keyrings ]]
+ cp -r /workspaces/rsdk/src/libexec/rsdk/../../../externals/keyrings/debian/apt-trusted-asc/. /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings/
+ cp -r /workspaces/rsdk/src/libexec/rsdk/../../../externals/keyrings/radxa/keyrings/. /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings/
+ cp -r /workspaces/rsdk/src/libexec/rsdk/../../../externals/keyrings/ubuntu/keyrings/. /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings/
+ cp -r /workspaces/rsdk/src/libexec/rsdk/../../../externals/keyrings/vscodium/pub.gpg /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings/
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bookworm-automatic.asc
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bookworm-automatic.asc
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bookworm-security-automatic.asc
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bookworm-security-automatic.asc
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bookworm-stable.asc
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bookworm-stable.asc
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bullseye-automatic.asc
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bullseye-automatic.asc
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bullseye-security-automatic.asc
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bullseye-security-automatic.asc
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bullseye-stable.asc
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-bullseye-stable.asc
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-buster-automatic.asc
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-buster-automatic.asc
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-buster-security-automatic.asc
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-buster-security-automatic.asc
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-buster-stable.asc
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//debian-archive-buster-stable.asc
+ for i in "$OUTPUT_DIR"/*.asc "$OUTPUT_DIR/pub.gpg"
+ gpg --dearmor /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//pub.gpg
+ rm /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/keyrings//pub.gpg

+ [[ -d '' ]]
+ mkdir -p /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/debs
+ jsonnet --tla-str product=rock-5b --tla-str suite=bookworm --tla-str edition=kde --tla-str temp_dir=/tmp/rsdk.rock-5b_bookworm_kde.01UepVjk --tla-str output_dir=/workspaces/rsdk/out/rock-5b_bookwo
+ sudo bdebstrap -c /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/rootfs.json --name /workspaces/rsdk/out/rock-5b_bookworm_kde --force
+ /usr/bin/env sudo --preserve-env=PATH -s bdebstrap -c /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/rootfs.json --name /workspaces/rsdk/out/rock-5b_bookworm_kde --force
...

+ sudo chown 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde
+ /usr/bin/env sudo --preserve-env=PATH -s chown 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde
+ for i in "$OUTPUT"/*
+ [[ /workspaces/rsdk/out/rock-5b_bookworm_kde/config.yaml != \/\w\o\r\k\s\p\a\c\e\s\/\r\s\d\k\/\o\u\t\/\r\o\c\k\-\5\b\_\b\o\o\k\w\o\r\m\_\k\d\e\/\r\o\o\t\f\s\.\t\a\r ]]
+ sudo chown -R 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde/config.yaml
+ /usr/bin/env sudo --preserve-env=PATH -s chown -R 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde/config.yaml
+ for i in "$OUTPUT"/*
+ [[ /workspaces/rsdk/out/rock-5b_bookworm_kde/manifest != \/\w\o\r\k\s\p\a\c\e\s\/\r\s\d\k\/\o\u\t\/\r\o\c\k\-\5\b\_\b\o\o\k\w\o\r\m\_\k\d\e\/\r\o\o\t\f\s\.\t\a\r ]]
+ sudo chown -R 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde/manifest
+ /usr/bin/env sudo --preserve-env=PATH -s chown -R 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde/manifest
+ for i in "$OUTPUT"/*
+ [[ /workspaces/rsdk/out/rock-5b_bookworm_kde/rootfs.tar != \/\w\o\r\k\s\p\a\c\e\s\/\r\s\d\k\/\o\u\t\/\r\o\c\k\-\5\b\_\b\o\o\k\w\o\r\m\_\k\d\e\/\r\o\o\t\f\s\.\t\a\r ]]
+ [[ -f /workspaces/rsdk/out/rock-5b_bookworm_kde/rootfs.tar ]]
+ sudo chown -R 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde/rootfs.tar
+ /usr/bin/env sudo --preserve-env=PATH -s chown -R 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde/rootfs.tar
+ for i in "$OUTPUT"/*
+ [[ /workspaces/rsdk/out/rock-5b_bookworm_kde/seed.tar.xz != \/\w\o\r\k\s\p\a\c\e\s\/\r\s\d\k\/\o\u\t\/\r\o\c\k\-\5\b\_\b\o\o\k\w\o\r\m\_\k\d\e\/\r\o\o\t\f\s\.\t\a\r ]]
+ sudo chown -R 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde/seed.tar.xz

+ /usr/bin/env sudo --preserve-env=PATH -s chown -R 1000:1000 /workspaces/rsdk/out/rock-5b_bookworm_kde/seed.tar.xz
+ cp -R /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk/debs/. /workspaces/rsdk/out/rock-5b_bookworm_kde/debs
+ rm -rf /tmp/rsdk.rock-5b_bookworm_kde.01UepVjk

[3/3] gen image

build-image

out/rock-5b_bookworm_cli/build-image:

#!/usr/bin/env -S guestfish -f

!echo "Image generation started at $(date)."
echo "Allocating image file..."
!rm -f "output.img"
disk-create "output.img" raw 9G
add-drive "output.img" format:raw discard:besteffort blocksize:512
run

echo "Creating partition table..."
part-init /dev/sda gpt
part-add /dev/sda primary 32768 65535
part-add /dev/sda primary 65536 679935
part-set-bootable /dev/sda 2 true
part-add /dev/sda primary 679936 -34
part-set-bootable /dev/sda 3 true
part-set-gpt-type /dev/sda 2 C12A7328-F81F-11D2-BA4B-00A0C93EC93B
part-set-gpt-attributes /dev/sda 2 4
part-set-gpt-attributes /dev/sda 3 4

echo "Formatting partitions..."
mkfs vfat /dev/sda1 label:config
mkfs vfat /dev/sda2 label:efi
mkfs ext4 /dev/sda3 label:rootfs

echo "Mounting partitions..."
mount /dev/sda3 /
mkdir-p /config
mount /dev/sda1 /config
mkdir-p /boot/efi
mount /dev/sda2 /boot/efi

echo "Deploying rootfs..."
tar-in rootfs.tar / xattrs:true

echo "Copying content from rootfs..."
!mkdir -p "./temp_dir"
copy-out /etc/kernel/cmdline "./temp_dir"
copy-out /boot/extlinux/extlinux.conf "./temp_dir"
!mkdir -p "./temp_dir/u-boot"
copy-out /usr/lib/u-boot/ "./temp_dir"

echo "Updating files with disk info..."
blkid /dev/sda1 | grep "^UUID:" | cut -d " " -f 2 | xargs printf "UUID=%s /config vfat defaults,x-systemd.automount,fmask=0077,dmask=0077 0 2\n" > "./temp_dir/fstab"
blkid /dev/sda2 | grep "^UUID:" | cut -d " " -f 2 | xargs printf "UUID=%s /boot/efi vfat defaults,x-systemd.automount,fmask=0077,dmask=0077 0 2\n" >> "./temp_dir/fstab"
blkid /dev/sda3 | grep "^UUID:" | cut -d " " -f 2 | xargs printf "UUID=%s / ext4 defaults 0 1\n" >> "./temp_dir/fstab"
blkid /dev/sda3 | grep "^UUID:" | cut -d " " -f 2 > "./temp_dir/rootfs_uuid"
!sed -i "s/root=[^[:space:]]*/root=UUID=$(cat "./temp_dir/rootfs_uuid")/g" "./temp_dir/extlinux.conf"
!sed -i "s/$/ root=UUID=$(cat "./temp_dir/rootfs_uuid")/g" "./temp_dir/cmdline"
copy-in "./temp_dir/fstab" /etc/
copy-in "./temp_dir/extlinux.conf" /boot/extlinux/
copy-in "./temp_dir/cmdline" /etc/kernel/

echo "Shrinking rootfs..."
unmount-all
resize2fs-M /dev/sda3
tune2fs-l /dev/sda3 | cat > "./temp_dir/tune2fs"
!echo "resizepart 3" > "./temp_dir/parted"
!echo "$(( $(sgdisk -i 3 "output.img" | grep "First sector:" | cut -d " " -f 3) * 512 + $(grep "Block count:" ./temp_dir/tune2fs | cut -d " " -f 3) * $(grep "Block size:" ./temp_dir/tune2fs | cut -d " " -f 3) ))B" >> "./temp_dir/parted"
!echo "yes" >> "./temp_dir/parted"
sync
shutdown
!cat "./temp_dir/parted" | parted ---pretend-input-tty "output.img" > /dev/null 2>&1
!truncate "--size=$(( ( $(sgdisk -i 3 "output.img" | grep "Last sector:" | cut -d " " -f 3) + 34 ) * 512 ))" "output.img"

echo "Fixing partition table..."
echo "NOTICE: Some issues are expected result of shrinking the disk."
!sgdisk -ge "output.img" > /dev/null 2>&1 || true

echo "Installing bootloader..."
shutdown
!chmod +x "./temp_dir/u-boot/rock-5b/setup.sh"
!"./temp_dir/u-boot/rock-5b/setup.sh" update_bootloader "output.img" 512 2> /dev/null

echo "Enlarging rootfs to the underlying block device..."
shutdown
add-drive "output.img" format:raw discard:besteffort blocksize:512
run
resize2fs /dev/sda3
shutdown

echo "Cleaning up..."
!rm -rf "./temp_dir"
!sync

echo "Deploy succeed!"
!echo "Image generation finished at $(date)."

explain

echo "Creating partition table..."
part-init /dev/sda gpt
part-add /dev/sda primary 32768 65535
part-add /dev/sda primary 65536 679935
part-set-bootable /dev/sda 2 true
part-add /dev/sda primary 679936 -34
part-set-bootable /dev/sda 3 true
part-set-gpt-type /dev/sda 2 C12A7328-F81F-11D2-BA4B-00A0C93EC93B
part-set-gpt-attributes /dev/sda 2 4
part-set-gpt-attributes /dev/sda 3 4
  • 32768 = 0x40 * 512 = 64 * 512

  • rootfs构建过程中安装u-boot安装包, 对应 radxa bsp u-boot编译结果中的u-boot-rk2410_2017.09-999_arm64.deb

  • 其内容有个./usr/lib/u-boot/rock-5b/setup.sh脚本, 在build image脚本中去执行./usr/lib/u-boot/rock-5b/setup.sh将u-boot相关文件固化到启动介质中特定的位置

build-image output

+ generate_image
+ [[ ! -e /workspaces/rsdk/out/rock-5b_bookworm_kde/build-image ]]
+ JSONNET_ARGS=('-S' '--tla-str' 'product=rock-5b')
+ local JSONNET_ARGS
+ [[ -n true ]]
+ JSONNET_ARGS+=("--tla-code" "efi=$RSDK_OPTION_EFI")
+ [[ -n rootfs.tar ]]
+ JSONNET_ARGS+=("--tla-str" "rootfs=$RSDK_OPTION_ROOTFS")
+ [[ -n output.img ]]
+ JSONNET_ARGS+=("--tla-str" "output=$RSDK_OPTION_IMAGE_NAME")
+ [[ -n false ]]
+ JSONNET_ARGS+=("--tla-code" "sdboot=$RSDK_OPTION_SYSTEMD_BOOT")
+ [[ -n 512 ]]
+ JSONNET_ARGS+=("--tla-code" "sector_size=$RSDK_OPTION_SECTOR_SIZE")
+ [[ -n bookworm ]]
+ JSONNET_ARGS+=("--tla-str" "suite=$SUITE")

+ jsonnet -S --tla-str product=rock-5b --tla-code efi=true --tla-str rootfs=rootfs.tar --tla-str output=output.img --tla-code sdboot=false --tla-code sector_size=512 --tla-str suite=bookworm /workspaces/rsdk/src/libexec/rsdk/../../share/rsdk/build/image.jsonnet -o /workspaces/rsdk/out/rock-5b_bookworm_kde/build-image                                                                              
+ chmod +x /workspaces/rsdk/out/rock-5b_bookworm_kde/build-image
+ pushd /workspaces/rsdk/out/rock-5b_bookworm_kde
/workspaces/rsdk/out/rock-5b_bookworm_kde /workspaces/rsdk
+ [[ -f rootfs.tar ]]
+ ./build-image
Image generation started at Tue May 13 09:36:34 UTC 2025.
Allocating image file...
Creating partition table...
Formatting partitions...
Mounting partitions...
Deploying rootfs...

Copying content from rootfs...
Updating files with disk info...
Shrinking rootfs...
Fixing partition table...
NOTICE: Some issues are expected result of shrinking the disk.
Installing bootloader...
Enlarging rootfs to the underlying block device...
Cleaning up...
Deploy succeed!
Image generation finished at Tue May 13 09:38:34 UTC 2025.
+ popd

附:完整日志

posted @ 2025-06-15 15:03  LiYanbin  阅读(89)  评论(0)    收藏  举报