2019独角兽企业重金招聘Python工程师标准>>>

kvm windows半虚拟化 CPU kvm全虚拟化_操作系统



虚拟化——KVM

一、虚拟化介绍

1.1 了解虚拟化

VMware Workstation就是虚拟化;

虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,这样就可以充分利用硬件资源;

关键词Hypervisor(VMM) 虚拟机管理器;

虚拟化技术分为全虚拟化和半虚拟化

  • 早期的CPU硬件不支持虚拟化,虚拟机上的操作系统(guestos)要想使用cpu资源,需要通过VMM来翻译指令,这个过程比较耗费资源,这种虚拟化技术叫做全虚拟化(VMware Workstation)
  • 半虚拟化技术通过修改guestos内核,让guestos可以直接使用CPU资源,而不需要翻译指令了,从而节省了资源,但修改内核比较鸡肋(XEN) 后续cpu厂商直接支持虚拟化,不需要通过VMM翻译指令了,无所谓半虚拟化和全虚拟化

参考 http://itoedr.lofter.com/post/1472ba_69c62fa

1.2 常见虚拟化软件
  • VMware系列:VMware workstation、VMware vsphere(VMware esxi)、VMware Fusion(Mac)
  • Xen 开源 半虚拟化
  • XenServer 商业,厂商Ctirx,基于Xen的
  • KVM 开源 基于linux内核模块
  • Hyper-V 商业,厂商微软
  • Openvz 开源 基于linux 虚拟机和宿主机共用一个内核
  • VirtualBox 开源 Sun公司开发 Oracle收购Sun

参考资料:http://developer.huawei.com/ict/forum/thread-23385-1-1.html

1.3 虚拟化的架构

kvm windows半虚拟化 CPU kvm全虚拟化_运维_02

参考资料: http://developer.huawei.com/ict/forum/thread-23385-1-1.html

二、KVM介绍

  • KVM是以色列初创公司Qumranet开发,2008年9月RedHat公司收购了Qumranet
  • KVM是Linux内核的一个模块,它把Linux内核变成了一个Hypervisor
  • KVM是完全开源的,RedHat基于KVM的虚拟化解决方案叫做RHEV
  • KVM在Linux操作系统里面以进程的形式出现,由标准的Linux调度程序进行调度,这使得KVM能够使用Linux内核的已有功能;
  • 只有一个KVM内核模块还不能实现虚拟化的全部功能,就好比操作系统只有内核还不能成为一个完整的操作系统一样;
  • QEMU是一个开源的虚拟化软件,纯软件,可以虚拟化所以的硬件,性能不强
  • KVM基于QEMU开发了一个能够运行在用户空间的工具QEMU-KVM
  • 磁盘、网络设备等都是通过QEMU-KVM这个工具模拟出来的
  • KVM和QEMU-KVM通信是通过/dev/kvm实现的
  • libvirt是用来管理KVM虚拟机的API,其命令为virsh

KVM的架构图

kvm windows半虚拟化 CPU kvm全虚拟化_kvm windows半虚拟化 CPU_03

三、Centos7上安装KVM

试验环境,windows上安装VMware,再安装CentOS系统,在上面再安装KVM,然后再KVM上安装CentOS;

新增一个40G磁盘,内存设为4G;

kvm windows半虚拟化 CPU kvm全虚拟化_操作系统_04

勾选下列设置,开启虚拟化设置;注意VMware 10这个版本不行,需要更新一下;

kvm windows半虚拟化 CPU kvm全虚拟化_kvm windows半虚拟化 CPU_05

查看此机器是否支持虚拟化;vmx是英特尔CPU,svm是AMD的CPU

[root@ying06 ~]# grep -i 'vmx\|svm'  /proc/cpuinfo 
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase smep arat
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase smep arat

把新增的40G磁盘的格式化,挂载;

[root@ying06 ~]# fdisk -l

磁盘 /dev/sda:32.2 GB, 32212254720 字节,62914560 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000be1b7

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     8222719     3905536   82  Linux swap / Solaris
/dev/sda3         8222720    62914559    27345920   83  Linux

磁盘 /dev/sdb:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

[root@ying06 ~]# mkfs.ext4 /dev/sdb         //ext4格式
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
无论如何也要继续? (y,n) y
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
2621440 inodes, 10485760 blocks
524288 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2157969408
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成   

[root@ying06 ~]# blkid /dev/sdb             //查看磁盘是否格式化
/dev/sdb: UUID="2bf24443-9435-48dd-a59a-a72b7272d2df" TYPE="ext4"

创建挂载目录,并挂载;

