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关闭了以下预设的程序:
- firewalld
- 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的情况:
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的文章。