这篇文章记录一下如何在Kylin V10系统中用Qemu KVM安装一个CentOS系统。

Kylin 系统有点像是一个对CentOS进行国产化改造的Linux系统,加强了信息安全方面 的控制。在CentOS或是Ubuntu系统中,如果要装VM(Virtual Machine)的话,可以用软件 qemu-system-x86_64,但是在Kylin系统上的仓库中是找不到这个软件的,只能用 qemu-kvm。而网上关于qemu-kvm的信息很少,质量也不高,导致装的时候非常痛苦, 经过自己不断尝试,终于安装成功,下面讲一下安装的过程。

首先更新缓存:

$ yum update && yum clean all && yum makecache

然后安装虚拟机所需软件:

$ yum install libvirt* qemu* virt-manager -y

除此之外,还有一个软件tunctl需要安装,我们先创建 软件所在仓库的配置文件,这一步需要root权限:

# vim /etc/yum.repos.d/nux-misc.repo

[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

然后输入以下命令安装tunctl:

$ yum --enablerepo=nux-misc install tunctl

启动libvirtd服务

$ systemctl start libvirtd

查看libvirtd的状态:

$ systemctl status libvirtd

接下来开始配置网络,我们的计划是,先创建一个网桥br0,然后把它和 Host机器的eth3网卡连通,再为VM创建一个虚拟网卡tap0,把tap0和br0 连通,这样的话就可以让VM和Host以桥接的方式连接起来。具体操作如下:

$ virsh iface-bridge eth1 br1          # 将物理网卡eth1与br1连通,创建网桥配置文件ifcfg-br1,并启动网桥br1
$ ifconfig br1                         # 此时显示br1的IP地址 
$ ifdown eth1 && ifup eth1 && ifconfig eth1 #重启eth1网卡并查看eth1的信息,因为eth1已经与br1连通,br1已经有IP地址了,所以此时应该不显示IP地址
$ tunctl -t tap0 -u root               # 创建虚拟网卡tap0
$ brctl addif br0 tap0                 # 将创建的br0和tap0连通
$ ifconfig tap0 up                     # 让虚拟网卡tap0启动

如果要创建多台VM,那么网桥就不用创建了,只要为新的VM创建虚拟网卡,然后再将 虚拟网卡和网桥相连即可。比如我们还需要创建一台VM,那么对它的网络配置如下:

$ tunctl -t tap1 -u root
$ brctl addif br0 tap1
$ ifconfig tap1 up

如果网桥或网卡不需要了,可以通过下列命令删除:

$ ip link set dev br0 down             # 让网桥br0停止运行
$ brctl delbr br0                      # 删除网桥br0
$ brctl delif br0 tap0                 # 把tap0从网桥br0中删除
$ tunctl -d tap0                       # 删除tap0

网络配置好了之后,接下来我们来安装VM。 首先我们创建类型为qcow2的磁盘

$ mkdir /opt/kvm
$ qemu-img create -f qcow2 /opt/kvm/vm1.qcow2 5G  # 大小可以自己设置

然后我们检查磁盘是否创建成功

$ qemu-img info /opt/kvm/vm1.qcow2

接着我们用qemu-kvm 启动虚拟机并安装系统:

$ qemu-kvm -name vm1 \
-smp cpus=1 \
-m 1024 \
-cdrom /home/vms/iso/CentOS-7.0-1406-x86_64-DVD.iso \
-drive file=/opt/kvm/vm1.qcow2 \
-netdev bridge,id=tap0,br=br0,helper=/usr/libexec/qemu-bridge-helper

如果运行上述命令报错:

...
access denied by acl file
qemu-kvm: bridge helper failed
...

可以输入以下命令解决:

# 为当前用户创建新的qemu配置文件
$ echo "allow all" | sudo tee /etc/qemu/${USER}.conf
$ echo "include /etc/qemu/${USER}.conf" | sudo tee --append /etc/qemu/bridge.conf
$ sudo chown root:${USER} /etc/qemu/${USER}.conf
$ sudo chmod 640 /etc/qemu/${USER}.conf

然后,等待虚拟机安装完成。

虚拟机安装完成之后,把窗口关掉,为虚拟机设定mac地址:

$ qemu-kvm -name vm1 -smp cpus=8 -m 8192 -drive file=/opt/kvm/vm1.qcow2 -nic,ifname=tap0,script=no,downscript=no,mac=52:54:00:12:34:00 -daemonize

如果需要给虚拟机配置两个网卡tap0和tap1,那么在上述启动命令中再加一个-nic的参数即可,如:

$ qemu-kvm -name vm1 -smp cpus=8 -m 8192 -drive file=/opt/kvm/vm1.qcow2 -nic,ifname=tap0,script=no,downscript=no,mac=52:54:00:12:34:00 -nic,ifname=tap1,script=no,downscript=no,mac=52:54:00:12:34:01 -daemonize

启动之后,用root用户登录,编辑/etc/sysconfig/network-scripts/ifcfg-ens3:

# vi /etc/sysconfig/network-scripts/ifcfg-ens3

BOOTPROTO=static
ONBOOT=yes
IPADDR=30.30.30.202      # 设置虚拟机的IP地址,这里eth3的ip地址为30.30.30.201,所以我把虚拟机的IP地址设为30.30.30.202
DEFROUTE=yes
NETMASK=255.255.255.0
GATEWAY=0.0.0.0
TYPE=Ethernet
DEVICE=ens3
NAME=ens3
ZONE=public

上面的NETMASK 和GATEWAY与route table中br0保持一致。我们可以这样来查看Host机器的route table 中br0的设置:

$ route   # 打印route table
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 eth0
193.160.63.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
30.30.30.0      0.0.0.0         255.255.255.0   U     0      0        0 br0

上述最后一行就是br0的配置,所以我们就把ens3的NETMASK配置为255.255.255.0,GATEWAY 配置为0.0.0.0。

重启网络服务:

$ systemctl restart network

此时虚拟机就配置好网络了,然后我们可以ping eth3测试一下子:

$ ping 30.30.30.201

如果对上述安装过程有什么问题,可以参见KVM FAQ

以上。