本文介绍的是如何在Hyper-V虚机上安装Red Hat Enterprise Linux Server(RHEL),以X64位RHEL 5.1版本为例。

其实,严格意义上来说,Hyper-V也属于Para-Virtualization(部分虚拟化)的范畴,只不过微软有专门的术语叫做Enlightenment。

所谓Linux的Hyper-V支持,关键是要让Linux成为Enlightened OS,也就是说要理解底层Hypervisor的存在。这需要在Linux虚机里启用xen的内核支持,并安装对应的Hypercall适配器。

为什么要安装Hypercall适配器(Adaptor)?原因是Linux里没有Windows中的WinHv组件,无法把应用程序的常规调用转化成Hypervisor能够理解的Hypercall调用。Hypercall适配器是一个很薄的软件层,以便把来自Linux内核的基于xen的虚拟化函数调用,翻译成Hyper-V能够理解的Hypercall函数调用。这样Linux虚机就可以充分利用Hyper-V的高速内存总线VMBus所带来的性能极大提升,从而极大地改进性能。

而这需要专门的Linux IC,并且可能需要重新编译Linux内核,就目前来说(2009年5月7日),SUSE的安装最简单,不需要内核的重新编译。Red Hat相对复杂些,需要对内核进行编译,这比较消耗时间。

这里补充orpheus兄弟的提问

微软的Hyper-V层目前还没给linux提供直接调用的接口,可以这么理解吧?相对而言,VMware的ESX Server是不是做的更好呢?

盆盆的回答如下

微软和主要Linux厂商,包括Novell和Red Hat签署了互操作协议,两者之间可以兼容。而且微软和Citrix之间也有互协作关系,确保Xen和Hyper-V在更深层面的兼容性。所以不用担心Linux在Hyper-V上的表现。还有些Linux发行版本,虽然微软没有提供官方技术支持,但是实际上也可以顺利安装。VMware采用完全不同的架构,其内部架构对上层的虚机来说是不可见的,并不是采用Hyper-V/Xen那样的Para-Virtualization架构。曾经有高手做过比喻:VMware是一个浑身包裹着印度纱丽的美女,只能远远看到其绰约的身姿;而Xen则是穿着三点式的美女,能让您看到更多…当然,也不能完全这样进行区分,其实VMware也有Para-Virtualization的实现,大家都并存多种虚拟化手段,不能简单地说孰优孰劣。

本文的实验分为四个步骤,为了防止中间的误操作,推荐每个步骤都用Hyper-V的快照功能新建一个快照,以便一旦出错,可以快速回复到先前的状态。对于生产系统,在最后成功以后,请确保删除所有的快照,以便Linux虚机工作在最佳状态下。

本文本非完全由盆盆所原创,其中大多数的实验步骤和脚本、或者相关命令参考自国外的博文,该博文原链接如下:(如果您要转载,请确保加上这句话)

http://www.jules.fm/Logbook/files/win2008_linuxic_rc2_rhel.html

一、准备工作

1. 确认Linux系统的版本

如果还没有安装,可以查看其安装光盘映像名称,如果是X64位,应该是类似如下形式:

rhel-5.1-server-x86_64-dvd

如果是32位,则应该是类似如下形式:

rhel-5.1-server-i386-dvd

如果已经安装,则可以运行以下命令:

uname -a

如果结果是“…x86_64 x86_64 x86_64 GNU/Linux”,则表示是X64位版本。

提示

本文中所涉及的所有命令或者语句,均可以直接复制,然后在Hyper-V虚机中单击剪贴板、输入剪贴板文本,即可快捷方便地输入文本内容。

2. 订阅在线更新服务
必须订阅其RHN软件在线更新服务,否则在编译内核时会报错(对于X64位来说)。

订阅的方式有两种:

一种是购买Red Hat提供的收费服务,其报价可以参考以下网页:

https://www.redhat.com/wapps/store/catalog.html

另一种是申请临时服务,这是免费的,可以到以下网站申请(需要事先注册一个账户):

https://www.redhat.com/rhel/details/eval/

设置好以后,在Linux中单击应用程序、系统工具、软件包更新工具,按照屏幕提示输入所注册的用户名和密码,即可。

3. 下载Linux IC

   对于Linux版本,必须安装专门的IC,而不能直接在Hyper-V虚机里单击操作、插入集成服务安装盘来进行安装。

我们可以访问以下网站,以便下载Linux版本的IC,并解压缩,即可获得ISO映像文件。

http://connect.microsoft.com
4. 安装Linux

打开Hyper-V管理器,新建一个虚机,处理器选择一个(Linux仅支持一个CPU)、内存可以是1GB。除了默认配置外,请确保添加一块旧版网络适配器,以及SCSI虚拟硬盘。添加旧版网络适配器非常重要(必须连接到外部网络,以便可以访问互联网),因为在安装Linux IC以前,我们没有办法使用支持VMBus的网卡来下载必须的软件更新。

