0x01 前言

我在这里记录下我在家里服务器配置KVM的过程,好多信息我都是记录在笔记本里,现在转移到网站上以便查验。这篇文章可能会有多次修改,但每次修改我都会做出明确的标注。如果文章有哪些地方是错误的或者有改进的空间,请大家给我留言或通过电子邮件与我取得联系。当然,要是有问题我也欢迎你向我提出问题,让我们共同提升技术水平。

0x02 主机基本信息

其实我的服务器是在6个月前配置完成的,期间至今过几次升级而已,所以这次的配置过程实在一台虚拟机上进行,而虚拟机的CPU我通过使用 “–cpu host-passthrough” 这个参数让我服务器的CPU直接暴露给虚拟机使用。但在实际生产环境中,一般不会这样设置。

  • 系统版本:CentOS 7 Minimal
  • CPU:L5630 4核心 8线程
  • 内存:4GB
  • 硬盘:100GB

注意:这次配置过程使用的是一台虚拟机!

0x03 系统准备

0x03.1首先要检查硬件、系统是否支持KVM虚拟化:

[root@test1 ~]# lsmod | grep kvm
kvm_intel             148081  0 
kvm                   461126  1 kvm_intel

0x03.2关闭了以下预设的程序:

  1. firewalld
  2. selinux

0x03.3安装以下程序包:

yum install vim wget git htop iftop qemu-kvm libvirt virt-install bridge-utils qemu-img libvirt-python libvirt-client virt-viewer libtool automake mlocate qemu-system-x86.x86_64 libtool make automake mlocate openssl-devel pam-devel unzip gcc screen openssl openssl-devel iptables-services bash-completion* -y
已安装:
automake.noarch0:1.13.4-3.el7
bash-completion.noarch1:2.1-6.el7
bash-completion-extras.noarch1:2.1-8.el7
bridge-utils.x86_640:1.5-9.el7
gcc.x86_640:4.8.5-4.el7
git.x86_640:1.8.3.1-6.el7_2.1
htop.x86_640:2.0.1-1.el7
iftop.x86_640:1.0-0.7.pre4.el7
iptables-services.x86_640:1.4.21-16.el7
libtool.x86_640:2.4.2-21.el7_2
libvirt.x86_640:1.2.17-13.el7_2.4
libvirt-client.x86_640:1.2.17-13.el7_2.4
libvirt-python.x86_640:1.2.17-2.el7
mlocate.x86_640:0.26-5.el7
openssl-devel.x86_641:1.0.1e-51.el7_2.5
pam-devel.x86_640:1.1.8-12.el7_1.1
qemu-img.x86_6410:1.5.3-105.el7_2.4
qemu-kvm.x86_6410:1.5.3-105.el7_2.4
qemu-system-x86.x86_642:2.0.0-1.el7.6
screen.x86_640:4.1.0-0.23.20120314git3c2946.el7_2
unzip.x86_640:6.0-15.el7
vim-enhanced.x86_642:7.4.160-1.el7
virt-install.noarch0:1.2.1-8.el7
virt-viewer.x86_640:2.0-6.el7

具体的系统准备请移步至:新安装或新VPS所要做的前期准备(centos7) 查看。

0x03.4启动 libvirtd 与设置 libvirtd 开机启动

#立即启动libvirtd
systemctl start libvirtd 

#开机启动libvirtd
systemctl enable libvirtd

通过htop检查libvirtd的情况:

1465378953

0x04 网络配置

在这里我通过设置网桥的方式使得虚拟机直接与外部网络设备通讯,其中有一步会使网络断开,请确认你能通过VNC或外接显示器与服务器交互。

完成上面的设置,通过 ip addr 命令可以看到自己的网卡信息:

