一个计算机技术爱好者与学习者

0%

好好学Linux:virsh命令

1. 前言

本文中会整理一些工作学习中常用的virsh命令,备忘。

参考文档:

2. 创建虚拟机

本节以创建ubuntu18.04.6的虚拟机为例,ubuntu镜像下载地址为Ubuntu Release

2.1. 常规创建

1、下载镜像

1
2
cd /opt/iso/
wget https://releases.ubuntu.com/18.04.6/ubuntu-18.04.6-live-server-amd64.iso

2、创建虚拟机

1
2
3
4
5
6
7
8
9
10
11
12
13
virt-install \
--virt-type=kvm \
--name=ubuntu18.04 \
--vcpus=2 \
--ram=4096 \
--cdrom=/opt/iso/ubuntu-18.04.6-live-server-amd64.iso \
--disk path=/opt/kvm/ubuntu18.04.qcow2,device=disk,format=qcow2,bus=virtio,cache=writeback,size=100 \
--network default,model=virtio \
--os-type=linux \
--os-variant=ubuntu18.04 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--accelerate

model=virtio 可以换成 model=e1000或者model=rtl8139
但是这里建议使用virtio,因为使用virtio要比使用e1000或者rtl8139网络吞吐性能要高出2倍左右。

详情参考:

3、查看虚拟机

1
2
virsh list
virsh list --all

4、查看vnc端口

1
virsh vncdisplay ubuntu18.04

使用vnc client连接虚拟机完成安装。

2.2. 单独创建磁盘

1
2
3
qemu-img create -f qcow2 /opt/kvm/ubuntu18.04.qcow2  100G

virt-install --disk path=/opt/kvm/ubuntu18.04.qcow2 ...

2.3. 使用桥接

1
2
3
4
ifconfig
ip a

virt-install --network bridge=br0,model=virtio ...

3. 查看虚拟机IP

方法一:通过VNC登录虚拟机后查看

方法二:通过mac地址查看

1
2
3
4
nmap -sP 192.168.56.0/24
virsh dumpxml ubuntu18.04 | grep "mac a"
arp -a | grep grep "52:54:00:46:98:a7"
cat /proc/net/arp | grep "52:54:00:46:98:a7"

4. 网络优化

vhost-net是对virtio的优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以在内核态得到处理。
数据包从虚拟网卡出来后,直接跳到内核那一层中。这里要注意的是,如果要使用vhost-net那么,虚拟机的网卡类型必须是virtio。

1
2
virsh destroy ubuntu18.04
virsh edit ubuntu18.04

添加dirver配置:

1
2
3
4
5
6
7
<interface type='bridge'>
<mac address='52:54:00:46:98:a7'/>
<source bridge='br0'/>
<model type='virtio'/>
<driver name='vhost'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

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
2
3
virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --root-password password:voidking
# or
virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --password root: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
2
virt-customize -a /opt/kvm/ubuntu18.04.qcow2 --install vim,wget,curl,unzip
virt-customize -v -x -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
2
3
route -n
ip route
netstat -rn

2、配置静态IP
配置 /etc/netplan/00-installer-config.yaml 内容为:

1
2
3
4
5
6
7
8
9
10
# This is the network config written by 'subiquity'
network:
version: 2
ethernets:
ens3:
dhcp4: false # 禁止动态IP
addresses: [192.168.56.200/24] # IP地址和掩码
gateway4: 192.168.56.1 # 网关
nameservers:
addresses: [192.168.56.1,114.114.114.114] #DNS服务器

3、使配置生效

1
2
netplan apply
ip a

5.9. 手动配置静态IP2.0

1、提前准备 00-installer-config.yaml 内容为:

1
2
3
4
5
6
7
8
9
10
# This is the network config written by 'subiquity'
network:
version: 2
ethernets:
ens3:
dhcp4: false # 禁止动态IP
addresses: [192.168.56.200/24] # IP地址和掩码
gateway4: 192.168.56.1 # 网关
nameservers:
addresses: [192.168.56.1,114.114.114.114] #DNS服务器

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
2
3
4
# smooth shutdown
virsh shutdown ubuntu18.04
# forced shutdown
virsh destroy ubuntu18.04

2、开启虚拟机

1
virsh start ubuntu18.04

7. 销毁虚拟机

1
2
3
4
5
6
7
virsh list --all
virsh destroy ubuntu18.04
virsh snapshot-list ubuntu18.04
virsh snapshot-delete ubuntu18.04 1627446728
virsh undefine ubuntu18.04
#rm /etc/libvirt/qemu/ubuntu18.04.xml
rm /opt/kvm/ubuntu18.04.qcow2

8. 开机自动启动

1
2
virsh autostart ubuntu18.04
virsh autostart --disable ubuntu18.04

9. 调整虚拟机CPU和内存

1
2
virsh destroy ubuntu18.04
virsh edit ubuntu18.04

调整相关配置:

1
2
3
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<vcpu placement='static'>2</vcpu>

这里需要注意的是,vcpu的最小值是1,详情参考CPU Allocation

10. 根据xml导出创建虚拟机的命令

1
2
virsh list --all
virsh dumpxml ubuntu18.04 > ubuntu18.04.xml

11. 克隆虚拟机

1
2
3
virt-clone -o ubuntu18.04 -n ubuntu18.04-tmp -f /opt/kvm/ubuntu18.04-tmp.qcow2
virsh dominfo ubuntu18.04-tmp
virsh domstate ubuntu18.04-tmp

12. 拷贝虚拟机到其他宿主机

1、拷贝虚拟机磁盘文件和配置文件

1
2
scp /opt/kvm/ubuntu18.04.qcow2 192.168.56.102:/opt/kvm/ubuntu18.04.qcow2
scp /etc/libvirt/qemu/ubuntu18.04.xml 192.168.56.102:/etc/libvirt/qemu/ubuntu18.04.xml

2、拉起虚拟机

1
2
3
4
ssh 192.168.56.102
virsh define /etc/libvirt/qemu/ubuntu18.04.xml
virsh list --all
virsh start ubuntu18.04

PS:临时拉起虚拟机

1
virsh create /etc/libvirt/qemu/ubuntu18.04.xml

13. 虚拟机迁移

参考文档《使用Libvirt进行虚拟机在线迁移》

14. 虚拟机扩容磁盘

参考文档:

14.1. 给虚拟机增加磁盘

1
2
3
4
5
virsh shutdown ubuntu18.04-tmp
virsh domblklist ubuntu18.04-tmp
qemu-img info /opt/kvm/ubuntu18.04-tmp.qcow2
qemu-img resize /opt/kvm/ubuntu18.04-tmp.qcow2 +20G # 增加20G
qemu-img resize /opt/kvm/ubuntu18.04-tmp.qcow2 200G # 最终大小变为200G

PS:qcow2镜像不支持缩容。

如果给虚拟机增加磁盘后,虚拟机启动时报错:
qcow2: Image is corrupt; cannot be opened read/write

那么说明磁盘出现问题,修复方法如下

1
2
qemu-img check /opt/kvm/ubuntu18.04-tmp.qcow2
qemu-img check -r all /opt/kvm/ubuntu18.04-tmp.qcow2

14.2. 扩容分区和文件系统

14.2.1. 扩容分区

1、安装扩容分区工具

1
2
3
4
5
# centos
yum install -y cloud-utils-growpart

# ubuntu
apt-get install -y cloud-guest-utils

2、虚拟机内部执行扩容分区

1
2
3
4
fdisk -l
LANG=en_US.UTF-8
growpart /dev/vda 2
fdisk -l

14.2.2. 扩容文件系统

1
2
3
4
5
6
7
df -h
df -ihT
# ext2/ext3/ext4
resize2fs /dev/vda2
# xfs
xfs_growfs /dev/vda2
df -h

14.3. 裸数据盘扩容文件系统

所谓裸数据盘,就是没有分区的数据盘。

1
2
3
4
5
6
7
df -h
df -ihT
# ext2/ext3/ext4
resize2fs /dev/vdb
# xfs
xfs_growfs /dev/vdc
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
2
3
fdisk /dev/vda
> d
> 2

这里,d是删除分区的命令,2是选择你想要删除的分区号。

3、创建一个新的分区,该分区使用磁盘上所有可用的空间。

1
2
3
4
5
6
> n
> p
> 2
> <start value>
> <default end value>
> w

在这里,n是新建分区,p是选择主分区,2是分区号,使用默认设置,最后使用w写入新的分区表。

4、重新读取分区表

1
partprobe /dev/vda 

5、再次尝试使用xfs_growfs扩展文件系统

1
xfs_growfs /dev/vda2

6、最后再确认一下是否已经扩展至200G

1
df -h

15. 虚拟机增加磁盘

1
2
3
virsh destroy ubuntu18.04-tmp
qemu-img create -f qcow2 /opt/kvm/ubuntu18.04-tmp_ext.qcow2 100G
virsh edit ubuntu18.04-tmp

disk部分添加:

1
2
3
4
5
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/opt/kvm/ubuntu18.04-tmp_ext.qcow2'/>
<target dev='vdb' bus='virtio'/>
</disk>

磁盘格式化和挂载参考《VirtualBox中Ubuntu扩容》

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-linux-virsh/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~