virsh

virsh 能实现的,virt-manger 都能实现

常用子命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
help               # 打印基本帮助信息
attach-device # 使用XML文件中的设备定义在虚拟机中添加设备
attach-disk # 在虚拟机中附加新磁盘设备
attach-interface # 在虚拟机中附加新网络接口
create # 从 XML 配置文件生成虚拟机并启动新虚拟机
define # 为虚拟机输出XML配置文件
destroy # 强制虚拟机停止
detach-device # 从虚拟机中分离设备,使用同样的XML 描述作为命令
attach-device
detach-disk # 从虚拟机中分离磁盘设备
detach-interface # 从虚拟机中分离网络接口
domblkstat # 显示正在运行的虚拟机的块设备统计
domid # 显示虚拟机ID
domifstat # 显示正在运行的虚拟机的网络接口统计
dominfo # 显示虚拟机信息
domname # 显示虚拟机名称
domstate # 显示虚以机状态
domuuid # 显示虚拟机UUID
dumpxml # 输出虚拟机 XML配置文件
list # 列出所有虚拟机
migrate # 将虚拟机迁移到另一台主机中
nodeinfo # 有关管理程序的输出信息
quit # 退出这个互动终端
reboot # 重新启动虚拟机
restore # 恢复以前保存在文件中的虚拟机
resume # 恢复暂停的虚拟机
save # 将虚拟机当前状态保存到某个文件中
setmaxmem # 为管理程序设定内存上限
setmem # 为虚拟机设定分配的内存
setvcpus # 修改为虚拟机分配的虚拟CPU数目
shutdown # 关闭某个虚拟机
start # 启动未激活的虚拟机
suspend # 暂停虚拟机
undefine # 删除与虚拟机关联的所有文件
vcpupin # 控制虚拟机的虚拟CPU亲和性
version # 显示virsh版

查看帮助:

1
2
virsh help    # virsh帮助
virsh help COMMAND # virsh子命令帮助

管理存储池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# virsh help pool

find-storage-pool-sources-as # 通过参数查找存储池源 find potential storage pool sources
find-storage-pool-sources # 通过XML文档查找存储池源找到潜在存储池源
pool-autostart # 自动启动某个池
pool-build # 建立池
pool-create-as # 在一组变量中定义池
pool-create # 从一个XML文件中创建一个池
pool-define-as # 从一组变量中创建一个池
pool-define # 在一个XML文件中定义(但不启动)一个池或修改已经有池
pool-delete # 删除池
pool-destroy # 销毁(停止)池
pool-dumpxml # 将池信息保存到XML文件中的
pool-edit # 为存储池编辑XML配置
pool-info # 存储池信息
pool-list # 列出池
pool-name # 把一个池名称转换为池UUID
pool-refresh # 刷新池
pool-start # 启动一个(以前定义的)非活跃的池
pool-undefine # 取消定义一个不活跃的池
pool-uuid # 将池UUID转换为池名称
pool-event # Storage Pool Events
pool-capabilities # storage pool capabilities
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# virsh help pool-create-as

virsh pool-create-as <name> <type> [OPTIONS]

每一个存储池都对应一个xml配置文件,其中的标签和下面的option都有对应
OPTIONS:
[--name] <string> # 储存池名称
[--type] <string> # 储存池类型
--print-xml # 打印xml文档
--source-host <string> # 底层存储的源主机
--source-path <string> # 底层存储的源路径
--source-dev <string> # 用于底层存储的源设备
--source-name <string> # 底层存储的源名称
--target <string> # 底层存储的目标
--source-format <string> # 底层存储格式
--auth-type <string> # 用于底层存储的认证类型
--auth-username <string> # 用于底层存储的认证用户名
--secret-usage <string> # 用于底层存储的认证秘密用法
--secret-uuid <string> # 用于底层存储的秘密UUID
--adapter-name <string> # 用于基础存储的适配器名称
--adapter-wwnn <string> # 用于底层存储的适配器wwnn
--adapter-wwpn <string> # 用于底层存储的适配器wwpn
--adapter-parent <string> # 用于底层vHBA存储的适配器父scsi_hostN
--adapter-parent-wwnn <string> # 用于底层vHBA存储的适配器父scsi_hostN wwnn
--adapter-parent-wwpn <string> # 用于底层vHBA存储的适配器父scsi_hostN wwpn
--adapter-parent-fabric-wwn <string> # 用于底层vHBA存储的适配器父scsi_hostN fabric_wwn
--source-protocol-ver <string> # nfsvers值NFS储存池挂载选项
--build # build the pool as normal
--no-overwrite # do not overwrite any existing data
--no-overwrite # overwrite any existing data

基于 dir 的 pool

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 创建存储池 vm_images_dir
virsh pool-define-as vm_images_dir dir --target "/data/vm_images"
# 2. /data/vm_images目录如果没有提前创建,可以使用pool-build自动创建
virsh pool-build vm_images_dir
# 3. 启动存储池
virsh pool-start vm_images_dir
# 4. 设置存储池自动启动
virsh pool-autostart vm_images_dir
# 5. 停止存储池,删除之前必须先停止
virsh pool-destroy --pool vm_images_dir
# 6. 删除存储池
virsh pool-delete --pool vm_images_dir # 删除数据
virsh pool-undefine --pool vm_images_dir # 删除配置

