---
url: /courses/virtualization-tech/06-libvirt-virsh-virt-install/index.md
---
# 第 6 课 用命令指挥虚拟机：libvirt、virsh 与 virt-install 命令行管理

::: tip 项目目标
在之前的课程中，你已经学会使用 virt-manager 图形界面创建和管理虚拟机。但在企业级云平台与自动化运维场景中，命令行管理是不可或缺的核心能力。
通过本课的实训与学习，你将达成以下目标：

1. **掌控虚拟机状态**：理清 libvirt、virsh、libvirtd、QMP 与 QEMU 的分工，熟练使用 `virsh list --all`、`dominfo`、`domstate` 查看与解析虚拟机生命周期状态；
2. **掌握关机与开机风险**：掌握 `start`、`shutdown`、`reboot`、`destroy` 动作，深入理解 ACPI 关机原理与 `destroy` 强制断电拔电源的风险差异；
3. **读懂 Domain XML 户口本**：使用 `dumpxml` 导出配置，解析 CPU、内存、Virtio 高速驱动、NVRAM 固件与 console 节点，学会使用 `virsh desc --config` 进行最小安全修改；
4. **参数化创建 svr-cli01**：掌握 `virt-install` 参数表，理解 QCOW2 精简置备（Thin Provisioning）按需分配原理，使用 `--print-xml` 试运行预览，100% 适配 Ubuntu 26.04 LTS（libvirt 12.0+, QEMU 9.0+, `virt-install --osinfo detect=on,require=off`）完成 `svr-cli01` 交付；
5. **解耦配置与灾备恢复**：理解 Domain XML 配置与 QCOW2 磁盘数据的解耦架构，实操 `dumpxml` 备份 ➔ `undefine` 移除户口 ➔ 确认磁盘完好 ➔ `define` 恢复。
   :::

![宿主机终端用 virsh 与 virt-install 控制虚拟机示意图](./assets/05/virsh-control-illustration.png)

## 6.1 任务一：查看与掌控虚拟机状态

在前两课中，你已经通过图形界面完成了虚拟机的安装。现在你需要在宿主机终端中使用命令行工具接管虚拟机的控制权。

::: tip 终端前置准备与虚拟机名称说明

* **终端位置**：本课所有 `virsh` 与 `virt-install` 命令均在 **Ubuntu 宿主机终端（Host）** 中执行，请勿在虚拟机内部终端执行。
* **权限与连接**：默认命令会通过系统总管 `qemu:///system` 连接 libvirt。如果你的终端提示权限不足或 `virsh list` 返回为空，说明误连到了普通用户模式（`qemu:///session`），请在命令前加上 `sudo`（例如 `sudo virsh list --all`）。
* **目标 VM 名称**：本课命令中的 `svr01` 为前几课建立的示例虚拟机名称。如果你本地建立的虚拟机名为其他名字（如 `ubuntu-test`），请在执行时替换为你的真实 VM 名称。
  :::

### 【动手做】查询虚拟机状态与硬件摘要

所有 `virsh` 与 `virt-install` 命令均在 Ubuntu 宿主机终端中执行。输入以下指令查询宿主机上的虚拟机信息：

```bash
# 查看所有虚拟机（包含处于关闭状态的实例）
virsh list --all

# 查看已创建的虚拟机 svr01 的当前运行状态
virsh domstate svr01

# 查看 svr01 的详细摘要信息（包含 UUID、vCPU、内存、持久化状态）
virsh dominfo svr01
```

### 【看现象】输出观察

执行上述命令后，终端将返回结构化的诊断回显：

1. **`virsh list --all` 输出示例**：
   ```text
    Id   Name     State
   --------------------
    1    svr01    running
    -    win01    shut off
   ```
   *观察要点：运行中的虚拟机拥有唯一的数字进程 ID（如 `1`），而处于 `shut off` 关闭状态的虚拟机 ID 显示为 `-`。*