[root@test1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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:c4:40:bb brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.247/24 brd 10.1.1.255 scope global dynamic eth0
       valid_lft 3220sec preferred_lft 3220sec
    inet6 fe80::5054:ff:fec4:40bb/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 52:54:00:55:d1:e0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
    link/ether 52:54:00:55:d1:e0 brd ff:ff:ff:ff:ff:ff

而通过 virsh net-list –all 可以查看 libvirtd 预配置的网桥,通过 net-edit [network] 可以修改网桥:

[root@test1 ~]# virsh net-list --all
 名称               状态     自动开始  持久
----------------------------------------------------------
 default              活动     是           是


[root@test1 ~]# virsh net-edit default
<network>
  <name>default</name>
  <uuid>39fffd5c-5899-457e-945f-c120ddb2f515</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:55:d1:e0'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

其实使用 libvirtd 预配置的网桥也可以使虚拟机访问外网,可是我希望能通过外部的DHCP服务器给虚拟机分配IP和进行流量控制,所以我并没有使用 libvirtd 预配置的网桥而是自行配制。

0x04.1 添加网卡br0

其实并不一定要命名为br0,你可以根据需要自定义命名。

#建立bridge br0
nmcli c add type bridge autoconnect yes con-name br0 ifname br0

#分配IP,这里使用我DHCP服务器给这台服务器分配的IP地址,可以通过 ip addr 命令查看
nmcli c modify br0 ipv4.addresses 10.1.1.247/24 ipv4.method manual

#配置网关
nmcli c modify br0 ipv4.gateway 10.1.1.1

#配置dns,这里设置为我的bind服务器,请根据你的实际情况设置,或者使用114公共DNS
nmcli c modify br0 ipv4.dns 10.1.1.2

完成上面的命令后,你可以查看新添加网桥 br0 的具体信息:

[root@test1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0 		#物理设备名称
STP=yes 		#生成树协议
TYPE=Bridge 	#桥接模式
BOOTPROTO=none	#地址协议
DEFROUTE=yes	#默认路由
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes 	#若不需要IPv6可设置为no
IPV6_DEFROUTE=yes 	#若不需要IPv6可设置为no
IPV6_FAILURE_FATAL=no 	#
NAME=br0 		#网桥名称
UUID=b9a1378e-e787-40ac-b6ee-a22fdb92a1e4 	#唯一识别码
ONBOOT=yes 		#开机启动
BRIDGING_OPTS=priority=32768 	#
IPADDR=10.1.1.247 	#IP地址
PREFIX=24 			#电子掩码
GATEWAY=10.1.1.1 	#网关
DNS1=10.1.1.2 		#DNS
IPV6_PEERDNS=yes 	#
IPV6_PEERROUTES=yes	#

0x04.2 删除系统的物理网卡配置信息

请注意!这一步将使服务器的网络断开,你将无法通过SSH或其他基于网络的方式与服务器进行交互。请使用VNC或者其他方式与服务器进行后续交互。因为我现在这台服务器其实是一台虚拟机,所以我可以通过宿主机的 console 连接上这台虚拟机。

请通过 ip addr 命令确认网卡名字,我的是 eth0,可以从之前的步骤查看我的网卡信息。通过 nmcli c delete eth0 命令删除现有网卡:

[root@test1 ~]# nmcli c delete eth0
Connection 'eth0' (df7adbe9-72f3-4891-99eb-a3c30eea2820) successfully deleted.

0x04.3 通过网桥 br0 添加网卡 eth0

添加网卡 eth0 并将其设置为 slave 模式并重启 NetworkManager:

[root@test1 ~]# nmcli c add type bridge-slave autoconnect yes con-name eth0 ifname eth0 master br0
Connection 'eth0' (71b13e84-18d3-4cdf-91ab-b348c0f3d081) successfully added.

[root@test1 ~]# systemctl restart network

完成后请检查网络是否恢复正常。

MacBook-Air:~ terence$ ping 10.1.1.247
PING 10.1.1.247 (10.1.1.247): 56 data bytes
64 bytes from 10.1.1.247: icmp_seq=0 ttl=62 time=7.204 ms
64 bytes from 10.1.1.247: icmp_seq=1 ttl=62 time=3.386 ms
64 bytes from 10.1.1.247: icmp_seq=2 ttl=62 time=2.613 ms
^C
--- 10.1.1.247 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 2.613/4.401/7.204/2.007 ms

0x05 结语

这样就完成啦,如果并不是应用于生产环境,这已经可以通过 virt-install 配置你的第一台基于KVM的虚拟机。

以下这里是我安装 centos7 和 windows7 的命令:

Centos7:
virt-install --name test-1 --memory 4096 --vcpus sockets=1,cores=4,threads=2 --location=/usr/local/kvm/iso/CentOS-7-x86_64-Minimal-1503-01.iso --disk path=/usr/local/kvm/images/test-1.img,size=100,bus=virtio --network bridge=br0,model=virtio --os-type linux --os-variant rhel7 --graphics none --console pty,target_type=serial --extra-args 'console=ttyS0,115200n8 serial' --accelerate --hvm --cpu host-passthrough

Windows7:
virt-install --name win7 --memory 8192 --vcpus sockets=1,cores=8,threads=1 --disk device=cdrom,path=/usr/local/kvm/iso/win7.iso --disk device=cdrom,path=/usr/share/virtio-win/virtio-win.iso --disk path=/usr/local/kvm/images/win7.img,size=100,bus=virtio --network bridge=br0,model=virtio --noautoconsole --os-type windows --os-variant win7 --accelerate --hvm --graphics vnc,password=[your VNC password here],listen=0.0.0.0,port=[your VNC port here] --cpu host-passthrough --video cirrus

请注意!在安装之前你需要将系统镜像存放于 /usr/local/kvm/iso 目录下,并且建立 /usr/local/kvm/images 目录。这两个目录并不存在,需要通过以下命令创建:

mkdir -p /usr/local/kvm/iso #存放系统安装镜像的位置
mkdir /usr/local/kvm/images #存放虚拟机磁盘的位置

而以上位置可以根据你的实际情况自行选择位置,但安装命令也要进行对应的修改。

好啦,有任何问题请给我留言吧。过几天我再写安装centos7和windows7的文章。