KVM安装部署

摘要

KVM虚拟化环境搭建准备

  • 如果是在线上服务器安装应最小化安装系统;
  • 如果需要图形界面管理,可以安装X Window以及vnc进行远程管理;
  • 如果嫌麻烦,或者是在自己的虚拟机安装,可以直接装桌面;
  • 安装图形是为了管理简单,kvm完全可以命令行管理;
  • 需要服务器BIOS开启(Virtual Technolege)VT (Virtualization Tech [Enabled] );
  • 如果是vmware虚拟机,需要在cpu内存选项中的高级设置开启VT-x支持(默认不开启);
  • 本文暂时以最小化安装的Centos7系统进行部署,后续可能会增加Centos6系统的安装,其实大同小异。

kvm安装部署

确认环境

  • 确认服务器有VT(Virtual Technolege);
  • KVM需要有CPU的支持(Intel vmx或AMD svm),;
  • 在安装KVM之前, 需要检查CPU是否提供了虚拟技术的支持;
  • 确保BIOS支持kvm
1
2
3
4
5
6
7
egrep '^flags.*(vmx|svm)' /proc/cpuinfo
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 ida 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

lsmod| grep kvm kvm_intel             170181  0 kvm                   554609  1 kvm_intel irqbypass              13503  1 kvm

# kvm: 作为核心模块, 协同QEMU实现整个虚拟环境的正常运行.
# kvm_intel: 作为平台(Intel)独立模块, 激活KVM环境的CPU硬件虚拟化支持.

环境部署

1
2
3
4
5
6
7
# 关闭selinux
setenforce 0
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config

# 停用防火墙
systemctl disable firewalld.service
systemctl stop firewalld.service

安装kvm

1
2
3
4
5
6
7
8
9
10
11
yum install qemu-kvm libvirt virt-install virt-manager -y

# qemu-kvm: 主要包含KVM内核模块和基于KVM重构后的QEMU模拟器. KVM模块作为整个虚拟化环境的核心工作在系统空间, 负责CPU和内存的调度. QEMU作为模拟器工作在用户空间, 负责虚拟机I/O模拟.
# 依赖包 quemu-img:  主要用来QEMU磁盘镜像的管理, 如新建一块磁盘镜像给虚拟机.
# libvirt: 提供Hypervisor和虚拟机管理的API.
# 依赖包 libvirt-client: KVM客户端命令行管理工具virsh, 负责虚拟机的启动、停止和管理等.
# libvirt-daemon: libvirtd守护进, 作为客户端管理工具跟Hypervisor和虚拟机之间的桥梁.
# libvirt-daemon-driver-xxx: 从名字来看属于libvirtd服务的驱动文件, 作为libvirtd服务跟Hypervisor不同对象(如qemu模拟器、网络、存储等)间的接口.
# bridge-utils: 网桥管理工具包, 负责桥接网络的创建、配置和管理等工作.
# virt-install: 创建和克隆虚拟机的命令行工具包.
# virt-manager: 图形界面的KVM管理工具.

启动服务并设置开机自启

1
2
3
4
5
# 设置KVM开机启动
systemctl enable libvirtd

# 启动KVM服务
systemctl start libvirtd

后续配置

配置桥接模式

默认情况下, 所有虚拟机都只能在hosts内部互相通信, 如果需要通过局域网访问虚拟机, 需要创建一个桥接模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 拷贝网卡配置文件 
cp /etc/sysconfig/network-scripts/ifcfg-em1 /etc/sysconfig/network-scripts/ifcfg-br0
# 修改的网卡以及桥接网卡的配置文件内容如下
vim /etc/sysconfig/network-scripts/ifcfg-em1
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
NAME=em1
DEVICE=em1
BRIDGE=br0
NM_CONTROLLED=no
NM_CONTROLLED

# NM_CONTROLLED参数表示该网卡是否被NetworkManager服务管理, 设置为no的话就是不接管.
vim /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
NAME=br0
DEVICE=br0
IPADDR=192.168.0.11
NETMASK=255.255.255.0
GATEWAY=192.168.0.254

# 注意: 桥接网卡br0中的DEVICE的名字一定要与以太网卡em1中BRIDGE对应.
# 配置文件中大小写极其敏感, 所以请遵守上述配置.