2. **`virsh dominfo svr01` 输出示例**：
   ```text
   Id:             1
   Name:           svr01
   UUID:           a1b2c3d4-e5f6-7890-abcd-ef1234567890
   OS Type:        hvm
   State:          running
   CPU(s):         2
   Max memory:     2097152 KiB
   Used memory:    2097152 KiB
   Persistent:     yes
   Autostart:      disable
   ```
   *观察要点：`Persistent: yes` 表示该虚拟机的 Domain XML 配置文件已持久化写在宿主机磁盘中；`Autostart: disable` 表示宿主机开机时不会自动启动该 VM。*

### 【学原理与拓展】架构解密与 5 大状态机

#### 1. 命令行管理体系架构拆解

在 KVM 虚拟化体系中，各个组件分工明确，通过 C/S 客户端/服务端架构层层传递指令：

```mermaid
flowchart TB
    User["管理员 / 运维脚本"] --> Virsh["virsh 命令行客户端"]
    User --> VirtInstall["virt-install 创建工具"]
    Virsh -->|"libvirt API (qemu:///system)"| Libvirtd["libvirt 守护进程 libvirtd"]
    VirtInstall -->|"生成 Domain XML"| Libvirtd
    Libvirtd --> DomainXML["Domain XML 配置文件 (/etc/libvirt/qemu/)"]
    Libvirtd -->|"QMP 协议 / UNIX Socket"| QEMU["QEMU 虚拟机进程 (qemu-system-x86_64)"]
    QEMU --> KVM["KVM 内核模块 (/dev/kvm)"]
    QEMU --> Disk["QCOW2 虚拟磁盘文件"]
```

* **libvirt API**：统一的虚拟化管理接口（相当于‘管家/翻译官’）。无论是 `virsh` 还是 `virt-manager`，都不直接操作底层 QEMU 进程，而是统一向 `libvirtd` 发送 API 指令。
* **Domain（管理域）**：libvirt 体系中用来代指每一台虚拟机的专属术语。通俗解读：**Domain 就是每一台虚拟机的‘户口本/档案卡’**，借用自早期 Xen 虚拟化的称呼。
* **QMP (QEMU Monitor Protocol)**：`libvirtd` 与底层 `qemu-system-x86_64` 进程通信的 JSON 格式底层专线。通俗理解：**QMP 相当于 libvirtd 管家与 QEMU 进程之间的‘内部专线对讲机’**，用结构化命令传递控制指令。
* **`qemu:///system` 连接 URI**：宿主机最高权限‘系统总管’连接，具备 root 权限，能够管理宿主机上的所有桥接网卡、存储池与 KVM 实例。

#### 2. 虚拟机 5 大核心状态机

一台虚拟机（Domain）在其生命周期中会在以下 5 种状态间切换：

1. **Undefined（未定义）**：宿主机无 XML 配置文件，libvirt 未注册该虚拟机。
2. **Shut off（已关闭）**：XML 配置文件存在于 `/etc/libvirt/qemu/`，但宿主机内存中没有 QEMU 运行进程。
3. **Running（运行中）**：QEMU 进程在宿主机内存中正常运行，Guest 操作系统接收指令。
4. **Paused（暂停）**：QEMU 进程依然驻留内存，但 CPU 虚拟执行被挂起，内存状态被冻结。
5. **In Transition（过渡态）**：正在进行启动、优雅关机、快照保存或迁移等中间过程。

我们可以通过以下交互式动画，直观感受生命周期动作对 QEMU 进程、XML 配置与 QCOW2 磁盘的三层影响：

## 6.2 任务二：开机、优雅关机与关机风险

管理虚拟机的生命周期，要求运维人员准确选择开机、重启、优雅关机与强制断电命令。

### 【动手做】生命周期动作控制

在宿主机终端中依次执行启动、正常重启、优雅关机与强制关机演练：

