virt-install 从 ISO 安装虚拟机完全指南

📅 2026/7/24 4:49:20
virt-install 从 ISO 安装虚拟机完全指南
前言在 KVM 虚拟化环境中virt-install是最常用的命令行虚拟机创建工具。相比图形化的virt-manager它更适合自动化脚本和批量部署场景。本文将从概念原理到实战操作系统性地梳理通过 ISO 镜像使用virt-install安装虚拟机的完整流程并深入解析常见参数的含义与配置要点。一、什么是 virt-installvirt-install是一个用于创建新虚拟机的命令行工具支持 KVM、Xen 以及 Linux 容器等多种虚拟化技术。它通过libvirt虚拟化管理库与底层的 hypervisor 进行交互。简单来说virt-install是一个“胶水工具”——它将用户通过命令行参数指定的 CPU、内存、磁盘、网络和安装源等信息转换成 libvirt 能够识别的XML 配置文件然后调用domainCreateXML接口完成虚拟机的创建。一旦虚拟机创建完成生命周期管理就交由 libvirt 负责virt-install随即退出。virt-install支持的安装方式非常丰富本地 ISO 镜像或 CDROM 介质远程网络安装HTTP、FTP 或 NFS 协议的网络安装树PXE 网络引导导入现有磁盘镜像跳过安装阶段二、工作原理简述virt-install的工作流程可以概括为以下几个步骤参数解析与校验解析命令行参数校验必要参数是否完整生成域 XML将参数转换为 libvirt 标准的域domainXML 配置调用 libvirt API通过domainCreateXML接口创建虚拟机启动安装虚拟机启动后从指定的安装源如 ISO引导系统进入操作系统安装界面整个过程中libvirt 是核心枢纽而 QEMU 则在 libvirt 的调度下完成具体的虚拟化工作。三、准备工作在执行virt-install之前需要确认以下先决条件3.1 确认虚拟化支持grep-E(vmx|svm)/proc/cpuinfo如果输出中有vmxIntel或svmAMD标志说明 CPU 支持虚拟化。3.2 安装必要软件包RHEL/CentOS/Fedora 系sudoyuminstallqemu-kvm libvirt virt-install-yUbuntu/Debian 系sudoaptinstallqemu-kvm libvirt-daemon-system virtinst-y3.3 启动 libvirtd 服务sudosystemctlenable--nowlibvirtd四、核心参数详解virt-install的参数数量众多以下重点解析用户特别关注的几个核心参数。4.1--name虚拟机名称--nameguest_name指定虚拟机的名称必须在同一 hypervisor 连接中唯一。如果要重新创建同名虚拟机需要先用virsh shutdown和virsh undefine清理旧配置。4.2--memory内存分配--memorysize_in_MB为虚拟机分配的内存大小单位为 MiB。例如--memory 2048表示分配 2GB 内存。4.3--vcpus虚拟 CPU--vcpusnumber分配给虚拟机的虚拟 CPU 数量。可以进一步细化为--vcpus sockets1,cores2,threads1来控制 CPU 拓扑结构。4.4--disk磁盘配置--disksizesize_in_GB指定虚拟磁盘的大小和类型。默认会创建 qcow2 格式的磁盘镜像。也可以指定具体路径--diskpath/var/lib/libvirt/images/myvm.qcow2,size204.5--cdrom与--location安装源--cdromiso_file_path从本地 ISO 镜像文件安装。--locationhttp/ftp/nfs_url从网络安装树安装。4.6--osinfo/--os-variant操作系统类型⭐这是最关键但最容易被忽视的参数之一。--osinfoos_identifier指定客户机操作系统的类型和版本。正确设置该参数可以让virt-install自动配置合适的virtio 驱动、时钟源等优化选项。错误或缺失该参数会导致虚拟机虽然能启动但性能不佳。列出所有可用值virt-install--osinfolist# 或osinfo-query os注意--osinfo是较新版本中的参数旧版本中对应的是--os-variant。4.7--network网络配置⭐--networknetworknetwork_name指定虚拟机使用的网络。常见配置方式默认 NAT 网络--networknetworkdefault桥接模式虚拟机与宿主机同网段--networkbridgebr0指定网卡模型--networknetworkdefault,modelvirtiovirtio是半虚拟化网卡性能远优于默认的 e1000。4.8--graphics与 VNC 相关参数 ⭐--graphicsvnc启用 VNC 图形界面用于远程查看虚拟机安装界面。--vnclisten0.0.0.0指定 VNC 服务监听的 IP 地址。0.0.0.0表示监听所有网络接口允许从任何 IP 访问 VNC。--vncportport指定 VNC 监听的端口号默认自动分配。完整示例--graphicsvnc,listen0.0.0.0,port5901需要注意的是将--vnclisten设为0.0.0.0会暴露 VNC 服务到网络生产环境建议配合防火墙或使用 SPICE 加密协议。4.9--os-type操作系统类型--os-typelinux指定操作系统类型linux/windows。在新版virt-install中--osinfo已涵盖此功能--os-type逐渐被取代。五、完整操作示例以下是一个通过 ISO 安装 Linux 虚拟机的完整命令virt-install\--namerhel9-vm\--memory4096\--vcpus2\--disksize40\--osinforhel9.0\--cdrom/home/user/iso/rhel-9.0.iso\--networknetworkdefault,modelvirtio\--graphicsvnc,listen0.0.0.0\--noautoconsole参数说明--name rhel9-vm虚拟机名称--memory 40964GB 内存--vcpus 22 个 vCPU--disk size4040GB 虚拟磁盘--osinfo rhel9.0指定操作系统为 RHEL 9.0--cdrom /home/user/iso/rhel-9.0.isoISO 安装源路径--network networkdefault,modelvirtio使用默认 NAT 网络virtio 网卡--graphics vnc,listen0.0.0.0启用 VNC监听所有接口--noautoconsole不自动打开控制台六、权限问题深度解析ERROR: Cannot access storage file6.1 问题现象在执行virt-install时如果 ISO 镜像或磁盘文件位于用户家目录如/home/xxx/aarch64.img可能会遇到以下错误ERROR Cannot access storage file /home/xxx-aarch64.img (as uid:107, gid:107): 权限不够6.2 根本原因这个问题的根本原因是virt-install在通过libvirt启动 QEMU 进程时QEMU 会放弃 root 权限转而以qemu用户uid:107, gid:107的身份运行。而qemu用户对普通用户的家目录/home/xxx默认没有访问权限。即使单独chown了 ISO 文件本身qemu用户仍然无法“穿过”家目录到达该文件。关键在于目录的“执行权限”x决定了用户能否“穿过”该目录访问其中的内容。6.3 解决方案汇总方案一修改目录和文件权限推荐为qemu用户开放从家目录到镜像文件路径上每一级目录的执行权限# 为 /home 和 /home/xxx 添加执行权限sudochmodax /homesudochmodax /home/xxx# 修改镜像文件权限sudochown$USER:libvirt /home/xxx-aarch64.imgsudochmod660/home/xxx-aarch64.img同时确保执行virt-install的用户属于libvirt组sudousermod-aGlibvirt$USER# 重新登录生效方案二切换到用户会话模式qemu:///session使用--connectqemu:///session参数让虚拟机进程以当前用户身份运行从而避免跨用户权限问题virt-install--connectqemu:///session...# 其他参数不变注意会话模式对网络功能有一定限制如无法使用桥接网络。方案三将镜像移至 libvirt 标准目录将 ISO 和磁盘镜像移到/var/lib/libvirt/images/该目录的权限专为虚拟机设计sudomv/home/xxx-aarch64.img /var/lib/libvirt/images/方案四使用 ACL 权限使用setfacl为qemu用户授予特定权限sudosetfacl-mu:qemu:rx /home/xxxsudosetfacl-mu:qemu:r /home/xxx-aarch64.img方案五检查 SELinux如果系统启用 SELinux即使权限正确也可能被阻止。可临时测试sudosetenforce0如果问题解决则需要为镜像文件设置正确的 SELinux 上下文virt_content_t而非永久禁用。七、注意事项与最佳实践7.1 用户与权限系统连接qemu:///system默认需要root 权限或用户属于libvirt组会话连接qemu:///session以普通用户身份运行但网络功能受限生产环境推荐使用系统连接 libvirt 组成员的方式兼顾安全与功能7.2 安装源路径避免将 ISO 放在家目录这是权限问题的常见根源推荐路径/var/lib/libvirt/images/或专门的存储池目录如果必须使用家目录务必按第六节的方法配置权限7.3 操作系统类型–osinfo务必指定正确的--osinfo直接影响虚拟机的性能优化不确定时可用virt-install --osinfo list查询可用值不同版本参数名可能不同新版本用--osinfo旧版本用--os-variant7.4 网络配置生产环境推荐使用桥接网络bridgebr0以获得更好的网络性能虚拟网卡模型推荐virtio性能优于默认的 e1000会话模式qemu:///session不支持桥接网络7.5 VNC 图形界面--vnclisten0.0.0.0会暴露 VNC 到所有网络接口存在安全风险生产环境建议配合防火墙限制访问来源或使用SPICE协议支持加密或通过 SSH 隧道转发 VNC 端口7.6 自动化与无人值守virt-install支持完全无人值守安装结合Kickstart文件RHEL/CentOS或preseed文件Ubuntu使用--unattended参数简化自动化配置7.7 虚拟机管理虚拟机创建后可使用virsh工具进行管理启动、停止、删除等删除虚拟机前需先关闭virsh shutdown name然后virsh undefine name八、常见问题速查问题可能原因解决方案Cannot access storage fileqemu 用户无权访问家目录文件参考第六节权限解决方案虚拟机性能差未指定或错误指定--osinfo使用--osinfo指定正确的 OS 类型VNC 无法连接监听地址或防火墙问题检查--vnclisten和防火墙规则会话模式下网络不可用会话模式不支持桥接改用系统连接qemu:///system--os-variant无法识别参数名过时改用--osinfo结语virt-install是 KVM 虚拟化环境中不可或缺的命令行工具掌握它对于系统管理员和 DevOps 工程师来说至关重要。理解其工作原理、熟悉核心参数的含义、正确处理权限问题是顺利使用该工具的关键。在实际使用中--osinfo的正确设置和镜像文件的权限管理是最容易出错的环节值得特别关注。希望本文能帮助读者快速上手并规避常见陷阱。