libvirt为OpenStack Nova Folsom版带来的变化
XML 配置第一个变化就是Nova生成libvirt XML配置文件方式的改变。之前的Nova版本使用Cheetah模板引擎生成XML配置文件。这样做的问题是需要很多的信息作为参数传递给模板,Nova在内部为libvirt来宾(guest)采用一种特殊配置格式,进而用模板翻译成合适的来宾配置,但是所生成的结果代码却很难维护且不易理解,原因是XML的逻辑结构被分散在模板文件和libvirt驱动代码中,缺乏一致性结构。因此NOva的第一个大改变就是libvirt驱动(driver)在Folsom中引入一套形式化的Python配置对象集合表示libvirt XML的配置。libvirt驱动代码现在可以用必要的参数直接填充这些配置对象,然后简单地序列化对象到XML中,这样Cheetah就完全可以被淘汰掉,因而代码结构也变得明晰起来,这里有一个更详细的wiki页面。CPU模型配置
移除Cheetah 模板最主要的负面影响就是管理员部署Nova不能方便地改变libvirt来宾的XML,个人认为这是件好事,因为这种随意的改变意味着Nova的功能的推进将受到阻碍。但是很多人并不同意这个观点,显然他们就是用libvirt XML配置指定来宾 CPU 模型。如果在来宾配置中没有明确要求指定CPU模型,KVM 将用一个通用的、最普通标准模型,可以适用于任何地方的通用模型。可以预见的是,这种通用CPU模型没法为来宾提供最佳性能。例如:如果你的主机一个新的CPU内嵌有AES加密指令,但是这种模型并不能充分利用此特性,因此这就是第二个改变,在Nova 的libvirt驱动中引入了显示支持CPU模型的配置。这里涉及到两个新的Nova配置参数,libvirt_cpu_mode 可以在”host-model“ 和”host-passthrough“以及”custom“之间选择。如果模型设置为“custom",那么可选参数libvirt_cpu_model就可以用于指定自定义的CPU的名字,详细介绍在这里。
选择CPU模型的功能被合并进来后,同样默认配置也会发生改变,所以如果Nova选用KVM作为hypervisor的话,那么它默认将使用”host-model" CPU 模型。这将导致来宾CPU模型几乎是主机CPU模型的一个精确副本,为来宾系统提供最大性能。然后这种内嵌的KVM会给选择带来一点点不爽,理由在libvirt和KVM的结合问题上,因为内嵌KVM,使用“host-model”会失败。因此使用内嵌kvm都需要设置libvirt_cpu_model="none"作为应对措施。如果你在裸金属设备上使用KVM,任何事情看起来都很美好,这当然是在正常情况下生产部署。
时钟协调策略
同样回到性能的主题,libvirt Nova 驱动为KVM来宾更新设置时间协调策略。在x86平台上虚拟机有多种可用时钟,包括PIT、RTC、PM-Timer、HPET。全虚拟化平台中可靠的时钟是有待解决的最大困难之一,KVM也不例外,问题都归结于当hypervisor在正确的时间里不能注入时钟中断时该干什么?因为不同来宾正在运行。不过有一些策略是可用的,尽可能快的插入错失的标记,合并所有错失标记为1然后尽可能快地交付。临时性的注入缺失标记比平常更高的速度去追赶,或者简单地彻底取消错失标记。证明windows7 对时钟特别敏感,对于错失标记默认的KVM策略常常导致死机。 老式Linux来宾机会有严重的时间漂移。oVirt 项目组的研究验证发现了一组最佳的策略,使得绝大多数来宾处在比较满意的状态。libvirt Nova驱动进行了更新,当使用的是KVM时,该驱动用PIT和RTC为时钟协调制定了明确的策略。这将使得一切和时间相关的任务更可靠。Libvirt 认证
libvirtd进程可以用不同的认证scheme配置。直接使用PolicyKit认证客户端,因此在Fedora/RHEL/EPE中Nova包(package)包括一个polickit配置文件,该文件授予Nova连接libvirt。管理员可能决定使用不同的配置scheme,例如SASL,如果选择的scheme需要用户名和密码,那就没有办法为Nova的libvirt驱动提供这些认证信任。幸运的是,libvirt客户端可以在本地文件中查找信任关系。不幸的是Nova连接libvirt的方法不能工作。因此Nova libvirt 驱动使用修复的openAuth()允许默认的信任查寻逻辑。现在在Nova和libvirt之间获取认证成为可能:
# augtool -s set /files/etc/libvirt/libvirtd.conf/auth_unix_rw sasl
Saved 1 file(s)
# saslpasswd -a libvirt nova
Password: XYZ
Again (for verification): XYZ
# su – nova -s /bin/sh
$ mkdir -p $HOME/.config/libvirt
$ cat > $HOME/.config/libvirt/auth.conf
页:
[1]