Compare commits

..

4 Commits

Author SHA1 Message Date
mofeng-git
3c44f9e733 feat: 新增香橙派 Zero One 设备构建支持
- 在 build_img.sh 中新增 orangepi-zero 构建目标支持
- 添加 orangepizero_rootfs 函数处理 Armbian 镜像准备和分区调整
- 实现 config_orangepizero_files 函数清空模块配置优化启动
- 更新 GitHub Actions 工作流支持 orangepi-zero 设备 CI 构建
- 针对低内存设备优化配置,扩展 600MB 存储空间
- 完善构建系统支持更多单板计算机平台
2025-09-19 22:39:16 +08:00
mofeng-git
4d4f528178 feat: 增强构建系统功能和设备兼容性
- 在 common.sh 中新增 download_rc_local 函数,支持自动下载平台特定的 rc.local 文件
- 集成 rc.local 自动下载到 install.sh 的 config_base_files 函数中
- 更新 cumebox2 设备配置,使用较新的 Armbian 镜像版本并增加 900MB 扩展空间
- 更新 octopus-flanet 设备使用最新的 Armbian 25.05.0 镜像
- 在 udev 规则中为 ttyUSB0 设备添加 kvmd-hid 符号链接支持
- 完善文件下载机制,支持 GitHub Actions 环境下的临时文件清理
2025-09-19 20:15:37 +08:00
SilentWind
201c615ce2 Merge pull request #178 from mofeng-git/dev
适配 Onecloud Pro 设备
2025-09-19 15:53:13 +08:00
mofeng-git
8cc9e22c91 适配 Onecloud Pro 设备 2025-09-19 15:52:30 +08:00
8 changed files with 168 additions and 18 deletions

View File

@@ -9,11 +9,13 @@ on:
type: choice
options:
- onecloud
- onecloud-pro
- cumebox2
- chainedbox
- vm
- e900v22c
- octopus-flanet
- orangepi-zero
- all
create_release:
description: 'Create GitHub Release'

View File