基于 fs 的 pool

基于已经创建文件系统的分区

1
2
3
4
5
6
7
8
9
10
# 1. 准备分区并创建文件系统
fdisk /dev/sdb
mkfs.ext4 /dev/sdb6
# 2. 准备存储池的挂载点目录,如果没有创建,创建存储池后执行`virsh pool-build vm_images_fs`会自动生成
mkdir /vm_images
# 3. 创建存储池 vm_images_fs
virsh pool-define-as vm_images_fs fs --source-dev "/dev/sdb6" --target "/vm_images"
# --source-dev:块设备名
# --target:mount到的目录名,libvirtd 会自动mount
# 4、5、6 启动、自动启动,停止、删除等操作所有类型的对于所有类型的存储池都一样,这里就不重复了

基于 disk 的 pool

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 准备工作:确认/dev/sdb磁盘的格式为gpt
# 2. 创建存储池
virsh pool-define-as vm_images_disk disk --source-dev "/dev/sdb" --source-format gpt --target "/dev"
# 或者直接编辑xml配置文件
<pool type='disk'>
<name>vm_images_disk</name>
<source>
<device path='/dev/sdb'/>
<format type='gpt'/>
</source>
<target>
<path>/dev</path>
</target>
</pool>
# 通过xml配置文件创建存储池
virsh pool-define vm_images_disk.xml

基于 LVM 的 pool

没有卷组,直接创建存储池:

1
2
virsh pool-define-as vm_images_lvm logical --source-dev=/dev/sdb
virsh pool-build vm_images_lvm

基于已有卷组,创建存储池(推荐):

1
virsh pool-define-as vm_images_lvm logical --source-name=vm_images_lvm

基于 NFS 的 pool

1
2
3
# 在宿主机执行:
virsh pool-define-as vm_images_nfs netfs \
--source-host 10.0.0.18 --source-path /data/kvmdata --target /data/vm_images_nfs

管理存储卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# virsh help volume

vol-clone # 克隆卷
vol-create-as # 通过一组参数创建卷
vol-create # 通过XML文件创建卷
vol-create-from # 通过输入的其他卷创建—个新的卷
vol-delete # 删除一个卷
vol-download # 下载卷的内容到一个文件
vol-dumpxml # 保存卷信息的信息到xML文件中
vol-info # 存储卷的信息
vol-key # 根据卷名或路径返回卷的key
vol-list # 列出卷
vol-name # 根据卷的key或路径返回卷名
vol-path # 根据卷名或key返回卷的路径
vol-pool # 根据卷的key或路径返回存储池
vol-resize # 调整卷大小
vol-upload # 上传文件内容到一个卷
vol-wipe # wipe ─个卷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# virsh help vol-create-as

virsh vol-create-as <pool> <name> <capacity> [OPTIONS]

OPTIONS
[--pool] <string> pool name
[--name] <string> name of the volume
[--capacity] <string> size of the vol, as scaled integer (default bytes)
--allocation <string> initial allocation size, as scaled integer (default bytes)
--format <string> file format type raw,bochs,qcow,qcow2,qed,vmdk
--backing-vol <string> the backing volume if taking a snapshot
--backing-vol-format <string> format of backing volume if taking a snapshot
--prealloc-metadata preallocate metadata (for qcow2 instead of full allocation)
--print-xml print XML document, but don't define/create

基于文件系统的存储池,创建其中的存储卷,可以使用 touchmkdirqemu-img create等命令,这些命令只能创建特定的存储卷,例如touch创建 raw 格式的文件,mkdir创建目录,qemu-img create创建磁盘镜像。

基于磁盘的存储池,创建其中的存储卷,也有对应命令,例如 disk 格式的存储池,使用fdisk创建分区;logical 格式的存储池,使用lvcreate,等等

virsh vol-create-as 配置项丰富,可以给各种类型的存储池,创建各种格式的存储卷,可以说相当于上述各种命令的合体

基于目录的 pool 的 volume 管理

1
2
3
4
# 新建
virsh vol-create-as vm_images_dir test1.qcow2 1g --format qcow2
# 删除
virsh vol-delete test1.qcow2 vm_images_dir

基于 LVM 的 pool 的 volume 管理

1
2
3
4
# 新建
virsh vol-create-as vm_images_lvm lvvol1 10g
# 删除
virsh vol-delete lvvol1 vm_images_lvm

克隆存储卷

克隆比直接 cp 复制文件要好

1
virsh vol-clone <vol> <newname> [--pool <string>] [--prealloc-metadata] [--reflink]

向虚拟机添加存储卷

1
2
3
4
virsh attach-disk <domain> <source> <target> [OPTIONS]

virsh attach-disk \
--domain centos7 --sourcetype block --source /dev/vm_images_lvm/lvvol1 --target vdb