跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 虚拟化指南 / 使用 libvirt 管理虚拟机 / 准备 VM 主机服务器
适用范围 SUSE Linux Enterprise Server 15 SP3

9 准备 VM 主机服务器

在可以安装 Guest 虚拟机之前,需要准备好 VM 主机服务器,以便为 Guest 提供正常运行所需的资源。具体而言,您需要配置:

  • 网络:使 Guest 能够利用主机提供的网络连接。

  • 一个可从主机访问的储存池,以使 Guest 能够储存其磁盘映像。

9.1 配置网络

有两个常用网络配置可为 VM Guest 提供网络连接:

  • 一个网桥。这是为 Guest 提供网络连接的默认方式,也是建议的方式。

  • 一个已启用转发的虚拟网络

9.1.1 网桥

网桥配置为 VM Guest 提供第 2 层交换机,可以基于与端口关联的 MAC 地址在网桥上的端口之间交换第 2 层以太网包。这样 VM Guest 便可通过第 2 层连接访问 VM 主机服务器的网络。此配置类似于将 VM Guest 的虚拟以太网网线连接到与主机以及主机上运行的其他 VM Guest 共享的集线器。该配置通常称为共享物理设备

SUSE Linux Enterprise Server 配置为 KVM 或 Xen 超级管理程序时,网桥配置是它的默认配置。如果您只想将 VM Guest 连接到 VM 主机服务器的 LAN,则此为首选配置。

9.1.1.1 使用 YaST 管理网桥

本节包含使用 YaST 添加或去除网桥的过程。

9.1.1.1.1 添加网桥

要在 VM 主机服务器上添加网桥,请执行以下步骤:

  1. 启动 YaST › 系统 › 网络设置

  2. 激活概述选项卡并单击添加

  3. 设备类型列表中选择网桥,然后在配置名称项中输入网桥设备接口名称。单击下一步按钮继续。

  4. 地址选项卡中指定网络细节,例如 DHCP/静态 IP 地址、子网掩码或主机名。

    仅当您也将设备指派到与 DHCP 服务器连接的网桥时,动态地址才有作用。

    如果您打算创建不与实际网络设备连接的虚拟网桥,请使用静态指派的 IP 地址。在这种情况下,比较好的做法是使用私用 IP 地址范围(例如 192.168.0.0/16172.16.0.0/1210.0.0.0/8)内的地址。

    要创建仅在不同 Guest 之间充当连接点,而不连接到主机系统的网桥,请将 IP 地址设置为 0.0.0.0,将子网掩码设置为 255.255.255.255。网络脚本会将此特殊地址作为未设置的 IP 地址来处理。

  5. 激活桥接的设备选项卡,然后激活您要包含在网桥中的网络设备。

  6. 单击下一步返回到概述选项卡,然后单击确定确认。现在,新网桥应在 VM 主机服务器上处于活动状态。

9.1.1.1.2 删除网桥

要删除现有网桥,请执行以下步骤:

  1. 启动 YaST › 系统 › 网络设置

  2. 概述选项卡上的列表中选择您要删除的网桥设备。

  3. 单击删除以删除该网桥,然后单击确定确认。

9.1.1.2 通过命令行管理网桥

本节包含使用命令行添加或去除网桥的过程。

9.1.1.2.1 添加网桥

