欢迎光临
我们一直在努力

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

前言

在 KVM 虚拟化环境中,virt-install 是最常用的命令行虚拟机创建工具。相比图形化的 virt-manager,它更适合自动化脚本和批量部署场景。本文将从概念原理到实战操作,系统性地梳理通过 ISO 镜像使用 virt-install 安装虚拟机的完整流程,并深入解析常见参数的含义与配置要点。

一、什么是 virt-install?

virt-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 标准的域(domain)XML 配置
  • 调用 libvirt API:通过 domainCreateXML 接口创建虚拟机
  • 启动安装:虚拟机启动后,从指定的安装源(如 ISO)引导系统,进入操作系统安装界面
  • 整个过程中,libvirt 是核心枢纽,而 QEMU 则在 libvirt 的调度下完成具体的虚拟化工作。

    三、准备工作

    在执行 virt-install 之前,需要确认以下先决条件:

    3.1 确认虚拟化支持

    grep -E '(vmx|svm)' /proc/cpuinfo

    如果输出中有 vmx(Intel)或 svm(AMD)标志,说明 CPU 支持虚拟化。

    3.2 安装必要软件包

    • RHEL/CentOS/Fedora 系:

      sudo yum install qemu-kvm libvirt virt-install -y

    • Ubuntu/Debian 系:

      sudo apt install qemu-kvm libvirt-daemon-system virtinst -y

    3.3 启动 libvirtd 服务

    sudo systemctl enable –now libvirtd

    四、核心参数详解

    virt-install 的参数数量众多,以下重点解析用户特别关注的几个核心参数。

    4.1 –name(虚拟机名称)

    –name <guest_name>

    指定虚拟机的名称,必须在同一 hypervisor 连接中唯一。如果要重新创建同名虚拟机,需要先用 virsh shutdown 和 virsh undefine 清理旧配置。

    4.2 –memory(内存分配)

    –memory <size_in_MB>

    为虚拟机分配的内存大小,单位为 MiB。例如 –memory 2048 表示分配 2GB 内存。

    4.3 –vcpus(虚拟 CPU)

    –vcpus <number>

    分配给虚拟机的虚拟 CPU 数量。可以进一步细化为 –vcpus sockets=1,cores=2,threads=1 来控制 CPU 拓扑结构。

    4.4 –disk(磁盘配置)

    –disk size=<size_in_GB>

    指定虚拟磁盘的大小和类型。默认会创建 qcow2 格式的磁盘镜像。也可以指定具体路径:

    –disk path=/var/lib/libvirt/images/myvm.qcow2,size=20

    4.5 –cdrom 与 –location(安装源)

    –cdrom <iso_file_path>

    从本地 ISO 镜像文件安装。

    –location <http/ftp/nfs_url>

    从网络安装树安装。

    4.6 –osinfo / –os-variant(操作系统类型)⭐

    这是最关键但最容易被忽视的参数之一。

    –osinfo <os_identifier>

    指定客户机操作系统的类型和版本。正确设置该参数可以让 virt-install 自动配置合适的 virtio 驱动、时钟源等优化选项。错误或缺失该参数会导致虚拟机虽然能启动,但性能不佳。

    列出所有可用值:

    virt-install –osinfo list
    # 或
    osinfo-query os

    注意:–osinfo 是较新版本中的参数,旧版本中对应的是 –os-variant。

    4.7 –network(网络配置)⭐

    –network network=<network_name>

    指定虚拟机使用的网络。常见配置方式:

    • 默认 NAT 网络:

      –network network=default

    • 桥接模式(虚拟机与宿主机同网段):

      –network bridge=br0

    • 指定网卡模型:

      –network network=default,model=virtio

      virtio 是半虚拟化网卡,性能远优于默认的 e1000。

    4.8 –graphics 与 VNC 相关参数 ⭐

    –graphics vnc

    启用 VNC 图形界面,用于远程查看虚拟机安装界面。

    –vnclisten=0.0.0.0

    指定 VNC 服务监听的 IP 地址。0.0.0.0 表示监听所有网络接口,允许从任何 IP 访问 VNC。

    –vncport=<port>

    指定 VNC 监听的端口号(默认自动分配)。

    完整示例:

    –graphics vnc,listen=0.0.0.0,port=5901

    需要注意的是,将 –vnclisten 设为 0.0.0.0 会暴露 VNC 服务到网络,生产环境建议配合防火墙或使用 SPICE 加密协议。

    4.9 –os-type(操作系统类型)

    –os-type=linux

    指定操作系统类型(linux/windows)。在新版 virt-install 中,–osinfo 已涵盖此功能,–os-type 逐渐被取代。

    五、完整操作示例

    以下是一个通过 ISO 安装 Linux 虚拟机的完整命令:

    virt-install \\
    –name rhel9-vm \\
    –memory 4096 \\
    –vcpus 2 \\
    –disk size=40 \\
    –osinfo rhel9.0 \\
    –cdrom /home/user/iso/rhel-9.0.iso \\
    –network network=default,model=virtio \\
    –graphics vnc,listen=0.0.0.0 \\
    –noautoconsole

    参数说明:

    • –name rhel9-vm:虚拟机名称
    • –memory 4096:4GB 内存
    • –vcpus 2:2 个 vCPU
    • –disk size=40:40GB 虚拟磁盘
    • –osinfo rhel9.0:指定操作系统为 RHEL 9.0
    • –cdrom /home/user/iso/rhel-9.0.iso:ISO 安装源路径
    • –network network=default,model=virtio:使用默认 NAT 网络,virtio 网卡
    • –graphics vnc,listen=0.0.0.0:启用 VNC,监听所有接口
    • –noautoconsole:不自动打开控制台

    六、权限问题深度解析(ERROR: Cannot access storage file)

    6.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 添加执行权限
    sudo chmod a+x /home
    sudo chmod a+x /home/xxx

    # 修改镜像文件权限
    sudo chown $USER:libvirt /home/xxx-aarch64.img
    sudo chmod 660 /home/xxx-aarch64.img

    同时确保执行 virt-install 的用户属于 libvirt 组:

    sudo usermod -aG libvirt $USER
    # 重新登录生效

    方案二:切换到用户会话模式(qemu:///session)

    使用 –connect="qemu:///session" 参数,让虚拟机进程以当前用户身份运行,从而避免跨用户权限问题:

    virt-install –connect="qemu:///session" ... # 其他参数不变

    注意:会话模式对网络功能有一定限制,如无法使用桥接网络。

    方案三:将镜像移至 libvirt 标准目录

    将 ISO 和磁盘镜像移到 /var/lib/libvirt/images/,该目录的权限专为虚拟机设计:

    sudo mv /home/xxx-aarch64.img /var/lib/libvirt/images/

    方案四:使用 ACL 权限

    使用 setfacl 为 qemu 用户授予特定权限:

    sudo setfacl -m u:qemu:rx /home/xxx
    sudo setfacl -m u:qemu:r /home/xxx-aarch64.img

    方案五:检查 SELinux

    如果系统启用 SELinux,即使权限正确也可能被阻止。可临时测试:

    sudo setenforce 0

    如果问题解决,则需要为镜像文件设置正确的 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-variant

    7.4 网络配置

    • 生产环境推荐使用 桥接网络(bridge=br0)以获得更好的网络性能
    • 虚拟网卡模型推荐 virtio,性能优于默认的 e1000
    • 会话模式(qemu:///session)不支持桥接网络

    7.5 VNC 图形界面

    • –vnclisten=0.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 file qemu 用户无权访问家目录文件 参考第六节权限解决方案
    虚拟机性能差 未指定或错误指定 –osinfo 使用 –osinfo 指定正确的 OS 类型
    VNC 无法连接 监听地址或防火墙问题 检查 –vnclisten 和防火墙规则
    会话模式下网络不可用 会话模式不支持桥接 改用系统连接 qemu:///system
    –os-variant 无法识别 参数名过时 改用 –osinfo

    结语

    virt-install 是 KVM 虚拟化环境中不可或缺的命令行工具,掌握它对于系统管理员和 DevOps 工程师来说至关重要。理解其工作原理、熟悉核心参数的含义、正确处理权限问题,是顺利使用该工具的关键。

    在实际使用中,–osinfo 的正确设置和镜像文件的权限管理是最容易出错的环节,值得特别关注。希望本文能帮助读者快速上手并规避常见陷阱。

    赞(0)
    未经允许不得转载:171主机测评 » virt-install 从 ISO 安装虚拟机完全指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址