开启IP转发

1
2
3
4
5
6
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p
``` ### 重启网络服务     ``` bash
service network restart

验证桥接模式生效

1
2
3
4
# ip a 
em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state U P qlen 1000 
    link/ether 14:18:77:54:f5:73 brd ff:ff:ff:ff:ff:ff 
    inet6 fe80::1618:77ff: fe54:f573/64 scope link 
       valid_lft forever preferred_lft forever 
br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 
    link/ether 14:18:77:54:f5:73 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.0.11/24 brd 192.168.0.255 scope global br0 
       valid_lft forever preferred_lft forever 
    inet6 fe80::1618:77ff: fe54:f573/64 scope link 
       valid_lft forever preferred_lft forever 

# brctl show 
bridge name     bridge id               STP enabled     interfaces 
br0             8000. 14187754f573       no              em1 
virbr0          8000.525400899785       yes             virbr0-nic 
# 如果想让br0的"STP enabled"也显示为yes的话, 可以在br0网卡配置文件最后增加一行: STP=yes 
# 这个命令是查看已有桥接, 错误桥接为: 
bridge name     bridge id               STP enabled     interfaces 
br0             8000. 000000000000       no              em1 
```

# 安装VNC服务
## 桌面环境搭建
``` bash yum -y groupinstall "X Window System"
yum -y groupinstall "GNOME Desktop" "Graphical Administration Tools"

安装VNC服务

yum -y install tigervnc-server
# VNC启动后生成的log日志以及pid默认存放在: /root/.vnc/下 

拷贝VNC将要启动的窗口, 并使用的配置文件

` bash
cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service

@:后面的1可以变为VNC client想要连接的窗口号, VNC端口号为: 5900+窗口号

netstat -ntlp | grep vnc
tcp 0 0 0.0.0.0:5901 0.0.0.0: LISTEN 4026/Xvnc
tcp 0 0 0.0.0.0:6001 0.0.0.0:
LISTEN 4026/Xvnc
tcp 0 0 0.0.0.0:5801 0.0.0.0: LISTEN 4026/Xvnc
tcp6 0 0 :::5901 :::
LISTEN 4026/Xvnc
tcp6 0 0 :::6001 ::: LISTEN 4026/Xvnc
tcp6 0 0 :::5801 :::
LISTEN 4026/Xvnc
ps -ef | grep vnc
root 4026 1 0 11:42 ? 00:00:00 /usr/bin/Xvnc :1 -desktop localhost.localdomain:1 (root) -httpd /usr/share/vnc/classes -auth / root/.Xauthority -geometry 1024x768 -rfbwait 30000 -rfbauth /root/.vnc/passwd -rfbport 5901 -fp catalogue:/etc/X11/fontpath.d -pn
root 4037 1 0 11:42 ? 00:00:00 /usr/bin/vncconfig -iconic
root 6640 2864 0 12:20 pts/0 00:00:00 grep –color=auto vnc

1
2
3
4

## 更改VNC配置文件 

``` bash
vim /etc/systemd/system/vncserver@:1.service #将如下两行命令: ExecStart=/usr/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i" PIDFile=/home/<USER>/.vnc/%H%i.pid #替换为: ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i" PIDFile=/root/.vnc/%H%i.pid

设置VNC登录密码

` bash
vncpasswd

如果启动方式不是root;

可以在配置文件-l后面的更改为对应的用户

然后vncpasswd 后面跟用户名, 设置该用户的密码(类似系统创建用户passwd XXXX)

1

## 设置VNC服务开机启动并启动服务

``` bash
systemctl enable vncserver@:1.service 

systemctl start vncserver@:1.service

检查VNC服务是否启动成功

1
2
netstat -ntlp | grep vnc 
	tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      4026/Xvnc 
	tcp        0      0 0.0.0.0:6001            0.0.0.0:*               LISTEN      4026/Xvnc 
	tcp        0      0 0.0.0.0:5801            0.0.0.0:*               LISTEN      4026/Xvnc 
	tcp6       0      0 :::5901                 :::*                    LISTEN      4026/Xvnc 
	tcp6       0      0 :::6001                 :::*                    LISTEN      4026/Xvnc 
	tcp6       0      0 :::5801                 :::*                    LISTEN      4026/Xvnc 
      
