kvm常用指令


基础命令

列出处于运行状态或暂停状态的虚拟机:

virsh list

列出所有虚拟机,无论处于什么状态:

virsh list --all

停止虚拟机:

virsh shutdown 虚拟机名

开启虚拟机:

virsh start 虚拟机名

暂停挂起虚拟机:

virsh suspend 虚拟机名

让处于暂停状态的虚拟机继续运行:

virsh resume 虚拟机名

查看虚拟机的概览信息,例如cpu数量,内存大小,是否自启动等信息:

virsh dominfo 虚拟机名

设置虚拟机自启动:

virsh autostart 虚拟机名

取消虚拟机自启动:

virsh autostart --disable 虚拟机名

查看所有子命令的使用方法:

virsh --help

之前的命令都是在宿主机上的bash中执行的,其实,我们也可以不加任何参数,只执行 virsh命令,这样会进入到 virsh的终端中,然后再在 virsh的终端中执行子命令,效果如下

[root@cos7 ~]# virsh
Welcome to virsh, the virtualization interactive terminal.
 
Type:  'help' for help with commands
       'quit' to quit
 
virsh # list --all

虚拟机详细配置文件默认存放在 /etc/libvirt/qemu目录下,xxx.xml文件中存放的就是某台虚拟机详细的配置

修改虚拟机配置文件的命令:

virsh edit 虚拟机名

图形化界面去修改对应的配置:

virt-manager

导出虚拟机配置文件:

virsh dumpxml 虚拟机名
virsh dumpxml 虚拟机名 > /tmp/虚拟机名.xml

创建磁盘命令:

qemu-img create -f qcow2 test.qcow2 50G

qemu-img命令是一个磁盘镜像管理工具,上述命令表示创建一个格式为 qcow2的磁盘(-f选项用于指定磁盘格式),磁盘名为 test.qcow2,磁盘大小为50G,由于我没有指定路径,所以 test.qcow2文件会在当前目录下创建,除了 qcow2格式,qemu-img还支持很多种其他的磁盘格式,支持的格式如下:

qemu-img -h  | grep Supported
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug

查看磁盘信息:

qemu-img info test.qcow2

刚创建出来的磁盘文件是很小的,不指定空间动态预分配策略时,不会直接分配所有空间,默认动态分配空间

创建

创建虚拟机命令:

virt-install --name=kvm2 --vcpus=2 --memory=2048 --location=/data/iso/CentOS-7-x86_64-DVD-2009.iso --disk path=/var/lib/libvirt/images/kvm2.qcow2 --network network=default --graphics none --extra-args='console=ttyS0'

上述virt-install命令各个参数含义如下
--name=kvm2表示为创建的虚拟机命名为kvm2。
--vcpus=2表示设置虚拟机cpu有2个核心。
--memory=2048表示设置内存为2G。
--location=/data/iso/CentOS-7-x86_64-DVD-2009.iso表示使用本地iso镜像安装虚拟机
--disk path=/var/lib/libvirt/images/kvm2.qcow2表示指定虚拟机的磁盘镜像的路径
--network network=default表示使用kvm的默认网络,默认网络是IP段为192.168.122.0/24的NAT网络。
--graphics none表示我们安装的过程中,是否需要使用的图形化控制台,由于我们此处模拟的是纯命令行安装,所以图形化控制台指定为none,表示不使用图形化控制台安装虚拟机。
--extra-args='console=ttyS0'表示为创建的虚拟机指定内核启动时的内核参数,此处为虚拟机内核添加的参数为console=ttyS0。也就是说,当安装虚拟机时,分配一个ttyS0的虚拟终端,因为我们没有使用图形化控制台安装,所以要分配一个命令行的虚拟终端,以便执行安装操作和安装完成后的登录、执行命令等操作。

在宿主机中,再次登录kvm2虚拟机的控制台,只需要在宿主机中执行:

virsh console kvm2

图形化安装的虚拟机,内核启动时不会分配虚拟终端,可以在此虚拟机中修改内核参数(重要环境提前做好备份):

grubby --update-kernel=ALL --args="console=ttyS0"

查看客户机是否支持 virtio驱动:

lsmod | grep virtio

如果使用命令安装虚拟机时就想指定使用 virtio模式的驱动,也可以在命令中指定磁盘的 bus和网卡的 model,示例如下:

virt-install --name=kvm2 --vcpus=2 --memory=2048 --location=/data/iso/CentOS-7-x86_64-DVD-2009.iso --disk path=/var/lib/libvirt/images/kvm2.qcow2,bus=virtio --network network=default,model=virtio --graphics none --extra-args='console=ttyS0'

删除虚拟机:

virsh shutdown 虚拟机名
virsh undefine 虚拟机名

删除虚拟机后,qcow2磁盘文件还在,但 xml文件已经删掉了。

如果想要同时删掉 xml文件和 qcow2 磁盘文件,可以在 undefine命令中加入 --remove-all-storage参数,但是这样操作风险较大,一般不推荐使用

virt-install --import --name kvm2import --ram 4096 --vcpus=4 --cpu host-model --disk path=/var/lib/libvirt/images/kvm2.qcow2,bus=virtio --network network=default,model=virtio --nographics

还是使用 virt-install命令导入镜像,--import选项表明是导入操作,上述命令中的虚拟机的名称、内存和cpu设置、网络、硬盘、驱动都可以在导入时根据情况进行设定,换句话说就是,即使创建kvm2时设置了2G内存,如果在导入镜像时,想要分配4G内存,那么只要在导入时指定 --ram 4096就行了,并不一定要和原配置保持一致,我在导入时就指定使用了 virtio模式驱动,这是因为我确认虚拟机使用的是centos7.9的系统,不用额外安装任何驱动。
由于我们在创建kvm2虚拟机时配置了虚拟终端(使用了 --extra-args='console=ttyS0'参数),所以在导入虚拟机时我指定了 --nographics选项,--nographics选项表示使用非图形化的console连入虚拟机(但是前提是我们确定已经为虚拟机配置好了终端),如果你在服务器的桌面环境(图形化环境)中执行上述命令,或者配置好了 x11forward,可以省略 --nographics 选项,默认情况下会为我们分配一个 virt-view图形化控制台,我们也可以通过这个图形化控制台连入导入的虚拟机。

不想在导入虚拟机时连入控制台,则可以直接使用 --noautoconsole选项,表示不会自动连入到虚拟机的控制台

virt-install --import --name kvm2import --ram 4096 --vcpus=4 --cpu host-model --disk path=/var/lib/libvirt/images/kvm2.qcow2,bus=virtio --network network=default,model=virtio --noautoconsole

列出虚拟机的磁盘:

virsh domblklist kvm2import

重命名虚拟机:

virsh domrename 虚拟机名 改后的虚拟机名

利用xml文件还原虚拟机(新建):

virsh define 虚拟机xml文件

查看虚拟机状态:

virsh domstate 虚拟机名

克隆

被克隆的主机不能处于running状态,只能是暂停或者停止状态,所以此处先把停止机器kvm1,然后通过 virt-clone命令克隆kvm1模板

# 通过kvm1克隆出kvm2 -o对应的虚拟机为克隆源,-n对应的虚拟机为新克隆出的虚拟机。
virt-clone --auto-clone -o kvm1 -n kvm2

如果想要修改新克隆出的机器中的内容,除了登录进去修改,还可以借助 virt-sysprep或者 guestfish命令,在不启动虚拟机的情况下修改虚拟机中的内容,使用 virt-sysprep命令需要安装 libguestfs-tools,而且需要注意,virt-sysprep命令会默认清除虚拟机中的一些信息,比如 .ssh目录等,所以应该根据情况选择是否使用 virt-sysprep命令。

快照

虚拟机快照分为内部快照和外部快照,内部快照只支持 qcow2格式,外部快照支持更多的格式的磁盘,内部快照的数据包含在虚拟机的磁盘镜像文件中,外部快照会单独使用一个磁盘镜像文件,除了内部快照和外部快照,也可以单独对磁盘创建快照,此处只演示内部快照的常用命令。

创建虚拟机快照
virsh snapshot-create kvm1
查看虚拟机快照,一串数字为创建时间的unix时间戳
virsh snapshot-list kvm1
创建快照时,指定快照名字
virsh snapshot-create-as kvm1 snap2
创建快照时添加注释,比如描述某个快照的作用 --name指定快照名称 --description 指定快照对应的描述信息
virsh snapshot-create-as --domain kvm1 --name snap3 --description 'test snapshot3'

快照配置文件的默认目录为 /var/lib/libvirt/qemu/snapshot/,选择你要查看快照的机器

查看虚拟机某个快照的信息:

virsh snapshot-dumpxml kvm1 snap3

如果需要做快照的虚拟机有多个 qcow2文件组成(不同的 qcow2对应的不同的磁盘挂载)。那么,在创建快照时,应该加上 --atomic参数,以便保证创建快照操作的原子性,可以确保所有磁盘的快照都创建成功,示例命令如下:

virsh snapshot-create kvm1 --atomic
或者
virsh snapshot-create-as kvm1 snap5 --atomic

查看快照间的父子关系:

virsh snapshot-list kvm1 --tree

查看快照的概览信息:

virsh snapshot-info kvm1 1636006069

查看某个快照的父快照:

virsh snapshot-parent kvm1 snap3

查看虚拟机的状态距离哪个快照最近,虚拟机的状态在哪个快照状态之后,会打印出最近快照的配置文件信息:

virsh snapshot-current kvm1

查看虚拟机的状态距离哪个快照最近,虚拟机的状态在哪个快照状态之后,只显示快照名:

virsh snapshot-current kvm1 --name

恢复到某个快照的状态:

virsh snapshot-revert kvm1 --snapshotname snap2

恢复到最近的快照(不指定快照名):

virsh snapshot-revert kvm1 --current

删除某个快照:

virsh snapshot-delete kvm1 snap7

将snap6快照删除的同时,删掉它的后代:

virsh snapshot-delete kvm1 snap6 --children

只删除snap2快照的后代,不删掉它本身:

virsh snapshot-delete kvm1 snap2 --children-only

没有逻辑卷的磁盘扩容

思路:

  • 做好磁盘镜像备份
  • 增加磁盘镜像的容量
  • 登录虚拟机,扩容文件系统

qcow2磁盘只支持增大,不支持缩小,有快照的虚拟机不能扩容

查看磁盘镜像的所有快照:

qemu-img snapshot -l /var/lib/libvirt/images/kvm1.qcow2

扩容步骤:

1.停止虚拟机

virsh shutdown kvm4

2.对磁盘镜像进行扩容

qemu-img resize /var/lib/libvirt/images/kvm4.qcow2 +20G

3.扩容后,查看磁盘镜像信息

qemu-img info /var/lib/libvirt/images/kvm4.qcow2

4.启动虚拟机

virsh start kvm4

5.查看磁盘信息以及分区有没有扩容

fdisk -l
fdisk -lu /dev/vda3

6.MBR分区的扩容步骤:

先安装cloud-utils-growpart工具
yum install -y cloud-utils-growpart
对vda3分区扩容,vda和3中间有空格
growpart /dev/vda 3
此时分区的大小已经改变
fdisk -lu /dev/vda3

7.对文件系统 xfs扩容,执行 xfs_growfs命令即可,如果是 ext文件系统,需要使用 resize2fs命令,此处运行的命令为 xfs_growfs /dev/vda3

xfs_growfs /dev/vda3
查看磁盘使用情况
df -h

逻辑卷的磁盘扩容

查看kvm6当前的磁盘有哪些

virsh domblklist kvm6

创建一块新的磁盘,不要和已有的盘重名,否则会清空重名盘

qemu-img create -f qcow2 /var/lib/libvirt/images/kvm6_vdc.qcow2 5G

将新创建的盘添加给虚拟机

使用 virsh attach-disk为指定的虚拟机添加磁盘,--domain指定虚拟机名,--source指定要添加的磁盘文件,--subdriver指定磁盘文件的格式,由于我使用的是 qcow2格式的磁盘,所以此处不能省略 --subdriver参数,如果省略此参数,默认会被当做 raw格式的磁盘。如果被当做 raw格式的磁盘,磁盘挂载后,对应的磁盘空间会识别为磁盘实际占用的大小(与宿主机中识别的大小一样,测试的 qcow2没有预分配空间),所以此处使用 --subdriver qcow2指明磁盘格式,--target参数用来指定磁盘文件对应虚拟机中的哪个磁盘,--targetbus virtio用来指定是否使用 virtio总线驱动,--persistent参数表示配置是否永久生效,如果不添加 --persistent参数,磁盘只是临时添加到虚拟机中,虚拟机断电重启后,不会再有对应的新磁盘,也就是说,不加 --persistent参数,虚拟机的xml配置文件是不会被修改的,如果加上 --persistent参数,虚拟机的xml配置文件会被自动修改,添加上新磁盘的配置。

virsh attach-disk --domain kvm6 --source /var/lib/libvirt/images/kvm6_vdc.qcow2 --subdriver qcow2 --target vdc --targetbus virtio --persistent

进入虚拟机,查看磁盘情况:

fdisk -l

初始化磁盘:

将vdc创建为xfs文件系统
mkfs.xfs /dev/vdc
挂载新磁盘
mount /dev/vdc /testdisk
查看挂载
df -h
修改/etc/fstab自动挂载,设置uuid更准确

卸载挂载点,加了 --persistent会默认永久生效,配置文件中这段会删除:

virsh detach-disk kvm6 /var/lib/libvirt/images/kvm6_vdc.qcow2 --persistent

将kvm6卸载下的磁盘挂载到kvm5上,临时挂载命令:

virsh attach-disk --domain kvm5 --source /var/lib/libvirt/images/kvm6_vdc.qcow2 --subdriver qcow2 --target vde --targetbus virtio

查看:

virsh domblklist kvm5

我们修改了现有虚拟机的网络配置,如果想要通过命令在创建虚拟机时,就指定使用桥接的网络,可以使用 --network参数,指定对应的桥接设备,比如

virt-install --name=kvm7 --vcpus=2 --memory=2048 --location=/data/iso/CentOS-7-x86_64-DVD-2009.iso --disk path=/var/lib/libvirt/images/kvm2.qcow2 --network bridge=virbr1 --graphics none --extra-args='console=ttyS0'

KVM nat网络与桥接网络

访问[kvm桥接网络和nat网络详解 (zsythink.net)](https://www.zsythink.net/archives/4272)查看详情

kvm