Skip to content

Commit 3235f81

Browse files
committed
fix:整体优化
1 parent fff7384 commit 3235f81

9 files changed

Lines changed: 415 additions & 188 deletions

File tree

README.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
- 使用 KubeVirt 提供虚拟机能力(基于 KVM/QEMU)
1313
- 使用 CDI(Containerized Data Importer)导入云镜像
1414
- 通过 NodePort Service + iptables DNAT 实现端口映射
15-
- 支持系统:Ubuntu 22.04, Debian 12, AlmaLinux 9, RockyLinux 9, CentOS Stream 9, openSUSE Leap 15.5
15+
- 支持系统:Ubuntu 22.04/24.04, Debian 11/12, AlmaLinux 9, RockyLinux 9, CentOS 7, CentOS Stream 8/9, openSUSE Leap 15.5
1616
- 支持架构:amd64 (x86_64)
1717
- 宿主机系统支持:Ubuntu 20.04/22.04/24.04,Debian 11/12
1818

@@ -26,6 +26,7 @@
2626
## 安装 KubeVirt 环境
2727

2828
```bash
29+
export noninteractive=true
2930
bash <(curl -sSL https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/kubevirtinstall.sh)
3031
```
3132

@@ -56,7 +57,7 @@ chmod +x onevm.sh
5657
| 系统标识 | 说明 | 镜像来源 |
5758
|----------|------|----------|
5859
| `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+
| `ubuntu24` | Ubuntu 24.04 LTS | pve_kvm_images(ubuntu24) → kvm_images(ubuntu24) → 官方 |
6061
| `debian` | Debian 12 | pve_kvm_images(debian12) → kvm_images(debian12) → 官方 |
6162
| `debian11` | Debian 11 | pve_kvm_images(debian11) → kvm_images(debian11) → 官方 |
6263
| `almalinux` | AlmaLinux 9 | pve_kvm_images(almalinux9) → kvm_images(almalinux9) → 官方 |
@@ -77,6 +78,7 @@ chmod +x onevm.sh
7778
```bash
7879
curl -sSL -o create_vm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/create_vm.sh
7980
chmod +x create_vm.sh
81+
export noninteractive=true
8082
./create_vm.sh
8183
```
8284

@@ -93,12 +95,14 @@ chmod +x listvms.sh
9395
```bash
9496
curl -sSL -o deletevm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/deletevm.sh
9597
chmod +x deletevm.sh
98+
export noninteractive=true
9699
./deletevm.sh <name>
97100
```
98101

99102
## 卸载(完整清理)
100103

101104
```bash
105+
export noninteractive=true
102106
bash <(curl -sSL https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/kubevirtuninstall.sh)
103107
```
104108

@@ -157,4 +161,4 @@ virtctl restart <vmname> -n kubevirt-vms
157161
- Debian/Ubuntu 系统自动安装 `iptables-persistent``netfilter-persistent`
158162
- Red Hat/CentOS 系统自动安装 `iptables-services`
159163
- 规则变更后自动持久化,确保重启后不失效
160-
4. 如需重置密码,通过 `virtctl console` 进入控制台手动修改
164+
4. 如需重置密码,通过 `virtctl console` 进入控制台手动修改

kubevirtinstall.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
#
88
# 支持通过环境变量实现完全无交互安装:
99
#
10+
# noninteractive=true 统一无交互标记
1011
# K3S_VERSION K3s 版本 默认: v1.29.3+k3s1
1112
# KUBEVIRT_VERSION KubeVirt 版本 默认: v1.2.1
1213
# CDI_VERSION CDI 版本 默认: v1.59.0
1314
# VIRTCTL_VERSION virtctl 版本 默认: v1.2.1
1415
#
1516
# 示例(一键无交互安装):
16-
# bash kubevirtinstall.sh
17-
# KUBEVIRT_VERSION=v1.3.0 CDI_VERSION=v1.60.0 bash kubevirtinstall.sh
17+
# noninteractive=true bash kubevirtinstall.sh
18+
# noninteractive=true KUBEVIRT_VERSION=v1.3.0 CDI_VERSION=v1.60.0 bash kubevirtinstall.sh
1819
#
1920
# =====================================================================
2021

kubevirtuninstall.sh

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
#
88
# 支持通过环境变量实现完全无交互卸载:
99
#
10-
# AUTO_YES=y 跳过所有确认提示,直接执行卸载
11-
# FORCE_YES=y 同 AUTO_YES=y(兼容旧版写法)
10+
# noninteractive=true 跳过所有确认提示,直接执行卸载
11+
# AUTO_YES=y 兼容旧版写法,同 noninteractive=true
12+
# FORCE_YES=y 同 AUTO_YES=y
1213
#
1314
# 示例(一键静默卸载):
14-
# AUTO_YES=y bash kubevirtuninstall.sh
15+
# noninteractive=true bash kubevirtuninstall.sh
1516
#
1617
# =====================================================================
1718

@@ -39,9 +40,34 @@ check_root() {
3940
fi
4041
}
4142

43+
_is_truthy() {
44+
case "$(printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]')" in
45+
1|true|yes|y|on) return 0 ;;
46+
*) return 1 ;;
47+
esac
48+
}
49+
50+
_is_noninteractive() {
51+
_is_truthy "${noninteractive:-}" || \
52+
_is_truthy "${NONINTERACTIVE:-}" || \
53+
_is_truthy "${AUTO_YES:-}" || \
54+
_is_truthy "${FORCE_YES:-}"
55+
}
56+
57+
ensure_kubectl() {
58+
if command -v kubectl >/dev/null 2>&1; then
59+
return 0
60+
fi
61+
if command -v k3s >/dev/null 2>&1; then
62+
kubectl() { k3s kubectl "$@"; }
63+
return 0
64+
fi
65+
return 1
66+
}
67+
4268
# ===== 确认操作 =====
4369
confirm_uninstall() {
44-
if [ "${FORCE_YES}" = "y" ] || [ "${AUTO_YES}" = "y" ]; then
70+
if _is_noninteractive; then
4571
return 0
4672
fi
4773
echo ""
@@ -347,6 +373,7 @@ main() {
347373

348374
check_root
349375
confirm_uninstall
376+
ensure_kubectl || true
350377
stop_all_vms
351378
uninstall_kubevirt
352379
uninstall_cdi

scripts/create_vm.sh

Lines changed: 79 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717
# PORT_RANGE_SIZE 每台额外端口数量 默认: 26
1818
# EXTRA_PORT_START 额外端口起始值 默认: 35000
1919
# SYSTEM 操作系统 默认: ubuntu
20-
# AUTO_YES=y 跳过所有确认提示
20+
# noninteractive=true 跳过所有确认提示,未提供的参数使用默认值
21+
# AUTO_YES=y 兼容旧版写法,同 noninteractive=true
2122
#
2223
# 示例:
2324
# VM_COUNT=3 CPU=2 MEMORY_GB=2 DISK_GB=20 PASSWORD=MyPass123 \
2425
# SSH_START_PORT=25000 PORT_RANGE_SIZE=26 EXTRA_PORT_START=35000 \
25-
# SYSTEM=debian AUTO_YES=y bash create_vm.sh
26+
# SYSTEM=debian noninteractive=true bash create_vm.sh
2627
#
2728
# =====================================================================
2829

@@ -53,25 +54,77 @@ check_onevm_script() {
5354
ONEVM_SCRIPT="./onevm.sh"
5455
else
5556
_info "正在下载 onevm.sh..."
56-
curl -sSL -o /tmp/onevm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/onevm.sh
57+
if ! curl -fsSL -o /tmp/onevm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/onevm.sh; then
58+
_error "下载 onevm.sh 失败,请检查网络连接"
59+
fi
5760
chmod +x /tmp/onevm.sh
5861
ONEVM_SCRIPT="/tmp/onevm.sh"
5962
fi
6063
_info "使用脚本:$ONEVM_SCRIPT"
6164
}
6265

63-
# ===== 是否处于无交互模式(所有参数均由环境变量提供)=====
66+
# ===== 无交互模式判断 =====
67+
_is_truthy() {
68+
case "$(printf '%s' "${1:-}" | tr '[:upper:]' '[:lower:]')" in
69+
1|true|yes|y|on) return 0 ;;
70+
*) return 1 ;;
71+
esac
72+
}
73+
6474
_is_noninteractive() {
65-
[ "${AUTO_YES}" = "y" ] || \
75+
_is_truthy "${noninteractive:-}" || \
76+
_is_truthy "${NONINTERACTIVE:-}" || \
77+
_is_truthy "${AUTO_YES:-}" || \
78+
_is_truthy "${FORCE_YES:-}" || \
6679
( [ -n "${VM_COUNT+x}" ] && [ -n "${VM_PREFIX+x}" ] && \
6780
[ -n "${CPU+x}" ] && [ -n "${MEMORY_GB+x}" ] && \
6881
[ -n "${DISK_GB+x}" ] && [ -n "${PASSWORD+x}" ] && \
6982
[ -n "${SSH_START_PORT+x}" ] && [ -n "${SYSTEM+x}" ] )
7083
}
7184

85+
_validate_uint_range() {
86+
local name="$1" value="$2" min="$3" max="$4"
87+
if ! [[ "$value" =~ ^[0-9]+$ ]] || [ "$value" -lt "$min" ] || [ "$value" -gt "$max" ]; then
88+
_error "${name} 无效:${value}(必须在 ${min}-${max} 范围内)"
89+
fi
90+
}
91+
92+
_ranges_overlap() {
93+
local start_a="$1" end_a="$2" start_b="$3" end_b="$4"
94+
[ "$start_a" -le "$end_b" ] && [ "$start_b" -le "$end_a" ]
95+
}
96+
97+
validate_params() {
98+
_validate_uint_range "虚拟机数量" "$VM_COUNT" 1 9999
99+
_validate_uint_range "起始编号" "$START_NUM" 0 999999
100+
_validate_uint_range "CPU 核数" "$CPU" 1 256
101+
_validate_uint_range "内存" "$MEMORY_GB" 1 1048576
102+
_validate_uint_range "磁盘" "$DISK_GB" 1 1048576
103+
_validate_uint_range "SSH 起始端口" "$SSH_START_PORT" 1 65535
104+
_validate_uint_range "额外端口范围大小" "$PORT_RANGE_SIZE" 0 65535
105+
106+
local ssh_end=$((SSH_START_PORT + VM_COUNT - 1))
107+
if [ "$ssh_end" -gt 65535 ]; then
108+
_error "SSH 端口范围越界:${SSH_START_PORT}-${ssh_end}"
109+
fi
110+
111+
if [ "$PORT_RANGE_SIZE" -gt 0 ]; then
112+
_validate_uint_range "额外端口起始值" "$EXTRA_PORT_START" 1 65535
113+
local extra_end=$((EXTRA_PORT_START + VM_COUNT * PORT_RANGE_SIZE - 1))
114+
if [ "$extra_end" -gt 65535 ]; then
115+
_error "额外端口范围越界:${EXTRA_PORT_START}-${extra_end}"
116+
fi
117+
if _ranges_overlap "$SSH_START_PORT" "$ssh_end" "$EXTRA_PORT_START" "$extra_end"; then
118+
_error "SSH 端口范围 ${SSH_START_PORT}-${ssh_end} 与额外端口范围 ${EXTRA_PORT_START}-${extra_end} 重叠"
119+
fi
120+
else
121+
EXTRA_PORT_START="${EXTRA_PORT_START:-0}"
122+
fi
123+
}
124+
72125
# ===== 交互式参数收集(若环境变量已设置则使用环境变量,跳过 read)=====
73126
collect_params() {
74-
# 若 AUTO_YES=y 且所有必要变量已设置,无需打印菜单
127+
# 无交互模式下无需打印菜单
75128
if ! _is_noninteractive; then
76129
echo ""
77130
echo "======================================================"
@@ -81,7 +134,7 @@ collect_params() {
81134
fi
82135

83136
# ----- 数量 -----
84-
if [ -z "${VM_COUNT+x}" ]; then
137+
if [ -z "${VM_COUNT+x}" ] && ! _is_noninteractive; then
85138
read -rp "请输入虚拟机数量 [默认: 1]: " VM_COUNT
86139
fi
87140
VM_COUNT="${VM_COUNT:-1}"
@@ -90,7 +143,7 @@ collect_params() {
90143
fi
91144

92145
# ----- 名称前缀 -----
93-
if [ -z "${VM_PREFIX+x}" ]; then
146+
if [ -z "${VM_PREFIX+x}" ] && ! _is_noninteractive; then
94147
read -rp "请输入虚拟机名称前缀 [默认: vm]: " VM_PREFIX
95148
fi
96149
VM_PREFIX="${VM_PREFIX:-vm}"
@@ -99,31 +152,31 @@ collect_params() {
99152
fi
100153

101154
# ----- 起始编号 -----
102-
if [ -z "${START_NUM+x}" ]; then
155+
if [ -z "${START_NUM+x}" ] && ! _is_noninteractive; then
103156
read -rp "请输入起始编号 [默认: 1]: " START_NUM
104157
fi
105158
START_NUM="${START_NUM:-1}"
106159

107160
# ----- CPU -----
108-
if [ -z "${CPU+x}" ]; then
161+
if [ -z "${CPU+x}" ] && ! _is_noninteractive; then
109162
read -rp "请输入每台虚拟机 CPU 核数 [默认: 1]: " CPU
110163
fi
111164
CPU="${CPU:-1}"
112165

113166
# ----- 内存 -----
114-
if [ -z "${MEMORY_GB+x}" ]; then
167+
if [ -z "${MEMORY_GB+x}" ] && ! _is_noninteractive; then
115168
read -rp "请输入每台虚拟机内存(GB)[默认: 1]: " MEMORY_GB
116169
fi
117170
MEMORY_GB="${MEMORY_GB:-1}"
118171

119172
# ----- 磁盘 -----
120-
if [ -z "${DISK_GB+x}" ]; then
173+
if [ -z "${DISK_GB+x}" ] && ! _is_noninteractive; then
121174
read -rp "请输入每台虚拟机磁盘大小(GB)[默认: 10]: " DISK_GB
122175
fi
123176
DISK_GB="${DISK_GB:-10}"
124177

125178
# ----- 密码 -----
126-
if [ -z "${PASSWORD+x}" ]; then
179+
if [ -z "${PASSWORD+x}" ] && ! _is_noninteractive; then
127180
read -rp "请输入 root 密码 [默认: 随机生成]: " PASSWORD
128181
fi
129182
if [ -z "$PASSWORD" ]; then
@@ -133,27 +186,28 @@ collect_params() {
133186
fi
134187

135188
# ----- SSH 起始端口 -----
136-
if [ -z "${SSH_START_PORT+x}" ]; then
189+
if [ -z "${SSH_START_PORT+x}" ] && ! _is_noninteractive; then
137190
read -rp "请输入 SSH 起始端口 [默认: 25000]: " SSH_START_PORT
138191
fi
139192
SSH_START_PORT="${SSH_START_PORT:-25000}"
140193

141194
# ----- 额外端口范围大小 -----
142-
if [ -z "${PORT_RANGE_SIZE+x}" ]; then
195+
if [ -z "${PORT_RANGE_SIZE+x}" ] && ! _is_noninteractive; then
143196
read -rp "请输入每台 VM 的额外端口范围大小(0=不分配)[默认: 26]: " PORT_RANGE_SIZE
144197
fi
145198
PORT_RANGE_SIZE="${PORT_RANGE_SIZE:-26}"
199+
_validate_uint_range "额外端口范围大小" "$PORT_RANGE_SIZE" 0 65535
146200

147201
# ----- 额外端口起始值 -----
148202
if [ "$PORT_RANGE_SIZE" -gt 0 ]; then
149-
if [ -z "${EXTRA_PORT_START+x}" ]; then
203+
if [ -z "${EXTRA_PORT_START+x}" ] && ! _is_noninteractive; then
150204
read -rp "请输入额外端口起始值 [默认: 35000]: " EXTRA_PORT_START
151205
fi
152206
EXTRA_PORT_START="${EXTRA_PORT_START:-35000}"
153207
fi
154208

155209
# ----- 操作系统 -----
156-
if [ -z "${SYSTEM+x}" ]; then
210+
if [ -z "${SYSTEM+x}" ] && ! _is_noninteractive; then
157211
echo ""
158212
echo "可选操作系统:"
159213
echo " 1) ubuntu - Ubuntu 22.04 LTS"
@@ -165,12 +219,13 @@ collect_params() {
165219
echo " 7) centos8-stream - CentOS Stream 8"
166220
echo " 8) centos-stream - CentOS Stream 9"
167221
echo " 9) opensuse - openSUSE Leap 15.5"
222+
echo " 10) ubuntu24 - Ubuntu 24.04 LTS"
168223
echo ""
169224
echo " 镜像优先从 oneclickvirt/pve_kvm_images 和 oneclickvirt/kvm_images 获取"
170225
read -rp "请选择系统编号或输入系统名称 [默认: 1/ubuntu]: " SYSTEM_INPUT
171226
SYSTEM_INPUT="${SYSTEM_INPUT:-1}"
172227
else
173-
SYSTEM_INPUT="${SYSTEM}"
228+
SYSTEM_INPUT="${SYSTEM:-ubuntu}"
174229
fi
175230

176231
case "$SYSTEM_INPUT" in
@@ -183,9 +238,12 @@ collect_params() {
183238
7|centos8-stream|centos8) SYSTEM="centos8-stream" ;;
184239
8|centos-stream|centos9) SYSTEM="centos-stream" ;;
185240
9|opensuse) SYSTEM="opensuse" ;;
241+
10|ubuntu24|ubuntu2404) SYSTEM="ubuntu24" ;;
186242
*) _error "无效的系统选择:$SYSTEM_INPUT" ;;
187243
esac
188244

245+
validate_params
246+
189247
# ----- 配置预览 -----
190248
echo ""
191249
echo "======================================================"
@@ -205,7 +263,7 @@ collect_params() {
205263
echo ""
206264

207265
# ----- 最终确认 -----
208-
if [ "${AUTO_YES}" != "y" ]; then
266+
if ! _is_noninteractive; then
209267
read -rp "确认创建?(y/n): " CONFIRM
210268
if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then
211269
_info "已取消"
@@ -222,13 +280,13 @@ check_disk_space() {
222280

223281
if [ "$available_gb" -lt "$required_gb" ]; then
224282
_warn "可用磁盘空间 ${available_gb}GB 可能不足(需要约 ${required_gb}GB)"
225-
if [ "${AUTO_YES}" != "y" ]; then
283+
if ! _is_noninteractive; then
226284
read -rp "是否继续?(y/n): " cont
227285
if [ "$cont" != "y" ] && [ "$cont" != "Y" ]; then
228286
exit 0
229287
fi
230288
else
231-
_warn "AUTO_YES=y,忽略磁盘空间警告,继续执行..."
289+
_warn "noninteractive=true,忽略磁盘空间警告,继续执行..."
232290
fi
233291
fi
234292
}

0 commit comments

Comments
 (0)