[root@ying06 ~]# mkdir /kvm_data
[root@ying06 ~]# mount /dev/sdb /kvm_data/^C
[root@ying06 ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        27G  2.9G   24G   11% /
devtmpfs        1.9G     0  1.9G    0% /dev
tmpfs           1.9G     0  1.9G    0% /dev/shm
tmpfs           1.9G  8.7M  1.9G    1% /run
tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1       197M  113M   84M   58% /boot
tmpfs           379M     0  379M    0% /run/user/0
[root@ying06 ~]# mount /dev/sdb /kvm_data/
[root@ying06 ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        27G  2.9G   24G   11% /
devtmpfs        1.9G     0  1.9G    0% /dev
tmpfs           1.9G     0  1.9G    0% /dev/shm
tmpfs           1.9G  8.7M  1.9G    1% /run
tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1       197M  113M   84M   58% /boot
tmpfs           379M     0  379M    0% /run/user/0
/dev/sdb         40G   49M   38G    1% /kvm_data

写入挂载磁盘的信息,让其开机启动

[root@ying06 ~]# vim /etc/fstab 

/dev/sdb /kvm_data  ext4  defaults  0 0       //增加此行配置

关闭防火墙,和关闭iptables规则;

[root@ying06 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@ying06 ~]# getenforce 
Disabled

此时安装KVM;

[root@ying06 ~]# yum install -y  virt-*  libvirt  bridge-utils qemu-img

四、配置网卡

创建ifcfg-br0 网卡配置信息;

[root@ying06 network-scripts]# cp ifcfg-ens33 ifcfg-br0
[root@ying06 network-scripts]# vim ifcfg-br0 

TYPE=b=Bridge                 //桥接
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.112.152
NETMASK=255.255.255.0
PREFIX=24
GATEWAY=192.168.112.2
DNS1=119.29.29.29
DNS1=8.8.8.8

把原来的网卡连接到br0

[root@ying06 network-scripts]# vim ifcfg-ens33

TYPE=Ethernet
BOOTPROTO=none
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0

重启网络,bro网卡生效;

[root@ying06 network-scripts]# systemctl restart network
[root@ying06 network-scripts]# 
[root@ying06 network-scripts]# ifconfig 
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.112.152  netmask 255.255.255.0  broadcast 192.168.112.255
        inet6 fe80::20c:29ff:fe52:d6f4  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:52:d6:f4  txqueuelen 1000  (Ethernet)
        RX packets 28  bytes 1886 (1.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 25  bytes 2406 (2.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:52:d6:f4  txqueuelen 1000  (Ethernet)
        RX packets 329741  bytes 478510623 (456.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40478  bytes 4197035 (4.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

检查KVM模块是否加载:lsmod|grep kvm

[root@ying06 ~]# lsmod|grep kvm
kvm_intel             170086  0 
kvm                   566340  1 kvm_intel
irqbypass              13503  1 kvm

启动libvirtd服务

[root@ying06 ~]# systemctl start libvirtd
[root@ying06 ~]# ps aux |grep libvirtd
root      5092  1.9  0.3 700156 14624 ?        Ssl  22:30   0:00 /usr/sbin/libvirtd
root      5246  0.0  0.0 112720   984 pts/1    S+   22:30   0:00 grep --color=auto libvirtd
[root@ying06 ~]# ps aux |grep libvirtd
root      5092  0.7  0.3 700156 14624 ?        Ssl  22:30   0:00 /usr/sbin/libvirtd
root      5248  0.0  0.0 112720   984 pts/1    R+   22:30   0:00 grep --color=auto libvirtd

查看桥接网卡信息

[root@ying06 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c2952d6f4	no		ens33
virbr0		8000.5254003470ef	yes		virbr0-nic

五、创建虚拟机安装

把之前下载的CentOS官方镜像,放在/tmp/下,因为等下配置时候,需要加载它;

[root@ying06 tmp]# ls /tmp/CentOS-7-x86_64-DVD-1708.iso 
/tmp/CentOS-7-x86_64-DVD-1708.iso

用命令安装;

[root@ying06 tmp]# virt-install --name=feng01 --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7-x86_64-DVD-1708.iso --disk path=/kvm_data/feng01.img,size=10 --bridge=br0 --graphics=none --console=pty,target_type=serial  --extra-args="console=tty0 console=ttyS0"

命令解释:

• virt-install:安装指令; --name=feng01 :指定虚拟机的名称; --memory=512,maxmemory=1024 : 定义虚拟机内存大小512M,最大为1024M,可以热调节内存; --vcpus=1,maxvcpus=2 :定义cpu核心为1个,最大2个; --os-type=linux :定义操作系统为linux; --os-variant=rhel7 : 指定系统版本号; --location=/tmp/CentOS-7-x86_64-DVD-1708.iso :指定安装镜像的路径;可以写网络链接 --disk path=/kvm_data/feng01.img,size=10: 虚拟磁盘的路径,大小为10G; --bridge=br0: 定义网络模式为桥接,与宿主机共用一个网段; --graphics=none :定义开启图形,不开启; --console=pty,target_type=serial: 开启终端,以及其属性 --extra-args="console=tty0 console=ttyS0" : 定义终端的属性;

安装后,进行一些语言、密码等配置,就可以进去虚拟机了;

CentOS Linux 7 (Core)
Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root
密码:

进入虚拟机后,查看IP,需要自动获取IP;dhclient eth0

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:e1:ec:85 brd ff:ff:ff:ff:ff:ff

[root@localhost ~]# dhclient eth0
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:e1:ec:85 brd ff:ff:ff:ff:ff:ff
    inet 192.168.112.128/24 brd 192.168.112.255 scope global dynamic eth0
       valid_lft 1788sec preferred_lft 1788sec
    inet6 fe80::5054:ff:fee1:ec85/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# ping www.qq.com
PING https.qq.com (183.3.226.35) 56(84) bytes of data.
64 bytes from 183.3.226.35 (183.3.226.35): icmp_seq=1 ttl=128 time=15.4 ms
64 bytes from 183.3.226.35 (183.3.226.35): icmp_seq=2 ttl=128 time=13.6 ms
64 bytes from 183.3.226.35 (183.3.226.35): icmp_seq=3 ttl=128 time=13.0 ms
 
--- https.qq.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 13.022/14.040/15.498/1.061 ms
[root@localhost ~]# yum install -y net-tools

此时联网后,用yum安装net-tools,就可以使用ifconfig

[root@localhost ~]# yum install -y net-tools


[root@localhost ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.112.128  netmask 255.255.255.0  broadcast 192.168.112.255
        inet6 fe80::5054:ff:fee1:ec85  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:e1:ec:85  txqueuelen 1000  (Ethernet)
        RX packets 3411  bytes 13324729 (12.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2921  bytes 164961 (161.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

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 1  (Local Loopback)
        RX packets 256  bytes 22272 (21.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 256  bytes 22272 (21.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

查看内存,以及磁盘使用情况;

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           480M        108M        126M        6.6M        245M        208M
Swap:          1.0G          0B        1.0G
[root@localhost ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/vda3       8.0G  963M  7.1G   12% /
devtmpfs        487M     0  487M    0% /dev
tmpfs           497M     0  497M    0% /dev/shm
tmpfs           497M  6.6M  490M    2% /run
tmpfs           497M     0  497M    0% /sys/fs/cgroup
/dev/vda1      1014M  119M  896M   12% /boot
tmpfs            49M     0   49M    0% /run/user/0

回到宿主机,使用top命令,可以看到qemu进程,说明kvm就是linux系统的一个进程;

[root@ying06 ~]# top
top - 23:05:57 up  4:57,  1 user,  load average: 0.05, 0.12, 0.22
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3873760 total,   204456 free,   720848 used,  2948456 buff/cache
KiB Swap:  3905532 total,  3905532 free,        0 used.  2827648 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                 
 5526 qemu      20   0 1560892 574036   9344 S   0.3 14.8   0:29.05 qemu-kvm                                                                                
 5717 root      20   0  161960   2212   1552 R   0.3  0.1   0:00.07 top                                                                                     
    1 root      20   0   43520   3812   2448 S   0.0  0.1   0:02.49 systemd                                                                                 
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd

查看kvm进程,所以说虚拟机就是系统里面一个进程;

[root@ying06 ~]# ps aux |grep kvm
root       491  0.0  0.0      0     0 ?        S<   18:08   0:00 [kvm-irqfd-clean]
qemu      5526  3.9 14.8 1560892 574036 ?      Sl   22:54   0:29 /usr/libexec/qemu-kvm -name feng01 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off -cpu Westmere-IBRS -m 1024 -realtime mlock=off -smp 1,maxcpus=2,sockets=2,cores=1,threads=1 -uuid c11da007-5972-4bad-8380-0d04e46d9fa1 -display none -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-2-feng01/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/kvm_data/aminglinux01.img,format=qcow2,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive if=none,id=drive-ide0-0-0,readonly=on -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -netdev tap,fd=26,id=hostnet0,vhost=on,vhostfd=28 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:e1:ec:85,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-2-feng01/org.qemu.guest_agent.0,server,nowait -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on
root      5535  0.0  0.0      0     0 ?        S    22:54   0:00 [kvm-pit/5526]
root      5748  0.0  0.0 112720   984 pts/1    R+   23:07   0:00 grep --color=auto kvm

六、虚拟机管理

  • 查看虚拟机列表,只能看到运行的虚拟机:virsh list
[root@ying06 ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 2     feng01                         running
  • 查看虚拟机列表,包括未运行的虚拟机: virsh list --all
[root@ying06 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 2     feng01                         running

[root@ying06 ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        27G  7.8G   19G   30% /
devtmpfs        1.9G     0  1.9G    0% /dev
tmpfs           1.9G     0  1.9G    0% /dev/shm
tmpfs           1.9G  8.7M  1.9G    1% /run
tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1       197M  115M   83M   59% /boot
tmpfs           379M     0  379M    0% /run/user/0
/dev/sdb         40G  1.3G   36G    4% /kvm_data
[root@ying06 ~]# ls /kvm_data/                   //磁盘位置         
aminglinux01.img  lost+found
  • 关闭虚拟机:virsh shutdown feng01
[root@ying06 kvm_data]# virsh shutdown feng01
域 feng01 被关闭

[root@ying06 kvm_data]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     feng01                         关闭
  • 强制停止,类似stop :virsh destroy feng01
  • 彻底销毁虚拟机,会删除虚拟机配置文件: virsh undefine feng01
  • 开启虚拟机: virsh start feng01
[root@ying06 kvm_data]# virsh start feng01
域 feng01 已开始

[root@ying06 kvm_data]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 4     feng01                         running
  • 进入指定虚拟机:virsh console feng01
[root@ying06 kvm_data]# virsh console feng01
连接到域 feng01
换码符为 ^]


CentOS Linux 7 (Core)
Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login:
  • 查看虚拟机的配置文件: ls /etc/libvirt/qemu
[root@ying06 ~]# ls /etc/libvirt/qemu
feng01.xml  networks
[root@ying06 ~]# ls /etc/libvirt/qemu/networks/
autostart  default.xml
[root@ying06 ~]# vim /etc/libvirt/qemu/feng01.xml   //feng01虚拟机的配置文件
  • 开机启动指定的虚拟机:virsh autostart feng01
[root@ying06 ~]# virsh autostart feng01
  • 取消开机启动:virsh autostart --disable feng01
[root@ying06 ~]# virsh autostart --disable feng01
  • 挂起虚拟机(相当于windows睡眠):virsh suspend feng01
[root@ying06 ~]# virsh suspend feng01
域 feng01 被挂起

[root@ying06 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 1     feng01                         暂停
  • 恢复挂起的虚拟机:virsh resume feng01
[root@ying06 ~]# virsh resume feng01
域 feng01 被重新恢复

[root@ying06 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 1     feng01                         running

[root@ying06 ~]#

七、克隆虚拟机

克隆虚拟机前需要先关机;

按feng01机器克隆feng02机器: virt-clone --original feng01 --name feng02 --file /kvm_data/feng02.img

  • --original feng01 :克隆源
  • --name feng02 ;克隆机器的名字
  • --file /kvm_data/feng02.img : 文件放在那里
[root@ying06 ~]# virsh shutdown feng01             //关机
域 feng01 被关闭

[root@ying06 ~]# ls /kvm_data/              
feng01.img  lost+found
[root@ying06 ~]# virt-clone  --original feng01 --name feng02 --file /kvm_data/feng02.img
正在分配 'feng02.img'                                                                                                             |  10 GB  00:00:42     

成功克隆 'feng02'。
[root@ying06 ~]# ls /kvm_data/
feng01.img  feng02.img  lost+found
[root@ying06 ~]# virsh list --all                 //现在有两个机器
 Id    名称                         状态
----------------------------------------------------
 -     feng01                         关闭
 -     feng02                         关闭

[root@ying06 ~]# virsh start feng02
域 feng02 已开始

配置网络,需要用dhclient eth0 自动获取IP

[root@localhost ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 52:54:00:f6:36:2a  txqueuelen 1000  (Ethernet)
        RX packets 8  bytes 648 (648.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

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 1  (Local Loopback)
        RX packets 64  bytes 5568 (5.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64  bytes 5568 (5.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost ~]# dhclient eth0
[root@localhost ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.112.129  netmask 255.255.255.0  broadcast 192.168.112.255
        inet6 fe80::5054:ff:fef6:362a  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:f6:36:2a  txqueuelen 1000  (Ethernet)
        RX packets 32  bytes 4169 (4.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 62  bytes 6776 (6.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

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 1  (Local Loopback)
        RX packets 64  bytes 5568 (5.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64  bytes 5568 (5.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

此时宿主机可以连接此虚拟机

[root@ying06 ~]# ssh 192.168.112.129
The authenticity of host '192.168.112.129 (192.168.112.129)' can't be established.
ECDSA key fingerprint is SHA256:Nh7yjmpxKcHTY6ah3tFNH8KANamwqa0YofsKZEvKOqY.
ECDSA key fingerprint is MD5:e4:63:8b:8d:f6:3c:f3:9b:18:24:cb:66:8b:67:d2:42.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.112.129' (ECDSA) to the list of known hosts.
root@192.168.112.129's password: 
Last login: Fri Oct 12 00:28:03 2018
[root@localhost ~]# w
 00:31:03 up 3 min,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     ttyS0                     00:28   39.00s  0.04s  0.04s -bash
root     pts/0    192.168.112.152  00:30    6.00s  0.02s  0.01s w

八、虚拟机快照管理

快照就如同VMware里面的快照一样,在KVM虚拟机里面,raw格式的虚拟磁盘不支持做快照,qcow2支持

创建快照:virsh snapshot-create feng01

[root@ying06 ~]# virsh snapshot-create feng01
已生成域快照 1539302577

查看feng01.img磁盘信息,里面有Snapshot list一栏,就是其快照;

[root@ying06 ~]# qemu-img info /kvm_data/feng01.img 
image: /kvm_data/feng01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.2G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1539302577                0 2018-10-12 08:02:57   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: true

查看快照feng01机器的快照清单

[root@ying06 ~]# virsh snapshot-list feng01
 名称               生成时间              状态
------------------------------------------------------------
 1539302577           2018-10-12 08:02:57 +0800 shutoff

查看当前快照版本:virsh snapshot-current feng01

[root@ying06 ~]# virsh snapshot-current feng01
<domainsnapshot>
  <name>1539302577</name>
  <state>shutoff</state>
  <creationTime>1539302577</creationTime>
  <memory snapshot='no'/>
  <disks>
.....以下省略

查看所有快照配置文件,再创建快照,并删除;

[root@ying06 ~]# ls /var/lib/libvirt/qemu/snapshot/        //快照的目录
feng01
[root@ying06 ~]# ls /var/lib/libvirt/qemu/snapshot/feng01/  
1539302577.xml
[root@ying06 ~]# virsh snapshot-create feng01             //针对feng01机器再创建一个快照
已生成域快照 1539303581 
[root@ying06 ~]# ls /var/lib/libvirt/qemu/snapshot/feng01/  
1539302577.xml  1539303581.xml
[root@ying06 ~]# virsh snapshot-list feng01                 //查看feng01机器的快照清单
 名称               生成时间              状态
------------------------------------------------------------
 1539302577           2018-10-12 08:02:57 +0800 shutoff
 1539303581           2018-10-12 08:19:41 +0800 shutoff

[root@ying06 ~]# virsh snapshot-delete feng01 1539303581      //删除快照
已删除域快照 1539303581

[root@ying06 ~]# virsh snapshot-list feng01               
 名称               生成时间              状态
------------------------------------------------------------
 1539302577           2018-10-12 08:02:57 +0800 shutoff

[root@ying06 ~]# ls /var/lib/libvirt/qemu/snapshot/feng01/
1539302577.xml

九、磁盘格式

虚拟磁盘常用格式raw、qcow2;

  • raw格式的磁盘性能比qcow2要好;
  • raw格式的磁盘无法做快照;
  • raw文件大小和我们指定空间大小一样;qcow2文件比较小,需要多少,用多少。
  • 创建新磁盘

查看feng01.img磁盘的配置情况:qemu-img info /kvm_data/feng01.img

[root@ying06 kvm_data]# qemu-img info /kvm_data/feng01.img
image: /kvm_data/feng01.img
file format: qcow2
virtual size: 10G (12882804736 bytes)
disk size: 1.2G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true

创建格式为raw,大小为2G的新磁盘;

[root@ying06 kvm_data]# qemu-img create -f raw /kvm_data/feng01_2.img 2G

两种查看方法不同,新磁盘的大小也不一样;

[root@ying06 kvm_data]# du -sh *
0	feng01_2.img                   //新增的磁盘显示为0           
196K	feng01_2.qcow2
1.3G	feng01.img
1.2G	feng02_3.raw
1.2G	feng02.img
16K	lost+found
[root@ying06 kvm_data]# ls -lh 
总用量 3.6G
-rw-r--r-- 1 root root 2.0G 10月 12 09:26 feng01_2.img       //新磁盘为2G
-rw-r--r-- 1 root root 193K 10月 12 09:57 feng01_2.qcow2
-rw------- 1 root root  11G 10月 12 09:22 feng01.img
-rw-r--r-- 1 root root  10G 10月 12 10:38 feng02_3.raw
-rw------- 1 root root 1.2G 10月 12 09:22 feng02.img
drwx------ 2 root root  16K 10月 11 21:55 lost+found
  • 磁盘格式转换

把qcow2格式的磁盘转换为raw格式;下面命令就是把qcow2格式的磁盘feng02.img转换为raw格式的磁盘为feng02_3.raw

[root@ying06 kvm_data]# qemu-img convert -O raw /kvm_data/feng02.img /kvm_data/feng02_3.raw
  • 给虚拟机更换磁盘

编辑feng02虚拟机的配置文件;

[root@ying06 kvm_data]# virsh edit feng02        //编辑feng02虚拟机的配置文件


<disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>                  //把磁盘格式由qcow2改为raw格式
      <source file='/kvm_data/feng02_3.raw'/>           //并把磁盘feng02.img改为feng02_3.raw
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

也可以直接在配置文件中更改;(实质就是用vim查看的)

[root@ying06 kvm_data]# ls /etc/libvirt/qemu    //虚拟主机的配置文件的目录
feng01.xml  feng02.xml  networks

[root@ying06 kvm_data]# vim /etc/libvirt/qemu/feng02.xml  //等同于命令:virsh edit feng02

开启feng02虚拟机;可以看到feng02主机磁盘由feng02.img更换为feng02_3.raw

[root@ying06 kvm_data]# virsh start feng02 
域 feng02 已开始

[root@ying06 kvm_data]# ls -lh 
总用量 3.6G
-rw-r--r-- 1 root root 2.0G 10月 12 09:26 feng01_2.img
-rw-r--r-- 1 root root 193K 10月 12 09:57 feng01_2.qcow2
-rw------- 1 root root  11G 10月 12 09:22 feng01.img
-rw-r--r-- 1 qemu qemu  10G 10月 12 10:38 feng02_3.raw       //看qemu,此时虚拟机启动加载的硬盘
-rw------- 1 root root 1.2G 10月 12 09:22 feng02.img
drwx------ 2 root root  16K 10月 11 21:55 lost+found

[root@ying06 kvm_data]# virsh snapshot-create feng02         //创建快照,显示raw格式的硬盘不支持快照
错误:不支持的配置:存储类型 vda 不支持磁盘 raw 的内部快照

十、磁盘扩容

生产中,遇到业务的增加,磁盘不够用,虚拟机磁盘可以扩容,也可以新增加磁盘。这两种操作方式;

10.1 磁盘扩容(raw)

给虚拟磁盘扩容2G:qemu-img resize /kvm_data/feng02_3.raw +2G

[root@ying06 kvm_data]# qemu-img resize /kvm_data/feng02_3.raw +2G  
Image resized.

[root@ying06 kvm_data]# qemu-img info /kvm_data/feng02_3.raw    //查看虚拟磁盘配置信息
image: /kvm_data/feng02_3.raw
file format: raw                                                //磁盘格式为raw
virtual size: 12G (12884901888 bytes)                           //虚拟磁盘尺寸为12G,比之前增加2G
disk size: 1.2G                                                 //真实尺寸为1.2G

进入feng02虚拟主机,用fdisk -l查看磁盘情况,磁盘10G,还没有生效;

[root@ying06 kvm_data]# virsh console feng02
连接到域 feng02
换码符为 ^]


CentOS Linux 7 (Core)
Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root
密码:
Last login: Fri Oct 12 09:18:32 on ttyS0

[root@localhost ~]# fdisk -l

磁盘 /dev/vda:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a72f6

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

重启一下feng02虚拟主机,使增加的磁盘生效;

[root@ying06 kvm_data]# virsh shutdown feng02
域 feng02 被关闭

[root@ying06 kvm_data]# virsh start feng02
域 feng02 已开始

[root@ying06 kvm_data]# virsh console feng02


localhost login: root
密码:
Last login: Fri Oct 12 11:37:04 on ttyS0
[root@localhost ~]# 
[root@localhost ~]# fdisk -l

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区        //已经生效12G
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a72f6

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

扩从的磁盘,因为已经存在内容,需要再分区,但是只是能把它作为新增的分区;这样才能够利用。这样整个操作比较麻烦;为了更方便,可以新增加一个硬盘,然后按要求分区、格式化、挂载,就能够利用了;

再新创建一个5G的硬盘

[root@ying06 kvm_data]# qemu-img create -f raw /kvm_data/feng02_2.img 5G
Formatting '/kvm_data/feng02_2.img', fmt=raw size=5368709120 
[root@ying06 kvm_data]# qemu-img info feng02_2.img      //格式为raw
image: feng02_2.img
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: 0                           //新硬盘,所以实际尺寸为0

[root@ying06 kvm_data]# ls -l
总用量 3730188
-rw-r--r-- 1 root root  2147483648 10月 12 09:26 feng01_2.img
-rw-r--r-- 1 root root      197120 10月 12 09:57 feng01_2.qcow2
-rw------- 1 root root 10747838464 10月 12 09:22 feng01.img
-rw-r--r-- 1 root root  5368709120 10月 12 12:08 feng02_2.raw       //新增加的5G硬盘 
-rw-r--r-- 1 qemu qemu 12884901888 10月 12 12:03 feng02_3.raw       
-rw------- 1 root root  1272709120 10月 12 09:22 feng02.img
drwx------ 2 root root       16384 10月 11 21:55 lost+found

编辑feng02虚拟主机的配置文件:virsh edit feng02

[root@ying06 kvm_data]# virsh edit feng02   //复制磁盘的配置文件,作为另一个磁盘的配置


    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/kvm_data/feng02_3.raw'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    
    <disk type='file' device='disk'>    
      <driver name='qemu' type='raw'/>         
      <source file='/kvm_data/feng02_2.raw'/>               //把磁盘的路径改为新增的feng02_2.raw
      <target dev='vdb' bus='virtio'/>                      //vda 改为 vdb
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>   //表示slot,要与原来磁盘与区别
    </disk>

重启feng02虚拟主机,此时可以看到feng02_2.raw 和 feng02_3.raw属主、数组都为qeum,说明已经扩容成功;

[root@ying06 kvm_data]# virsh shutdown feng02
域 feng02 被关闭

[root@ying06 kvm_data]# virsh start feng02
域 feng02 已开始

[root@ying06 kvm_data]# ls -l
总用量 3730192
-rw-r--r-- 1 root root  2147483648 10月 12 09:26 feng01_2.img
-rw-r--r-- 1 root root      197120 10月 12 09:57 feng01_2.qcow2
-rw------- 1 root root 10747838464 10月 12 09:22 feng01.img
-rw-r--r-- 1 qemu qemu  5368709120 10月 12 12:08 feng02_2.raw
-rw-r--r-- 1 qemu qemu 12884901888 10月 12 12:22 feng02_3.raw
-rw------- 1 root root  1272709120 10月 12 09:22 feng02.img
drwx------ 2 root root       16384 10月 11 21:55 lost+found

进入feng02主机内,用fdisk -l命令,查看磁盘情况,发现有个新磁盘 /dev/vdb

[root@ying06 kvm_data]# virsh console feng02
连接到域 feng02
换码符为 ^]


localhost login: root
密码:
Last login: Fri Oct 12 11:42:36 on ttyS0
[root@localhost ~]# 
[root@localhost ~]# fdisk -l

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a72f6

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

磁盘 /dev/vdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
10.2 磁盘扩容(qcow2)

feng01.img磁盘因为有快照,所以不能够扩容;

[root@ying06 kvm_data]# qemu-img resize /kvm_data/feng01.img +2G
qemu-img: Can't resize an image which has snapshots
qemu-img: This image does not support resize

查看feng01虚拟主机的快照情况;并把其删除,然后再扩容

[root@ying06 kvm_data]# virsh snapshot-list feng01
 名称               生成时间              状态
------------------------------------------------------------
 1539302577           2018-10-12 08:02:57 +0800 shutoff

[root@ying06 kvm_data]# virsh snapshot-delete feng01 1539302577    //删除快照
已删除域快照 1539302577

[root@ying06 kvm_data]# qemu-img resize /kvm_data/feng01.img +2G   //扩容成功
Image resized.

查看feng01.img磁盘的信息,发现为12G,增加了2G;

[root@ying06 kvm_data]# qemu-img info /kvm_data/feng01.img 
image: /kvm_data/feng01.img
file format: qcow2
virtual size: 12G (12884901888 bytes)           
disk size: 1.2G 
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true

进入feng01虚拟机,查看磁盘情况,增加成功;

[root@ying06 kvm_data]# virsh start feng01
域 feng01 已开始

[root@ying06 kvm_data]# virsh console feng01
连接到域 feng01
换码符为 ^]

localhost login: root
密码:
Last login: Fri Oct 12 09:10:26 on ttyS0

[root@localhost ~]# fdisk -l

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a72f6

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

虽然总磁盘扩容了,但是设备上却没有显示;现在把其重新分区;

[root@localhost ~]# fdisk /dev/vda
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):n                               //新创分区
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): p                                  //类型为 主分区;
已选择分区 4
起始 扇区 (20971520-25165823,默认为 20971520):       //自动识别,回车
将使用默认值 20971520
Last 扇区, +扇区 or +size{K,M,G} (20971520-25165823,默认为 25165823): //默认,回车
将使用默认值 25165823
分区 4 已设置为 Linux 类型,大小设为 2 GiB              //自动识别分区大小为 2G,就是刚才扩容的分区

命令(输入 m 获取帮助):p                               //打印磁盘情况

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a72f6

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux
/dev/vda4        20971520    25165823     2097152   83  Linux         //此为扩容分分区2G

现在同样新增加一个5G硬盘;(操作和raw格式硬盘,一样)

[root@ying06 kvm_data]#  qemu-img create -f qcow2 /kvm_data/feng01_3.img 5G
Formatting '/kvm_data/feng01_3.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_ref

编辑feng1虚拟主机配置文件,为新硬盘配置信息

[root@ying06 kvm_data]# virsh edit feng01

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm_data/feng01.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm_data/feng01_3.img'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </disk>

查看新硬盘feng01_3.img

[root@ying06 kvm_data]# ls -lh
总用量 3.6G
-rw-r--r-- 1 root root 2.0G 10月 12 09:26 feng01_2.img
-rw-r--r-- 1 root root 193K 10月 12 09:57 feng01_2.qcow2
-rw-r--r-- 1 root root 193K 10月 12 15:35 feng01_3.img     //此时并没有加载此磁盘
-rw------- 1 qemu qemu  11G 10月 12 15:54 feng01.img
-rw-r--r-- 1 root root 5.0G 10月 12 12:08 feng02_2.raw
-rw-r--r-- 1 root root  12G 10月 12 15:54 feng02_3.raw
-rw------- 1 root root 1.2G 10月 12 09:22 feng02.img
drwx------ 2 root root  16K 10月 11 21:55 lost+found

开启feng01虚拟机,可以看到已经加载上feng01_3.img这个新硬盘;

[root@ying06 kvm_data]# virsh start feng01
域 feng01 已开始

[root@ying06 kvm_data]# ls -lh
总用量 3.6G
-rw-r--r-- 1 root root 2.0G 10月 12 09:26 feng01_2.img
-rw-r--r-- 1 root root 193K 10月 12 09:57 feng01_2.qcow2
-rw-r--r-- 1 qemu qemu 193K 10月 12 15:35 feng01_3.img      //已经加载上次硬盘
-rw------- 1 qemu qemu  11G 10月 12 15:55 feng01.img
-rw-r--r-- 1 root root 5.0G 10月 12 12:08 feng02_2.raw
-rw-r--r-- 1 root root  12G 10月 12 15:54 feng02_3.raw
-rw------- 1 root root 1.2G 10月 12 09:22 feng02.img
drwx------ 2 root root  16K 10月 11 21:55 lost+found

进入虚拟机 ,可以查看此磁盘vdb

[root@localhost ~]# fdisk -l

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a72f6

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

磁盘 /dev/vdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

对于磁盘 /dev/vdb 可以按需要分区,格式化,然后挂载就可以访问;

有关磁盘分区,格式化,挂载, 请参考我的文章 Linux磁盘管理

十一、调整虚拟机的cpu、内存和网卡

11.1 调整虚拟机的cpu、内存

查看虚拟机的简单配置: virsh dominfo feng01

[root@ying06 ~]# virsh dominfo feng01
Id:             7
名称:       feng01
UUID:           c11da007-5972-4bad-8380-0d04e46d9fa1      //uid
OS 类型:    hvm
状态:       running
CPU:          1                                          //cpu核心为1
CPU 时间:   22.4s
最大内存: 1048576 KiB                                    //最大内存
使用的内存: 524288 KiB                                   //使用内存
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

[root@ying06 ~]# virsh dominfo feng02
Id:             -
名称:       feng02
UUID:           34ed01ea-1523-49d5-aed8-2371f5171ccb
OS 类型:    hvm
状态:       关闭
CPU:          1
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

内存和CPU,可以在配置文件中更改:virsh edit feng01 ;不过更改完需要重启;

[root@ying06 ~]# virsh edit feng01


 <name>feng01</name>
  <uuid>c11da007-5972-4bad-8380-0d04e46d9fa1</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>824288</currentMemory>
  <vcpu placement='static' current='2'>2</vcpu>

可以动态更改CPU核心和使用内存:

[root@ying06 ~]# virsh setvcpus feng01 2     //把虚拟主机feng01的CPU核心改为2个

[root@ying06 ~]# virsh setmem feng01 800m    //把其使用内存改为800M,总共1G,只能在小于1G

[root@ying06 ~]# virsh dominfo feng01        //立即查看,就可以看到更改的结果
Id:             8
名称:       feng01
UUID:           c11da007-5972-4bad-8380-0d04e46d9fa1
OS 类型:    hvm
状态:       running
CPU:          2
CPU 时间:   19.7s
最大内存: 1048576 KiB
使用的内存: 819200 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

但是这样更改,只能在本次使用,如果关机,重启,就会失效,必须把这个配置写入此虚拟主机的配置文件;

[root@ying06 ~]# virsh dumpxml feng01 > /etc/libvirt/qemu/feng01.xml 

[root@ying06 ~]# virsh shutdown feng01

[root@ying06 ~]# virsh start feng01

虚拟机重启之后,其配置文件已经变为,我们设置的内容。

[root@ying06 ~]# virsh edit feng01

 <name>feng01</name>
  <uuid>c11da007-5972-4bad-8380-0d04e46d9fa1</uuid>
  <memory unit='KiB'>1048576</memory> 
  <currentMemory unit='KiB'>819200</currentMemory>              //内存更改为800M
  <vcpu placement='static'>2</vcpu>                             //cpu核心变为2个
  <resource>

进入feng01虚拟机内,查看内存,也约为800M,再次说明之前更改的配置已经生效;

[root@ying06 ~]# virsh console feng01
连接到域 feng01
换码符为 ^]


CentOS Linux 7 (Core)
Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root
密码:
Last login: Fri Oct 12 15:59:32 on ttyS0

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           768M         83M        573M        6.5M        110M        544M
Swap:          1.0G          0B        1.0G

一般情况,配置虚拟机的时候尽量为了扩容的准备,方便以后在一定内存内动态的调整;

11.2 调整虚拟机的内存

查看虚拟机的网卡:virsh domiflist feng01

[root@ying06 ~]# virsh domiflist feng01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:e1:ec:85

设置一个新的网卡:virsh attach-interface feng01 --type bridge --source virbr0

其命令的参数解释:

--type bridge :网络模式为 bridge

--source virbr0 : 网络来源为nat模式(virbr0类似vmware的vmnet8 )

--source br0 :则网络模式为桥接

[root@ying06 ~]# virsh attach-interface feng01 --type bridge  --source virbr0
成功附加接口

[root@ying06 ~]# virsh domiflist feng01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:e1:ec:85
vnet1      bridge     virbr0     rtl8139     52:54:00:4a:78:c0

[root@ying06 ~]# virsh attach-interface feng01 --type bridge  --source br0   
成功附加接口

[root@ying06 ~]# virsh domiflist feng01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:e1:ec:85
vnet1      bridge     virbr0     rtl8139     52:54:00:4a:78:c0
vnet2      bridge     br0        rtl8139     52:54:00:0d:62:e2

进入feng01虚拟主机内,可以看到ens9和ens10两个新网卡;

  • ens9就是nat模式,和宿主机上virbr0网卡网段同为122网段;
  • ens10就是桥接模式,网段还是122网段;
[root@ying06 ~]# virsh console feng01
连接到域 feng01
换码符为 ^]


[root@localhost ~]# ifconfig
ens9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.149  netmask 255.255.255.0  broadcast 192.168.122.255
        inet6 fe80::7e2a:4c53:e5fb:1b70  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:4a:78:c0  txqueuelen 1000  (Ethernet)
        RX packets 23  bytes 2569 (2.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 65  bytes 6266 (6.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens10: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500              
        inet 192.168.112.130  netmask 255.255.255.0  broadcast 192.168.112.255
        inet6 fe80::1ed4:775f:55c8:4e3f  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:0d:62:e2  txqueuelen 1000  (Ethernet)
        RX packets 33  bytes 2913 (2.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13  bytes 1454 (1.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 52:54:00:e1:ec:85  txqueuelen 1000  (Ethernet)
        RX packets 288  bytes 40679 (39.7 KiB)
        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

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 1  (Local Loopback)
        RX packets 452  bytes 39328 (38.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 452  bytes 39328 (38.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

退出虚拟机,回到宿主机上,查看网卡配置;virbr0的网段就是122网段。

[root@ying06 ~]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.112.152  netmask 255.255.255.0  broadcast 192.168.112.255
        inet6 fe80::20c:29ff:fe52:d6f4  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:52:d6:f4  txqueuelen 1000  (Ethernet)
        RX packets 8841  bytes 809897 (790.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6030  bytes 817990 (798.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:52:d6:f4  txqueuelen 1000  (Ethernet)
        RX packets 9174  bytes 967938 (945.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6389  bytes 873595 (853.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

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 1  (Local Loopback)
        RX packets 41  bytes 3196 (3.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 41  bytes 3196 (3.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:34:70:ef  txqueuelen 1000  (Ethernet)
        RX packets 51  bytes 4146 (4.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 20  bytes 2515 (2.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::fc54:ff:fee1:ec85  prefixlen 64  scopeid 0x20<link>
        ether fe:54:00:e1:ec:85  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 230  bytes 34272 (33.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vnet1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::fc54:ff:fe4a:78c0  prefixlen 64  scopeid 0x20<link>
        ether fe:54:00:4a:78:c0  txqueuelen 1000  (Ethernet)
        RX packets 58  bytes 5702 (5.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 49  bytes 4255 (4.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vnet2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::fc54:ff:fe0d:62e2  prefixlen 64  scopeid 0x20<link>
        ether fe:54:00:0d:62:e2  txqueuelen 1000  (Ethernet)
        RX packets 13  bytes 1454 (1.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 37  bytes 3504 (3.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

虽然这些网卡配置好了,但是重启之后,就会消失,若需要保存,则把这些配置写入虚拟主机的配置文件中。

[root@ying06 ~]# virsh domiflist feng01
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:e1:ec:85
vnet1      bridge     virbr0     rtl8139     52:54:00:4a:78:c0
vnet2      bridge     br0        rtl8139     52:54:00:0d:62:e2

[root@ying06 ~]# virsh domiflist feng01 > /etc/libvirt/qemu/feng01.xml

十二、迁移虚拟机

迁移虚拟主机前,需要关闭虚拟主机;

[root@ying06 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     feng01                         关闭
 -     feng02                         关闭

拷贝feng01虚拟主机涉及的磁盘

[root@ying06 ~]# virsh domblklist feng01
目标     源
------------------------------------------------
vda        /kvm_data/feng01.img
vdb        /kvm_data/feng01_3.img
hda        -


[root@ying06 kvm_data]# cp feng01.img feng03.img

[root@ying06 kvm_data]# cp feng01_3.img feng03_3.img

迁移虚拟主机的配置文件

[root@ying06 ~]# virsh dumpxml feng01 > /etc/libvirt/qemu/feng03.xml

此时配置文件是feng01主机的,此时需要更改以下新的配置文件name、UUID、路径不一样也需要修改

[root@ying06 kvm_data]# vim /etc/libvirt/qemu/feng03.xml

<domain type='kvm'>
  <name>feng03</name>                                 //name改为定义的feng03
  <uuid>c11da007-5972-4bad-8380-0d04e46d9fa3</uuid>  //uuid也改动一个数字即可,比如最后一个改为3
  <memory unit='KiB'>1048576</memory>

查看所有虚拟主机却没有发现feng03主机;需要定义feng03主机:virsh define /etc/libvirt/qemu/feng03.xml

[root@ying06 kvm_data]# virsh define /etc/libvirt/qemu/feng03.xml ^C
[root@ying06 kvm_data]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     feng01                         关闭
 -     feng02                         关闭

[root@ying06 kvm_data]# virsh define /etc/libvirt/qemu/feng03.xml
定义域 feng03(从 /etc/libvirt/qemu/feng03.xml)

[root@ying06 kvm_data]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     feng01                         关闭
 -     feng02                         关闭
 -     feng03                         关闭          //此时虚拟主机列表,看到feng03主机的状态

因为腾讯云主机不能主持KVM虚拟化,所以模拟本机,思路步骤都一样。

我这里用的是复制,而到远程主机,rsync备份过去;

rsync -av /kvm_data/feng01.img  /kvm_data/feng03.img  //把该磁盘文件以及配置文件,拷贝到远程机器上

在远程上,可以不用更改这些配置文件,以及名称,因为两者不相互干涉。