@@ -59,7 +59,7 @@ build_target() {
onecloud)
onecloud_rootfs
local arch="armhf"
local device_type="gpio"
local device_type="gpio-onecloud"
local network_type="systemd-networkd"
;;
cumebox2)
@@ -97,6 +97,20 @@ build_target() {
local network_type=""
NEED_PREPARE_DNS=true
;;
onecloud-pro)
onecloud_pro_rootfs
local arch="aarch64"
local device_type="gpio-onecloud-pro video1"
local network_type=""
NEED_PREPARE_DNS=true
;;
orangepi-zero)
orangepizero_rootfs
local arch="armhf"
local device_type=""
local network_type=""
NEED_PREPARE_DNS=true
;;
*)
echo "错误:未知或不支持的目标 '$target'" >&2
exit 1
@@ -124,12 +138,18 @@ build_target() {
chainedbox)
pack_img "Chainedbox"
;;
e900v22c)
e900v22c)
pack_img "E900v22c"
;;
octopus-flanet)
octopus-flanet)
pack_img "Octopus-Flanet"
;;
onecloud-pro)
pack_img "Onecloud-Pro"
;;
orangepi-zero)
pack_img "Orangepi-Zero"
;;
*)
echo "错误:未知的打包类型 for '$target'" >&2
;;
@@ -148,7 +168,7 @@ build_target() {
# 检查是否提供了目标参数
if [ -z "$1" ]; then
echo "用法: $0 <target|all>"
echo "可用目标: onecloud, cumebox2, chainedbox, vm, e900v22c, octopus-flanet"
echo "可用目标: onecloud, cumebox2, chainedbox, vm, e900v22c, octopus-flanet, onecloud-pro, orangepi-zero"
exit 1
fi
@@ -167,6 +187,8 @@ if [ "$1" = "all" ]; then
build_target "vm"
build_target "e900v22c"
build_target "octopus-flanet"
build_target "onecloud-pro"
build_target "orangepi-zero"
echo "信息:所有目标构建完成。"
else
build_target "$1"

View File

@@ -244,6 +244,37 @@ download_file_if_missing() {
return 1
}
# 下载 rc.local 文件
download_rc_local() {
local platform_id="$1"
local rc_local_path="$SRCPATH/image/$platform_id/rc.local"
local relative_path="image/$platform_id/rc.local"
local remote_url="$REMOTE_PREFIX/$relative_path"
echo "信息:检查是否需要下载 rc.local 文件 ($platform_id)..."
# 如果本地文件不存在,尝试下载
if [ ! -f "$rc_local_path" ]; then
echo "信息:本地 rc.local 文件不存在,尝试从远程下载..."
ensure_dir "$(dirname "$rc_local_path")"
if curl -sSL --fail "$remote_url" -o "$rc_local_path"; then
echo "信息:成功下载 rc.local 文件:$remote_url"
# 在 GitHub Actions 环境中记录下载的文件
if is_github_actions; then
echo "$rc_local_path" >> "$DOWNLOADED_FILES_LIST"
fi
return 0
else
echo "信息:远程 rc.local 文件不存在或下载失败:$remote_url"
return 1
fi
else
echo "信息:使用本地 rc.local 文件:$rc_local_path"
return 0
fi
}
# 清理下载的文件(仅在 GitHub Actions 环境中)
cleanup_downloaded_files() {
if is_github_actions && [[ -f "$DOWNLOADED_FILES_LIST" ]]; then

View File

@@ -10,7 +10,7 @@ onecloud_rootfs() {
local bootfs_sparse="$TMPDIR/6.boot.PARTITION.sparse"
local rootfs_sparse="$TMPDIR/7.rootfs.PARTITION.sparse"
local bootfs_loopdev="" # 存储 bootfs 使用的 loop 设备
local add_size_mb=400
local add_size_mb=600
echo "信息:准备 Onecloud Rootfs..."
ensure_dir "$TMPDIR"
@@ -66,9 +66,10 @@ onecloud_rootfs() {
}
cumebox2_rootfs() {
local source_image="$SRCPATH/image/cumebox2/Armbian_25.2.2_Khadas-vim1_bookworm_current_6.12.17_minimal.img"
local source_image="$SRCPATH/image/cumebox2/Armbian_24.8.1_Khadas-vim1_bookworm_current_6.6.47_minimal.img"
local target_image="$TMPDIR/rootfs.img"
local offset=$((8192 * 512))
local add_size_mb=900
echo "信息:准备 Cumebox2 Rootfs..."
ensure_dir "$TMPDIR"
@@ -77,7 +78,10 @@ cumebox2_rootfs() {
download_file_if_missing "$source_image" || { echo "错误:下载 Cumebox2 原始镜像失败" >&2; exit 1; }
cp "$source_image" "$target_image" || { echo "错误:复制 Cumebox2 原始镜像失败" >&2; exit 1; }
echo "信息:扩展镜像文件 (${add_size_mb}MB)..."
sudo dd if=/dev/zero bs=1M count="$add_size_mb" >> "$target_image" || { echo "错误:扩展镜像文件失败" >&2; exit 1; }
echo "信息:调整镜像分区大小..."
sudo parted -s "$target_image" resizepart 1 100% || { echo "错误:使用 parted 调整分区大小失败" >&2; exit 1; }
@@ -159,7 +163,7 @@ e900v22c_rootfs() {
local source_image="$SRCPATH/image/e900v22c/Armbian_23.08.0_amlogic_s905l3a_bookworm_5.15.123_server_2023.08.01.img"
local target_image="$TMPDIR/rootfs.img"
local offset=$((532480 * 512))
local add_size_mb=400
local add_size_mb=600
echo "信息:准备 E900V22C Rootfs..."
ensure_dir "$TMPDIR"
@@ -188,11 +192,11 @@ e900v22c_rootfs() {
}
octopus_flanet_rootfs() {
local source_image="$SRCPATH/image/octopus-flanet/Armbian_24.11.0_amlogic_s912_bookworm_6.1.114_server_2024.11.01.img"
local source_image="$SRCPATH/image/octopus-flanet/Armbian_25.05.0_amlogic_s912_bookworm_6.1.129_server_2025.03.02.img"
local target_image="$TMPDIR/rootfs.img"
local boot_offset=$((8192 * 512))
local rootfs_offset=$((1056768 * 512))
local add_size_mb=400
local add_size_mb=600
local bootfs_loopdev=""
echo "信息:准备 Octopus-Planet Rootfs..."
@@ -231,6 +235,71 @@ octopus_flanet_rootfs() {
echo "信息Octopus-Planet Rootfs 准备完成loop 设备 $LOOPDEV 已就绪。"
}
onecloud_pro_rootfs() {
local source_image="$SRCPATH/image/onecloud-pro/Armbian-by-SilentWind_24.5.0_amlogic_Onecloud-Pro_jammy_6.6.28_server.img"
local target_image="$TMPDIR/rootfs.img"
local boot_offset=$((8192 * 512))
local rootfs_offset=$((1056768 * 512))
local add_size_mb=600
local bootfs_loopdev=""
echo "信息:准备 Octopus-Planet Rootfs..."
ensure_dir "$TMPDIR"; ensure_dir "$BOOTFS"
# 自动下载源镜像文件(如果不存在)
download_file_if_missing "$source_image" || { echo "错误:下载 Octopus-Planet 原始镜像失败" >&2; exit 1; }
cp "$source_image" "$target_image" || { echo "错误:复制 Octopus-Planet 原始镜像失败" >&2; exit 1; }
echo "信息:调整镜像分区大小 (分区 2)..."
sudo parted -s "$target_image" resizepart 2 100% || { echo "错误:使用 parted 调整分区 2 大小失败" >&2; exit 1; }
echo "信息:设置 rootfs 分区的 loop 设备..."
find_loop_device # 找 loop 给 rootfs
echo "信息:将 $target_image (偏移 $rootfs_offset) 关联到 $LOOPDEV..."
sudo losetup --offset "$rootfs_offset" "$LOOPDEV" "$target_image" || { echo "错误:设置 rootfs 分区 loop 设备 $LOOPDEV 失败" >&2; exit 1; }
echo "信息:检查并调整文件系统大小 (在 loop 设备上)..."
sudo e2fsck -f -y "$LOOPDEV" || { echo "警告e2fsck 检查 $LOOPDEV 失败" >&2; exit 1; }
sudo resize2fs "$LOOPDEV" || { echo "错误resize2fs 调整 $LOOPDEV 大小失败" >&2; exit 1; }
echo "信息Octopus-Planet Rootfs 准备完成loop 设备 $LOOPDEV 已就绪。"
}
orangepizero_rootfs() {
local source_image="$SRCPATH/image/orangepi-zero/Armbian_community_25.11.0-trunk.208_Orangepizero_bookworm_current_6.12.47_minimal.img"
local target_image="$TMPDIR/rootfs.img"
local offset=$((8192 * 512))
local add_size_mb=600
echo "信息:准备 Orange Pi Zero Rootfs..."
ensure_dir "$TMPDIR"
echo "信息:下载或使用本地 Orange Pi Zero 原始镜像..."
download_file_if_missing "$source_image" || { echo "错误:下载 Orange Pi Zero 原始镜像失败" >&2; exit 1; }
cp "$source_image" "$target_image" || { echo "错误:复制 Orange Pi Zero 原始镜像失败" >&2; exit 1; }
echo "信息:扩展镜像文件 (${add_size_mb}MB)..."
sudo dd if=/dev/zero bs=1M count="$add_size_mb" >> "$target_image" || { echo "错误:扩展镜像文件失败" >&2; exit 1; }
echo "信息:调整镜像分区大小..."
sudo parted -s "$target_image" resizepart 1 100% || { echo "错误:使用 parted 调整分区大小失败" >&2; exit 1; }
find_loop_device
sudo losetup -P "$LOOPDEV" "$target_image" || { echo "错误:设置 loop 设备失败" >&2; exit 1; }
echo "信息:检查并调整文件系统大小..."
sudo e2fsck -y -f "${LOOPDEV}p1" || { echo "错误:文件系统检查失败" >&2; exit 1; }
sudo resize2fs "${LOOPDEV}p1" || { echo "错误:调整文件系统大小失败" >&2; exit 1; }
# 重新设置 LOOPDEV 为分区
sudo losetup -d "$LOOPDEV"
sudo losetup "$LOOPDEV" "$target_image" -o "$offset" || { echo "错误:重新设置 loop 设备失败" >&2; exit 1; }
echo "信息Orange Pi Zero Rootfs 准备完成。"
}
# --- 特定设备的文件配置函数 ---
config_cumebox2_files() {
@@ -255,11 +324,20 @@ config_cumebox2_files() {
config_octopus_flanet_files() {
echo "信息:为 Octopus-Planet 配置特定文件 (model_database.conf)..."
# 自动下载 Octopus-Planet 相关文件(如果不存在)
local config_file="$SRCPATH/image/octopus-flanet/model_database.conf"
download_file_if_missing "$config_file" || echo "警告:下载 Octopus-Planet 配置文件失败"
sudo cp "$config_file" "$ROOTFS/etc/model_database.conf" || echo "警告:复制 model_database.conf 失败"
}
}
config_orangepizero_files() {
echo "信息:配置 Orange Pi Zero 特定文件..."
# 清空 modules.conf 文件,避免加载不必要的模块
run_in_chroot "echo '' > /etc/modules-load.d/modules.conf"
echo "信息Orange Pi Zero 特定配置完成。"
}

View File

@@ -10,7 +10,7 @@ prepare_dns_and_mirrors() {
&& printf '%s\\n' 'nameserver 1.1.1.1' 'nameserver 1.0.0.1' > /etc/resolv.conf \\
&& echo '信息:尝试更换镜像源...' \\
&& bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/ChangeMirrors.sh) \\
--source mirrors.tuna.tsinghua.edu.cn --upgrade-software false --web-protocol http || echo '警告:更换镜像源脚本执行失败,可能网络不通或脚本已更改'
--source mirrors.ustc.edu.cn --upgrade-software false --web-protocol http || echo '警告:更换镜像源脚本执行失败,可能网络不通或脚本已更改'
"
}
@@ -77,6 +77,8 @@ config_base_files() {
sudo cp scripts/kvmd-gencert scripts/kvmd-bootconfig scripts/kvmd-certbot scripts/kvmd-udev-hdmiusb-check scripts/kvmd-udev-restart-pass build/scripts/kvmd-firstrun.sh "$ROOTFS/usr/bin/"
sudo chmod +x "$ROOTFS/usr/bin/kvmd-gencert" "$ROOTFS/usr/bin/kvmd-bootconfig" "$ROOTFS/usr/bin/kvmd-certbot" "$ROOTFS/usr/bin/kvmd-udev-hdmiusb-check" "$ROOTFS/usr/bin/kvmd-udev-restart-pass" "$ROOTFS/usr/bin/kvmd-firstrun.sh"
# 尝试下载或使用本地 rc.local 文件
download_rc_local "$platform_id"
if [ -f "$SRCPATH/image/$platform_id/rc.local" ]; then
echo "信息:复制设备特定的 rc.local 文件..."
sudo cp "$SRCPATH/image/$platform_id/rc.local" "$ROOTFS/etc/"
@@ -246,7 +248,15 @@ apply_kvmd_tweaks() {
# 根据 device_type 配置 ATX
if [ "$device_type" = "gpio" ]; then
if [[ "$device_type" == *"gpio-onecloud-pro"* ]]; then
echo "信息:电源控制设备类型为 gpio设置 ATX 为 GPIO 并配置引脚..."
atx_setting="GPIO"
run_in_chroot "
sed -i 's/^ATX=.*/ATX=GPIO/' /etc/kvmd/atx.sh && \\
sed -i 's/SHUTDOWNPIN/gpiochip0 7/g' /etc/kvmd/custom_atx/gpio.sh && \\
sed -i 's/REBOOTPIN/gpiochip0 11/g' /etc/kvmd/custom_atx/gpio.sh
"
elif [[ "$device_type" == *"gpio-onecloud"* ]]; then
echo "信息:电源控制设备类型为 gpio设置 ATX 为 GPIO 并配置引脚..."
atx_setting="GPIO"
run_in_chroot "
@@ -261,10 +271,10 @@ apply_kvmd_tweaks() {
fi
# 配置视频设备
if [ "$device_type" = "video1" ]; then
if [[ "$device_type" == *"video1"* ]]; then
echo "信息:视频设备类型为 video1设置视频设备为 /dev/video1..."
run_in_chroot "sed -i 's|/dev/video0|/dev/video1|g' /etc/kvmd/override.yaml"
elif [ "$device_type" = "kvmd-video" ]; then
elif [[ "$device_type" == *"video1"* ]]; then
echo "信息:视频设备类型为 kvmd-video设置视频设备为 /dev/kvmd-video..."
run_in_chroot "sed -i 's|/dev/video0|/dev/kvmd-video|g' /etc/kvmd/override.yaml"
else

View File

@@ -0,0 +1,3 @@
PIKVM_MODEL=v2_model
PIKVM_VIDEO=usb_video
PIKVM_BOARD=onecloud-pro

View File

@@ -0,0 +1,3 @@
PIKVM_MODEL=v2_model
PIKVM_VIDEO=usb_video
PIKVM_BOARD=orangepi-zero

View File

@@ -4,3 +4,4 @@ KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", PROGRAM="/usr/bin/kvmd-udev-hdm
KERNEL=="hidg0", GROUP="kvmd", SYMLINK+="kvmd-hid-keyboard"
KERNEL=="hidg1", GROUP="kvmd", SYMLINK+="kvmd-hid-mouse"
KERNEL=="hidg2", GROUP="kvmd", SYMLINK+="kvmd-hid-mouse-alt"
KERNEL=="ttyUSB0", GROUP="kvmd", SYMLINK+="kvmd-hid"