要在 VM 主机服务器上添加新网桥设备,请执行以下步骤:

  1. 在要创建新网桥的 VM 主机服务器上以 root 身份登录。

  2. 为新网桥选择一个名称(在本示例中为 virbr_test),然后运行以下命令

    root # ip link add name VIRBR_TEST type bridge
  3. 检查是否已在 VM 主机服务器上创建了网桥:

    root # bridge vlan
    [...]
    virbr_test  1 PVID Egress Untagged

    virbr_test 存在,但不与任何物理网络接口相关联。

  4. 启动该网桥,并在其中添加一个网络接口:

    root # ip link set virbr_test up
    root # ip link set eth1 master virbr_test
    重要
    重要:网络接口必须未被使用

    只能指派尚未被其他网桥使用的网络接口。

  5. (可选)启用 STP(请参见生成树协议

    root # bridge link set dev virbr_test cost 4
9.1.1.2.2 删除网桥

要通过命令行删除 VM 主机服务器上的现有网桥设备,请执行以下步骤:

  1. 在要从中删除现有网桥的 VM 主机服务器上以 root 身份登录。

  2. 列出现有网桥,以识别要去除的网桥的名称:

    root # bridge vlan
    [...]
    virbr_test  1 PVID Egress Untagged
  3. 删除网桥:

    root # ip link delete dev virbr_test

9.1.1.3 使用 VLAN 接口

有时需要在两台 VM 主机服务器之间或者 VM Guest 系统之间创建私用连接。例如,将 VM Guest 迁移到其他网段中的主机时,或者创建只有 VM Guest 系统能够连接到的私用网桥(即使是在不同 VM 主机服务器系统上运行)时。构建此类连接的简单方法是设置 VLAN 网络。

VLAN 接口通常在 VM 主机服务器上设置。它们可以将不同的 VM 主机服务器系统互连,或者可以设置为其他仅限虚拟连接的网桥的物理接口。甚至可以创建一个使用 VLAN 作为物理接口(该接口在 VM 主机服务器中没有 IP 地址)的网桥。这样,Guest 系统就无法通过此网络访问主机。

运行 YaST 模块系统 › 网络设置。执行以下过程设置 VLAN 设备:

过程 9.1︰ 使用 YaST 设置 VLAN 接口
  1. 单击添加以创建新网络接口。

  2. 硬件对话框中,选择设备类型 VLAN

  3. 配置名称的值更改为 VLAN 的 ID。请注意,VLAN ID 1 通常用于管理目的。

  4. 单击下一步

  5. 将 VLAN 设备应连接到的借口选择为下面的 VLAN 的实际接口。如果所需的接口未显示在列表中,请先在不指定 IP 地址的情况下设置此接口。

  6. 选择将 IP 地址指派到 VLAN 设备的所需方法。

  7. 单击下一步完成配置。

还可将 VLAN 接口用作网桥的物理接口。这样便可以连接多个仅限 VM 主机服务器的网络,以及实时迁移与此类网络连接的 VM Guest 系统。

YaST 并非始终允许不设置 IP 地址。但有时可能需要这种功能,尤其是应该连接仅限 VM 主机服务器的网络时。在这种情况下,请使用特殊地址 0.0.0.0 和网络掩码 255.255.255.255。系统脚本会将此地址当作未设置 IP 地址来处理。

9.1.2 虚拟网络

libvirt 管理的虚拟网络类似于桥接的网络,但通常不与 VM 主机服务器建立第 2 层连接。与 VM 主机服务器物理网络的连接通过第 3 层转发来实现,与第 2 层桥接网络相比,第 3 层转发在 VM 主机服务器上引入了额外的包处理。虚拟网络还为 VM Guest 提供 DHCP 和 DNS 服务。有关 libvirt 虚拟网络的详细信息,请参见 https://libvirt.org/formatnetwork.html 上的《Network XML format》(网络 XML 格式)文档。

SUSE Linux Enterprise Server 上的标准 libvirt 安装中已预定义了一个名为 default 的虚拟网络。该虚拟网络提供网络的 DHCP 和 DNS 服务,并可使用网络地址转换 (NAT) 转发模式连接到 VM 主机服务器的物理网络。尽管 default 虚拟网络是预定义的,但它需要由管理员显式启用。有关 libvirt 支持的转发模式的详细信息,请参见 https://libvirt.org/formatnetwork.html#elementsConnect 上《Network XML format》(网络 XML 格式)文档中的“Connectivity”(连接)一节。

libvirt 管理的虚拟网络可用于满足各种用例,但通常是在进行无线连接或动态/零星网络连接的 VM 主机服务器(例如便携式计算机)上使用。虚拟网络也适用于 VM 主机服务器网络的 IP 地址有限的情形,可用来在虚拟网络与 VM 主机服务器的网络之间转发包。不过,大多数服务器用例更适合网桥配置,其中的 VM Guest 会连接到 VM 主机服务器的 LAN。

警告
警告:启用转发模式

libvirt 虚拟网络中启用转发模式会通过将 /proc/sys/net/ipv4/ip_forward/proc/sys/net/ipv6/conf/all/forwarding 设置为 1 在 VM 主机服务器中启用转发,而这本质上是将 VM 主机服务器转变成路由器。重启动 VM 主机服务器的网络可能会重设置值并禁用转发。要避免这种行为,请通过编辑 /etc/sysctl.conf 文件并添加以下设置,在 VM 主机服务器中显式启用转发:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

9.1.2.1 使用虚拟机管理器管理虚拟网络

您可以使用虚拟机管理器定义、配置和操作虚拟网络。

9.1.2.1.1 定义虚拟网络
  1. 启动虚拟机管理器。在可用连接列表中,右键单击您需要为其配置虚拟网络的连接名称,然后选择细节

  2. 连接细节窗口中,单击虚拟网络选项卡。您会看到可用于当前连接的所有虚拟网络的列表。右侧会显示选定虚拟网络的细节。

    连接细节
    图 9.1︰ 连接细节
  3. 要添加新虚拟网络,请单击添加

  4. 为新虚拟机指定名称。

    创建虚拟网络
    图 9.2︰ 创建虚拟网络
  5. 指定网络模式。对于 NAT路由类型,可以指定要将网络通讯转发到的设备。NAT(网络地址转换)会重新映射虚拟网络地址空间并允许共享单个 IP 地址,路由不会对来自虚拟网络的数据包进行任何转换即将其转发到 VM 主机服务器的物理网络。

  6. 如果您需要 IPv4 网络,请选中启用 IPv4 并指定 IPv4 网络地址。如果您需要 DHCP 服务器,请选中启用 DHCPv4 并指定可指派的 IP 地址范围。

  7. 如果您需要 IPv6 网络,请选中启用 IPv6 并指定 IPv6 网络地址。如果您需要 DHCP 服务器,请选中启用 DHCPv6 并指定可指派的 IP 地址范围。

  8. 如果您要指定与虚拟网络名称不同的域名,请在 DNS 域名下选择自定义,并在此处输入所需的域名。

  9. 单击完成以创建新虚拟网络。VM 主机服务器上即会有一个新的虚拟网桥 virbrX,该网桥对应于新建的虚拟网络。您可以使用 bridge link 进行检查。libvirt 会自动添加 iptables 规则来允许传入/传出挂接到新 virbrX 设备的 Guest 的流量。

9.1.2.1.2 启动虚拟网络

要启动某个暂时停止的虚拟网络,请执行以下步骤:

  1. 启动虚拟机管理器。在可用连接列表中,右键单击您需要为其配置虚拟网络的连接名称,然后选择细节

  2. 连接细节窗口中,单击虚拟网络选项卡。您会看到可用于当前连接的所有虚拟网络的列表。

  3. 要启动虚拟网络,请单击启动

9.1.2.1.3 停止虚拟网络

要停止活动的虚拟网络,请执行以下步骤:

  1. 启动虚拟机管理器。在可用连接列表中,右键单击您需要为其配置虚拟网络的连接名称,然后选择细节

  2. 连接细节窗口中,单击虚拟网络选项卡。您会看到可用于当前连接的所有虚拟网络的列表。

  3. 选择要停止的虚拟网络,然后单击停止

9.1.2.1.4 删除虚拟网络

要删除 VM 主机服务器中的虚拟网络,请执行以下步骤:

  1. 启动虚拟机管理器。在可用连接列表中,右键单击您需要为其配置虚拟网络的连接名称,然后选择细节

  2. 连接细节窗口中,单击虚拟网络选项卡。您会看到可用于当前连接的所有虚拟网络的列表。

  3. 选择要删除的虚拟网络,然后单击删除

9.1.2.1.5 使用 nsswitch 获取 NAT 网络的 IP 地址(在 KVM 中)
  • 在 VM 主机服务器上,安装用来为 libvirt 提供 NSS 支持的 libvirt-nss:

    tux > sudo zypper in libvirt-nss
  • libvirt 添加到 /etc/nsswitch.conf

    ...
    hosts:  files libvirt mdns_minimal [NOTFOUND=return] dns
    ...
  • 如果 NSCD 正在运行,请将其重启动:

    tux > sudo systemctl restart nscd

现在,您可以从主机按名称访问 Guest 系统了。

NSS 模块的功能有限。它会读取 /var/lib/libvirt/dnsmasq/*.status 文件,以在描述 dnsmasq 所提供的每个租约的 JSON 记录中查找主机名和对应的 IP 地址。只能使用受 dnsmasq 支持且由 libvirt 管理的桥接网络在这些 VM 主机服务器上执行主机名转换。

9.1.2.2 使用 virsh 管理虚拟网络

您可以使用 virsh 命令行工具来管理 libvirt 提供的虚拟网络。要查看所有与网络相关的 virsh 命令,请运行以下命令

tux > sudo virsh help network
Networking (help keyword 'network'):
 net-autostart                  autostart a network
        net-create                     create a network from an XML file
        net-define                     define (but don't start) a network from an XML file
        net-destroy                    destroy (stop) a network
        net-dumpxml                    network information in XML
        net-edit                       edit XML configuration for a network
        net-event                      Network Events
        net-info                       network information
        net-list                       list networks
        net-name                       convert a network UUID to network name
        net-start                      start a (previously defined) inactive network
        net-undefine                   undefine an inactive network
        net-update                     update parts of an existing network's configuration
 net-uuid                       convert a network name to network UUID

要查看特定 virsh 命令的简要帮助信息,请运行 virsh help VIRSH_COMMAND

tux > sudo virsh help net-create
  NAME
    net-create - create a network from an XML file

  SYNOPSIS
    net-create <file>

  DESCRIPTION
    Create a network.

  OPTIONS
    [--file] <string>  file containing an XML network description
9.1.2.2.1 创建网络

要创建新的运行中虚拟网络,请运行以下命令

tux > sudo virsh net-create VNET_DEFINITION.xml

VNET_DEFINITION.xml XML 文件包含 libvirt 接受的虚拟网络的定义。

要定义新虚拟网络但不激活它,请运行以下命令

tux > sudo virsh net-define VNET_DEFINITION.xml

以下示例说明了不同类型的虚拟网络的定义。

例 9.1︰ 基于 NAT 的网络

下面的配置允许进行 VM Guest 传出连接(如果 VM 主机服务器上提供此功能)。当没有 VM 主机服务器网络时,此配置可让 Guest 互相直接通讯。

<network>
<name>vnet_nated</name>1
<bridge name="virbr1"/>2
 <forward mode="nat"/>3
 <ip address="192.168.122.1" netmask="255.255.255.0">4
  <dhcp>
   <range start="192.168.122.2" end="192.168.122.254"/>5
   <host mac="52:54:00:c7:92:da" name="host1.testing.com" \
    ip="192.168.1.23.101"/>6
   <host mac="52:54:00:c7:92:db" name="host2.testing.com" \
    ip="192.168.1.23.102"/>
   <host mac="52:54:00:c7:92:dc" name="host3.testing.com" \
    ip="192.168.1.23.103"/>
  </dhcp>
 </ip>
</network>

1

新虚拟网络的名称。

2

用于构造虚拟网络的网桥设备的名称。定义 <forward> 模式为“nat”或“route”的新网络(或者不包含 <forward> 元素的隔离网络)时,libvirt 将自动为网桥设备生成唯一的名称(如果未指定名称)。

3

包含 <forward> 元素表示该虚拟网络将连接到物理 LAN。mode 属性指定转发方法。最常用的模式为“nat”(网络地址转换,默认值)、“route”(直接转发到物理网络,不执行地址转换)和“bridge”(在 libvirt 外部配置的网桥)。如果不指定 <forward> 元素,虚拟网络将与其他网络相隔离。有关转发模式的完整列表,请参见 https://libvirt.org/formatnetwork.html#elementsConnect

4

网桥的 IP 地址和网络掩码。

5

为虚拟网络启用 DHCP 服务器,并提供 startend 属性所指定的范围内的 IP 地址。

6

可选的 <host> 元素指定内置 DHCP 服务器要为其分配名称和预定义 IP 地址的主机。任何 IPv4 host 元素都必须指定以下设置:要为其指派给定名称的主机的 MAC 地址、要指派到该主机的 IP,以及 DHCP 服务器要为该主机分配的名称。IPv6 host 元素与 IPv4 略有不同,它没有 mac 属性,因为 MAC 地址在 IPv6 中没有明确的含义。IPv6 中使用 name 属性来标识要为其指派 IPv6 地址的主机。对于 DHCPv6,name 是由客户端发送到服务器的客户端主机的纯文本名称。请注意,您也可以使用这种指派特定 IP 地址的方法来代替 IPv4 中的 mac 属性。

例 9.2︰ 路由网络

下面的配置会在不应用任何 NAT 的情况下将流量从虚拟网络路由到 LAN。必须在 VM 主机服务器网络上的路由器的路由表中预定义 IP 地址范围。

<network>
 <name>vnet_routed</name>
 <bridge name="virbr1"/>
 <forward mode="route" dev="eth1"/>1
 <ip address="192.168.122.1" netmask="255.255.255.0">
  <dhcp>
   <range start="192.168.122.2" end="192.168.122.254"/>
  </dhcp>
 </ip>
</network>

1

Guest 流量只能通过 VM 主机服务器上的 eth1 网络设备传出。

例 9.3︰ 隔离网络

此配置提供完全隔离的专用网络。Guest 可以相互通讯以及与 VM 主机服务器通讯,但无法访问 LAN 上的任何其他计算机,因为 XML 说明中没有 <forward> 元素。

<network>
 <name>vnet_isolated</name>
 <bridge name="virbr3"/>
 <ip address="192.168.152.1" netmask="255.255.255.0">
  <dhcp>
   <range start="192.168.152.2" end="192.168.152.254"/>
  </dhcp>
 </ip>
 </network>
例 9.4︰ 使用 VM 主机服务器上的现有网桥

此配置说明如何使用 VM 主机服务器的现有网桥 br0。VM Guest 直接连接到物理网络。其 IP 地址全部都在物理网络的子网中,并且传入和传出连接不存在任何限制。

<network>
        <name>host-bridge</name>
        <forward mode="bridge"/>
        <bridge name="br0"/>
</network>
9.1.2.2.2 列出网络

要列出 libvirt 可用的所有虚拟网络,请运行以下命令:

tux > sudo virsh net-list --all

 Name                 State      Autostart     Persistent
----------------------------------------------------------
 crowbar              active     yes           yes
 vnet_nated           active     yes           yes
 vnet_routed          active     yes           yes
 vnet_isolated        inactive   yes           yes

要列出可用域,请运行以下命令:

tux > sudo virsh list
 Id    Name                           State
----------------------------------------------------
 1     nated_sles12sp3                running
 ...

要获取运行中域的接口列表,请运行 domifaddr DOMAIN,或选择性地指定接口,以在输出中仅列出此接口。默认情况下,会额外输出接口的 IP 和 MAC 地址:

tux > sudo virsh domifaddr nated_sles12sp3 --interface vnet0 --source lease
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:9e:0d:2b    ipv6         fd00:dead:beef:55::140/64
 -          -                    ipv4         192.168.100.168/24

要列显与指定域关联的所有虚拟接口的简要信息,请运行以下命令:

tux > sudo virsh domiflist nated_sles12sp3
Interface  Type       Source       Model       MAC
---------------------------------------------------------
vnet0      network    vnet_nated   virtio      52:54:00:9e:0d:2b
9.1.2.2.3 获取有关网络的细节

要获取有关网络的详细信息,请运行以下命令:

tux > sudo virsh net-info vnet_routed
Name:           vnet_routed
UUID:           756b48ff-d0c6-4c0a-804c-86c4c832a498
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr5
9.1.2.2.4 启动网络

要启动某个已定义的非活动网络,请使用以下命令查找其名称(或唯一标识符,即 UUID):

tux > sudo virsh net-list --inactive
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 vnet_isolated        inactive   yes           yes

然后运行:

tux > sudo virsh net-start vnet_isolated
Network vnet_isolated started
9.1.2.2.5 停止网络

要停止某个活动的网络,请使用以下命令查找其名称(或唯一标识符,即 UUID):

tux > sudo virsh net-list --inactive
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 vnet_isolated        active     yes           yes

然后运行:

tux > sudo virsh net-destroy vnet_isolated
Network vnet_isolated destroyed
9.1.2.2.6 去除网络

要从 VM 主机服务器中永久去除某个非活动网络的定义,请运行以下命令:

tux > sudo virsh net-undefine vnet_isolated
Network vnet_isolated has been undefined

9.2 配置储存池

在 VM 主机服务器本身上管理 VM Guest 时,您可以访问 VM 主机服务器的整个文件系统,以挂接或创建虚拟硬盘,或将现有映像挂接到 VM Guest。但通过远程主机管理 VM Guest 时无法做到这些。出于此原因,libvirt 支持可从远程计算机访问的所谓储存池

提示
提示:CD/DVD ISO 映像

如果希望能够从远程客户端访问 VM 主机服务器上的 CD/DVD ISO 映像,需要将这些映像也放在储存池中。

libvirt 可识别两种不同类型的储存资源:卷和池。

储存卷

储存卷是可指派到 Guest 的储存设备 — 虚拟磁盘或 CD/DVD/软盘映像。从物理上讲,它可以是块设备(例如分区或逻辑卷),也可以是 VM 主机服务器上的某个文件。

储存池

储存池是 VM 主机服务器上可用于储存卷的储存资源,类似于台式计算机的网络储存。从物理上而言,它可分为以下类型之一:

文件系统目录 (dir)

用于存放映像文件的目录。文件可以是支持的磁盘格式之一(raw 或 qcow2),也可以是 ISO 映像。

物理磁盘设备 (disk)

使用整个物理磁盘作为储存空间。系统会为添加到池的每个卷创建一个分区。

预格式化的块设备 (fs)

指定要使用的分区,该分区与文件系统目录池(用于存放映像文件的目录)的使用方式相同。唯一的区别在于,使用文件系统目录时,libvirt 会负责挂载设备。

iSCSI 目标 (iscsi)

在 iSCSI 目标上设置池。您需要先登录卷一次才能将卷用于 libvirt。使用 YaST iSCSI 发起端来检测和登录卷,有关细节,请参见储存管理指南。不支持在 iSCSI 池中创建卷;每个现有逻辑单元号 (LUN) 都代表一个卷。每个卷/LUN 还需要一个有效的(空)分区表或磁盘标签,这样您才能使用该卷。如果没有分区表或磁盘标签,请使用 fdisk 添加:

tux > sudo fdisk -cu /dev/disk/by-path/ip-192.168.2.100:3260-iscsi-iqn.2010-10.com.example:[...]-lun-2
Device contains neither a valid DOS partition table, nor Sun, SGI
or OSF disklabel
Building a new DOS disklabel with disk identifier 0xc15cdc4e.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
LVM 卷组 (logical)

使用 LVM 卷组作为池。您可以使用预定义的卷组,或者通过指定要使用的设备来创建组。储存卷会创建为卷上的分区。

警告
警告:删除基于 LVM 的池

在储存管理器中删除基于 LVM 的池时,也会删除卷组。这会导致池中储存的所有数据丢失且不可恢复!

多路径设备 (mpath)

目前,多路径支持仅限于向 Guest 指派现有设备。不支持从 libvirt 内部创建卷或配置多路径。

网络导出的目录 (netfs)

指定要使用的网络目录,该网络目录与文件系统目录池(用于存放映像文件的目录)的使用方式相同。唯一的区别在于,使用文件系统目录时,libvirt 会负责挂载目录。支持的协议为 NFS 和 GlusterFS。

SCSI 主机适配器 (scsi)

SCSI 主机适配器的使用方式与 iSCSI 目标基本相同。我们建议使用基于 /dev/disk/by-* 的设备名称而不是 /dev/sdX。后者可能会发生变化(例如,添加或拆除硬盘时)。不支持在 iSCSI 池中创建卷。每个现有 LUN(逻辑单元号)都代表一个卷。

警告
警告:安全考虑因素

为了避免数据丢失或损坏,请不要尝试使用也用于在 VM 主机服务器上构建储存池的资源,例如 LVM 卷组、iSCSI 目标等。无需从 VM 主机服务器连接到这些资源,也无需在 VM 主机服务器上挂载这些资源 — libvirt 将负责这些事项。

不要在 VM 主机服务器上按标签挂载分区。在某些情况下,分区可能是从 VM Guest 内部使用 VM 主机服务器上已有的名称标记的。

9.2.1 使用 virsh 管理储存设备

您也可以使用 virsh 通过命令行管理储存。不过,SUSE 目前不支持创建储存池。因此,本节仅会介绍启动、停止和删除池以及卷管理等功能。

运行 virsh help poolvirsh help volume 可分别获取用于管理池和卷的所有 virsh 子命令列表。

9.2.1.1 列出池和卷

执行以下命令可以列出当前处于活动状态的所有池。要同时列出非活动池,请添加选项 --all

tux > virsh pool-list --details

可以使用 pool-info 子命令获取有关特定池的细节:

tux > virsh pool-info POOL

默认情况下,只能按池列出卷。要列出某个池中的所有卷,请输入以下命令。

tux > virsh vol-list --details POOL

目前,virsh 不提供任何可显示某个卷是否已由 Guest 使用的工具。下面的过程说明如何列出所有池中当前已被 VM Guest 使用的卷。

过程 9.2︰ 列出 VM 主机服务器上当前使用的所有储存卷
  1. 将以下内容保存到某个文件(例如 ~/libvirt/guest_storage_list.xsl)来创建一个 XSLT 样式表:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="text"/>
      <xsl:template match="text()"/>
      <xsl:strip-space elements="*"/>
      <xsl:template match="disk">
        <xsl:text>  </xsl:text>
        <xsl:value-of select="(source/@file|source/@dev|source/@dir)[1]"/>
        <xsl:text>&#10;</xsl:text>
      </xsl:template>
    </xsl:stylesheet>
  2. 在外壳中运行以下命令:假设 Guest 的 XML 定义全部储存在默认位置 (/etc/libvirt/qemu)。xsltproc 由软件包 libxslt 提供。

    SSHEET="$HOME/libvirt/guest_storage_list.xsl"
    cd /etc/libvirt/qemu
    for FILE in *.xml; do
      basename $FILE .xml
      xsltproc $SSHEET $FILE
    done

9.2.1.2 启动、停止和删除池

使用 virsh pool 子命令来启动、停止或删除池。在以下示例中,请将 POOL 替换为池的名称或其 UUID:

停止池
tux > virsh pool-destroy POOL
注意
注意:池的状态不会影响挂接的卷

无论池处于什么状态(活动(已停止)或非活动(已启动)),池中挂接到 VM Guest 的卷都始终可用。池的状态只会影响到能否通过远程管理将卷挂接到 VM Guest。

删除存储池
tux > virsh pool-delete POOL
警告
警告:删除储存池

请参见警告:删除储存池

启动池
tux > virsh pool-start POOL
启用池自动启动功能
tux > virsh pool-autostart POOL

只有标记为 autostart 的池才会自动在 VM 主机服务器重引导时启动。

禁用池自动启动功能
tux > virsh pool-autostart POOL --disable

9.2.1.3 将卷添加到储存池

virsh 提供了两种将卷添加到储存池的方法:在 XML 定义中使用 vol-createvol-create-from 添加,或者使用 vol-create-as 通过命令行参数添加。SUSE 目前不支持前一种方法,因此本节重点介绍 vol-create-as 子命令。

要将卷添加到现有池,请输入以下命令:

tux > virsh vol-create-as POOL1NAME2 12G --format3raw|qcow24 --allocation 4G5

1

卷要添加到的池的名称

2

卷的名称

3

卷的大小,在本示例中为 12 GB。使用后缀 k、M、G、T 来分别表示千字节、兆字节、千兆字节和万亿字节。

4

卷的格式。SUSE 目前支持 rawqcow2

5

可选的参数。默认情况下,virsh 将创建一个按需增长的稀疏映像文件。使用此参数指定应分配的空间量(本示例中为 4 GB)。使用后缀 k、M、G、T 来分别表示千字节、兆字节、千兆字节和万亿字节。

如果不指定此参数,将生成不包含分配量的稀疏映像文件。要创建非稀疏卷,请使用此参数指定整个映像大小(在本示例中为 12G)。

9.2.1.3.1 克隆现有卷

将卷添加到池的另一种方法是克隆现有卷。请始终在原始实例所在的同一个池中创建新实例。

tux > virsh vol-clone NAME_EXISTING_VOLUME1NAME_NEW_VOLUME2 --pool POOL3

1

要克隆的现有卷的名称

2

新卷的名称

3

可选的参数。libvirt 会尝试自动查找现有卷。如果找不到,请指定此参数。

9.2.1.4 从储存池中删除卷

要从池中永久删除某个卷,请使用 vol-delete 子命令:

tux > virsh vol-delete NAME --pool POOL

--pool 为可选项。libvirt 会尝试自动查找卷。如果找不到,请指定此参数。

警告
警告:删除卷时不会进行检查

无论卷当前是否已在活动或非活动的 VM Guest 中使用,都将一律被删除。无法恢复已删除的卷。

只能使用过程 9.2 “列出 VM 主机服务器上当前使用的所有储存卷”中所述的方法来检测某个卷是否已由 VM Guest 使用。

9.2.1.5 将卷挂接到 VM Guest

按照第 9.2.1.3 节 “将卷添加到储存池”中所述创建卷后,可将其挂接到虚拟机并作为硬盘使用:

tux > virsh attach-disk DOMAIN SOURCE_IMAGE_FILE TARGET_DISK_DEVICE

例如:

tux > virsh attach-disk sles12sp3 /virt/images/example_disk.qcow2 sda2

要检查是否已挂接新磁盘,请检查 virsh dumpxml 命令的结果:

root # virsh dumpxml sles12sp3
[...]
<disk type='file' device='disk'>
 <driver name='qemu' type='raw'/>
 <source file='/virt/images/example_disk.qcow2'/>
 <backingStore/>
 <target dev='sda2' bus='scsi'/>
 <alias name='scsi0-0-0'/>
 <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
[...]
9.2.1.5.1 热插入或持久更改

可将磁盘挂接到活动和非活动的域。挂接操作由 --live--config 选项控制:

--live

将磁盘热插入到活动域。挂接操作不会保存在域配置中。对非活动域使用 --live 会出错。

--config

持久更改域配置。下一次启动域后,挂接的磁盘将可用。

--live--config

热插入磁盘并将其添加到持久域配置中。

提示
提示:virsh attach-device

virsh attach-devicevirsh attach-disk 的更通用的形式。可以使用此命令将其他类型的设备挂接到域。

9.2.1.6 从 VM Guest 分离卷

要从域分离磁盘,请使用 virsh detach-disk

root # virsh detach-disk DOMAIN TARGET_DISK_DEVICE

例如:

root # virsh detach-disk sles12sp3 sda2

可以按照第 9.2.1.5 节 “将卷挂接到 VM Guest”中所述,使用 --live--config 选项来控制挂接操作。

9.2.2 使用虚拟机管理器管理储存设备

虚拟机管理器提供了一个图形界面,即储存管理器,用于管理储存卷和池。要访问储存管理器,请右键单击某个连接并选择细节,或者高亮显示某个连接并选择编辑 › 连接细节。选择储存选项卡。

Image

9.2.2.1 添加储存池

要添加储存池,请执行以下操作:

  1. 单击左下角的添加添加新储存池对话框即会显示。

  2. 提供池的名称(仅可包含字母数字字符以及 _-.),然后选择类型

    Image
  3. 在下面指定所需的细节。具体的值取决于您要创建的池类型。

    类型: dir
    • 目标路径:指定现有目录。

    类型: disk
    • 格式:设备分区表的格式。一般情况下,使用 auto 应该不会有问题。如果有问题,请通过在 VM 主机服务器上运行命令 parted -l 获取所需的格式。

    • 源路径:设备的路径。建议使用基于 /dev/disk/by-* 的设备名称而不是简单的 /dev/sdX,因为后者可能会发生变化(例如,添加或拆除硬盘时)。您需要指定类似整个磁盘而不是磁盘上的分区(如果存在)的路径。

    类型: fs
    • 目标路径:VM 主机服务器文件系统上的挂载点。

    • 格式:设备的文件系统格式。使用默认值 auto 应该不会有问题。

    • 源路径:设备文件的路径。建议使用基于 /dev/disk/by-* 的设备名称而不是 /dev/sdX,因为后者可能会发生变化(例如,添加或拆除硬盘时)。

    类型: iscsi

    通过在 VM 主机服务器上运行以下命令来获取所需的数据:

    tux > sudo iscsiadm --mode node

    此命令将返回采用以下格式的 iSCSI 卷列表。以粗体文本显示的元素是必需的:

    IP_ADDRESS:PORT,TPGT TARGET_NAME_(IQN)
    • 目标路径:包含设备文件的目录。使用 /dev/disk/by-path(默认值)或 /dev/disk/by-id

    • 主机名:iSCSI 服务器的主机名或 IP 地址。

    • 源 IQN:iSCSI 目标名称(iSCSI 限定的名称)。

    • 发起端 IQN:iSCSI 发起端名称。

    类型: logical
    • 卷组名称:指定现有卷组的设备路径。

    类型: mpath
    • 目标路径:目前对多路径的支持仅限于通过它来使所有多路径设备可用。因此,请在此处指定任意字符串,此字符串随后将被忽略。必须指定路径,否则 XML 解析器将会失败。

    类型: netfs
    • 目标路径:VM 主机服务器文件系统上的挂载点。

    • 主机名:要导出网络文件系统的服务器的 IP 地址或主机名。

    • 源路径:正在导出的服务器上的目录。

    类型: rbd
    • 主机名:导出的 RADOS 块设备所在服务器的主机名。

    • 源名称:服务器上 RADOS 块设备的名称。

    类型: scsi
    • 目标路径:包含设备文件的目录。使用 /dev/disk/by-path(默认值)或 /dev/disk/by-id

    • 源路径:SCSI 适配器的名称。

    类型: zfs

    源名称:ZFS 池的名称。

    注意
    注意:文件浏览

    从远程位置操作时,无法通过单击浏览使用文件浏览器。

  4. 单击完成以添加储存池。

9.2.2.2 管理储存池

您可以通过虚拟机管理器的储存管理器在池中创建或删除卷。您还可以暂时停用或永久删除现有的储存池。SUSE 目前不支持更改池的基本配置。

9.2.2.2.1 启动、停止和删除池

储存池的用途是提供 VM 主机服务器上的块设备,远程管理 VM Guest 时,可将这些设备添加到其中。要暂时禁止远程访问某个池,请单击储存管理器左下角的停止。停止的池标记为状态:非活动,并在列表窗格中灰显。默认情况下,新建的池在 VM 主机服务器引导时会自动启动。

要启动某个非活动的池并再次使其可从远程位置使用,请单击储存管理器左下角的启动

注意
注意:池的状态不会影响挂接的卷

无论池处于什么状态(活动(已停止)或非活动(已启动)),池中挂接到 VM Guest 的卷都始终可用。池的状态只会影响到能否通过远程管理将卷挂接到 VM Guest。

要永久禁止访问某个池,请单击储存管理器左下角的删除。您只能删除非活动的池。删除某个池不会实际擦除其在 VM 主机服务器上的内容,而只会删除池配置。不过,在删除池时需要额外小心,尤其是删除基于 LVM 卷组的工具时:

警告
警告:删除储存池

删除基于本地文件系统目录、本地分区或磁盘的储存池不会影响到这些池中当前挂接到 VM Guest 的卷的可用性。

如果删除 iSCSI、SCSI、LVM 组或网络导出的目录这些类型的池,将无法再从 VM Guest 访问这些池中的卷。尽管卷本身不会被删除,但 VM 主机服务器将不再可以访问这些资源。

创建足够大的新池或者直接从主机系统挂载/访问这些资源时,iSCSI/SCSI 目标或网络导出的目录中的卷将再次可供访问。

删除基于 LVM 组的储存池时,将擦除 LVM 组定义,并且该 LVM 组将不再存在于主机系统上。其配置将不可恢复,并且此池中的所有卷都会丢失。

9.2.2.2.2 将卷添加到储存池

借助虚拟机管理器,您可以在所有储存池(多路径、iSCSI 或 SCSI 类型的池除外)中创建卷。这些池中的卷相当于 LUN,无法从 libvirt 内部更改。

  1. 可以使用储存管理器创建新卷,或者在将新储存设备添加到 VM Guest 时创建新卷。在以上任一情况下,请从左侧面板中选择一个储存池,然后单击创建新卷

  2. 指定映像的名称并选择映像格式。

    SUSE 目前仅支持 rawqcow2 映像。后一个选项在基于 LVM 组的池中不可用。

    最大容量的旁边,指定允许磁盘映像达到的最大大小。除非您使用 qcow2 映像,否则还可以设置最初应该分配的分配量。如果这两个值不同,将会创建一个按需增长的稀疏映像文件。

    对于 qcow2 映像,可以使用一个构成基本映像的后备储存(也称为后备文件)。这样新建的 qcow2 映像便只会记录对基本映像进行的更改。

  3. 单击完成开始创建卷。

9.2.2.2.3 从储存池中删除卷

只能在储存管理器中删除卷:选择相应卷并单击删除卷。单击确认。

警告
警告:即使卷处于使用中状态,也能将其删除

即使活动或非活动的 VM Guest 中当前正在使用卷,也能将卷删除。无法恢复已删除的卷。

储存管理器中的使用对象列会指示某个卷是否已由 VM Guest 使用。