12 管理储存 #
在 VM 主机服务器本身上管理 VM Guest 时,您可以访问 VM 主机服务器的整个文件系统,以挂接或创建虚拟硬盘,或将现有映像挂接到 VM Guest。但通过远程主机管理 VM Guest 时无法做到这些。出于此原因,libvirt
支持可从远程计算机访问的所谓“储存池”。
如果希望能够远程访问 VM 主机服务器上的 CD/DVD ISO 映像,需要将这些映像也放在储存池中。
libvirt
可识别两种不同类型的储存资源:卷和池。
- 储存卷
储存卷是可指派到 Guest 的储存设备 — 虚拟磁盘或 CD/DVD/软盘映像。从物理上而言(在 VM 主机服务器上),它可以是块设备(分区、逻辑卷等)或文件。
- 储存池
储存池是 VM 主机服务器上可用于储存卷的储存资源,类似于台式计算机的网络储存。从物理上而言,它可分为以下类型之一:
- 文件系统目录 ( )
用于存放映像文件的目录。文件可以是支持的磁盘格式之一(raw 或 qcow2),也可以是 ISO 映像。
- 物理磁盘设备 ( )
使用整个物理磁盘作为储存空间。系统会为添加到池的每个卷创建一个分区。
- 预格式化的块设备 ( )
指定要使用的分区,该分区与文件系统目录池(用于存放映像文件的目录)的使用方式相同。唯一的区别在于,使用文件系统目录时,
libvirt
会负责装入设备。- iSCSI 目标 (iscsi)
在 iSCSI 目标上设置池。您需要先登录卷一次,才能将卷用于
libvirt
。使用 YaST 来检测和登录卷,有关细节,请参见储存管理指南。不支持在 iSCSI 池中创建卷;每个现有逻辑单元号 (LUN) 都代表一个卷。每个卷/LUN 还需要一个有效的(空)分区表或磁盘标签,这样您才能使用该卷。如果没有分区表或磁盘标签,请使用fdisk
添加:~ # 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 的池时,也会删除卷组。这会导致池中储存的所有数据丢失且不可恢复!
- 多路径设备 ( )
目前,多路径支持仅限于向 Guest 指派现有设备。不支持从
libvirt
内部创建卷或配置多路径。- 网络导出的目录 ( )
指定要使用的网络目录,该网络目录与文件系统目录池(用于存放映像文件的目录)的使用方式相同。唯一的区别在于,使用文件系统目录时,
libvirt
会负责装入目录。支持的协议为 NFS 和 GlusterFS。- SCSI 主机适配器 ( )
SCSI 主机适配器的使用方式与 iSCSI 目标基本相同。我们建议使用基于
/dev/disk/by-*
的设备名称而不是/dev/sdX
。后者可能会发生变化(例如,添加或拆除硬盘时)。不支持在 iSCSI 池中创建卷。每个现有 LUN(逻辑单元号)都代表一个卷。
为了避免数据丢失或损坏,请不要尝试使用也用于在 VM 主机服务器上构建储存池的资源,例如 LVM 卷组、iSCSI 目标等。无需从 VM 主机服务器连接到这些资源,也无需在 VM 主机服务器上装入这些资源 — libvirt
将负责这些事项。
不要在 VM 主机服务器上按标签装入分区。在某些情况下,分区可能是从 VM Guest 内部使用 VM 主机服务器上已有的名称标记的。
12.1 使用虚拟机管理器管理储存 #
虚拟机管理器提供了一个图形界面,即储存管理器,用于管理储存卷和池。要访问储存管理器,请右键单击某个连接并选择
,或者高亮显示某个连接并选择 › 。选择 选项卡。12.1.1 添加储存池 #
要添加储存池,请执行以下操作:
单击左下角的
。 对话框即会显示。提供池的
(可包含字母数字字符和_-.
),然后选择 。按 可进行下一步。在随后出现的窗口中指定所需细节。需要输入的数据取决于您要创建的池类型:
- 类型:
- 类型:
/dev
。parted
-l
获取所需的格式。/dev/disk/by-*
的设备名称而不是简单的/dev/sdX
,因为后者可能会发生变化(例如,添加或拆除硬盘时)。您需要指定类似整个磁盘而不是磁盘上的分区(如果存在)的路径。
- 类型:
auto
应该不会有问题。/dev/disk/by-*
的设备名称而不是/dev/sdX
,因为后者可能会发生变化(例如,添加或拆除硬盘时)。
- 类型:
通过在 VM 主机服务器上运行以下命令来获取所需的数据:
tux >
sudo
iscsiadm --mode node此命令将返回采用以下格式的 iSCSI 卷列表。以粗体文本显示的元素是必需的:
IP_ADDRESS:PORT,TPGT TARGET_NAME_(IQN)
/dev/disk/by-path
(默认值)或/dev/disk/by-id
。
- 类型:
/dev
目录中目前不存在的设备名称。
- 类型:
- 类型:
- 类型:
/dev/disk/by-path
(默认值)或/dev/disk/by-id
。
注意:文件浏览从远程位置操作时,无法通过单击
使用文件浏览器。单击
以添加储存池。
12.1.2 管理储存池 #
您可以通过虚拟机管理器的储存管理器在池中创建或删除卷。您还可以暂时停用或永久删除现有的储存池。SUSE 目前不支持更改池的基本配置。
12.1.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 组将不再存在于主机系统上。其配置将不可恢复,并且此池中的所有卷都会丢失。
12.1.2.2 将卷添加到储存池 #
借助虚拟机管理器,您可以在所有储存池(多路径、iSCSI 或 SCSI 类型的池除外)中创建卷。这些池中的卷相当于 LUN,无法从 libvirt
内部更改。
可以使用储存管理器创建新卷,或者在将新储存设备添加到 VM Guest 时创建新卷。在以上任一情况下,请从左侧面板中选择一个储存池,然后单击
。指定映像的
并选择映像格式。SUSE 目前仅支持
raw
或qcow2
映像。后一个选项在基于 LVM 组的池中不可用。在
的旁边,指定允许磁盘映像达到的最大大小。除非您使用qcow2
映像,否则还可以设置最初应该分配的 量。如果这两个值不同,将会创建一个按需增长的稀疏映像文件。对于
qcow2
映像,可以使用一个构成基本映像的 (也称为“后备文件”)。这样新建的qcow2
映像便只会记录对基本映像进行的更改。单击
开始创建卷。
12.1.2.3 从储存池中删除卷 #
只能在储存管理器中删除卷:选择相应卷并单击
。单击 确认。即使活动或非活动的 VM Guest 中当前正在使用卷,也能将卷删除。无法恢复已删除的卷。
储存管理器中的
列会指示某个卷是否已由 VM Guest 使用。12.2 使用 virsh
管理储存 #
您也可以使用 virsh
通过命令行管理储存。不过,SUSE 目前不支持创建储存池。因此,本节仅限于介绍启动、停止和删除池以及卷管理等功能。
运行 virsh help pool
和 virsh help volume
可分别获取用于管理池和卷的所有 virsh
子命令列表。
12.2.1 列出池和卷 #
执行以下命令可以列出当前处于活动状态的所有池。要同时列出非活动池,请添加选项 --all
:
tux >
virsh pool-list --details
可以使用 pool-info
子命令获取有关特定池的细节:
tux >
virsh pool-info POOL
默认情况下,只能按池列出卷。要列出某个池中的所有卷,请输入以下命令。
tux >
virsh vol-list --details POOL
目前,virsh
不提供任何可显示某个卷是否已由 Guest 使用的工具。下面的过程说明如何列出所有池中当前已被 VM Guest 使用的卷。
将以下内容保存到某个文件(例如 ~/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> </xsl:text> </xsl:template> </xsl:stylesheet>
在外壳中运行以下命令:假设 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
12.2.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
12.2.3 将卷添加到储存池 #
virsh
提供了两种将卷添加到储存池的方法:在 XML 定义中使用 vol-create
和 vol-create-from
添加,或者使用 vol-create-as
通过命令行参数添加。SUSE 目前不支持前一种方法,因此本节重点介绍 vol-create-as
子命令。
要将卷添加到现有池,请输入以下命令:
tux >
virsh vol-create-as POOL1NAME2 12G --format3raw|qcow24 --allocation 4G5
卷要添加到的池的名称 | |
卷的名称 | |
卷的大小,在本示例中为 12 GB。使用后缀 k、M、G、T 来分别表示千字节、兆字节、千兆字节和万亿字节。 | |
卷的格式。SUSE 目前支持 | |
可选的参数。默认情况下,
如果不指定此参数,将生成不包含分配量的稀疏映像文件。要创建非稀疏卷,请使用此参数指定整个映像大小(在本示例中为 |
12.2.3.1 克隆现有卷 #
将卷添加到池的另一种方法是克隆现有卷。请始终在原始实例所在的同一个池中创建新实例。
tux >
virsh vol-clone NAME_EXISTING_VOLUME1NAME_NEW_VOLUME2 --pool POOL3
12.2.4 从储存池中删除卷 #
要从池中永久删除某个卷,请使用 vol-delete
子命令:
tux >
virsh vol-delete NAME --pool POOL
--pool
为可选项。libvirt
会尝试自动查找卷。如果找不到,请指定此参数。
无论卷当前是否已在活动或非活动的 VM Guest 中使用,都将一律被删除。无法恢复已删除的卷。
只能使用过程 12.1 “列出当前已在 VM 主机服务器上使用的所有储存卷”中所述的方法来检测某个卷是否已由 VM Guest 使用。
12.2.5 将卷挂接到 VM Guest #
按照第 12.2.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>
[...]
12.2.5.1 热插入或持久更改 #
可将磁盘挂接到活动和非活动的域。挂接操作由 --live
和 --config
选项控制:
--live
将磁盘热插入到活动域。挂接操作不会保存在域配置中。对非活动域使用
--live
会出错。--config
持久更改域配置。下一次启动域后,挂接的磁盘将可用。
--live
--config
热插入磁盘并将其添加到持久域配置中。
virsh attach-device
virsh attach-device
是 virsh attach-disk
的更通用的形式。可以使用此命令将其他类型的设备挂接到域。
12.2.6 从 VM Guest 分离卷 #
要从域分离磁盘,请使用 virsh detach-disk
:
root #
virsh detach-disk DOMAIN TARGET_DISK_DEVICE
例如:
root #
virsh detach-disk sles12sp3 sda2
可以按照第 12.2.5 节 “将卷挂接到 VM Guest”中所述,使用 --live
和 --config
选项来控制挂接操作。
12.3 使用 virtlockd
锁定磁盘文件和块设备 #
锁定块设备和磁盘文件可以防止从不同的 VM Guest 并发向这些资源写入数据。它可以防范启动同一个 VM Guest 两次,或者将同一个磁盘添加到两个不同的虚拟机。这样就会减少由于配置错误导致虚拟机磁盘映像损坏的风险。
锁定操作由名为 virtlockd
的守护程序控制。由于此守护程序独立于 libvirtd
守护程序运行,在 libvirtd
崩溃或重启动后,锁将会保留。甚至在 virtlockd
本身更新之后,锁也仍会保留,因为此守护程序能够自行重新执行。这可以确保当 virtlockd
更新后,无需重启动 VM Guest。KVM、QEMU 和 Xen 支持 virtlockd
。
12.3.1 启用锁定 #
SUSE Linux Enterprise Server 上默认未启用锁定虚拟磁盘的功能。要启用锁定并在系统重引导时自动启动锁定,请执行以下步骤:
编辑
/etc/libvirt/qemu.conf
并设置lock_manager = "lockd"
使用以下命令启动
virtlockd
守护程序:tux >
sudo
systemctl start virtlockd使用以下命令重启动
libvirtd
守护程序:tux >
sudo
systemctl restart libvirtd确保引导系统时自动启动
virtlockd
:tux >
sudo
systemctl enable virtlockd
12.3.2 配置锁定 #
virtlockd
默认配置为自动锁定为 VM Guest 配置的所有磁盘。默认设置使用“直接”锁空间,在这种情况下,系统会根据与 VM Guest <disk> 设备关联的实际文件路径获取锁。例如,如果 VM Guest 包含下面的 <disk> 设备,将直接针对 /var/lib/libvirt/images/my-server/disk0.raw
调用 flock(2)
:
<disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/my-server/disk0.raw'/> <target dev='vda' bus='virtio'/> </disk>
可以通过编辑 /etc/libvirt/qemu-lockd.conf
文件来更改 virtlockd
配置。此文件还包含详细注释及其他信息。确保通过重新装载 virtlockd
来激活配置更改:
tux >
sudo
systemctl reload virtlockd
12.3.2.2 在 LVM 或 iSCSI 卷上启用锁定 #
如果您要锁定由多个主机共享的 LVM 或 iSCSI 卷上的虚拟磁盘,则需要按 UUID 而不是路径(默认使用路径)执行锁定。此外,需将锁空间目录放在可供共享该卷的所有主机访问的共享文件系统上。为 LVM 和/或 iSCSI 设置以下选项:
lvm_lockspace_dir = "/MY_LOCKSPACE_DIRECTORY" iscsi_lockspace_dir = "/MY_LOCKSPACE_DIRECTORY"
12.4 联机调整 Guest 块设备的大小 #
有时,您需要更改(扩展或收缩)Guest 系统使用的块设备的大小。例如,当最初分配的磁盘空间不再足够时,便需要增大空间大小。如果 Guest 磁盘驻留在逻辑卷中,您可以在 Guest 系统正在运行时调整该磁盘的大小。与脱机调整磁盘大小相比(请参见 第 19.3 节 “Guestfs 工具” 软件包中的 virt-resize
命令),这是一项巨大的优势,因为 Guest 提供的服务在调整大小期间不会受到干扰。要调整 VM Guest 磁盘的大小,请执行以下步骤:
在 Guest 系统内部,检查磁盘(例如
/dev/vda
)的当前大小。root #
fdisk -l /dev/vda Disk /dev/sda: 160.0 GB, 160041885696 bytes, 312581808 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes在主机上,将容纳 Guest 磁盘
/dev/vda
的逻辑卷调整到所需大小,例如 200 GB。root #
lvresize -L 200G /dev/mapper/vg00-home Extending logical volume home to 200 GiB Logical volume home successfully resized在主机上,调整与 Guest 磁盘
/dev/mapper/vg00-home
相关的块设备的大小。请注意,您可以使用virsh list
来查找 DOMAIN_ID。root #
virsh blockresize --path /dev/vg00/home --size 200G DOMAIN_ID Block device '/dev/vg00/home' is resized检查 Guest 是否接受新磁盘大小。
root #
fdisk -l /dev/vda Disk /dev/sda: 200.0 GB, 200052357120 bytes, 390727260 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
12.6 通过 libvirt
使用 RADOS 块设备 #
RADOS 块设备 (RBD) 将数据储存在 Ceph 群集中。这些设备支持快照、复制和数据一致性。您可以像使用其他块设备一样,从 libvirt
管理的 VM Guest 使用 RBD。
有关更多细节,请参见 SUSE Enterprise Storage《Administration Guide》(管理指南)中的“Using libvirt with Ceph”(将 libvirt 与 Ceph 配合使用)一章。https://documentation.suse.com/ses/ 中提供了 SUSE Enterprise Storage 文档。