```bash
# 1. 启动已关闭的虚拟机 svr01
virsh start svr01

# 2. 验证状态变为 running
virsh domstate svr01

# 3. 向虚拟机发送正常重启指令
virsh reboot svr01

# 4. 向虚拟机发送 ACPI 优雅关机指令
virsh shutdown svr01

# 5. （对比演练）强行终止 QEMU 进程（拔电源）
virsh destroy svr01
```

### 【看现象】输出观察

执行上述指令后，观察终端提示与状态变化：

* 执行 `virsh start svr01`：终端回显 `Domain 'svr01' started`，再次执行 `virsh domstate` 显示 `running`；若在已运行状态下重复执行，libvirt 会拦截并报错 `error: Domain is already active`。
* 执行 `virsh shutdown svr01`：终端回显 `Domain 'svr01' is being shutdown`，此时 Guest OS 开始执行关机流程，几秒钟后 `virsh domstate` 变为 `shut off`。
* 执行 `virsh destroy svr01`：终端回显 `Domain 'svr01' destroyed`，虚拟机瞬间切回 `shut off` 状态。

### 【学原理与拓展】ACPI 关机原理与 destroy 拔电源对比

::: table title="shutdown 与 destroy 动作底层对比" align="center"
| 动作维度 | virsh shutdown (优雅关机) | virsh destroy (强制关机) |
| --- | --- | --- |
| **底层信号类型** | ACPI Power Button 信号 / Guest Agent 指令 | `SIGKILL` 进程终止信号 |
| **Guest OS 响应** | 接收信号，停止服务，写回磁盘缓存，卸载文件系统 | 进程被瞬间杀死，Guest OS 完全无法做出响应 |
| **数据安全性** | **最高**（无数据丢失风险） | **低**（未落盘数据丢失，易产生脏标记） |
| **磁盘与配置影响** | XML 与 QCOW2 完好 | **XML 与 QCOW2 完好（绝对不会删除虚拟机）** |
| **适用场景** | 日常标准关机与运维维护 | 系统彻底卡死、操作系统无响应时的应急救援 |
:::

#### 1. ACPI 关机机制

ACPI（Advanced Configuration and Power Interface）直观理解就相当于**物理主机箱上的电源开关按键**。当你敲下 `virsh shutdown` 时，就像你在电脑上按了一下关机键，`libvirtd` 通过 QEMU 向 Guest OS 触发 ACPI 中断信号。Guest OS 的操作系统电源管理模块（如 Linux 的 `acpid` 守护进程）捕获此信号后，就像弹出了‘正在关机...’提示窗口，主动停止正在运行的服务、将内存缓存（Page Cache）写回硬盘落盘，最后安全卸载文件系统并断电。整个过程**零数据丢失**。

#### 2. destroy 拔电源误区

初学者看到 `destroy`（英文原意‘销毁/毁灭’）常被吓退，误以为它是“删除虚拟机或把虚拟机文件彻底抹掉”。概念本质：在 libvirt 术语中，`destroy` **仅仅针对宿主机内存中正在运行的 QEMU 进程**，相当于在任务管理器里强制结束进程，或者**硬拔掉物理机的电源线**。

底层 `/etc/libvirt/qemu/` 中的 XML 配置文件（户口本）和 `/var/lib/libvirt/images/` 下的 QCOW2 虚拟磁盘文件**完好无损，绝对不会被删除**！你可以随时使用 `virsh start` 重新开机。

## 6.3 任务三：读取与修改虚拟机“户口本”

在 libvirt 体系中，虚拟机的硬件规格统一由格式规范的 Domain XML 文件进行定义。

### 【动手做】读取 XML 与安全修改描述

```bash
# 1. 导出并查看 svr01 的完整 Domain XML 配置
virsh dumpxml svr01

# 2. 使用安全命令给 svr01 增加描述信息（持久化修改）
virsh desc svr01 --config --new-desc "星舟实训云 Web 节点 - 适配 Ubuntu 26.04 LTS"

# 3. 验证描述信息是否写入生效
virsh dominfo svr01
```

### 【看现象】输出观察