ps -ef | grep vnc 
	root       4026      1  0 11:42 ?        00:00:00 /usr/bin/Xvnc :1 -desktop localhost.localdomain:1 (root) -httpd /usr/share/vnc/classes -auth /root/.Xauthority -geometry 1024x768 -rfbwait 30000 -rfbauth /root/.vnc/passwd -rfbport 5901 -fp catalogue:/etc/X11/fontpath.d -pn 
	root       4037      1  0 11:42 ?        00:00:00 /usr/bin/vncconfig -iconic 
	root       6640   2864  0 12:20 pts/0    00:00:00 grep --color=auto vnc 

# 下载Realvnc viewer输入VNC服务器的IP以及窗口号 
```

# KVM模版制作与使用

``` bash
# 用KVM创建一台虚拟机作为模版, 安装完系统后, 删除网卡的rule, 并关机. rm -rf /etc/udev/rules.d/70-persistent-net.rules

KVM目录位置介绍:

  • 镜像位置: /opt/disk
  • ISO位置: /opt/images
  • KVM虚拟机xml文件生成位置: /etc/libvirt/qemu/
  • KVM脚本存放目录: /opt/scripts
    ` bash

    kvm_template_install.sh

    #!/bin/bash

    Version: 1.0

    Author: zsm

    Describe: 当KVM手动创建一台虚拟机作为标准后, 可用此脚本把该虚拟机作为模版进行虚拟机创建.

    DISK_DIR=”/opt/disk”
    images_dir=”/opt/images”
    QEMU_DIR=”/etc/libvirt/qemu”
    COPY_HOST=$1
    CREATE_HOST=$2
    if [ -f $QEMU_DIR/${CREATE_HOST}.xml ]; then
    echo “The CREATE_HOST NAME xml is exits!!! Please rename the CREATE_HOST xml”
    else
    if [ -f $DISK_DIR/${CREATE_HOST}.qcow2 ]; then
    echo "The CREATE_HOST NAME disk is exits!!! Please rename the CREATE_HOST disk"
    
    else
    ####create disk image 通过模板,创建磁盘,并修改名字
    qemu-img convert -c -O qcow2 $DISK_DIR/${COPY_HOST}.qcow2 $DISK_DIR/${CREATE_HOST}.qcow2
    ####拷贝模板xml, 修改主机名, 以及磁盘文件名
    cp $QEMU_DIR/${COPY_HOST}.xml $QEMU_DIR/${CREATE_HOST}.xml
    sed -i "s/$COPY_HOST/$CREATE_HOST/g" $QEMU_DIR/${CREATE_HOST}.xml
    ####修改xml文件磁盘UUID
    UUID=`uuidgen`
    sed -i "s/<uuid>.*<\/uuid>/<uuid>$UUID<\/uuid>/g" $QEMU_DIR/${CREATE_HOST}.xml
    ####修改xml 文件mac地址
    MAC=`echo -n 52:54:00; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 ":%02X"'`
    sed -i "s/<mac address='.*'\/>/<mac address=\'$MAC\'\/>/g" $QEMU_DIR/${CREATE_HOST}.xml
    ####define virsh 定义此虚拟机
    virsh define $QEMU_DIR/${CREATE_HOST}.xml
    ####启动虚拟机
    virsh start $CREATE_HOST
    echo "It's OK!!!!"
    
    fi
    fi
1
2
3
4
5

# 命令行创建虚拟机命令

``` bash
virt-install --name vm01 --boot network,cdrom,menu=on --ram 1024 --vcpus=1 --os-variant=rhel6 --accelerate --cdrom=/opt/iso/CentOS-6.4-x86_64-bin-DVD1.iso --disk path=/opt/kvmimg/vm01.img,size=5,bus=virtio --bridge=br0,model=virtio --autostart --vnc --vncport=5900 --vnclisten=0.0.0.0

物理机安装Dell硬件监控套件

1
DELL 宿主机 openmanager 安装 
wget -q -O - http://linux.dell.com/repo/hardware/Linux_Repository_15.07.00/bootstrap.cgi | bash
yum install -y srvadmin-all
/opt/dell/srvadmin/sbin/srvadmin-services.sh restart