一、虚拟化分类
虚拟化分成两类,全虚拟化和半虚拟化。
半虚拟化,Hypervisor程序部署在物理机上,如:Xen,VMWare ESXI。
全虚拟化,Hypervisor 作为OS 上的一个程序模块运行,并对管理虚拟机进行管理,如:kvm、VirtualBox、VMWare Workstation。
二、KVM
KVM,Kernel-Based Virtual Machine,基于Linux 内核实现的虚拟化技术。目前x86平台上最热门运用最广泛的虚拟化方案。
一台虚拟机的主要构成部分包括:cpu、memory、disk和network。其中:
- Kvm负责CPU和内存的虚拟化。
- Qemu负责磁盘、网络等IO的虚拟化。
三、Libvirt
Libvirt,kvm的管理工具,包含三个部分:
- libvirtd是服务程序,接收和处理API请求
- API库使得其他人可以开发基于Libvirt的高级工具
- virsh命令管理工具
四、创建一台虚拟机
1、服务器信息
# uname -r 3.10.0-1062.12.1.el7.x86_64 # more /etc/redhat-release CentOS Linux release 7.7.1908 (Core) # lsmod |grep kvm kvm_intel 188688 42 kvm 636883 1 kvm_intel irqbypass 13503 16 kvm # grep -E '(vmx|svm)' /proc/cpuinfo //查看CPU是否支持虚拟化,能过滤到信息代表支持虚拟化
2、安装kvm相关包
# yum install -y http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm # yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -y # systemctl enable libvirtd.service # systemctl start libvirtd.service # systemctl status libvirtd.service
3、 创建虚拟机
# wget http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/CentOS-7-x86_64-Minimal-2003.iso # qemu-img create -f raw /data/test/centos7.raw 20g //创建虚拟机磁盘 # virt-install --virt-type kvm --name centos7 --ram 4096 \ --cdrom=/data/test/CentOS-7-x86_64-Minimal-2003.iso \ --disk path=/data/test/centos7.raw --network network=default \ --graphics vnc,listen=0.0.0.0 -noautoconsole
使用vnc客户端访问宿主机的5900端口
然后就跟我们平常安装操作一样去操作就可以了
这里有一个优化点,就是虚拟机的磁盘在宿主机上本质就是一个磁盘文件,所以没必要做太多的分区,一般只给一个根分区就可以了。
如果制作的centos7的镜像,一般会做如下的设置
1)为了标准化,设置网络接口的名称为eth0
在后面输入net.ifname=0 biosdevname=0,然后输入enter
2)只创建一个/分区
安装完毕,可以看到dhcp分配到的IP地址是192.168.122.55,也可以访问到互联网
五、虚拟机访问互联网
默认网络虚拟机是如何访问互联网的?
Kvm默认会创建一个叫virbr0的网桥,其作用是为连接其上的虚拟机网卡提供nat访问外网的功能。
# brctl show virbr0 8000.525400375ff1 yes virbr0-nic vnet0 # virsh domiflist oautoconsole Interface Type Source Model MAC ------------------------------------------------------- vnet0 network default virtio 52:54:00:a0:a4:3f # ps -ef|grep dnsmasq root 19041 106421 0 10:51 pts/9 00:00:00 grep --color=auto dnsmasq nobody 112903 1 0 Sep02 ? 00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/defau root 112904 112903 0 Sep02 ? 00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/defau # more /var/lib/libvirt/dnsmasq/default.conf …… interface=virbr0 dhcp-range=192.168.122.2,192.168.122.254 …… # more /var/lib/libvirt/dnsmasq/virbr0.status [ { "ip-address": "192.168.122.55", "mac-address": "52:54:00:a0:a4:3f", "expiry-time": 1599104583 } ] # iptables -S -t nat -P PREROUTING ACCEPT -P INPUT ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT -A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN -A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
虚拟的逻辑连接图
虚拟机上网数据流向