1. **`virsh dumpxml` 核心片段展示**：
   ```xml
   <domain type='kvm'>
     <name>svr01</name>
     <uuid>a1b2c3d4-e5f6-7890-abcd-ef1234567890</uuid>
     <description>星舟实训云 Web 节点 - 适配 Ubuntu 26.04 LTS</description>
     <memory unit='GiB'>2</memory>
     <vcpu placement='static'>2</vcpu>
     <devices>
       <disk type='file' device='disk'>
         <driver name='qemu' type='qcow2'/>
         <source file='/var/lib/libvirt/images/svr01.qcow2'/>
         <target dev='vda' bus='virtio'/>
       </disk>
       <interface type='network'>
         <source network='default'/>
         <model type='virtio'/>
       </interface>
       <console type='pty'>
         <target type='serial' port='0'/>
       </console>
     </devices>
   </domain>
   ```

2. **`virsh dominfo svr01` 观察**：在输出中可直接看到更新后的 `Description: 星舟实训云 Web 节点 - 适配 Ubuntu 26.04 LTS` 字段。

### 【学原理与拓展】Domain XML 标签解析与安全修改边界

#### 1. Domain XML 核心标签解密

* **`<target dev='vda' bus='virtio'/>`**：使用 Virtio 高速半虚拟化驱动。通俗理解：传统虚拟机像是在模拟老旧慢速的机械硬盘（IDE 盘叫 `hda`，SATA 盘叫 `sda`），而 **Virtio 相当于给虚拟机装上了直通宿主机内存的高速通道**，性能提升数倍。`vda`（Virtual Disk A）就是 Virtio 专属的高速磁盘盘符。
* **`<model type='virtio'/>`**：网卡 Virtio 驱动。通俗理解：将网卡也升级为直通高速通道，避免 QEMU 耗费 CPU 去模拟百兆/千兆老旧 e1000 网卡。
* **`<nvram>`**：UEFI 引导的虚拟机包含 NVRAM 节点，保存虚拟机启动项与安全密钥文件（`*_VARS.fd`）。形象理解：**相当于虚拟机的‘主板 CMOS 电池与 UEFI 配置卡’**，记录着虚拟主板的启动顺序和安全启动密钥。
* **`<console type='pty'>`**：Virtio 串口控制台。允许你在无桌面环境下通过 `virsh console` 命令行直接登录虚拟机 Linux Shell。

::: warning 【实用操作技巧】virsh console 切出与切入指南

* **进入 console**：在宿主机终端输入 `virsh console svr01` 后，**必须连按一次 Enter（回车键）**，终端才会刷出来宾系统的 `login:` 登录提示符。
* **切出 console**：进入 console 后，你敲 `exit` 退出的是虚拟机 Shell，终端依然会被 console 卡住。要彻底从 console **切回宿主机终端**，必须同时按下快捷键：**`Ctrl + ]`**（按住 Ctrl 键不放，再按右方括号 `]`）。记住这个切出快捷键，它是防止终端卡死在控制台里的“逃生通道”！
  :::

#### 2. 修改配置的两种方式与禁区

* **`virsh edit svr01`**：修改 CPU、内存、网卡等关键硬件时使用。它会打开编辑器并在保存时**自动校验 XML 语法**，阻止错误配置生效。
* **`virsh desc svr01 --config`**：修改非硬件属性（如描述、别名）的首选命令，无需手动修改 XML 标签。
* **危险禁区**：**切勿直接使用 `nano /etc/libvirt/qemu/svr01.xml` 强行编辑！** 直接修改文件会绕过 libvirt 的语法校验，且不会触发 `libvirtd` 内存缓存刷新，容易导致配置混乱。

## 6.4 任务四：使用 virt-install 参数化创建小实例 svr-cli01

掌握了配置文件与控制命令后，我们使用 `virt-install` 命令行工具从零参数化创建一个轻量级小实例 `svr-cli01`。

### 规格配置与参数表

