linux上用kvm快速创建虚拟机

教大家怎么快速的来使用KVM创建一个虚拟机和管理虚拟机,如果有准备好ISO系统安装文件的话,就算是第一次使用KVM,只要跟着操作,也可以很快能创建出一个虚拟机了。

一、查看系统是否支持KVM虚拟化

查看cpu是否支持虚拟化

# grep -E'(vmx|svm)' /proc/cpuinfo

flags :fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflushdts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tscart arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperfeagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnttsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epbinvpcid_single intel_pt ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority eptvpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smapclflushopt xsaveopt xsavec xgetbv1 dtherm ida arat pln pts hwp hwp_notifyhwp_act_window hwp_epp md_clear spec_ctrl intel_stibp flush_l1d

说明CPU是Intel的,如果是AMD的CPU,应该是“svm”。

# lsmod |grep -i kvm
kvm 637289 0
irqbypass 13503 1 kvm
# dmesg | grep kvm
[ 3.395512] kvm: disabled by bios
[ 3.403132] kvm: disabled by bios
[ 3.411795] kvm: disabled by bios
[ 3.421617] kvm: disabled by bios
[ 3.428229] kvm: disabled by bios
[ 3.437234] kvm: disabled by bios
[ 430.980636] kvm: disabled by bios
[ 438.972538] kvm: disabled by bios

从上面的输出来看,CPU是支持KVM虚拟化的,但BIOS是禁用的。

重启设备,进入BIOS中,不同型号的设备可能设置会有点不一样。

Intel VirtualizationTechnology 把这个东西开启来。

开启后,会多出一个加载模块kvm_intel

# lsmod |grep kvm
kvm_intel 188740 0
kvm 637289 1 kvm_intel
irqbypass 13503 1 kvm

二、关闭一些服务

关闭防火墙

# systemctl stop firewalld
# systemctl disable firewalld

关闭selinux

# vim /etc/selinux/config
SELINUX=disabled

禁用NetworkManager

# systemctl stop NetworkManager
# systemctl disable NetworkManager

三、安装必须软件

主要安装qemu-kvm(用户态管理工具),libvirt(命令行管理工具),virt-install(安装kvm工具),bridge-utils(桥接设备管理工具)这几个工具,如果想要图形管理的话,还要安装图形桌面和virt-manager。

yum install qemu-kvm qemu-img libvirt libvirt-python libvirt-client virt-install virt-viewer bridge-utils

启动libvirtd服务

# systemctl enable libvirtd
# systemctl start  libvirtd

查看libvirtd服务状态

# systemctl status libvirtd

四、配置网络

如果使用NAT网络方式的话,可以不用配置网络,因为KVM默认就是使用NAT网络的,有现成的NAT配置可以用。 当前面启用libvirtd服务后,就会创建一个虚拟网络接口virbr0,这个就是用来给NAT模式时使用的。

# ifconfig
enp2s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.3.254  netmask 255.255.255.0  broadcast 192.168.3.255
        ether bc:30:5b:bb:19:6d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16


lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 427  bytes 37268 (36.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 427  bytes 37268 (36.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:73:bc:8c  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0默认的IP网段是192.168.122.0,如果使用NAT模式的话,虚拟机的IP就设置这个网段的IP,网关就是virbr0的IP 192.168.122.1。

这个默认存在的网络配置default就是给NAT模式使用的

# virsh net-list
 名称              状态     自动开始  持久
----------------------------------------------------------
 default              活动     是           是

如果想使用桥接模式,就需要设置一下才能使用了。

先查看网卡信息

# ifconfig
enp2s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.3.254  netmask 255.255.255.0  broadcast 192.168.3.255
        ether bc:30:5b:bb:19:6d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 427  bytes 37268 (36.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 427  bytes 37268 (36.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:73:bc:8c  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

依据enp2s0接口配置生成一个桥接配置br0 # virsh iface-bridge enp2s0 br0 使用附加设备 br0 生成桥接 enp2s0 失败 已启动桥接接口 br0

生成的桥接后的接口信息,可以看出,桥接br0使用的是原来enp2s0接口的IP地址,而enp2s0是没有IP地址的,两个mac地址也是一样的。

br0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.3.254  netmask 255.255.255.0  broadcast 192.168.3.255
        ether bc:30:5b:bb:19:6d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether bc:30:5b:bb:19:6d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 428  bytes 37376 (36.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 428  bytes 37376 (36.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:73:bc:8c  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

六、创建磁盘文件 创建磁盘文件可以在创建虚拟机的命令中直接创建的。 为了减少步骤,没必要单独的创建磁盘,直接在创建虚拟机时创建就可以了。

七、创建虚拟机 准备想要安装虚拟机的磁盘空间

# df -h
/dev/sdb1                102G   33M 102G    1% /vdisk

准备操作系统ISO文件 我这里是CentOS7.9的ISO文件。

# ls /vdisk/iso
CentOS79.iso

创建存放虚拟机文件的目录(可自定义) # mkdir /vdisk/kvm

创建虚拟机命令 #virt-install --version 1.5.0

注意,版本不一样可能会有些参数格式不一样。

# virt-install --name node01 \
--memory 1024,maxmemory=2048 \
--vcpus 2,maxvcpus=3 \
--os-variant centos7.0 \
--location=/vdisk/iso/centos79.iso \
--disk path=/vdisk/kvm/node01.qcow2,size=40,format=qcow2 \
--network bridge=br0 \
--graphics none \
--extra-args "console=tty0 console=ttyS0"

我这里创建了一个叫node01的虚拟机,内存分配了1G,可热调整到2G,分配了2核CPU,可热调整到3核,虚拟机的系统模板是centos7.0,以/vdisk/iso/centos79.iso这个系统ISO文件来进行安装,虚拟机文件保存在/vdisk/kvm/node01.qcow2,给虚拟机分配的硬盘是40G,文件保存格式为qcow2,网络是桥接模式,不使用图形模式,安装完自动连接上虚拟机的console。

命令说明: –name指定虚拟机的名称 –memory指定分配给虚拟机的内存资源大小 maxmemory指定可调节的最大内存资源大小,因为KVM支持热调整虚拟机的资源 –vcpus指定分配给虚拟机的CPU核心数量 maxvcpus指定可调节的最大CPU核心数量 –os-variant 指定系统的发行版本 ,可以用osinfo-query os命令来查询 –location指定安装系统ISO镜像文件所在的路径,支持使用网络资源路径,也就是说可以使用URL –disk path指定虚拟硬盘所存放的路径及名称,size 则是指定该硬盘的可用大小,单位是G –network 指定使用哪一个网络模式,bridge表示使用桥接,如果想使用NAT模式的话,–network=default 默认就行 –graphics 指定是否开启图形,选择none/vnc,如果要使用图形的话,就要使用vnc –extra-args定义终端额外的参数,设置这个才能看到安装过程

执行命令后,就会开始安装:

开始安装......
搜索文件.treeinfo......                                                                                        |  354 B  00:00:00    
搜索文件vmlinuz......                                                                                          | 6.5 MB  00:00:00    
搜索文件initrd.img......                                                                                       |  53 MB  00:00:00    
正在分配'node01.qcow2'                                                                                         |  25 GB  00:00:00    
连接到域node01
换码符为 ^]

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsyscpuacct
[    0.000000] Linux version3.10.0-1160.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.520150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:59 UTC 2020
[    0.000000] Command line: console=tty0console=ttyS0
[    0.000000] e820: BIOS-provided physical RAMmap: