@@ -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 → 官方上游
185210get_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