::: table title="svr-cli01 虚拟机规格参数表" align="center"
| 配置项 | 参数值 | 作用与含义 |
| --- | --- | --- |
| **实例名称 (--name)** | `svr-cli01` | libvirt 中的唯一标识名称 |
| **内存容量 (--memory)** | `1536` | 分配 1536 MiB 内存 ($1.5 \text{ GiB}$) |
| **vCPU 核心 (--vcpus)** | `1` | 分配 1 核心虚拟 CPU |
| **虚拟磁盘 (--disk)** | `pool=default,size=12,format=qcow2,bus=virtio` | default 存储池创建 12GB QCOW2 格式、VirtIO 高速总线磁盘 |
| **虚拟网络 (--network)** | `network=default,model=virtio` | 连接 default NAT 桥接网络，VirtIO 网卡 |
| **OS 识别适配 (--osinfo)** | `detect=on,require=off` | **100% 适配 Ubuntu 26.04 LTS (libvirt 12.0+, QEMU 9.0+)** 自动检测与兼容模式 |
| **安装介质 (--cdrom)** | `/srv/iso/ubuntu-26.04-live-server-amd64.iso` | 指定 ISO 安装镜像路径 |
| **图形显示 (--graphics)** | `spice` | 开启 SPICE 高性能控制台 |
| **后台提交 (--noautoconsole)** | 包含此标志位 | 不弹窗阻塞终端，方便自动化脚本集成 |
:::

### 【动手做】预检、试运行预览与正式创建

按步骤在宿主机终端中执行 `svr-cli01` 的创建演练：

::: steps

1. **确认 ISO 路径与权限**

   ::: warning 【关键避坑指南】ISO 镜像绝对路径与 `/home/` 权限陷阱

   * **绝对路径防手抖**：在命令行中务必使用绝对路径（如 `/srv/iso/ubuntu-26.04-live-server-amd64.iso`），避免因为相对路径或波浪号 `~` 展开错误导致命令找不到文件。
   * **不要将 ISO 放在用户家目录 `/home/xxx/`**：QEMU 虚拟机进程是以系统专属账户 `libvirt-qemu` 运行的。Ubuntu 系统中用户家目录权限默认是 `700`，`libvirt-qemu` 用户无法跨越访问你的 `/home/ubuntu/Downloads/` 目录！如果强行使用家目录 ISO 路径，`virt-install` 会直接报错 `Permission denied`。
   * **标准避坑准备指令**（在宿主机终端一键创建目录并放行读权限）：
     ```bash
     # 1. 创建公共镜像存放目录
     sudo mkdir -p /srv/iso

     # 2. 将下载好的 ISO 移动或复制到 /srv/iso/ 目录
     sudo mv ~/Downloads/ubuntu-26.04-live-server-amd64.iso /srv/iso/

     # 3. 赋予公共读取权限
     sudo chmod 644 /srv/iso/ubuntu-26.04-live-server-amd64.iso
     ```

   :::

   确认 ISO 文件存在，且处于 `libvirt-qemu` 用户可读路径：

   ```bash
   ls -lh /srv/iso/ubuntu-26.04-live-server-amd64.iso
   ```

2. **使用 `--print-xml` 预览生成的 Domain XML**

   ```bash
   virt-install \
     --connect qemu:///system \
     --name svr-cli01 \
     --memory 1536 \
     --vcpus 1 \
     --disk pool=default,size=12,format=qcow2,bus=virtio \
     --network network=default,model=virtio \
     --osinfo detect=on,require=off \
     --cdrom /srv/iso/ubuntu-26.04-live-server-amd64.iso \
     --graphics spice \
     --noautoconsole \
     --print-xml
   ```

3. **正式提交创建任务**

   去掉 `--print-xml` 参数，正式提交给 libvirt 调度：

   ```bash
   virt-install \
     --connect qemu:///system \
     --name svr-cli01 \
     --memory 1536 \
     --vcpus 1 \
     --disk pool=default,size=12,format=qcow2,bus=virtio \
     --network network=default,model=virtio \
     --osinfo detect=on,require=off \
     --cdrom /srv/iso/ubuntu-26.04-live-server-amd64.iso \
     --graphics spice \
     --noautoconsole
   ```

4. **确认虚拟机创建与运行状态**

   ```bash
   virsh list --all
   ```

:::

### 【看现象】输出观察

* 执行带 `--print-xml` 的步骤 2 时，终端仅打印包含 `<name>svr-cli01</name>`、`<memory unit='MiB'>1536</memory>` 等结构的 XML 文本，执行 `virsh list --all` 确认没有生成 `svr-cli01`。
* 执行步骤 3 正式创建时，终端返回：
  ```text
  Starting install...
  Domain creation completed.
  ```
* 执行 `virsh list --all` 可看到 `svr-cli01` 处于 `running` 状态。

### 【学原理与拓展】QCOW2 精简置备与 Pipeline 管线

#### 1. QCOW2 精简置备（Thin Provisioning）

在参数中我们指定了 `size=12`（12GB 磁盘）。很多初学者担心物理硬盘剩余空间不足 12GB 导致创建失败。

通俗比喻：

* **厚置备（Thick Provisioning）**：就像去饭店包桌，不管你吃不吃得下，厨师立刻把 12 碗饭全部盛好占满桌子（立刻在宿主机物理硬盘上切走 12GB 真实文件空间）。
* **精简置备（Thin Provisioning）**：就像吃自助餐“吃多少拿多少”。虽然你向虚拟机系统承诺最高能吃 12 碗（声明容量上限 12GB），但刚建好时在宿主机物理盘 `/var/lib/libvirt/images/svr-cli01.qcow2` 文件**初始仅占用几百 KB**。只有当 Guest OS 在里面实际写文件时，物理文件才会按需膨胀扩容。这就叫‘虚报高额上限、按需实即分配’，极大地节省了存储资源！

#### 2. virt-install 执行管线

下图展示了 `virt-install` 命令从参数解析到底层拉起 QEMU 进程的完整 Pipeline：

#### 3. Ubuntu 26.04 LTS 选项适配

在 Ubuntu 26.04 LTS 中，libvirt 升级至 12.0+，QEMU 升级至 9.0+。使用 `--osinfo detect=on,require=off` 能够让 `virt-install` 自动从 ISO 卷标检测操作系统类型，同时避免因旧版本操作系统数据库未同步而导致的阻断性报错。

## 6.5 任务五：Domain XML 配置解耦与备份恢复

虚拟机配置（XML）与存储数据（QCOW2）在底层是完全解耦的，这一特性为系统灾备与快速恢复提供了极大的便利。

### 【动手做】备份、解耦删除与恢复演练

按以下步骤演练配置解耦与备份恢复流程：

```bash
# 1. 导出备份 svr01 的静态 XML 配置文件
virsh dumpxml svr01 --inactive > ~/svr01.backup.xml

# 2. 注销并删除虚拟机的配置文件注册（抹去户口本）
virsh undefine svr01

# 3. 验证列表中已不再显示 svr01
virsh list --all

# 4. 检查底层物理存储，证明 QCOW2 磁盘文件完好无损
ls -lh /var/lib/libvirt/images/svr01.qcow2

# 5. 使用备份的 XML 重新注册定义虚拟机
virsh define ~/svr01.backup.xml

# 6. 验证恢复结果
virsh list --all
virsh dominfo svr01
```

### 【看现象】输出观察

* 执行 `virsh undefine svr01` 后：`virsh list --all` 中找不到 `svr01` 项。
* 执行 `ls -lh /var/lib/libvirt/images/svr01.qcow2`：磁盘文件依然存在且文件大小完好。
* 执行 `virsh define ~/svr01.backup.xml` 后：终端提示 `Domain 'svr01' defined from /home/ubuntu/svr01.backup.xml`，`virsh list --all` 重新出现 `svr01` 且状态为 `shut off`，成功实现秒级恢复！

### 【学原理与拓展】配置与数据解耦架构

