Skip to content

Commit 9f7bebd

Browse files
committed
fix
1 parent 56c2e6c commit 9f7bebd

File tree

2 files changed

+98
-88
lines changed

2 files changed

+98
-88
lines changed

README.md

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,16 @@ chmod +x onevm.sh
5555

5656
| 系统标识 | 说明 | 镜像来源 |
5757
|----------|------|----------|
58-
| `ubuntu` | Ubuntu 22.04 LTS | pve_kvm_images → kvm_images(ubuntu22) → 官方 |
59-
| `debian` | Debian 12 | pve_kvm_images → kvm_images(debian12) → 官方 |
60-
| `debian11` | Debian 11 | pve_kvm_images → kvm_images(debian11) → 官方 |
61-
| `almalinux` | AlmaLinux 9 | pve_kvm_images → kvm_images(almalinux8) → 官方 |
62-
| `rockylinux` | RockyLinux 9 | pve_kvm_images → kvm_images(rockylinux8) → 官方 |
63-
| `centos` | CentOS 7 | pve_kvm_images → kvm_images(centos7) → 官方 |
64-
| `centos8-stream` | CentOS Stream 8 | pve_kvm_images → kvm_images → 官方 |
65-
| `centos-stream` | CentOS Stream 9 | pve_kvm_images → 官方 |
66-
| `opensuse` | openSUSE Leap 15.5 | pve_kvm_images → kvm_images(opensuse-leap-15) → 官方 |
67-
68-
> 镜像来源优先级:
69-
> 1. `oneclickvirt/pve_kvm_images` releases(最新编译版)
70-
> 2. `oneclickvirt/kvm_images` releases(稳定版)
71-
> 3. 官方上游地址(最终兜底)
72-
>
73-
> 下载均支持 CDN 加速(`cdn0.spiritlhl.top` 等),网络不佳时自动检测并启用。
58+
| `ubuntu` | Ubuntu 22.04 LTS | pve_kvm_images(ubuntu22) → kvm_images(ubuntu22) → 官方 |
59+
| `ubuntu24` | Ubuntu 24.04 LTS | pve_kvm_images(ubuntu22) → kvm_images(ubuntu22) → 官方 |
60+
| `debian` | Debian 12 | pve_kvm_images(debian12) → kvm_images(debian12) → 官方 |
61+
| `debian11` | Debian 11 | pve_kvm_images(debian11) → kvm_images(debian11) → 官方 |
62+
| `almalinux` | AlmaLinux 9 | pve_kvm_images(almalinux9) → kvm_images(almalinux9) → 官方 |
63+
| `rockylinux` | RockyLinux 9 | pve_kvm_images(rockylinux9) → kvm_images(rockylinux9) → 官方 |
64+
| `centos` | CentOS 7 | pve_kvm_images(centos7) → kvm_images(centos7) → 官方 |
65+
| `centos8-stream` | CentOS Stream 8 | pve_kvm_images(centos8-stream) → kvm_images(centos8-stream) → 官方 |
66+
| `centos-stream` | CentOS Stream 9 | 官方上游(无组织预置镜像) |
67+
| `opensuse` | openSUSE Leap 15.5 | pve_kvm_images(opensuse-leap-15) → kvm_images(opensuse-leap-15) → 官方 |
7468

7569
**示例:**
7670

scripts/onevm.sh

Lines changed: 88 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -135,111 +135,132 @@ _url_accessible() {
135135
curl -sfI --max-time 12 --retry 1 "$url" >/dev/null 2>&1
136136
}
137137

