KVM实验(一)

参考:https://www.cnblogs.com/wn1m/p/11281576.html

一、验证是否开启虚拟化

[root@node1 ~]# grep -E "vmx|svm" /proc/cpuinfo | wc -l
4

二、安装工具

qemu-kvm(kvm在用户空间的管理工具),libvirt(一个服务,其下组件可用来管理kvm虚拟机)

[root@node1 ~]# yum install qemu-kvm libvirt -y

libvirt安装完后会创建virbr0网桥

三、相关命令

libvirt
使用最多的KVM虚拟化管理工具和应用程序接口,即通过libvirt调用KVM创建虚拟机,libvirt是KVM通用的访问API,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualBox等虚拟化方案。

virsh:
是一个常用的管理KVM虚拟化的命令行工具,常用语管理运行在单个宿主机上的虚拟机,virsh是一个使用C语言编写调用libvirt API的虚拟化管理命令行工具。

virt-manager:
virt-manager是一个虚拟化管理图形软件,其底层也是调用libvirt API来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。

openstack:
openstack是一个开源的虚拟化编排工具,常用于构建大规模的虚拟化环境,用语管理成千上万虚拟机的创建、启动、删除等整个生命周期。

四、启动服务

[root@node1 ~]# systemctl start libvirtd && systemctl enable libvirtd

五、libvirt0-client已经安装,virt-install安装下,管理虚拟机的

[root@node1 ~]# yum install virt-install -y

六、安装vncserver待会儿要用(好像不需要)

[root@node1 ~]# yum install tigervnc-server -y

七、创建自己的网桥br0,不用自动创建的

[root@node1 network-scripts]# cat ifcfg-br0 
# Generated by dracut initrd
NAME="br0"
DEVICE=br0
ONBOOT=yes
BOOTPROTO=static
TYPE=Bridge
IPADDR=172.18.3.138
NETMASK=255.255.0.0
GATEWAY=172.18.0.1
DNS1=114.114.114.114
[root@node1 network-scripts]# cat  ifcfg-eth0 
# Generated by dracut initrd
NAME="eth0"
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
BRIDGE=br0
DNS1=114.114.114.114
[root@node1 network-scripts]# systemctl restart network

删除之前的网桥

[root@node1 network-scripts]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c297afd2e	no		eth0
virbr0		8000.5254002fd1b3	yes		virbr0-nic
[root@node1 network-scripts]# ip link set virbr0 down
[root@node1 network-scripts]# brctl delbr virbr0
[root@node1 network-scripts]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c297afd2e	no		eth0
[root@node1 network-scripts]# ip link delete virbr0-nic		#也删一下

八、下载镜像

[root@node1 ~]# mkdir /data/image -p
[root@node1 ~]# cd /data/image/
[root@node1 image]# wget http://cloud-images.ubuntu.com/daily/server/bionic/current/bionic-server-cloudimg-arm64.img

九、创建10G磁盘空间

[root@node1 image]# qemu-img create -f qcow2  /data/machine/centos7-1 10G
Formatting '/data/machine/centos7-1', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off

十、创建虚拟机

[root@node1 image]# virt-install \
 --name centos7-1 \
 --memory 512 \
 --vcpus 1 \
 --virt-type kvm \
 --cdrom /data/image/CentOS-7-x86_64-Minimal-1908.iso \
 --disk /data/machine/centos7-1 \
 --network bridge=br0 \
 --graphics vnc,listen=0.0.0.0 \
 --noautoconsole

十一、vnc连接

[root@node1 data]# virsh list
 Id    Name                           State
----------------------------------------------------
 1     centos7-1                      running

[root@node1 data]# ss -ltn
State      Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port              
LISTEN     0      1                                       *:5900                                                *:*        

失败了,连不上,网上也找不到资料,都是virt-manager管理的,之前我用ubuntu是可以的

换了vnc可以连上了:https://www.realvnc.com/download/file/viewer.files/VNC-Viewer-6.19.1115-Windows-64bit.exe