::: table title="Domain XML 配置与 QCOW2 数据解耦表" align="center"
| 存储维度 | Domain XML 配置文件 | QCOW2 虚拟磁盘文件 |
| --- | --- | --- |
| **存储路径** | `/etc/libvirt/qemu/svr01.xml` | `/var/lib/libvirt/images/svr01.qcow2` |
| **文件大小** | 极小（约几 KB） | 较大（几 GB 至几十 GB） |
| **存储内容** | 硬件规格、CPU/内存额度、网卡 MAC 地址、驱动模式 | 操作系统内核、安装软件、用户业务数据 |
| **undefine 影响** | **被删除** | **完好保留** |
| **灾备恢复策略** | 定期将 XML 导出并纳入 Git 版本控制 | 定期做 QCOW2 增量快照或离线复制 |
:::

`undefine` 操作的底层本质：**相当于在房管局注销了这套房子的‘房产证与户口本’（删除了 `/etc/libvirt/qemu/` 下的 XML 文件）**。注销后，`virsh list --all` 自然就查不到它了。但是**物理房子本身（`/var/lib/libvirt/images/` 下的 QCOW2 磁盘文件）依然完好停在原地**，里面的系统数据和软件一块都没少！只要你手头留有导出的 XML 备份（房产证复印件），就能随时使用 `virsh define` 重新办理落户登记，瞬间让虚拟机复活。

::: danger 【高危操作预警】切勿随意附加 --remove-all-storage 参数
如果在执行 `virsh undefine` 时随手加上了 `--remove-all-storage` 参数，libvirt 将会连同户口本和物理磁盘文件一起永久抹掉！那才是真正的拆迁队彻底粉碎。在日常运维和实训演练中切勿误加该参数。
:::

## 6.6 常见问题排错矩阵

下表总结了在 Ubuntu 26.04 LTS (libvirt 12.0+, QEMU 9.0+) 命令行管理过程中最常见的故障场景及修复命令：

::: table title="Ubuntu 26.04 LTS 命令行管理排错矩阵" align="center"
| 故障现象 | 常见原因分析 | 修复与排查命令 |
| --- | --- | --- |
| `virsh list` 显示为空 | 1. 未加 `--all` 参数，关闭的 VM 被隐去；2. 误连到了普通用户 `qemu:///session` 连接 | 执行 `virsh list --all`；检查命令中是否明确指定 `--connect qemu:///system` |
| `virt-install` 报错 `Permission denied` 无法读取 ISO | ISO 镜像保存在用户个人目录（如 `/home/ubuntu/`），`libvirt-qemu` 用户无权跨目录读取 | 将 ISO 文件移动至 `/srv/iso/` 或 `/var/lib/libvirt/images/`，并执行 `chmod 644 <iso_path>` |
| `virt-install` 报错 `Domain 'svr-cli01' already exists` | 宿主机中已存在同名 VM 配置残留 | 执行 `virsh list --all` 确认；确属残留则执行 `virsh undefine svr-cli01` 清理后重试 |
| `virsh start` 提示 `domain is already running` | 虚拟机已处于运行状态 | 执行 `virsh domstate <name>` 确认状态，无需重复启动 |
| `virsh shutdown` 发送后虚拟机无响应 | Guest 操作系统未安装/未启用 ACPI 响应服务 | 登录 Guest OS 安装 `acpid` 软件；或在确认数据安全时使用 `virsh destroy` 强制关机 |
| `virsh console` 卡住无响应或不知如何退出 | 1. 刚连入未按回车未刷出提示符；2. 不知如何切回宿主机终端；3. Guest 未启用串口监听 | 按 Enter 键刷出 `login:` 登录框；按 **`Ctrl + ]`** 快捷键逃生切回宿主机终端；Guest 内部安装并启用 `serial-getty@ttyS0.service` |
| `virt-install` 警告 `--os-variant / --osinfo` | Ubuntu 26 OS 数据库未同步新发行版名称 | 指定 `--osinfo detect=on,require=off` 开启自动检测与兼容模式 |
:::

## 6.7 提交内容

### 1. 4 张必交截图清单

完成本课实训后，请提交以下 **4 张关键步骤截图** 作为实验成果证明：

::: file-tree title="作业提交截图清单" icon="colored"

* screenshots/
  * **01-virsh-list-dominfo.png** # 截图一：virsh list --all 及 virsh dominfo svr01 终端输出截图
  * **02-virsh-lifecycle-state.png** # 截图二：virsh shutdown 与 virsh start 虚拟机生命周期状态切换过程截图
  * **03-virt-install-print-xml.png** # 截图三：virt-install --print-xml 命令预览 XML 生成截图
  * **04-svr-cli01-acceptance.png** # 截图四：svr-cli01 创建成功后 virsh list --all 及控制台登录截图
    :::

1. **截图一：基础查询与域名信息**：展现 `virsh list --all` 包含虚拟机列表及 `virsh dominfo svr01` 摘要信息的终端屏幕。
2. **截图二：生命周期状态切换**：展现执行 `virsh shutdown` 后 `virsh domstate` 变为 `shut off`，以及后续 `virsh start` 恢复 `running` 的完整交互过程。
3. **截图三：`virt-install --print-xml` 预览**：展现带 `--print-xml` 参数的 `virt-install` 命令及其输出的标准 XML 结构。
4. **截图四：`svr-cli01` 交付与登录验证**：左侧为宿主机 `virsh list --all` 显示 `svr-cli01` 处于 `running`，右侧为通过 `virsh console` 或图形控制台成功登录 `svr-cli01` 系统 Shell 的界面。

### 2. virsh domifaddr 命令解析

当虚拟机运行中且安装了 QEMU Guest Agent 代理服务时，你可以使用 `virsh domifaddr` 命令一键查出来宾虚拟机的 IP 地址与 MAC 地址。

#### 命令用法与输出解析

在宿主机终端中执行：

```bash
virsh domifaddr svr-cli01
```

输出示例：

```text
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vda        52:54:00:12:34:56    ipv4         192.168.122.105/24
```

* **`Name`**：虚拟机内部网卡设备标识（如 `vda` 或 `enp1s0`）。
* **`MAC address`**：虚拟网卡的物理地址（以 `52:54:00` QEMU 官方前缀开头）。
* **`Protocol` & `Address`**：Guest 操作系统通过 DHCP 从宿主机 `virbr0` 虚拟网桥获取到的 IPv4 地址与掩码。
* **获取原理**：`virsh domifaddr` 通过三条渠道获取地址信息：1. **Leases 模式**（读取 `/var/lib/libvirt/dnsmasq/default.leases` DHCP 租约文件）；2. **Agent 模式**（通过 QEMU Guest Agent 串口通道直接向 Guest 内核查询）；3. **ARP 模式**（扫描宿主机内核 ARP 邻居表）。

## 本章小结

本课系统讲解了 KVM 虚拟化命令行管理体系的核心逻辑与实操技能：

1. **分工架构**：理清了 `virsh`（CLI 客户端）、`libvirt`（统一 API 守护进程）、QMP（底层专线）与 QEMU（虚拟机进程）的调用链路。
2. **生命周期**：掌握了虚拟机状态机切换，理清了 `shutdown`（优雅关机/按电源按键）与 `destroy`（硬拔电源线）、`undefine`（抹去配置户口）与删除磁盘镜像的本质区别。
3. **配置文件与驱动**：掌握了 Domain XML 的关键节点含义、Virtio 高速半虚拟化驱动与 NVRAM 固件机制，实现了配置与数据的安全解耦。
4. **参数化交付**：学会使用 `virt-install` 将命令行参数转化为标准 Domain XML，掌握了 QCOW2 精简置备（Thin Provisioning）按需分配优势，完美适配 Ubuntu 26.04 LTS 完成了 `svr-cli01` 实例的交付。