138-
# 从 oneclickvirt/pve_kvm_images releases 中查找最佳匹配镜像
139-
# 参数: $1=搜索关键词(grep -i 模式),结果写入 IMAGE_URL
138+
# ===== 获取 oneclickvirt 组织镜像版本标识映射 =====
139+
# 参数: $1=标准化后的系统名,返回对应的 org 镜像版本字符串
140+
get_org_image_ver() {
141+
local sys="$1"
142+
case "$sys" in
143+
ubuntu) echo "ubuntu22" ;;
144+
debian) echo "debian12" ;;
145+
debian11) echo "debian11" ;;
146+
almalinux) echo "almalinux9" ;;
147+
rockylinux) echo "rockylinux9" ;;
148+
centos) echo "centos7" ;;
149+
centos8-stream) echo "centos8-stream" ;;
150+
opensuse) echo "opensuse-leap-15" ;;
151+
*) echo "" ;;
152+
esac
153+
}
154+
155+
# 尝试从 oneclickvirt/pve_kvm_images 获取镜像 URL(最高优先级)
156+
# 直接按已知 URL 模式尝试,不依赖 GitHub API
157+
# 参数: $1=版本标识(如 debian12),$2=系统分类(如 debian),结果写入 IMAGE_URL
140158
_find_in_pve_kvm_images() {
141-
local pattern="$1"
142-
local api_url="https://api.github.com/repos/oneclickvirt/pve_kvm_images/releases/tags/images"
143-
local api_json
144-
145-
_info "查询 pve_kvm_images releases..."
146-
api_json=$(curl -sL --max-time 15 "$api_url" 2>/dev/null)
147-
[ -z "$api_json" ] && return 1
148-
149-
# 从 JSON 中提取所有 .qcow2 资产名(兼容无 jq 环境)
150-
local names
151-
names=$(echo "$api_json" | grep -oP '"name":\s*"\K[^"]+\.qcow2' 2>/dev/null || \
152-
echo "$api_json" | python3 -c \
153-
"import sys,json; d=json.load(sys.stdin); [print(a['name']) for a in d.get('assets',[]) if a['name'].endswith('.qcow2')]" 2>/dev/null)
154-
[ -z "$names" ] && return 1
155-
156-
# 优先选含 cloud 的,再按版本号从高到低排序取第一
157-
local best
158-
best=$(echo "$names" | grep -i "$pattern" | grep -i "cloud" | sort -V | tail -1)
159-
[ -z "$best" ] && best=$(echo "$names" | grep -i "$pattern" | sort -V | tail -1)
160-
[ -z "$best" ] && return 1
161-
162-
local base_url="https://github.com/oneclickvirt/pve_kvm_images/releases/download/images/${best}"
163-
IMAGE_URL="${CDN_PREFIX}${base_url}"
164-
_info "pve_kvm_images 中找到镜像:$best"
165-
return 0
159+
local ver="$1"
160+
local sys="$2"
161+
162+
_info "尝试 oneclickvirt/pve_kvm_images for ${ver}..."
163+
local candidate_urls=(
164+
"https://github.com/oneclickvirt/pve_kvm_images/releases/download/images/${ver}.qcow2"
165+
"https://github.com/oneclickvirt/pve_kvm_images/releases/download/${sys}/${ver}.qcow2"
166+
)
167+
168+
for base_url in "${candidate_urls[@]}"; do
169+
_info " 尝试: ${base_url}"
170+
local try_url="${CDN_PREFIX}${base_url}"
171+
if _url_accessible "$try_url"; then
172+
IMAGE_URL="$try_url"
173+
_info "pve_kvm_images 中找到镜像 (CDN):${base_url##*/}"
174+
return 0
175+
fi
176+
if _url_accessible "$base_url"; then
177+
IMAGE_URL="$base_url"
178+
_info "pve_kvm_images 中找到镜像 (直连):${base_url##*/}"
179+
return 0
180+
fi
181+
done
182+
return 1
166183
}
167184