销毁虚拟机:

[root@node1 ~]# virsh destroy centos7-1 
Domain centos7-1 destroyed
[root@node1 ~]# virsh destroy ubuntu18.04-1 
Domain ubuntu18.04-1 destroyed
[root@node1 ~]# virsh undefine --domain centos7-1 
Domain centos7-1 has been undefined
[root@node1 ~]# virsh undefine --domain ubuntu18.04-1 
Domain ubuntu18.04-1 has been undefined

十二、令一种方法来创建虚拟机

创建系统盘

[root@localhost boot]# qemu-img create -f qcow2 /data/machine/CentOS7-1.qcow2 10G
Formatting '/data/machine/CentOS7-1.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off 

开始安装:

[root@localhost boot]# virt-install \
> --name centos7-1 \
> --memory 1024 \
> --vcpus 1 \
> --virt-type kvm \
> --location=/data/iso/CentOS-7-x86_64-Minimal-1908.iso \
> --disk /data/machine/CentOS7-1.qcow2 \
> --network bridge=br0 \
> --graphics none \
> --extra-args='console=ttyS0' \
> --force

安装界面:

语言设置:

时区:

ntp配置:

关闭kdump

网络配置:开启启动

root密码:

b开始安装

成功了:

十三、关于如何看虚拟机的ip

网上大多是virsh edit [虚拟机名字]得到mac地址,然后arp看本机arp路由表

脚本来自:https://www.v2ex.com/t/197481

[root@localhost ~]# cat ping.sh 
#!/bin/bash
#BY MRCO,2015-06-10
#MODIFY 2015-06-10
#ping当前网段内在线的主机,以便产生arp记录.
subnet=`route -n|grep "UG" |awk '{print $2}'|sed 's/..$//g'`
for ip in $subnet.{1..253};do
{
ping -c1 $ip >/dev/null 2>&1
}&
done
#依次查找arp记录.
running_vms=`virsh list |grep running`
echo -ne "共有`echo "$running_vms"|wc -l`个虚拟机在运行.\n"
for i in `echo "$running_vms" | awk '{ print $2 }'`;do
mac=`virsh dumpxml $i |grep "mac address"|sed "s/.*'\(.*\)'.*/\1/g"`
ip=`arp -ne |grep "$mac" |awk '{printf $1}'`
printf "%-30s %-30s\n" $i $ip
done

十四、虚拟机的其他操作

14.1查看所有虚拟机列表

[root@es-2 tmp]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos7-1                      shut off

14.2启动虚拟机

[root@es-2 tmp]# virsh start centos7-1 
Domain centos7-1 started
[root@es-2 tmp]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 5     centos7-1                      running

14.3关闭虚拟机

[root@es-2 tmp]# virsh shutdown centos7-1

14.4设置虚拟机开机自启动

[root@es-2 tmp]# virsh autostart centos7-1
[root@es-2 ~]# virsh autostart --disable centos7-1		#开机不自动启动

14.5挂起和恢复虚拟机

[root@es-2 tmp]# virsh suspend centos7-1 		#挂起虚拟机
Domain centos7-1 suspended

[root@es-2 tmp]# virsh list --all		#查看虚拟机状态
 Id    Name                           State
----------------------------------------------------
 6     centos7-1                      paused

[root@es-2 tmp]# virsh resume centos7-1 	#恢复虚拟机
Domain centos7-1 resumed

[root@es-2 tmp]# virsh list --all	#查看虚拟机状态
 Id    Name                           State
----------------------------------------------------
 6     centos7-1                      running

14.6重启虚拟机

[root@es-2 tmp]# virsh reboot centos7-1 

14.7强制关闭虚拟机

通过这一步,可以发现virsh只不过是一个管理工具而已

