1. 前言
本文中会整理一些工作学习中常用的virsh命令,备忘。
参考文档:
- libvirt
- Domain XML format
- libguestfs
- virt-builder
- KVM : Create a Virtual Machine
- KVM : GPU Passthrough
- virsh常用命令篇
- KVM 虚拟机 XML 配置文件详解
2. 创建虚拟机
本节以创建ubuntu18.04.6的虚拟机为例,ubuntu镜像下载地址为Ubuntu Release
2.1. 常规创建
1、下载镜像
1 | cd /opt/iso/ |
2、创建虚拟机
1 | virt-install \ |
model=virtio
可以换成 model=e1000
或者model=rtl8139
。
但是这里建议使用virtio,因为使用virtio要比使用e1000或者rtl8139网络吞吐性能要高出2倍左右。
详情参考:
3、查看虚拟机
1 | virsh list |
4、查看vnc端口
1 | virsh vncdisplay ubuntu18.04 |
使用vnc client连接虚拟机完成安装。
2.2. 单独创建磁盘
1 | qemu-img create -f qcow2 /opt/kvm/ubuntu18.04.qcow2 100G |
2.3. 使用桥接
1 | ifconfig |
3. 查看虚拟机IP
方法一:通过VNC登录虚拟机后查看
方法二:通过mac地址查看
1 | nmap -sP 192.168.56.0/24 |
4. 网络优化
vhost-net是对virtio的优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以在内核态得到处理。
数据包从虚拟网卡出来后,直接跳到内核那一层中。这里要注意的是,如果要使用vhost-net那么,虚拟机的网卡类型必须是virtio。
1 | virsh destroy ubuntu18.04 |
添加dirver配置:
1 | <interface type='bridge'> |
5. 修改虚拟机配置
5.1. 安装virt-customize
1 | yum -y install libguestfs-tools |
5.2. 关闭虚拟机
1 | virsh shutdown ubuntu18.04 |
在使用virt-customize修改虚拟机配置之前,需要先关闭虚拟机,否则修改不会生效,还可能发生非预期问题。
5.3. 修改主机名
1 | virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --hostname node01 |
5.4. 启用root ssh登录
1 | virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --run-command 'echo "PermitRootLogin yes" >> /etc/ssh/sshd_config' |
5.5. 修改root密码
1 | virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --root-password password:voidking |
5.6. 添加authorized_keys
1 | virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --ssh-inject root:string:"ssh-rsa xxx vk@macpro.lan" |
5.7. 安装软件包
1 | virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --install vim,wget,curl,unzip |
5.8. 手动配置静态IP
ubuntu18之前在/etc/network/interfaces
进行配置,ubuntu18及之后版本在/etc/netplan/*.yaml
中进行配置。
提前手动配置好一台虚拟机的静态IP,然后,其他的克隆出来的主机可以使用virt-customize调用sed命令修改IP。
1、查看当前网关
1 | route -n |
2、配置静态IP
配置 /etc/netplan/00-installer-config.yaml 内容为:
1 | # This is the network config written by 'subiquity' |
3、使配置生效
1 | netplan apply |
5.9. 手动配置静态IP2.0
1、提前准备 00-installer-config.yaml 内容为:
1 | # This is the network config written by 'subiquity' |
2、拷贝到宿主机
1 | virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --copy-in 00-installer-config.yaml:/etc/netplan/00-installer-config.yaml |
5.10. 自动配置静态IP
1 | virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --run-command "sed -i \"s#addresses: \[.*/24\]#addresses: \[192.168.56.201/24\]#\" /etc/netplan/00-installer-config.yaml" |
6. 启停虚拟机
1、停止虚拟机
1 | # smooth shutdown |
2、开启虚拟机
1 | virsh start ubuntu18.04 |
7. 销毁虚拟机
1 | virsh list --all |
8. 开机自动启动
1 | virsh autostart ubuntu18.04 |
9. 调整虚拟机CPU和内存
1 | virsh destroy ubuntu18.04 |
调整相关配置:
1 | <memory unit='KiB'>4194304</memory> |
这里需要注意的是,vcpu的最小值是1,详情参考CPU Allocation
10. 根据xml导出创建虚拟机的命令
1 | virsh list --all |
11. 克隆虚拟机
1 | virt-clone -o ubuntu18.04 -n ubuntu18.04-tmp -f /opt/kvm/ubuntu18.04-tmp.qcow2 |
12. 拷贝虚拟机到其他宿主机
1、拷贝虚拟机磁盘文件和配置文件
1 | scp /opt/kvm/ubuntu18.04.qcow2 192.168.56.102:/opt/kvm/ubuntu18.04.qcow2 |
2、拉起虚拟机
1 | ssh 192.168.56.102 |
PS:临时拉起虚拟机
1 | virsh create /etc/libvirt/qemu/ubuntu18.04.xml |
拷贝虚拟机到其他宿主机之后,在其他宿主机上启动虚拟机时可能会报错:
1 | 错误:开始域 ubuntu18.04 失败 |
这是因为不同宿主机的CPU特性不同,解决办法为修改cpu相关配置。
1 | virsh edit ubuntu18.04 |
修改cpu部分为:
1 | <cpu mode='host-model' check='partial'/> |
13. 虚拟机迁移
14. 虚拟机扩容磁盘
参考文档:
14.1. 给虚拟机增加磁盘
1 | virsh shutdown ubuntu18.04-tmp |
PS:qcow2镜像不支持缩容。
如果给虚拟机增加磁盘后,虚拟机启动时报错:
qcow2: Image is corrupt; cannot be opened read/write
那么说明磁盘出现问题,修复方法如下
1 | qemu-img check /opt/kvm/ubuntu18.04-tmp.qcow2 |
14.2. 扩容分区和文件系统
14.2.1. 扩容分区
1、安装扩容分区工具
1 | # centos |
2、虚拟机内部执行扩容分区
1 | fdisk -l |
14.2.2. 扩容文件系统
1 | df -h |
14.3. 裸数据盘扩容文件系统
所谓裸数据盘,就是没有分区的数据盘。
1 | df -h |
14.4. 磁盘扩容不符合预期问题
问题描述:
virsh创建的vm,使用qemu-img resize
把磁盘从40G扩容到了200G,然后在vm中执行 xfs_growfs /dev/vda2
。fdisk -l
发现磁盘变成了200G,df -h
发现 /dev/vda2 变成了100G,期望应该是200G才对,为什么丢失了100G?
原因分析:
一般来说,当使用qemu-img resize
对虚拟机的磁盘进行扩容之后,再通过xfs_growfs
命令扩展文件系统时,文件系统大小应该和磁盘大小一致。
然而,如果在执行xfs_growfs后,发现文件系统大小不等于磁盘大小,可能是因为分区表没有更新。
解决办法:
分区表必须更新以反映磁盘大小的增加。具体操作步骤如下:
1、进入VM,查看当前磁盘分区状态
1 | fdisk -l /dev/vda |
2、删除不正确的分区vda2。(请注意,此操作不会删除分区上的文件,只是删除分区表中的记录)
1 | fdisk /dev/vda |
这里,d是删除分区的命令,2是选择你想要删除的分区号。
3、创建一个新的分区,该分区使用磁盘上所有可用的空间。
1 | > n |
在这里,n是新建分区,p是选择主分区,2是分区号,使用默认设置,最后使用w写入新的分区表。
4、重新读取分区表
1 | partprobe /dev/vda |
5、再次尝试使用xfs_growfs扩展文件系统
1 | xfs_growfs /dev/vda2 |
6、最后再确认一下是否已经扩展至200G
1 | df -h |
15. 虚拟机增加磁盘
1 | virsh destroy ubuntu18.04-tmp |
disk部分添加:
1 | <disk type='file' device='disk'> |
磁盘格式化和挂载方法参考《好好学Linux:Linux挂载文件系统》
16. 维修虚拟机
当虚拟机出现问题时,不方便通过U盘启动的方式进行维修,此时可以使用一些虚拟机管理命令。
拷贝文件到虚拟机:
1 | virt-customize -a /path/to/image.qcow2 --copy-in example.txt:/root/ |
挂载虚拟机磁盘到宿主机:
1 | # 查看可用文件系统 |