{"id":51918431,"url":"https://github.com/oneclickvirt/qemu","last_synced_at":"2026-07-27T14:30:36.768Z","repository":{"id":341540456,"uuid":"1170417068","full_name":"oneclickvirt/qemu","owner":"oneclickvirt","description":"qemu相关的各种一键(Various one-click related to qemu)通过qemu批量或单独开设NAT服务器(Bulk or individual NAT server provisioning via qemu) ","archived":false,"fork":false,"pushed_at":"2026-07-02T03:54:06.000Z","size":216,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-02T05:26:13.279Z","etag":null,"topics":["amd64","arm64","nat","qemu","qemu-kvm"],"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":"CHANGELOG.md","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:10:53.000Z","updated_at":"2026-07-02T03:54:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/oneclickvirt/qemu","commit_stats":null,"previous_names":["oneclickvirt/qemu"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/oneclickvirt/qemu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fqemu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fqemu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fqemu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fqemu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oneclickvirt","download_url":"https://codeload.github.com/oneclickvirt/qemu/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oneclickvirt%2Fqemu/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","nat","qemu","qemu-kvm"],"created_at":"2026-07-27T14:30:36.131Z","updated_at":"2026-07-27T14:30:36.757Z","avatar_url":"https://github.com/oneclickvirt.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# qemu\n\n[![Hits](https://hits.spiritlhl.net/qemu.svg)](https://hits.spiritlhl.net/qemu)\n\n基于 QEMU/KVM + libvirt 的虚拟机环境一键安装与管理脚本\n\n支持一键安装 QEMU/KVM 运行时，并开设各种 Linux 虚拟机（提供 SSH 访问），支持端口映射、资源限制、cloud-init 自动初始化等。\n\n## 说明\n\n- 使用 [QEMU/KVM](https://www.qemu.org/) + [libvirt](https://libvirt.org/) 安装完整虚拟化环境\n- 使用官方 Cloud Image（qcow2 格式），自动下载并使用 cloud-init 初始化\n- 支持系统：Debian 10/11/12/13、Ubuntu 18/20/22/24、AlmaLinux 8/9、RockyLinux 8/9、OpenEuler 22\n- 支持架构：amd64、arm64\n- 网络模式：libvirt NAT（virbr0），通过 nftables 或 iptables 进行端口映射；新安装网络支持 ULA IPv6 NAT\n- 虚拟机信息记录在 `/root/vmlog`\n\n## 无交互约定\n\n所有脚本统一支持以下方式进入无交互模式：\n\n```bash\nexport noninteractive=true\n```\n\n开启后，脚本不会等待人工输入：安装和批量创建会使用默认值或已传入的参数；删除和卸载会把该变量视为明确确认。各脚本原有的专用环境变量（如 `VM_COUNT`、`QEMU_FORCE_DELETE`、`QEMU_FORCE_UNINSTALL`）仍然兼容。\n\n## 安装 QEMU/KVM 环境\n\n```bash\nbash \u003c(curl -sSL https://raw.githubusercontent.com/oneclickvirt/qemu/main/qemuinstall.sh)\n```\n\n**支持环境变量（无交互）：**\n\n```bash\nexport noninteractive=true\n# 自定义镜像存储路径（默认 /var/lib/libvirt/images）\nexport QEMU_IMAGES_PATH=/data/vm-images\nbash \u003c(curl -sSL https://raw.githubusercontent.com/oneclickvirt/qemu/main/qemuinstall.sh)\n```\n\n## 开设单个虚拟机\n\n```bash\n# 下载脚本\ncurl -sSL -o oneqemu.sh https://raw.githubusercontent.com/oneclickvirt/qemu/main/scripts/oneqemu.sh\nchmod +x oneqemu.sh\n\n# 用法 (两种格式均支持):\n# ./oneqemu.sh \u003cname\u003e \u003ccpu\u003e \u003cmemory_mb\u003e \u003cdisk_gb\u003e \u003cpassword\u003e \u003csshport\u003e \u003cstartport\u003e \u003cendport\u003e [system]\n# ./oneqemu.sh \u003cname\u003e \u003ccpu\u003e \u003cmemory_mb\u003e \u003cdisk_gb\u003e \u003cpassword\u003e \u003csshport\u003e \u003cstartport\u003e \u003cendport\u003e \u003cextra_flag(y/n)\u003e [system]\n\n# 示例: 创建名为 vm1 的 Debian 虚拟机，1核 1024MB 20GB，SSH端口25001，额外端口35001-35025\n./oneqemu.sh vm1 1 1024 20 MyPassword 25001 35001 35025 debian\n# 示例: 第 9 个参数为附加标志（y/n），第 10 个参数为系统名\n./oneqemu.sh vm1 1 1024 10 MyPassword 25000 34975 35000 n debian13\n```\n\n| 参数 | 说明 | 默认值 |\n|------|------|--------|\n| name | 虚拟机名称 | vm1 |\n| cpu | CPU 核数 | 1 |\n| memory_mb | 内存限制（MB） | 1024 |\n| disk_gb | 磁盘大小（GB） | 20 |\n| password | root 密码 | 自动生成 |\n| sshport | 宿主机 SSH 映射端口 | 25001 |\n| startport | 额外端口范围起始 | 35001 |\n| endport | 额外端口范围结束 | 35025 |\n| system | 系统类型（第 9 或第 10 个参数） | debian |\n\n**支持的 system 值：**\n\n| 系统名 | 支持版本号 | 示例 |\n|--------|-----------|------|\n| `debian` | 10 11 12 13 | `debian` `debian12` `debian13` |\n| `ubuntu` | 18 20 22 24 | `ubuntu` `ubuntu22` `ubuntu24` |\n| `almalinux` | 8 9 | `almalinux9`（`alma9` 亦可） |\n| `rockylinux` | 8 9 | `rockylinux9`（`rocky9` 亦可） |\n| `openeuler` | 22 | `openeuler` |\n\n\u003e system 名称不区分大小写，支持带 `-` 或 `_` 分隔符（如 `debian-13`、`ubuntu_22`），均可自动规范化。\n\n**单机创建也支持环境变量（位置参数优先）：**\n\n```bash\nexport noninteractive=true\nexport VM_NAME=vm1\nexport VM_CPU=1\nexport VM_MEMORY=1024\nexport VM_DISK=20\nexport VM_PASSWORD='ChangeMe-123'\nexport VM_SSH_PORT=25001\nexport VM_START_PORT=35001\nexport VM_END_PORT=35025\nexport VM_SYSTEM=debian12\n./oneqemu.sh\n```\n\n## 批量开设虚拟机\n\n```bash\ncurl -sSL -o create_qemu.sh https://raw.githubusercontent.com/oneclickvirt/qemu/main/scripts/create_qemu.sh\nchmod +x create_qemu.sh\n./create_qemu.sh\n```\n\n交互式脚本，自动递增虚拟机名（vm1, vm2, ...）、SSH 端口、公网端口，虚拟机信息记录到 `vmlog` 文件。\n批量创建会使用批处理锁串行执行；若单台创建失败，脚本会停止后续创建，避免名称和端口继续漂移。\n\n**支持命令行参数（非交互）：**\n\n```bash\n# ./create_qemu.sh \u003c数量\u003e \u003c内存MB\u003e \u003cCPU\u003e \u003c磁盘GB\u003e \u003c系统类型\u003e\n./create_qemu.sh 3 1024 1 20 debian12\n```\n\n**支持环境变量（无交互一键批量创建）：**\n\n```bash\nexport noninteractive=true\nexport VM_COUNT=3          # 虚拟机数量\nexport VM_MEMORY=1024      # 每台内存 MB\nexport VM_CPU=1            # 每台 CPU 核数\nexport VM_DISK=20          # 每台磁盘 GB\nexport VM_SYSTEM=debian12  # 操作系统类型\n./create_qemu.sh\n```\n\n\u003e **说明：** 脚本不会阻塞等待 cloud-init 完成。DHCP 预留和端口转发规则在 VM 启动前已配置完毕，cloud-init 在后台运行；VM 保持运行，SSH 就绪后即可连接。可通过以下命令查看初始化进度：\n\u003e ```bash\n\u003e tail -f /tmp/qemu-init-\u003cvm_name\u003e.log\n\u003e ```\n\n## 查看与管理虚拟机\n\n```bash\nvirsh list --all                    # 查看所有虚拟机\nvirsh console \u003cname\u003e                # 进入虚拟机控制台（Ctrl+] 退出）\nvirsh start \u003cname\u003e                  # 启动虚拟机\nvirsh shutdown \u003cname\u003e               # 优雅关闭虚拟机\nvirsh destroy \u003cname\u003e                # 强制关闭虚拟机\nvirsh reboot \u003cname\u003e                 # 重启虚拟机\nvirsh dominfo \u003cname\u003e                # 查看虚拟机信息\nvirsh domifaddr \u003cname\u003e              # 查看虚拟机 IP 地址\n```\n\n也可以使用项目脚本进行无交互管理：\n\n```bash\ncurl -sSL -o manage_qemu.sh https://raw.githubusercontent.com/oneclickvirt/qemu/main/scripts/manage_qemu.sh\nchmod +x manage_qemu.sh\n\n# 查询全部或单台虚拟机（包含 vmlog、状态、MAC、IP、端口等信息）\n./manage_qemu.sh info all\n./manage_qemu.sh info vm1\n\n# 创建快照\n./manage_qemu.sh snapshot vm1 before-upgrade\n\n# 调整 CPU 和内存（内存单位 MB）\n./manage_qemu.sh set-resources vm1 2 2048\n```\n\n## 删除单个虚拟机\n\n```bash\ncurl -sSL -o delete_qemu.sh https://raw.githubusercontent.com/oneclickvirt/qemu/main/scripts/delete_qemu.sh\nchmod +x delete_qemu.sh\n./delete_qemu.sh \u003cvm_name\u003e\n# 跳过确认直接删除\n./delete_qemu.sh vm1 -y\n```\n\n**支持环境变量（无交互）：**\n\n```bash\nexport VM_NAME=vm1\nexport noninteractive=true\nexport QEMU_FORCE_DELETE=yes\n./delete_qemu.sh\n```\n\n脚本会自动清理：虚拟机定义、磁盘镜像、DHCP 预留、nftables/iptables 端口转发规则、日志记录。\n删除成功后会同步清理 `/root/vmlog` 和本地 SQLite 状态库中的 VM 记录。\n\n## 卸载（完整清理）\n\n一键卸载 QEMU/KVM 全套环境，包括所有虚拟机、磁盘镜像、网络配置、systemd 服务、软件包：\n\n```bash\nbash \u003c(curl -sSL https://raw.githubusercontent.com/oneclickvirt/qemu/main/qemuuninstall.sh)\n```\n\n脚本会在执行前要求输入 `yes` 确认，操作不可逆。\n\n**支持环境变量或参数跳过确认（无交互）：**\n\n```bash\n# 方式一：环境变量\nexport noninteractive=true\nexport QEMU_FORCE_UNINSTALL=yes\nbash \u003c(curl -sSL https://raw.githubusercontent.com/oneclickvirt/qemu/main/qemuuninstall.sh)\n\n# 方式二：命令行参数\nbash qemuuninstall.sh -y\n```\n\n## 环境变量汇总\n\n| 脚本 | 环境变量 | 说明 | 示例值 |\n|------|----------|------|--------|\n| 全部 | `noninteractive` | 统一无交互开关 | `true` |\n| `qemuinstall.sh` | `QEMU_IMAGES_PATH` | 镜像存储路径 | `/data/images` |\n| `qemuuninstall.sh` | `QEMU_FORCE_UNINSTALL` | 跳过卸载确认 | `yes` |\n| `oneqemu.sh` | `VM_NAME` | 虚拟机名称 | `vm1` |\n| `oneqemu.sh` | `VM_CPU` | CPU 核数 | `1` |\n| `oneqemu.sh` | `VM_MEMORY` | 内存（MB） | `1024` |\n| `oneqemu.sh` | `VM_DISK` | 磁盘（GB） | `20` |\n| `oneqemu.sh` | `VM_PASSWORD` | root 密码（为空则自动生成） | `ChangeMe-123` |\n| `oneqemu.sh` | `VM_SSH_PORT` | SSH 映射端口 | `25001` |\n| `oneqemu.sh` | `VM_START_PORT` | 额外端口起始 | `35001` |\n| `oneqemu.sh` | `VM_END_PORT` | 额外端口结束 | `35025` |\n| `oneqemu.sh` | `VM_SYSTEM` | 操作系统类型 | `debian12` |\n| `create_qemu.sh` | `VM_COUNT` | 创建虚拟机数量 | `3` |\n| `create_qemu.sh` | `VM_MEMORY` | 每台内存（MB） | `1024` |\n| `create_qemu.sh` | `VM_CPU` | 每台 CPU 核数 | `1` |\n| `create_qemu.sh` | `VM_DISK` | 每台磁盘（GB） | `20` |\n| `create_qemu.sh` | `VM_SYSTEM` | 操作系统类型 | `debian12` |\n| `delete_qemu.sh` | `VM_NAME` | 要删除的虚拟机名 | `vm1` |\n| `delete_qemu.sh` | `QEMU_FORCE_DELETE` | 跳过删除确认 | `yes` |\n\n## 镜像说明\n\n本项目使用各发行版官方 Cloud Image（cloud-init 格式），首次使用时自动下载至 `/var/lib/libvirt/images/`，后续创建同系统虚拟机不再重复下载。下载成功后会生成本地 `.sha256` 校验记录；再次使用缓存时会先复核 SHA256，校验失败则删除旧缓存并重新下载。\n\n| 系统 | 镜像来源 |\n|------|---------|\n| Debian 10/11/12/13 | cloud.debian.org |\n| Ubuntu 18/20/22/24 | cloud-images.ubuntu.com |\n| AlmaLinux 8/9 | repo.almalinux.org |\n| RockyLinux 8/9 | dl.rockylinux.org |\n| OpenEuler 22 | repo.openeuler.org |\n\n## 网络说明\n\n- 使用 libvirt 的 `default` NAT 网络（`virbr0`，`192.168.122.0/24`）\n- 安装时会检测已有 `virbr0` 是否由 libvirt 管理，避免和宿主机已有网桥冲突\n- 虚拟机获得 `192.168.122.2`~`192.168.122.99` 范围内的静态 IP（通过 DHCP 预留）\n- 通过 nftables 或 iptables DNAT 实现宿主机端口到虚拟机端口的映射\n- 新安装的 default 网络包含 `fd42:122::/64` ULA IPv6 段；宿主机存在 IPv6 默认路由时会启用 NAT66，并记录 `ipv6_nat=true`\n- 创建中会临时预留 VM 名称、SSH 端口和额外端口范围，避免并发创建时复用同一资源\n- SSH 端口映射：`宿主机:sshport` → `vm_ip:22`\n- 额外端口映射：`宿主机:startport-endport` → `vm_ip:startport-endport`\n\n## 日志文件\n\n虚拟机信息保存在 `/root/vmlog`，并同步写入 `/var/lib/libvirt/qemu-vms.db` 作为结构化本地状态库。`/root/vmlog` 保持向后兼容，格式如下：\n\n```\nvm1 25001 passwd123 1 1024 20 35001 35025 debian 192.168.122.2\nvm2 25002 passwd456 1 1024 20 35026 35050 ubuntu 192.168.122.3\n```\n\n字段顺序：`名称 SSH端口 密码 CPU核数 内存MB 磁盘GB 起始端口 结束端口 系统 内网IP`\n\n新版本会在上述 10 个兼容字段后追加网络元数据，例如：\n\n```\nmac=52:54:xx:xx:xx:xx bridge=virbr0 fw=nft ipv6=fd42:122::2 ipv6_nat=true\n```\n\n创建、删除和 `manage_qemu.sh set-resources` 会同步维护 vmlog 与 SQLite 记录；若 vmlog 缺失，`manage_qemu.sh info all` 会回退读取 SQLite。\n\n## 资源要求\n\n| 项目 | 最低要求 |\n|------|---------|\n| CPU | 支持 VT-x/AMD-V 硬件虚拟化（或嵌套虚拟化） |\n| 内存 | 宿主机剩余 \u003e= 虚拟机内存 + 512MB |\n| 磁盘 | 宿主机剩余 \u003e= 虚拟机磁盘 × 台数 |\n| OS | Ubuntu 22.04+、Debian 11+、CentOS 7+ |\n\n## Stargazers over time\n\n[![Stargazers over time](https://starchart.cc/oneclickvirt/qemu.svg)](https://starchart.cc/oneclickvirt/qemu)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneclickvirt%2Fqemu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foneclickvirt%2Fqemu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foneclickvirt%2Fqemu/lists"}