#虚拟机仍在,仍可以virsh start启动
[root@es-2 tmp]# virsh destroy centos7-1 
#取消定义域,这样列表就看不到虚拟机了,实际上虚拟机磁盘还在
[root@es-2 tmp]# virsh dumpxml centos7-1 > /tmp/centos7-1.xml	#先备份xml配置
[root@es-2 tmp]# virsh undefine centos7-1	#这样就看不到了
#再导入xml文件,重新定义
[root@es-2 tmp]# virsh define /tmp/centos7-1.xml
[root@es-2 tmp]# virsh define /tmp/centos7-1.xml 
Domain centos7-1 defined from /tmp/centos7-1.xml
[root@es-2 tmp]# virsh list --all		#查看虚拟机列表
 Id    Name                           State
----------------------------------------------------
 -     centos7-1                      shut off
[root@es-2 tmp]# virsh start centos7-1 		#启动虚拟机
Domain centos7-1 started

14.8查看虚拟机网卡信息

可以看到mac信息

[root@es-2 ~]# virsh domiflist centos7-1 
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:d0:28:d9

14.9查看 kvm 虚拟机磁盘信息

[root@es-2 ~]# virsh domblklist centos7-1 
Target     Source
------------------------------------------------
vda        /data/machine/centos7-1.qcow2
hda        -

14.10查看虚拟机配置文件信息

[root@es-2 ~]# virsh dumpxml centos7-1 
<domain type='kvm' id='8'>
  <name>centos7-1</name>
  .....

14.11查看虚拟机的基本信息

[root@es-2 ~]# virsh dominfo centos7-1 
Id:             8
Name:           centos7-1
UUID:           39bd68f5-7779-425f-9f51-6d7f9d886521
OS Type:        hvm
State:          running
CPU(s):         1
CPU time:       36.0s
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: none
Security DOI:   0

十五、调整虚拟机磁盘大小

1、当前磁盘大小

[root@localhost ~]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom  
vda             252:0    0  100G  0 disk 
├─vda1          252:1    0  512M  0 part /boot
└─vda2          252:2    0   72G  0 part 
  ├─centos-root 253:0    0   20G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-data 253:2    0   50G  0 lvm  /data

2、查看虚拟机磁盘位置

[root@es-2 ~]# virsh domblklist centos7-1 
Target     Source
------------------------------------------------
vda        /data/machine/centos7-1.qcow2
hda        -

3、查看磁盘信息

[root@es-2 ~]# qemu-img info /data/machine/centos7-1.qcow2
image: /data/machine/centos7-1.qcow2
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 1.9G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
[root@es-2 ~]# du -sh /data/machine/centos7-1.qcow2
2.0G	/data/machine/centos7-1.qcow2
[root@es-2 ~]# ls -lh /data/machine/centos7-1.qcow2
-rw-r--r-- 1 qemu qemu 2.0G Nov 18 13:34 /data/machine/centos7-1.qcow2

4、给磁盘加10G

[root@es-2 ~]# qemu-img info /data/machine/centos7-1.qcow2
image: /data/machine/centos7-1.qcow2
file format: qcow2
virtual size: 110G (118111600640 bytes)
disk size: 1.9G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

5、重启虚拟机查看

下面实验证明了调整磁盘一定要关机后操作,然后启动

[root@es-2 ~]# virsh reboot centos7-1

