mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-14 18:20:30 +08:00
Compare commits
No commits in common. "main" and "v0.56" have entirely different histories.
@ -1,19 +0,0 @@
|
||||
[bumpversion]
|
||||
commit = True
|
||||
tag = True
|
||||
current_version = 4.94
|
||||
parse = (?P<major>\d+)\.(?P<minor>\d+)(\.(?P<patch>\d+)(\-(?P<release>[a-z]+))?)?
|
||||
serialize =
|
||||
{major}.{minor}
|
||||
|
||||
[bumpversion:file:kvmd/__init__.py]
|
||||
search = __version__ = "{current_version}"
|
||||
replace = __version__ = "{new_version}"
|
||||
|
||||
[bumpversion:file:setup.py]
|
||||
search = version="{current_version}"
|
||||
replace = version="{new_version}"
|
||||
|
||||
[bumpversion:file:PKGBUILD]
|
||||
search = pkgver={current_version}
|
||||
replace = pkgver={new_version}
|
||||
@ -1,23 +0,0 @@
|
||||
/pkg/
|
||||
/src/
|
||||
/site/
|
||||
/dist/
|
||||
/kvmd.egg-info/
|
||||
/testenv/run/
|
||||
/testenv/.tox/
|
||||
/testenv/.mypy_cache/
|
||||
/testenv/.ssl/
|
||||
/hid/arduino/.pio/
|
||||
/hid/arduino/.platformio/
|
||||
/hid/pico/.pico-sdk.tmp/
|
||||
/hid/pico/.pico-sdk/
|
||||
/hid/pico/.tinyusb.tmp/
|
||||
/hid/pico/.tinyusb/
|
||||
/hid/pico/.build/
|
||||
/hid/pico/*.uf2
|
||||
/.git/
|
||||
/v*.tar.gz
|
||||
/*.pkg.tar.xz
|
||||
/*.pkg.tar.zst
|
||||
/*.egg-info
|
||||
/*kvmd-*.tar.gz
|
||||
@ -1,10 +0,0 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_file = lf
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
[*.{py,yaml}]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@ -1,2 +0,0 @@
|
||||
# These are supported funding model platforms
|
||||
custom: https://afdian.com/a/silentwind
|
||||
36
.github/ISSUE_TEMPLATE/bug-反馈.md
vendored
36
.github/ISSUE_TEMPLATE/bug-反馈.md
vendored
@ -1,36 +0,0 @@
|
||||
---
|
||||
name: BUG 反馈
|
||||
about: 反馈你所遇到的软件 BUG 或其他错误
|
||||
title: "[BUG]"
|
||||
labels: BUG
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### **Bug 反馈**
|
||||
|
||||
**问题描述**
|
||||
请清晰描述您遇到的问题。例如:软件无法启动、特定功能报错或表现异常等。
|
||||
|
||||
**复现步骤**
|
||||
请提供可复现此问题的详细步骤:
|
||||
1. 前往 '...'
|
||||
2. 点击 '....'
|
||||
3. 滚动到 '....'
|
||||
4. 发现错误
|
||||
|
||||
**日志信息**
|
||||
如果程序崩溃或报错,请在此处粘贴相关的日志。
|
||||
- **整合包镜像**: `systemctl status kvmd` 或 `journalctl -xeu kvmd`
|
||||
- **Docker 镜像**: `docker logs kvmd`
|
||||
|
||||
**系统环境**
|
||||
- **运行方式**: (例如:整合包镜像 / Docker)
|
||||
- **镜像版本**: (Docker 镜像请提供版本号)
|
||||
- **操作系统**: (例如:Debian 12)
|
||||
|
||||
**尝试过的解决方法**
|
||||
请简要描述您为解决此问题已尝试过的方法及其结果。如果未尝试,可留空。
|
||||
|
||||
**补充信息**
|
||||
可以附加截图、录屏或其他有助于理解问题的信息。
|
||||
25
.github/ISSUE_TEMPLATE/功能请求与设备适配.md
vendored
25
.github/ISSUE_TEMPLATE/功能请求与设备适配.md
vendored
@ -1,25 +0,0 @@
|
||||
---
|
||||
name: 功能请求与设备适配
|
||||
about: 请求新的功能或适配新的平台
|
||||
title: "[功能/适配]"
|
||||
labels: 特性
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**功能描述**
|
||||
请详细描述您期望的新功能应该是什么样子。
|
||||
- **对于新功能**:它应该如何工作?有哪些关键特性?
|
||||
- **对于新平台适配**:请提供该平台的具体信息(如设备型号、系统版本、相关链接等)。
|
||||
|
||||
**期望的效果**
|
||||
当该功能实现或平台适配完成后,您期望达到怎样的理想效果?可以像下面这样列出关键点:
|
||||
- [ ] 用户可以...
|
||||
- [ ] 系统能够...
|
||||
- [ ] 解决了之前的...问题
|
||||
|
||||
**我能提供的帮助**
|
||||
为了让这个想法更快成为现实,您可以提供哪些帮助?没有则填写无。
|
||||
- [ ] 我可以参与后续的功能测试
|
||||
- [ ] 我可以提供(临时的)远程调试环境(如 SSH、远程桌面)
|
||||
- [ ] 其他:...
|
||||
210
.github/workflows/build_img.yaml
vendored
210
.github/workflows/build_img.yaml
vendored
@ -1,210 +0,0 @@
|
||||
name: Build One-KVM Image
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
device_target:
|
||||
description: 'Target device to build'
|
||||
required: true
|
||||
type: choice
|
||||
options:
|
||||
- onecloud
|
||||
- onecloud-pro
|
||||
- cumebox2
|
||||
- chainedbox
|
||||
- vm
|
||||
- e900v22c
|
||||
- octopus-flanet
|
||||
- orangepi-zero
|
||||
- oec-turbo
|
||||
- all
|
||||
create_release:
|
||||
description: 'Create GitHub Release'
|
||||
required: false
|
||||
default: true
|
||||
type: boolean
|
||||
release_name:
|
||||
description: 'Custom release name (optional)'
|
||||
required: false
|
||||
type: string
|
||||
|
||||
env:
|
||||
BUILD_DATE: ""
|
||||
GIT_SHA: ""
|
||||
RELEASE_TAG: ""
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
container:
|
||||
image: node:18
|
||||
options: --user root --privileged
|
||||
env:
|
||||
TZ: Asia/Shanghai
|
||||
volumes:
|
||||
- /dev:/dev
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Inject TURN config (optional)
|
||||
if: ${{ env.TURN_HOST != '' }}
|
||||
run: |
|
||||
mkdir -p configs/kvmd/override.d
|
||||
cat > configs/kvmd/override.d/turn.yaml <<EOF
|
||||
janus:
|
||||
stun:
|
||||
host: ${TURN_HOST}
|
||||
port: ${TURN_PORT}
|
||||
local_ice_servers:
|
||||
- urls:
|
||||
- "stun:${TURN_HOST}:${TURN_PORT}"
|
||||
- "turn:${TURN_HOST}:${TURN_PORT}?transport=udp"
|
||||
- "turn:${TURN_HOST}:${TURN_PORT}?transport=tcp"
|
||||
username: "${TURN_USER}"
|
||||
credential: "${TURN_PASS}"
|
||||
EOF
|
||||
env:
|
||||
TURN_HOST: ${{ secrets.TURN_HOST }}
|
||||
TURN_PORT: ${{ secrets.TURN_PORT }}
|
||||
TURN_USER: ${{ secrets.TURN_USER }}
|
||||
TURN_PASS: ${{ secrets.TURN_PASS }}
|
||||
|
||||
- name: Set build environment
|
||||
id: build_env
|
||||
shell: bash
|
||||
run: |
|
||||
BUILD_DATE=$(date +%y%m%d-%H%M)
|
||||
# 使用 GitHub 提供的环境变量避免 Git 权限问题
|
||||
GIT_SHA="${GITHUB_SHA:0:7}"
|
||||
GIT_BRANCH="${GITHUB_REF_NAME}"
|
||||
|
||||
echo "BUILD_DATE=$BUILD_DATE" >> $GITHUB_ENV
|
||||
echo "GIT_SHA=$GIT_SHA" >> $GITHUB_ENV
|
||||
echo "GIT_BRANCH=$GIT_BRANCH" >> $GITHUB_ENV
|
||||
|
||||
# 生成唯一但不创建新分支的标识符
|
||||
RELEASE_TAG="build-$BUILD_DATE-${{ github.event.inputs.device_target }}-$GIT_SHA"
|
||||
echo "RELEASE_TAG=$RELEASE_TAG" >> $GITHUB_ENV
|
||||
|
||||
echo "Build environment:"
|
||||
echo "- Date: $BUILD_DATE"
|
||||
echo "- Git SHA: $GIT_SHA"
|
||||
echo "- Git Branch: $GIT_BRANCH"
|
||||
echo "- Release Tag: $RELEASE_TAG"
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
apt-get update
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
apt-get install -y --no-install-recommends \
|
||||
sudo tzdata docker.io qemu-utils qemu-user-static binfmt-support parted e2fsprogs \
|
||||
curl tar python3 python3-pip rsync git android-sdk-libsparse-utils coreutils zerofree wget \
|
||||
file tree
|
||||
apt-get clean
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
|
||||
echo $TZ > /etc/timezone
|
||||
update-binfmts --enable
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
|
||||
- name: Build image
|
||||
id: build
|
||||
shell: bash
|
||||
run: |
|
||||
set -eo pipefail
|
||||
|
||||
echo "=== Build Configuration ==="
|
||||
echo "Target: ${{ github.event.inputs.device_target }}"
|
||||
echo "Build Date: $BUILD_DATE"
|
||||
echo "Git SHA: $GIT_SHA"
|
||||
echo "Git Branch: $GIT_BRANCH"
|
||||
echo "Output Directory: ${{ github.workspace }}/output"
|
||||
echo "=========================="
|
||||
|
||||
mkdir -p "${{ github.workspace }}/output"
|
||||
chmod +x build/build_img.sh
|
||||
|
||||
echo "Starting build process..."
|
||||
if bash build/build_img.sh ${{ github.event.inputs.device_target }}; then
|
||||
echo "BUILD_SUCCESS=true" >> $GITHUB_OUTPUT
|
||||
echo "Build completed successfully!"
|
||||
else
|
||||
echo "BUILD_SUCCESS=false" >> $GITHUB_OUTPUT
|
||||
echo "Build failed!" >&2
|
||||
exit 1
|
||||
fi
|
||||
env:
|
||||
CI_PROJECT_DIR: ${{ github.workspace }}
|
||||
GITHUB_ACTIONS: true
|
||||
OUTPUTDIR: ${{ github.workspace }}/output
|
||||
|
||||
- name: Collect build artifacts
|
||||
id: artifacts
|
||||
run: |
|
||||
cd "${{ github.workspace }}/output"
|
||||
|
||||
echo "=== Build Artifacts ==="
|
||||
if [ -d "${{ github.workspace }}/output" ]; then
|
||||
find . -name "*.xz" | head -20
|
||||
|
||||
# 统计xz文件信息
|
||||
ARTIFACT_COUNT=$(find . -name "*.xz" | wc -l)
|
||||
TOTAL_SIZE=$(du -sh . | cut -f1)
|
||||
|
||||
echo "ARTIFACT_COUNT=$ARTIFACT_COUNT" >> $GITHUB_OUTPUT
|
||||
echo "TOTAL_SIZE=$TOTAL_SIZE" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "No output directory found!"
|
||||
echo "ARTIFACT_COUNT=0" >> $GITHUB_OUTPUT
|
||||
echo "TOTAL_SIZE=0" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
echo "======================"
|
||||
|
||||
- name: Create GitHub Release
|
||||
if: steps.build.outputs.BUILD_SUCCESS == 'true' && github.event.inputs.create_release == 'true'
|
||||
id: release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
tag_name: ${{ env.RELEASE_TAG }}
|
||||
name: ${{ github.event.inputs.release_name || format('One-KVM {0} 构建镜像 ({1})', github.event.inputs.device_target, env.BUILD_DATE) }}
|
||||
body: |
|
||||
## 📦 GitHub Actions 镜像构建
|
||||
|
||||
### 构建信息
|
||||
- **目标设备**: `${{ github.event.inputs.device_target }}`
|
||||
- **构建时间**: `${{ env.BUILD_DATE }}`
|
||||
- **Git 提交**: `${{ env.GIT_SHA }}` (分支: `${{ env.GIT_BRANCH }}`)
|
||||
- **构建环境**: GitHub Actions (Ubuntu 22.04)
|
||||
- **工作流ID**: `${{ github.run_id }}`
|
||||
|
||||
files: ${{ github.workspace }}/output/*.xz
|
||||
prerelease: true
|
||||
make_latest: false
|
||||
generate_release_notes: false
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build summary
|
||||
if: always()
|
||||
run: |
|
||||
echo "## 📋 构建摘要" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| 项目 | 值 |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "|------|-----|" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| **目标设备** | \`${{ github.event.inputs.device_target }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| **构建时间** | \`${{ env.BUILD_DATE }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| **Git SHA** | \`${{ env.GIT_SHA }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| **Git 分支** | \`${{ env.GIT_BRANCH }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| **构建状态** | ${{ steps.build.outputs.BUILD_SUCCESS == 'true' && '✅ 成功' || '❌ 失败' }} |" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
if [ "${{ steps.build.outputs.BUILD_SUCCESS }}" = "true" ]; then
|
||||
echo "| **构建产物** | ${{ steps.artifacts.outputs.ARTIFACT_COUNT || '0' }} 个文件 (${{ steps.artifacts.outputs.TOTAL_SIZE || '0' }}) |" >> $GITHUB_STEP_SUMMARY
|
||||
if [ "${{ github.event.inputs.create_release }}" = "true" ]; then
|
||||
echo "| **Release** | [${{ env.RELEASE_TAG }}](${{ steps.release.outputs.url }}) |" >> $GITHUB_STEP_SUMMARY
|
||||
fi
|
||||
fi
|
||||
240
.github/workflows/docker-build.yaml
vendored
240
.github/workflows/docker-build.yaml
vendored
@ -1,240 +0,0 @@
|
||||
name: Build and Push Docker Image
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
build_type:
|
||||
description: 'Build type'
|
||||
required: true
|
||||
type: choice
|
||||
options:
|
||||
- stage-0
|
||||
- dev
|
||||
- release
|
||||
version:
|
||||
description: 'Version tag (for main image)'
|
||||
required: false
|
||||
default: 'latest'
|
||||
type: string
|
||||
platforms:
|
||||
description: 'Target platforms'
|
||||
required: false
|
||||
default: 'linux/amd64,linux/arm64,linux/arm/v7'
|
||||
type: string
|
||||
enable_aliyun:
|
||||
description: 'Push to Aliyun Registry'
|
||||
required: false
|
||||
default: true
|
||||
type: boolean
|
||||
|
||||
env:
|
||||
DOCKERHUB_REGISTRY: docker.io
|
||||
ALIYUN_REGISTRY: registry.cn-hangzhou.aliyuncs.com
|
||||
STAGE0_IMAGE: kvmd-stage-0
|
||||
MAIN_IMAGE: kvmd
|
||||
|
||||
jobs:
|
||||
build-stage-0:
|
||||
runs-on: ubuntu-22.04
|
||||
if: github.event.inputs.build_type == 'stage-0'
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Inject TURN config (optional)
|
||||
if: ${{ env.TURN_HOST != '' }}
|
||||
run: |
|
||||
mkdir -p configs/kvmd/override.d
|
||||
cat > configs/kvmd/override.d/turn.yaml <<EOF
|
||||
janus:
|
||||
stun:
|
||||
host: ${TURN_HOST}
|
||||
port: ${TURN_PORT}
|
||||
local_ice_servers:
|
||||
- urls:
|
||||
- "stun:${TURN_HOST}:${TURN_PORT}"
|
||||
- "turn:${TURN_HOST}:${TURN_PORT}?transport=udp"
|
||||
- "turn:${TURN_HOST}:${TURN_PORT}?transport=tcp"
|
||||
username: "${TURN_USER}"
|
||||
credential: "${TURN_PASS}"
|
||||
EOF
|
||||
env:
|
||||
TURN_HOST: ${{ secrets.TURN_HOST }}
|
||||
TURN_PORT: ${{ secrets.TURN_PORT }}
|
||||
TURN_USER: ${{ secrets.TURN_USER }}
|
||||
TURN_PASS: ${{ secrets.TURN_PASS }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
driver: docker-container
|
||||
platforms: ${{ github.event.inputs.platforms }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
with:
|
||||
platforms: all
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.DOCKERHUB_REGISTRY }}
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Login to Aliyun Registry
|
||||
if: github.event.inputs.enable_aliyun == 'true'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.ALIYUN_REGISTRY }}
|
||||
username: ${{ secrets.ALIYUN_USERNAME }}
|
||||
password: ${{ secrets.ALIYUN_PASSWORD }}
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
silentwind0/${{ env.STAGE0_IMAGE }}
|
||||
${{ github.event.inputs.enable_aliyun == 'true' && format('{0}/silentwind/{1}', env.ALIYUN_REGISTRY, env.STAGE0_IMAGE) || '' }}
|
||||
tags: |
|
||||
type=raw,value=latest
|
||||
type=raw,value=latest-{{date 'YYYYMMDD-HHmmss'}}
|
||||
type=sha,prefix={{branch}}-
|
||||
labels: |
|
||||
org.opencontainers.image.title=One-KVM Stage-0 Base Image
|
||||
org.opencontainers.image.description=Base image for One-KVM build environment
|
||||
org.opencontainers.image.vendor=One-KVM Project
|
||||
|
||||
- name: Build and push stage-0 image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./build/Dockerfile-stage-0
|
||||
platforms: ${{ github.event.inputs.platforms }}
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha,scope=stage-0
|
||||
cache-to: type=gha,mode=max,scope=stage-0
|
||||
provenance: false
|
||||
sbom: false
|
||||
allow: security.insecure
|
||||
|
||||
build-main:
|
||||
runs-on: ubuntu-22.04
|
||||
if: github.event.inputs.build_type != 'stage-0'
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Inject TURN config (optional)
|
||||
if: ${{ env.TURN_HOST != '' }}
|
||||
run: |
|
||||
mkdir -p configs/kvmd/override.d
|
||||
cat > configs/kvmd/override.d/turn.yaml <<EOF
|
||||
janus:
|
||||
stun:
|
||||
host: ${TURN_HOST}
|
||||
port: ${TURN_PORT}
|
||||
local_ice_servers:
|
||||
- urls:
|
||||
- "stun:${TURN_HOST}:${TURN_PORT}"
|
||||
- "turn:${TURN_HOST}:${TURN_PORT}?transport=udp"
|
||||
- "turn:${TURN_HOST}:${TURN_PORT}?transport=tcp"
|
||||
username: "${TURN_USER}"
|
||||
credential: "${TURN_PASS}"
|
||||
EOF
|
||||
env:
|
||||
TURN_HOST: ${{ secrets.TURN_HOST }}
|
||||
TURN_PORT: ${{ secrets.TURN_PORT }}
|
||||
TURN_USER: ${{ secrets.TURN_USER }}
|
||||
TURN_PASS: ${{ secrets.TURN_PASS }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
driver: docker-container
|
||||
platforms: ${{ github.event.inputs.platforms }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
with:
|
||||
platforms: all
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.DOCKERHUB_REGISTRY }}
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Login to Aliyun Registry
|
||||
if: github.event.inputs.enable_aliyun == 'true'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.ALIYUN_REGISTRY }}
|
||||
username: ${{ secrets.ALIYUN_USERNAME }}
|
||||
password: ${{ secrets.ALIYUN_PASSWORD }}
|
||||
|
||||
- name: Set version tag
|
||||
id: version
|
||||
run: |
|
||||
if [[ "${{ github.event.inputs.build_type }}" == "dev" ]]; then
|
||||
echo "tag=dev" >> $GITHUB_OUTPUT
|
||||
elif [[ "${{ github.event.inputs.build_type }}" == "release" ]]; then
|
||||
echo "tag=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
silentwind0/${{ env.MAIN_IMAGE }}
|
||||
${{ github.event.inputs.enable_aliyun == 'true' && format('{0}/silentwind/{1}', env.ALIYUN_REGISTRY, env.MAIN_IMAGE) || '' }}
|
||||
tags: |
|
||||
type=raw,value=${{ steps.version.outputs.tag }}
|
||||
type=raw,value=${{ steps.version.outputs.tag }}-{{date 'YYYYMMDD-HHmmss'}}
|
||||
type=sha,prefix={{branch}}-
|
||||
labels: |
|
||||
org.opencontainers.image.title=One-KVM
|
||||
org.opencontainers.image.description=DIY IP-KVM solution based on PiKVM
|
||||
org.opencontainers.image.vendor=One-KVM Project
|
||||
org.opencontainers.image.version=${{ steps.version.outputs.tag }}
|
||||
|
||||
- name: Build and push main image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./build/Dockerfile
|
||||
platforms: ${{ github.event.inputs.platforms }}
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha,scope=main
|
||||
cache-to: type=gha,mode=max,scope=main
|
||||
provenance: false
|
||||
sbom: false
|
||||
|
||||
- name: Build summary
|
||||
run: |
|
||||
echo "## Build Summary" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Build Type**: ${{ github.event.inputs.build_type }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Version Tag**: ${{ steps.version.outputs.tag }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Platforms**: ${{ github.event.inputs.platforms }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Aliyun Enabled**: ${{ github.event.inputs.enable_aliyun }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Tags**:" >> $GITHUB_STEP_SUMMARY
|
||||
echo "${{ steps.meta.outputs.tags }}" | sed 's/^/ - /' >> $GITHUB_STEP_SUMMARY
|
||||
24
.gitignore
vendored
24
.gitignore
vendored
@ -1,24 +0,0 @@
|
||||
/pkg/
|
||||
/src/**/*.img
|
||||
/src/tmp
|
||||
/site/
|
||||
/dist/
|
||||
/kvmd.egg-info/
|
||||
/config.mk
|
||||
/testenv/.tox/
|
||||
/testenv/.mypy_cache/
|
||||
/testenv/.coverage*
|
||||
/testenv/run/*.sock
|
||||
/testenv/run/*.pid
|
||||
/testenv/.ssl/
|
||||
/v*.tar.gz
|
||||
/*.pkg.tar.xz
|
||||
/*.pkg.tar.zst
|
||||
/*.egg-info
|
||||
/*kvmd-*.tar.gz
|
||||
*.pyc
|
||||
*.swp
|
||||
/venv/
|
||||
.vscode/settings.j/son
|
||||
kvmd_config/
|
||||
CLAUDE.md
|
||||
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -1,4 +0,0 @@
|
||||
{
|
||||
"cmake.ignoreCMakeListsMissing": true,
|
||||
"makefile.configureOnOpen": false
|
||||
}
|
||||
12
ChangeLogs.txt
Normal file
12
ChangeLogs.txt
Normal file
@ -0,0 +1,12 @@
|
||||
更新日志
|
||||
- V0.56:[Build-Armbian]:回退5.9内核版本(V0.52),目前运行最稳定的内核版本;支持docker;此前高内核的累积更新
|
||||
- V0.55: [build]使用lanlan Uboot,通电按重置键可进入线刷模式;HDM可用,WIFI模块已编译;预装armbian-config实用工具;Webterm和VNC修复(tighervnc存在兼容问题,可尝试使用uvnc viewer),添加状态信息显示
|
||||
- V0.54: [build]内核切换至xdarklight/linux/tree/meson-mx-integration-6.7-20231221,系统运行更加稳定;包含armbian-config等实用工具
|
||||
- V0.53: [build]修复高内核OTG拔插内核崩溃问题;切换至更新的Linux内核(6.6.15-current-meson);去除线刷镜像分区校验
|
||||
- V0.52:[Build-Armbian]添加MSD内核补丁;完全使用hzyitc的uboot,减小boot分区从512M至128M,引导和分区表使用UUID,默认关闭线刷刷机;dtb切换为外围设备模式;led颜色修改,红色(UBoot)-紫色(内核)-绿色(完全启动);调整dts CPU频率和版本,添加H.264支持(来自群友 自.知 )
|
||||
- V0.51: [Build-Armbian]5.9内核构建,初步完成直刷镜像构建。
|
||||
- V0.5:通过锁定CPU频率修复ustreamer mjpeg视频流异常的问题;屏蔽主程序找不到温度传感器的报错;优化中文翻译;更新VNC依赖;优化安装流程。
|
||||
- V0.4:利用玩客云自动GPIO实现ATX开关机物理控制功能;初步建立飞书使用文档;制作一键安装脚本,优化安装流程。
|
||||
- V0.3:添加简体中文补丁;实现MSD功能在EMMC和TF卡上的使用;添加WOL和中文OCR功能;优化了安装流程。
|
||||
- V0.2:通过替换系统解决OTG拔插死机问题;初步实现MSD功能;修改启动分区解决开机卡线刷检测;优化安装流程。
|
||||
- V0.1:PiKVM在玩客云上初步运行。
|
||||
345
Makefile
345
Makefile
@ -1,345 +0,0 @@
|
||||
-include config.mk
|
||||
|
||||
TESTENV_IMAGE ?= kvmd-testenv
|
||||
TESTENV_HID ?= /dev/ttyS10
|
||||
TESTENV_VIDEO ?= /dev/video0
|
||||
TESTENV_GPIO ?= /dev/gpiochip0
|
||||
TESTENV_RELAY ?=
|
||||
#TESTENV_RELAY ?= $(if $(shell ls /dev/hidraw0 2>/dev/null || true),/dev/hidraw0,)
|
||||
|
||||
LIBGPIOD_VERSION ?= 1.6.3
|
||||
|
||||
USTREAMER_MIN_VERSION ?= $(shell grep -o 'ustreamer>=[^"]\+' PKGBUILD | sed 's/ustreamer>=//g')
|
||||
|
||||
DEFAULT_PLATFORM ?= v2-hdmiusb-rpi4
|
||||
|
||||
DOCKER ?= docker
|
||||
|
||||
|
||||
# =====
|
||||
define optbool
|
||||
$(filter $(shell echo $(1) | tr A-Z a-z),yes on 1)
|
||||
endef
|
||||
|
||||
|
||||
# =====
|
||||
all:
|
||||
@ echo "Useful commands:"
|
||||
@ echo " make # Print this help"
|
||||
@ echo " make testenv # Build test environment"
|
||||
@ echo " make tox # Run tests and linters"
|
||||
@ echo " make tox E=pytest # Run selected test environment"
|
||||
@ echo " make tox-local # Run tests and linters locally (no Docker)"
|
||||
@ echo " make tox-local E=flake8 # Run selected test locally"
|
||||
@ echo " make gpio # Create gpio mockup"
|
||||
@ echo " make run # Run kvmd"
|
||||
@ echo " make run CMD=... # Run specified command inside kvmd environment"
|
||||
@ echo " make run-cfg # Run kvmd -m"
|
||||
@ echo " make run-ipmi # Run kvmd-ipmi"
|
||||
@ echo " make run-ipmi CMD=... # Run specified command inside kvmd-ipmi environment"
|
||||
@ echo " make run-vnc # Run kvmd-vnc"
|
||||
@ echo " make run-vnc CMD=... # Run specified command inside kvmd-vnc environment"
|
||||
@ echo " make regen # Regen some sources like keymap"
|
||||
@ echo " make bump # Bump minor version"
|
||||
@ echo " make bump V=major # Bump major version"
|
||||
@ echo " make release # Publish the new release (include bump minor)"
|
||||
@ echo " make clean # Remove garbage"
|
||||
@ echo " make clean-all # Remove garbage and test results"
|
||||
@ echo
|
||||
@ echo "Also you can add option NC=1 to rebuild docker test environment"
|
||||
|
||||
|
||||
testenv:
|
||||
$(DOCKER) build \
|
||||
$(if $(call optbool,$(NC)),--no-cache,) \
|
||||
--rm \
|
||||
--tag $(TESTENV_IMAGE) \
|
||||
--build-arg LIBGPIOD_VERSION=$(LIBGPIOD_VERSION) \
|
||||
--build-arg USTREAMER_MIN_VERSION=$(USTREAMER_MIN_VERSION) \
|
||||
-f testenv/Dockerfile .
|
||||
test -d testenv/.ssl || $(DOCKER) run --rm \
|
||||
--volume `pwd`:/src:ro \
|
||||
--volume `pwd`/testenv:/src/testenv:rw \
|
||||
-t $(TESTENV_IMAGE) bash -c " \
|
||||
groupadd kvmd-nginx \
|
||||
&& groupadd kvmd-vnc \
|
||||
&& /src/scripts/kvmd-gencert --do-the-thing \
|
||||
&& /src/scripts/kvmd-gencert --do-the-thing --vnc \
|
||||
&& chown -R root:root /etc/kvmd/{nginx,vnc}/ssl \
|
||||
&& chmod 664 /etc/kvmd/{nginx,vnc}/ssl/* \
|
||||
&& chmod 775 /etc/kvmd/{nginx,vnc}/ssl \
|
||||
&& mkdir /src/testenv/.ssl \
|
||||
&& mv /etc/kvmd/nginx/ssl /src/testenv/.ssl/nginx \
|
||||
&& mv /etc/kvmd/vnc/ssl /src/testenv/.ssl/vnc \
|
||||
"
|
||||
|
||||
|
||||
tox: testenv
|
||||
time $(DOCKER) run --rm \
|
||||
--volume `pwd`:/src:ro \
|
||||
--volume `pwd`/testenv:/src/testenv:rw \
|
||||
--volume `pwd`/testenv/tests:/src/testenv/tests:ro \
|
||||
--volume `pwd`/extras:/usr/share/kvmd/extras:ro \
|
||||
--volume `pwd`/configs:/usr/share/kvmd/configs.default:ro \
|
||||
--volume `pwd`/contrib/keymaps:/usr/share/kvmd/keymaps:ro \
|
||||
-t $(TESTENV_IMAGE) bash -c " \
|
||||
cp -a /src/testenv/.ssl/nginx /etc/kvmd/nginx/ssl \
|
||||
&& cp -a /src/testenv/.ssl/vnc /etc/kvmd/vnc/ssl \
|
||||
&& cp /src/testenv/platform /usr/share/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.yaml /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*passwd /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.secret /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/edid/v2.hex /etc/kvmd/switch-edid.hex \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/main/$(if $(P),$(P),$(DEFAULT_PLATFORM)).yaml /etc/kvmd/main.yaml \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/main.yaml /etc/kvmd/main.yaml \
|
||||
&& mkdir -p /etc/kvmd/override.d \
|
||||
&& cp /src/testenv/$(if $(P),$(P),$(DEFAULT_PLATFORM)).override.yaml /etc/kvmd/override.yaml \
|
||||
&& cd /src \
|
||||
&& $(if $(CMD),$(CMD),tox -q -c testenv/tox.ini $(if $(E),-e $(E),-p auto)) \
|
||||
"
|
||||
|
||||
|
||||
tox-local:
|
||||
@./check-code.sh $(if $(E),$(E),all)
|
||||
|
||||
|
||||
$(TESTENV_GPIO):
|
||||
test ! -e $(TESTENV_GPIO)
|
||||
sudo modprobe gpio_mockup gpio_mockup_ranges=0,40
|
||||
test -c $(TESTENV_GPIO)
|
||||
|
||||
|
||||
run: testenv $(TESTENV_GPIO)
|
||||
- $(DOCKER) run --rm --name kvmd \
|
||||
--ipc=shareable \
|
||||
--privileged \
|
||||
--volume `pwd`/testenv/run:/run/kvmd:rw \
|
||||
--volume `pwd`/testenv:/testenv:ro \
|
||||
--volume `pwd`/kvmd:/kvmd:ro \
|
||||
--volume `pwd`/testenv/env.py:/kvmd/env.py:ro \
|
||||
--volume `pwd`/web:/usr/share/kvmd/web:ro \
|
||||
--volume `pwd`/extras:/usr/share/kvmd/extras:ro \
|
||||
--volume `pwd`/configs:/usr/share/kvmd/configs.default:ro \
|
||||
--volume `pwd`/contrib/keymaps:/usr/share/kvmd/keymaps:ro \
|
||||
--device $(TESTENV_VIDEO):$(TESTENV_VIDEO) \
|
||||
--device $(TESTENV_GPIO):$(TESTENV_GPIO) \
|
||||
$(if $(TESTENV_RELAY),--device $(TESTENV_RELAY):$(TESTENV_RELAY),) \
|
||||
--publish 8080:8080/tcp \
|
||||
--publish 4430:4430/tcp \
|
||||
-it $(TESTENV_IMAGE) /bin/bash -c " \
|
||||
mkdir -p /tmp/kvmd-nginx \
|
||||
&& mount -t debugfs none /sys/kernel/debug \
|
||||
&& test -d /sys/kernel/debug/gpio-mockup/`basename $(TESTENV_GPIO)`/ || (echo \"Missing GPIO mockup\" && exit 1) \
|
||||
&& (socat PTY,link=$(TESTENV_HID) PTY,link=/dev/ttyS11 &) \
|
||||
&& cp -r /usr/share/kvmd/configs.default/nginx/* /etc/kvmd/nginx \
|
||||
&& cp -a /testenv/.ssl/nginx /etc/kvmd/nginx/ssl \
|
||||
&& cp -a /testenv/.ssl/vnc /etc/kvmd/vnc/ssl \
|
||||
&& cp /testenv/platform /usr/share/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.yaml /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*passwd /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.secret /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/edid/v2.hex /etc/kvmd/switch-edid.hex \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/main/$(if $(P),$(P),$(DEFAULT_PLATFORM)).yaml /etc/kvmd/main.yaml \
|
||||
&& ln -s /testenv/web.css /etc/kvmd/web.css \
|
||||
&& mkdir -p /etc/kvmd/override.d \
|
||||
&& cp /testenv/$(if $(P),$(P),$(DEFAULT_PLATFORM)).override.yaml /etc/kvmd/override.yaml \
|
||||
&& python -m kvmd.apps.ngxmkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf \
|
||||
&& nginx -c /etc/kvmd/nginx/nginx.conf -g 'user http; error_log stderr;' \
|
||||
&& ln -s $(TESTENV_VIDEO) /dev/kvmd-video \
|
||||
&& ln -s $(TESTENV_GPIO) /dev/kvmd-gpio \
|
||||
&& $(if $(CMD),$(CMD),python -m kvmd.apps.kvmd --run) \
|
||||
"
|
||||
|
||||
|
||||
run-cfg: testenv
|
||||
- $(DOCKER) run --rm --name kvmd-cfg \
|
||||
--volume `pwd`/testenv/run:/run/kvmd:rw \
|
||||
--volume `pwd`/testenv:/testenv:ro \
|
||||
--volume `pwd`/kvmd:/kvmd:ro \
|
||||
--volume `pwd`/extras:/usr/share/kvmd/extras:ro \
|
||||
--volume `pwd`/configs:/usr/share/kvmd/configs.default:ro \
|
||||
--volume `pwd`/contrib/keymaps:/usr/share/kvmd/keymaps:ro \
|
||||
-it $(TESTENV_IMAGE) /bin/bash -c " \
|
||||
cp -a /testenv/.ssl/nginx /etc/kvmd/nginx/ssl \
|
||||
&& cp -a /testenv/.ssl/vnc /etc/kvmd/vnc/ssl \
|
||||
&& cp /testenv/platform /usr/share/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.yaml /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*passwd /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.secret /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/edid/v2.hex /etc/kvmd/switch-edid.hex \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/main/$(if $(P),$(P),$(DEFAULT_PLATFORM)).yaml /etc/kvmd/main.yaml \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/main.yaml /etc/kvmd/main.yaml \
|
||||
&& mkdir -p /etc/kvmd/override.d \
|
||||
&& cp /testenv/$(if $(P),$(P),$(DEFAULT_PLATFORM)).override.yaml /etc/kvmd/override.yaml \
|
||||
&& $(if $(CMD),$(CMD),python -m kvmd.apps.kvmd -m) \
|
||||
"
|
||||
|
||||
|
||||
run-ipmi: testenv
|
||||
- $(DOCKER) run --rm --name kvmd-ipmi \
|
||||
--volume `pwd`/testenv/run:/run/kvmd:rw \
|
||||
--volume `pwd`/testenv:/testenv:ro \
|
||||
--volume `pwd`/kvmd:/kvmd:ro \
|
||||
--volume `pwd`/extras:/usr/share/kvmd/extras:ro \
|
||||
--volume `pwd`/configs:/usr/share/kvmd/configs.default:ro \
|
||||
--volume `pwd`/contrib/keymaps:/usr/share/kvmd/keymaps:ro \
|
||||
--publish 6230:623/udp \
|
||||
-it $(TESTENV_IMAGE) /bin/bash -c " \
|
||||
cp -a /testenv/.ssl/nginx /etc/kvmd/nginx/ssl \
|
||||
&& cp -a /testenv/.ssl/vnc /etc/kvmd/vnc/ssl \
|
||||
&& cp /testenv/platform /usr/share/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.yaml /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*passwd /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.secret /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/edid/v2.hex /etc/kvmd/switch-edid.hex \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/main/$(if $(P),$(P),$(DEFAULT_PLATFORM)).yaml /etc/kvmd/main.yaml \
|
||||
&& mkdir -p /etc/kvmd/override.d \
|
||||
&& cp /testenv/$(if $(P),$(P),$(DEFAULT_PLATFORM)).override.yaml /etc/kvmd/override.yaml \
|
||||
&& $(if $(CMD),$(CMD),python -m kvmd.apps.ipmi --run) \
|
||||
"
|
||||
|
||||
|
||||
run-vnc: testenv
|
||||
- $(DOCKER) run --rm --name kvmd-vnc \
|
||||
--ipc=container:kvmd \
|
||||
--volume `pwd`/testenv/run:/run/kvmd:rw \
|
||||
--volume `pwd`/testenv:/testenv:ro \
|
||||
--volume `pwd`/kvmd:/kvmd:ro \
|
||||
--volume `pwd`/extras:/usr/share/kvmd/extras:ro \
|
||||
--volume `pwd`/configs:/usr/share/kvmd/configs.default:ro \
|
||||
--volume `pwd`/contrib/keymaps:/usr/share/kvmd/keymaps:ro \
|
||||
--publish 5900:5900/tcp \
|
||||
-it $(TESTENV_IMAGE) /bin/bash -c " \
|
||||
cp -a /testenv/.ssl/nginx /etc/kvmd/nginx/ssl \
|
||||
&& cp -a /testenv/.ssl/vnc /etc/kvmd/vnc/ssl \
|
||||
&& cp /testenv/platform /usr/share/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.yaml /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*passwd /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.secret /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/edid/v2.hex /etc/kvmd/switch-edid.hex \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/main/$(if $(P),$(P),$(DEFAULT_PLATFORM)).yaml /etc/kvmd/main.yaml \
|
||||
&& mkdir -p /etc/kvmd/override.d \
|
||||
&& cp /testenv/$(if $(P),$(P),$(DEFAULT_PLATFORM)).override.yaml /etc/kvmd/override.yaml \
|
||||
&& $(if $(CMD),$(CMD),python -m kvmd.apps.vnc --run) \
|
||||
"
|
||||
|
||||
|
||||
regen: keymap pug
|
||||
|
||||
|
||||
keymap: testenv
|
||||
$(DOCKER) run --user `id -u`:`id -g` --rm \
|
||||
--volume `pwd`:/src \
|
||||
-it $(TESTENV_IMAGE) bash -c "cd src \
|
||||
&& ./genmap.py keymap.csv kvmd/keyboard/mappings.py.mako kvmd/keyboard/mappings.py \
|
||||
&& ./genmap.py keymap.csv hid/arduino/lib/drivers/usb-keymap.h.mako hid/arduino/lib/drivers/usb-keymap.h \
|
||||
&& ./genmap.py keymap.csv hid/arduino/lib/drivers-avr/ps2/keymap.h.mako hid/arduino/lib/drivers-avr/ps2/keymap.h \
|
||||
&& ./genmap.py keymap.csv hid/pico/src/ph_usb_keymap.h.mako hid/pico/src/ph_usb_keymap.h \
|
||||
"
|
||||
|
||||
|
||||
pug: testenv
|
||||
$(DOCKER) run --user `id -u`:`id -g` --rm \
|
||||
--volume `pwd`:/src \
|
||||
-it $(TESTENV_IMAGE) bash -c "cd src \
|
||||
&& pug --pretty web/index.pug -o web \
|
||||
&& pug --pretty web/login/index.pug -o web/login \
|
||||
&& pug --pretty web/kvm/index.pug -o web/kvm \
|
||||
&& pug --pretty web/ipmi/index.pug -o web/ipmi \
|
||||
&& pug --pretty web/vnc/index.pug -o web/vnc \
|
||||
"
|
||||
|
||||
|
||||
release:
|
||||
make clean
|
||||
make tox
|
||||
make clean
|
||||
make push
|
||||
make bump V=$(V)
|
||||
make push
|
||||
make clean
|
||||
|
||||
|
||||
bump:
|
||||
bumpversion $(if $(V),$(V),minor)
|
||||
|
||||
|
||||
push:
|
||||
git push
|
||||
git push --tags
|
||||
|
||||
|
||||
clean:
|
||||
rm -rf testenv/run/*.{pid,sock} build site dist pkg src v*.tar.gz *.pkg.tar.{xz,zst} *.egg-info kvmd-*.tar.gz
|
||||
find kvmd testenv/tests -name __pycache__ | xargs rm -rf
|
||||
make -C hid/arduino clean
|
||||
make -C hid/pico clean
|
||||
|
||||
|
||||
clean-all: testenv clean
|
||||
make -C hid/arduino clean-all
|
||||
make -C hid/pico clean-all
|
||||
- $(DOCKER) run --rm \
|
||||
--volume `pwd`:/src \
|
||||
-it $(TESTENV_IMAGE) bash -c "cd src && rm -rf testenv/{.ssl,.tox,.mypy_cache,.coverage}"
|
||||
|
||||
|
||||
.PHONY: testenv
|
||||
|
||||
run-stage-0:
|
||||
$(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd-stage-0 -t silentwind0/kvmd-stage-0 \
|
||||
--allow security.insecure --progress plain \
|
||||
--platform linux/amd64,linux/arm64,linux/arm/v7 \
|
||||
-f build/Dockerfile-stage-0 . \
|
||||
--push
|
||||
|
||||
run-build-dev:
|
||||
$(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd:dev -t silentwind0/kvmd:dev \
|
||||
--platform linux/amd64,linux/arm64,linux/arm/v7 \
|
||||
--build-arg CACHEBUST=$(date +%s) \
|
||||
-f build/Dockerfile . \
|
||||
--push
|
||||
|
||||
run-build-release:
|
||||
$(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd -t silentwind0/kvmd \
|
||||
--progress plain \
|
||||
--platform linux/amd64,linux/arm64,linux/arm/v7 \
|
||||
--build-arg CACHEBUST=$(date +%s) \
|
||||
-f build/Dockerfile . \
|
||||
--push
|
||||
|
||||
run-nogpio: testenv
|
||||
- $(DOCKER) run --rm --name kvmd \
|
||||
--privileged \
|
||||
--volume `pwd`/testenv/run:/run/kvmd:rw \
|
||||
--volume `pwd`/testenv:/testenv:ro \
|
||||
--volume `pwd`/kvmd:/kvmd:ro \
|
||||
--volume `pwd`/testenv/env.py:/kvmd/env.py:ro \
|
||||
--volume `pwd`/web:/usr/share/kvmd/web:ro \
|
||||
--volume `pwd`/extras:/usr/share/kvmd/extras:ro \
|
||||
--volume `pwd`/configs:/usr/share/kvmd/configs.default:ro \
|
||||
--volume `pwd`/contrib/keymaps:/usr/share/kvmd/keymaps:ro \
|
||||
--device $(TESTENV_VIDEO):$(TESTENV_VIDEO) \
|
||||
$(if $(TESTENV_RELAY),--device $(TESTENV_RELAY):$(TESTENV_RELAY),) \
|
||||
--publish 8080:8080/tcp \
|
||||
--publish 4430:4430/tcp \
|
||||
-it $(TESTENV_IMAGE) /bin/bash -c " \
|
||||
mkdir -p /tmp/kvmd-nginx \
|
||||
&& mount -t debugfs none /sys/kernel/debug \
|
||||
&& (socat PTY,link=$(TESTENV_HID) PTY,link=/dev/ttyS11 &) \
|
||||
&& cp -r /usr/share/kvmd/configs.default/nginx/* /etc/kvmd/nginx \
|
||||
&& cp -a /testenv/.ssl/nginx /etc/kvmd/nginx/ssl \
|
||||
&& cp -a /testenv/.ssl/vnc /etc/kvmd/vnc/ssl \
|
||||
&& touch /etc/kvmd/.docker_flag \
|
||||
&& cp /testenv/platform /usr/share/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.yaml /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*passwd /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/*.secret /etc/kvmd \
|
||||
&& cp /usr/share/kvmd/configs.default/kvmd/main.yaml /etc/kvmd/main.yaml \
|
||||
&& ln -s /testenv/web.css /etc/kvmd/web.css \
|
||||
&& mkdir -p /etc/kvmd/override.d \
|
||||
&& cp /testenv/$(if $(P),$(P),$(DEFAULT_PLATFORM)).override.yaml /etc/kvmd/override.yaml \
|
||||
&& python -m kvmd.apps.ngxmkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf \
|
||||
&& nginx -c /etc/kvmd/nginx/nginx.conf -g 'user http; error_log stderr;' \
|
||||
&& $(if $(CMD),$(CMD),python -m kvmd.apps.kvmd --run) \
|
||||
"
|
||||
279
PKGBUILD
279
PKGBUILD
@ -1,279 +0,0 @@
|
||||
# Contributor: Maxim Devaev <mdevaev@gmail.com>
|
||||
# Author: Maxim Devaev <mdevaev@gmail.com>
|
||||
|
||||
|
||||
_variants=(
|
||||
v0-hdmi:zero2w
|
||||
v0-hdmi:rpi2
|
||||
v0-hdmi:rpi3
|
||||
|
||||
v0-hdmiusb:zero2w
|
||||
v0-hdmiusb:rpi2
|
||||
v0-hdmiusb:rpi3
|
||||
|
||||
v1-hdmi:zero2w
|
||||
v1-hdmi:rpi2
|
||||
v1-hdmi:rpi3
|
||||
|
||||
v1-hdmiusb:zero2w
|
||||
v1-hdmiusb:rpi2
|
||||
v1-hdmiusb:rpi3
|
||||
|
||||
v2-hdmi:zero2w
|
||||
v2-hdmi:rpi3
|
||||
v2-hdmi:rpi4
|
||||
|
||||
v2-hdmiusb:rpi4
|
||||
|
||||
v3-hdmi:rpi4
|
||||
|
||||
v4mini-hdmi:rpi4
|
||||
v4plus-hdmi:rpi4
|
||||
)
|
||||
|
||||
|
||||
pkgname=(kvmd)
|
||||
for _variant in "${_variants[@]}"; do
|
||||
_platform=${_variant%:*}
|
||||
_board=${_variant#*:}
|
||||
pkgname+=(kvmd-platform-$_platform-$_board)
|
||||
done
|
||||
pkgbase=kvmd
|
||||
pkgver=4.94
|
||||
pkgrel=1
|
||||
pkgdesc="The main PiKVM daemon"
|
||||
url="https://github.com/pikvm/kvmd"
|
||||
license=(GPL)
|
||||
arch=(any)
|
||||
depends=(
|
||||
"python>=3.13"
|
||||
"python<3.14"
|
||||
python-yaml
|
||||
python-aiohttp
|
||||
python-aiofiles
|
||||
python-async-lru
|
||||
python-passlib
|
||||
# python-bcrypt is needed for passlib
|
||||
python-bcrypt
|
||||
python-pyotp
|
||||
python-qrcode
|
||||
python-periphery
|
||||
python-pyserial
|
||||
python-pyserial-asyncio
|
||||
python-spidev
|
||||
python-setproctitle
|
||||
python-psutil
|
||||
python-netifaces
|
||||
python-systemd
|
||||
python-dbus
|
||||
python-dbus-next
|
||||
python-pygments
|
||||
"python-pyghmi>=1.6.0-2"
|
||||
python-pam
|
||||
python-pillow
|
||||
python-xlib
|
||||
libxkbcommon
|
||||
python-hidapi
|
||||
python-six
|
||||
python-pyrad
|
||||
python-ldap
|
||||
python-zstandard
|
||||
python-mako
|
||||
python-luma-oled
|
||||
python-pyusb
|
||||
python-pyudev
|
||||
python-evdev
|
||||
"libgpiod>=2.1"
|
||||
freetype2
|
||||
"v4l-utils>=1.22.1-1"
|
||||
"nginx-mainline>=1.25.1"
|
||||
openssl
|
||||
sudo
|
||||
iptables
|
||||
iproute2
|
||||
dnsmasq
|
||||
ipmitool
|
||||
"janus-gateway-pikvm>=1.3.0"
|
||||
certbot
|
||||
platform-io-access
|
||||
raspberrypi-utils
|
||||
"ustreamer>=6.37"
|
||||
|
||||
# Systemd UDEV bug
|
||||
"systemd>=248.3-2"
|
||||
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=2035802
|
||||
# https://archlinuxarm.org/forum/viewtopic.php?f=15&t=15725&start=40
|
||||
"zstd>=1.5.1-2.1"
|
||||
|
||||
# Possible hotfix for the new os update
|
||||
openssl-1.1
|
||||
|
||||
# Bootconfig
|
||||
dos2unix
|
||||
parted
|
||||
e2fsprogs
|
||||
openssh
|
||||
# FIXME:
|
||||
# - https://archlinuxarm.org/forum/viewtopic.php?f=15&t=17007&p=72789
|
||||
# - https://github.com/pikvm/pikvm/issues/1375
|
||||
wpa_supplicant-pikvm
|
||||
run-parts
|
||||
|
||||
# fsck for /boot
|
||||
dosfstools
|
||||
|
||||
# pgrep for kvmd-udev-restart-pass, sysctl for kvmd-otgnet
|
||||
procps-ng
|
||||
|
||||
# Misc
|
||||
hostapd
|
||||
)
|
||||
optdepends=(
|
||||
tesseract
|
||||
)
|
||||
conflicts=(
|
||||
python-pikvm
|
||||
python-aiohttp-pikvm
|
||||
platformio
|
||||
avrdude-pikvm
|
||||
kvmd-oled
|
||||
)
|
||||
makedepends=(
|
||||
python-setuptools
|
||||
python-pip
|
||||
)
|
||||
source=("$url/archive/v$pkgver.tar.gz")
|
||||
md5sums=(SKIP)
|
||||
backup=(
|
||||
etc/kvmd/{override,logging,auth,meta}.yaml
|
||||
etc/kvmd/{ht,ipmi,vnc}passwd
|
||||
etc/kvmd/totp.secret
|
||||
etc/kvmd/nginx/{kvmd.ctx-{http,server},certbot.ctx-server}.conf
|
||||
etc/kvmd/nginx/loc-{login,nocache,proxy,websocket,nobuffering,bigpost}.conf
|
||||
etc/kvmd/nginx/{mime-types,ssl}.conf
|
||||
etc/kvmd/nginx/nginx.conf.mako
|
||||
etc/kvmd/janus/janus{,.plugin.ustreamer,.transport.websockets}.jcfg
|
||||
etc/kvmd/web.css
|
||||
)
|
||||
|
||||
|
||||
package_kvmd() {
|
||||
install=$pkgname.install
|
||||
|
||||
cd "$srcdir/kvmd-$pkgver"
|
||||
pip install --root="$pkgdir" --no-deps .
|
||||
|
||||
install -Dm755 -t "$pkgdir/usr/bin" scripts/kvmd-{bootconfig,gencert,certbot}
|
||||
|
||||
install -dm755 "$pkgdir/usr/lib/systemd/system"
|
||||
cp -rd configs/os/services -T "$pkgdir/usr/lib/systemd/system"
|
||||
|
||||
install -DTm644 configs/os/sysusers.conf "$pkgdir/usr/lib/sysusers.d/kvmd.conf"
|
||||
install -DTm644 configs/os/tmpfiles.conf "$pkgdir/usr/lib/tmpfiles.d/kvmd.conf"
|
||||
|
||||
mkdir -p "$pkgdir/usr/share/kvmd"
|
||||
cp -r {switch,hid,web,extras,contrib/keymaps} "$pkgdir/usr/share/kvmd"
|
||||
find "$pkgdir/usr/share/kvmd/web" -name '*.pug' -exec rm -f '{}' \;
|
||||
|
||||
local _cfg_default="$pkgdir/usr/share/kvmd/configs.default"
|
||||
mkdir -p "$_cfg_default"
|
||||
cp -r configs/* "$_cfg_default"
|
||||
|
||||
find "$pkgdir" -name ".gitignore" -delete
|
||||
find "$_cfg_default" -type f -exec chmod 444 '{}' \;
|
||||
chmod 400 "$_cfg_default/kvmd"/*passwd
|
||||
chmod 400 "$_cfg_default/kvmd"/*.secret
|
||||
chmod 750 "$_cfg_default/os/sudoers"
|
||||
chmod 400 "$_cfg_default/os/sudoers"/*
|
||||
|
||||
mkdir -p "$pkgdir/etc/kvmd/"{nginx,vnc}"/ssl"
|
||||
chmod 755 "$pkgdir/etc/kvmd/"{nginx,vnc}"/ssl"
|
||||
install -Dm444 -t "$pkgdir/etc/kvmd/nginx" "$_cfg_default/nginx"/*.conf*
|
||||
chmod 644 "$pkgdir/etc/kvmd/nginx/"{nginx,ssl}.conf*
|
||||
|
||||
mkdir -p "$pkgdir/etc/kvmd/janus"
|
||||
chmod 755 "$pkgdir/etc/kvmd/janus"
|
||||
install -Dm444 -t "$pkgdir/etc/kvmd/janus" "$_cfg_default/janus"/*.jcfg
|
||||
|
||||
install -Dm644 -t "$pkgdir/etc/kvmd" "$_cfg_default/kvmd"/*.yaml
|
||||
install -Dm600 -t "$pkgdir/etc/kvmd" "$_cfg_default/kvmd"/*passwd
|
||||
install -Dm600 -t "$pkgdir/etc/kvmd" "$_cfg_default/kvmd"/*.secret
|
||||
install -Dm644 -t "$pkgdir/etc/kvmd" "$_cfg_default/kvmd"/web.css
|
||||
mkdir -p "$pkgdir/etc/kvmd/override.d"
|
||||
|
||||
mkdir -p "$pkgdir/var/lib/kvmd/"{msd,pst}
|
||||
chmod 1775 "$pkgdir/var/lib/kvmd/pst"
|
||||
}
|
||||
|
||||
|
||||
for _variant in "${_variants[@]}"; do
|
||||
_platform=${_variant%:*}
|
||||
_board=${_variant#*:}
|
||||
_base=${_platform%-*}
|
||||
_video=${_platform#*-}
|
||||
eval "package_kvmd-platform-$_platform-$_board() {
|
||||
cd \"kvmd-\$pkgver\"
|
||||
|
||||
pkgdesc=\"PiKVM platform configs - $_platform for $_board\"
|
||||
depends=(kvmd=$pkgver-$pkgrel \"linux-rpi-pikvm>=6.6.45-13\" \"raspberrypi-bootloader-pikvm>=20240818-1\")
|
||||
|
||||
backup=(
|
||||
etc/sysctl.d/99-kvmd.conf
|
||||
etc/udev/rules.d/99-kvmd.rules
|
||||
etc/kvmd/main.yaml
|
||||
)
|
||||
|
||||
if [[ $_base == v0 ]]; then
|
||||
depends=(\"\${depends[@]}\" platformio-core avrdude make patch)
|
||||
elif [[ $_base == v4plus ]]; then
|
||||
depends=(\"\${depends[@]}\" flashrom-pikvm)
|
||||
fi
|
||||
|
||||
if [[ $_platform =~ ^.*-hdmiusb$ ]]; then
|
||||
install -Dm755 -t \"\$pkgdir/usr/bin\" scripts/kvmd-udev-hdmiusb-check
|
||||
fi
|
||||
if [[ $_base == v4plus ]]; then
|
||||
install -Dm755 -t \"\$pkgdir/usr/bin\" scripts/kvmd-udev-restart-pass
|
||||
fi
|
||||
|
||||
install -DTm644 configs/os/sysctl.conf \"\$pkgdir/etc/sysctl.d/99-kvmd.conf\"
|
||||
install -DTm644 configs/os/udev/common.rules \"\$pkgdir/usr/lib/udev/rules.d/99-kvmd-common.rules\"
|
||||
install -DTm644 configs/os/udev/$_platform-$_board.rules \"\$pkgdir/etc/udev/rules.d/99-kvmd.rules\"
|
||||
install -DTm444 configs/kvmd/main/$_platform-$_board.yaml \"\$pkgdir/etc/kvmd/main.yaml\"
|
||||
|
||||
if [ -f configs/kvmd/fan/$_platform.ini ]; then
|
||||
backup=(\"\${backup[@]}\" etc/kvmd/fan.ini)
|
||||
depends=(\"\${depends[@]}\" \"kvmd-fan>=0.18\")
|
||||
install -DTm444 configs/kvmd/fan/$_platform.ini \"\$pkgdir/etc/kvmd/fan.ini\"
|
||||
fi
|
||||
|
||||
if [ -f configs/os/modules-load/$_platform.conf ]; then
|
||||
backup=(\"\${backup[@]}\" etc/modules-load.d/kvmd.conf)
|
||||
install -DTm644 configs/os/modules-load/$_platform.conf \"\$pkgdir/etc/modules-load.d/kvmd.conf\"
|
||||
fi
|
||||
|
||||
if [ -f configs/os/sudoers/$_platform ]; then
|
||||
backup=(\"\${backup[@]}\" etc/sudoers.d/99_kvmd)
|
||||
install -DTm440 configs/os/sudoers/$_platform \"\$pkgdir/etc/sudoers.d/99_kvmd\"
|
||||
chmod 750 \"\$pkgdir/etc/sudoers.d\"
|
||||
fi
|
||||
|
||||
if [[ $_platform =~ ^.*-hdmi$ ]]; then
|
||||
backup=(\"\${backup[@]}\" etc/kvmd/tc358743-edid.hex etc/kvmd/switch-edid.hex)
|
||||
install -DTm444 configs/kvmd/edid/$_base.hex \"\$pkgdir/etc/kvmd/tc358743-edid.hex\"
|
||||
ln -s tc358743-edid.hex \"\$pkgdir/etc/kvmd/switch-edid.hex\"
|
||||
else
|
||||
backup=(\"\${backup[@]}\" etc/kvmd/switch-edid.hex)
|
||||
install -DTm444 configs/kvmd/edid/_no-1920x1200.hex \"\$pkgdir/etc/kvmd/switch-edid.hex\"
|
||||
fi
|
||||
|
||||
mkdir -p \"\$pkgdir/usr/share/kvmd\"
|
||||
local _platform=\"\$pkgdir/usr/share/kvmd/platform\"
|
||||
rm -f \"\$_platform\"
|
||||
echo PIKVM_MODEL=$_base > \"\$_platform\"
|
||||
echo PIKVM_VIDEO=$_video >> \"\$_platform\"
|
||||
echo PIKVM_BOARD=$_board >> \"\$_platform\"
|
||||
chmod 444 \"\$_platform\"
|
||||
}"
|
||||
done
|
||||
307
README.en.md
307
README.en.md
@ -1,307 +0,0 @@
|
||||
<div align="center">
|
||||
<img src="https://github.com/mofeng-git/Build-Armbian/assets/62919083/add9743a-0987-4e8a-b2cb-62121f236582" alt="One-KVM Logo" width="300">
|
||||
<h1>One-KVM</h1>
|
||||
<p><strong>DIY IP-KVM solution based on PiKVM</strong></p>
|
||||
|
||||
[](https://github.com/mofeng-git/One-KVM/stargazers)
|
||||
[](https://github.com/mofeng-git/One-KVM/network/members)
|
||||
[](https://github.com/mofeng-git/One-KVM/issues)
|
||||
[](https://github.com/mofeng-git/One-KVM/blob/master/LICENSE)
|
||||
|
||||
<p>
|
||||
<a href="https://one-kvm.mofeng.run">📖 Documentation</a> •
|
||||
<a href="https://kvmd-demo.mofeng.run">🚀 Live Demo</a> •
|
||||
<a href="#quick-start">⚡ Quick Start</a> •
|
||||
<a href="#features">📊 Features</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
[简体中文](README.md) | English
|
||||
|
||||
---
|
||||
|
||||
## 📋 Table of Contents
|
||||
|
||||
- [Overview](#project-overview)
|
||||
- [Features](#features)
|
||||
- [Quick Start](#quick-start)
|
||||
- [Contributing](#contributing)
|
||||
- [Others](#others)
|
||||
|
||||
## 📖 Project Overview
|
||||
|
||||
**One-KVM** is a DIY IP-KVM solution built upon the open-source [PiKVM](https://github.com/pikvm/pikvm) project. It uses cost-effective hardware to provide BIOS-level remote management for servers and workstations.
|
||||
|
||||
### Use Cases
|
||||
|
||||
- **Home lab management** – Remotely manage servers and development devices
|
||||
- **Server maintenance** – Perform system maintenance without physical access
|
||||
- **System recovery** – Troubleshoot boot and BIOS/UEFI issues remotely
|
||||
|
||||

|
||||
|
||||
## 📊 Features
|
||||
|
||||
### Core Capabilities
|
||||
|
||||
| Feature | Description | Benefit |
|
||||
|------|------|------|
|
||||
| **Non-intrusive** | No software/driver required on the target machine | OS-agnostic; access BIOS/UEFI |
|
||||
| **Cost-effective** | Leverages affordable hardware (TV boxes, dev boards) | Lower cost for KVM-over-IP |
|
||||
| **Extendable** | Added utilities on top of PiKVM | Docker, recording, Chinese UI |
|
||||
| **Deployment** | Supports Docker and prebuilt images | Preconfigured images for specific devices |
|
||||
|
||||
### Limitations
|
||||
|
||||
This project is maintained by an individual with limited resources and no commercial plan.
|
||||
|
||||
- No built-in free NAT punching/tunneling service
|
||||
- No 24×7 technical support
|
||||
- No guarantee on stability/compliance; use at your own risk
|
||||
- User experience is optimized, but basic technical skills are still required
|
||||
|
||||
### Feature Comparison
|
||||
|
||||
> 💡 **Note:** The table below compares One-KVM with other PiKVM-based projects for reference only. If there are omissions or inaccuracies, please open an issue to help improve it.
|
||||
|
||||
| Feature | One-KVM | PiKVM | ArmKVM | BLIKVM |
|
||||
|:--------:|:-------:|:-----:|:------:|:------:|
|
||||
| Simplified Chinese WebUI | ✅ | ❌ | ✅ | ✅ |
|
||||
| Remote video stream | MJPEG/H.264 | MJPEG/H.264 | MJPEG/H.264 | MJPEG/H.264 |
|
||||
| H.264 encoding | CPU | GPU | Unknown | GPU |
|
||||
| Remote audio | ✅ | ✅ | ✅ | ✅ |
|
||||
| Remote mouse/keyboard | OTG/CH9329 | OTG/CH9329/Pico/Bluetooth | OTG | OTG |
|
||||
| VNC control | ✅ | ✅ | ✅ | ✅ |
|
||||
| ATX power control | GPIO/USB relay | GPIO | GPIO | GPIO |
|
||||
| Virtual drive mounting | ✅ | ✅ | ✅ | ✅ |
|
||||
| Web terminal | ✅ | ✅ | ✅ | ✅ |
|
||||
| Docker deployment | ✅ | ❌ | ❌ | ❌ |
|
||||
| Commercial offering | ❌ | ✅ | ✅ | ✅ |
|
||||
|
||||
## ⚡ Quick Start
|
||||
|
||||
### Method 1: Docker (Recommended)
|
||||
|
||||
The Docker variant supports OTG or CH9329 as virtual HID and runs on Linux for amd64/arm64/armv7.
|
||||
|
||||
#### One-liner Script
|
||||
|
||||
```bash
|
||||
curl -sSL https://one-kvm.mofeng.run/quick_start.sh -o quick_start.sh && bash quick_start.sh
|
||||
```
|
||||
|
||||
#### Manual Deployment
|
||||
|
||||
It is recommended to use the `--net=host` network mode for better WOL functionality and WebRTC communication support.
|
||||
|
||||
Docker host network mode:
|
||||
|
||||
Port 8080: HTTP Web service
|
||||
Port 4430: HTTPS Web service
|
||||
Port 5900: VNC service
|
||||
Port 623: IPMI service
|
||||
Ports 20000-40000: WebRTC communication port range for low-latency video
|
||||
Port 9 (UDP): Wake-on-LAN (WOL)
|
||||
|
||||
Docker host mode:
|
||||
|
||||
**Using OTG as virtual HID:**
|
||||
|
||||
```bash
|
||||
sudo docker run --name kvmd -itd --privileged=true \
|
||||
-v /lib/modules:/lib/modules:ro -v /dev:/dev \
|
||||
-v /sys/kernel/config:/sys/kernel/config -e OTG=1 \
|
||||
--net=host \
|
||||
silentwind0/kvmd
|
||||
```
|
||||
|
||||
**Using CH9329 as virtual HID:**
|
||||
|
||||
```bash
|
||||
sudo docker run --name kvmd -itd \
|
||||
--device /dev/video0:/dev/video0 \
|
||||
--device /dev/ttyUSB0:/dev/ttyUSB0 \
|
||||
--net=host \
|
||||
silentwind0/kvmd
|
||||
```
|
||||
|
||||
Docker bridge mode:
|
||||
|
||||
**Using OTG as virtual HID:**
|
||||
|
||||
```bash
|
||||
sudo docker run --name kvmd -itd --privileged=true \
|
||||
-v /lib/modules:/lib/modules:ro -v /dev:/dev \
|
||||
-v /sys/kernel/config:/sys/kernel/config -e OTG=1 \
|
||||
-p 8080:8080 -p 4430:4430 -p 5900:5900 -p 623:623 \
|
||||
silentwind0/kvmd
|
||||
```
|
||||
|
||||
**Using CH9329 as virtual HID:**
|
||||
|
||||
```bash
|
||||
sudo docker run --name kvmd -itd \
|
||||
--device /dev/video0:/dev/video0 \
|
||||
--device /dev/ttyUSB0:/dev/ttyUSB0 \
|
||||
-p 8080:8080 -p 4430:4430 -p 5900:5900 -p 623:623 \
|
||||
silentwind0/kvmd
|
||||
```
|
||||
|
||||
### Method 2: Flash Prebuilt One-KVM Images
|
||||
|
||||
Preconfigured images are provided for specific hardware platforms to simplify deployment and enable out-of-the-box experience.
|
||||
|
||||
#### Download
|
||||
|
||||
**GitHub:**
|
||||
- **GitHub Releases:** [https://github.com/mofeng-git/One-KVM/releases](https://github.com/mofeng-git/One-KVM/releases)
|
||||
|
||||
**Other mirrors:**
|
||||
- **No-login mirror:** [https://pan.huang1111.cn/s/mxkx3T1](https://pan.huang1111.cn/s/mxkx3T1)
|
||||
- **Baidu Netdisk:** [https://pan.baidu.com/s/166-2Y8PBF4SbHXFkGmFJYg?pwd=o9aj](https://pan.baidu.com/s/166-2Y8PBF4SbHXFkGmFJYg?pwd=o9aj) (code: o9aj)
|
||||
|
||||
#### Supported Hardware Platforms
|
||||
|
||||
| Firmware | Codename | Hardware | Latest | Status |
|
||||
|:--------:|:--------:|:--------:|:------:|:----:|
|
||||
| OneCloud | Onecloud | USB capture card, OTG | 241018 | ✅ |
|
||||
| CumeBox 2 | Cumebox2 | USB capture card, OTG | 241004 | ✅ |
|
||||
| Vmare | Vmare-uefi | USB capture card, CH9329 | 241004 | ✅ |
|
||||
| VirtualBox | Virtualbox-uefi | USB capture card, CH9329 | 241004 | ✅ |
|
||||
| s905l3a Generic | E900v22c | USB capture card, OTG | 241004 | ✅ |
|
||||
| Chainedbox | Chainedbox | USB capture card, OTG | 241004 | ✅ |
|
||||
| Loongson 2K0300 | 2k0300 | USB capture card, CH9329 | 241025 | ✅ |
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
Contributions of all kinds are welcome!
|
||||
|
||||
### How to Contribute
|
||||
|
||||
1. **Fork this repo**
|
||||
2. **Create a feature branch:** `git checkout -b feature/AmazingFeature`
|
||||
3. **Commit your changes:** `git commit -m 'Add some AmazingFeature'`
|
||||
4. **Push to the branch:** `git push origin feature/AmazingFeature`
|
||||
5. **Open a Pull Request**
|
||||
|
||||
### Report Issues
|
||||
|
||||
If you find bugs or have suggestions:
|
||||
1. Open an issue via [GitHub Issues](https://github.com/mofeng-git/One-KVM/issues)
|
||||
2. Provide detailed error logs and reproduction steps
|
||||
3. Include your hardware and system information
|
||||
|
||||
### Sponsorship
|
||||
|
||||
This project builds upon many great open-source projects and requires considerable time for testing and maintenance. If you find it helpful, consider supporting via **[Afdian](https://afdian.com/a/silentwind)**.
|
||||
|
||||
#### Thanks
|
||||
|
||||
<details>
|
||||
<summary><strong>Click to view the thank-you list</strong></summary>
|
||||
|
||||
- 浩龙的电子嵌入式之路
|
||||
|
||||
- Tsuki
|
||||
|
||||
- H_xiaoming
|
||||
|
||||
- 0蓝蓝0
|
||||
|
||||
- fairybl
|
||||
|
||||
- Will
|
||||
|
||||
- 浩龙的电子嵌入式之路
|
||||
|
||||
- 自.知
|
||||
|
||||
- 观棋不语٩ ི۶
|
||||
|
||||
- 爱发电用户_a57a4
|
||||
|
||||
- 爱发电用户_2c769
|
||||
|
||||
- 霜序
|
||||
|
||||
- 远方(闲鱼用户名:小远技术店铺)
|
||||
|
||||
- 爱发电用户_399fc
|
||||
|
||||
- 斐斐の
|
||||
|
||||
- 爱发电用户_09451
|
||||
|
||||
- 超高校级的錆鱼
|
||||
|
||||
- 爱发电用户_08cff
|
||||
|
||||
- guoke
|
||||
|
||||
- mgt
|
||||
|
||||
- 姜沢掵
|
||||
|
||||
- ui_beam
|
||||
|
||||
- 爱发电用户_c0dd7
|
||||
|
||||
- 爱发电用户_dnjK
|
||||
|
||||
- 忍者胖猪
|
||||
|
||||
- 永遠の願い
|
||||
|
||||
- 爱发电用户_GBrF
|
||||
|
||||
- 爱发电用户_fd65c
|
||||
|
||||
- 爱发电用户_vhNa
|
||||
|
||||
- 爱发电用户_Xu6S
|
||||
|
||||
- moss
|
||||
|
||||
- woshididi
|
||||
|
||||
- 爱发电用户_a0fd1
|
||||
|
||||
- 爱发电用户_f6bH
|
||||
|
||||
- 码农
|
||||
|
||||
- 爱发电用户_6639f
|
||||
|
||||
- jeron
|
||||
|
||||
- 爱发电用户_CN7y
|
||||
|
||||
- 爱发电用户_Up6w
|
||||
|
||||
- 爱发电用户_e3202
|
||||
|
||||
- ......
|
||||
|
||||
</details>
|
||||
|
||||
#### Sponsors
|
||||
|
||||
This project is supported by the following sponsors:
|
||||
|
||||
**CDN & Security:**
|
||||
- **[Tencent EdgeOne](https://edgeone.ai/zh?from=github)** – CDN acceleration and security protection
|
||||
|
||||

|
||||
|
||||
**File Storage:**
|
||||
- **[Huang1111公益计划](https://pan.huang1111.cn/s/mxkx3T1)** – No-login download service
|
||||
|
||||
## 📚 Others
|
||||
|
||||
### Open-source Projects Used
|
||||
|
||||
This project is built upon the following excellent open-source projects:
|
||||
|
||||
- [PiKVM](https://github.com/pikvm/pikvm) – Open-source DIY IP-KVM solution
|
||||
|
||||
|
||||
334
README.md
334
README.md
@ -1,328 +1,82 @@
|
||||
<div align="center">
|
||||
<img src="https://github.com/mofeng-git/Build-Armbian/assets/62919083/add9743a-0987-4e8a-b2cb-62121f236582" alt="One-KVM Logo" width="300">
|
||||
<h1>One-KVM</h1>
|
||||
<p><strong>基于 PiKVM 的 DIY IP-KVM 解决方案</strong></p>
|
||||
<h3 align=center><img src="https://github.com/mofeng-git/Build-Armbian/assets/62919083/add9743a-0987-4e8a-b2cb-62121f236582" alt="logo" width="300"><br></h3>
|
||||
<h3 align=center><a href="https://github.com/mofeng-git/One-KVM/blob/master/README.md">简体中文</a> </h3>
|
||||
<p align=right> </p>
|
||||
|
||||
<p><a href="README.md">简体中文</a> | <a href="README.en.md">English</a></p>
|
||||
### 介绍
|
||||
|
||||
[](https://github.com/mofeng-git/One-KVM/stargazers)
|
||||
[](https://github.com/mofeng-git/One-KVM/network/members)
|
||||
[](https://github.com/mofeng-git/One-KVM/issues)
|
||||
[](https://github.com/mofeng-git/One-KVM/blob/master/LICENSE)
|
||||
One-KVM是基于玩客云硬件和PiKVM软件的远控设备。通过移植PiKVM该软件至玩客云设备上,实现了极高的性价比,不到百元功能即可接近甚至超越部分昂贵的商业设备。
|
||||
|
||||
<p>
|
||||
<a href="https://docs.one-kvm.cn">📖 详细文档</a> •
|
||||
<a href="https://demo.one-kvm.cn/">🚀 在线演示</a> •
|
||||
<a href="#快速开始">⚡ 快速开始</a> •
|
||||
<a href="#功能介绍">📊 功能介绍</a>
|
||||
</p>
|
||||
</div>
|
||||
该软件可以帮助用户通过得到控制设备的HDMI 画面和鼠标键盘,去远程管理服务器、工作站或个人PC等。 和基于软件的远程管理方式不同,无需在被控电脑安装任何软件,实现无侵入式控制。
|
||||
|
||||
---
|
||||
该项目基于PiKVM,提供了玩客云兼容PiKVM操作的自动处理脚本。
|
||||
|
||||
## 📋 目录
|
||||

|
||||
|
||||
- [项目概述](#项目概述)
|
||||
- [功能介绍](#功能介绍)
|
||||
- [快速开始](#快速开始)
|
||||
- [贡献指南](#贡献指南)
|
||||
- [其他](#其他)
|
||||
**功能特性**
|
||||
|
||||
## 📖 项目概述
|
||||

|
||||
|
||||
**One-KVM** 是基于开源 [PiKVM](https://github.com/pikvm/pikvm) 项目进行二次开发的 DIY IP-KVM 解决方案。该方案利用成本较低的硬件设备,实现 BIOS 级别的远程服务器或工作站管理功能。
|
||||
|
||||
> 本项目目前并无适配树莓派的计划。这是因为树莓派平台本质上属于 PiKVM 官方硬件生态和盈利的一部分。我们非常尊重和感谢上游项目 PiKVM ,因此 One-KVM 的设备适配主要聚焦于补充性场景,尽量避免与 PiKVM 官方产品产生重叠,以支持其可持续发展。
|
||||
### 快速开始
|
||||
|
||||
### 应用场景
|
||||
**方式一:直刷One-KVM镜像**
|
||||
|
||||
- **家庭实验室主机管理** - 远程管理服务器和开发设备
|
||||
- **服务器远程维护** - 无需物理接触即可进行系统维护
|
||||
- **系统故障处理** - 远程解决系统启动和 BIOS 相关问题
|
||||
本项目Releases页可以找到包含PiKVM的预编译镜像,内核版本为5.9.0-rc7。镜像名称带One-KVM前缀、burn后缀的为线刷镜像,可使用USB_Burning_Tool软件线刷至玩客云。预编译线刷镜像为开箱即用,刷好后启动设备就可以开始使用One-KVM。
|
||||
|
||||

|
||||
**方式二:One-KVM脚本安装**
|
||||
|
||||
## 📊 功能介绍
|
||||
|
||||
### 核心特性
|
||||
|
||||
| 特性 | 描述 | 优势 |
|
||||
|------|------|------|
|
||||
| **无侵入性** | 无需在目标机器上安装软件或驱动 | 不依赖操作系统,可访问 BIOS/UEFI 设置 |
|
||||
| **成本效益** | 利用常见硬件设备(如电视盒子、开发板等) | 降低 KVM over IP 的实现成本 |
|
||||
| **功能扩展** | 在 PiKVM 基础上增加实用功能 | Docker 部署、视频录制、中文界面 |
|
||||
| **部署方式** | 支持 Docker 部署和硬件整合包 | 为特定硬件平台提供预配置方案 |
|
||||
|
||||
### 项目限制
|
||||
|
||||
本项目为个人维护的开源项目,资源有限,无商业运营计划
|
||||
|
||||
- 不提供内置免费内网穿透服务,相关问题请自行解决
|
||||
- 不提供24×7小时技术支持服务
|
||||
- 不承诺系统稳定性和合规性,使用风险需自行承担
|
||||
- 尽力优化用户体验,但仍需要一定的技术基础
|
||||
|
||||
### 功能对比
|
||||
|
||||
> 💡 **说明:** 以下表格展示了 One-KVM 与其他基于 PiKVM 项目的功能对比,仅供参考。如有遗漏或错误,欢迎联系更正。
|
||||
|
||||
| 功能特性 | One-KVM | PiKVM | ArmKVM | BLIKVM |
|
||||
|:--------:|:-------:|:-----:|:------:|:------:|
|
||||
| 简体中文 WebUI | ✅ | ❌ | ✅ | ✅ |
|
||||
| 远程视频流 | MJPEG/H.264 | MJPEG/H.264 | MJPEG/H.264 | MJPEG/H.264 |
|
||||
| H.264 视频编码 | CPU/GPU | GPU | 未知 | GPU |
|
||||
| 远程音频流 | ✅ | ✅ | ✅ | ✅ |
|
||||
| 远程鼠键控制 | OTG/CH9329 | OTG/CH9329/Pico/Bluetooth | OTG | OTG |
|
||||
| VNC 控制 | ✅ | ✅ | ✅ | ✅ |
|
||||
| ATX 电源控制 | GPIO/USB 继电器 | GPIO | GPIO | GPIO |
|
||||
| 虚拟存储驱动器挂载 | ✅ | ✅ | ✅ | ✅ |
|
||||
| 网页终端 | ✅ | ✅ | ✅ | ✅ |
|
||||
| Docker 部署 | ✅ | ❌ | ❌ | ❌ |
|
||||
| 商业化运营 | ❌ | ✅ | ✅ | ✅ |
|
||||
|
||||
## ⚡ 快速开始
|
||||
|
||||
### 方式一:Docker 镜像部署(推荐)
|
||||
|
||||
Docker 版本支持 OTG 或 CH9329 作为虚拟 HID,兼容 amd64、arm64、armv7 架构的 Linux 系统。
|
||||
|
||||
#### 一键脚本部署
|
||||
一键脚本,对于非玩客云设备安装未作测试,适用于玩客云Armbian Jammy系统。
|
||||
|
||||
```bash
|
||||
curl -sSL https://docs.one-kvm.cn/quick_start.sh -o quick_start.sh && bash quick_start.sh
|
||||
git clone https://github.com/mofeng-git/One-KVM.git
|
||||
cd One-KVM && ./install.sh
|
||||
|
||||
#对于大陆网络环境,可以尝试使用下命令
|
||||
wget https://mirror.ghproxy.com/https://github.com/mofeng-git/One-KVM/archive/refs/heads/main.zip -o One-KVM-main.zip && unzip One-KVM-main.zip
|
||||
cd One-KVM-main && ./install.sh
|
||||
```
|
||||
**方式三:docker镜像部署**
|
||||
|
||||
#### 手动部署
|
||||
|
||||
推荐使用 --net=host 网络模式以获得更好的 wol 功能和 webrtc 通信支持。
|
||||
|
||||
docker host 网络模式:
|
||||
|
||||
端口 8080:HTTP Web 服务
|
||||
端口 4430:HTTPS Web 服务
|
||||
端口 5900:VNC 服务
|
||||
端口 623:IPMI 服务
|
||||
端口 20000-40000:WebRTC 通信端口范围,用于低延迟视频传输
|
||||
端口 9(UDP):Wake-on-LAN(WOL)唤醒功能
|
||||
|
||||
docker host 模式:
|
||||
|
||||
**使用 OTG 作为虚拟 HID:**
|
||||
|
||||
目前仅有pikvm-ch9329_amd64,后续将支持更多控制方式和处理器架构。
|
||||
```bash
|
||||
sudo docker run --name kvmd -itd --privileged=true \
|
||||
-v /lib/modules:/lib/modules:ro -v /dev:/dev \
|
||||
-v /sys/kernel/config:/sys/kernel/config -e OTG=1 \
|
||||
--net=host \
|
||||
silentwind0/kvmd
|
||||
#使用示例:
|
||||
docker run -itd -p443:443 -p80:80 --name pikvm-docker --device=/dev/ttyUSB0:/dev/kvmd-hid --device=/dev/video0:/dev/kvmd-video pikvm-ch9329:0.61
|
||||
```
|
||||
|
||||
**使用 CH9329 作为虚拟 HID:**
|
||||
详细内容可以参照飞书文档:[One-KVM使用文档](https://p1b237lu9xm.feishu.cn/drive/folder/IsOifWmMKlzYpRdWfcocI7jdnQA?from=from_copylink)
|
||||
|
||||
```bash
|
||||
sudo docker run --name kvmd -itd \
|
||||
--device /dev/video0:/dev/video0 \
|
||||
--device /dev/ttyUSB0:/dev/ttyUSB0 \
|
||||
--net=host \
|
||||
silentwind0/kvmd
|
||||
```
|
||||
### 其他
|
||||
|
||||
docker bridge 模式:
|
||||
|
||||
**使用 OTG 作为虚拟 HID:**
|
||||
|
||||
```bash
|
||||
sudo docker run --name kvmd -itd --privileged=true \
|
||||
-v /lib/modules:/lib/modules:ro -v /dev:/dev \
|
||||
-v /sys/kernel/config:/sys/kernel/config -e OTG=1 \
|
||||
-p 8080:8080 -p 4430:4430 -p 5900:5900 -p 623:623 \
|
||||
silentwind0/kvmd
|
||||
```
|
||||
|
||||
**使用 CH9329 作为虚拟 HID:**
|
||||
|
||||
```bash
|
||||
sudo docker run --name kvmd -itd \
|
||||
--device /dev/video0:/dev/video0 \
|
||||
--device /dev/ttyUSB0:/dev/ttyUSB0 \
|
||||
-p 8080:8080 -p 4430:4430 -p 5900:5900 -p 623:623 \
|
||||
silentwind0/kvmd
|
||||
```
|
||||
|
||||
### 方式二:直刷 One-KVM 整合包
|
||||
|
||||
针对特定硬件平台,提供了预配置的 One-KVM 打包镜像,简化部署流程,实现开箱即用。
|
||||
|
||||
#### 固件下载
|
||||
|
||||
**GitHub 下载:**
|
||||
- **GitHub Releases:** [https://github.com/mofeng-git/One-KVM/releases](https://github.com/mofeng-git/One-KVM/releases)
|
||||
|
||||
**其他下载方式:**
|
||||
- **免登录高速下载:** [http://sd1.files.one-kvm.cn/](http://sd1.files.one-kvm.cn/)(由群友赞助,支持直链,接入 EdgeOne CDN,建议使用多线程下载工具下载获取最高速度)
|
||||
- **免登录下载:** [https://pan.huang1111.cn/s/mxkx3T1](https://pan.huang1111.cn/s/mxkx3T1) (由 Huang1111公益计划 提供)
|
||||
- **百度网盘:** [https://pan.baidu.com/s/166-2Y8PBF4SbHXFkGmFJYg?pwd=o9aj](https://pan.baidu.com/s/166-2Y8PBF4SbHXFkGmFJYg?pwd=o9aj) (提取码:o9aj)
|
||||
|
||||
#### 支持的硬件平台
|
||||
|
||||
| 固件型号 | 固件代号 | 硬件配置 | 最新版本 | 状态 |
|
||||
|:--------:|:--------:|:--------:|:--------:|:----:|
|
||||
| 玩客云 | Onecloud | USB 采集卡、OTG | 241018 | ✅ |
|
||||
| 私家云二代 | Cumebox2 | USB 采集卡、OTG | 241004 | ✅ |
|
||||
| Vmare | Vmare-uefi | USB 采集卡、CH9329 | 241004 | ✅ |
|
||||
| Virtualbox | Virtualbox-uefi | USB 采集卡、CH9329 | 241004 | ✅ |
|
||||
| s905l3a 通用包 | E900v22c | USB 采集卡、OTG | 241004 | ✅ |
|
||||
| 我家云 | Chainedbox | USB 采集卡、OTG | 241004 | ✅ |
|
||||
| 龙芯久久派 | 2k0300 | USB 采集卡、CH9329 | 241025 | ❌ |
|
||||
|
||||
### 报告问题
|
||||
|
||||
如果您发现了问题,请:
|
||||
1. 使用 [GitHub Issues](https://github.com/mofeng-git/One-KVM/issues) 报告
|
||||
2. 提供详细的错误信息和复现步骤
|
||||
3. 包含您的硬件配置和系统信息
|
||||
|
||||
### 赞助支持
|
||||
|
||||
本项目基于多个优秀开源项目进行二次开发,作者投入了大量时间进行测试和维护。如果您觉得这个项目有价值,欢迎通过 **[为爱发电](https://afdian.com/a/silentwind)** 支持项目发展。
|
||||
|
||||
#### 感谢名单
|
||||
**感谢名单**
|
||||
|
||||
<details>
|
||||
<summary><strong>点击查看感谢名单</strong></summary>
|
||||
|
||||
- 浩龙的电子嵌入式之路
|
||||
浩龙的电子嵌入式之路(赞助)
|
||||
|
||||
- Tsuki
|
||||
Tsuki(赞助)
|
||||
|
||||
- H_xiaoming
|
||||
H_xiaoming
|
||||
|
||||
- 0蓝蓝0
|
||||
0蓝蓝0
|
||||
|
||||
- fairybl
|
||||
fairybl
|
||||
|
||||
- Will
|
||||
Will
|
||||
|
||||
- 浩龙的电子嵌入式之路
|
||||
浩龙的电子嵌入式之路
|
||||
|
||||
- 自.知
|
||||
自.知
|
||||
|
||||
- 观棋不语٩ ི۶
|
||||
|
||||
- 爱发电用户_a57a4
|
||||
|
||||
- 爱发电用户_2c769
|
||||
|
||||
- 霜序
|
||||
|
||||
- 远方(闲鱼用户名:小远技术店铺)
|
||||
|
||||
- 爱发电用户_399fc
|
||||
|
||||
- 斐斐の
|
||||
|
||||
- 爱发电用户_09451
|
||||
|
||||
- 超高校级的錆鱼
|
||||
|
||||
- 爱发电用户_08cff
|
||||
|
||||
- guoke
|
||||
|
||||
- mgt
|
||||
|
||||
- 姜沢掵
|
||||
|
||||
- ui_beam
|
||||
|
||||
- 爱发电用户_c0dd7
|
||||
|
||||
- 爱发电用户_dnjK
|
||||
|
||||
- 忍者胖猪
|
||||
|
||||
- 永遠の願い
|
||||
|
||||
- 爱发电用户_GBrF
|
||||
|
||||
- 爱发电用户_fd65c
|
||||
|
||||
- 爱发电用户_vhNa
|
||||
|
||||
- 爱发电用户_Xu6S
|
||||
|
||||
- moss
|
||||
|
||||
- woshididi
|
||||
|
||||
- 爱发电用户_a0fd1
|
||||
|
||||
- 爱发电用户_f6bH
|
||||
|
||||
- 码农
|
||||
|
||||
- 爱发电用户_6639f
|
||||
|
||||
- jeron
|
||||
|
||||
- 爱发电用户_CN7y
|
||||
|
||||
- 爱发电用户_Up6w
|
||||
|
||||
- 爱发电用户_e3202
|
||||
|
||||
- 一语念白
|
||||
|
||||
- 云边
|
||||
|
||||
- 爱发电用户_5a711
|
||||
|
||||
- 爱发电用户_9a706
|
||||
|
||||
- T0m9ir1SUKI
|
||||
|
||||
- 爱发电用户_56d52
|
||||
|
||||
- 爱发电用户_3N6F
|
||||
|
||||
- DUSK
|
||||
|
||||
- 飘零
|
||||
|
||||
- .
|
||||
|
||||
- 饭太稀
|
||||
|
||||
- 葱
|
||||
|
||||
- ......
|
||||
观棋不语٩ ི۶
|
||||
|
||||
以及各位讨论交流的网友
|
||||
</details>
|
||||
|
||||
#### 赞助商
|
||||
**更新日志**
|
||||
|
||||
本项目得到以下赞助商的支持:
|
||||
[One-KVM/ChangeLogs.txt](https://github.com/mofeng-git/One-KVM/blob/main/ChangeLogs.txt)
|
||||
|
||||
**CDN 加速及安全防护:**
|
||||
- **[Tencent EdgeOne](https://edgeone.ai/zh?from=github)** - 提供 CDN 加速及安全防护服务
|
||||
|
||||

|
||||
|
||||
**文件存储服务:**
|
||||
- **[Huang1111公益计划](https://pan.huang1111.cn/s/mxkx3T1)** - 提供免登录下载服务
|
||||
|
||||
**云服务商**
|
||||
|
||||
- **[林枫云](https://www.dkdun.cn)** - 赞助了本项目宁波大带宽服务器
|
||||
|
||||

|
||||
|
||||
林枫云主营国内外地域的精品线路业务服务器、高主频游戏服务器和大带宽服务器。
|
||||
|
||||
## 📚 其他
|
||||
|
||||
### 使用的开源项目
|
||||
|
||||
本项目基于以下优秀开源项目进行二次开发:
|
||||
|
||||
- [PiKVM](https://github.com/pikvm/pikvm) - 开源的 DIY IP-KVM 解决方案
|
||||
本项目间接或直接使用了下下列开源项目:
|
||||
1. [pikvm/pikvm: Open and inexpensive DIY IP-KVM based on Raspberry Pi (github.com)](https://github.com/pikvm/pikvm)
|
||||
2. [hzyitc/armbian-onecloud: Armbian for onecloud. 玩客云用armbian (github.com)](https://github.com/hzyitc/armbian-onecloud/)
|
||||
3. [jacobbar/fruity-pikvm: Install Pi-KVM on debian SBCs such as Orange Pi, Banana Pi, Mango Pi, etc (github.com)](https://github.com/jacobbar/fruity-pikvm)
|
||||
|
||||
133
build/Dockerfile
133
build/Dockerfile
@ -1,133 +0,0 @@
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd-stage-0 AS builder
|
||||
|
||||
FROM python:3.11.11-slim-bookworm
|
||||
|
||||
LABEL maintainer="mofeng654321@hotmail.com"
|
||||
|
||||
ARG TARGETARCH
|
||||
|
||||
COPY --from=builder /tmp/lib/* /tmp/lib/
|
||||
COPY --from=builder /tmp/ustreamer/ustreamer /tmp/ustreamer/ustreamer-dump /usr/bin/janus /usr/bin/
|
||||
COPY --from=builder /tmp/wheel/*.whl /tmp/wheel/
|
||||
COPY --from=builder /tmp/ustreamer/libjanus_ustreamer.so /usr/lib/ustreamer/janus/
|
||||
COPY --from=builder /usr/lib/janus/transports/* /usr/lib/janus/transports/
|
||||
COPY --from=builder /tmp/arm64-libs.tar.gz* /tmp/
|
||||
RUN if [ ${TARGETARCH} = arm64 ] && [ -f /tmp/arm64-libs.tar.gz ]; then \
|
||||
cd / && tar -xzf /tmp/arm64-libs.tar.gz && rm -f /tmp/arm64-libs.tar.gz; \
|
||||
fi
|
||||
|
||||
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||
PYTHONUNBUFFERED=1 \
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list.d/debian.sources \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
libxkbcommon-x11-0 \
|
||||
nginx \
|
||||
tesseract-ocr \
|
||||
tesseract-ocr-eng \
|
||||
tesseract-ocr-chi-sim \
|
||||
iptables \
|
||||
sudo \
|
||||
curl \
|
||||
kmod \
|
||||
libmicrohttpd12 \
|
||||
libjansson4 \
|
||||
libssl3 \
|
||||
libsofia-sip-ua0 \
|
||||
libglib2.0-0 \
|
||||
libopus0 \
|
||||
libogg0 \
|
||||
libcurl4 \
|
||||
libconfig9 \
|
||||
libusrsctp2 \
|
||||
libwebsockets17 \
|
||||
libnss3 \
|
||||
libasound2 \
|
||||
libdrm2 \
|
||||
libx264-164 \
|
||||
libyuv0 \
|
||||
nano \
|
||||
unzip \
|
||||
&& case ${TARGETARCH} in \
|
||||
amd64) \
|
||||
apt-get install -y --no-install-recommends \
|
||||
libavcodec59 libavformat59 libavutil57 \
|
||||
libswscale6 libavfilter8 libavdevice59 \
|
||||
ffmpeg vainfo \
|
||||
libva2 libva-drm2 libva-x11-2 \
|
||||
mesa-va-drivers mesa-vdpau-drivers \
|
||||
intel-media-va-driver i965-va-driver \
|
||||
;; \
|
||||
arm) \
|
||||
apt-get install -y --no-install-recommends \
|
||||
libavcodec59 libavformat59 libavutil57 \
|
||||
libswscale6 libavfilter8 libavdevice59 \
|
||||
v4l-utils libv4l-0 \
|
||||
;; \
|
||||
arm64) \
|
||||
apt-get install -y --no-install-recommends \
|
||||
v4l-utils libv4l-0 libavutil57 \
|
||||
libstdc++6 libavcodec59 libavformat59 \
|
||||
libswscale6 libavfilter8 libavdevice59 \
|
||||
libva2 libva-drm2 libva-x11-2 \
|
||||
libvdpau1 ocl-icd-libopencl1 \
|
||||
;; \
|
||||
*) \
|
||||
echo "Unsupported architecture: ${TARGETARCH}" && exit 1 \
|
||||
;; \
|
||||
esac \
|
||||
&& cp /tmp/lib/* /lib/*-linux-*/ \
|
||||
&& pip install --no-cache-dir --root-user-action=ignore --disable-pip-version-check /tmp/wheel/*.whl \
|
||||
&& pip install --no-cache-dir --root-user-action=ignore --disable-pip-version-check pyfatfs \
|
||||
&& if [ ${TARGETARCH} = arm ]; then ARCH=armhf; \
|
||||
elif [ ${TARGETARCH} = arm64 ]; then ARCH=aarch64; \
|
||||
elif [ ${TARGETARCH} = amd64 ]; then ARCH=x86_64; \
|
||||
fi \
|
||||
&& curl https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.$ARCH -L -o /usr/local/bin/ttyd \
|
||||
&& chmod +x /usr/local/bin/ttyd \
|
||||
&& mkdir -p /tmp/gostc && cd /tmp/gostc \
|
||||
&& case ${TARGETARCH} in \
|
||||
amd64) GOSTC_ARCH=amd64_v1 ;; \
|
||||
arm) GOSTC_ARCH=arm_7 ;; \
|
||||
arm64) GOSTC_ARCH=arm64_v8.0 ;; \
|
||||
*) echo "Unsupported architecture for gostc: ${TARGETARCH}" && exit 1 ;; \
|
||||
esac \
|
||||
&& curl -L https://github.com/mofeng-git/gostc-open/releases/download/v2.0.8-beta.2/gostc_linux_${GOSTC_ARCH}.tar.gz -o gostc.tar.gz \
|
||||
&& tar -xzf gostc.tar.gz \
|
||||
&& mv gostc /usr/bin/ \
|
||||
&& chmod +x /usr/bin/gostc \
|
||||
&& cd / && rm -rf /tmp/gostc \
|
||||
&& adduser kvmd --gecos "" --disabled-password \
|
||||
&& ln -sf /usr/share/tesseract-ocr/*/tessdata /usr/share/tessdata \
|
||||
&& mkdir -p /etc/kvmd_backup/override.d \
|
||||
/var/lib/kvmd/msd/images \
|
||||
/var/lib/kvmd/msd/meta \
|
||||
/var/lib/kvmd/pst/data \
|
||||
/var/lib/kvmd/msd/NormalFiles \
|
||||
/opt/vc/bin \
|
||||
/run/kvmd \
|
||||
/tmp/kvmd-nginx \
|
||||
&& touch /run/kvmd/ustreamer.sock \
|
||||
&& groupadd kvmd-selfauth \
|
||||
&& usermod -a -G kvmd-selfauth root \
|
||||
&& apt clean \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& rm -rf /tmp/lib /tmp/wheel \
|
||||
&& ustreamer -v
|
||||
|
||||
COPY testenv/fakes/vcgencmd scripts/kvmd* /usr/bin/
|
||||
COPY extras/ /usr/share/kvmd/extras/
|
||||
COPY web/ /usr/share/kvmd/web/
|
||||
COPY scripts/kvmd-gencert /usr/share/kvmd/
|
||||
COPY build/platform/docker /usr/share/kvmd/platform
|
||||
COPY contrib/keymaps /usr/share/kvmd/keymaps
|
||||
COPY kvmd/ build/init.sh /kvmd/
|
||||
COPY configs/kvmd/ /etc/kvmd_backup/
|
||||
COPY configs/nginx/ /etc/kvmd_backup/nginx/
|
||||
COPY configs/janus/ /etc/kvmd_backup/janus/
|
||||
COPY configs/hw_info/ /etc/kvmd_backup/hw_info/
|
||||
COPY testenv/js/ /usr/share/janus/javascript/
|
||||
|
||||
ENTRYPOINT ["/kvmd/init.sh"]
|
||||
@ -1,202 +0,0 @@
|
||||
# syntax = docker/dockerfile:experimental
|
||||
FROM debian:bookworm-slim AS builder
|
||||
|
||||
ARG TARGETARCH
|
||||
|
||||
# 设置环境变量
|
||||
ENV DEBIAN_FRONTEND=noninteractive \
|
||||
PIP_NO_CACHE_DIR=1 \
|
||||
RUSTUP_DIST_SERVER="https://mirrors.tuna.tsinghua.edu.cn/rustup"
|
||||
|
||||
# 更新源并安装依赖
|
||||
RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list.d/debian.sources \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
python3-full \
|
||||
python3-pip \
|
||||
python3-dev \
|
||||
build-essential \
|
||||
libssl-dev \
|
||||
libffi-dev \
|
||||
python3-dev \
|
||||
libevent-dev \
|
||||
libjpeg-dev \
|
||||
libbsd-dev \
|
||||
libudev-dev \
|
||||
git \
|
||||
pkg-config \
|
||||
wget \
|
||||
curl \
|
||||
libmicrohttpd-dev \
|
||||
libjansson-dev \
|
||||
libsofia-sip-ua-dev \
|
||||
libglib2.0-dev \
|
||||
libopus-dev \
|
||||
libogg-dev \
|
||||
libcurl4-openssl-dev \
|
||||
liblua5.3-dev \
|
||||
libconfig-dev \
|
||||
libtool \
|
||||
automake \
|
||||
autoconf \
|
||||
meson \
|
||||
cmake \
|
||||
libx264-dev \
|
||||
libyuv-dev \
|
||||
libasound2-dev \
|
||||
libspeex-dev \
|
||||
libspeexdsp-dev \
|
||||
libusb-1.0-0-dev \
|
||||
libldap2-dev \
|
||||
libsasl2-dev \
|
||||
libdrm-dev \
|
||||
mesa-va-drivers \
|
||||
mesa-vdpau-drivers \
|
||||
v4l-utils \
|
||||
libv4l-dev \
|
||||
ffmpeg \
|
||||
libavcodec-dev \
|
||||
libavformat-dev \
|
||||
libavutil-dev \
|
||||
libswscale-dev \
|
||||
libavfilter-dev \
|
||||
libavdevice-dev \
|
||||
&& if [ ${TARGETARCH} != arm ] && [ ${TARGETARCH} != arm64 ]; then \
|
||||
apt-get install -y --no-install-recommends \
|
||||
vainfo \
|
||||
libva-dev \
|
||||
libva-drm2 \
|
||||
libva-x11-2 \
|
||||
intel-media-va-driver \
|
||||
i965-va-driver; \
|
||||
fi \
|
||||
&& if [ ${TARGETARCH} = arm64 ]; then \
|
||||
apt-get install -y --no-install-recommends \
|
||||
ninja-build \
|
||||
zlib1g-dev \
|
||||
libswresample-dev; \
|
||||
fi \
|
||||
&& apt clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY build/cargo_config /tmp/config
|
||||
|
||||
# 配置 pip 源并安装 Python 依赖
|
||||
RUN --security=insecure pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \
|
||||
&& if [ ${TARGETARCH} = arm ]; then \
|
||||
mkdir -p /root/.cargo \
|
||||
&& chmod 777 /root/.cargo && mount -t tmpfs none /root/.cargo \
|
||||
&& wget https://sh.rustup.rs -O /root/rustup-init.sh \
|
||||
&& sh /root/rustup-init.sh -y \
|
||||
&& export PATH=$PATH:/root/.cargo/bin \
|
||||
&& cp /tmp/config /root/.cargo/config.toml; \
|
||||
fi \
|
||||
&& pip install --root-user-action=ignore --disable-pip-version-check --upgrade --break-system-packages build setuptools pip \
|
||||
&& pip wheel --wheel-dir=/tmp/wheel/ cryptography \
|
||||
&& pip wheel --wheel-dir=/tmp/wheel/ \
|
||||
aiofiles aiohttp appdirs asn1crypto async_lru async-timeout bottle cffi \
|
||||
chardet click colorama dbus_next gpiod hidapi idna mako marshmallow \
|
||||
more-itertools multidict netifaces packaging passlib pillow ply psutil \
|
||||
pycparser pyelftools pyghmi pygments pyparsing pyotp qrcode requests \
|
||||
semantic-version setproctitle six spidev tabulate urllib3 wrapt xlib \
|
||||
yarl pyserial pyyaml zstandard supervisor pyfatfs pyserial python-periphery \
|
||||
python-ldap python-pam pyrad pyudev pyusb luma.oled pyserial-asyncio \
|
||||
&& rm -rf /root/.cache/pip/* /tmp/pip-* \
|
||||
&& if [ ${TARGETARCH} = arm ]; then \
|
||||
umount /root/.cargo 2>/dev/null || true \
|
||||
&& rm -rf /root/.cargo /root/rustup-init.sh; \
|
||||
fi
|
||||
|
||||
# 编译 python evdev库
|
||||
RUN git clone --depth=1 https://github.com/gvalkov/python-evdev.git /tmp/python-evdev \
|
||||
&& cd /tmp/python-evdev \
|
||||
&& python3 setup.py bdist_wheel --dist-dir /tmp/wheel/ \
|
||||
&& rm -rf /tmp/python-evdev
|
||||
|
||||
# 编译安装 libnice、libsrtp、libwebsockets 和 janus-gateway(显式 Release 与按架构优化)
|
||||
RUN export COMMON_CFLAGS='-O2 -pipe -fPIC -fstack-protector-strong -D_FORTIFY_SOURCE=2' \
|
||||
&& if [ "${TARGETARCH}" = arm64 ]; then export CFLAGS="$COMMON_CFLAGS -march=armv8-a"; \
|
||||
elif [ "${TARGETARCH}" = arm ]; then export CFLAGS="$COMMON_CFLAGS -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -mtune=cortex-a7"; \
|
||||
else export CFLAGS="$COMMON_CFLAGS -march=x86-64 -mtune=generic"; fi \
|
||||
&& export CXXFLAGS="$CFLAGS" LDFLAGS="-Wl,-O1 -Wl,--as-needed" \
|
||||
&& git clone --depth=1 https://gitlab.freedesktop.org/libnice/libnice /tmp/libnice \
|
||||
&& cd /tmp/libnice \
|
||||
&& meson setup build --prefix=/usr --buildtype=release -Doptimization=2 -Dc_args="$CFLAGS" -Dcpp_args="$CXXFLAGS" \
|
||||
&& ninja -C build && ninja -C build install \
|
||||
&& rm -rf /tmp/libnice \
|
||||
&& curl https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz -L -o /tmp/libsrtp-2.2.0.tar.gz \
|
||||
&& cd /tmp \
|
||||
&& tar xf libsrtp-2.2.0.tar.gz \
|
||||
&& cd libsrtp-2.2.0 \
|
||||
&& CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" ./configure --prefix=/usr --enable-openssl \
|
||||
&& make shared_library -j$(nproc) && make install \
|
||||
&& cd /tmp \
|
||||
&& rm -rf /tmp/libsrtp* \
|
||||
&& git clone --depth=1 https://github.com/warmcat/libwebsockets /tmp/libwebsockets \
|
||||
&& cd /tmp/libwebsockets \
|
||||
&& mkdir build && cd build \
|
||||
&& cmake -DLWS_MAX_SMP=1 -DLWS_WITHOUT_EXTENSIONS=0 -DCMAKE_INSTALL_PREFIX:PATH=/usr \
|
||||
-DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE="$CFLAGS -fPIC" -DCMAKE_CXX_FLAGS_RELEASE="$CXXFLAGS -fPIC" .. \
|
||||
&& make -j$(nproc) && make install \
|
||||
&& cd /tmp \
|
||||
&& rm -rf /tmp/libwebsockets \
|
||||
&& git clone --depth=1 https://github.com/meetecho/janus-gateway.git /tmp/janus-gateway \
|
||||
&& cd /tmp/janus-gateway \
|
||||
&& sh autogen.sh \
|
||||
&& CFLAGS="$CFLAGS" CXXFLAGS="$CXXFLAGS" ./configure --enable-static --enable-websockets --enable-plugin-audiobridge \
|
||||
--disable-data-channels --disable-rabbitmq --disable-mqtt --disable-all-plugins \
|
||||
--disable-all-loggers --prefix=/usr \
|
||||
&& make -j$(nproc) && make install \
|
||||
&& cd /tmp \
|
||||
&& rm -rf /tmp/janus-gateway
|
||||
|
||||
# 编译 Rockchip MPP、RGA(仅 arm64,显式 Release 与按架构优化)
|
||||
RUN if [ ${TARGETARCH} = arm64 ]; then \
|
||||
export COMMON_CFLAGS='-O2 -pipe -fPIC -fstack-protector-strong -D_FORTIFY_SOURCE=2' \
|
||||
&& export CFLAGS="$COMMON_CFLAGS -march=armv8-a" \
|
||||
&& export CXXFLAGS="$CFLAGS" \
|
||||
&& git clone --depth=1 https://github.com/rockchip-linux/mpp.git /tmp/rkmpp \
|
||||
&& mkdir -p /tmp/rkmpp/rkmpp_build && cd /tmp/rkmpp/rkmpp_build \
|
||||
&& cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DBUILD_TEST=OFF \
|
||||
-DCMAKE_C_FLAGS_RELEASE="$CFLAGS" -DCMAKE_CXX_FLAGS_RELEASE="$CXXFLAGS" .. \
|
||||
&& make -j$(nproc) \
|
||||
&& make install \
|
||||
&& git clone -b jellyfin-rga --depth=1 https://github.com/nyanmisaka/rk-mirrors.git /tmp/rkrga \
|
||||
&& cd /tmp/ \
|
||||
&& meson setup rkrga rkrga_build --prefix=/usr --libdir=lib --buildtype=release -Doptimization=2 \
|
||||
-Dc_args="$CFLAGS" -Dcpp_args="$CXXFLAGS -fpermissive" -Dlibdrm=false -Dlibrga_demo=false \
|
||||
&& meson configure rkrga_build > /dev/null \
|
||||
&& ninja -C rkrga_build install \
|
||||
&& rm -rf /tmp/rkmpp /tmp/rkrga; \
|
||||
fi
|
||||
|
||||
# 编译 ustreamer(按架构优化)
|
||||
RUN sed --in-place --expression 's|^#include "refcount.h"$|#include "../refcount.h"|g' /usr/include/janus/plugins/plugin.h \
|
||||
&& git clone --depth=1 https://github.com/mofeng-git/ustreamer /tmp/ustreamer \
|
||||
&& export COMMON_CFLAGS='-O2 -pipe -fPIC -fstack-protector-strong -D_FORTIFY_SOURCE=2' \
|
||||
&& if [ "${TARGETARCH}" = arm64 ]; then export CFLAGS="$COMMON_CFLAGS -march=armv8-a"; \
|
||||
elif [ "${TARGETARCH}" = arm ]; then export CFLAGS="$COMMON_CFLAGS -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -mtune=cortex-a7"; \
|
||||
else export CFLAGS="$COMMON_CFLAGS -march=x86-64 -mtune=generic"; fi \
|
||||
&& export CXXFLAGS="$CFLAGS" \
|
||||
&& if [ ${TARGETARCH} = arm64 ]; then \
|
||||
make -j$(nproc) CFLAGS="$CFLAGS" WITH_PYTHON=1 WITH_JANUS=1 WITH_FFMPEG=1 WITH_MPP=1 WITH_DRM=1 -C /tmp/ustreamer; \
|
||||
else \
|
||||
make -j$(nproc) CFLAGS="$CFLAGS" WITH_PYTHON=1 WITH_JANUS=1 WITH_FFMPEG=1 WITH_DRM=1 -C /tmp/ustreamer; \
|
||||
fi \
|
||||
&& /tmp/ustreamer/ustreamer -v \
|
||||
&& /tmp/ustreamer/ustreamer-dump -v \
|
||||
&& cp /tmp/ustreamer/python/dist/*.whl /tmp/wheel/
|
||||
|
||||
# 复制必要的库文件
|
||||
RUN mkdir /tmp/lib \
|
||||
&& cd /lib/*-linux-*/ \
|
||||
&& cp libevent_core-*.so.* libbsd.so.* libevent_pthreads-*.so.* libspeexdsp.so.* \
|
||||
libevent-*.so.* libjpeg.so.* libyuv.so.* libnice.so.* \
|
||||
/tmp/lib/ \
|
||||
&& find /usr/lib -name "libsrtp2.so.*" -exec cp {} /tmp/lib/ \; \
|
||||
&& find /usr/lib -name "libwebsockets.so.*" -exec cp {} /tmp/lib/ \; \
|
||||
&& [ "${TARGETARCH}" = "arm64" ] && \
|
||||
find /usr/lib -name "libsw*.so.*" -exec cp {} /tmp/lib/ \; && \
|
||||
find /usr/lib -name "libpostproc.so.*" -exec cp {} /tmp/lib/ \; && \
|
||||
find /usr/lib -name "librockchip*" -exec cp {} /tmp/lib/ \; && \
|
||||
find /usr/lib -name "librga.so.*" -exec cp {} /tmp/lib/ \; || true
|
||||
@ -1,208 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# --- 配置 ---
|
||||
# 允许通过环境变量覆盖默认路径
|
||||
SRCPATH="${SRCPATH:-/mnt/src}"
|
||||
BOOTFS="${BOOTFS:-/tmp/bootfs}"
|
||||
ROOTFS="${ROOTFS:-/tmp/rootfs}"
|
||||
OUTPUTDIR="${OUTPUTDIR:-/mnt/output}"
|
||||
TMPDIR="${TMPDIR:-$SRCPATH/tmp}"
|
||||
|
||||
# 远程文件下载配置
|
||||
REMOTE_PREFIX="${REMOTE_PREFIX:-https://files.mofeng.run/src}"
|
||||
|
||||
export LC_ALL=C
|
||||
|
||||
# 全局变量
|
||||
LOOPDEV=""
|
||||
ROOTFS_MOUNTED=0
|
||||
BOOTFS_MOUNTED=0
|
||||
PROC_MOUNTED=0
|
||||
SYS_MOUNTED=0
|
||||
DEV_MOUNTED=0
|
||||
DOCKER_CONTAINER_NAME="to_build_rootfs_$$"
|
||||
PREBUILT_DIR="/tmp/prebuilt_binaries"
|
||||
|
||||
# --- 引入模块化脚本 ---
|
||||
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
|
||||
source "$SCRIPT_DIR/functions/common.sh"
|
||||
source "$SCRIPT_DIR/functions/devices.sh"
|
||||
source "$SCRIPT_DIR/functions/install.sh"
|
||||
source "$SCRIPT_DIR/functions/packaging.sh"
|
||||
|
||||
# 获取日期与Git版本
|
||||
GIT_COMMIT_ID=$(get_git_commit_id)
|
||||
DATE=$(date +%y%m%d)
|
||||
if [ -n "$GIT_COMMIT_ID" ]; then
|
||||
DATE="${DATE}-${GIT_COMMIT_ID}"
|
||||
fi
|
||||
|
||||
# --- 注册清理函数 ---
|
||||
# 在脚本退出、收到错误信号、中断信号、终止信号时执行 cleanup
|
||||
trap cleanup EXIT ERR INT TERM
|
||||
|
||||
# --- 构建流程函数 ---
|
||||
|
||||
build_target() {
|
||||
local target="$1"
|
||||
local build_time=$(date "+%Y-%m-%d %H:%M:%S")
|
||||
echo "=================================================="
|
||||
echo "信息:构建目标: $target"
|
||||
echo "信息:构建时间: $build_time"
|
||||
echo "=================================================="
|
||||
|
||||
# 设置全局变量,供后续函数使用
|
||||
TARGET_DEVICE_NAME="$target"
|
||||
NEED_PREPARE_DNS=false # 默认不需要准备 DNS
|
||||
|
||||
case "$target" in
|
||||
onecloud)
|
||||
onecloud_rootfs
|
||||
local arch="armhf"
|
||||
local device_type="gpio-onecloud"
|
||||
local network_type="systemd-networkd"
|
||||
;;
|
||||
cumebox2)
|
||||
cumebox2_rootfs
|
||||
local arch="aarch64"
|
||||
local device_type="video1"
|
||||
local network_type="" # 默认 NetworkManager
|
||||
NEED_PREPARE_DNS=true
|
||||
;;
|
||||
chainedbox)
|
||||
chainedbox_rootfs_and_fix_dtb
|
||||
local arch="aarch64"
|
||||
local device_type="video1"
|
||||
local network_type=""
|
||||
NEED_PREPARE_DNS=true
|
||||
;;
|
||||
vm)
|
||||
vm_rootfs
|
||||
local arch="amd64"
|
||||
local device_type=""
|
||||
local network_type=""
|
||||
NEED_PREPARE_DNS=true
|
||||
;;
|
||||
e900v22c)
|
||||
e900v22c_rootfs
|
||||
local arch="aarch64"
|
||||
local device_type="video1"
|
||||
local network_type=""
|
||||
NEED_PREPARE_DNS=true
|
||||
;;
|
||||
octopus-flanet)
|
||||
octopus_flanet_rootfs
|
||||
local arch="aarch64"
|
||||
local device_type="video1"
|
||||
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="systemd-networkd"
|
||||
NEED_PREPARE_DNS=true
|
||||
;;
|
||||
orangepi-zero)
|
||||
orangepizero_rootfs
|
||||
local arch="armhf"
|
||||
local device_type=""
|
||||
local network_type=""
|
||||
NEED_PREPARE_DNS=true
|
||||
;;
|
||||
oec-turbo)
|
||||
oec_turbo_rootfs
|
||||
local arch="aarch64"
|
||||
local device_type="vpu"
|
||||
local network_type=""
|
||||
NEED_PREPARE_DNS=true
|
||||
;;
|
||||
*)
|
||||
echo "错误:未知或不支持的目标 '$target'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
mount_rootfs
|
||||
|
||||
install_and_configure_kvmd "$arch" "$device_type" "$network_type"
|
||||
|
||||
write_meta "$target"
|
||||
|
||||
unmount_all
|
||||
|
||||
case "$target" in
|
||||
onecloud)
|
||||
pack_img_onecloud
|
||||
;;
|
||||
vm)
|
||||
pack_img "Vm"
|
||||
;;
|
||||
cumebox2)
|
||||
pack_img "Cumebox2"
|
||||
;;
|
||||
chainedbox)
|
||||
pack_img "Chainedbox"
|
||||
;;
|
||||
e900v22c)
|
||||
pack_img "E900v22c"
|
||||
;;
|
||||
octopus-flanet)
|
||||
pack_img "Octopus-Flanet"
|
||||
;;
|
||||
onecloud-pro)
|
||||
pack_img "Onecloud-Pro"
|
||||
;;
|
||||
orangepi-zero)
|
||||
pack_img "Orangepi-Zero"
|
||||
;;
|
||||
oec-turbo)
|
||||
pack_img "OEC-Turbo"
|
||||
;;
|
||||
*)
|
||||
echo "错误:未知的打包类型 for '$target'" >&2
|
||||
;;
|
||||
esac
|
||||
|
||||
# 在 GitHub Actions 环境中清理下载的文件
|
||||
cleanup_downloaded_files
|
||||
|
||||
echo "=================================================="
|
||||
echo "信息:目标 $target 构建完成!"
|
||||
echo "=================================================="
|
||||
}
|
||||
|
||||
# --- 主逻辑 ---
|
||||
|
||||
# 检查是否提供了目标参数
|
||||
if [ -z "$1" ]; then
|
||||
echo "用法: $0 <target|all>"
|
||||
echo "可用目标: onecloud, cumebox2, chainedbox, vm, e900v22c, octopus-flanet, onecloud-pro, orangepi-zero, oec-turbo"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 设置脚本立即退出模式
|
||||
set -eo pipefail
|
||||
|
||||
# 检查必要的外部工具
|
||||
check_required_tools "$1"
|
||||
|
||||
# 执行构建
|
||||
if [ "$1" = "all" ]; then
|
||||
echo "信息:开始构建所有目标..."
|
||||
build_target "onecloud"
|
||||
build_target "cumebox2"
|
||||
build_target "chainedbox"
|
||||
build_target "vm"
|
||||
build_target "e900v22c"
|
||||
build_target "octopus-flanet"
|
||||
build_target "onecloud-pro"
|
||||
build_target "orangepi-zero"
|
||||
build_target "oec-turbo"
|
||||
echo "信息:所有目标构建完成。"
|
||||
else
|
||||
build_target "$1"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@ -1,5 +0,0 @@
|
||||
[source.crates-io]
|
||||
replace-with = 'ustc'
|
||||
|
||||
[source.ustc]
|
||||
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
|
||||
@ -1,313 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# --- 辅助函数 ---
|
||||
|
||||
# 获取 Git 提交 ID
|
||||
get_git_commit_id() {
|
||||
if git rev-parse --is-inside-work-tree &>/dev/null; then
|
||||
git rev-parse --short HEAD 2>/dev/null || echo ""
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
# 查找并设置一个可用的 loop 设备
|
||||
find_loop_device() {
|
||||
echo "信息:查找可用的 loop 设备..."
|
||||
# 只使用 --find 来获取设备名
|
||||
LOOPDEV=$(sudo losetup --find)
|
||||
if [[ -z "$LOOPDEV" || ! -e "$LOOPDEV" ]]; then
|
||||
echo "错误:再次尝试后仍无法找到可用的 loop 设备。" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "信息:找到可用 loop 设备名:$LOOPDEV"
|
||||
}
|
||||
|
||||
# 检查并创建目录
|
||||
ensure_dir() {
|
||||
if [[ ! -d "$1" ]]; then
|
||||
echo "信息:创建目录 $1 ..."
|
||||
sudo mkdir -p "$1" || { echo "错误:创建目录 $1 失败" >&2; exit 1; }
|
||||
fi
|
||||
}
|
||||
|
||||
# 执行 chroot 命令
|
||||
run_in_chroot() {
|
||||
echo "信息:在 chroot 环境 ($ROOTFS) 中执行命令..."
|
||||
sudo chroot --userspec "root:root" "$ROOTFS" bash -ec "$1" || { echo "错误:在 chroot 环境中执行命令失败" >&2; exit 1; }
|
||||
echo "信息:chroot 命令执行完成。"
|
||||
}
|
||||
|
||||
# --- 清理函数 ---
|
||||
cleanup() {
|
||||
echo "信息:执行清理操作..."
|
||||
# 尝试卸载 chroot 环境下的挂载点
|
||||
if [[ "$DEV_MOUNTED" -eq 1 ]]; then
|
||||
echo "信息:卸载 $ROOTFS/dev ..."
|
||||
sudo umount "$ROOTFS/dev" || echo "警告:卸载 $ROOTFS/dev 失败,可能已被卸载"
|
||||
DEV_MOUNTED=0
|
||||
fi
|
||||
if [[ "$SYS_MOUNTED" -eq 1 ]]; then
|
||||
echo "信息:卸载 $ROOTFS/sys ..."
|
||||
sudo umount "$ROOTFS/sys" || echo "警告:卸载 $ROOTFS/sys 失败,可能已被卸载"
|
||||
SYS_MOUNTED=0
|
||||
fi
|
||||
if [[ "$PROC_MOUNTED" -eq 1 ]]; then
|
||||
echo "信息:卸载 $ROOTFS/proc ..."
|
||||
sudo umount "$ROOTFS/proc" || echo "警告:卸载 $ROOTFS/proc 失败,可能已被卸载"
|
||||
PROC_MOUNTED=0
|
||||
fi
|
||||
|
||||
# 尝试卸载主根文件系统
|
||||
if [[ "$ROOTFS_MOUNTED" -eq 1 && -d "$ROOTFS" ]]; then
|
||||
echo "信息:卸载 $ROOTFS ..."
|
||||
sudo umount "$ROOTFS" || sudo umount -l "$ROOTFS" || echo "警告:卸载 $ROOTFS 失败"
|
||||
ROOTFS_MOUNTED=0
|
||||
fi
|
||||
# 尝试卸载引导文件系统 (如果使用)
|
||||
if [[ "$BOOTFS_MOUNTED" -eq 1 && -d "$BOOTFS" ]]; then
|
||||
echo "信息:卸载 $BOOTFS ..."
|
||||
sudo umount "$BOOTFS" || sudo umount -l "$BOOTFS" || echo "警告:卸载 $BOOTFS 失败"
|
||||
BOOTFS_MOUNTED=0
|
||||
fi
|
||||
|
||||
# 尝试分离 loop 设备
|
||||
if [[ -n "$LOOPDEV" && -b "$LOOPDEV" ]]; then
|
||||
echo "信息:尝试 zerofree $LOOPDEV ..."
|
||||
sudo zerofree "$LOOPDEV" || echo "警告:zerofree $LOOPDEV 失败,可能文件系统不支持或未干净卸载"
|
||||
echo "信息:分离 loop 设备 $LOOPDEV ..."
|
||||
sudo losetup -d "$LOOPDEV" || echo "警告:分离 $LOOPDEV 失败"
|
||||
LOOPDEV=""
|
||||
fi
|
||||
|
||||
# 尝试删除 Docker 容器
|
||||
echo "信息:检查并删除 Docker 容器 $DOCKER_CONTAINER_NAME ..."
|
||||
if sudo docker ps -a --format '{{.Names}}' | grep -q "^${DOCKER_CONTAINER_NAME}$"; then
|
||||
sudo docker rm -f "$DOCKER_CONTAINER_NAME" || echo "警告:删除 Docker 容器 $DOCKER_CONTAINER_NAME 失败"
|
||||
else
|
||||
echo "信息:Docker 容器 $DOCKER_CONTAINER_NAME 不存在或已被删除。"
|
||||
fi
|
||||
|
||||
# 清理临时目录和挂载点目录
|
||||
echo "信息:清理临时文件和目录..."
|
||||
sudo rm -rf "$PREBUILT_DIR"
|
||||
# 只删除挂载点目录本身
|
||||
if [[ -d "$ROOTFS" ]]; then
|
||||
sudo rmdir "$ROOTFS" || echo "警告:删除目录 $ROOTFS 失败,可能非空"
|
||||
fi
|
||||
if [[ -d "$BOOTFS" ]]; then
|
||||
sudo rmdir "$BOOTFS" || echo "警告:删除目录 $BOOTFS 失败,可能非空"
|
||||
fi
|
||||
|
||||
echo "信息:清理完成。"
|
||||
}
|
||||
|
||||
# 在打包镜像前调用此函数,确保干净卸载所有挂载点和loop设备
|
||||
unmount_all() {
|
||||
echo "信息:执行卸载操作,准备打包..."
|
||||
# 卸载 chroot 环境下的挂载点
|
||||
if [[ "$DEV_MOUNTED" -eq 1 ]]; then
|
||||
echo "信息:卸载 $ROOTFS/dev ..."
|
||||
sudo umount "$ROOTFS/dev" || echo "警告:卸载 $ROOTFS/dev 失败,可能已被卸载"
|
||||
DEV_MOUNTED=0
|
||||
fi
|
||||
if [[ "$SYS_MOUNTED" -eq 1 ]]; then
|
||||
echo "信息:卸载 $ROOTFS/sys ..."
|
||||
sudo umount "$ROOTFS/sys" || echo "警告:卸载 $ROOTFS/sys 失败,可能已被卸载"
|
||||
SYS_MOUNTED=0
|
||||
fi
|
||||
if [[ "$PROC_MOUNTED" -eq 1 ]]; then
|
||||
echo "信息:卸载 $ROOTFS/proc ..."
|
||||
sudo umount "$ROOTFS/proc" || echo "警告:卸载 $ROOTFS/proc 失败,可能已被卸载"
|
||||
PROC_MOUNTED=0
|
||||
fi
|
||||
|
||||
# 卸载主根文件系统
|
||||
if [[ "$ROOTFS_MOUNTED" -eq 1 && -d "$ROOTFS" ]]; then
|
||||
echo "信息:卸载 $ROOTFS ..."
|
||||
sudo umount "$ROOTFS" || sudo umount -l "$ROOTFS" || echo "警告:卸载 $ROOTFS 失败"
|
||||
ROOTFS_MOUNTED=0
|
||||
fi
|
||||
|
||||
# 尝试分离 loop 设备前执行 zerofree(如果文件系统支持)
|
||||
if [[ -n "$LOOPDEV" && -b "$LOOPDEV" ]]; then
|
||||
echo "信息:尝试 zerofree $LOOPDEV ..."
|
||||
sudo zerofree "$LOOPDEV" || echo "警告:zerofree $LOOPDEV 失败,可能文件系统不支持或未干净卸载"
|
||||
echo "信息:分离 loop 设备 $LOOPDEV ..."
|
||||
sudo losetup -d "$LOOPDEV" || echo "警告:分离 $LOOPDEV 失败"
|
||||
LOOPDEV=""
|
||||
fi
|
||||
|
||||
sudo rm -rf "$PREBUILT_DIR"
|
||||
|
||||
echo "信息:卸载操作完成,可以安全打包镜像。"
|
||||
}
|
||||
|
||||
# 挂载根文件系统
|
||||
mount_rootfs() {
|
||||
echo "信息:挂载根文件系统到 $ROOTFS ..."
|
||||
ensure_dir "$ROOTFS"
|
||||
sudo mount "$LOOPDEV" "$ROOTFS" || { echo "错误:挂载 $LOOPDEV 到 $ROOTFS 失败" >&2; exit 1; }
|
||||
ROOTFS_MOUNTED=1
|
||||
|
||||
echo "信息:挂载 proc, sys, dev 到 chroot 环境..."
|
||||
ensure_dir "$ROOTFS/proc"
|
||||
sudo mount -t proc proc "$ROOTFS/proc" || { echo "错误:挂载 proc 到 $ROOTFS/proc 失败" >&2; exit 1; }
|
||||
PROC_MOUNTED=1
|
||||
|
||||
ensure_dir "$ROOTFS/sys"
|
||||
sudo mount -t sysfs sys "$ROOTFS/sys" || { echo "错误:挂载 sys 到 $ROOTFS/sys 失败" >&2; exit 1; }
|
||||
SYS_MOUNTED=1
|
||||
|
||||
ensure_dir "$ROOTFS/dev"
|
||||
sudo mount -o bind /dev "$ROOTFS/dev" || { echo "错误:绑定挂载 /dev 到 $ROOTFS/dev 失败" >&2; exit 1; }
|
||||
DEV_MOUNTED=1
|
||||
echo "信息:根文件系统及虚拟文件系统挂载完成。"
|
||||
}
|
||||
|
||||
# 设置元数据
|
||||
write_meta() {
|
||||
local hostname="$1"
|
||||
echo "信息:在 chroot 环境中设置主机名/元数据为 $hostname ..."
|
||||
run_in_chroot "sed -i 's/localhost.localdomain/$hostname/g' /etc/kvmd/meta.yaml"
|
||||
}
|
||||
|
||||
# 检测是否在 GitHub Actions 环境中
|
||||
is_github_actions() {
|
||||
[[ -n "$GITHUB_ACTIONS" ]]
|
||||
}
|
||||
|
||||
# 记录下载的文件列表(仅在 GitHub Actions 环境中)
|
||||
DOWNLOADED_FILES_LIST="/tmp/downloaded_files.txt"
|
||||
|
||||
# 自动下载文件函数
|
||||
download_file_if_missing() {
|
||||
local file_path="$1"
|
||||
local relative_path=""
|
||||
|
||||
# 如果文件已存在,直接返回
|
||||
if [[ -f "$file_path" ]]; then
|
||||
echo "信息:文件已存在: $file_path"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 计算相对于 SRCPATH 的路径
|
||||
if [[ "$file_path" == "$SRCPATH"/* ]]; then
|
||||
relative_path="${file_path#$SRCPATH/}"
|
||||
else
|
||||
echo "错误:文件路径 $file_path 不在 SRCPATH ($SRCPATH) 下" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "信息:文件不存在,尝试下载: $file_path"
|
||||
echo "信息:相对路径: $relative_path"
|
||||
|
||||
# 确保目标目录存在
|
||||
local target_dir="$(dirname "$file_path")"
|
||||
ensure_dir "$target_dir"
|
||||
|
||||
# 首先尝试直接下载
|
||||
local remote_url="${REMOTE_PREFIX}/${relative_path}"
|
||||
echo "信息:尝试下载: $remote_url"
|
||||
|
||||
if curl -f -L -o "$file_path" "$remote_url" 2>/dev/null; then
|
||||
echo "信息:下载成功: $file_path"
|
||||
# 在 GitHub Actions 环境中记录下载的文件
|
||||
if is_github_actions; then
|
||||
echo "$file_path" >> "$DOWNLOADED_FILES_LIST"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 如果直接下载失败,尝试添加 .xz 后缀
|
||||
echo "信息:直接下载失败,尝试 .xz 压缩版本..."
|
||||
local xz_url="${remote_url}.xz"
|
||||
local xz_file="${file_path}.xz"
|
||||
|
||||
if curl -f -L -o "$xz_file" "$xz_url" 2>/dev/null; then
|
||||
echo "信息:下载 .xz 文件成功,正在解压..."
|
||||
if xz -d "$xz_file"; then
|
||||
echo "信息:解压成功: $file_path"
|
||||
# 在 GitHub Actions 环境中记录下载的文件
|
||||
if is_github_actions; then
|
||||
echo "$file_path" >> "$DOWNLOADED_FILES_LIST"
|
||||
fi
|
||||
return 0
|
||||
else
|
||||
echo "错误:解压 .xz 文件失败" >&2
|
||||
rm -f "$xz_file"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "错误:无法下载文件 $file_path (尝试了原始版本和 .xz 版本)" >&2
|
||||
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
|
||||
echo "信息:清理 GitHub Actions 环境中下载的文件..."
|
||||
while IFS= read -r file_path; do
|
||||
if [[ -f "$file_path" ]]; then
|
||||
echo "信息:删除下载的文件: $file_path"
|
||||
rm -f "$file_path"
|
||||
fi
|
||||
done < "$DOWNLOADED_FILES_LIST"
|
||||
rm -f "$DOWNLOADED_FILES_LIST"
|
||||
echo "信息:下载文件清理完成"
|
||||
fi
|
||||
}
|
||||
|
||||
# 检查必要的外部工具
|
||||
check_required_tools() {
|
||||
local required_tools="sudo docker losetup mount umount parted e2fsck resize2fs qemu-img curl tar python3 pip3 rsync git simg2img img2simg dd cat rm mkdir mv cp sed chmod chown ln grep printf id xz"
|
||||
|
||||
for cmd in $required_tools; do
|
||||
if ! command -v "$cmd" &> /dev/null; then
|
||||
echo "错误:必需的命令 '$cmd' 未找到。请安装相应软件包。" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# 检查特定工具 (如果脚本中使用了)
|
||||
if ! command -v "$SRCPATH/image/onecloud/AmlImg_v0.3.1_linux_amd64" &> /dev/null && [[ "$1" == "onecloud" || "$1" == "all" ]]; then
|
||||
if [ -f "$SRCPATH/image/onecloud/AmlImg_v0.3.1_linux_amd64" ]; then
|
||||
echo "信息:找到 AmlImg 工具,尝试设置执行权限..."
|
||||
sudo chmod +x "$SRCPATH/image/onecloud/AmlImg_v0.3.1_linux_amd64" || echo "警告:设置 AmlImg 执行权限失败"
|
||||
else
|
||||
echo "错误:构建 onecloud 需要 '$SRCPATH/image/onecloud/AmlImg_v0.3.1_linux_amd64',但未找到。" >&2
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@ -1,453 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# --- 设备特定的 Rootfs 准备函数 ---
|
||||
|
||||
onecloud_rootfs() {
|
||||
local unpacker="$SRCPATH/image/onecloud/AmlImg_v0.3.1_linux_amd64"
|
||||
local source_image="$SRCPATH/image/onecloud/Armbian_by-SilentWind_24.5.0-trunk_Onecloud_bookworm_legacy_5.9.0-rc7_minimal_support-dvd-emulation.burn.img"
|
||||
local bootfs_img="$TMPDIR/bootfs.img"
|
||||
local rootfs_img="$TMPDIR/rootfs.img"
|
||||
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=600
|
||||
|
||||
echo "信息:准备 Onecloud Rootfs..."
|
||||
ensure_dir "$TMPDIR"
|
||||
ensure_dir "$BOOTFS"
|
||||
|
||||
# 自动下载 AmlImg 工具(如果不存在)
|
||||
download_file_if_missing "$unpacker" || { echo "错误:下载 AmlImg 工具失败" >&2; exit 1; }
|
||||
sudo chmod +x "$unpacker" || { echo "错误:设置 AmlImg 工具执行权限失败" >&2; exit 1; }
|
||||
|
||||
# 自动下载源镜像文件(如果不存在)
|
||||
download_file_if_missing "$source_image" || { echo "错误:下载 Onecloud 原始镜像失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:解包 Onecloud burn 镜像..."
|
||||
sudo "$unpacker" unpack "$source_image" "$TMPDIR" || { echo "错误:解包失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:转换 bootfs 和 rootfs sparse 镜像到 raw 格式..."
|
||||
sudo simg2img "$bootfs_sparse" "$bootfs_img" || { echo "错误:转换 bootfs sparse 镜像失败" >&2; exit 1; }
|
||||
sudo simg2img "$rootfs_sparse" "$rootfs_img" || { echo "错误:转换 rootfs sparse 镜像失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:挂载 bootfs 并修复 DTB..."
|
||||
find_loop_device # 查找一个 loop 设备给 bootfs
|
||||
bootfs_loopdev="$LOOPDEV" # 保存这个设备名
|
||||
echo "信息:将 $bootfs_img 关联到 $bootfs_loopdev..."
|
||||
sudo losetup "$bootfs_loopdev" "$bootfs_img" || { echo "错误:关联 bootfs 镜像到 $bootfs_loopdev 失败" >&2; exit 1; }
|
||||
sudo mount "$bootfs_loopdev" "$BOOTFS" || { echo "错误:挂载 bootfs ($bootfs_loopdev) 失败" >&2; exit 1; }
|
||||
BOOTFS_MOUNTED=1
|
||||
|
||||
# 自动下载 DTB 文件(如果不存在)
|
||||
local dtb_file="$SRCPATH/image/onecloud/meson8b-onecloud-fix.dtb"
|
||||
download_file_if_missing "$dtb_file" || { echo "错误:下载 Onecloud DTB 文件失败" >&2; exit 1; }
|
||||
|
||||
sudo cp "$dtb_file" "$BOOTFS/dtb/meson8b-onecloud.dtb" || { echo "错误:复制修复后的 DTB 文件失败" >&2; exit 1; }
|
||||
sudo umount "$BOOTFS" || { echo "警告:卸载 bootfs ($BOOTFS) 失败" >&2; BOOTFS_MOUNTED=0; } # 卸载失败不应中断流程
|
||||
BOOTFS_MOUNTED=0
|
||||
echo "信息:分离 bootfs loop 设备 $bootfs_loopdev..."
|
||||
sudo losetup -d "$bootfs_loopdev" || { echo "警告:分离 bootfs loop 设备 $bootfs_loopdev 失败" >&2; }
|
||||
# bootfs_loopdev 对应的设备现在是空闲的
|
||||
|
||||
echo "信息:扩展 rootfs 镜像 (${add_size_mb}MB)..."
|
||||
sudo dd if=/dev/zero bs=1M count="$add_size_mb" >> "$rootfs_img" || { echo "错误:扩展 rootfs 镜像失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:检查并调整 rootfs 文件系统大小 (在文件上)..."
|
||||
# 注意:e2fsck/resize2fs 现在直接操作镜像文件,而不是 loop 设备
|
||||
sudo e2fsck -f -y "$rootfs_img" || { echo "警告:e2fsck 检查 rootfs 镜像文件失败" >&2; exit 1; }
|
||||
sudo resize2fs "$rootfs_img" || { echo "错误:resize2fs 调整 rootfs 镜像文件大小失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:设置 rootfs loop 设备..."
|
||||
find_loop_device # 重新查找一个可用的 loop 设备 (可能是刚才释放的那个)
|
||||
echo "信息:将 $rootfs_img 关联到 $LOOPDEV..."
|
||||
sudo losetup "$LOOPDEV" "$rootfs_img" || { echo "错误:关联 rootfs 镜像到 $LOOPDEV 失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:Onecloud Rootfs 准备完成。 Loop 设备 $LOOPDEV 已关联 $rootfs_img"
|
||||
}
|
||||
|
||||
cumebox2_rootfs() {
|
||||
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"
|
||||
|
||||
# 自动下载源镜像文件(如果不存在)
|
||||
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; }
|
||||
|
||||
echo "信息:设置带偏移量的 loop 设备..."
|
||||
find_loop_device # 查找设备名
|
||||
echo "信息:将 $target_image (偏移 $offset) 关联到 $LOOPDEV..."
|
||||
sudo losetup --offset "$offset" "$LOOPDEV" "$target_image" || { echo "错误:设置带偏移量的 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 "信息:Cumebox2 Rootfs 准备完成,loop 设备 $LOOPDEV 已就绪。"
|
||||
}
|
||||
|
||||
chainedbox_rootfs_and_fix_dtb() {
|
||||
local source_image="$SRCPATH/image/chainedbox/Armbian_24.11.0_rockchip_chainedbox_bookworm_6.1.112_server_2024.10.02_add800m.img"
|
||||
local target_image="$TMPDIR/rootfs.img"
|
||||
local boot_offset=$((32768 * 512))
|
||||
local rootfs_offset=$((1081344 * 512))
|
||||
local bootfs_loopdev=""
|
||||
|
||||
echo "信息:准备 Chainedbox Rootfs 并修复 DTB..."
|
||||
ensure_dir "$TMPDIR"; ensure_dir "$BOOTFS"
|
||||
|
||||
# 自动下载源镜像文件(如果不存在)
|
||||
download_file_if_missing "$source_image" || { echo "错误:下载 Chainedbox 原始镜像失败" >&2; exit 1; }
|
||||
|
||||
cp "$source_image" "$target_image" || { echo "错误:复制 Chainedbox 原始镜像失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:挂载 boot 分区并修复 DTB..."
|
||||
find_loop_device # 找 loop 给 boot
|
||||
bootfs_loopdev="$LOOPDEV"
|
||||
echo "信息:将 $target_image (偏移 $boot_offset) 关联到 $bootfs_loopdev..."
|
||||
sudo losetup --offset "$boot_offset" "$bootfs_loopdev" "$target_image" || { echo "错误:设置 boot 分区 loop 设备 $bootfs_loopdev 失败" >&2; exit 1; }
|
||||
sudo mount "$bootfs_loopdev" "$BOOTFS" || { echo "错误:挂载 boot 分区 ($bootfs_loopdev) 失败" >&2; exit 1; }
|
||||
BOOTFS_MOUNTED=1
|
||||
|
||||
# 自动下载 DTB 文件(如果不存在)
|
||||
local dtb_file="$SRCPATH/image/chainedbox/rk3328-l1pro-1296mhz-fix.dtb"
|
||||
download_file_if_missing "$dtb_file" || { echo "错误:下载 Chainedbox DTB 文件失败" >&2; exit 1; }
|
||||
|
||||
sudo cp "$dtb_file" "$BOOTFS/dtb/rockchip/rk3328-l1pro-1296mhz.dtb" || { echo "错误:复制修复后的 DTB 文件失败" >&2; exit 1; }
|
||||
sudo umount "$BOOTFS" || { echo "警告:卸载 boot 分区 ($BOOTFS) 失败" >&2; BOOTFS_MOUNTED=0; }
|
||||
BOOTFS_MOUNTED=0
|
||||
echo "信息:分离 boot loop 设备 $bootfs_loopdev..."
|
||||
sudo losetup -d "$bootfs_loopdev" || { echo "警告:分离 boot 分区 loop 设备 $bootfs_loopdev 失败" >&2; }
|
||||
|
||||
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 "信息:Chainedbox Rootfs 准备完成,loop 设备 $LOOPDEV 已就绪。"
|
||||
}
|
||||
|
||||
vm_rootfs() {
|
||||
local source_image="$SRCPATH/image/vm/Armbian_25.2.1_Uefi-x86_bookworm_current_6.12.13_minimal.img"
|
||||
local target_image="$TMPDIR/rootfs.img"
|
||||
local offset=$((540672 * 512))
|
||||
|
||||
echo "信息:准备 Vm Rootfs..."
|
||||
ensure_dir "$TMPDIR"
|
||||
|
||||
# 自动下载源镜像文件(如果不存在)
|
||||
download_file_if_missing "$source_image" || { echo "错误:下载 Vm 原始镜像失败" >&2; exit 1; }
|
||||
|
||||
cp "$source_image" "$target_image" || { echo "错误:复制 Vm 原始镜像失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:设置带偏移量的 loop 设备..."
|
||||
find_loop_device # 查找设备名
|
||||
echo "信息:将 $target_image (偏移 $offset) 关联到 $LOOPDEV..."
|
||||
sudo losetup --offset "$offset" "$LOOPDEV" "$target_image" || { echo "错误:设置带偏移量的 loop 设备 $LOOPDEV 失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:Vm Rootfs 准备完成,loop 设备 $LOOPDEV 已就绪。"
|
||||
}
|
||||
|
||||
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=600
|
||||
|
||||
echo "信息:准备 E900V22C Rootfs..."
|
||||
ensure_dir "$TMPDIR"
|
||||
|
||||
# 自动下载源镜像文件(如果不存在)
|
||||
download_file_if_missing "$source_image" || { echo "错误:下载 E900V22C 原始镜像失败" >&2; exit 1; }
|
||||
|
||||
cp "$source_image" "$target_image" || { echo "错误:复制 E900V22C 原始镜像失败" >&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 "信息:调整镜像分区大小 (分区 2)..."
|
||||
sudo parted -s "$target_image" resizepart 2 100% || { echo "错误:使用 parted 调整分区 2 大小失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:设置带偏移量的 loop 设备..."
|
||||
find_loop_device # 查找设备名
|
||||
echo "信息:将 $target_image (偏移 $offset) 关联到 $LOOPDEV..."
|
||||
sudo losetup --offset "$offset" "$LOOPDEV" "$target_image" || { echo "错误:设置带偏移量的 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 "信息:E900V22C Rootfs 准备完成,loop 设备 $LOOPDEV 已就绪。"
|
||||
}
|
||||
|
||||
octopus_flanet_rootfs() {
|
||||
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=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 "信息:挂载 boot 分区并修改 uEnv.txt (使用 VIM2 DTB)..."
|
||||
find_loop_device # 找 loop 给 boot
|
||||
bootfs_loopdev="$LOOPDEV"
|
||||
echo "信息:将 $target_image (偏移 $boot_offset) 关联到 $bootfs_loopdev..."
|
||||
sudo losetup --offset "$boot_offset" "$bootfs_loopdev" "$target_image" || { echo "错误:设置 boot 分区 loop 设备 $bootfs_loopdev 失败" >&2; exit 1; }
|
||||
sudo mount "$bootfs_loopdev" "$BOOTFS" || { echo "错误:挂载 boot 分区 ($bootfs_loopdev) 失败" >&2; exit 1; }
|
||||
BOOTFS_MOUNTED=1
|
||||
|
||||
# 自动下载 Octopus-Planet 相关文件
|
||||
local dtb_file="$SRCPATH/image/octopus-flanet/meson-gxm-octopus-planet.dtb"
|
||||
download_file_if_missing "$dtb_file" || echo "警告:下载 Octopus-Planet DTB 失败"
|
||||
sudo cp "$dtb_file" "$BOOTFS/dtb/amlogic/meson-gxm-octopus-planet.dtb" || echo "警告:复制 Octopus-Planet DTB 失败"
|
||||
|
||||
sudo sed -i "s/meson-gxm-octopus-planet.dtb/meson-gxm-khadas-vim2.dtb/g" "$BOOTFS/uEnv.txt" || { echo "错误:修改 uEnv.txt 失败" >&2; exit 1; }
|
||||
sudo umount "$BOOTFS" || { echo "警告:卸载 boot 分区 ($BOOTFS) 失败" >&2; BOOTFS_MOUNTED=0; }
|
||||
BOOTFS_MOUNTED=0
|
||||
echo "信息:分离 boot loop 设备 $bootfs_loopdev..."
|
||||
sudo losetup -d "$bootfs_loopdev" || { echo "警告:分离 boot 分区 loop 设备 $bootfs_loopdev 失败" >&2; }
|
||||
|
||||
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 已就绪。"
|
||||
}
|
||||
|
||||
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() {
|
||||
echo "信息:为 Cumebox2 配置特定文件 (OLED, DTB)..."
|
||||
ensure_dir "$ROOTFS/etc/oled"
|
||||
|
||||
# 自动下载 Cumebox2 相关文件(如果不存在)
|
||||
local dtb_file="$SRCPATH/image/cumebox2/v-fix.dtb"
|
||||
local ssd_file="$SRCPATH/image/cumebox2/ssd"
|
||||
local config_file="$SRCPATH/image/cumebox2/config.json"
|
||||
|
||||
download_file_if_missing "$dtb_file" || echo "警告:下载 Cumebox2 DTB 失败"
|
||||
download_file_if_missing "$ssd_file" || echo "警告:下载 Cumebox2 ssd 脚本失败"
|
||||
download_file_if_missing "$config_file" || echo "警告:下载 Cumebox2 配置文件失败"
|
||||
|
||||
sudo cp "$dtb_file" "$ROOTFS/boot/dtb/amlogic/meson-gxl-s905x-khadas-vim.dtb" || echo "警告:复制 Cumebox2 DTB 失败"
|
||||
sudo cp "$ssd_file" "$ROOTFS/usr/bin/" || echo "警告:复制 Cumebox2 ssd 脚本失败"
|
||||
sudo chmod +x "$ROOTFS/usr/bin/ssd" || echo "警告:设置 ssd 脚本执行权限失败"
|
||||
sudo cp "$config_file" "$ROOTFS/etc/oled/config.json" || echo "警告:复制 OLED 配置文件失败"
|
||||
}
|
||||
|
||||
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 失败"
|
||||
|
||||
echo "信息:为 Octopus-Planet 添加 DRM 设备支持..."
|
||||
run_in_chroot "sed -i \"/--device=\\/dev\\/video0/a\\ - \\\"--drm-device=/dev/dri/card0\\\"\" /etc/kvmd/override.yaml"
|
||||
}
|
||||
|
||||
config_orangepi_zero_files() {
|
||||
echo "信息:配置 Orange Pi Zero 特定文件..."
|
||||
|
||||
# 清空 modules.conf 文件,避免加载不必要的模块
|
||||
run_in_chroot "echo 'libcomposite' > /etc/modules-load.d/modules.conf"
|
||||
|
||||
echo "信息:Orange Pi Zero 特定配置完成。"
|
||||
}
|
||||
|
||||
config_onecloud_pro_files() {
|
||||
echo "信息:配置 Onecloud Pro 特定文件..."
|
||||
|
||||
echo "信息:为 Onecloud Pro 添加 DRM 设备支持..."
|
||||
run_in_chroot "sed -i \"/--device=\\/dev\\/video0/a\\ - \\\"--drm-device=/dev/dri/card0\\\"\" /etc/kvmd/override.yaml"
|
||||
}
|
||||
|
||||
config_onecloud_files() {
|
||||
echo "信息:配置 Onecloud 特定文件..."
|
||||
|
||||
echo "信息:为 Onecloud 添加 DRM 设备支持..."
|
||||
run_in_chroot "sed -i \"/--device=\\/dev\\/video0/a\\ - \\\"--drm-device=/dev/dri/card1\\\"\" /etc/kvmd/override.yaml"
|
||||
|
||||
echo "信息:Onecloud 特定配置完成。"
|
||||
}
|
||||
|
||||
oec_turbo_rootfs() {
|
||||
local source_image="$SRCPATH/image/oec-turbo/Flash_Armbian_25.05.0_rockchip_efused-wxy-oec_bookworm_6.1.99_server_2025.03.20.img"
|
||||
local target_image="$TMPDIR/rootfs.img"
|
||||
local rootfs_offset=$((1409024 * 512)) # 根据分区7的起始扇区计算
|
||||
|
||||
echo "信息:准备 OEC-Turbo Rootfs (Debian 12)..."
|
||||
ensure_dir "$TMPDIR"
|
||||
|
||||
echo "信息:下载或使用本地 OEC-Turbo 原始镜像..."
|
||||
download_file_if_missing "$source_image" || { echo "错误:下载 OEC-Turbo 原始镜像失败" >&2; exit 1; }
|
||||
|
||||
cp "$source_image" "$target_image" || { echo "错误:复制 OEC-Turbo 原始镜像失败" >&2; exit 1; }
|
||||
|
||||
find_loop_device
|
||||
# 设置 loop 设备指向 rootfs 分区 (分区7)
|
||||
sudo losetup "$LOOPDEV" "$target_image" -o "$rootfs_offset" || { echo "错误:设置 loop 设备失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:OEC-Turbo Rootfs 准备完成,loop 设备 $LOOPDEV 已就绪。"
|
||||
}
|
||||
|
||||
config_oec_turbo_files() {
|
||||
echo "信息:配置 OEC-Turbo 特定文件..."
|
||||
|
||||
# 替换 override.yaml 中的硬件编码配置,启用 RK MPP 硬件编码
|
||||
echo "信息:配置 VPU 硬件编码支持..."
|
||||
run_in_chroot "sed -i 's/--h264-hwenc=disabled/--h264-hwenc=rkmpp/g' /etc/kvmd/override.yaml"
|
||||
|
||||
echo "信息:配置 udev 规则以授权 kvmd 组访问硬件设备..."
|
||||
run_in_chroot "cat > /etc/udev/rules.d/99-kvmd-hw-access.rules <<'EOF'
|
||||
# Generic hardware access for kvmd
|
||||
# Safe on all platforms — rules only apply if device exists
|
||||
|
||||
# Rockchip MPP (rkmpp)
|
||||
KERNEL==\"mpp_service\", GROUP=\"kvmd\", MODE=\"0660\"
|
||||
|
||||
# DMA-Heap (used by modern MPP)
|
||||
SUBSYSTEM==\"dma_heap\", KERNEL==\"system\", GROUP=\"kvmd\", MODE=\"0660\"
|
||||
SUBSYSTEM==\"dma_heap\", KERNEL==\"system-uncached\", GROUP=\"kvmd\", MODE=\"0660\"
|
||||
SUBSYSTEM==\"dma_heap\", KERNEL==\"reserved\", GROUP=\"kvmd\", MODE=\"0660\"
|
||||
|
||||
# Optional legacy Rockchip devices
|
||||
KERNEL==\"rkvdec\", GROUP=\"kvmd\", MODE=\"0660\"
|
||||
KERNEL==\"rkvenc\", GROUP=\"kvmd\", MODE=\"0660\"
|
||||
KERNEL==\"rga\", GROUP=\"kvmd\", MODE=\"0660\"
|
||||
|
||||
EOF"
|
||||
|
||||
# 替换 DTB 文件
|
||||
replace_oec_turbo_dtb
|
||||
|
||||
echo "信息:OEC-Turbo 特定配置完成。"
|
||||
}
|
||||
|
||||
replace_oec_turbo_dtb() {
|
||||
local dtb_source="$SRCPATH/image/oec-turbo/rk3566-onething-oec-box.dtb"
|
||||
local target_image="$TMPDIR/rootfs.img"
|
||||
local boot_offset=$((360448 * 512)) # boot 分区6的偏移
|
||||
local boot_mount="$TMPDIR/oec_boot_mount"
|
||||
local dtb_target_path="dtb/rockchip/rk3566-onething-oec-box.dtb"
|
||||
local boot_loopdev=""
|
||||
|
||||
echo "信息:替换 OEC-Turbo DTB 文件..."
|
||||
|
||||
if [ ! -f "$dtb_source" ]; then
|
||||
echo "信息:尝试下载 DTB 文件..."
|
||||
download_file_if_missing "$dtb_source"
|
||||
fi
|
||||
|
||||
echo "信息:为 boot 分区查找独立的 loop 设备..."
|
||||
# 查找一个新的loop设备用于boot分区
|
||||
boot_loopdev=$(losetup -f)
|
||||
ensure_dir "$boot_mount"
|
||||
|
||||
losetup -o "$boot_offset" "$boot_loopdev" "$target_image"
|
||||
mount "$boot_loopdev" "$boot_mount"
|
||||
|
||||
# 确保目标目录存在并复制 DTB 文件
|
||||
mkdir -p "$boot_mount/$(dirname "$dtb_target_path")"
|
||||
cp "$dtb_source" "$boot_mount/$dtb_target_path"
|
||||
echo "信息:DTB 文件替换成功: $dtb_target_path"
|
||||
|
||||
umount "$boot_mount"
|
||||
losetup -d "$boot_loopdev"
|
||||
rmdir "$boot_mount"
|
||||
}
|
||||
@ -1,386 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# --- 预准备 ---
|
||||
|
||||
prepare_dns_and_mirrors() {
|
||||
echo "信息:在 chroot 环境中准备 DNS 和更换软件源..."
|
||||
run_in_chroot "
|
||||
mkdir -p /run/systemd/resolve/ \\
|
||||
&& touch /run/systemd/resolve/stub-resolv.conf \\
|
||||
&& 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.ustc.edu.cn --upgrade-software false --web-protocol http || echo '警告:更换镜像源脚本执行失败,可能网络不通或脚本已更改'
|
||||
"
|
||||
}
|
||||
|
||||
delete_armbian_verify(){
|
||||
echo "信息:在 chroot 环境中修改 Armbian 软件源..."
|
||||
run_in_chroot "echo 'deb http://mirrors.ustc.edu.cn/armbian bullseye main bullseye-utils bullseye-desktop' > /etc/apt/sources.list.d/armbian.list"
|
||||
}
|
||||
|
||||
prepare_external_binaries() {
|
||||
local platform="$1" # linux/armhf or linux/amd64 or linux/aarch64
|
||||
# 如果在 GitHub Actions 环境下,使用 silentwind0/kvmd-stage-0,否则用阿里云镜像
|
||||
if is_github_actions; then
|
||||
local docker_image="silentwind0/kvmd-stage-0"
|
||||
else
|
||||
local docker_image="registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd-stage-0"
|
||||
fi
|
||||
|
||||
echo "信息:准备外部预编译二进制文件 (平台: $platform)..."
|
||||
ensure_dir "$PREBUILT_DIR"
|
||||
|
||||
echo "信息:拉取 Docker 镜像 $docker_image (平台: $platform)..."
|
||||
sudo docker pull --platform "$platform" "$docker_image" || { echo "错误:拉取 Docker 镜像 $docker_image 失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:创建 Docker 容器 $DOCKER_CONTAINER_NAME ..."
|
||||
sudo docker create --name "$DOCKER_CONTAINER_NAME" "$docker_image" || { echo "错误:创建 Docker 容器 $DOCKER_CONTAINER_NAME 失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:从 Docker 容器导出文件到 $PREBUILT_DIR ..."
|
||||
sudo docker export "$DOCKER_CONTAINER_NAME" | sudo tar -xf - -C "$PREBUILT_DIR" || { echo "错误:导出并解压 Docker 容器内容失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:预编译二进制文件准备完成,存放于 $PREBUILT_DIR"
|
||||
|
||||
# 删除 Docker 容器
|
||||
sudo docker rm -f "$DOCKER_CONTAINER_NAME" || { echo "错误:删除 Docker 容器 $DOCKER_CONTAINER_NAME 失败" >&2; exit 1; }
|
||||
}
|
||||
|
||||
config_base_files() {
|
||||
local platform_id="$1" # e.g., "onecloud", "cumebox2"
|
||||
echo "信息:配置基础文件和目录结构 ($platform_id)..."
|
||||
|
||||
echo "信息:创建 KVMD 相关目录..."
|
||||
ensure_dir "$ROOTFS/etc/kvmd/override.d"
|
||||
ensure_dir "$ROOTFS/etc/kvmd/vnc"
|
||||
ensure_dir "$ROOTFS/var/lib/kvmd/msd/images"
|
||||
ensure_dir "$ROOTFS/var/lib/kvmd/msd/meta"
|
||||
ensure_dir "$ROOTFS/opt/vc/bin"
|
||||
ensure_dir "$ROOTFS/usr/share/kvmd"
|
||||
ensure_dir "$ROOTFS/One-KVM"
|
||||
ensure_dir "$ROOTFS/usr/share/janus/javascript"
|
||||
ensure_dir "$ROOTFS/usr/lib/ustreamer/janus"
|
||||
ensure_dir "$ROOTFS/run/kvmd"
|
||||
ensure_dir "$ROOTFS/tmp/wheel/"
|
||||
ensure_dir "$ROOTFS/usr/lib/janus/transports/"
|
||||
ensure_dir "$ROOTFS/usr/lib/janus/loggers"
|
||||
|
||||
echo "信息:复制 One-KVM 源码..."
|
||||
sudo rsync -a --exclude={.git,.github,output,tmp} . "$ROOTFS/One-KVM/" || { echo "错误:复制 One-KVM 源码失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:复制配置文件..."
|
||||
sudo cp -r configs/kvmd/* configs/nginx configs/janus "$ROOTFS/etc/kvmd/"
|
||||
sudo cp -r web extras contrib/keymaps "$ROOTFS/usr/share/kvmd/"
|
||||
sudo cp testenv/fakes/vcgencmd "$ROOTFS/usr/bin/"
|
||||
sudo cp -r testenv/js/* "$ROOTFS/usr/share/janus/javascript/"
|
||||
sudo cp "build/platform/$platform_id" "$ROOTFS/usr/share/kvmd/platform" || { echo "错误:复制平台文件 build/platform/$platform_id 失败" >&2; exit 1; }
|
||||
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" || echo "信息:rc.local 文件不存在,跳过"
|
||||
if [ -f "$SRCPATH/image/$platform_id/rc.local" ]; then
|
||||
echo "信息:复制设备特定的 rc.local 文件..."
|
||||
sudo cp "$SRCPATH/image/$platform_id/rc.local" "$ROOTFS/etc/"
|
||||
fi
|
||||
|
||||
echo "信息:从预编译目录复制二进制文件和库..."
|
||||
sudo cp "$PREBUILT_DIR/tmp/lib/"* "$ROOTFS/lib/"*-linux-*/ || echo "警告:复制 /tmp/lib/* 失败,可能源目录或目标目录不存在或不匹配"
|
||||
sudo cp "$PREBUILT_DIR/tmp/ustreamer/ustreamer" "$PREBUILT_DIR/tmp/ustreamer/ustreamer-dump" "$PREBUILT_DIR/usr/bin/janus" "$ROOTFS/usr/bin/" || { echo "错误:复制 ustreamer/janus 二进制文件失败" >&2; exit 1; }
|
||||
sudo cp "$PREBUILT_DIR/tmp/ustreamer/janus/libjanus_ustreamer.so" "$ROOTFS/usr/lib/ustreamer/janus/" || { echo "错误:复制 libjanus_ustreamer.so 失败" >&2; exit 1; }
|
||||
sudo cp "$PREBUILT_DIR/tmp/wheel/"*.whl "$ROOTFS/tmp/wheel/" || { echo "错误:复制 Python wheel 文件失败" >&2; exit 1; }
|
||||
sudo cp "$PREBUILT_DIR/usr/lib/janus/transports/"* "$ROOTFS/usr/lib/janus/transports/" || { echo "错误:复制 Janus transports 失败" >&2; exit 1; }
|
||||
|
||||
# 禁用 apt-file
|
||||
if [ -f "$ROOTFS/etc/apt/apt.conf.d/50apt-file.conf" ]; then
|
||||
echo "信息:禁用 apt-file 配置..."
|
||||
sudo mv "$ROOTFS/etc/apt/apt.conf.d/50apt-file.conf" "$ROOTFS/etc/apt/apt.conf.d/50apt-file.conf.disabled"
|
||||
fi
|
||||
echo "信息:基础文件配置完成。"
|
||||
}
|
||||
|
||||
# --- KVMD 安装与配置 ---
|
||||
|
||||
install_base_packages() {
|
||||
echo "信息:在 chroot 环境中更新源并安装基础软件包..."
|
||||
run_in_chroot "
|
||||
apt-get update && \\
|
||||
apt install -y --no-install-recommends \\
|
||||
libxkbcommon-x11-0 nginx tesseract-ocr tesseract-ocr-eng tesseract-ocr-chi-sim \\
|
||||
iptables network-manager curl kmod libmicrohttpd12 libjansson4 libssl3 \\
|
||||
libsofia-sip-ua0 libglib2.0-0 libopus0 libogg0 libcurl4 libconfig9 \\
|
||||
python3-pip net-tools libavcodec59 libavformat59 libavutil57 libswscale6 \\
|
||||
libavfilter8 libavdevice59 v4l-utils libv4l-0 nano unzip dnsmasq python3-systemd && \\
|
||||
apt clean && \\
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
"
|
||||
}
|
||||
|
||||
configure_network() {
|
||||
local network_type="$1" # "systemd-networkd" or others (default network-manager)
|
||||
if [ "$network_type" = "systemd-networkd" ]; then
|
||||
echo "信息:在 chroot 环境中配置 systemd-networkd..."
|
||||
|
||||
# onecloud 与 onecloud-pro 均启用基于 SN 的 MAC 地址生成
|
||||
if [ "$TARGET_DEVICE_NAME" = "onecloud" ] || [ "$TARGET_DEVICE_NAME" = "onecloud-pro" ]; then
|
||||
echo "信息:为 ${TARGET_DEVICE_NAME} 平台配置基于 SN 的 MAC 地址生成机制..."
|
||||
|
||||
# 复制MAC地址生成脚本
|
||||
sudo cp "$SCRIPT_DIR/scripts/generate-random-mac.sh" "$ROOTFS/usr/local/bin/"
|
||||
sudo chmod +x "$ROOTFS/usr/local/bin/generate-random-mac.sh"
|
||||
|
||||
# 复制systemd服务文件
|
||||
sudo cp "$SCRIPT_DIR/services/kvmd-generate-mac.service" "$ROOTFS/etc/systemd/system/"
|
||||
|
||||
# 创建初始网络配置文件(不包含MAC地址,将由脚本生成)
|
||||
run_in_chroot "
|
||||
echo -e '[Match]\\nName=eth0\\n\\n[Network]\\nDHCP=yes' > /etc/systemd/network/99-eth0.network && \\
|
||||
systemctl mask NetworkManager && \\
|
||||
systemctl unmask systemd-networkd && \\
|
||||
systemctl enable systemd-networkd systemd-resolved && \\
|
||||
systemctl enable kvmd-generate-mac.service
|
||||
"
|
||||
echo "信息:${TARGET_DEVICE_NAME} 基于 SN 的 MAC 地址生成机制配置完成"
|
||||
fi
|
||||
else
|
||||
echo "信息:使用默认的网络管理器 (NetworkManager)..."
|
||||
# 可能需要确保 NetworkManager 是启用的 (通常默认是)
|
||||
run_in_chroot "systemctl enable NetworkManager"
|
||||
fi
|
||||
}
|
||||
|
||||
install_python_deps() {
|
||||
echo "信息:在 chroot 环境中安装 Python 依赖 (wheels)..."
|
||||
run_in_chroot "
|
||||
pip3 install --no-cache-dir --break-system-packages /tmp/wheel/*.whl && \\
|
||||
pip3 cache purge && \\
|
||||
rm -rf /tmp/wheel
|
||||
"
|
||||
}
|
||||
|
||||
configure_kvmd_core() {
|
||||
echo "信息:在 chroot 环境中安装和配置 KVMD 核心..."
|
||||
|
||||
# 复制KVMD首次运行脚本和服务
|
||||
echo "信息:配置KVMD首次运行初始化服务..."
|
||||
sudo cp "build/services/kvmd-firstrun.service" "$ROOTFS/etc/systemd/system/"
|
||||
|
||||
# 安装KVMD但不执行需要在首次运行时完成的操作
|
||||
run_in_chroot "
|
||||
cd /One-KVM && \\
|
||||
python3 setup.py install && \\
|
||||
systemctl enable kvmd-firstrun.service
|
||||
"
|
||||
|
||||
echo "信息:KVMD核心安装完成,证书生成等初始化操作将在首次开机时执行"
|
||||
}
|
||||
|
||||
configure_system() {
|
||||
echo "信息:在 chroot 环境中配置系统级设置 (sudoers, udev, services)..."
|
||||
run_in_chroot "
|
||||
cat /One-KVM/configs/os/sudoers/v2-hdmiusb >> /etc/sudoers && \\
|
||||
cat /One-KVM/configs/os/udev/v2-hdmiusb-rpi4.rules > /etc/udev/rules.d/99-kvmd.rules && \\
|
||||
echo 'libcomposite' >> /etc/modules && \\
|
||||
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-kvmd-extra.conf && \\
|
||||
mv /usr/local/bin/kvmd* /usr/bin/ || echo '信息:/usr/local/bin/kvmd* 未找到或移动失败,可能已在/usr/bin' && \\
|
||||
cp -r /One-KVM/configs/os/services/* /etc/systemd/system/ && \\
|
||||
cp /One-KVM/configs/os/tmpfiles.conf /usr/lib/tmpfiles.d/ && \\
|
||||
chmod +x /etc/update-motd.d/* || echo '警告:chmod /etc/update-motd.d/* 失败' && \\
|
||||
echo 'kvmd ALL=(ALL) NOPASSWD: /etc/kvmd/custom_atx/gpio.sh' >> /etc/sudoers && \\
|
||||
echo 'kvmd ALL=(ALL) NOPASSWD: /etc/kvmd/custom_atx/usbrelay_hid.sh' >> /etc/sudoers && \\
|
||||
systemd-sysusers /One-KVM/configs/os/sysusers.conf && \\
|
||||
systemd-sysusers /One-KVM/configs/os/kvmd-webterm.conf && \\
|
||||
ln -sf /usr/share/tesseract-ocr/*/tessdata /usr/share/tessdata || echo '警告:创建 tesseract 链接失败' && \\
|
||||
sed -i 's/8080/80/g' /etc/kvmd/override.yaml && \\
|
||||
sed -i 's/4430/443/g' /etc/kvmd/override.yaml && \\
|
||||
chown kvmd -R /var/lib/kvmd/msd/ && \\
|
||||
rm /etc/resolv.conf && \\
|
||||
printf '%s\\n' 'nameserver 1.1.1.1' 'nameserver 1.0.0.1' > /etc/resolv.conf && \
|
||||
systemctl enable dnsmasq kvmd kvmd-otg kvmd-nginx kvmd-vnc kvmd-ipmi kvmd-webterm kvmd-janus kvmd-media kvmd-gostc && \\
|
||||
systemctl disable nginx systemd-resolved && \\
|
||||
rm -rf /One-KVM
|
||||
"
|
||||
}
|
||||
|
||||
install_webterm() {
|
||||
local arch="$1" # armhf, aarch64, x86_64
|
||||
local ttyd_arch="$arch"
|
||||
|
||||
if [ "$arch" = "armhf" ]; then
|
||||
ttyd_arch="armhf"
|
||||
elif [ "$arch" = "amd64" ]; then
|
||||
ttyd_arch="x86_64"
|
||||
elif [ "$arch" = "aarch64" ]; then
|
||||
ttyd_arch="aarch64"
|
||||
fi
|
||||
|
||||
echo "信息:在 chroot 环境中下载并安装 ttyd ($ttyd_arch)..."
|
||||
run_in_chroot "
|
||||
curl -L https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.${ttyd_arch} -o /usr/bin/ttyd && \\
|
||||
chmod +x /usr/bin/ttyd && \\
|
||||
mkdir -p /home/kvmd-webterm && \\
|
||||
chown kvmd-webterm /home/kvmd-webterm
|
||||
"
|
||||
}
|
||||
|
||||
install_gostc() {
|
||||
local arch="$1" # armhf, aarch64, x86_64
|
||||
local gostc_arch="$arch"
|
||||
local gostc_version="v2.0.8-beta.2"
|
||||
|
||||
# 根据架构映射下载文件名
|
||||
case "$arch" in
|
||||
armhf) gostc_arch="arm_7" ;;
|
||||
aarch64) gostc_arch="arm64_v8.0" ;;
|
||||
x86_64|amd64) gostc_arch="amd64_v1" ;;
|
||||
*) echo "错误:不支持的架构 $arch"; exit 1 ;;
|
||||
esac
|
||||
|
||||
echo "信息:在 chroot 环境中下载并安装 gostc ($gostc_arch)..."
|
||||
run_in_chroot "
|
||||
mkdir -p /tmp/gostc && cd /tmp/gostc && \\
|
||||
curl -L https://github.com/mofeng-git/gostc-open/releases/download/${gostc_version}/gostc_linux_${gostc_arch}.tar.gz -o gostc.tar.gz && \\
|
||||
tar -xzf gostc.tar.gz && \\
|
||||
mv gostc /usr/bin/ && \\
|
||||
chmod +x /usr/bin/gostc && \\
|
||||
cd / && rm -rf /tmp/gostc
|
||||
"
|
||||
|
||||
echo "信息:创建 gostc systemd 服务文件..."
|
||||
run_in_chroot "
|
||||
cat > /etc/systemd/system/kvmd-gostc.service << 'EOF'
|
||||
[Unit]
|
||||
Description=基于FRP开发的内网穿透 客户端/节点
|
||||
ConditionFileIsExecutable=/usr/bin/gostc
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
StartLimitInterval=5
|
||||
StartLimitBurst=10
|
||||
ExecStart=/usr/bin/gostc \"-web-addr\" \"0.0.0.0:18080\"
|
||||
WorkingDirectory=/usr/bin
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
EnvironmentFile=-/etc/sysconfig/gostc
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
"
|
||||
|
||||
echo "信息:gostc 安装和配置完成"
|
||||
}
|
||||
|
||||
apply_kvmd_tweaks() {
|
||||
local arch="$1" # armhf, aarch64, x86_64
|
||||
local device_type="$2" # "gpio" or "video1" or other
|
||||
local atx_setting=""
|
||||
local hid_setting=""
|
||||
|
||||
echo "信息:根据架构 ($arch) 和设备类型 ($device_type) 调整 KVMD 配置..."
|
||||
|
||||
if [ "$arch" = "x86_64" ] || [ "$arch" = "amd64" ]; then
|
||||
echo "信息:目标平台为 x86_64/amd64 架构,禁用 OTG,设置 ATX 为 USBRELAY_HID..."
|
||||
run_in_chroot "
|
||||
systemctl disable kvmd-otg && \\
|
||||
sed -i 's/^ATX=.*/ATX=USBRELAY_HID/' /etc/kvmd/atx.sh && \\
|
||||
sed -i 's/device: \/dev\/ttyUSB0/device: \/dev\/kvmd-hid/g' /etc/kvmd/override.yaml
|
||||
"
|
||||
else
|
||||
echo "信息::目标平台为 ARM 架构 ($arch)..."
|
||||
# ARM 架构,配置 HID 为 OTG
|
||||
hid_setting="otg"
|
||||
run_in_chroot "
|
||||
sed -i 's/#type: otg/type: otg/g' /etc/kvmd/override.yaml && \\
|
||||
sed -i 's/device: \/dev\/ttyUSB0/#device: \/dev\/ttyUSB0/g' /etc/kvmd/override.yaml # 注释掉 ttyUSB0
|
||||
"
|
||||
echo "信息:设置 HID 为 $hid_setting"
|
||||
run_in_chroot "sed -i 's/type: ch9329/type: $hid_setting/g' /etc/kvmd/override.yaml"
|
||||
|
||||
|
||||
# 根据 device_type 配置 ATX
|
||||
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 "
|
||||
sed -i 's/^ATX=.*/ATX=GPIO/' /etc/kvmd/atx.sh && \\
|
||||
sed -i 's/SHUTDOWNPIN/gpiochip1 7/g' /etc/kvmd/custom_atx/gpio.sh && \\
|
||||
sed -i 's/REBOOTPIN/gpiochip0 11/g' /etc/kvmd/custom_atx/gpio.sh
|
||||
"
|
||||
else
|
||||
echo "信息:电源控制设备类型不是 gpio ($device_type),设置 ATX 为 USBRELAY_HID..."
|
||||
atx_setting="USBRELAY_HID"
|
||||
run_in_chroot "sed -i 's/^ATX=.*/ATX=USBRELAY_HID/' /etc/kvmd/atx.sh"
|
||||
fi
|
||||
|
||||
# 配置视频设备
|
||||
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" == *"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
|
||||
echo "信息:使用默认视频设备 /dev/video0..."
|
||||
fi
|
||||
fi
|
||||
echo "信息:KVMD 配置调整完成。"
|
||||
|
||||
run_in_chroot "apt remove -y --purge systemd-resolved"
|
||||
}
|
||||
|
||||
# --- 整体安装流程 ---
|
||||
install_and_configure_kvmd() {
|
||||
local arch="$1" # 架构: armhf, aarch64, x86_64/amd64
|
||||
local device_type="$2" # 设备特性: "gpio", "video1", "" (空或其他)
|
||||
local network_type="$3" # 网络配置: "systemd-networkd", "" (默认 network-manager)
|
||||
local host_arch="" # Docker 平台架构: arm, aarch64, amd64
|
||||
|
||||
# 映射架构名称
|
||||
case "$arch" in
|
||||
armhf) host_arch="arm" ;;
|
||||
aarch64) host_arch="arm64" ;; # docker aarch64 平台名是 arm64
|
||||
x86_64|amd64) host_arch="amd64"; arch="x86_64" ;; # 统一内部使用 x86_64
|
||||
*) echo "错误:不支持的架构 $arch"; exit 1 ;;
|
||||
esac
|
||||
|
||||
|
||||
prepare_external_binaries "linux/$host_arch"
|
||||
config_base_files "$TARGET_DEVICE_NAME" # 使用全局变量传递设备名
|
||||
|
||||
# 特定设备的额外文件配置 (如果存在)
|
||||
# 将设备名中的连字符转换为下划线以匹配函数名
|
||||
local device_func_name="${TARGET_DEVICE_NAME//-/_}"
|
||||
if declare -f "config_${device_func_name}_files" > /dev/null; then
|
||||
echo "信息:执行特定设备的文件配置函数 config_${device_func_name}_files ..."
|
||||
"config_${device_func_name}_files"
|
||||
fi
|
||||
|
||||
# 某些镜像可能需要准备DNS和换源
|
||||
if [[ "$NEED_PREPARE_DNS" = true ]]; then
|
||||
prepare_dns_and_mirrors
|
||||
fi
|
||||
# 可选:强制使用特定armbian源
|
||||
# delete_armbian_verify
|
||||
|
||||
# 执行安装步骤
|
||||
install_base_packages
|
||||
configure_network "$network_type"
|
||||
install_python_deps
|
||||
configure_kvmd_core
|
||||
install_gostc "$arch" # 安装 gostc
|
||||
configure_system
|
||||
install_webterm "$arch" # 传递原始架构名给ttyd下载
|
||||
apply_kvmd_tweaks "$arch" "$device_type"
|
||||
|
||||
run_in_chroot "df -h" # 显示最终磁盘使用情况
|
||||
echo "信息:One-KVM 安装和配置完成。"
|
||||
}
|
||||
@ -1,105 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# --- 压缩函数 ---
|
||||
|
||||
# 压缩镜像文件(仅在 GitHub Actions 环境中)
|
||||
compress_image_file() {
|
||||
local file_path="$1"
|
||||
|
||||
if is_github_actions && [[ -f "$file_path" ]]; then
|
||||
echo "信息:压缩镜像文件: $file_path"
|
||||
if xz -9 -vv "$file_path"; then
|
||||
echo "信息:压缩完成: ${file_path}.xz"
|
||||
else
|
||||
echo "警告:压缩文件 $file_path 失败"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 打包函数 ---
|
||||
|
||||
pack_img() {
|
||||
local device_name_friendly="$1" # e.g., "Vm", "Cumebox2"
|
||||
local target_img_name="One-KVM_by-SilentWind_${device_name_friendly}_${DATE}.img"
|
||||
local source_img="$TMPDIR/rootfs.img"
|
||||
|
||||
echo "信息:开始打包镜像 ($device_name_friendly)..."
|
||||
ensure_dir "$OUTPUTDIR"
|
||||
|
||||
# 确保在打包前已经正确卸载了所有挂载点和loop设备
|
||||
if [[ "$ROOTFS_MOUNTED" -eq 1 || "$DEV_MOUNTED" -eq 1 || "$SYS_MOUNTED" -eq 1 || "$PROC_MOUNTED" -eq 1 || -n "$LOOPDEV" && -b "$LOOPDEV" ]]; then
|
||||
echo "警告:发现未卸载的挂载点或loop设备,尝试再次卸载..."
|
||||
unmount_all
|
||||
fi
|
||||
|
||||
echo "信息:移动镜像文件 $source_img 到 $OUTPUTDIR/$target_img_name ..."
|
||||
sudo mv "$source_img" "$OUTPUTDIR/$target_img_name" || { echo "错误:移动镜像文件失败" >&2; exit 1; }
|
||||
|
||||
if [ "$device_name_friendly" = "Vm" ]; then
|
||||
echo "信息:为 Vm 目标转换镜像格式 (vmdk, vdi)..."
|
||||
local raw_img="$OUTPUTDIR/$target_img_name"
|
||||
local vmdk_img="$OUTPUTDIR/One-KVM_by-SilentWind_Vmare-uefi_${DATE}.vmdk"
|
||||
local vdi_img="$OUTPUTDIR/One-KVM_by-SilentWind_Virtualbox-uefi_${DATE}.vdi"
|
||||
|
||||
echo "信息:转换为 VMDK..."
|
||||
sudo qemu-img convert -f raw -O vmdk "$raw_img" "$vmdk_img" || echo "警告:转换为 VMDK 失败"
|
||||
echo "信息:转换为 VDI..."
|
||||
sudo qemu-img convert -f raw -O vdi "$raw_img" "$vdi_img" || echo "警告:转换为 VDI 失败"
|
||||
|
||||
# 在 GitHub Actions 环境中压缩 VM 镜像文件
|
||||
if is_github_actions; then
|
||||
echo "信息:在 GitHub Actions 环境中压缩 VM 镜像文件..."
|
||||
compress_image_file "$raw_img"
|
||||
compress_image_file "$vmdk_img"
|
||||
compress_image_file "$vdi_img"
|
||||
fi
|
||||
else
|
||||
# 在 GitHub Actions 环境中压缩镜像文件
|
||||
if is_github_actions; then
|
||||
echo "信息:在 GitHub Actions 环境中压缩镜像文件..."
|
||||
compress_image_file "$OUTPUTDIR/$target_img_name"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "信息:镜像打包完成: $OUTPUTDIR/$target_img_name"
|
||||
}
|
||||
|
||||
pack_img_onecloud() {
|
||||
local target_img_name="One-KVM_by-SilentWind_Onecloud_${DATE}.burn.img"
|
||||
local rootfs_raw_img="$TMPDIR/rootfs.img"
|
||||
local rootfs_sparse_img="$TMPDIR/7.rootfs.PARTITION.sparse"
|
||||
local aml_packer="$SRCPATH/image/onecloud/AmlImg_v0.3.1_linux_amd64"
|
||||
|
||||
echo "信息:开始为 Onecloud 打包 burn 镜像..."
|
||||
ensure_dir "$OUTPUTDIR"
|
||||
|
||||
# 确保在打包前已经正确卸载了所有挂载点和loop设备
|
||||
if [[ "$ROOTFS_MOUNTED" -eq 1 || "$DEV_MOUNTED" -eq 1 || "$SYS_MOUNTED" -eq 1 || "$PROC_MOUNTED" -eq 1 || -n "$LOOPDEV" && -b "$LOOPDEV" ]]; then
|
||||
echo "警告:发现未卸载的挂载点或loop设备,尝试再次卸载..."
|
||||
unmount_all
|
||||
fi
|
||||
|
||||
# 自动下载 AmlImg 工具(如果不存在)
|
||||
download_file_if_missing "$aml_packer" || { echo "错误:下载 AmlImg 工具失败" >&2; exit 1; }
|
||||
sudo chmod +x "$aml_packer" || { echo "错误:设置 AmlImg 工具执行权限失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:将 raw rootfs 转换为 sparse image..."
|
||||
# 先删除可能存在的旧 sparse 文件
|
||||
sudo rm -f "$rootfs_sparse_img"
|
||||
sudo img2simg "$rootfs_raw_img" "$rootfs_sparse_img" || { echo "错误:img2simg 转换失败" >&2; exit 1; }
|
||||
sudo rm "$rootfs_raw_img" # 删除 raw 文件,因为它已被转换
|
||||
|
||||
echo "信息:使用 AmlImg 工具打包..."
|
||||
sudo "$aml_packer" pack "$OUTPUTDIR/$target_img_name" "$TMPDIR/" || { echo "错误:AmlImg 打包失败" >&2; exit 1; }
|
||||
|
||||
echo "信息:清理 Onecloud 临时文件..."
|
||||
sudo rm -f "$TMPDIR/6.boot.PARTITION.sparse" "$TMPDIR/7.rootfs.PARTITION.sparse" "$TMPDIR/dts.img"
|
||||
|
||||
# 在 GitHub Actions 环境中压缩 Onecloud 镜像文件
|
||||
if is_github_actions; then
|
||||
echo "信息:在 GitHub Actions 环境中压缩 Onecloud 镜像文件..."
|
||||
compress_image_file "$OUTPUTDIR/$target_img_name"
|
||||
fi
|
||||
|
||||
echo "信息:Onecloud burn 镜像打包完成: $OUTPUTDIR/$target_img_name"
|
||||
}
|
||||
300
build/init.sh
300
build/init.sh
@ -1,300 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ========================================================================== #
|
||||
# #
|
||||
# KVMD - The main PiKVM daemon. #
|
||||
# #
|
||||
# Copyright (C) 2023-2025 SilentWind <mofeng654321@hotmail.com> #
|
||||
# #
|
||||
# This program is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||
# #
|
||||
# ========================================================================== #
|
||||
|
||||
# 定义颜色代码
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# 输出日志的函数
|
||||
log_info() {
|
||||
echo -e "${GREEN}[INFO] $1${NC}"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN] $1${NC}"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR] $1${NC}"
|
||||
}
|
||||
|
||||
# 初始化检查
|
||||
log_info "One-KVM 正在启动..."
|
||||
|
||||
# 首次初始化配置
|
||||
if [ ! -f /etc/kvmd/.init_flag ]; then
|
||||
log_info "首次初始化配置..."
|
||||
|
||||
# 创建必要目录并移动配置文件
|
||||
if mkdir -p /etc/kvmd/ && \
|
||||
mv /etc/kvmd_backup/* /etc/kvmd/ && \
|
||||
touch /etc/kvmd/.docker_flag && \
|
||||
sed -i 's/localhost.localdomain/docker/g' /etc/kvmd/meta.yaml && \
|
||||
sed -i 's/localhost/localhost:4430/g' /etc/kvmd/kvm_input.sh; then
|
||||
log_info "移动配置文件完成"
|
||||
else
|
||||
log_error "移动配置文件失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# SSL证书配置
|
||||
if ! /usr/share/kvmd/kvmd-gencert --do-the-thing; then
|
||||
log_error "Nginx SSL 证书生成失败"
|
||||
exit 1
|
||||
fi
|
||||
if ! /usr/share/kvmd/kvmd-gencert --do-the-thing --vnc; then
|
||||
log_error "VNC SSL 证书生成失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 设置用户名和密码
|
||||
if [ ! -z "$USERNAME" ] && [ ! -z "$PASSWORD" ]; then
|
||||
# 设置自定义用户名和密码
|
||||
if python -m kvmd.apps.htpasswd del admin \
|
||||
&& echo "$PASSWORD" | python -m kvmd.apps.htpasswd add -i "$USERNAME" \
|
||||
&& echo "$PASSWORD -> $USERNAME:$PASSWORD" > /etc/kvmd/vncpasswd \
|
||||
&& echo "$USERNAME:$PASSWORD -> $USERNAME:$PASSWORD" > /etc/kvmd/ipmipasswd; then
|
||||
log_info "用户凭据设置成功"
|
||||
else
|
||||
log_error "用户凭据设置失败"
|
||||
exit 1
|
||||
fi
|
||||
elif [ ! -z "$PASSWORD" ] && [ -z "$USERNAME" ]; then
|
||||
# 只设置密码,保持admin用户名
|
||||
if echo "$PASSWORD" | python -m kvmd.apps.htpasswd set -i "admin" \
|
||||
&& echo "$PASSWORD -> admin:$PASSWORD" > /etc/kvmd/vncpasswd \
|
||||
&& echo "admin:$PASSWORD -> admin:$PASSWORD" > /etc/kvmd/ipmipasswd; then
|
||||
log_info "admin 用户密码设置成功"
|
||||
else
|
||||
log_error "admin 用户密码设置失败"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
log_warn "未设置 USERNAME 和 PASSWORD 环境变量,使用默认值(admin/admin)"
|
||||
fi
|
||||
|
||||
# SSL开关配置
|
||||
if [ "$NOSSL" == 1 ]; then
|
||||
log_info "已禁用SSL"
|
||||
if ! python -m kvmd.apps.ngxmkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf -o nginx/https/enabled=false; then
|
||||
log_error "Nginx 配置失败"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
if ! python -m kvmd.apps.ngxmkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf; then
|
||||
log_error "Nginx 配置失败"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 认证配置
|
||||
if [ "$NOAUTH" == "1" ]; then
|
||||
sed -i "s/enabled: true/enabled: false/g" /etc/kvmd/override.yaml
|
||||
log_info "已禁用认证"
|
||||
fi
|
||||
|
||||
#add supervisord conf
|
||||
if [ "$NOWEBTERM" == "1" ]; then
|
||||
log_info "已禁用 WebTerm 功能"
|
||||
rm -r /usr/share/kvmd/extras/webterm
|
||||
else
|
||||
cat >> /etc/kvmd/supervisord.conf << EOF
|
||||
|
||||
[program:kvmd-webterm]
|
||||
command=/usr/local/bin/ttyd --interface=/run/kvmd/ttyd.sock --port=0 --writable /bin/bash -c '/etc/kvmd/armbain-motd; bash'
|
||||
directory=/
|
||||
autostart=true
|
||||
autorestart=true
|
||||
priority=14
|
||||
stopasgroup=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes = 0
|
||||
redirect_stderr=true
|
||||
EOF
|
||||
fi
|
||||
|
||||
if [ "$NOWEBTERMWRITE" == "1" ]; then
|
||||
sed -i "s/--writable//g" /etc/kvmd/supervisord.conf
|
||||
fi
|
||||
|
||||
if [ "$NOVNC" == "1" ]; then
|
||||
log_info "已禁用 VNC 功能"
|
||||
rm -r /usr/share/kvmd/extras/vnc
|
||||
else
|
||||
cat >> /etc/kvmd/supervisord.conf << EOF
|
||||
|
||||
[program:kvmd-vnc]
|
||||
command=python -m kvmd.apps.vnc --run
|
||||
directory=/
|
||||
autostart=true
|
||||
autorestart=true
|
||||
priority=11
|
||||
stopasgroup=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes = 0
|
||||
redirect_stderr=true
|
||||
EOF
|
||||
fi
|
||||
|
||||
if [ "$NOIPMI" == "1" ]; then
|
||||
log_info "已禁用 IPMI 功能"
|
||||
rm -r /usr/share/kvmd/extras/ipmi
|
||||
else
|
||||
cat >> /etc/kvmd/supervisord.conf << EOF
|
||||
|
||||
[program:kvmd-ipmi]
|
||||
command=python -m kvmd.apps.ipmi --run
|
||||
directory=/
|
||||
autostart=true
|
||||
autorestart=true
|
||||
priority=12
|
||||
stopasgroup=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes = 0
|
||||
redirect_stderr=true
|
||||
EOF
|
||||
fi
|
||||
|
||||
if [ "$NOGOSTC" == "1" ]; then
|
||||
log_info "已禁用 GOSTC 功能"
|
||||
rm -rf /usr/share/kvmd/extras/gostc
|
||||
else
|
||||
cat >> /etc/kvmd/supervisord.conf << EOF
|
||||
|
||||
[program:kvmd-gostc]
|
||||
command=/usr/bin/gostc -web-addr 127.0.0.1:18080
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startsecs=5
|
||||
priority=300
|
||||
stopasgroup=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes = 0
|
||||
redirect_stderr=true
|
||||
EOF
|
||||
fi
|
||||
|
||||
#switch OTG config
|
||||
if [ "$OTG" == "1" ]; then
|
||||
log_info "已启用 OTG 功能"
|
||||
sed -i "s/ch9329/otg/g" /etc/kvmd/override.yaml
|
||||
sed -i "s|device: /dev/ttyUSB0||g" /etc/kvmd/override.yaml
|
||||
if [ "$NOMSD" == 1 ]; then
|
||||
log_info "已禁用 MSD 功能"
|
||||
else
|
||||
sed -i "s/#type: otg/type: otg/g" /etc/kvmd/override.yaml
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -z "$VIDEONUM" ]; then
|
||||
if sed -i "s|/dev/video0|/dev/video$VIDEONUM|g" /etc/kvmd/override.yaml && \
|
||||
sed -i "s|/dev/video0|/dev/video$VIDEONUM|g" /etc/kvmd/janus/janus.plugin.ustreamer.jcfg; then
|
||||
log_info "视频设备已设置为 /dev/video$VIDEONUM"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -z "$AUDIONUM" ]; then
|
||||
if sed -i "s/hw:0/hw:$AUDIONUM/g" /etc/kvmd/janus/janus.plugin.ustreamer.jcfg; then
|
||||
log_info "音频设备已设置为 hw:$AUDIONUM"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -z "$CH9329SPEED" ]; then
|
||||
if sed -i "s/speed: 9600/speed: $CH9329SPEED/g" /etc/kvmd/override.yaml; then
|
||||
log_info "CH9329 串口速率已设置为 $CH9329SPEED"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -z "$CH9329NUM" ]; then
|
||||
if sed -i "s|/dev/ttyUSB0|/dev/ttyUSB$CH9329NUM|g" /etc/kvmd/override.yaml; then
|
||||
log_info "CH9329 串口设备已设置为 $CH9329NUM"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -z "$CH9329TIMEOUT" ]; then
|
||||
if sed -i "s/read_timeout: 0.3/read_timeout: $CH9329TIMEOUT/g" /etc/kvmd/override.yaml; then
|
||||
log_info "CH9329 超时已设置为 $CH9329TIMEOUT 秒"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -z "$H264PRESET" ]; then
|
||||
if sed -i "s/ultrafast/$H264PRESET/g" /etc/kvmd/override.yaml; then
|
||||
log_info "H264 预设已设置为 $H264PRESET"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -z "$VIDEOFORMAT" ]; then
|
||||
if sed -i "s/--format=mjpeg/--format=$VIDEOFORMAT/g" /etc/kvmd/override.yaml; then
|
||||
log_info "视频输入格式已设置为 $VIDEOFORMAT"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -z "$HWENCODER" ]; then
|
||||
if sed -i "s/--h264-hwenc=disabled/--h264-hwenc=$HWENCODER/g" /etc/kvmd/override.yaml; then
|
||||
log_info "硬件编码器已设置为 $HWENCODER"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 设置WEB端口
|
||||
if [ ! -z "$HTTPPORT" ]; then
|
||||
if sed -i "s/port: 8080/port: $HTTPPORT/g" /etc/kvmd/override.yaml; then
|
||||
log_info "HTTP 端口已设置为 $HTTPPORT"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -z "$HTTPSPORT" ]; then
|
||||
if sed -i "s/port: 4430/port: $HTTPSPORT/g" /etc/kvmd/override.yaml; then
|
||||
log_info "HTTPS 端口已设置为 $HTTPSPORT"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
touch /etc/kvmd/.init_flag
|
||||
log_info "初始化配置完成"
|
||||
fi
|
||||
|
||||
# OTG设备配置
|
||||
if [ "$OTG" == "1" ]; then
|
||||
log_info "正在配置 OTG 设备..."
|
||||
rm -r /run/kvmd/otg &> /dev/null
|
||||
|
||||
if ! modprobe libcomposite; then
|
||||
log_error "加载 libcomposite 模块失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if python -m kvmd.apps.otg start; then
|
||||
ln -s /dev/hidg1 /dev/kvmd-hid-mouse
|
||||
ln -s /dev/hidg0 /dev/kvmd-hid-keyboard
|
||||
ln -s /dev/hidg2 /dev/kvmd-hid-mouse-alt
|
||||
log_info "OTG 设备配置完成"
|
||||
else
|
||||
log_warn "OTG 设备挂载失败"
|
||||
#exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
log_info "One-KVM 配置文件准备完成,正在启动服务..."
|
||||
exec supervisord -c /etc/kvmd/supervisord.conf
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=v2_model
|
||||
PIKVM_VIDEO=usb_video
|
||||
PIKVM_BOARD=chainedbox
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=v2_model
|
||||
PIKVM_VIDEO=usb_video
|
||||
PIKVM_BOARD=cumebox2
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=docker_model
|
||||
PIKVM_VIDEO=docker_video
|
||||
PIKVM_BOARD=docker_board
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=v2_model
|
||||
PIKVM_VIDEO=usb_video
|
||||
PIKVM_BOARD=e900v22c
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=v2_model
|
||||
PIKVM_VIDEO=usb_video
|
||||
PIKVM_BOARD=octopus-flanet
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=v2_model
|
||||
PIKVM_VIDEO=usb_video
|
||||
PIKVM_BOARD=oec-turbo
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=v2_model
|
||||
PIKVM_VIDEO=usb_video
|
||||
PIKVM_BOARD=onecloud
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=v2_model
|
||||
PIKVM_VIDEO=usb_video
|
||||
PIKVM_BOARD=onecloud-pro
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=v2_model
|
||||
PIKVM_VIDEO=usb_video
|
||||
PIKVM_BOARD=orangepi-zero
|
||||
@ -1,3 +0,0 @@
|
||||
PIKVM_MODEL=v2_model
|
||||
PIKVM_VIDEO=usb_video
|
||||
PIKVM_BOARD=vm
|
||||
@ -1,21 +0,0 @@
|
||||
wget https://github.com/hzyitc/AmlImg/releases/download/v0.3.1/AmlImg_v0.3.1_linux_amd64 -O /mnt/src/image/onecloud/AmlImg_v0.3.1_linux_amd64
|
||||
chmod +x /mnt/src/image/onecloud/AmlImg_v0.3.1_linux_amd64
|
||||
|
||||
|
||||
#!/bin/bash
|
||||
# 文件映射脚本
|
||||
# 本地目录前缀:/mnt
|
||||
# 远程URL前缀:https://files.mofeng.run
|
||||
|
||||
LOCAL_PREFIX="/mnt"
|
||||
REMOTE_PREFIX="https://files.mofeng.run"
|
||||
|
||||
# 文件相对路径
|
||||
REL_PATH="src/image/onecloud/Armbian_by-SilentWind_24.5.0-trunk_Onecloud_bookworm_legacy_5.9.0-rc7_minimal_support-dvd-emulation.burn.img"
|
||||
|
||||
LOCAL_FILE="$LOCAL_PREFIX/$REL_PATH"
|
||||
REMOTE_URL="$REMOTE_PREFIX/$REL_PATH"
|
||||
|
||||
echo "下载 $REMOTE_URL 到 $LOCAL_FILE"
|
||||
mkdir -p "$(dirname "$LOCAL_FILE")"
|
||||
wget -O "$LOCAL_FILE" "$REMOTE_URL"
|
||||
@ -1,122 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 为玩客云/玩客云Pro 平台生成 MAC 地址的一次性脚本
|
||||
# 此脚本在首次开机时执行,为 eth0 网卡生成并应用基于 SN 的 MAC 地址,失败时回退到随机 MAC
|
||||
|
||||
set -e
|
||||
|
||||
NETWORK_CONFIG="/etc/systemd/network/99-eth0.network"
|
||||
LOCK_FILE="/var/lib/kvmd/.mac-generated"
|
||||
PLATFORM_FILE="/usr/share/kvmd/platform"
|
||||
EFUSE_SYSFS_PATH=""
|
||||
SN_PREFIX=""
|
||||
SN_EXPECTED_LENGTH=13
|
||||
|
||||
# 按平台设置 EFUSE 与 SN 参数;未知平台时按 efuse 路径探测
|
||||
detect_platform_params() {
|
||||
local platform=""
|
||||
if [ -f "$PLATFORM_FILE" ]; then
|
||||
platform=$(tr -d '\n' < "$PLATFORM_FILE")
|
||||
fi
|
||||
|
||||
case "$platform" in
|
||||
onecloud)
|
||||
EFUSE_SYSFS_PATH="/sys/bus/nvmem/devices/meson8b-efuse0/nvmem"
|
||||
SN_PREFIX="OCP"
|
||||
;;
|
||||
onecloud-pro)
|
||||
EFUSE_SYSFS_PATH="/sys/devices/platform/efuse/efuse0/nvmem"
|
||||
SN_PREFIX="ODC"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$EFUSE_SYSFS_PATH" ] || [ -z "$SN_PREFIX" ]; then
|
||||
if [ -e "/sys/devices/platform/efuse/efuse0/nvmem" ]; then
|
||||
EFUSE_SYSFS_PATH="/sys/devices/platform/efuse/efuse0/nvmem"
|
||||
SN_PREFIX="ODC"
|
||||
elif [ -e "/sys/bus/nvmem/devices/meson8b-efuse0/nvmem" ]; then
|
||||
EFUSE_SYSFS_PATH="/sys/bus/nvmem/devices/meson8b-efuse0/nvmem"
|
||||
SN_PREFIX="OCP"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 检查是否已经执行过
|
||||
if [ -f "$LOCK_FILE" ]; then
|
||||
echo "MAC地址已经生成过,跳过执行"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 生成MAC地址函数
|
||||
generate_random_mac() {
|
||||
detect_platform_params
|
||||
# 尝试根据 SN 生成唯一 MAC 地址
|
||||
if [ -f "$EFUSE_SYSFS_PATH" ]; then
|
||||
sn_offset=$(grep --binary-files=text -boP "$SN_PREFIX" "$EFUSE_SYSFS_PATH" | head -n1 | cut -d: -f1)
|
||||
if [ -n "$sn_offset" ]; then
|
||||
sn=$(cat "$EFUSE_SYSFS_PATH" | dd bs=1 skip="$sn_offset" count="$SN_EXPECTED_LENGTH" 2>/dev/null)
|
||||
if [ ${#sn} -eq $SN_EXPECTED_LENGTH ]; then
|
||||
echo "S/N: $sn" >&2 # 输出到 stderr,避免干扰返回值
|
||||
# 使用 SN 的 SHA-256 哈希生成后 5 字节(避免多余管道)
|
||||
sn_hash=$(printf %s "$sn" | sha256sum | cut -d' ' -f1)
|
||||
# 直接用 Bash 子串获取哈希末 10 个字符并插入分隔符
|
||||
mac_hex=${sn_hash: -10}
|
||||
mac_suffix=$(printf "%s:%s:%s:%s:%s" "${mac_hex:0:2}" "${mac_hex:2:2}" "${mac_hex:4:2}" "${mac_hex:6:2}" "${mac_hex:8:2}")
|
||||
printf "02:%s\n" "$mac_suffix"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# 若 SN 获取失败,回退到随机逻辑
|
||||
echo "警告: 无法获取 SN,回退到随机 MAC 生成" >&2
|
||||
printf "02:%02x:%02x:%02x:%02x:%02x\n" \
|
||||
$((RANDOM % 256)) \
|
||||
$((RANDOM % 256)) \
|
||||
$((RANDOM % 256)) \
|
||||
$((RANDOM % 256)) \
|
||||
$((RANDOM % 256))
|
||||
}
|
||||
|
||||
echo "正在生成基于 SN 的 MAC 地址..."
|
||||
|
||||
# 生成新的MAC地址
|
||||
NEW_MAC=$(generate_random_mac)
|
||||
echo "生成的MAC地址: $NEW_MAC"
|
||||
|
||||
# 验证 MAC 地址格式
|
||||
if ! [[ $NEW_MAC =~ ^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$ ]]; then
|
||||
echo "错误: 生成的 MAC 地址格式无效: $NEW_MAC"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 备份原配置文件
|
||||
if [ -f "$NETWORK_CONFIG" ]; then
|
||||
cp "$NETWORK_CONFIG" "${NETWORK_CONFIG}.backup"
|
||||
fi
|
||||
|
||||
# 更新网络配置文件
|
||||
cat > "$NETWORK_CONFIG" << EOF
|
||||
[Match]
|
||||
Name=eth0
|
||||
|
||||
[Network]
|
||||
DHCP=yes
|
||||
|
||||
[Link]
|
||||
MACAddress=$NEW_MAC
|
||||
EOF
|
||||
|
||||
echo "已更新网络配置文件: $NETWORK_CONFIG"
|
||||
|
||||
# 创建锁定文件,防止重复执行
|
||||
mkdir -p "$(dirname "$LOCK_FILE")"
|
||||
echo "MAC地址生成时间: $(date)" > "$LOCK_FILE"
|
||||
|
||||
# 禁用此服务,确保只运行一次
|
||||
systemctl disable kvmd-generate-mac.service
|
||||
|
||||
echo "MAC地址生成完成: $NEW_MAC"
|
||||
echo "服务已自动禁用,下次开机不会再执行"
|
||||
|
||||
exit 0
|
||||
@ -1,34 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# KVMD首次运行初始化脚本
|
||||
# 在首次开机时执行KVMD服务启动前的必要初始化操作
|
||||
|
||||
set -e
|
||||
|
||||
LOCK_FILE="/var/lib/kvmd/.kvmd-firstrun-completed"
|
||||
|
||||
# 检查是否已经执行过
|
||||
[ -f "$LOCK_FILE" ] && { echo "[KVMD-FirstRun] 初始化已完成,跳过执行"; exit 0; }
|
||||
|
||||
echo "[KVMD-FirstRun] 开始KVMD首次运行初始化..."
|
||||
|
||||
# 1. 生成KVMD主证书
|
||||
echo "[KVMD-FirstRun] 生成KVMD主证书..."
|
||||
kvmd-gencert --do-the-thing
|
||||
|
||||
# 2. 生成VNC证书
|
||||
echo "[KVMD-FirstRun] 生成VNC证书..."
|
||||
kvmd-gencert --do-the-thing --vnc
|
||||
|
||||
# 3. 生成nginx配置文件
|
||||
echo "[KVMD-FirstRun] 生成nginx配置文件..."
|
||||
kvmd-nginx-mkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf || echo "[KVMD-FirstRun] 警告: nginx配置生成失败"
|
||||
|
||||
# 创建锁定文件
|
||||
mkdir -p "$(dirname "$LOCK_FILE")"
|
||||
echo "KVMD首次运行初始化完成 - $(date)" > "$LOCK_FILE"
|
||||
|
||||
# 禁用服务
|
||||
systemctl disable kvmd-firstrun.service || echo "[KVMD-FirstRun] 警告: 服务禁用失败"
|
||||
|
||||
echo "[KVMD-FirstRun] 初始化完成!"
|
||||
@ -1,26 +0,0 @@
|
||||
[Unit]
|
||||
Description=KVMD First Run Initialization (One-time)
|
||||
Documentation=https://github.com/your-repo/One-KVM
|
||||
Before=kvmd.service
|
||||
Before=kvmd-nginx.service
|
||||
Before=kvmd-otg.service
|
||||
Before=kvmd-vnc.service
|
||||
Before=kvmd-ipmi.service
|
||||
Before=kvmd-webterm.service
|
||||
Before=kvmd-janus.service
|
||||
Before=kvmd-media.service
|
||||
After=local-fs.target
|
||||
After=network.target
|
||||
Wants=local-fs.target
|
||||
ConditionPathExists=!/var/lib/kvmd/.kvmd-firstrun-completed
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/bin/kvmd-firstrun.sh
|
||||
RemainAfterExit=yes
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
TimeoutStartSec=300
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@ -1,18 +0,0 @@
|
||||
[Unit]
|
||||
Description=Generate Random MAC Address for OneCloud (One-time)
|
||||
Documentation=https://github.com/your-repo/One-KVM
|
||||
Before=systemd-networkd.service
|
||||
Before=network-pre.target
|
||||
Wants=network-pre.target
|
||||
After=local-fs.target
|
||||
ConditionPathExists=!/var/lib/kvmd/.mac-generated
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/local/bin/generate-random-mac.sh
|
||||
RemainAfterExit=yes
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@ -1,82 +0,0 @@
|
||||
#!/bin/bash
|
||||
# 本地代码质量检查脚本
|
||||
|
||||
set -e
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
echo "🔍 运行代码质量检查..."
|
||||
|
||||
# 检查参数,如果有参数则只运行指定的检查
|
||||
CHECK_TYPE="${1:-all}"
|
||||
|
||||
run_flake8() {
|
||||
echo "📝 运行 flake8 代码风格检查..."
|
||||
flake8 --config=testenv/linters/flake8.ini kvmd testenv/tests *.py
|
||||
}
|
||||
|
||||
run_pylint() {
|
||||
echo "🔎 运行 pylint 代码质量分析..."
|
||||
pylint -j0 --rcfile=testenv/linters/pylint.ini --output-format=colorized --reports=no kvmd testenv/tests *.py || true
|
||||
}
|
||||
|
||||
run_mypy() {
|
||||
echo "🔧 运行 mypy 类型检查..."
|
||||
mypy --config-file=testenv/linters/mypy.ini --cache-dir=testenv/.mypy_cache kvmd testenv/tests *.py || true
|
||||
}
|
||||
|
||||
run_vulture() {
|
||||
echo "💀 运行 vulture 死代码检测..."
|
||||
vulture --ignore-names=_format_P,Plugin --ignore-decorators=@exposed_http,@exposed_ws,@pytest.fixture kvmd testenv/tests *.py testenv/linters/vulture-wl.py || true
|
||||
}
|
||||
|
||||
run_eslint() {
|
||||
echo "📜 运行 eslint JavaScript检查..."
|
||||
if command -v eslint >/dev/null 2>&1; then
|
||||
eslint --cache-location=/tmp --config=testenv/linters/eslintrc.js --color web/share/js || true
|
||||
else
|
||||
echo "⚠️ eslint 未安装,跳过"
|
||||
fi
|
||||
}
|
||||
|
||||
run_htmlhint() {
|
||||
echo "📄 运行 htmlhint HTML检查..."
|
||||
if command -v htmlhint >/dev/null 2>&1; then
|
||||
htmlhint --config=testenv/linters/htmlhint.json web/*.html web/*/*.html || true
|
||||
else
|
||||
echo "⚠️ htmlhint 未安装,跳过"
|
||||
fi
|
||||
}
|
||||
|
||||
run_shellcheck() {
|
||||
echo "🐚 运行 shellcheck Shell脚本检查..."
|
||||
if command -v shellcheck >/dev/null 2>&1; then
|
||||
shellcheck --color=always kvmd.install scripts/* || true
|
||||
else
|
||||
echo "⚠️ shellcheck 未安装,跳过"
|
||||
fi
|
||||
}
|
||||
|
||||
case "$CHECK_TYPE" in
|
||||
flake8) run_flake8 ;;
|
||||
pylint) run_pylint ;;
|
||||
mypy) run_mypy ;;
|
||||
vulture) run_vulture ;;
|
||||
eslint) run_eslint ;;
|
||||
htmlhint) run_htmlhint ;;
|
||||
shellcheck) run_shellcheck ;;
|
||||
all)
|
||||
run_flake8
|
||||
run_pylint
|
||||
run_mypy
|
||||
run_vulture
|
||||
run_eslint
|
||||
run_htmlhint
|
||||
run_shellcheck
|
||||
;;
|
||||
*)
|
||||
echo "用法: $0 [flake8|pylint|mypy|vulture|eslint|htmlhint|shellcheck|all]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "✅ 代码质量检查完成!"
|
||||
@ -11,17 +11,19 @@ kvmd:
|
||||
|
||||
hid:
|
||||
type: otg
|
||||
mouse_alt:
|
||||
device: /dev/kvmd-hid-mouse-alt
|
||||
|
||||
atx:
|
||||
type: gpio
|
||||
type: disabled
|
||||
|
||||
msd:
|
||||
type: disabled
|
||||
type: otg
|
||||
|
||||
streamer:
|
||||
quality: 0
|
||||
resolution:
|
||||
default: 1920x1080
|
||||
default: 1280x720
|
||||
available:
|
||||
- 1920x1080
|
||||
- 1600x1200
|
||||
@ -42,6 +44,7 @@ kvmd:
|
||||
- "--resolution={resolution}"
|
||||
- "--desired-fps={desired_fps}"
|
||||
- "--drop-same-frames=30"
|
||||
- "--last-as-blank=0"
|
||||
- "--unix={unix}"
|
||||
- "--unix-rm"
|
||||
- "--unix-mode=0660"
|
||||
@ -49,8 +52,8 @@ kvmd:
|
||||
- "--process-name-prefix={process_name_prefix}"
|
||||
- "--notify-parent"
|
||||
- "--no-log-colors"
|
||||
- "--jpeg-sink=kvmd::ustreamer::jpeg"
|
||||
- "--jpeg-sink-mode=0660"
|
||||
- "--sink=kvmd::ustreamer::jpeg"
|
||||
- "--sink-mode=0660"
|
||||
|
||||
|
||||
vnc:
|
||||
58
config/override.yaml
Normal file
58
config/override.yaml
Normal file
@ -0,0 +1,58 @@
|
||||
####################################################################
|
||||
# #
|
||||
# Override Pi-KVM system settings. This file uses the YAML syntax. #
|
||||
# #
|
||||
# https://github.com/pikvm/pikvm/blob/master/pages/config.md #
|
||||
# #
|
||||
# All overridden parameters will be applied AFTER other configs #
|
||||
# and "!include" directives and BEFORE validation. #
|
||||
# Not: Sections should be combined under shared keys. #
|
||||
# #
|
||||
####################################################################
|
||||
vnc:
|
||||
# See https://github.com/pikvm/pikvm/blob/master/pages/vnc.md
|
||||
keymap: /usr/share/kvmd/keymaps/ru # Set russian keymap
|
||||
auth:
|
||||
vncauth:
|
||||
enabled: true # Enable auth via /etc/kvmd/vncpasswd
|
||||
kvmd:
|
||||
msd:
|
||||
type: disabled
|
||||
gpio:
|
||||
drivers:
|
||||
wol_server1:
|
||||
type: wol
|
||||
mac: 2c:56:dc:db:7c:1e
|
||||
short_press:
|
||||
type: cmd
|
||||
cmd: [/usr/bin/sudo, short_press_gpio420]
|
||||
long_press:
|
||||
type: cmd
|
||||
cmd: [/usr/bin/sudo, long_press_gpio420]
|
||||
scheme:
|
||||
wol_server1:
|
||||
driver: wol_server1
|
||||
pin: 0
|
||||
mode: output
|
||||
switch: false
|
||||
short_button:
|
||||
driver: short_press
|
||||
pin: 0
|
||||
mode: output
|
||||
switch: false
|
||||
long_button:
|
||||
driver: long_press
|
||||
pin: 0
|
||||
mode: output
|
||||
switch: false
|
||||
view:
|
||||
header:
|
||||
title: ATX
|
||||
table:
|
||||
- ["#电源管理"]
|
||||
- []
|
||||
- ["#短按(开/关机):", short_button|按下]
|
||||
- ["#长按(强制关机):", long_button|按下]
|
||||
- []
|
||||
- ["#网络唤醒"]
|
||||
- ["#被控机设备", wol_server1|网络唤醒]
|
||||
@ -1 +0,0 @@
|
||||
Docker
|
||||
@ -1 +0,0 @@
|
||||
docker1000000000
|
||||
@ -1,18 +0,0 @@
|
||||
general: {
|
||||
debug_level = 4
|
||||
}
|
||||
nat: {
|
||||
nice_debug = false
|
||||
ignore_mdns = true
|
||||
}
|
||||
media: {
|
||||
ipv6 = true
|
||||
ipv6_linklocal = true
|
||||
min_nack_queue = 2000
|
||||
rtp_port_range = "20000-40000"
|
||||
no_media_timer = 0
|
||||
slowlink_threshold = 10
|
||||
twcc_period = 100
|
||||
dtls_timeout = 1000
|
||||
nack_optimizations = true
|
||||
}
|
||||
@ -1,7 +0,0 @@
|
||||
video: {
|
||||
sink = "kvmd::ustreamer::h264"
|
||||
}
|
||||
acap: {
|
||||
device = "hw:0,0"
|
||||
tc358743 = "/dev/video0"
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
general: {
|
||||
ws = true
|
||||
ws_unix = "/run/kvmd/janus-ws.sock"
|
||||
}
|
||||
@ -1,46 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ========================================================================== #
|
||||
# #
|
||||
# KVMD - The main PiKVM daemon. #
|
||||
# #
|
||||
# Copyright (C) 2023-2025 SilentWind <mofeng654321@hotmail.com> #
|
||||
# #
|
||||
# This program is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||
# #
|
||||
# ========================================================================== #
|
||||
|
||||
if [ -e /etc/update-motd.d/10-armbian-header ]; then /etc/update-motd.d/10-armbian-header; fi
|
||||
if [ -e /etc/update-motd.d/30-armbian-sysinfo ]; then /etc/update-motd.d/30-armbian-sysinfo; fi
|
||||
if [ -e /etc/update-motd.d/41-armbian-config ]; then /etc/update-motd.d/41-armbian-config; fi
|
||||
|
||||
printf "
|
||||
|
||||
██████╗ ███╗ ██╗███████╗ ██╗ ██╗██╗ ██╗███╗ ███╗
|
||||
██╔═══██╗████╗ ██║██╔════╝ ██║ ██╔╝██║ ██║████╗ ████║
|
||||
██║ ██║██╔██╗ ██║█████╗█████╗█████╔╝ ██║ ██║██╔████╔██║
|
||||
██║ ██║██║╚██╗██║██╔══╝╚════╝██╔═██╗ ╚██╗ ██╔╝██║╚██╔╝██║
|
||||
╚██████╔╝██║ ╚████║███████╗ ██║ ██╗ ╚████╔╝ ██║ ╚═╝ ██║
|
||||
╚═════╝ ╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝
|
||||
|
||||
____________________________________________________________________________
|
||||
|
||||
项目链接:
|
||||
* One-KVM:https://github.com/mofeng-git/One-KVM
|
||||
|
||||
文档链接:
|
||||
* One-KVM:https://one-kvm.mofeng.run
|
||||
|
||||
____________________________________________________________________________
|
||||
|
||||
"
|
||||
@ -1,35 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ========================================================================== #
|
||||
# #
|
||||
# KVMD - The main PiKVM daemon. #
|
||||
# #
|
||||
# Copyright (C) 2023-2025 SilentWind <mofeng654321@hotmail.com> #
|
||||
# #
|
||||
# This program is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||
# #
|
||||
# ========================================================================== #
|
||||
|
||||
ATX=USBRELAY_HID
|
||||
echo $ATX
|
||||
case $ATX in
|
||||
GPIO)
|
||||
sudo /etc/kvmd/custom_atx/gpio.sh $1
|
||||
;;
|
||||
USBRELAY_HID)
|
||||
sudo /etc/kvmd/custom_atx/usbrelay_hid.sh $1
|
||||
;;
|
||||
*)
|
||||
echo "No thing."
|
||||
exit -1
|
||||
esac
|
||||
@ -1 +0,0 @@
|
||||
{}
|
||||
@ -1,43 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ========================================================================== #
|
||||
# #
|
||||
# KVMD - The main PiKVM daemon. #
|
||||
# #
|
||||
# Copyright (C) 2023-2025 SilentWind <mofeng654321@hotmail.com> #
|
||||
# #
|
||||
# This program is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||
# #
|
||||
# ========================================================================== #
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
cleanup() {
|
||||
if [ "$OTG" == "1" ]; then
|
||||
echo "Trying exit OTG Port..." \
|
||||
&& python -m kvmd.apps.otg stop \
|
||||
|| echo -e "${RED}Failed to exit OTG Port${NC}"
|
||||
rm -r /run/kvmd/otg
|
||||
fi
|
||||
exit 0
|
||||
}
|
||||
|
||||
trap cleanup SIGTERM
|
||||
|
||||
while true; do
|
||||
sleep 3600
|
||||
done
|
||||
@ -1,37 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ========================================================================== #
|
||||
# #
|
||||
# KVMD - The main PiKVM daemon. #
|
||||
# #
|
||||
# Copyright (C) 2023-2025 SilentWind <mofeng654321@hotmail.com> #
|
||||
# #
|
||||
# This program is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||
# #
|
||||
# ========================================================================== #
|
||||
case $1 in
|
||||
short)
|
||||
gpioset -m time -s 1 SHUTDOWNPIN=0
|
||||
gpioset SHUTDOWNPIN=1
|
||||
;;
|
||||
long)
|
||||
gpioset -m time -s 5 SHUTDOWNPIN=0
|
||||
gpioset SHUTDOWNPIN=1
|
||||
;;
|
||||
reset)
|
||||
gpioset -m time -s 1 REBOOTPIN=0
|
||||
gpioset REBOOTPIN=1
|
||||
;;
|
||||
*)
|
||||
echo "No thing."
|
||||
esac
|
||||
@ -1,73 +0,0 @@
|
||||
# ========================================================================== #
|
||||
# #
|
||||
# KVMD - The main PiKVM daemon. #
|
||||
# #
|
||||
# Copyright (C) 2023-2025 SilentWind <mofeng654321@hotmail.com> #
|
||||
# #
|
||||
# This program is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||
# #
|
||||
# ========================================================================== #
|
||||
|
||||
import sys
|
||||
import hid
|
||||
|
||||
VENDOR_ID = 0x5131
|
||||
PRODUCT_ID = 0x2007
|
||||
|
||||
def find_usbrelay():
|
||||
for device in hid.enumerate():
|
||||
if device.get("vendor_id") == VENDOR_ID and device.get("product_id") == PRODUCT_ID:
|
||||
return device
|
||||
return None
|
||||
|
||||
def send_command(device_info, channel, onoff):
|
||||
device = hid.device()
|
||||
device.open(device_info['vendor_id'], device_info['product_id'])
|
||||
if device is None:
|
||||
print("Failed to open device.")
|
||||
return
|
||||
|
||||
try:
|
||||
cmd = [0xA0, channel, onoff, 0xA0 + channel + onoff]
|
||||
device.write(bytearray(cmd))
|
||||
finally:
|
||||
device.close()
|
||||
|
||||
def main():
|
||||
if len(sys.argv) != 3:
|
||||
print("Usage:\n"
|
||||
"\tpython script.py id on|off")
|
||||
return
|
||||
|
||||
try:
|
||||
id = int(sys.argv[1])
|
||||
if sys.argv[2].lower() == 'on':
|
||||
onoff = 1
|
||||
elif sys.argv[2].lower() == 'off':
|
||||
onoff = 0
|
||||
else:
|
||||
raise ValueError
|
||||
except ValueError:
|
||||
print("Invalid command, use 'on' or 'off'")
|
||||
return
|
||||
|
||||
device_info = find_usbrelay()
|
||||
if device_info is None:
|
||||
print("USB relay not found")
|
||||
else:
|
||||
send_command(device_info, id, onoff)
|
||||
print(f"Sent command to channel {id}: {'ON' if onoff else 'OFF'}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -1,40 +0,0 @@
|
||||
#!/bin/bash
|
||||
# ========================================================================== #
|
||||
# #
|
||||
# KVMD - The main PiKVM daemon. #
|
||||
# #
|
||||
# Copyright (C) 2023-2025 SilentWind <mofeng654321@hotmail.com> #
|
||||
# #
|
||||
# This program is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||
# #
|
||||
# ========================================================================== #
|
||||
case $1 in
|
||||
short)
|
||||
python3 /etc/kvmd/custom_atx/usbrelay_hid.py 1 on
|
||||
sleep 1
|
||||
python3 /etc/kvmd/custom_atx/usbrelay_hid.py 1 off
|
||||
;;
|
||||
long)
|
||||
python3 /etc/kvmd/custom_atx/usbrelay_hid.py 1 on
|
||||
sleep 5
|
||||
python3 /etc/kvmd/custom_atx/usbrelay_hid.py 1 off
|
||||
;;
|
||||
reset)
|
||||
python3 /etc/kvmd/custom_atx/usbrelay_hid.py 2 on
|
||||
sleep 1
|
||||
python3 /etc/kvmd/custom_atx/usbrelay_hid.py 2 off
|
||||
;;
|
||||
*)
|
||||
echo "No thing."
|
||||
esac
|
||||
@ -1 +0,0 @@
|
||||
admin:{SSHA512}3zSmw/L9zIkpQdX5bcy6HntTxltAzTuGNP6NjHRRgOcNZkA0K+Lsrj3QplO9Gr3BA5MYVVki9rAVnFNCcIdtYC6FkLJWCmHs
|
||||
@ -1,11 +0,0 @@
|
||||
# This file describes the credentials for IPMI users in format "login:password",
|
||||
# one per line. The passwords are NOT encrypted.
|
||||
#
|
||||
# WARNING! IPMI protocol is completely unsafe by design. In short, the authentication
|
||||
# process for IPMI 2.0 mandates that the server send a salted SHA1 or MD5 hash of the
|
||||
# requested user's password to the client, prior to the client authenticating.
|
||||
#
|
||||
# NEVER use the same passwords for KVMD and IPMI users.
|
||||
# This default configuration is shown here just for the example only.
|
||||
|
||||
admin:admin
|
||||
@ -1,32 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Written by @srepac FILENAME: input.sh
|
||||
# Input switcher script for use with KVM switches that use CTRL+CTRL+#
|
||||
# ... pass in # into the script
|
||||
#
|
||||
usage() {
|
||||
echo "usage: $0 <#> <pikvm-name-or-ip> where # is the input number on the KVM switch"
|
||||
exit 1
|
||||
}
|
||||
password=admin
|
||||
|
||||
#HOTKEY="ScrollLock"
|
||||
HOTKEY="ControlLeft"
|
||||
|
||||
if [[ "$1" == "" ]]; then
|
||||
usage
|
||||
else
|
||||
NUM="$1"
|
||||
fi
|
||||
|
||||
if [[ "$2" == "" ]]; then
|
||||
IP="localhost"
|
||||
else
|
||||
IP="$2"
|
||||
fi
|
||||
|
||||
OSD=$( echo $HOTKEY | sed -e 's/ControlLeft/CTRL/g' )
|
||||
echo "Sending $OSD + $OSD + $NUM to $IP"
|
||||
|
||||
curl -X POST -k -u admin:$password "https://$IP/api/hid/events/send_key?key=$HOTKEY" 2> /dev/null
|
||||
curl -X POST -k -u admin:$password "https://$IP/api/hid/events/send_key?key=$HOTKEY" 2> /dev/null
|
||||
curl -X POST -k -u admin:$password "https://$IP/api/hid/events/send_key?key=Digit${NUM}" 2> /dev/null
|
||||
@ -1,20 +0,0 @@
|
||||
version: 1
|
||||
disable_existing_loggers: false
|
||||
|
||||
formatters:
|
||||
console:
|
||||
(): logging.Formatter
|
||||
style: "{"
|
||||
format: "{name:30.30} {levelname:>7} --- {message}"
|
||||
|
||||
handlers:
|
||||
console:
|
||||
level: DEBUG
|
||||
class: logging.StreamHandler
|
||||
stream: ext://sys.stderr
|
||||
formatter: console
|
||||
|
||||
root:
|
||||
level: INFO
|
||||
handlers:
|
||||
- console
|
||||
@ -1,97 +0,0 @@
|
||||
# Don't touch this file otherwise your device may stop working.
|
||||
# Use override.yaml to modify required settings.
|
||||
# You can find a working configuration in /usr/share/kvmd/configs.default/kvmd.
|
||||
|
||||
override: !include [override.d, override.yaml]
|
||||
|
||||
logging: !include logging.yaml
|
||||
|
||||
kvmd:
|
||||
auth: !include auth.yaml
|
||||
|
||||
info:
|
||||
hw:
|
||||
ignore_past: true
|
||||
fan:
|
||||
unix: /run/kvmd/fan.sock
|
||||
|
||||
hid:
|
||||
type: otg
|
||||
|
||||
atx:
|
||||
type: gpio
|
||||
power_led_pin: 4
|
||||
hdd_led_pin: 5
|
||||
power_switch_pin: 23
|
||||
reset_switch_pin: 27
|
||||
|
||||
msd:
|
||||
type: otg
|
||||
|
||||
streamer:
|
||||
h264_bitrate:
|
||||
default: 5000
|
||||
cmd:
|
||||
- "/usr/bin/ustreamer"
|
||||
- "--device=/dev/kvmd-video"
|
||||
- "--persistent"
|
||||
- "--dv-timings"
|
||||
- "--format=uyvy"
|
||||
- "--buffers=6"
|
||||
- "--encoder=m2m-image"
|
||||
- "--workers=3"
|
||||
- "--quality={quality}"
|
||||
- "--desired-fps={desired_fps}"
|
||||
- "--drop-same-frames=30"
|
||||
- "--unix={unix}"
|
||||
- "--unix-rm"
|
||||
- "--unix-mode=0660"
|
||||
- "--exit-on-parent-death"
|
||||
- "--process-name-prefix={process_name_prefix}"
|
||||
- "--notify-parent"
|
||||
- "--no-log-colors"
|
||||
- "--jpeg-sink=kvmd::ustreamer::jpeg"
|
||||
- "--jpeg-sink-mode=0660"
|
||||
- "--h264-sink=kvmd::ustreamer::h264"
|
||||
- "--h264-sink-mode=0660"
|
||||
- "--h264-bitrate={h264_bitrate}"
|
||||
- "--h264-gop={h264_gop}"
|
||||
|
||||
gpio:
|
||||
drivers:
|
||||
__v4_locator__:
|
||||
type: locator
|
||||
|
||||
scheme:
|
||||
__v3_usb_breaker__:
|
||||
pin: 22
|
||||
mode: output
|
||||
initial: true
|
||||
pulse: false
|
||||
|
||||
__v4_locator__:
|
||||
driver: __v4_locator__
|
||||
pin: 12
|
||||
mode: output
|
||||
pulse: false
|
||||
|
||||
__v4_const1__:
|
||||
pin: 6
|
||||
mode: output
|
||||
initial: false
|
||||
switch: false
|
||||
pulse: false
|
||||
|
||||
|
||||
media:
|
||||
memsink:
|
||||
h264:
|
||||
sink: "kvmd::ustreamer::h264"
|
||||
|
||||
|
||||
vnc:
|
||||
memsink:
|
||||
jpeg:
|
||||
sink: "kvmd::ustreamer::jpeg"
|
||||
h264:
|
||||
sink: "kvmd::ustreamer::h264"
|
||||
@ -1,98 +0,0 @@
|
||||
# Don't touch this file otherwise your device may stop working.
|
||||
# Use override.yaml to modify required settings.
|
||||
# You can find a working configuration in /usr/share/kvmd/configs.default/kvmd.
|
||||
|
||||
override: !include [override.d, override.yaml]
|
||||
|
||||
logging: !include logging.yaml
|
||||
|
||||
kvmd:
|
||||
auth: !include auth.yaml
|
||||
|
||||
info:
|
||||
hw:
|
||||
ignore_past: true
|
||||
fan:
|
||||
unix: /run/kvmd/fan.sock
|
||||
|
||||
hid:
|
||||
type: otg
|
||||
|
||||
atx:
|
||||
type: gpio
|
||||
power_led_pin: 4
|
||||
hdd_led_pin: 5
|
||||
power_switch_pin: 23
|
||||
reset_switch_pin: 27
|
||||
|
||||
msd:
|
||||
type: otg
|
||||
|
||||
streamer:
|
||||
h264_bitrate:
|
||||
default: 5000
|
||||
cmd:
|
||||
- "/usr/bin/ustreamer"
|
||||
- "--device=/dev/kvmd-video"
|
||||
- "--persistent"
|
||||
- "--dv-timings"
|
||||
- "--format=uyvy"
|
||||
- "--format-swap-rgb"
|
||||
- "--buffers=8"
|
||||
- "--encoder=m2m-image"
|
||||
- "--workers=3"
|
||||
- "--quality={quality}"
|
||||
- "--desired-fps={desired_fps}"
|
||||
- "--drop-same-frames=30"
|
||||
- "--unix={unix}"
|
||||
- "--unix-rm"
|
||||
- "--unix-mode=0660"
|
||||
- "--exit-on-parent-death"
|
||||
- "--process-name-prefix={process_name_prefix}"
|
||||
- "--notify-parent"
|
||||
- "--no-log-colors"
|
||||
- "--jpeg-sink=kvmd::ustreamer::jpeg"
|
||||
- "--jpeg-sink-mode=0660"
|
||||
- "--h264-sink=kvmd::ustreamer::h264"
|
||||
- "--h264-sink-mode=0660"
|
||||
- "--h264-bitrate={h264_bitrate}"
|
||||
- "--h264-gop={h264_gop}"
|
||||
|
||||
gpio:
|
||||
drivers:
|
||||
__v4_locator__:
|
||||
type: locator
|
||||
|
||||
scheme:
|
||||
__v3_usb_breaker__:
|
||||
pin: 22
|
||||
mode: output
|
||||
initial: true
|
||||
pulse: false
|
||||
|
||||
__v4_locator__:
|
||||
driver: __v4_locator__
|
||||
pin: 12
|
||||
mode: output
|
||||
pulse: false
|
||||
|
||||
__v4_const1__:
|
||||
pin: 6
|
||||
mode: output
|
||||
initial: false
|
||||
switch: false
|
||||
pulse: false
|
||||
|
||||
|
||||
media:
|
||||
memsink:
|
||||
h264:
|
||||
sink: "kvmd::ustreamer::h264"
|
||||
|
||||
|
||||
vnc:
|
||||
memsink:
|
||||
jpeg:
|
||||
sink: "kvmd::ustreamer::jpeg"
|
||||
h264:
|
||||
sink: "kvmd::ustreamer::h264"
|
||||
@ -1,14 +0,0 @@
|
||||
# You can write down any information and it will be available
|
||||
# at the address /api/info (if you use default nginx config).
|
||||
# If server.host (str) will be defined then this value
|
||||
# will be displayed in the web interface.
|
||||
|
||||
server:
|
||||
host: "@auto"
|
||||
|
||||
kvm: {
|
||||
base_on: "PiKVM",
|
||||
app_name: "One-KVM",
|
||||
main_version: "241204",
|
||||
author: "SilentWind"
|
||||
}
|
||||
@ -1,175 +0,0 @@
|
||||
kvmd:
|
||||
auth:
|
||||
enabled: true
|
||||
|
||||
atx:
|
||||
type: disabled
|
||||
|
||||
hid:
|
||||
type: ch9329
|
||||
device: /dev/ttyUSB0
|
||||
speed: 9600
|
||||
read_timeout: 0.3
|
||||
|
||||
jiggler:
|
||||
active: false
|
||||
enabled: true
|
||||
|
||||
mouse_alt:
|
||||
device: /dev/kvmd-hid-mouse-alt
|
||||
|
||||
msd:
|
||||
#type: otg
|
||||
remount_cmd: /bin/true
|
||||
msd_path: /var/lib/kvmd/msd
|
||||
normalfiles_path: NormalFiles
|
||||
normalfiles_size: 256
|
||||
|
||||
ocr:
|
||||
langs:
|
||||
- eng
|
||||
- chi_sim
|
||||
|
||||
streamer:
|
||||
resolution:
|
||||
default: 1920x1080
|
||||
|
||||
forever: true
|
||||
|
||||
desired_fps:
|
||||
default: 60
|
||||
max: 60
|
||||
|
||||
h264_bitrate:
|
||||
default: 8000
|
||||
|
||||
cmd:
|
||||
- "/usr/bin/ustreamer"
|
||||
- "--device=/dev/video0"
|
||||
- "--persistent"
|
||||
- "--format=mjpeg"
|
||||
- "--encoder=FFMPEG-VIDEO"
|
||||
- "--resolution={resolution}"
|
||||
- "--desired-fps={desired_fps}"
|
||||
- "--drop-same-frames=30"
|
||||
- "--last-as-blank=0"
|
||||
- "--unix={unix}"
|
||||
- "--unix-rm"
|
||||
- "--unix-mode=0666"
|
||||
- "--exit-on-parent-death"
|
||||
- "--process-name-prefix={process_name_prefix}"
|
||||
- "--notify-parent"
|
||||
- "--no-log-colors"
|
||||
- "--h264-sink=kvmd::ustreamer::h264"
|
||||
- "--h264-sink-mode=0660"
|
||||
- "--jpeg-sink=kvmd::ustreamer::jpeg"
|
||||
- "--jpeg-sink-mode=0660"
|
||||
- "--h264-bitrate={h264_bitrate}"
|
||||
- "--h264-gop={h264_gop}"
|
||||
- "--h264-hwenc=disabled"
|
||||
- "--slowdown"
|
||||
gpio:
|
||||
drivers:
|
||||
wol_server1:
|
||||
type: wol
|
||||
mac: 2c:56:dc:db:7c:1e
|
||||
short_press:
|
||||
type: cmd
|
||||
cmd: [/etc/kvmd/atx.sh, short]
|
||||
long_press:
|
||||
type: cmd
|
||||
cmd: [/etc/kvmd/atx.sh, long]
|
||||
reset_press:
|
||||
type: cmd
|
||||
cmd: [/etc/kvmd/atx.sh, reset]
|
||||
input1:
|
||||
type: cmd
|
||||
cmd: [/etc/kvmd/kvm_input.sh, 1]
|
||||
input2:
|
||||
type: cmd
|
||||
cmd: [/etc/kvmd/kvm_input.sh, 2]
|
||||
scheme:
|
||||
wol_server1:
|
||||
driver: wol_server1
|
||||
pin: 0
|
||||
mode: output
|
||||
switch: false
|
||||
short_button:
|
||||
driver: short_press
|
||||
pin: 0
|
||||
mode: output
|
||||
switch: false
|
||||
long_button:
|
||||
driver: long_press
|
||||
pin: 0
|
||||
mode: output
|
||||
switch: false
|
||||
reset_button:
|
||||
driver: reset_press
|
||||
pin: 0
|
||||
mode: output
|
||||
switch: false
|
||||
input1-button:
|
||||
driver: input1
|
||||
pin: 0
|
||||
mode: output
|
||||
switch: false
|
||||
input2-button:
|
||||
driver: input2
|
||||
pin: 0
|
||||
mode: output
|
||||
switch: false
|
||||
view:
|
||||
header:
|
||||
title: 高级功能
|
||||
table:
|
||||
- ["#电源管理"]
|
||||
- ["#短按(开/关机):", short_button|按下]
|
||||
- ["#长按(强制关机):", long_button|按下]
|
||||
- ["#重启:", reset_button|按下]
|
||||
- []
|
||||
- ["#网络唤醒"]
|
||||
- ["#被控机设备", wol_server1|网络唤醒]
|
||||
- []
|
||||
- ["#KVM 切换"]
|
||||
- ["#HDMI 1", input1-button|切换]
|
||||
- ["#HDMI 2", input2-button|切换]
|
||||
|
||||
|
||||
vnc:
|
||||
keymap: /usr/share/kvmd/keymaps/en-us
|
||||
mouse_output: usb
|
||||
|
||||
auth:
|
||||
vncauth:
|
||||
enabled: true
|
||||
|
||||
memsink:
|
||||
jpeg:
|
||||
sink: "kvmd::ustreamer::jpeg"
|
||||
h264:
|
||||
sink: "kvmd::ustreamer::h264"
|
||||
|
||||
media:
|
||||
memsink:
|
||||
h264:
|
||||
sink: 'kvmd::ustreamer::h264'
|
||||
|
||||
jpeg:
|
||||
sink: 'kvmd::ustreamer::jpeg'
|
||||
|
||||
otgnet:
|
||||
commands:
|
||||
post_start_cmd:
|
||||
- "/bin/true"
|
||||
pre_stop_cmd:
|
||||
- "/bin/true"
|
||||
sysctl_cmd:
|
||||
#- "/usr/sbin/sysctl"
|
||||
- "/bin/true"
|
||||
|
||||
nginx:
|
||||
http:
|
||||
port: 8080
|
||||
https:
|
||||
port: 4430
|
||||
@ -1,65 +0,0 @@
|
||||
[unix_http_server]
|
||||
file=/tmp/supervisor.sock
|
||||
|
||||
[supervisord]
|
||||
nodaemon=true
|
||||
user=root
|
||||
|
||||
[rpcinterface:supervisor]
|
||||
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
|
||||
|
||||
[supervisorctl]
|
||||
serverurl=unix:///tmp/supervisor.sock
|
||||
|
||||
[program:kvmd]
|
||||
command=python -m kvmd.apps.kvmd --run
|
||||
directory=/
|
||||
autostart=true
|
||||
autorestart=true
|
||||
priority=10
|
||||
stopasgroup=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes = 0
|
||||
redirect_stderr=true
|
||||
|
||||
[program:kvmd-janus]
|
||||
command=python -m kvmd.apps.janus --run
|
||||
autostart=true
|
||||
autorestart=true
|
||||
priority=13
|
||||
stopasgroup=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes = 0
|
||||
redirect_stderr=true
|
||||
|
||||
[program:kvmd-media]
|
||||
command=python -m kvmd.apps.media --run
|
||||
autostart=true
|
||||
autorestart=true
|
||||
priority=13
|
||||
stopasgroup=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes = 0
|
||||
redirect_stderr=true
|
||||
|
||||
[program:kvmd-nginx]
|
||||
command=nginx -c /etc/kvmd/nginx/nginx.conf -g 'daemon off;user root; error_log stderr;'
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startsecs=10
|
||||
priority=100
|
||||
stopasgroup=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes = 0
|
||||
redirect_stderr=true
|
||||
|
||||
[program:clean_when_exit]
|
||||
command=/etc/kvmd/clean_when_exit.sh
|
||||
autostart=true
|
||||
autorestart=true
|
||||
startsecs=10
|
||||
priority=200
|
||||
stopasgroup=true
|
||||
stdout_logfile=/dev/stdout
|
||||
stdout_logfile_maxbytes = 0
|
||||
redirect_stderr=true
|
||||
@ -1,9 +0,0 @@
|
||||
# This file contains passwords for the legacy VNCAuth, one per line.
|
||||
# The passwords are NOT encrypted.
|
||||
#
|
||||
# WARNING! The VNCAuth method is NOT secure and should not be used at all.
|
||||
# But we support it for compatibility with some clients.
|
||||
#
|
||||
# NEVER use the same passwords for KVMD, IPMI and VNCAuth users.
|
||||
|
||||
admin -> admin:admin
|
||||
@ -1 +0,0 @@
|
||||
/* Here you can customize the Web UI */
|
||||
@ -1,5 +0,0 @@
|
||||
location /.well-known/acme-challenge {
|
||||
root /run/kvmd-certbot/webroot;
|
||||
include /etc/kvmd/nginx/loc-nocache.conf;
|
||||
auth_request off;
|
||||
}
|
||||
@ -1,7 +0,0 @@
|
||||
upstream kvmd {
|
||||
server unix:/run/kvmd/kvmd.sock fail_timeout=0s max_fails=0;
|
||||
}
|
||||
|
||||
upstream ustreamer {
|
||||
server unix:/run/kvmd/ustreamer.sock fail_timeout=0s max_fails=0;
|
||||
}
|
||||
@ -1,133 +0,0 @@
|
||||
absolute_redirect off;
|
||||
|
||||
index index.html;
|
||||
|
||||
auth_request /auth_check;
|
||||
|
||||
location = /auth_check {
|
||||
internal;
|
||||
proxy_pass http://kvmd/auth/check;
|
||||
proxy_pass_request_body off;
|
||||
proxy_set_header Content-Length "";
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location / {
|
||||
root /usr/share/kvmd/web;
|
||||
include /etc/kvmd/nginx/loc-login.conf;
|
||||
include /etc/kvmd/nginx/loc-nocache.conf;
|
||||
}
|
||||
|
||||
location @login {
|
||||
return 302 /login;
|
||||
}
|
||||
|
||||
location /login {
|
||||
root /usr/share/kvmd/web;
|
||||
include /etc/kvmd/nginx/loc-nocache.conf;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location /share {
|
||||
root /usr/share/kvmd/web;
|
||||
include /etc/kvmd/nginx/loc-nocache.conf;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location = /share/css/user.css {
|
||||
alias /etc/kvmd/web.css;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location = /favicon.ico {
|
||||
alias /usr/share/kvmd/web/favicon.ico;
|
||||
include /etc/kvmd/nginx/loc-nocache.conf;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location = /robots.txt {
|
||||
alias /usr/share/kvmd/web/robots.txt;
|
||||
include /etc/kvmd/nginx/loc-nocache.conf;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location /api/ws {
|
||||
rewrite ^/api/ws$ /ws break;
|
||||
rewrite ^/api/ws\?(.*)$ /ws?$1 break;
|
||||
proxy_pass http://kvmd;
|
||||
include /etc/kvmd/nginx/loc-proxy.conf;
|
||||
include /etc/kvmd/nginx/loc-websocket.conf;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location /api/hid/print {
|
||||
rewrite ^/api/hid/print$ /hid/print break;
|
||||
rewrite ^/api/hid/print\?(.*)$ /hid/print?$1 break;
|
||||
proxy_pass http://kvmd;
|
||||
include /etc/kvmd/nginx/loc-proxy.conf;
|
||||
include /etc/kvmd/nginx/loc-bigpost.conf;
|
||||
proxy_read_timeout 7d;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location /api/msd/read {
|
||||
rewrite ^/api/msd/read$ /msd/read break;
|
||||
rewrite ^/api/msd/read\?(.*)$ /msd/read?$1 break;
|
||||
proxy_pass http://kvmd;
|
||||
include /etc/kvmd/nginx/loc-proxy.conf;
|
||||
include /etc/kvmd/nginx/loc-nobuffering.conf;
|
||||
proxy_read_timeout 7d;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location /api/msd/write_remote {
|
||||
rewrite ^/api/msd/write_remote$ /msd/write_remote break;
|
||||
rewrite ^/api/msd/write_remote\?(.*)$ /msd/write_remote?$1 break;
|
||||
proxy_pass http://kvmd;
|
||||
include /etc/kvmd/nginx/loc-proxy.conf;
|
||||
include /etc/kvmd/nginx/loc-nobuffering.conf;
|
||||
proxy_read_timeout 7d;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location /api/msd/write {
|
||||
rewrite ^/api/msd/write$ /msd/write break;
|
||||
rewrite ^/api/msd/write\?(.*)$ /msd/write?$1 break;
|
||||
proxy_pass http://kvmd;
|
||||
include /etc/kvmd/nginx/loc-proxy.conf;
|
||||
include /etc/kvmd/nginx/loc-bigpost.conf;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location /api/log {
|
||||
rewrite ^/api/log$ /log break;
|
||||
rewrite ^/api/log\?(.*)$ /log?$1 break;
|
||||
proxy_pass http://kvmd;
|
||||
include /etc/kvmd/nginx/loc-proxy.conf;
|
||||
include /etc/kvmd/nginx/loc-nobuffering.conf;
|
||||
proxy_read_timeout 7d;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location /api {
|
||||
rewrite ^/api$ / break;
|
||||
rewrite ^/api/(.*)$ /$1 break;
|
||||
proxy_pass http://kvmd;
|
||||
include /etc/kvmd/nginx/loc-proxy.conf;
|
||||
auth_request off;
|
||||
}
|
||||
|
||||
location /streamer {
|
||||
rewrite ^/streamer$ / break;
|
||||
rewrite ^/streamer\?(.*)$ ?$1 break;
|
||||
rewrite ^/streamer/(.*)$ /$1 break;
|
||||
proxy_pass http://ustreamer;
|
||||
include /etc/kvmd/nginx/loc-proxy.conf;
|
||||
include /etc/kvmd/nginx/loc-nobuffering.conf;
|
||||
}
|
||||
|
||||
location /redfish {
|
||||
proxy_pass http://kvmd;
|
||||
include /etc/kvmd/nginx/loc-proxy.conf;
|
||||
auth_request off;
|
||||
}
|
||||
@ -1,2 +0,0 @@
|
||||
client_max_body_size 0;
|
||||
proxy_request_buffering off;
|
||||
@ -1,2 +0,0 @@
|
||||
error_page 401 = @login;
|
||||
error_page 403 = @login;
|
||||
@ -1,3 +0,0 @@
|
||||
postpone_output 0;
|
||||
proxy_buffering off;
|
||||
proxy_ignore_headers X-Accel-Buffering;
|
||||
@ -1,2 +0,0 @@
|
||||
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, pre-check=0, post-check=0, max-age=0";
|
||||
expires -1;
|
||||
@ -1,6 +0,0 @@
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Scheme $scheme;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Port $server_port;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
@ -1,5 +0,0 @@
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_connect_timeout 7d;
|
||||
proxy_send_timeout 7d;
|
||||
proxy_read_timeout 7d;
|
||||
@ -1,912 +0,0 @@
|
||||
types {
|
||||
application/A2L a2l;
|
||||
application/AML aml;
|
||||
application/andrew-inset ez;
|
||||
application/ATF atf;
|
||||
application/ATFX atfx;
|
||||
application/ATXML atxml;
|
||||
application/atom+xml atom;
|
||||
application/atomcat+xml atomcat;
|
||||
application/atomdeleted+xml atomdeleted;
|
||||
application/atomsvc+xml atomsvc;
|
||||
application/auth-policy+xml apxml;
|
||||
application/bacnet-xdd+zip xdd;
|
||||
application/calendar+xml xcs;
|
||||
application/cbor cbor;
|
||||
application/cccex c3ex;
|
||||
application/ccmp+xml ccmp;
|
||||
application/ccxml+xml ccxml;
|
||||
application/CDFX+XML cdfx;
|
||||
application/cdmi-capability cdmia;
|
||||
application/cdmi-container cdmic;
|
||||
application/cdmi-domain cdmid;
|
||||
application/cdmi-object cdmio;
|
||||
application/cdmi-queue cdmiq;
|
||||
application/CEA cea;
|
||||
application/cellml+xml cellml cml;
|
||||
application/clue_info+xml clue;
|
||||
application/cms cmsc;
|
||||
application/cpl+xml cpl;
|
||||
application/csrattrs csrattrs;
|
||||
application/dash+xml mpd;
|
||||
application/dashdelta mpdd;
|
||||
application/davmount+xml davmount;
|
||||
application/DCD dcd;
|
||||
application/dicom dcm;
|
||||
application/DII dii;
|
||||
application/DIT dit;
|
||||
application/dskpp+xml xmls;
|
||||
application/dssc+der dssc;
|
||||
application/dssc+xml xdssc;
|
||||
application/dvcs dvc;
|
||||
application/ecmascript es;
|
||||
application/efi efi;
|
||||
application/emma+xml emma;
|
||||
application/emotionml+xml emotionml;
|
||||
application/epub+zip epub;
|
||||
application/exi exi;
|
||||
application/fastinfoset finf;
|
||||
application/fdt+xml fdt;
|
||||
application/font-tdpfr pfr;
|
||||
application/geo+json geojson;
|
||||
application/gml+xml gml;
|
||||
application/gzip gz tgz;
|
||||
application/hyperstudio stk;
|
||||
application/inkml+xml ink inkml;
|
||||
application/ipfix ipfix;
|
||||
application/its+xml its;
|
||||
application/javascript js;
|
||||
application/jrd+json jrd;
|
||||
application/json json;
|
||||
application/json-patch+json json-patch;
|
||||
application/ld+json jsonld;
|
||||
application/lgr+xml lgr;
|
||||
application/link-format wlnk;
|
||||
application/lost+xml lostxml;
|
||||
application/lostsync+xml lostsyncxml;
|
||||
application/LXF lxf;
|
||||
application/mac-binhex40 hqx;
|
||||
application/mads+xml mads;
|
||||
application/marc mrc;
|
||||
application/marcxml+xml mrcx;
|
||||
application/mathematica nb ma mb;
|
||||
application/mathml+xml mml;
|
||||
application/mbox mbox;
|
||||
application/metalink4+xml meta4;
|
||||
application/mets+xml mets;
|
||||
application/MF4 mf4;
|
||||
application/mmt-usd+xml musd;
|
||||
application/mods+xml mods;
|
||||
application/mp21 m21 mp21;
|
||||
application/msword doc;
|
||||
application/mxf mxf;
|
||||
application/n-quads nq;
|
||||
application/n-triples nt;
|
||||
application/ocsp-request orq;
|
||||
application/ocsp-response ors;
|
||||
application/octet-stream bin lha lzh exe class so dll img iso;
|
||||
application/oda oda;
|
||||
application/ODX odx;
|
||||
application/oebps-package+xml opf;
|
||||
application/ogg ogx;
|
||||
application/oxps oxps;
|
||||
application/p2p-overlay+xml relo;
|
||||
application/pdf pdf;
|
||||
application/PDX pdx;
|
||||
application/pgp-encrypted pgp;
|
||||
application/pgp-signature sig;
|
||||
application/pkcs10 p10;
|
||||
application/pkcs12 p12 pfx;
|
||||
application/pkcs7-mime p7m p7c;
|
||||
application/pkcs7-signature p7s;
|
||||
application/pkcs8 p8;
|
||||
application/pkix-cert cer;
|
||||
application/pkix-crl crl;
|
||||
application/pkix-pkipath pkipath;
|
||||
application/pkixcmp pki;
|
||||
application/pls+xml pls;
|
||||
application/postscript ps eps ai;
|
||||
application/provenance+xml provx;
|
||||
application/prs.cww cw cww;
|
||||
application/prs.hpub+zip hpub;
|
||||
application/prs.nprend rnd rct;
|
||||
application/prs.rdf-xml-crypt rdf-crypt;
|
||||
application/prs.xsf+xml xsf;
|
||||
application/pskc+xml pskcxml;
|
||||
application/rdf+xml rdf;
|
||||
application/route-apd+xml rapd;
|
||||
application/route-s-tsid+xml sls;
|
||||
application/route-usd+xml rusd;
|
||||
application/reginfo+xml rif;
|
||||
application/relax-ng-compact-syntax rnc;
|
||||
application/resource-lists-diff+xml rld;
|
||||
application/resource-lists+xml rl;
|
||||
application/rfc+xml rfcxml;
|
||||
application/rls-services+xml rs;
|
||||
application/rpki-ghostbusters gbr;
|
||||
application/rpki-manifest mft;
|
||||
application/rpki-roa roa;
|
||||
application/rtf rtf;
|
||||
application/scim+json scim;
|
||||
application/scvp-cv-request scq;
|
||||
application/scvp-cv-response scs;
|
||||
application/scvp-vp-request spq;
|
||||
application/scvp-vp-response spp;
|
||||
application/sdp sdp;
|
||||
application/sgml-open-catalog soc;
|
||||
application/shf+xml shf;
|
||||
application/sieve siv sieve;
|
||||
application/simple-filter+xml cl;
|
||||
application/smil+xml smil smi sml;
|
||||
application/sparql-query rq;
|
||||
application/sparql-results+xml srx;
|
||||
application/sql sql;
|
||||
application/srgs gram;
|
||||
application/srgs+xml grxml;
|
||||
application/sru+xml sru;
|
||||
application/ssml+xml ssml;
|
||||
application/tamp-apex-update tau;
|
||||
application/tamp-apex-update-confirm auc;
|
||||
application/tamp-community-update tcu;
|
||||
application/tamp-community-update-confirm cuc;
|
||||
application/tamp-error ter;
|
||||
application/tamp-sequence-adjust tsa;
|
||||
application/tamp-sequence-adjust-confirm sac;
|
||||
application/tamp-update tur;
|
||||
application/tamp-update-confirm tuc;
|
||||
application/tei+xml tei teiCorpus odd;
|
||||
application/thraud+xml tfi;
|
||||
application/timestamp-query tsq;
|
||||
application/timestamp-reply tsr;
|
||||
application/timestamped-data tsd;
|
||||
application/trig trig;
|
||||
application/ttml+xml ttml;
|
||||
application/urc-grpsheet+xml gsheet;
|
||||
application/urc-ressheet+xml rsheet;
|
||||
application/urc-targetdesc+xml td;
|
||||
application/urc-uisocketdesc+xml uis;
|
||||
application/vnd.1000minds.decision-model+xml 1km;
|
||||
application/vnd.3gpp.pic-bw-large plb;
|
||||
application/vnd.3gpp.pic-bw-small psb;
|
||||
application/vnd.3gpp.pic-bw-var pvb;
|
||||
application/vnd.3gpp2.sms sms;
|
||||
application/vnd.3gpp2.tcap tcap;
|
||||
application/vnd.3lightssoftware.imagescal imgcal;
|
||||
application/vnd.3M.Post-it-Notes pwn;
|
||||
application/vnd.accpac.simply.aso aso;
|
||||
application/vnd.accpac.simply.imp imp;
|
||||
application/vnd.acucobol acu;
|
||||
application/vnd.acucorp atc acutc;
|
||||
application/vnd.adobe.flash.movie swf;
|
||||
application/vnd.adobe.formscentral.fcdt fcdt;
|
||||
application/vnd.adobe.fxp fxp fxpl;
|
||||
application/vnd.adobe.xdp+xml xdp;
|
||||
application/vnd.adobe.xfdf xfdf;
|
||||
application/vnd.ahead.space ahead;
|
||||
application/vnd.airzip.filesecure.azf azf;
|
||||
application/vnd.airzip.filesecure.azs azs;
|
||||
application/vnd.amazon.mobi8-ebook azw3;
|
||||
application/vnd.americandynamics.acc acc;
|
||||
application/vnd.amiga.ami ami;
|
||||
application/vnd.anki apkg;
|
||||
application/vnd.anser-web-certificate-issue-initiation cii;
|
||||
application/vnd.anser-web-funds-transfer-initiation fti;
|
||||
application/vnd.apple.installer+xml dist distz pkg mpkg;
|
||||
application/vnd.apple.mpegurl m3u8;
|
||||
application/vnd.aristanetworks.swi swi;
|
||||
application/vnd.astraea-software.iota iota;
|
||||
application/vnd.audiograph aep;
|
||||
application/vnd.autopackage package;
|
||||
application/vnd.balsamiq.bmml+xml bmml;
|
||||
application/vnd.balsamiq.bmpr bmpr;
|
||||
application/vnd.blueice.multipass mpm;
|
||||
application/vnd.bluetooth.ep.oob ep;
|
||||
application/vnd.bluetooth.le.oob le;
|
||||
application/vnd.bmi bmi;
|
||||
application/vnd.businessobjects rep;
|
||||
application/vnd.cendio.thinlinc.clientconf tlclient;
|
||||
application/vnd.chemdraw+xml cdxml;
|
||||
application/vnd.chess-pgn pgn;
|
||||
application/vnd.chipnuts.karaoke-mmd mmd;
|
||||
application/vnd.cinderella cdy;
|
||||
application/vnd.citationstyles.style+xml csl;
|
||||
application/vnd.claymore cla;
|
||||
application/vnd.cloanto.rp9 rp9;
|
||||
application/vnd.clonk.c4group c4g c4d c4f c4p c4u;
|
||||
application/vnd.cluetrust.cartomobile-config c11amc;
|
||||
application/vnd.cluetrust.cartomobile-config-pkg c11amz;
|
||||
application/vnd.coffeescript coffee;
|
||||
application/vnd.comicbook+zip cbz;
|
||||
application/vnd.commerce-battelle ica icf icd ic0 ic1 ic2 ic3 ic4 ic5 ic6 ic7 ic8;
|
||||
application/vnd.commonspace csp cst;
|
||||
application/vnd.contact.cmsg cdbcmsg;
|
||||
application/vnd.coreos.ignition+json ign ignition;
|
||||
application/vnd.cosmocaller cmc;
|
||||
application/vnd.crick.clicker clkx;
|
||||
application/vnd.crick.clicker.keyboard clkk;
|
||||
application/vnd.crick.clicker.palette clkp;
|
||||
application/vnd.crick.clicker.template clkt;
|
||||
application/vnd.crick.clicker.wordbank clkw;
|
||||
application/vnd.criticaltools.wbs+xml wbs;
|
||||
application/vnd.ctc-posml pml;
|
||||
application/vnd.cups-ppd ppd;
|
||||
application/vnd.curl curl;
|
||||
application/vnd.dart dart;
|
||||
application/vnd.data-vision.rdz rdz;
|
||||
application/vnd.debian.binary-package deb udeb;
|
||||
application/vnd.dece.data uvf uvvf uvd uvvd;
|
||||
application/vnd.dece.ttml+xml uvt uvvt;
|
||||
application/vnd.dece.unspecified uvx uvvx;
|
||||
application/vnd.dece.zip uvz uvvz;
|
||||
application/vnd.denovo.fcselayout-link fe_launch;
|
||||
application/vnd.desmume.movie dsm;
|
||||
application/vnd.dna dna;
|
||||
application/vnd.document+json docjson;
|
||||
application/vnd.doremir.scorecloud-binary-document scld;
|
||||
application/vnd.dpgraph dpg mwc dpgraph;
|
||||
application/vnd.dreamfactory dfac;
|
||||
application/vnd.dtg.local.flash fla;
|
||||
application/vnd.dvb.ait ait;
|
||||
application/vnd.dvb.service svc;
|
||||
application/vnd.dynageo geo;
|
||||
application/vnd.dzr dzr;
|
||||
application/vnd.ecowin.chart mag;
|
||||
application/vnd.enliven nml;
|
||||
application/vnd.epson.esf esf;
|
||||
application/vnd.epson.msf msf;
|
||||
application/vnd.epson.quickanime qam;
|
||||
application/vnd.epson.salt slt;
|
||||
application/vnd.epson.ssf ssf;
|
||||
application/vnd.ericsson.quickcall qcall qca;
|
||||
application/vnd.espass-espass+zip espass;
|
||||
application/vnd.eszigno3+xml es3 et3;
|
||||
application/vnd.etsi.asic-e+zip asice sce;
|
||||
application/vnd.etsi.asic-s+zip asics;
|
||||
application/vnd.etsi.timestamp-token tst;
|
||||
application/vnd.evolv.ecig.profile ecigprofile;
|
||||
application/vnd.evolv.ecig.settings ecig;
|
||||
application/vnd.evolv.ecig.theme ecigtheme;
|
||||
application/vnd.ezpix-album ez2;
|
||||
application/vnd.ezpix-package ez3;
|
||||
application/vnd.fastcopy-disk-image dim;
|
||||
application/vnd.fdf fdf;
|
||||
application/vnd.fdsn.mseed msd mseed;
|
||||
application/vnd.fdsn.seed seed dataless;
|
||||
application/vnd.filmit.zfc zfc;
|
||||
application/vnd.FloGraphIt gph;
|
||||
application/vnd.fluxtime.clip ftc;
|
||||
application/vnd.font-fontforge-sfd sfd;
|
||||
application/vnd.framemaker fm;
|
||||
application/vnd.frogans.fnc fnc;
|
||||
application/vnd.frogans.ltf ltf;
|
||||
application/vnd.fsc.weblaunch fsc;
|
||||
application/vnd.fujitsu.oasys oas;
|
||||
application/vnd.fujitsu.oasys2 oa2;
|
||||
application/vnd.fujitsu.oasys3 oa3;
|
||||
application/vnd.fujitsu.oasysgp fg5;
|
||||
application/vnd.fujitsu.oasysprs bh2;
|
||||
application/vnd.fujixerox.ddd ddd;
|
||||
application/vnd.fujixerox.docuworks xdw;
|
||||
application/vnd.fujixerox.docuworks.binder xbd;
|
||||
application/vnd.fujixerox.docuworks.container xct;
|
||||
application/vnd.fuzzysheet fzs;
|
||||
application/vnd.genomatix.tuxedo txd;
|
||||
application/vnd.geocube+xml g3 g³;
|
||||
application/vnd.geogebra.file ggb;
|
||||
application/vnd.geogebra.tool ggt;
|
||||
application/vnd.geometry-explorer gex gre;
|
||||
application/vnd.geonext gxt;
|
||||
application/vnd.geoplan g2w;
|
||||
application/vnd.geospace g3w;
|
||||
application/vnd.gmx gmx;
|
||||
application/vnd.google-earth.kml+xml kml;
|
||||
application/vnd.google-earth.kmz kmz;
|
||||
application/vnd.grafeq gqf gqs;
|
||||
application/vnd.groove-account gac;
|
||||
application/vnd.groove-help ghf;
|
||||
application/vnd.groove-identity-message gim;
|
||||
application/vnd.groove-injector grv;
|
||||
application/vnd.groove-tool-message gtm;
|
||||
application/vnd.groove-tool-template tpl;
|
||||
application/vnd.groove-vcard vcg;
|
||||
application/vnd.hal+xml hal;
|
||||
application/vnd.HandHeld-Entertainment+xml zmm;
|
||||
application/vnd.hbci hbci hbc kom upa pkd bpd;
|
||||
application/vnd.hdt hdt;
|
||||
application/vnd.hhe.lesson-player les;
|
||||
application/vnd.hp-HPGL hpgl;
|
||||
application/vnd.hp-hpid hpi hpid;
|
||||
application/vnd.hp-hps hps;
|
||||
application/vnd.hp-jlyt jlt;
|
||||
application/vnd.hp-PCL pcl;
|
||||
application/vnd.hydrostatix.sof-data sfd-hdstx;
|
||||
application/vnd.hzn-3d-crossword x3d;
|
||||
application/vnd.ibm.electronic-media emm;
|
||||
application/vnd.ibm.MiniPay mpy;
|
||||
application/vnd.ibm.modcap list3820 listafp afp pseg3820;
|
||||
application/vnd.ibm.rights-management irm;
|
||||
application/vnd.ibm.secure-container sc;
|
||||
application/vnd.iccprofile icc icm;
|
||||
application/vnd.ieee.1905 1905.1;
|
||||
application/vnd.igloader igl;
|
||||
application/vnd.imagemeter.folder+zip imf;
|
||||
application/vnd.imagemeter.image+zip imi;
|
||||
application/vnd.immervision-ivp ivp;
|
||||
application/vnd.immervision-ivu ivu;
|
||||
application/vnd.ims.imsccv1p1 imscc;
|
||||
application/vnd.insors.igm igm;
|
||||
application/vnd.intercon.formnet xpw xpx;
|
||||
application/vnd.intergeo i2g;
|
||||
application/vnd.intu.qbo qbo;
|
||||
application/vnd.intu.qfx qfx;
|
||||
application/vnd.ipunplugged.rcprofile rcprofile;
|
||||
application/vnd.irepository.package+xml irp;
|
||||
application/vnd.is-xpr xpr;
|
||||
application/vnd.isac.fcs fcs;
|
||||
application/vnd.jam jam;
|
||||
application/vnd.jcp.javame.midlet-rms rms;
|
||||
application/vnd.jisp jisp;
|
||||
application/vnd.joost.joda-archive joda;
|
||||
application/vnd.kahootz ktz ktr;
|
||||
application/vnd.kde.karbon karbon;
|
||||
application/vnd.kde.kchart chrt;
|
||||
application/vnd.kde.kformula kfo;
|
||||
application/vnd.kde.kivio flw;
|
||||
application/vnd.kde.kontour kon;
|
||||
application/vnd.kde.kpresenter kpr kpt;
|
||||
application/vnd.kde.kspread ksp;
|
||||
application/vnd.kde.kword kwd kwt;
|
||||
application/vnd.kenameaapp htke;
|
||||
application/vnd.kidspiration kia;
|
||||
application/vnd.Kinar kne knp sdf;
|
||||
application/vnd.koan skp skd skm skt;
|
||||
application/vnd.kodak-descriptor sse;
|
||||
application/vnd.las.las+json lasjson;
|
||||
application/vnd.las.las+xml lasxml;
|
||||
application/vnd.llamagraphics.life-balance.desktop lbd;
|
||||
application/vnd.llamagraphics.life-balance.exchange+xml lbe;
|
||||
application/vnd.lotus-1-2-3 123 wk4 wk3 wk1;
|
||||
application/vnd.lotus-approach apr vew;
|
||||
application/vnd.lotus-freelance prz pre;
|
||||
application/vnd.lotus-notes nsf ntf ndl ns4 ns3 ns2 nsh nsg;
|
||||
application/vnd.lotus-organizer or3 or2 org;
|
||||
application/vnd.lotus-screencam scm;
|
||||
application/vnd.lotus-wordpro lwp sam;
|
||||
application/vnd.macports.portpkg portpkg;
|
||||
application/vnd.mapbox-vector-tile mvt;
|
||||
application/vnd.marlin.drm.mdcf mdc;
|
||||
application/vnd.maxmind.maxmind-db mmdb;
|
||||
application/vnd.mcd mcd;
|
||||
application/vnd.medcalcdata mc1;
|
||||
application/vnd.mediastation.cdkey cdkey;
|
||||
application/vnd.MFER mwf;
|
||||
application/vnd.mfmp mfm;
|
||||
application/vnd.micrografx.flo flo;
|
||||
application/vnd.micrografx.igx igx;
|
||||
application/vnd.mif mif;
|
||||
application/vnd.Mobius.DAF daf;
|
||||
application/vnd.Mobius.DIS dis;
|
||||
application/vnd.Mobius.MBK mbk;
|
||||
application/vnd.Mobius.MQY mqy;
|
||||
application/vnd.Mobius.MSL msl;
|
||||
application/vnd.Mobius.PLC plc;
|
||||
application/vnd.Mobius.TXF txf;
|
||||
application/vnd.mophun.application mpn;
|
||||
application/vnd.mophun.certificate mpc;
|
||||
application/vnd.mozilla.xul+xml xul;
|
||||
application/vnd.ms-3mfdocument 3mf;
|
||||
application/vnd.ms-artgalry cil;
|
||||
application/vnd.ms-asf asf;
|
||||
application/vnd.ms-cab-compressed cab;
|
||||
application/vnd.ms-excel xls xlm xla xlc xlt xlw;
|
||||
application/vnd.ms-excel.template.macroEnabled.12 xltm;
|
||||
application/vnd.ms-excel.addin.macroEnabled.12 xlam;
|
||||
application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb;
|
||||
application/vnd.ms-excel.sheet.macroEnabled.12 xlsm;
|
||||
application/vnd.ms-fontobject eot;
|
||||
application/vnd.ms-htmlhelp chm;
|
||||
application/vnd.ms-ims ims;
|
||||
application/vnd.ms-lrm lrm;
|
||||
application/vnd.ms-officetheme thmx;
|
||||
application/vnd.ms-powerpoint ppt pps pot;
|
||||
application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam;
|
||||
application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm;
|
||||
application/vnd.ms-powerpoint.slide.macroEnabled.12 sldm;
|
||||
application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm;
|
||||
application/vnd.ms-powerpoint.template.macroEnabled.12 potm;
|
||||
application/vnd.ms-project mpp mpt;
|
||||
application/vnd.ms-tnef tnef tnf;
|
||||
application/vnd.ms-word.document.macroEnabled.12 docm;
|
||||
application/vnd.ms-word.template.macroEnabled.12 dotm;
|
||||
application/vnd.ms-works wcm wdb wks wps;
|
||||
application/vnd.ms-wpl wpl;
|
||||
application/vnd.ms-xpsdocument xps;
|
||||
application/vnd.msa-disk-image msa;
|
||||
application/vnd.mseq mseq;
|
||||
application/vnd.multiad.creator crtr;
|
||||
application/vnd.multiad.creator.cif cif;
|
||||
application/vnd.musician mus;
|
||||
application/vnd.muvee.style msty;
|
||||
application/vnd.mynfc taglet;
|
||||
application/vnd.nervana entity request bkm kcm;
|
||||
application/vnd.nitf nitf;
|
||||
application/vnd.neurolanguage.nlu nlu;
|
||||
application/vnd.nintendo.nitro.rom nds;
|
||||
application/vnd.nintendo.snes.rom sfc smc;
|
||||
application/vnd.noblenet-directory nnd;
|
||||
application/vnd.noblenet-sealer nns;
|
||||
application/vnd.noblenet-web nnw;
|
||||
application/vnd.nokia.n-gage.ac+xml ac;
|
||||
application/vnd.nokia.n-gage.data ngdat;
|
||||
application/vnd.nokia.n-gage.symbian.install n-gage;
|
||||
application/vnd.nokia.radio-preset rpst;
|
||||
application/vnd.nokia.radio-presets rpss;
|
||||
application/vnd.novadigm.EDM edm;
|
||||
application/vnd.novadigm.EDX edx;
|
||||
application/vnd.novadigm.EXT ext;
|
||||
application/vnd.oasis.opendocument.chart odc;
|
||||
application/vnd.oasis.opendocument.chart-template otc;
|
||||
application/vnd.oasis.opendocument.database odb;
|
||||
application/vnd.oasis.opendocument.formula odf;
|
||||
application/vnd.oasis.opendocument.graphics odg;
|
||||
application/vnd.oasis.opendocument.graphics-template otg;
|
||||
application/vnd.oasis.opendocument.image odi;
|
||||
application/vnd.oasis.opendocument.image-template oti;
|
||||
application/vnd.oasis.opendocument.presentation odp;
|
||||
application/vnd.oasis.opendocument.presentation-template otp;
|
||||
application/vnd.oasis.opendocument.spreadsheet ods;
|
||||
application/vnd.oasis.opendocument.spreadsheet-template ots;
|
||||
application/vnd.oasis.opendocument.text odt;
|
||||
application/vnd.oasis.opendocument.text-master odm;
|
||||
application/vnd.oasis.opendocument.text-template ott;
|
||||
application/vnd.oasis.opendocument.text-web oth;
|
||||
application/vnd.olpc-sugar xo;
|
||||
application/vnd.oma.dd2+xml dd2;
|
||||
application/vnd.onepager tam;
|
||||
application/vnd.onepagertamp tamp;
|
||||
application/vnd.onepagertamx tamx;
|
||||
application/vnd.onepagertat tat;
|
||||
application/vnd.onepagertatp tatp;
|
||||
application/vnd.onepagertatx tatx;
|
||||
application/vnd.openblox.game+xml obgx;
|
||||
application/vnd.openblox.game-binary obg;
|
||||
application/vnd.openeye.oeb oeb;
|
||||
application/vnd.openofficeorg.extension oxt;
|
||||
application/vnd.openstreetmap.data+xml osm;
|
||||
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
|
||||
application/vnd.openxmlformats-officedocument.presentationml.slide sldx;
|
||||
application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx;
|
||||
application/vnd.openxmlformats-officedocument.presentationml.template potx;
|
||||
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
|
||||
application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx;
|
||||
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
|
||||
application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx;
|
||||
application/vnd.osa.netdeploy ndc;
|
||||
application/vnd.osgeo.mapguide.package mgp;
|
||||
application/vnd.osgi.dp dp;
|
||||
application/vnd.osgi.subsystem esa;
|
||||
application/vnd.oxli.countgraph oxlicg;
|
||||
application/vnd.palm prc pdb pqa oprc;
|
||||
application/vnd.panoply plp;
|
||||
application/vnd.pawaafile paw;
|
||||
application/vnd.pg.format str;
|
||||
application/vnd.pg.osasli ei6;
|
||||
application/vnd.piaccess.application-license pil;
|
||||
application/vnd.picsel efif;
|
||||
application/vnd.pmi.widget wg;
|
||||
application/vnd.pocketlearn plf;
|
||||
application/vnd.powerbuilder6 pbd;
|
||||
application/vnd.preminet preminet;
|
||||
application/vnd.previewsystems.box box vbox;
|
||||
application/vnd.proteus.magazine mgz;
|
||||
application/vnd.publishare-delta-tree qps;
|
||||
application/vnd.pvi.ptid1 ptid;
|
||||
application/vnd.qualcomm.brew-app-res bar;
|
||||
application/vnd.Quark.QuarkXPress qxd qxt qwd qwt qxl qxb;
|
||||
application/vnd.quobject-quoxdocument quox quiz;
|
||||
application/vnd.rainstor.data tree;
|
||||
application/vnd.rar rar;
|
||||
application/vnd.realvnc.bed bed;
|
||||
application/vnd.recordare.musicxml mxl;
|
||||
application/vnd.rig.cryptonote cryptonote;
|
||||
application/vnd.route66.link66+xml link66;
|
||||
application/vnd.sailingtracker.track st;
|
||||
application/vnd.scribus scd sla slaz;
|
||||
application/vnd.sealed.3df s3df;
|
||||
application/vnd.sealed.csf scsf;
|
||||
application/vnd.sealed.doc sdoc sdo s1w;
|
||||
application/vnd.sealed.eml seml sem;
|
||||
application/vnd.sealed.mht smht smh;
|
||||
application/vnd.sealed.ppt sppt s1p;
|
||||
application/vnd.sealed.tiff stif;
|
||||
application/vnd.sealed.xls sxls sxl s1e;
|
||||
application/vnd.sealedmedia.softseal.html stml s1h;
|
||||
application/vnd.sealedmedia.softseal.pdf spdf spd s1a;
|
||||
application/vnd.seemail see;
|
||||
application/vnd.sema sema;
|
||||
application/vnd.semd semd;
|
||||
application/vnd.semf semf;
|
||||
application/vnd.shana.informed.formdata ifm;
|
||||
application/vnd.shana.informed.formtemplate itp;
|
||||
application/vnd.shana.informed.interchange iif;
|
||||
application/vnd.shana.informed.package ipk;
|
||||
application/vnd.sigrok.session sr;
|
||||
application/vnd.SimTech-MindMapper twd twds;
|
||||
application/vnd.smaf mmf;
|
||||
application/vnd.smart.notebook notebook;
|
||||
application/vnd.smart.teacher teacher;
|
||||
application/vnd.software602.filler.form+xml fo;
|
||||
application/vnd.software602.filler.form-xml-zip zfo;
|
||||
application/vnd.solent.sdkm+xml sdkm sdkd;
|
||||
application/vnd.spotfire.dxp dxp;
|
||||
application/vnd.spotfire.sfs sfs;
|
||||
application/vnd.stepmania.package smzip;
|
||||
application/vnd.stepmania.stepchart sm;
|
||||
application/vnd.sun.wadl+xml wadl;
|
||||
application/vnd.sus-calendar sus susp;
|
||||
application/vnd.syncml+xml xsm;
|
||||
application/vnd.syncml.dm+wbxml bdm;
|
||||
application/vnd.syncml.dm+xml xdm;
|
||||
application/vnd.syncml.dmddf+xml ddf;
|
||||
application/vnd.tao.intent-module-archive tao;
|
||||
application/vnd.tcpdump.pcap pcap cap dmp;
|
||||
application/vnd.theqvd qvd;
|
||||
application/vnd.tml vfr viaframe;
|
||||
application/vnd.tmobile-livetv tmo;
|
||||
application/vnd.trid.tpt tpt;
|
||||
application/vnd.triscape.mxs mxs;
|
||||
application/vnd.trueapp tra;
|
||||
application/vnd.ufdl ufdl ufd frm;
|
||||
application/vnd.uiq.theme utz;
|
||||
application/vnd.umajin umj;
|
||||
application/vnd.unity unityweb;
|
||||
application/vnd.uoml+xml uoml uo;
|
||||
application/vnd.uri-map urim urimap;
|
||||
application/vnd.valve.source.material vmt;
|
||||
application/vnd.vcx vcx;
|
||||
application/vnd.vd-study mxi study-inter model-inter;
|
||||
application/vnd.vectorworks vwx;
|
||||
application/vnd.vidsoft.vidconference vsc;
|
||||
application/vnd.visio vsd vst vsw vss;
|
||||
application/vnd.visionary vis;
|
||||
application/vnd.vsf vsf;
|
||||
application/vnd.wap.sic sic;
|
||||
application/vnd.wap.slc slc;
|
||||
application/vnd.wap.wbxml wbxml;
|
||||
application/vnd.wap.wmlc wmlc;
|
||||
application/vnd.wap.wmlscriptc wmlsc;
|
||||
application/vnd.webturbo wtb;
|
||||
application/vnd.wfa.p2p p2p;
|
||||
application/vnd.wfa.wsc wsc;
|
||||
application/vnd.wmc wmc;
|
||||
application/vnd.wolfram.mathematica.package m;
|
||||
application/vnd.wolfram.player nbp;
|
||||
application/vnd.wordperfect wpd;
|
||||
application/vnd.wqd wqd;
|
||||
application/vnd.wt.stf stf;
|
||||
application/vnd.wv.csp+wbxml wv;
|
||||
application/vnd.xara xar;
|
||||
application/vnd.xfdl xfdl xfd;
|
||||
application/vnd.xmpie.cpkg cpkg;
|
||||
application/vnd.xmpie.dpkg dpkg;
|
||||
application/vnd.xmpie.ppkg ppkg;
|
||||
application/vnd.xmpie.xlim xlim;
|
||||
application/vnd.yamaha.hv-dic hvd;
|
||||
application/vnd.yamaha.hv-script hvs;
|
||||
application/vnd.yamaha.hv-voice hvp;
|
||||
application/vnd.yamaha.openscoreformat osf;
|
||||
application/vnd.yamaha.smaf-audio saf;
|
||||
application/vnd.yamaha.smaf-phrase spf;
|
||||
application/vnd.yaoweme yme;
|
||||
application/vnd.yellowriver-custom-menu cmp;
|
||||
application/vnd.zul zir zirz;
|
||||
application/vnd.zzazz.deck+xml zaz;
|
||||
application/voicexml+xml vxml;
|
||||
application/watcherinfo+xml wif;
|
||||
application/widget wgt;
|
||||
application/wsdl+xml wsdl;
|
||||
application/wspolicy+xml wspolicy;
|
||||
application/xcap-att+xml xav;
|
||||
application/xcap-caps+xml xca;
|
||||
application/xcap-diff+xml xdf;
|
||||
application/xcap-el+xml xel;
|
||||
application/xcap-error+xml xer;
|
||||
application/xcap-ns+xml xns;
|
||||
application/xhtml+xml xhtml xhtm xht;
|
||||
application/xml-dtd dtd;
|
||||
application/xop+xml xop;
|
||||
application/xslt+xml xsl xslt;
|
||||
application/xv+xml mxml xhvml xvml xvm;
|
||||
application/yang yang;
|
||||
application/yin+xml yin;
|
||||
application/zip zip;
|
||||
audio/32kadpcm 726;
|
||||
audio/ac3 ac3;
|
||||
audio/AMR amr;
|
||||
audio/AMR-WB awb;
|
||||
audio/asc acn;
|
||||
audio/ATRAC-ADVANCED-LOSSLESS aal;
|
||||
audio/ATRAC-X atx;
|
||||
audio/ATRAC3 at3 aa3 omg;
|
||||
audio/basic au snd;
|
||||
audio/dls dls;
|
||||
audio/EVRC evc;
|
||||
audio/EVRCB evb;
|
||||
audio/EVRCNW enw;
|
||||
audio/EVRCWB evw;
|
||||
audio/iLBC lbc;
|
||||
audio/L16 l16;
|
||||
audio/mobile-xmf mxmf;
|
||||
audio/mp4 m4a;
|
||||
audio/mpeg mp3 mpga mp1 mp2;
|
||||
audio/ogg oga ogg opus spx;
|
||||
audio/prs.sid sid psid;
|
||||
audio/qcelp qcp;
|
||||
audio/SMV smv;
|
||||
audio/vnd.audikoz koz;
|
||||
audio/vnd.dece.audio uva uvva;
|
||||
audio/vnd.digital-winds eol;
|
||||
audio/vnd.dolby.mlp mlp;
|
||||
audio/vnd.dts dts;
|
||||
audio/vnd.dts.hd dtshd;
|
||||
audio/vnd.everad.plj plj;
|
||||
audio/vnd.lucent.voice lvp;
|
||||
audio/vnd.ms-playready.media.pya pya;
|
||||
audio/vnd.nortel.vbk vbk;
|
||||
audio/vnd.nuera.ecelp4800 ecelp4800;
|
||||
audio/vnd.nuera.ecelp7470 ecelp7470;
|
||||
audio/vnd.nuera.ecelp9600 ecelp9600;
|
||||
audio/vnd.presonus.multitrack multitrack;
|
||||
audio/vnd.rip rip;
|
||||
audio/vnd.sealedmedia.softseal.mpeg smp3 smp s1m;
|
||||
font/collection ttc;
|
||||
font/otf otf;
|
||||
font/ttf ttf;
|
||||
font/woff woff;
|
||||
font/woff2 woff2;
|
||||
image/bmp bmp dib;
|
||||
image/cgm cgm;
|
||||
image/dicom-rle drle;
|
||||
image/emf emf;
|
||||
image/fits fits fit fts;
|
||||
image/gif gif;
|
||||
image/ief ief;
|
||||
image/jls jls;
|
||||
image/jp2 jp2 jpg2;
|
||||
image/jpeg jpg jpeg jpe jfif;
|
||||
image/jpm jpm jpgm;
|
||||
image/jpx jpx jpf;
|
||||
image/ktx ktx;
|
||||
image/png png;
|
||||
image/prs.btif btif btf;
|
||||
image/prs.pti pti;
|
||||
image/svg+xml svg svgz;
|
||||
image/t38 t38;
|
||||
image/tiff tiff tif;
|
||||
image/tiff-fx tfx;
|
||||
image/vnd.adobe.photoshop psd;
|
||||
image/vnd.airzip.accelerator.azv azv;
|
||||
image/vnd.dece.graphic uvi uvvi uvg uvvg;
|
||||
image/vnd.djvu djvu djv;
|
||||
image/vnd.dwg dwg;
|
||||
image/vnd.dxf dxf;
|
||||
image/vnd.fastbidsheet fbs;
|
||||
image/vnd.fpx fpx;
|
||||
image/vnd.fst fst;
|
||||
image/vnd.fujixerox.edmics-mmr mmr;
|
||||
image/vnd.fujixerox.edmics-rlc rlc;
|
||||
image/vnd.globalgraphics.pgb pgb;
|
||||
image/vnd.microsoft.icon ico;
|
||||
image/vnd.mozilla.apng apng;
|
||||
image/vnd.ms-modi mdi;
|
||||
image/vnd.radiance hdr rgbe xyze;
|
||||
image/vnd.sealed.png spng spn s1n;
|
||||
image/vnd.sealedmedia.softseal.gif sgif sgi s1g;
|
||||
image/vnd.sealedmedia.softseal.jpg sjpg sjp s1j;
|
||||
image/vnd.tencent.tap tap;
|
||||
image/vnd.valve.source.texture vtf;
|
||||
image/vnd.wap.wbmp wbmp;
|
||||
image/vnd.xiff xif;
|
||||
image/vnd.zbrush.pcx pcx;
|
||||
image/wmf wmf;
|
||||
message/global u8msg;
|
||||
message/global-delivery-status u8dsn;
|
||||
message/global-disposition-notification u8mdn;
|
||||
message/global-headers u8hdr;
|
||||
message/rfc822 eml mail art;
|
||||
model/gltf+json gltf;
|
||||
model/iges igs iges;
|
||||
model/mesh msh mesh silo;
|
||||
model/vnd.collada+xml dae;
|
||||
model/vnd.dwf dwf;
|
||||
model/vnd.gdl gdl gsm win dor lmp rsm msm ism;
|
||||
model/vnd.gtw gtw;
|
||||
model/vnd.moml+xml moml;
|
||||
model/vnd.mts mts;
|
||||
model/vnd.opengex ogex;
|
||||
model/vnd.parasolid.transmit.binary x_b xmt_bin;
|
||||
model/vnd.parasolid.transmit.text x_t xmt_txt;
|
||||
model/vnd.valve.source.compiled-map bsp;
|
||||
model/vnd.vtu vtu;
|
||||
model/vrml wrl vrml;
|
||||
model/x3d+xml x3db;
|
||||
model/x3d-vrml x3dv x3dvz;
|
||||
multipart/vnd.bint.med-plus bmed;
|
||||
multipart/voice-message vpm;
|
||||
text/cache-manifest appcache manifest;
|
||||
text/calendar ics ifb;
|
||||
text/css css;
|
||||
text/csv csv;
|
||||
text/csv-schema csvs;
|
||||
text/dns soa zone;
|
||||
text/html html htm;
|
||||
text/jcr-cnd cnd;
|
||||
text/markdown markdown md;
|
||||
text/mizar miz;
|
||||
text/n3 n3;
|
||||
text/plain txt asc text pm el c h cc hh cxx hxx f90 conf log;
|
||||
text/provenance-notation provn;
|
||||
text/prs.fallenstein.rst rst;
|
||||
text/prs.lines.tag tag dsc;
|
||||
text/richtext rtx;
|
||||
text/sgml sgml sgm;
|
||||
text/tab-separated-values tsv;
|
||||
text/troff t tr roff;
|
||||
text/turtle ttl;
|
||||
text/uri-list uris uri;
|
||||
text/vcard vcf vcard;
|
||||
text/vnd.a a;
|
||||
text/vnd.abc abc;
|
||||
text/vnd.ascii-art ascii;
|
||||
text/vnd.debian.copyright copyright;
|
||||
text/vnd.DMClientScript dms;
|
||||
text/vnd.dvb.subtitle sub;
|
||||
text/vnd.esmertec.theme-descriptor jtd;
|
||||
text/vnd.fly fly;
|
||||
text/vnd.fmi.flexstor flx;
|
||||
text/vnd.graphviz gv dot;
|
||||
text/vnd.in3d.3dml 3dml 3dm;
|
||||
text/vnd.in3d.spot spot spo;
|
||||
text/vnd.ms-mediapackage mpf;
|
||||
text/vnd.net2phone.commcenter.command ccc;
|
||||
text/vnd.si.uricatalogue uric;
|
||||
text/vnd.sun.j2me.app-descriptor jad;
|
||||
text/vnd.trolltech.linguist ts;
|
||||
text/vnd.wap.si si;
|
||||
text/vnd.wap.sl sl;
|
||||
text/vnd.wap.wml wml;
|
||||
text/vnd.wap.wmlscript wmls;
|
||||
text/xml xml xsd rng;
|
||||
text/xml-external-parsed-entity ent;
|
||||
video/3gpp 3gp 3gpp;
|
||||
video/3gpp2 3g2 3gpp2;
|
||||
video/iso.segment m4s;
|
||||
video/mj2 mj2 mjp2;
|
||||
video/mp4 mp4 mpg4 m4v;
|
||||
video/mpeg mpeg mpg mpe m1v m2v;
|
||||
video/ogg ogv;
|
||||
video/quicktime mov qt;
|
||||
video/vnd.dece.hd uvh uvvh;
|
||||
video/vnd.dece.mobile uvm uvvm;
|
||||
video/vnd.dece.mp4 uvu uvvu;
|
||||
video/vnd.dece.pd uvp uvvp;
|
||||
video/vnd.dece.sd uvs uvvs;
|
||||
video/vnd.dece.video uvv uvvv;
|
||||
video/vnd.dvb.file dvb;
|
||||
video/vnd.fvt fvt;
|
||||
video/vnd.mpegurl mxu m4u;
|
||||
video/vnd.ms-playready.media.pyv pyv;
|
||||
video/vnd.nokia.interleaved-multimedia nim;
|
||||
video/vnd.radgamettools.bink bik bk2;
|
||||
video/vnd.radgamettools.smacker smk;
|
||||
video/vnd.sealed.mpeg1 smpg s11;
|
||||
video/vnd.sealed.mpeg4 s14;
|
||||
video/vnd.sealed.swf sswf ssw;
|
||||
video/vnd.sealedmedia.softseal.mov smov smo s1q;
|
||||
video/vnd.vivo viv;
|
||||
application/mac-compactpro cpt;
|
||||
application/metalink+xml metalink;
|
||||
application/owl+xml owx;
|
||||
application/rss+xml rss;
|
||||
application/vnd.android.package-archive apk;
|
||||
application/vnd.oma.dd+xml dd;
|
||||
application/vnd.oma.drm.content dcf;
|
||||
application/vnd.oma.drm.dcf o4a o4v;
|
||||
application/vnd.oma.drm.message dm;
|
||||
application/vnd.oma.drm.rights+wbxml drc;
|
||||
application/vnd.oma.drm.rights+xml dr;
|
||||
application/vnd.sun.xml.calc sxc;
|
||||
application/vnd.sun.xml.calc.template stc;
|
||||
application/vnd.sun.xml.draw sxd;
|
||||
application/vnd.sun.xml.draw.template std;
|
||||
application/vnd.sun.xml.impress sxi;
|
||||
application/vnd.sun.xml.impress.template sti;
|
||||
application/vnd.sun.xml.math sxm;
|
||||
application/vnd.sun.xml.writer sxw;
|
||||
application/vnd.sun.xml.writer.global sxg;
|
||||
application/vnd.sun.xml.writer.template stw;
|
||||
application/vnd.symbian.install sis;
|
||||
application/vnd.wap.mms-message mms;
|
||||
application/x-annodex anx;
|
||||
application/x-bcpio bcpio;
|
||||
application/x-bittorrent torrent;
|
||||
application/x-bzip2 bz2;
|
||||
application/x-cdlink vcd;
|
||||
application/x-chrome-extension crx;
|
||||
application/x-cpio cpio;
|
||||
application/x-csh csh;
|
||||
application/x-director dcr dir dxr;
|
||||
application/x-dvi dvi;
|
||||
application/x-futuresplash spl;
|
||||
application/x-gtar gtar;
|
||||
application/x-hdf hdf;
|
||||
application/x-java-archive jar;
|
||||
application/x-java-jnlp-file jnlp;
|
||||
application/x-java-pack200 pack;
|
||||
application/x-killustrator kil;
|
||||
application/x-latex latex;
|
||||
application/x-netcdf nc cdf;
|
||||
application/x-perl pl;
|
||||
application/x-rpm rpm;
|
||||
application/x-sh sh;
|
||||
application/x-shar shar;
|
||||
application/x-stuffit sit;
|
||||
application/x-sv4cpio sv4cpio;
|
||||
application/x-sv4crc sv4crc;
|
||||
application/x-tar tar;
|
||||
application/x-tcl tcl;
|
||||
application/x-tex tex;
|
||||
application/x-texinfo texinfo texi;
|
||||
application/x-troff-man man 1 2 3 4 5 6 7 8;
|
||||
application/x-troff-me me;
|
||||
application/x-troff-ms ms;
|
||||
application/x-ustar ustar;
|
||||
application/x-wais-source src;
|
||||
application/x-xpinstall xpi;
|
||||
application/x-xspf+xml xspf;
|
||||
application/x-xz xz;
|
||||
audio/midi mid midi kar;
|
||||
audio/x-aiff aif aiff aifc;
|
||||
audio/x-annodex axa;
|
||||
audio/x-flac flac;
|
||||
audio/x-matroska mka;
|
||||
audio/x-mod mod ult uni m15 mtm 669 med;
|
||||
audio/x-mpegurl m3u;
|
||||
audio/x-ms-wax wax;
|
||||
audio/x-ms-wma wma;
|
||||
audio/x-pn-realaudio ram rm;
|
||||
audio/x-realaudio ra;
|
||||
audio/x-s3m s3m;
|
||||
audio/x-stm stm;
|
||||
audio/x-wav wav;
|
||||
chemical/x-xyz xyz;
|
||||
image/webp webp;
|
||||
image/x-cmu-raster ras;
|
||||
image/x-portable-anymap pnm;
|
||||
image/x-portable-bitmap pbm;
|
||||
image/x-portable-graymap pgm;
|
||||
image/x-portable-pixmap ppm;
|
||||
image/x-rgb rgb;
|
||||
image/x-targa tga;
|
||||
image/x-xbitmap xbm;
|
||||
image/x-xpixmap xpm;
|
||||
image/x-xwindowdump xwd;
|
||||
text/html-sandboxed sandboxed;
|
||||
text/x-pod pod;
|
||||
text/x-setext etx;
|
||||
video/webm webm;
|
||||
video/x-annodex axv;
|
||||
video/x-flv flv;
|
||||
video/x-javafx fxm;
|
||||
video/x-matroska mkv;
|
||||
video/x-matroska-3d mk3d;
|
||||
video/x-ms-asf asx;
|
||||
video/x-ms-wm wm;
|
||||
video/x-ms-wmv wmv;
|
||||
video/x-ms-wmx wmx;
|
||||
video/x-ms-wvx wvx;
|
||||
video/x-msvideo avi;
|
||||
video/x-sgi-movie movie;
|
||||
x-conference/x-cooltalk ice;
|
||||
x-epoc/x-sisx-app sisx;
|
||||
}
|
||||
@ -1,79 +0,0 @@
|
||||
worker_processes 4;
|
||||
|
||||
# error_log /tmp/kvmd-nginx.error.log;
|
||||
error_log stderr;
|
||||
|
||||
include /usr/share/kvmd/extras/*/nginx.ctx-main.conf;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
use epoll;
|
||||
multi_accept on;
|
||||
}
|
||||
|
||||
http {
|
||||
types_hash_max_size 4096;
|
||||
server_names_hash_bucket_size 128;
|
||||
|
||||
access_log off;
|
||||
|
||||
include /etc/kvmd/nginx/mime-types.conf;
|
||||
default_type application/octet-stream;
|
||||
charset utf-8;
|
||||
|
||||
sendfile on;
|
||||
tcp_nodelay on;
|
||||
tcp_nopush on;
|
||||
keepalive_timeout 10;
|
||||
client_max_body_size 4k;
|
||||
|
||||
client_body_temp_path /tmp/kvmd-nginx/client_body_temp;
|
||||
fastcgi_temp_path /tmp/kvmd-nginx/fastcgi_temp;
|
||||
proxy_temp_path /tmp/kvmd-nginx/proxy_temp;
|
||||
scgi_temp_path /tmp/kvmd-nginx/scgi_temp;
|
||||
uwsgi_temp_path /tmp/kvmd-nginx/uwsgi_temp;
|
||||
|
||||
include /etc/kvmd/nginx/kvmd.ctx-http.conf;
|
||||
include /usr/share/kvmd/extras/*/nginx.ctx-http.conf;
|
||||
|
||||
% if https_enabled:
|
||||
|
||||
server {
|
||||
listen ${http_ipv4}:${http_port};
|
||||
% if ipv6_enabled:
|
||||
listen [${http_ipv6}]:${http_port};
|
||||
% endif
|
||||
include /etc/kvmd/nginx/certbot.ctx-server.conf;
|
||||
location / {
|
||||
% if https_port == 443:
|
||||
return 301 https://$host$request_uri;
|
||||
% else:
|
||||
return 301 https://$host:${https_port}$request_uri;
|
||||
% endif
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
listen ${https_ipv4}:${https_port} ssl;
|
||||
% if ipv6_enabled:
|
||||
listen [${https_ipv6}]:${https_port} ssl;
|
||||
% endif
|
||||
include /etc/kvmd/nginx/ssl.conf;
|
||||
include /etc/kvmd/nginx/kvmd.ctx-server.conf;
|
||||
include /usr/share/kvmd/extras/*/nginx.ctx-server.conf;
|
||||
}
|
||||
|
||||
% else:
|
||||
|
||||
server {
|
||||
listen ${http_ipv4}:${http_port};
|
||||
% if ipv6_enabled:
|
||||
listen [${http_ipv6}]:${http_port};
|
||||
% endif
|
||||
include /etc/kvmd/nginx/certbot.ctx-server.conf;
|
||||
include /etc/kvmd/nginx/kvmd.ctx-server.conf;
|
||||
include /usr/share/kvmd/extras/*/nginx.ctx-server.conf;
|
||||
}
|
||||
|
||||
% endif
|
||||
}
|
||||
@ -1,5 +0,0 @@
|
||||
ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
|
||||
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
|
||||
ssl_certificate /etc/kvmd/nginx/ssl/server.crt;
|
||||
ssl_certificate_key /etc/kvmd/nginx/ssl/server.key;
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||
@ -1,7 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=128
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743,i2c_pins_28_29=1
|
||||
@ -1,8 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=128
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743
|
||||
dtoverlay=disable-bt
|
||||
@ -1,8 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=96
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743,i2c_pins_28_29=1
|
||||
dtoverlay=disable-bt
|
||||
@ -1,6 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=16
|
||||
enable_uart=1
|
||||
@ -1,7 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=16
|
||||
enable_uart=1
|
||||
dtoverlay=disable-bt
|
||||
@ -1,7 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=16
|
||||
enable_uart=1
|
||||
dtoverlay=disable-bt
|
||||
@ -1,8 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=128
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743,i2c_pins_28_29=1
|
||||
dtoverlay=spi0-1cs
|
||||
@ -1,9 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=128
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=spi0-1cs
|
||||
@ -1,9 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=96
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743,i2c_pins_28_29=1
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=spi0-1cs
|
||||
@ -1,7 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=16
|
||||
enable_uart=1
|
||||
dtoverlay=spi0-1cs
|
||||
@ -1,8 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=16
|
||||
enable_uart=1
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=spi0-1cs
|
||||
@ -1,8 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=16
|
||||
enable_uart=1
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=spi0-1cs
|
||||
@ -1,9 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=128
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=dwc2,dr_mode=peripheral
|
||||
@ -1,9 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=128
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=dwc2,dr_mode=peripheral
|
||||
@ -1,9 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=96
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743,i2c_pins_28_29=1
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=dwc2,dr_mode=peripheral
|
||||
@ -1,8 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=16
|
||||
enable_uart=1
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=dwc2,dr_mode=peripheral
|
||||
@ -1,22 +0,0 @@
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=128
|
||||
enable_uart=1
|
||||
dtoverlay=tc358743
|
||||
dtoverlay=disable-bt
|
||||
dtoverlay=dwc2,dr_mode=peripheral
|
||||
dtparam=act_led_gpio=13
|
||||
|
||||
# HDMI audio capture
|
||||
dtoverlay=tc358743-audio
|
||||
|
||||
# SPI (AUM)
|
||||
dtoverlay=spi0-1cs
|
||||
|
||||
# I2C (display)
|
||||
dtparam=i2c_arm=on
|
||||
|
||||
# Clock
|
||||
dtoverlay=i2c-rtc,pcf8563,wakeup-source
|
||||
@ -1,21 +0,0 @@
|
||||
# PiKVM
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=128
|
||||
enable_uart=1
|
||||
dtoverlay=disable-bt
|
||||
|
||||
# USB emulation
|
||||
dtoverlay=dwc2,dr_mode=peripheral
|
||||
|
||||
# Video and audio
|
||||
dtoverlay=tc358743,4lane=1
|
||||
dtoverlay=tc358743-audio
|
||||
|
||||
# I2C (display)
|
||||
dtparam=i2c_arm=on
|
||||
|
||||
# Clock
|
||||
dtoverlay=i2c-rtc,pcf8563,wakeup-source
|
||||
@ -1,29 +0,0 @@
|
||||
# PiKVM
|
||||
# See /boot/overlays/README for all available options
|
||||
initramfs initramfs-linux.img followkernel
|
||||
|
||||
hdmi_force_hotplug=1
|
||||
gpu_mem=192
|
||||
enable_uart=1
|
||||
dtoverlay=disable-bt
|
||||
|
||||
# USB emulation
|
||||
dtoverlay=dwc2,dr_mode=peripheral
|
||||
|
||||
# Video and audio
|
||||
dtoverlay=tc358743,4lane=1
|
||||
dtoverlay=tc358743-audio
|
||||
|
||||
# Passthrough
|
||||
dtoverlay=vc4-kms-v3d
|
||||
disable_overscan=1
|
||||
|
||||
# I2C (display)
|
||||
dtparam=i2c_arm=on
|
||||
|
||||
# Clock
|
||||
dtoverlay=i2c-rtc,pcf8563,wakeup-source
|
||||
|
||||
# Passthrough
|
||||
dtoverlay=vc4-kms-v3d
|
||||
disable_overscan=1
|
||||
@ -1,5 +0,0 @@
|
||||
s/console=ttyAMA0\,115200//g
|
||||
s/kgdboc=ttyAMA0\,115200//g
|
||||
s/console=serial0\,115200//g
|
||||
s/kgdboc=serial0\,115200//g
|
||||
s/rootwait/rootwait cma=128M/g
|
||||
@ -1,5 +0,0 @@
|
||||
s/console=ttyAMA0\,115200//g
|
||||
s/kgdboc=ttyAMA0\,115200//g
|
||||
s/console=serial0\,115200//g
|
||||
s/kgdboc=serial0\,115200//g
|
||||
s/rootwait/rootwait cma=128M/g
|
||||
@ -1,5 +0,0 @@
|
||||
s/console=ttyAMA0\,115200//g
|
||||
s/kgdboc=ttyAMA0\,115200//g
|
||||
s/console=serial0\,115200//g
|
||||
s/kgdboc=serial0\,115200//g
|
||||
s/rootwait/rootwait cma=96M/g
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user