Overview
很多新的开源库对kernel的要求是3.0+,对gcc的要求是4.8+,但是我的开发机用的是旧版本的CentOS 6,升级kernel和gcc比较麻烦,因此在由于要不要一步到位升级成CentOS 7。CentOS 7修改了一些系统管理方面的应用,由于不太熟悉,所以不大想升级。正好后面考虑自己搞个小集群玩玩,于是准备研究一下虚拟化技术。
系统选型方面由于没装X,放弃了比较常见的virtualbox和vmware等老牌虚拟机技术。主要考虑两个,一个是老牌企业级虚拟化技术Xen和Linux本身主推的KVM技术。
最终选定的是KVM,主要原因是,Xen被收购之后和RedHat的使用免费服务收费模式一样,尽管Xen历史更久更成熟,还是放弃了Xen。而且Xen本身被踢出了CentOS 6的默认安装,并且采用编译内核的方式,侵入性太高。而KVM是Linux主推的技术,本身集成性已经比较好了,而且安装也比Xen方便一些,所以简单起见,还是选择了KVM。
系统环境配置
网络拓扑
网络的话,虚拟机桥连宿主机网卡和路由器相连,这样可以实现从工作地方便访问虚拟机的目的,互联也方便。
安装KVM
确认cpu支持
理论上现代的intel服务器cpu都支持KVM,特别是x86_64架构的cpu。需要确认一下cpu是否有vmx指令集,AMD信仰系列的话叫svm:
[root@DannyGreen ~]# grep vmx /proc/cpuinfo
通过yum安装KVM
[root@DannyGreen ~]# yum install -y kvm virt-* libvirts bridge-utils qemu-img
加载kernel模块
[root@DannyGreen ~]# modprobe kvm-intel
重启并确认内存模块加载
[root@DannyGreen ~]# reboot
[root@DannyGreen ~]# lsmod | grep kvm
kvm_intel 55624 0
kvm 341551 1 kvm_intel
配置网络
[root@DannyGreen ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
HWADDR=78:e3:b5:08:82:54
TYPE=Bridge
UUID=fcf1edd7-40a6-429a-aa33-32eae87a480a
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.199.14
NETMASK=255.255.255.0
GATEWAY=192.168.199.1
DNS1=192.168.199.1
IPV6INIT=no
USERCTL=no
[root@DannyGreen ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=78:e3:b5:08:82:54
TYPE=Ethernet
UUID=fcf1edd7-40a6-429a-aa33-32eae87a480a
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
BRIDGE=br0
IPV6INIT=no
USERCTL=no
[root@DannyGreen ~]# service network restart
至此,KVM宿主机的系统环境就部署好了。
安装xterm
在纯命令行创建虚拟机时,出不来安装界面,错误提示:
cpu0 disabled perfctr wrmsr: 0xc1 data 0xffff
网上信息比较少,也不知道在说啥,只有一个比较靠谱,大概问题就是要想用libvirtd,必须得有x环境才行。我在windows上得装一个Xming,然后ssh客户端(xshell)开启x11转发,用xterm才看到安装界面。用xterm安装时终于见到了安装界面,其实上面那段提示一点关系都没有,主要问题就是纯文本模式显示不出来……
# 不确定是否需要安装x window,因为之前打算装gnome了,结果只要xterm就搞定了
[root@DannyGreen ~]# yum groupinstall -y 'X Window System'
[root@DannyGreen ~]# yum install -y xterm
update: MacOS下可以用XQuartz来启动xterm。在XQuartz的terminal里直接输入ssh -Y [host]
就可以登录了。
创建虚拟机
创建虚拟机的磁盘
由于我/home分区的磁盘空间最大,所以我的镜像主要放在/home/kvmdisk/
下。
[root@DannyGreen ~]# qemu-img create -f qcow2 -o preallocation=metadata /home/kvmdisk/centos7.img 50G
创建虚拟机
[root@DannyGreen ~]# virt-install --name=centos7 --ram 4096 --vcpus=4 -f /home/kvmdisk/centos7.img --cdrom=/home/kvmdisk/CentOS-7-x86_64-Minimal-1503-01.iso --arch=x86_64 --os-type=linux --bridge=br0
执行命令之后会启动virt-manager
进行安装,注意这里一定要X环境才能看得见……之后就和正常安装系统一样,网络配置方法和真机差不多。
管理虚拟机
- 开机
virsh start [name]
- 关机
virsh shutdown [name]
- 强制关闭
virsh destroy [name]
- 查看全部虚拟机
virsh list --all
- 删除虚拟机
virsh undefine [name]
- 修改虚拟机配置
virsh edit [name]
克隆虚拟机
在原始虚拟机关闭的情况下,就可以克隆虚拟机了:
virt-clone --original=datanode0 --name=datanode1 --file=/home/kvmdisk/datanode1.img
克隆好虚拟机之后因为是完全克隆的,所以网卡配置啥的是和源机器一样,所以还得改一下,这里用virsh console登陆之后,首先打开文件/etc/udev/rules.d/70-persistent-net.rules
,这里有两个eth0的MAC地址,一般第一个是源机器的,删了就行,然后修改/etc/sysconfig/network-scripts/ifcfg-eth0
,将MAC改成另外一个,这个也可以通过virsh edit [name]
查询到,UUID不知道不改行不行,反正顺手改了吧,然后重启虚拟机,网卡就能用了。
看到网上文章说直接cp镜像文件,然后添加一个xml配置也能克隆虚拟机,但是我试过是不行的,镜像文件是个空洞文件,拷贝完实际大小和原始不一样,也不清楚是为什么。虽然执行virt-clone时间很久,我250G的镜像要克隆1小时多,但好歹能用……