#没有生效
磁盘 /dev/vda:107.4 GB, 107374182400 字节,209715200 个扇区
[root@localhost ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom  
vda             252:0    0  100G  0 disk 
├─vda1          252:1    0  512M  0 part /boot
└─vda2          252:2    0   72G  0 part 
  ├─centos-root 253:0    0   20G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-data 253:2    0   50G  0 lvm  /data

再次调整:

vrish reboot还是不行,先关机,再开机就好了

十六、调整虚拟机内存

当前虚拟机内存

[root@es-2 ~]# virsh dominfo centos7-1 
Id:             9
Name:           centos7-1
UUID:           39bd68f5-7779-425f-9f51-6d7f9d886521
OS Type:        hvm
State:          running
CPU(s):         1
CPU time:       23.6s
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: none
Security DOI:   0

调整

[root@es-2 ~]# virsh shutdown centos7-1 
[root@es-2 ~]# virsh setmaxmem centos7-1 2G		#关机后设置最大内存
[root@es-2 ~]# virsh start centos7-1 		
[root@es-2 ~]# virsh setmem centos7-1 2G		#开机后设置虚拟机内存

调整后

[root@es-2 ~]# virsh dominfo centos7-1 
Id:             10
Name:           centos7-1
UUID:           39bd68f5-7779-425f-9f51-6d7f9d886521
OS Type:        hvm
State:          running
CPU(s):         1
CPU time:       17.9s
Max memory:     2097152 KiB
Used memory:    2097152 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: none
Security DOI:   0
#进入虚拟机查看
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           2.0G         87M        1.8G        8.5M         91M        1.7G
Swap:          2.0G          0B        2.0G

十七、使用xml文件创建虚拟机

先传一个模版虚拟机

[root@kibana ~]# scp /opt/centos7-init.qcow2 172.18.3.139:/data/machine/centos7-2.qcow2

编写配置文件(大佬给的,暂时不会改)

<domain type='kvm'>
  <name>centos7-2</name>
  <memory unit='GiB'>1</memory>
  <currentMemory unit='GiB'>1</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <sysinfo type='smbios'>
    <system>
      <entry name='manufacturer'>test</entry>
    </system>
  </sysinfo>
  <os>
    <type arch='x86_64' machine='pc'>hvm</type>
    <boot dev='hd'/>
    <bootmenu enable='yes'/>
    <smbios mode='sysinfo'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='writeback'/>
      <source file='/data/machine/centos7-2.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/data/iso/CentOS-7-x86_64-Minimal-1908.iso'/>
      <target dev='hdb' bus='ide'/>
    <readonly/>
    </disk>
    <controller type='virtio-serial' index='0'>
    </controller>
    <controller type='usb' index='0' model='piix3-uhci'>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
    </video>
    <memballoon model='virtio'>
      <stats period='10'/>
    </memballoon>
  </devices>
</domain>

使用配置文件定义虚拟机,然后开机

[root@es-2 ~]# virsh define centos7-2.xml 
Domain centos7-2 defined from centos7-2.xml

[root@es-2 ~]# virsh list --all		#定义之后就有了
 Id    Name                           State
----------------------------------------------------
 10    centos7-1                      running
 -     centos7-2                      shut off

[root@es-2 ~]# virsh start centos7-2	#开机
Domain centos7-2 started

连接虚拟机试试

[root@es-2 ~]# ss -ltn | grep :59
LISTEN     0      1            *:5900                     *:*                  
LISTEN     0      1            *:5901                     *:*  

有点小问题,没有IP

修改配置文件,加上mac地址(mac地址还不能随便填,网上生成的不能用,我就照着其他的mac改了几位)

<domain type='kvm'>
  <name>centos7-2</name>
  <memory unit='GiB'>1</memory>
  <currentMemory unit='GiB'>1</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <sysinfo type='smbios'>
    <system>
      <entry name='manufacturer'>test</entry>
    </system>
  </sysinfo>
  <os>
    <type arch='x86_64' machine='pc'>hvm</type>
    <boot dev='hd'/>
    <bootmenu enable='yes'/>
    <smbios mode='sysinfo'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='writeback'/>
      <source file='/data/machine/centos7-2.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/data/iso/CentOS-7-x86_64-Minimal-1908.iso'/>
      <target dev='hdb' bus='ide'/>
    <readonly/>
    </disk>
    <controller type='virtio-serial' index='0'>
    </controller>
    <controller type='usb' index='0' model='piix3-uhci'>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <interface type='bridge'>
      <mac address='52:C7:CE:41:D5:EA'/>
      <source bridge='br0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
    </video>
    <memballoon model='virtio'>
      <stats period='10'/>
    </memballoon>
  </devices>
</domain>