core: 支持自定义 --img

This commit is contained in:
bin456789
2026-09-06 11:31:35 +08:00
parent 6b3a341b4b
commit 7fa83f196b
+182 -154
View File
@@ -1458,15 +1458,18 @@ Continue?
if is_use_cloud_image; then if is_use_cloud_image; then
# cloud image # cloud image
# https://salsa.debian.org/cloud-team/debian-cloud-images/-/tree/master/config_space/bookworm/files/etc/default/grub.d if [ -z "$img" ]; then
# cloud 包括各种奇怪的优化,例如不显示 grub 菜单 # https://salsa.debian.org/cloud-team/debian-cloud-images/-/tree/master/config_space/bookworm/files/etc/default/grub.d
# 因此使用 nocloud # cloud 包括各种奇怪的优化,例如不显示 grub 菜单
if false; then # 因此使用 nocloud
is_virt && ci_type=genericcloud || ci_type=generic if false; then
else is_virt && ci_type=genericcloud || ci_type=generic
ci_type=nocloud else
ci_type=nocloud
fi
img=$cdimage_mirror/cloud/$codename/latest/debian-$releasever-$ci_type-$basearch_alt.qcow2
fi fi
set_osvar img "$cdimage_mirror/cloud/$codename/latest/debian-$releasever-$ci_type-$basearch_alt.qcow2" set_osvar img "$img"
else else
# 传统安装 # 传统安装
initrd_dir=dists/$codename/main/installer-$basearch_alt/current/images/netboot/debian-installer/$basearch_alt initrd_dir=dists/$codename/main/installer-$basearch_alt/current/images/netboot/debian-installer/$basearch_alt
@@ -1527,39 +1530,42 @@ Continue?
if is_use_cloud_image; then if is_use_cloud_image; then
# cloud image # cloud image
if is_in_china; then if [ -z "$img" ]; then
# 有的源没有 releases 镜像 if is_in_china; then
# https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/releases/ # 有的源没有 releases 镜像
# https://unicom.mirrors.ustc.edu.cn/ubuntu-cloud-images/releases/ # https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/releases/
# https://mirror.nju.edu.cn/ubuntu-cloud-images/releases/ # https://unicom.mirrors.ustc.edu.cn/ubuntu-cloud-images/releases/
# https://mirror.nju.edu.cn/ubuntu-cloud-images/releases/
# mirrors.cloud.tencent.com # mirrors.cloud.tencent.com
ci_mirror=https://mirror.nju.edu.cn/ubuntu-cloud-images ci_mirror=https://mirror.nju.edu.cn/ubuntu-cloud-images
else else
ci_mirror=https://cloud-images.ubuntu.com ci_mirror=https://cloud-images.ubuntu.com
fi fi
# 以下版本有 minimal 镜像 # 以下版本有 minimal 镜像
# amd64 所有 # amd64 所有
# arm64 24.04 和以上 # arm64 24.04 和以上
is_have_minimal_image() { is_have_minimal_image() {
[ "$basearch_alt" = amd64 ] || [ "${releasever%.*}" -ge 24 ] [ "$basearch_alt" = amd64 ] || [ "${releasever%.*}" -ge 24 ]
} }
basearch_img=$basearch_alt basearch_img=$basearch_alt
if [ "$basearch_alt" = amd64 ] && [ "${releasever%.*}" -ge 26 ] && is_cpu_supports_x86_64_v3; then if [ "$basearch_alt" = amd64 ] && [ "${releasever%.*}" -ge 26 ] && is_cpu_supports_x86_64_v3; then
basearch_img=amd64v3 basearch_img=amd64v3
fi fi
if [ "$minimal" = 1 ]; then if [ "$minimal" = 1 ]; then
if ! is_have_minimal_image; then if ! is_have_minimal_image; then
error_and_exit "Minimal cloud image is not available for $releasever $basearch_alt." error_and_exit "Minimal cloud image is not available for $releasever $basearch_alt."
fi
img=$ci_mirror/minimal/releases/$codename/release/ubuntu-$releasever-minimal-cloudimg-$basearch_img.img
else
# 用 codename 而不是 releasever,可减少一次跳转
img=$ci_mirror/releases/$codename/release/ubuntu-$releasever-server-cloudimg-$basearch_img.img
fi fi
set_osvar img "$ci_mirror/minimal/releases/$codename/release/ubuntu-$releasever-minimal-cloudimg-$basearch_img.img"
else
# 用 codename 而不是 releasever,可减少一次跳转
set_osvar img "$ci_mirror/releases/$codename/release/ubuntu-$releasever-server-cloudimg-$basearch_img.img"
fi fi
set_osvar img "$img"
else else
# 传统安装 # 传统安装
if is_in_china; then if is_in_china; then
@@ -1606,7 +1612,10 @@ Continue?
if is_use_cloud_image; then if is_use_cloud_image; then
# cloud image # cloud image
set_osvar img "$mirror/images/latest/Arch-Linux-x86_64-cloudimg.qcow2" if [ -z "$img" ]; then
img=$mirror/images/latest/Arch-Linux-x86_64-cloudimg.qcow2
fi
set_osvar img "$img"
else else
# 传统安装 # 传统安装
case "$basearch" in case "$basearch" in
@@ -1646,19 +1655,22 @@ Continue?
dir=releases/$basearch_alt/autobuilds dir=releases/$basearch_alt/autobuilds
if is_use_cloud_image; then if is_use_cloud_image; then
# 使用 systemd 且没有 cloud-init if [ -z "$img" ]; then
prefix=di-$basearch_alt-console # 使用 systemd 且没有 cloud-init
filename=$(curl -L $mirror/$dir/latest-$prefix.txt | grep '.qcow2' | awk '{print $1}' | grep .) prefix=di-$basearch_alt-console
file=$mirror/$dir/$filename filename=$(curl -L $mirror/$dir/latest-$prefix.txt | grep '.qcow2' | awk '{print $1}' | grep .)
test_url "$file" 'qemu' img=$mirror/$dir/$filename
set_osvar img "$file" fi
test_url "$img" 'qemu'
else else
prefix=stage3-$basearch_alt-systemd if [ -z "$img" ]; then
filename=$(curl -L $mirror/$dir/latest-$prefix.txt | grep '.tar.xz' | awk '{print $1}' | grep .) prefix=stage3-$basearch_alt-systemd
file=$mirror/$dir/$filename filename=$(curl -L $mirror/$dir/latest-$prefix.txt | grep '.tar.xz' | awk '{print $1}' | grep .)
test_url "$file" 'tar.xz' img=$mirror/$dir/$filename
set_osvar img "$file" test_url "$img" 'tar.xz'
fi
fi fi
set_osvar img "$img"
} }
setos_opensuse() { setos_opensuse() {
@@ -1674,34 +1686,37 @@ Continue?
# https://mirrors.ustc.edu.cn/opensuse/ports/aarch64/tumbleweed/appliances/ # https://mirrors.ustc.edu.cn/opensuse/ports/aarch64/tumbleweed/appliances/
# https://mirrors.tuna.tsinghua.edu.cn/opensuse/ports/aarch64/tumbleweed/appliances/ # https://mirrors.tuna.tsinghua.edu.cn/opensuse/ports/aarch64/tumbleweed/appliances/
if is_in_china; then if [ -z "$img" ]; then
mirror=https://mirror.nju.edu.cn/opensuse if is_in_china; then
else mirror=https://mirror.nju.edu.cn/opensuse
mirror=https://downloadcontentcdn.opensuse.org
fi
if [ "$releasever" = tumbleweed ]; then
# tumbleweed
if [ "$basearch" = aarch64 ]; then
dir=ports/aarch64/tumbleweed/appliances
else else
dir=tumbleweed/appliances mirror=https://downloadcontentcdn.opensuse.org
fi fi
file=openSUSE-Tumbleweed-Minimal-VM.$basearch-Cloud.qcow2
else
# leap
dir=distribution/leap/$releasever/appliances
case "$releasever" in
16.0) file=Leap-$releasever-Minimal-VM.$basearch-Cloud.qcow2 ;;
# 16.0) file=Leap-$releasever-Minimal-VM.$basearch-kvm$(if [ "$basearch" = x86_64 ]; then echo '-and-xen'; fi).qcow2 ;;
esac
# https://src.opensuse.org/openSUSE/Leap-Images/src/branch/leap-16.0/kiwi-templates-Minimal/Minimal.kiwi if [ "$releasever" = tumbleweed ]; then
# https://build.opensuse.org/projects/Virtualization:Appliances:Images:openSUSE-Tumbleweed/packages/kiwi-templates-Minimal/files/Minimal.kiwi # tumbleweed
# 有专门的kvm镜像,openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2,里面没有cloud-init if [ "$basearch" = aarch64 ]; then
# file=openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2 dir=ports/aarch64/tumbleweed/appliances
else
dir=tumbleweed/appliances
fi
file=openSUSE-Tumbleweed-Minimal-VM.$basearch-Cloud.qcow2
else
# leap
dir=distribution/leap/$releasever/appliances
case "$releasever" in
16.0) file=Leap-$releasever-Minimal-VM.$basearch-Cloud.qcow2 ;;
# 16.0) file=Leap-$releasever-Minimal-VM.$basearch-kvm$(if [ "$basearch" = x86_64 ]; then echo '-and-xen'; fi).qcow2 ;;
esac
# https://src.opensuse.org/openSUSE/Leap-Images/src/branch/leap-16.0/kiwi-templates-Minimal/Minimal.kiwi
# https://build.opensuse.org/projects/Virtualization:Appliances:Images:openSUSE-Tumbleweed/packages/kiwi-templates-Minimal/files/Minimal.kiwi
# 有专门的kvm镜像,openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2,里面没有cloud-init
# file=openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2
fi
img=$mirror/$dir/$file
fi fi
set_osvar img "$mirror/$dir/$file" set_osvar img "$img"
} }
setos_windows() { setos_windows() {
@@ -1887,18 +1902,20 @@ Continue with DD?
} }
setos_aosc() { setos_aosc() {
if is_in_china; then if [ -z "$img" ]; then
mirror=https://mirror.nju.edu.cn/anthon/aosc-os if is_in_china; then
else mirror=https://mirror.nju.edu.cn/anthon/aosc-os
# 服务器在香港 else
mirror=https://releases.aosc.io # 服务器在香港
fi mirror=https://releases.aosc.io
fi
dir=os-$basearch_alt/base dir=os-$basearch_alt/base
file=$(curl -L $mirror/$dir/ | grep -oP 'aosc-os_base_.*?\.tar.xz' | file=$(curl -L $mirror/$dir/ | grep -oP 'aosc-os_base_.*?\.tar.xz' |
sort -uV | tail -1 | grep .) sort -uV | tail -1 | grep .)
img=$mirror/$dir/$file img=$mirror/$dir/$file
test_url $img 'tar.xz' fi
test_url "$img" 'tar.xz'
set_osvar img "$img" set_osvar img "$img"
} }
@@ -1919,52 +1936,53 @@ Continue with DD?
if is_use_cloud_image; then if is_use_cloud_image; then
# ci # ci
if is_in_china; then if [ -z "$img" ]; then
if is_in_china; then
case $distro in
centos) ci_mirror="https://mirror.nju.edu.cn/centos-cloud/centos" ;;
almalinux) ci_mirror="https://mirror.nju.edu.cn/almalinux/$releasever/cloud/$elarch/images" ;;
rocky) ci_mirror="https://mirror.nju.edu.cn/rocky/$releasever/images/$elarch" ;;
fedora) ci_mirror="https://mirror.nju.edu.cn/fedora/releases/$releasever/Cloud/$elarch/images" ;;
esac
else
case $distro in
centos) ci_mirror="https://cloud.centos.org/centos" ;;
almalinux) ci_mirror="https://repo.almalinux.org/almalinux/$releasever/cloud/$elarch/images" ;;
rocky) ci_mirror="https://download.rockylinux.org/pub/rocky/$releasever/images/$elarch" ;;
fedora) ci_mirror="https://d2lzkl7pfhq30w.cloudfront.net/pub/fedora/linux/releases/$releasever/Cloud/$elarch/images" ;;
esac
fi
case $distro in case $distro in
centos) ci_mirror="https://mirror.nju.edu.cn/centos-cloud/centos" ;; centos)
almalinux) ci_mirror="https://mirror.nju.edu.cn/almalinux/$releasever/cloud/$elarch/images" ;; case $releasever in
rocky) ci_mirror="https://mirror.nju.edu.cn/rocky/$releasever/images/$elarch" ;; 7)
fedora) ci_mirror="https://mirror.nju.edu.cn/fedora/releases/$releasever/Cloud/$elarch/images" ;; # CentOS-7-aarch64-GenericCloud.qcow2c 是旧版本
esac ver=-2211
else img=$ci_mirror/$releasever/images/CentOS-$releasever-$elarch-GenericCloud$ver.qcow2c
case $distro in ;;
centos) ci_mirror="https://cloud.centos.org/centos" ;; *)
almalinux) ci_mirror="https://repo.almalinux.org/almalinux/$releasever/cloud/$elarch/images" ;; # 有 bios 和 efi 镜像
rocky) ci_mirror="https://download.rockylinux.org/pub/rocky/$releasever/images/$elarch" ;; # https://cloud.centos.org/centos/10-stream/x86_64/images/CentOS-Stream-GenericCloud-10-latest.x86_64.qcow2
fedora) ci_mirror="https://d2lzkl7pfhq30w.cloudfront.net/pub/fedora/linux/releases/$releasever/Cloud/$elarch/images" ;; # https://cloud.centos.org/centos/10-stream/x86_64/images/CentOS-Stream-GenericCloud-x86_64-10-latest.x86_64.qcow2
[ "$elarch" = x86_64 ] &&
img=$ci_mirror/$releasever-stream/$elarch/images/CentOS-Stream-GenericCloud-x86_64-$releasever-latest.$elarch.qcow2 ||
img=$ci_mirror/$releasever-stream/$elarch/images/CentOS-Stream-GenericCloud-$releasever-latest.$elarch.qcow2
;;
esac
;;
almalinux) img=$ci_mirror/AlmaLinux-$releasever-GenericCloud-latest.$elarch.qcow2 ;;
rocky) img=$ci_mirror/Rocky-$releasever-GenericCloud-Base.latest.$elarch.qcow2 ;;
fedora)
# 不加 / 会跳转到 https://dl.fedoraproject.org,纯 ipv6 无法访问
# curl -L -6 https://d2lzkl7pfhq30w.cloudfront.net/pub/fedora/linux/releases/42/Cloud/x86_64/images
# curl -L -6 https://d2lzkl7pfhq30w.cloudfront.net/pub/fedora/linux/releases/42/Cloud/x86_64/images/
filename=$(curl -L $ci_mirror/ | grep -oP "Fedora-Cloud-Base-Generic.*?.qcow2" |
sort -uV | tail -1 | grep .)
img=$ci_mirror/$filename
;;
esac esac
fi fi
case $distro in set_osvar img "$img"
centos)
case $releasever in
7)
# CentOS-7-aarch64-GenericCloud.qcow2c 是旧版本
ver=-2211
ci_image=$ci_mirror/$releasever/images/CentOS-$releasever-$elarch-GenericCloud$ver.qcow2c
;;
*)
# 有 bios 和 efi 镜像
# https://cloud.centos.org/centos/10-stream/x86_64/images/CentOS-Stream-GenericCloud-10-latest.x86_64.qcow2
# https://cloud.centos.org/centos/10-stream/x86_64/images/CentOS-Stream-GenericCloud-x86_64-10-latest.x86_64.qcow2
[ "$elarch" = x86_64 ] &&
ci_image=$ci_mirror/$releasever-stream/$elarch/images/CentOS-Stream-GenericCloud-x86_64-$releasever-latest.$elarch.qcow2 ||
ci_image=$ci_mirror/$releasever-stream/$elarch/images/CentOS-Stream-GenericCloud-$releasever-latest.$elarch.qcow2
;;
esac
;;
almalinux) ci_image=$ci_mirror/AlmaLinux-$releasever-GenericCloud-latest.$elarch.qcow2 ;;
rocky) ci_image=$ci_mirror/Rocky-$releasever-GenericCloud-Base.latest.$elarch.qcow2 ;;
fedora)
# 不加 / 会跳转到 https://dl.fedoraproject.org,纯 ipv6 无法访问
# curl -L -6 https://d2lzkl7pfhq30w.cloudfront.net/pub/fedora/linux/releases/42/Cloud/x86_64/images
# curl -L -6 https://d2lzkl7pfhq30w.cloudfront.net/pub/fedora/linux/releases/42/Cloud/x86_64/images/
filename=$(curl -L $ci_mirror/ | grep -oP "Fedora-Cloud-Base-Generic.*?.qcow2" |
sort -uV | tail -1 | grep .)
ci_image=$ci_mirror/$filename
;;
esac
set_osvar img "$ci_image"
else else
# 传统安装 # 传统安装
case $distro in case $distro in
@@ -2006,18 +2024,19 @@ Continue with DD?
if is_use_cloud_image; then if is_use_cloud_image; then
# ci # ci
install_pkg jq if [ -z "$img" ]; then
mirror=https://yum.oracle.com install_pkg jq
mirror=https://yum.oracle.com
[ "$basearch" = aarch64 ] && [ "$basearch" = aarch64 ] &&
template_prefix=ol${releasever}_${basearch}-cloud || template_prefix=ol${releasever}_${basearch}-cloud ||
template_prefix=ol${releasever} template_prefix=ol${releasever}
curl -Lo $tmp/oracle.json $mirror/templates/OracleLinux/$template_prefix-template.json curl -Lo $tmp/oracle.json $mirror/templates/OracleLinux/$template_prefix-template.json
dir=$(jq -r .base_url $tmp/oracle.json) dir=$(jq -r .base_url $tmp/oracle.json)
file=$(jq -r .kvm.image $tmp/oracle.json) file=$(jq -r .kvm.image $tmp/oracle.json)
ci_image=$mirror$dir/$file img=$mirror$dir/$file
fi
set_osvar img "$ci_image" set_osvar img "$img"
else else
: :
fi fi
@@ -2046,15 +2065,18 @@ Continue with DD?
if is_use_cloud_image; then if is_use_cloud_image; then
# ci # ci
if [ "$releasever" -eq 9 ]; then if [ -z "$img" ]; then
dir=$releasever/images/qcow2/$basearch if [ "$releasever" -eq 9 ]; then
else dir=$releasever/images/qcow2/$basearch
dir=$releasever/images/$basearch else
fi dir=$releasever/images/$basearch
fi
file=$(curl -L $mirror/$dir/ | grep -oP 'OpenCloudOS.*?\.qcow2' | file=$(curl -L $mirror/$dir/ | grep -oP 'OpenCloudOS.*?\.qcow2' |
sort -uV | tail -1 | grep .) sort -uV | tail -1 | grep .)
set_osvar img "$mirror/$dir/$file" img=$mirror/$dir/$file
fi
set_osvar img "$img"
else else
: :
fi fi
@@ -2064,13 +2086,16 @@ Continue with DD?
mirror=https://mirrors.openanolis.cn/anolis mirror=https://mirrors.openanolis.cn/anolis
if is_use_cloud_image; then if is_use_cloud_image; then
# ci # ci
dir=$releasever/isos/GA/$basearch if [ -z "$img" ]; then
[ "$releasever" -ge 23 ] && dir=$releasever/isos/GA/$basearch
filename='AnolisOS.*?\.qcow2' || [ "$releasever" -ge 23 ] &&
filename='AnolisOS.*?-ANCK\.qcow2' filename='AnolisOS.*?\.qcow2' ||
file=$(curl -L $mirror/$dir/ | grep -oP "$filename" | filename='AnolisOS.*?-ANCK\.qcow2'
sort -uV | tail -1 | grep .) file=$(curl -L $mirror/$dir/ | grep -oP "$filename" |
set_osvar img "$mirror/$dir/$file" sort -uV | tail -1 | grep .)
img=$mirror/$dir/$file
fi
set_osvar img "$img"
else else
: :
fi fi
@@ -2084,9 +2109,12 @@ Continue with DD?
fi fi
if is_use_cloud_image; then if is_use_cloud_image; then
# ci # ci
name=$(curl -L "$mirror/" | grep -oE "openEuler-$releasever(-LTS)?(-SP[0-9])?" | if [ -z "$img" ]; then
sort -uV | tail -1 | grep .) name=$(curl -L "$mirror/" | grep -oE "openEuler-$releasever(-LTS)?(-SP[0-9])?" |
set_osvar img "$mirror/$name/virtual_machine_img/$basearch/$name-$basearch.qcow2.xz" sort -uV | tail -1 | grep .)
img=$mirror/$name/virtual_machine_img/$basearch/$name-$basearch.qcow2.xz
fi
set_osvar img "$img"
else else
: :
fi fi