基础命令
列出处于运行状态或暂停状态的虚拟机:
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 kvm2 import --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 kvm2 import
重命名虚拟机:
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)
查看详情