168-
# 从 oneclickvirt/kvm_images releases 下载(已知版本映射)
169-
# 参数: $1=系统名(如 debian12),$2=版本 tag(如 v2.0)
185+
# 尝试从 oneclickvirt/kvm_images 获取镜像 URL(第二优先级)
186+
# release tag 与文件名均为版本标识,如 debian12/debian12.qcow2
187+
# 参数: $1=版本标识(如 debian12),结果写入 IMAGE_URL
170188
_find_in_kvm_images() {
171-
local sysname="$1"
172-
local ver="$2"
173-
local base_url="https://github.com/oneclickvirt/kvm_images/releases/download/${ver}/${sysname}.qcow2"
189+
local ver="$1"
190+
191+
_info "尝试 oneclickvirt/kvm_images for ${ver}..."
192+
local base_url="https://github.com/oneclickvirt/kvm_images/releases/download/${ver}/${ver}.qcow2"
174193
local try_url="${CDN_PREFIX}${base_url}"
175194

176-
if _url_accessible "$try_url" || _url_accessible "$base_url"; then
195+
if _url_accessible "$try_url"; then
177196
IMAGE_URL="$try_url"
178-
_info "kvm_images ${ver} 中找到镜像:${sysname}.qcow2"
197+
_info "kvm_images 中找到镜像 (CDN):${ver}.qcow2"
198+
return 0
199+
fi
200+
if _url_accessible "$base_url"; then
201+
IMAGE_URL="$base_url"
202+
_info "kvm_images 中找到镜像 (直连):${ver}.qcow2"
179203
return 0
180204
fi
181205
return 1
182206
}
183207

