CentOS7 KVM创建NAT模式虚拟机

【检测CPU是否支持虚拟化】

KVM 是基于 x86 虚拟化扩展(Intel VT 或者 AMD-V) 技术的虚拟机软件,所以查看 CPU 是否支持 VT 技术,就可以判断是否支持KVM。有返回结果,如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的。

cat /proc/cpuinfo | egrep 'vmx|svm'
flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc

【关闭SELinux】

安装之前关闭SELinux,防止出现问题,难以进行定位。

[ -s /etc/selinux/config ] && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0 >/dev/null 2>&1

【安装 KVM 环境】

通过 yum 安装 kvm 基础包和管理工具

yum -y install qemu-kvm libvirt virt-install bridge-utils

reboot 重启服务器后查看KVM模块是否被正确加载

lsmod | grep kvm
kvm_intel             188644  0 
kvm                   621480  1 kvm_intel

安装完成后开启kvm服务,并且设置其开机自动启动

systemctl enable --now libvirtd.service
systemctl status libvirtd.service 


【KVM创建虚拟机】

①创建一个NAT类型的网络

libvirt在安装完成后,默认已经创建了一个NAT类型的网络,并且已经设置好了NAT的一系列规则,DHCP等,这个网络会给宿主机创建一张virbr0网卡,用于宿主机与虚拟机互通。

可以通过以下命令查看网卡信息

virsh net-list
ip addr

 

②为NAT网络设置IP

网络上很多教程都是关闭DHCP为虚拟机指定IP,实际这种做法并不正确。

应使用[官方WIKI]提供的方法

virsh net-update default add ip-dhcp-host \
"<host mac='52:54:00:00:00:01' \
name='bob' ip='192.168.122.45' />" \
--live --config

通过修改mac、name、ip三个参数来实现为KVM虚拟机指定IP,还可以直接编辑虚拟网卡的配置文件,设置NAT网络的IP

virsh net-edit --network default

在<dhcp>…</dhcp>之间添加<host … />绑定虚拟机的IP;

修改 192.168.122.x 的网段,可以设置NAT网卡的IP

host mac=’…’ 地址自定义填写,不产生冲突即可,建议将MAC地址记录,方便创建虚拟机时使用

<network>
  <name>default</name>
  <uuid>43f535cd-2274-4399-80c2-5537465a13e5</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:68:23:9c'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
      <host mac='52:54:00:8d:34:11' name='windows2012-1' ip='192.168.122.11'/>
      <host mac='52:54:00:8d:34:12' name='windows2012-2' ip='192.168.122.12'/>
    </dhcp>
  </ip>
</network>

示例中使用默认 192.168.122.x 网段,为两个虚拟机,分配了192.168.122.11、192.168.122.12的IP

开启数据包转发功能

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.conf

重启网络即可完成修改

virsh net-destroy --network default
virsh net-start --network default

 

③创建虚拟机硬盘

创建一块20G的qcow2硬盘,给虚拟机使用
(也可跳过,在创建虚拟机时自动生成)

qemu-img create -f qcow2 /var/lib/libvirt/images/win2012-1.qcow2 20G

 

④准备系统安装光盘

下载或上传ISO文件,给虚拟机使用

示例将 cn_windows_server_2012_r2_x64_dvd_2707961.iso 镜像放到 /opt 目录下

如果安装的是Windows建议使用virtio驱动

wget https://fedorapeople.org/groups/virt/virtio-win/virtio-win.repo -O /etc/yum.repos.d/virtio-win.repo
yum install virtio-win

 

⑤创建虚拟机

使用以下命令创建,name与mac地址使用步骤②中的设置

Windows的创建方式

virt-install \
--name=windows2012-1 \
--os-variant=winxp \
--ram=2048 \
--vcpus=2 \
--cpu host-passthrough \
--accelerate \
--vnc --vncport=5901 --vnclisten=0.0.0.0 \
--network network=default,mac=52:54:00:8d:34:11,model=virtio \
--disk path=/var/lib/libvirt/images/win2012-1.qcow2,format=qcow2,size=20,bus=virtio \
--disk path=/opt/cn_windows_server_2012_r2_x64_dvd_2707961.iso,device=cdrom \
--disk path=/usr/share/virtio-win/virtio-win.iso,device=cdrom \
#--boot=cdrom \
--noautoconsole

暂时关闭防火墙

systemctl stop firewalld.service

#如果防火墙是iptables
systemctl stop iptables.service

使用VNC连接远程服务器5901端口,安装操作系统即可

安装完成后会重启,但虚拟机实际是关机状态

建议删除配置文件cdrom相关部分后,启动虚拟机

virsh edit windows2012-1
#删除以下部分
<disk type='file' device='cdrom'>
...
</disk>
virsh start windows2012-1

【KVM使用】

命令行方式管理虚拟机

virsh list                 # 查看在运行的虚拟机
virsh dumpxml vm-name      # 查看kvm虚拟机配置文件
virsh edit vm-name         # 修改虚拟机的配置文件
virsh start vm-name        # 启动kvm虚拟机
virsh shutdown vm-name     # 正常关机
virsh destroy vm-name      # 强制关闭虚拟机电源
virsh undefine vm-name     # 删除vm的配置文件
ls /etc/libvirt/qemu       # 查看配置文件删除结果
                             (磁盘文件不会被删除)
virsh define file-name.xml # 根据配置文件定义虚拟机
virsh suspend vm-name      # 挂起,终止
virsh resumed vm-name      # 恢复被挂起的虚拟机
virsh autostart vm-name    # 开机自启动vm

【配置NAT服务器的端口转发】

使用官方推荐的python脚本,利用libvirt的hook特性来实现当虚拟机开机关机时修改iptables端口规则

wget https://github.com/saschpe/libvirt-hook-qemu/archive/master.zip -O libvirt-hook-qemu-master.zip
unzip libvirt-hook-qemu-master.zip
cd libvirt-hook-qemu-master/
make install
mkdir -p /etc/libvirt/hooks
cp hooks hooks.schema.json /etc/libvirt/hooks
if [ ! -f /etc/libvirt/hooks/hooks.json ] ; then cp hooks.json /etc/libvirt/hooks ; fi
chmod +x /etc/libvirt/hooks/hooks
ln -s /etc/libvirt/hooks/hooks /etc/libvirt/hooks/qemu
ln -s /etc/libvirt/hooks/hooks /etc/libvirt/hooks/lxc

安装完成后重启libvirt,使脚本生效

systemctl restart libvirtd.service

编辑配置文件,修改端口

vi /etc/libvirt/hooks/hooks.json

{
    "default": {
        "private_ip": "192.168.122.11",
        "port_map": {
            "tcp": [
                 [33891, 3389]
            ]
        }
    }
}

修改完后保存,virsh重启虚拟机

virsh destory --domain default
virsh start --domain default

查看规则是否生效

iptables -t nat -L
MASQUERADE  tcp  --  172.16.0.20          172.16.0.20          tcp dpt:adobeserver-1