在安装Linux时,注意请不要安装Red Hat自带的Virtualization组件。盆盆在测试RHEL 5.2/5.3时,导致虚机无法正常引导,尚未确认是否由于安装了其自带的Virtualization组件所导致,如果有哪位老大知道,还请不吝赐教。

还有一点,请确保安装所有必须的开发工具和组件,盆盆是安装了看上去和开发有关的所有组件:)。

安装好以后,在Hyper-V虚机里挂载从connect.microsoft.com上安装的Linux IC光盘映像文件。然后将光盘里的所有文件全部复制到/opt/linux_ic目录下。

5.

下载内核源码安装包

首先运行以下命令,获取当前的内核版本号:
rpm -q kernel

盆盆的RHEL 5.1版本,其内核版本号为“kernel-2.6.18-53.el5”,所以其对应的内核源码安装包为kernel-2.6.18-53.el5.src.rpm。我们可以到以下地址去下载:

ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/kernel-2.6.18-53.el5.src.rpm红体字部分请用正确的版本号替代

下载好以后,也可以复制到/opt目录下。

然后运行以下命令,以便安装编译内核所需的组件:

yum install redhat-rpm-config gcc rpm-build make gnupg

接下来的步骤,对于X64位的RHEL来说很重要,我们必须安装unifdef组件,否则在编译内核时,会提示"unifdef is needed by kernel****"的错误信息:

yum install unifdef

在运行yum时,如果提示RHN未激活之类的报错信息,请参考本文前面的“2. 订阅在线更新服务”部分进行设置。

然后就可以安装所下载的内核源码包了。首先进入内核源码包的保存位置,然后开始安装:

cd /opt

rpm -ivh kernel-*.src.rpm

二、编译内核

安装好所下载的内核源码包,可以用文本编辑器打开“/usr/src/redhat/SPECS/kernel-2.6.spec”文件

确保在“build%”语句前插入以下的语句:

对于64位RHEL,应该插入以下语句:

patch -p1 -d ../linux-%{kversion}.%{_target_cpu} < /opt/linux_ic/patch/x2v-x64-rhel.patch

如果是32位RHEL,则应该插入以下语句:

patch -p1 -d ../linux-%{kversion}.%{_target_cpu} < /opt/linux_ic/patch/x2v-x32-rhel.patch

同时在该文本文件里搜索定义“%define with_xen”的行,确保将该行的定义值从0改为1,这样就可以编译带xen支持的Linux内核,否则将无法支持Hyper-V的VMBus架构:

%define with_xen 1

然后输入以下命令,进入该文件所在的路径,并开始编译:

cd /usr/src/redhat/SPECS

rpmbuild -ba kernel-2.6.spec

如果是32位RHEL,应该输入以下命令:

rpmbuild -ba --target i686 kernel-2.6.spec

编译的时间相当长,估计大概要6~8个小时!(笔者是晚上睡前开始编译的,第二天一早已经编译完毕),毕竟在虚机里编译,在没有安装Linux IC前,这个表现是正常的。

三、安装内核

内核编译完毕,就可以开始安装了。

对于X64位系统,可以运行以下命令:

cd /usr/src/redhat/RPMS/x86_64

rpm -ivh kernel-xen-2*rpm

rpm -Uvh kernel-xen-devel-2*rpm

对于32位系统,可以运行以下命令:

cd /usr/src/redhat/RPMS/i686

rpm -ivh kernel-xen-2*rpm

rpm -Uvh kernel-xen-devel-2*rpm

然后运行以下命令,以便在Linux中添加相应的Hypercall适配器(x2v适配器,应该就是xen to Hyper-V的缩写吧):

cd /opt/linux_ic

perl setup.pl x2v /boot/grub/grub.conf

然后检查Red Hat的引导配置文件“/boot/grub/grub.conf”,应该类似下图所示。

    注意如果是32位系统,则“kernel”一行应该是“kernel /x2v-pae.gz”,注意必须是“pae”(物理地址扩展)而不是“32”。

然后重启Linux虚机。


四、安装驱动

   在Linux虚机里,微软所提供的Linux IC一共包含三个驱动,VMBus总线、网络和磁盘子系统。在安装驱动前,首先要修复到“/lib/modules”的链接:

cd /lib/modules/`uname -r`

ln -nsf /usr/src/kernels/`uname -r`-`arch` build

接下来的驱动安装和SUSE没有什么区别,运行以下命令即可:

/opt/linux_ic/setup.pl drivers

重启Linux虚机以后,应该可以正常运行,并且所有的Synthetic组件都能够正常工作,包括网络和磁盘子系统。