184-
# ===== 获取云镜像 URL(优先 oneclickvirt 组织镜像,不存在再用官方源) =====
208+
# ===== 获取云镜像 URL =====
209+
# 优先顺序:oneclickvirt/pve_kvm_images → oneclickvirt/kvm_images → 官方上游
185210
get_image_url() {
186-
# 确定 IMAGE_OS 和各层备选方案
187-
local pve_pattern kvm_name kvm_ver official_url
188211
IMAGE_URL=""
212+
local official_url org_ver
189213

214+
# 标准化系统名,设置 IMAGE_OS 和官方上游回退 URL
190215
case "$SYSTEM" in
191-
ubuntu|ubuntu2204|ubuntu22|ubuntu24)
216+
ubuntu|ubuntu2204|ubuntu22)
192217
IMAGE_OS="ubuntu"
193-
pve_pattern="ubuntu"
194-
kvm_name="ubuntu22"; kvm_ver="v2.0"
218+
SYSTEM="ubuntu"
195219
official_url="https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
196220
;;
221+
ubuntu24|ubuntu2404)
222+
IMAGE_OS="ubuntu"
223+
SYSTEM="ubuntu"
224+
official_url="https://cloud-images.ubuntu.com/minimal/releases/noble/release/ubuntu-24.04-minimal-cloudimg-amd64.img"
225+
;;
197226
debian|debian12)
198227
IMAGE_OS="debian"
199-
pve_pattern="debian-12\|debian12"
200-
kvm_name="debian12"; kvm_ver="v2.0"
228+
SYSTEM="debian"
201229
official_url="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2"
202230
;;
203231
debian11)
204232
IMAGE_OS="debian"
205-
pve_pattern="debian-11\|debian11"
206-
kvm_name="debian11"; kvm_ver="v2.0"
233+
SYSTEM="debian11"
207234
official_url="https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-genericcloud-amd64.qcow2"
208235
;;
209236
almalinux|alma|almalinux9)
210237
IMAGE_OS="almalinux"
211-
pve_pattern="alma"
212-
kvm_name="almalinux8"; kvm_ver="v2.0"
238+
SYSTEM="almalinux"
213239
official_url="https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2"
214240
;;
215241
rockylinux|rocky|rockylinux9)
216242
IMAGE_OS="rockylinux"
217-
pve_pattern="rocky"
218-
kvm_name="rockylinux8"; kvm_ver="v2.0"
219-
official_url="https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud.latest.x86_64.qcow2"
243+
SYSTEM="rockylinux"
244+
official_url="https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2"
220245
;;
221246
centos|centos7)
222247
IMAGE_OS="centos"
223-
pve_pattern="centos"
224-
kvm_name="centos7"; kvm_ver="v2.0"
248+
SYSTEM="centos"
225249
official_url="https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2"
226250
;;
227251
centos8|centos8-stream|centos-stream8)
228252
IMAGE_OS="centos"
229-
pve_pattern="centos.*8\|centos8"
230-
kvm_name="centos8-stream"; kvm_ver="v2.0"
253+
SYSTEM="centos8-stream"
231254
official_url="https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-latest.x86_64.qcow2"
232255
;;
233256
centos9|centosstream9|centos-stream|centos-stream9)
234257
IMAGE_OS="centos"
235-
pve_pattern="centos.*9\|centos9"
236-
kvm_name="centos8-stream"; kvm_ver="v2.0"
258+
SYSTEM="centos9-stream"
237259
official_url="https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2"
238260
;;
239261
opensuse|suse|opensuse15|opensuselap|opensuse-leap)
240262
IMAGE_OS="opensuse"
241-
pve_pattern="opensuse\|suse\|leap"
242-
kvm_name="opensuse-leap-15"; kvm_ver="v1.0"
263+
SYSTEM="opensuse"
243264
official_url="https://download.opensuse.org/distribution/leap/15.5/appliances/openSUSE-Leap-15.5-Minimal-VM.x86_64-Cloud.qcow2"
244265
;;
245266
*)
@@ -250,31 +271,26 @@ get_image_url() {
250271
# 检测 CDN 可用性
251272
check_cdn || true
252273

253-
_step "解析镜像地址(优先 oneclickvirt 组织镜像)..."
274+
_step "解析镜像地址(优先顺序:pve_kvm_images → kvm_images → 官方上游)..."
254275

255-
# 第1优先:pve_kvm_images releases(最新版本)
256-
if _find_in_pve_kvm_images "$pve_pattern"; then
257-
_info "使用来源:oneclickvirt/pve_kvm_images [releases]"
258-
_info "镜像地址:$IMAGE_URL"
259-
return 0
260-
fi
276+
# 获取组织镜像版本标识
277+
org_ver=$(get_org_image_ver "$SYSTEM")
261278

262-
# 第2优先:kvm_images releases(已知系统版本映射
263-
if [ -n "$kvm_name" ] && _find_in_kvm_images "$kvm_name" "$kvm_ver"; then
264-
_info "使用来源:oneclickvirt/kvm_images [${kvm_ver}]"
279+
# 第1优先:pve_kvm_images(直接按已知 URL 模式,不调用 GitHub API
280+
if [ -n "$org_ver" ] && _find_in_pve_kvm_images "$org_ver" "$IMAGE_OS"; then
281+
_info "使用来源:oneclickvirt/pve_kvm_images"
265282
_info "镜像地址:$IMAGE_URL"
266283
return 0
267284
fi
268285

269-
# centos8-stream 特殊备用地址
270-
if [ "$IMAGE_OS" = "centos" ] && _url_accessible "https://api.ilolicon.com/centos8-stream.qcow2"; then
271-
IMAGE_URL="https://api.ilolicon.com/centos8-stream.qcow2"
272-
_info "使用来源:ilolicon [centos8-stream]"
286+
# 第2优先:kvm_images(release tag 与文件名均为版本标识)
287+
if [ -n "$org_ver" ] && _find_in_kvm_images "$org_ver"; then
288+
_info "使用来源:oneclickvirt/kvm_images"
273289
_info "镜像地址:$IMAGE_URL"
274290
return 0
275291
fi
276292

277-
# 最终回退:官方上游地址
293+
# 最终回退:官方上游地址(兜底)
278294
_warn "oneclickvirt 镜像源均不可用,回退到官方上游地址"
279295
IMAGE_URL="$official_url"
280296
_info "使用来源:官方上游"

0 commit comments

Comments
 (0)