{"id":51918430,"url":"https://github.com/oneclickvirt/kubevirt","last_synced_at":"2026-07-27T14:30:36.354Z","repository":{"id":341540799,"uuid":"1170422251","full_name":"oneclickvirt/kubevirt","owner":"oneclickvirt","description":"kubevirt相关的各种一键(Various one-click related to kubevirt)通过kubevirt批量或单独开设NAT服务器(Bulk or individual NAT server provisioning via kubevirt) ","archived":false,"fork":false,"pushed_at":"2026-06-02T03:50:33.000Z","size":153,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-02T05:22:21.673Z","etag":null,"topics":["amd64","arm64","kubevirt","nat"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oneclickvirt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-02T05:21:24.000Z","updated_at":"2026-06-02T03:50:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/oneclickvirt/kubevirt","commit_stats":null,"previous_names":["oneclickvirt/kubevirt"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/oneclickvirt/kubevirt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fkubevirt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fkubevirt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fkubevirt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fkubevirt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oneclickvirt","download_url":"https://codeload.github.com/oneclickvirt/kubevirt/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fkubevirt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35955550,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-27T02:00:06.776Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amd64","arm64","kubevirt","nat"],"created_at":"2026-07-27T14:30:36.123Z","updated_at":"2026-07-27T14:30:36.262Z","avatar_url":"https://github.com/oneclickvirt.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# kubevirt\n\n[![Hits](https://hits.spiritlhl.net/kubevirt.svg)](https://hits.spiritlhl.net/kubevirt)\n\n基于 KubeVirt + K3s 的虚拟机环境一键安装与管理脚本\n\n支持一键安装 KubeVirt 运行时，并开设各种 Linux 虚拟机（提供 SSH 访问），支持 CPU、内存、磁盘资源限制，端口映射，cloud-init 初始化等。\n\n## 说明\n\n- 使用 K3s 作为轻量级 Kubernetes，自动安装单节点集群\n- 使用 KubeVirt 提供虚拟机能力（基于 KVM/QEMU）\n- 使用 CDI（Containerized Data Importer）导入云镜像\n- 通过 nftables/iptables DNAT 实现端口映射\n- 支持系统：Ubuntu 22.04/24.04, Debian 11/12, AlmaLinux 9, RockyLinux 9, CentOS 7, CentOS Stream 8/9, openSUSE Leap 15.5\n- 支持架构：amd64 (x86_64)\n- 宿主机系统支持：Ubuntu 20.04/22.04/24.04，Debian 11/12\n\n## 环境要求\n\n- 宿主机需支持 KVM 虚拟化（`/dev/kvm` 存在且可用）\n- 最低配置：2 核 CPU，4GB RAM，20GB 可用磁盘\n- root 权限运行\n- 需要公网访问以下载 K3s、KubeVirt 组件和虚拟机镜像\n\n## 安装 KubeVirt 环境\n\n```bash\nexport noninteractive=true\nbash \u003c(curl -sSL https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/kubevirtinstall.sh)\n```\n\n安装完成后会把常用管理脚本安装到 `/usr/local/bin`，可直接运行 `onevm.sh`、`create_vm.sh`、`listvms.sh`、`snapshotvm.sh`、`resizevm.sh`、`deletevm.sh` 和 `update-port-rules.sh`。\n\n弱网或离线环境可提前准备安装文件后运行：\n\n```bash\nexport noninteractive=true\nexport K3S_INSTALL_SCRIPT=/path/to/k3s-install.sh\nexport KUBEVIRT_MANIFEST_DIR=/path/to/kubevirt-manifests\nexport CDI_MANIFEST_DIR=/path/to/cdi-manifests\nexport VIRTCTL_BINARY=/path/to/virtctl\nexport KUBEVIRT_SCRIPT_DIR=/path/to/kubevirt\nbash kubevirtinstall.sh\n```\n\n## 开设单个虚拟机\n\n```bash\ncurl -sSL -o onevm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/onevm.sh\nchmod +x onevm.sh\nexport noninteractive=true\n./onevm.sh \u003cname\u003e \u003ccpu\u003e \u003cmemory_gb\u003e \u003cdisk_gb\u003e \u003cpassword\u003e \u003csshport\u003e \u003cstartport\u003e \u003cendport\u003e [system]\n```\n\n**参数说明：**\n\n| 参数 | 说明 | 默认值 |\n|------|------|--------|\n| `name` | 虚拟机名称（小写字母数字和连字符） | `test` |\n| `cpu` | CPU 核心数 | `1` |\n| `memory_gb` | 内存（GB） | `1` |\n| `disk_gb` | 磁盘大小（GB） | `10` |\n| `password` | root 密码 | `123456` |\n| `sshport` | 宿主机 SSH 映射端口 | `25000` |\n| `startport` | 公网端口范围起始 | `34975` |\n| `endport` | 公网端口范围结束 | `35000` |\n| `system` | 操作系统 | `ubuntu` |\n\n**支持的系统：**\n\n| 系统标识 | 说明 | 镜像来源 |\n|----------|------|----------|\n| `ubuntu` | Ubuntu 22.04 LTS | pve_kvm_images(ubuntu22) → kvm_images(ubuntu22) → 官方 |\n| `ubuntu24` | Ubuntu 24.04 LTS | pve_kvm_images(ubuntu24) → kvm_images(ubuntu24) → 官方 |\n| `debian` | Debian 12 | pve_kvm_images(debian12) → kvm_images(debian12) → 官方 |\n| `debian11` | Debian 11 | pve_kvm_images(debian11) → kvm_images(debian11) → 官方 |\n| `almalinux` | AlmaLinux 9 | pve_kvm_images(almalinux9) → kvm_images(almalinux9) → 官方 |\n| `rockylinux` | RockyLinux 9 | pve_kvm_images(rockylinux9) → kvm_images(rockylinux9) → 官方 |\n| `centos` | CentOS 7 | pve_kvm_images(centos7) → kvm_images(centos7) → 官方 |\n| `centos8-stream` | CentOS Stream 8 | pve_kvm_images(centos8-stream) → kvm_images(centos8-stream) → 官方 |\n| `centos-stream` | CentOS Stream 9 | 官方上游（无组织预置镜像） |\n| `opensuse` | openSUSE Leap 15.5 | pve_kvm_images(opensuse-leap-15) → kvm_images(opensuse-leap-15) → 官方 |\n\n**示例：**\n\n```bash\nexport noninteractive=true\n./onevm.sh vm1 2 2 20 MyPassword 25000 34975 35000 debian\n```\n\n## 批量开设虚拟机\n\n```bash\ncurl -sSL -o create_vm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/create_vm.sh\nchmod +x create_vm.sh\nexport noninteractive=true\n./create_vm.sh\n```\n\n## 查看所有虚拟机\n\n```bash\ncurl -sSL -o listvms.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/listvms.sh\nchmod +x listvms.sh\nexport noninteractive=true\n./listvms.sh\n```\n\n## 创建虚拟机快照（DataVolume 克隆）\n\n```bash\ncurl -sSL -o snapshotvm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/snapshotvm.sh\nchmod +x snapshotvm.sh\nexport noninteractive=true\n./snapshotvm.sh vm1 vm1-snapshot-001\n```\n\n说明：\n\n- 快照通过 CDI 从 `vm1-dv` 克隆出新的 DataVolume，不会直接创建新 VM。\n- 默认拒绝对运行中的 VM 创建快照，避免数据不一致；如确认可接受风险，可设置 `ALLOW_RUNNING_SNAPSHOT=true`。\n- 默认等待克隆完成，可用 `WAIT_SNAPSHOT=false` 改为提交任务后立即返回。\n\n## 调整虚拟机资源\n\n```bash\ncurl -sSL -o resizevm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/resizevm.sh\nchmod +x resizevm.sh\nexport noninteractive=true\n./resizevm.sh vm1 4 8 40\n```\n\n说明：\n\n- 参数依次为 `vmname cpu memory_gb disk_gb`，留空表示不调整对应资源，例如：`./resizevm.sh vm1 \"\" \"\" 40`。\n- CPU/内存会更新 VM 模板；运行中的 VM 通常需要重启后完全生效，可设置 `RESTART_VM=true` 自动重启。\n- 磁盘只支持扩容，且依赖 StorageClass 支持 PVC 扩容；虚拟机内文件系统可能仍需手动扩容。\n\n## 删除单个虚拟机\n\n```bash\ncurl -sSL -o deletevm.sh https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/scripts/deletevm.sh\nchmod +x deletevm.sh\nexport noninteractive=true\n./deletevm.sh \u003cname\u003e\n```\n\n默认会保留该 VM 的快照 DataVolume，避免误删备份；如需一并删除，设置 `DELETE_SNAPSHOTS=true`。\n\n## 卸载（完整清理）\n\n```bash\nexport noninteractive=true\nbash \u003c(curl -sSL https://raw.githubusercontent.com/oneclickvirt/kubevirt/main/kubevirtuninstall.sh)\n```\n\n## 日志文件\n\n批量开设时，连接信息会记录在当前目录的 `vmlog` 文件中，格式如下：\n\n```\nvm1 root@\u003c宿主机IP\u003e:25000 密码: MyPassword 端口范围: 34975-35000\nvm2 root@\u003c宿主机IP\u003e:25001 密码: MyPassword 端口范围: 35001-35026\n```\n\n## 常用环境变量\n\n| 变量 | 说明 | 默认值 |\n|------|------|--------|\n| `noninteractive=true` | 统一无交互模式标记 | 未启用 |\n| `K3S_VERSION` | 安装的 K3s 版本 | `v1.29.3+k3s1` |\n| `KUBEVIRT_VERSION` | 安装的 KubeVirt 版本 | `v1.2.1` |\n| `CDI_VERSION` | 安装的 CDI 版本 | `v1.59.0` |\n| `VIRTCTL_VERSION` | 安装的 virtctl 版本 | `v1.2.1` |\n| `K3S_INSTALL_SCRIPT` | 本地 K3s 安装脚本路径，供离线/弱网安装使用 | 未设置 |\n| `KUBEVIRT_MANIFEST_DIR` | 本地 KubeVirt manifest 目录，需包含 `kubevirt-operator.yaml` 和 `kubevirt-cr.yaml` | 未设置 |\n| `CDI_MANIFEST_DIR` | 本地 CDI manifest 目录，需包含 `cdi-operator.yaml` 和 `cdi-cr.yaml` | 未设置 |\n| `KUBEVIRT_OPERATOR_YAML` / `KUBEVIRT_CR_YAML` | 分别指定本地 KubeVirt Operator/CR manifest 文件 | 未设置 |\n| `CDI_OPERATOR_YAML` / `CDI_CR_YAML` | 分别指定本地 CDI Operator/CR manifest 文件 | 未设置 |\n| `VIRTCTL_BINARY` | 本地 virtctl 二进制路径 | 未设置 |\n| `KUBEVIRT_SCRIPT_DIR` | 本地脚本目录，供离线安装 `firewall.sh`、`onevm.sh`、`snapshotvm.sh` 等脚本 | 未设置 |\n| `KEEP_FAILED_RESOURCES=true` | VM 创建失败时保留 VM/DV/Secret 现场排查 | 未启用 |\n| `STORE_PASSWORD_ANNOTATION=true` | 将 VM 明文密码写入 Kubernetes 注解，便于后续查询但会扩大暴露面 | 未启用 |\n| `DELETE_SNAPSHOTS=true` | 删除 VM 时同时删除由 `snapshotvm.sh` 创建的 DataVolume 克隆 | 未启用 |\n| `ALLOW_RUNNING_SNAPSHOT=true` | 允许对运行中 VM 做 DataVolume 克隆 | 未启用 |\n| `WAIT_SNAPSHOT=false` | 创建快照后不等待克隆完成 | `true` |\n| `RESTART_VM=true` | 资源调整后自动重启 VM | 未启用 |\n| `SHOW_PASSWORD=true` | `listvms.sh` 显示已存储在 VM 注解或本地 `vmlog` 中的明文密码 | 未启用 |\n\n## 工作原理\n\n```\n宿主机（K3s + KubeVirt）\n├── K3s Kubernetes（单节点）\n│   ├── KubeVirt Operator（管理虚拟机生命周期）\n│   └── CDI（导入云镜像到 PVC）\n├── 虚拟机 Pod（virt-launcher）\n│   ├── vm1（QEMU/KVM）\n│   │   ├── SSH :22  ←→  iptables DNAT → 宿主机:25000\n│   │   └── 额外端口 ←→  iptables DNAT → 宿主机:34975-35000\n│   └── vm2（QEMU/KVM）\n│       ├── SSH :22  ←→  iptables DNAT → 宿主机:25001\n│       └── 额外端口 ←→  iptables DNAT → 宿主机:35001-35026\n```\n\n## 常用管理命令\n\n```bash\n# 查看所有虚拟机状态\nkubectl get vm -n kubevirt-vms\n\n# 查看虚拟机实例（运行中的）\nkubectl get vmi -n kubevirt-vms\n\n# 查看数据卷导入进度\nkubectl get dv -n kubevirt-vms\n\n# 进入虚拟机串口控制台（Ctrl+] 退出）\nvirtctl console \u003cvmname\u003e -n kubevirt-vms\n\n# 启动/停止/重启虚拟机\nvirtctl start \u003cvmname\u003e -n kubevirt-vms\nvirtctl stop \u003cvmname\u003e -n kubevirt-vms\nvirtctl restart \u003cvmname\u003e -n kubevirt-vms\n```\n\n## 注意事项\n\n1. 虚拟机首次启动需要等待镜像下载导入（根据网速可能需要 5-20 分钟）\n2. 宿主机需要开启 KVM 嵌套虚拟化或直接使用裸金属服务器\n3. 端口转发通过 iptables/nftables 实现（支持IPv4 + IPv6双栈）：\n   - 使用 systemd 服务在重启后自动恢复规则\n   - Debian/Ubuntu 系统自动安装 `iptables-persistent` 和 `netfilter-persistent`\n   - Red Hat/CentOS 系统自动安装 `iptables-services`\n   - 规则变更后自动持久化，确保重启后不失效\n4. 当前脚本仅支持 amd64/x86_64；ARM64 未提供镜像和 KubeVirt 兼容性保证\n5. CentOS 7 已 EOL，仅作为兼容镜像选项保留，生产环境建议使用 Debian/Ubuntu/Rocky/AlmaLinux\n6. 如需重置密码，通过 `virtctl console` 进入控制台手动修改\n\n## FAQ\n\n**K3s 安装失败怎么办？**\n\n安装脚本会输出 `/tmp/k3s-install-log.txt` 最近日志、`systemctl status k3s` 和 `journalctl -u k3s` 片段。优先检查网络/DNS、root 权限、systemd、内核和防火墙限制。\n\n**镜像导入失败或超时后会留下资源吗？**\n\n默认会清理本次创建的 VM、DataVolume、PVC 和 cloud-init Secret。需要保留现场时设置 `KEEP_FAILED_RESOURCES=true`。\n\n**为什么 `listvms.sh \u003cvmname\u003e` 不再显示密码？**\n\n新 VM 默认不把明文密码写入 Kubernetes 注解，避免普通元数据查询泄露密码。密码仍会用于 cloud-init 初始化，并记录在创建时输出和本地 `vmlog` 中；`listvms.sh` 默认会对 `vmlog` 密码脱敏。如确需后续从 VM 注解或 `vmlog` 查询，创建时设置 `STORE_PASSWORD_ANNOTATION=true`，查询时再设置 `SHOW_PASSWORD=true`。\n\n**快照是否等同于应用一致性备份？**\n\n不是。`snapshotvm.sh` 使用 CDI DataVolume 克隆。运行中 VM 的磁盘可能存在未刷盘数据，建议先停止 VM 再创建快照。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneclickvirt%2Fkubevirt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foneclickvirt%2Fkubevirt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneclickvirt%2Fkubevirt/lists"}