|
最近更新日期:2008/09/09
我们常常讲,最好将不同的服务器搭建在不同的主机硬体上面,也就是说,每部主机所负责的任务越简单越好,
如此一来不但可以减少主机 debug 的时程,也能够简化安装与设计主机的架构。但是,
每个服务一台主机对于小企业或者是个体户来说,光是放置主机的空间、电源、以及后续的管理问题,
就会导致一堆困扰的产生。这个时候,虚拟机器就非常有用啦。
所谓的‘虚拟机器’就是在一台实体主机上面虚拟出多部实体主机的环境,且每部实体主机都是独立的,
除了原本的那部原主机外,其他的主机都可以独立开、关机,由于个人电脑的能力在近年来突飞猛进,
速度与效能都非常棒,所以用一台实体主机来进行虚拟机器的搭建,并适当的分配不同的服务在上头,
将有助于能源的节约、管理的简化以及服务追踪的简化哩!
|
前言
这个章节主要是在介绍 Xen 这个虚拟机器,那,什么是虚拟机器?他有什么用途?
目前有哪些常见的虚拟机器软件 (Virtual Machine) ?底下我们先来说一说。
什么是虚拟机器
虚拟机器 (Virtual Machine) 与
Apache 的虚拟主机 (Virtual host)
( 注1) 不一样,
虚拟机器的目的是希望能够在一台实体主机上面‘同时运作多个作业系统’的一项功能。
为什么我们需要在一台主机上面同时运作多个作业系统呢?可能原因有几个:
让一台强效型主机负责多种业务时:
由于电脑工业技术的发达,近年来的个人电脑不但越来越便宜,而且功能还越来越强大!
就在前几个礼拜 (2007/09/xx) ,鸟哥也才收到两部‘四核心的、配备 2GB 主记忆体’的个人电脑!
这在台湾政府的中信标案里面也已经有提供了,可见个人电脑实在是便宜又好用。
那么好用的一台电脑如果拿来当网络服务器,你会觉得很浪费!怎么说呢?
以鸟哥的鸟站 ( http://linux.vbird.org/)
来说,一台 AMD AthlonXP 2000+ (1.6GHz 的 CPU 速度) 就跑得非常的顺畅,
运作至今应该也没有发生突发性大流量导致服务中断的情况,观察这部主机的平均运作情况,
使用 sar 这个指令来察看一下,唔!每日平均 CPU 负载都在 10% 以下而已。
所以说,这部四核心的电脑拿来当鸟站的主机,根本就是浪费了他的才能。
如果能够将多种服务集中在这部主机上面来跑,岂不甚好!才不好哩!
如果你看过 基础篇 ( 注2) 与 服务器篇
( 注3) 的介绍后,
肯定会认为主机的服务越单纯越好,这样在服务软件除错以及主机环境的单纯化上面比较好。
所以说,一台好的主机如果仅用于一个特定的用途,实在很浪费。但如果每个服务都需要一台主机,
又觉得很讨厌,因为包括主机的硬体维护、电费、软件安装、网络设定等等,都很麻烦,尤其又贵!
因为上述的问题,所以目前有很多专案都在开发‘在一台实体主机上面模拟出另一台机器’的功能,
也就是说:‘ 我们希望能够在一台主机上面 "同时"
跑多个作业系统’的意思。如果能达到这样的功能,实际的硬体可以省略掉很多问题,
同时又可以充分的应用实体主机的资源,实在很不错啊!
同时豁弄多种不同的作业系统:
时间拉回到四、五年前,当时的主机能力仅是还可以,还不算很够力,而且价格不斐。
但是当时多种作业系统都很吸引人,包括 Windows/Linux/Mac/DOS... ,大家都希望能够尝试一下这些作业系统,
然而又不想花钱去购买一台新的主机来玩,这个时候 多重开机 ( 注4) 就成了很重要的一环,
因为他可以让我们在开机的过程当中选择所想要执行的作业系统来操作说。
不过多重开机有个讨厌的缺点,那就是‘ 我每次开机只能够单玩一种作业系统’,
所以如果你想要在多个作业系统之间切换时,光是开、关机就会让你火气大起来。
这个时候就有些公司开始开发能够在一个作业系统上面‘ 模拟出另外一个可执行的作业系统’环境,
所以此时就能够在同时间操作两种作业系统了。当时最流行的是 VMWare 这一套软件啦!
虽然早期就已经有数种虚拟机器的软件可以玩,不过当时毕竟是使用软件来模拟的,
硬体并不直接支援这种虚拟机器的环境,所以效能上面非常的糟糕!不过拜 Intel/AMD 大力开发强效型 CPU 之功,
目前的主机硬体大部分都有支援虚拟机器的能力,如此一来我们就能够使用快速的虚拟机器的环境啰!
有哪些常见的虚拟机器软件
那么目前有哪些常见的虚拟机器软件呢?他们又各有何特色?底下就来说一说:
老牌子的 VMWare (http://www.vmware.com/)
早期的玩家大概都有玩过这一套虚拟机器的软件,这套软件早期仅在 Windows 上面执行,
最大的优点就是可以让使用者在 Windows 环境下同时模拟出一套 Linux 的环境,同时执行两个作业系统。
鸟哥之前使用这套软件的目的是用来捉 Linux 的安装画面!在这个功能上面 VMWare 实在很不错。
不过早期的 VMWare 效能不太好,加上当时的主机效能也不佳,而且 VMWare 模拟的硬体不会与原本的主机相同,
因此鸟哥很不建议大家使用 VMWare 来学习 Linux 。然而随着时代的进步,目前 VMWare 已经发展的相当不错,
同时也提供 Open source 的版本给 Unix-Like 平台的 OS 使用,算是很不错的。他也是目前虚拟机器市场的龙头老大!
已渐趋成熟的 Xen (http://www.xensource.com/)
Xen 是以 GNU 的 GPL 授权发布的自由软件,目的在于提供效能佳、可支援不同作业系统的同时运作、
且让同时运作的作业系统彼此互相独立的系统环境。Xen 是基于 X86 硬体所开发出来的虚拟机器监督器
(Virtual Machine Hypervisor) ,鸟哥觉得他最大的优点就是效能佳!鸟哥曾在一台 Celoron 366 MHz, 记忆体 192MB
的笔记型电脑上面模拟出一个 Xen 机器给上课的同学们豁弄,同时连线 50 个同学到该部模拟的 Xen
机器上还不会觉得有延迟的问题,效能真的是很不错。我们在下一节会详细的介绍 Xen 这个好东西。
后起之秀 KVM (Kernel based Virtual Machine,
http://kvm.qumranet.com/kvmwiki)
酷!炫!有劲的 VirtualBox (http://www.virtualbox.org/)
还有一套自由软件的虚拟机器可以用,那就是同样架构在 x86 上面的 VirtualBox 这套软件啦!
这套软件提供完整的虚拟环境,且可支援目前市面上的主流作业系统。
鸟哥曾经看过网中人前辈在他的笔记型电脑上面玩过这套东西,非常的炫丽,而且提供图形化介面,
效能方面看起来也相当的优秀。不过,好像整合度方面的问题,偶而模拟的作业环境会当掉,
但是不会影响到原作业系统就是了。想要在 Linux 桌上型电脑上玩玩虚拟环境的朋友,鸟哥觉得这套东西最适合您!
其实每套虚拟机器的软件都有其存在的价值,因为他们的功能与目的都不一样。举例来说,鸟哥认为 VirtualBox
很适合于想在 Linux 桌上型电脑上面玩 Windows 的朋友,虽然他不够稳定。至于 Xen
则很适合在一台高效能主机上面同时运作多个同版本的 Linux 系统,因为稳定度相当高,且性能优秀,
可让使用者轻松的在一台机器上面运作多个独立的作业系统来分别处理不同的网络服务呢!
Tips: 这一章底下的资料牵涉到很多硬体的观念以及 Linux 作业系统最底层核心的架构说明,
如果您不想要了解这些基础概念,可以直接看 CentOS 5.x 的实例说明即可。
| |
初探 Xen
Xen 的效能为什么能够这么好? Xen 在使用上面有什么样的限制?我的一台主机最多可以支援几个 Xen 的模拟环境?
Xen 的模拟环境有几种类型? 这些疑问我们都得要先知道一下才好!
当然,最好能够有个简单的小例子来处理 Xen 的模拟环境啰。
Xen 的虚拟类型与特色
Xen 这套自由软件在虚拟机器的模拟类型方面主要分为 半虚拟化
(Para-virtualization) 及全虚拟化 (Full
virtualization) 两种,其中半虚拟化主要是透过修改 Linux 核心来达成的虚拟技术。
半虚拟化技术所产生的虚拟机器需要与原本的作业系统相同较佳。使用半虚拟化的环境所具备的特色有:
( 注5)
- 虚拟机器的运作效率与实体机器的效能相当;
- 最多可支援到具有 32 颗以上 CPU 的主机环境;
- 支援 x86/32, x86/32 含 PAE 技术, 及 x86/64 的硬体平台环境;
- 良好的硬体驱动程序支援,几乎支援所有的 Linux 装置之驱动程序;
Xen 的半虚拟化技术主要是用在相同版本的 Linux 上面,也就是说,如果你想要使用半虚拟化的方式启动多个虚拟机器,
那么那些虚拟机器全部都必须是相同的作业系统,甚至要求相同版本与相同核心的 Linux distribution 喔。
如果你想要安装不同版本的 Linux 或者是其他的 OS (例如 Windows XP) 时,就得要使用全虚拟化技术了。
但是全虚拟化技术是有其限制的,当你的硬体满足下列需求时,全虚拟化技术才能够动作:
- 你的硬体支援 Intel 的 VT 技术 (Virtualization Technology, Intel-VT);
- 你的硬体支援 AMD 的 SVM 技术 (Secure Virtual Machine, AMD-SVM or, AMD-V)。
此外,上面提到的 PAE 指的是 Intel 的实体位址延伸技术 (Physical Addressing Extensions, PAE),
这项技术可让原本仅支援到 4GB 实体记忆体的 32 位元硬体平台,可支援到最大 64GB 的记忆体喔!
而且, Xen 几乎可以在所有的 P-II 以上等级的硬体平台上面跑半虚拟化任务,如果不跑全虚拟化的话,其实效能确实是
OK 的啦!
近来由于虚拟机器软件的流行,加上 x86 电脑效能与 CPU 运算核心单元的增加,两大 x86 CPU 制造商 Intel/AMD
都发表了新的整合到 CPU 的虚拟技术,分别是 Intel 的 Vanderpool 虚拟技术以及 AMD 的 Pacifica 技术。
这些技术有的也支援 Xen ,这让 Xen 的效能增进不少呢! ^_^
Xen 的运作环境解释
在 基础学习篇里面我们曾经谈过硬体、核心与应用程序的关系,
所有的应用程序都是在核心层之上来完成的 ( 注6)。
然后 透过核心功能去呼叫与使用硬体元件的命令。好了,
现在来仔细想一想,既然我有多个虚拟机器,每个虚拟机器的环境各别有自己的作业系统核心,
也就是有多个作业系统同时存在。 如果所有的作业系统都能够完整的控制硬体的话,
那么硬体到底该接受谁的指令来运作?那个系统的指令会先被执行?这是很重要的问题,
因为如果这边搞不定,那么你的硬体系统就只有当机一途。
为了解决这个问题,Xen 也分成多个层级 (layer) 来执行。他将 Linux 的核心修改过后,
再使用这个修改过后的核心开机,而开机后先载入 Xen 的监督器 (Hypervisor) ,
并且启动第一个在上头的作业系统,我们称他为 domain-0。
( 在 Xen 上面所谓的一个 domain 就是一个虚拟机器啰!)
Domain-0 之所以要先被载入是因为 Domain-0 含有其他虚拟机器启动所必须的控制指令,
并且 domain-0 也是控制虚拟装置的重要主控系统。
在 domain-0 上头最重要的就是一个 xend 的常驻程序,其他的 domain 都是由这个 xend 来管理的。
至于命名方面,除了 domain-0 之外的其他虚拟机器就依序被称为 domain-1, domain-2 等等,
我们通称为 domain-U 啰。这些咚咚的相关性有点像这样:
图 2-1、Xen Hypersvisor 的功能示意图(注7)
由上图我们知道 domain-0 真的是很重要的,因为他直接控制 Xen 的监督器 (Hypervisor),而且掌握了实际的
Linux 驱动程序 (drivers)。而其他的虚拟机器 (domain-U) 则是透过 Xen 监督器来与实际的硬体以及 domain-0
达成沟通。而为了让 domain-0 能够与 Xen 结合,我们 必须要修改 domain-0
的核心才能够顺利运作。并且需要使用 domain-0 的核心来开机才可以。
domain-0 是所有虚拟机器的来源,所以他可以尽量简单一点,其他的个别服务则可以放置到不同的 domain 当中了。
那个 xend 也是很重要的咚咚,他可以管理 domain-0 与其他 domain 之间的启动与沟通,
可以提供一个终端机 (console) 介面来让 domain-0 登入其他的 domain ,所以我们也必须要启动这玩意儿才行。
早期 Xen 尚未被各 distribution 整合到各自的版本中时,使用者必须要由 Xen 的官方网站下载原始码,
然后自行重新编译核心以及编译 Xen 软件才行。说实在的,玩个 Xen 这么麻烦,倒不如不要玩!^_^。
然而在 RHEL 5 (CentOS 5) 以后, Xen 已经包含在原始释出的套件中了,所以我们直接用 yum 就能够安装妥当!
所以要搞定一台 Xen 的 domain-0 已经不再是不可能的任务啰!^_^
对于 Xen 的基本原理有一些认识之后,接下来就让我们开始在 CentOS 5 上面进行一个小小的实验吧!
确定你的硬体是否支援 Xen 的运作
虽然说目前的硬体都很新了,不过有的朋友使用的是旧的主机来安装 Linux ,所以我们必须要留意你的硬体是否支援
xen 的运作。而我们知道 Xen 支援半虚拟化与全虚拟化两种模式,两种模式的需求为:
半虚拟化 (Para-virtualization) 硬体需求:
只要是 64 位元的 x86 主机 (x86_64) 都能够支援半虚拟化的环境。如果是 32 位元的主机 (x86) 时,
该主机必须要支援的实体位址延伸技术 (PAE) 才能够使用 xen 喔!那如何确认呢?很简单,检查 CPU 的参数即可:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 mtrr mca cmov pat pse36 mmx fxsr sse up
|
嘿嘿!这一台主机是鸟哥的 P-III 800 主机,看吧!确实有支援 PAE 喔!所以当然可以玩 Xen 啰。
全虚拟化 (Fully-virtualization) 硬体需求:
如果你需要全虚拟化的技术支援时,此时需要硬体有支援虚拟化技术才行。
目前在 x86 的主机当中, Intel 提供 VT 技术, AMD 则提供 SVM 技术。
这两种技术在 CPU 的旗标分别是: Intel (vmx) 与 AMD (svm) 。
鸟哥在 Core Duo 主机上面的测试可以发现:
在 Intel Core 2 Duo 的 CPU 主机上面测试 CPU 旗标:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts
acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc up pni
monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm
# 瞧!是有那个 vmx 的支援啦!
|
至于 AMD 的主机旗标则是:(下表感谢 donyingle兄的提供!)
在 AMD Athlon(tm) 64 X2 的 CPU 主机上面测试 CPU 旗标:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt
rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic
cr8legacy 3dnowprefetch ts fid vid ttp tm stc 100mhzsteps
# 瞧!是有那个 svm 的支援啦!
|
如果确定你的 CPU 有支援上述的条件后,嘿嘿!那我们就可以开始底下的游戏啦!如果没有支援呢?
那很抱歉,底下的资料看看就好!
所需要的 Xen 套件与核心
注意:
在开始安装之前,请先参考 前一小节以确定你的硬体已经支援 Xen 的半虚拟化功能了!
约略谈了一下 Xen 的原理、特色之后,在开始玩弄 Xen 之前,我们得了解运作 Xen
所需要的各项套件,并且顺利安装后,才能够使用的啊! ^_^。如同前一小节提到的,
要使用 Xen 半虚拟化 (Para-virtualization) 必须要修改核心才能够顺利的运作。
在以前的版本你需要重新编译核心,不过,在新的版本,例如 CentOS 5.x 底下,就已经将
Xen 的核心帮你编译好了!你可以直接安装即可。所以,你需要安装的套件主要有:
- kernel-xen:修改的 Linux 核心,使可以跑 Xen 的环境;
- xen:主要的 xen 套件,包括设定档、启动脚本、所需的基本函式库等;
- xen-libs:Xen 所需要的函式库等;
- python-virtinst:提供终端机安装的软件;
- virt-manager:为一个图形使用者介面软件,可在图形介面管理 xen 喔!
在 CentOS 5.x 的环境下,你可以使用 yum 直接来安装这几个套件。安装完毕后请务必使用新的核心开机!
以鸟哥的例子来说,我安装了数个核心,包括 kernel-2.6.18-8.1.14.el5 及 kernel-xen-2.6.18-8.14.el5 ,
所以在 grub 的设定档当中会像这样:
[root@linux ~]# vi /boot/grub/menu.lst
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-8.1.14.el5xen)
root (hd0,0)
kernel /boot/xen.gz-2.6.18-8.1.14.el5
module /boot/vmlinuz-2.6.18-8.1.14.el5xen ro root=/dev/hda1 rhgb quiet
module /boot/initrd-2.6.18-8.1.14.el5xen.img
title CentOS (2.6.18-8.1.14.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-8.1.14.el5 ro root=/dev/hda1 rhgb quiet
initrd /boot/initrd-2.6.18-8.1.14.el5.img
|
你必须要注意到,鸟哥使用的开机选单为第0个,亦即是 2.6.18-8.1.14.el5xen 那一个!
然后重新启动这部 Linux 主机喔!启动完成后,应该再次的确认一下是否为 xen 的核心才行!
[root@linux ~]# uname -r
2.6.18-8.1.14.el5xen
# 仔细看,鸟哥的核心为新的 xen 的核心喔!
[root@linux ~]# chkconfig --list | grep xen
xend 0:off 1:off 2:on 3:on 4:on 5:on 6:off
xendomains 0:off 1:off 2:off 3:on 4:on 5:on 6:off
# Runlevel 3/5 的 xen 相关服务是有启动的才行!
[root@linux ~]# pstree -p | grep xen
| |-xenbus(10)
| `-xenwatch(9)
|-xenconsoled(2348)---{xenconsoled}(2349)
|-xenstored(2340)
# 这样看来,应该确实是有启动的样子喔!继续最后一个确认!
[root@linux ~]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 462 1 r----- 49.2
# xm 为 Xen 的重要指令,list 为列出已经在跑的 xen 系统,预设有 domain-0 存在!
|
透过上面的测试,我们会知道 xen 确实已经顺利的启动,而且也启动前面谈到的那个重要的 domain-0 啰!
接下来我们再来聊一聊那 xen 的设定档在哪里?
xen 的套件结构
我们前面谈到过, Xen 在 domain-0 是由一个 xend 的服务所管理的,他可以用来启动、关闭与连结到其他的
domain-U 当中。此外, Xen 亦提供许多的指令来让系统管理员管理他们的 domain-U 啊!这些重要的启动执行档为:
- /usr/sbin/xend:就是 xend 的启动脚本,使用 python 程序语言写成的;
- /usr/sbin/xm:重要的管理 xen 的指令,可输入 xm help 查询用法。
至于与 xen 有关的设定档,包括一些模拟元件的启动脚本都在 /etc/xen 底下,在这个目录下的许多资料为:
- /etc/xen/xend-config.sxp:这个重要!是 xend
的设定档!内容包括 domain-0 的类型、网络的连结方式、
domain-0 的记忆体与CPU等资源配置、是否使用 vnc 作为 domain-U 的连线方式等等。
不过,鸟哥觉得,这个文件不太需要更动,使用预设值就很够用了。
- /etc/xen/:里面含有数个 domain-U 的设定档范本,包括:xmexample1, xmexample.hvm。
其中,那个 xmexample.hvm 可作为完整模拟的参考范本喔!
- /etc/xen/auto:如果你想要在系统开机时就自动启动某个
domain-U 的话,可以将该设定档指定连结到这个目录中。
举例来说,如果你要在开机后立即使用 /etc/xen/xmexample.hvm 设定档来启动某个 domain-U ,
那可以这样做:
[root@linux ~]# cd /etc/xen/auto
[root@linux auto]# ln -s ../xmexample.hvm .
# 这只是个范例,你可不要跟着做!因为 xmexample.hvm 还需要修改才能运作!
|
- /etc/xen/scripts:这目录有趣了!包括虚拟设备的启动、虚拟网络的启动、
虚拟桥接器的启动等等,都是透过这目录底下的所有文件来达成的!
在你安装完毕,并且使用新核心启动后,接下来让我们开始来处理一个小案例吧!
第一个泛用实例
就如同 图 2-1 的样子,在主机上的所有 Linux OS 都需要自己能够开机,
而开机流程通常是这样的:( 注8)
- step 1: 按下电源,主机开始读取 BIOS 资料;
- step 2: 取得开机的装置顺序,并由 MBR 取得开机选单与开机管理程序;
- step 3: 由开机管理程序载入 Linux kernel 及虚拟磁碟 (initrd);
- step 4: Kernel 探测硬体载入适当的驱动程序,并挂载根目录以读取核心模组;
- step 5: 开始由 /sbin/init 程序设定主机的环境。
由上述的动作,我们可以知道 Linux 开机的重点在于 1.
核心 2. 虚拟磁碟 (initrd) 及 3. 根目录 (/) 了。
虽然核心与虚拟磁碟我们的 CentOS 5 已经提供了,但是预设的虚拟磁碟好像并未主动的加入 Xen 的某些驱动程序,
因此我们得需要针对虚拟磁碟进行设定才好。此外,每个 Xen domain
的根目录也很伤脑筋的!因为根目录需要很多资料,而且还需要挂载类似 /sys, /proc, /dev, /selinux 等特殊的文件系统哩!
那该如何处理根目录呢?底下就让我们来处理处理:
硬体支援性
就如同前面几个小节谈到的,如果我们的硬体并不支援 xen 所必须要的功能,那么你是无法建立好你的 domain-U 的!
在这个泛用案例当中我们的重点是测试半虚拟化,因此你只要具有 PAE 的支援即可。
鸟哥以较低阶的 P-III 800 来进行测试,硬体检查的结果是这样的:
[root@linux ~]# cat /proc/cpuinfo | grep flags
flags : fpu tsc msr pae mce cx8 mtrr mca cmov pat pse36 mmx fxsr sse up
|
你可以发现确实存在那个 pae 的关键字,因此我们这个系统是可以玩 Xen 的半虚拟化技术的!
所以让我们继续进行工作吧!
根目录所需磁碟槽
根目录所需磁碟槽的来源可以有两个,一个是实体硬碟,一个是利用 dd 建立一个大文件来使用。
鸟哥比较倾向利用 dd 来处理你的根目录喔!你可以这样做:
范例:建立一个 5GB 的大文件
[root@linux ~]# mkdir -p /disk2/xen
# 因为鸟哥的 /disk2 为一颗额外的硬碟,所以容量比较大啦!
[root@linux ~]# cd /disk2/xen
[root@linux xen]# dd if=/dev/zero of=xen.img bs=1M count=5000
5000+0 records in
5000+0 records out
5242880000 bytes (5.2 GB) copied,178.482 秒,29.4 MB/s
# 这个时候会开始创造一个 5GB 左右的文件,由于硬碟速度快慢的关系,
# 这个动作可能会消耗数分钟到数十分钟不等。
[root@linux xen]# ll /disk2/xen
-rw-r--r-- 1 root root 5242880000 Oct 10 00:30 xen.img
|
文件是建立起来了,不过如果你的 Linux 有启动 SELinux 的话,还需要一些类型的改变才可以!
其实动作也不难,这样做就对了!
[root@linux xen]# chcon -t xen_image_t -R /disk2/xen
[root@linux xen]# ll -aZ /disk2
drwxr-xr-x root root user_u:object_r:xen_image_t .
drwxr-xr-x root root system_u:object_r:file_t ..
-rw-r--r-- root root user_u:object_r:xen_image_t xen.img
# 如果你有启动 SELinux 才需要这么做,否则就略过。
# 反正你要记得 Xen 的文件必须要是 xen_image_t 的安全内容类型。
|
文件建立起来后,就需要进行格式化啰~格式化的方法为:
范例:将刚刚建立的大文件格式化为 ext3 的文件格式
[root@linux xen]# mke2fs -j /disk2/xen/xen.img
mke2fs 1.39 (29-May-2006)
/disk2/xen/xen.img is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
....底下省略....
|
由于这是文件不是磁碟分割槽,所以会有上述的警告讯息,你按下‘y’就对啦!
复制或安装根目录
由于 domain-U 与 domain-0 其实是一样的系统,因为是半虚拟化嘛!所以, 最简单的根目录制作方法,
就是将原本的 domain-0 的根目录复制到新的分割槽内就对了!
以鸟哥的例子来说,你可以简单的这样做:
[root@linux ~]# mount -o loop /disk2/xen/xen.img /mnt
# 先将刚刚制作出来的资料给他挂载起来,这是特殊挂载法喔!
[root@linux ~]# cp -ax /{root,dev,var,etc,usr,bin,sbin,lib} /mnt
# 这几个目录的资料是一定需要复制的!粉重要!。
[root@linux ~]# mkdir /mnt/{proc,sys,home,tmp,selinux}
# 这几个目录与虚拟文件系统有关,包括程序、核心资料等目录,所以要先建立
[root@linux ~]# vi /mnt/etc/fstab
/dev/sda1 / ext3 defaults 1 1
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
# 我这里假设我的根目录所在磁碟槽为 SATA 硬碟的第一个分割槽,
# 所以是 /dev/sda1 。此外,其他的文件系统如 proc, sysfs 都必须要写入!
# 至于原本在 domain-0 的其他装置,就给他拿掉吧!
[root@linux ~]# vi /mnt/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=xen.test.hostname
# 这里设定一下你的主机名称啦!
[root@linux ~]# vi /mnt/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
IPADDR=192.168.0.123
NETMASK=255.255.255.0
ONBOOT=yes
# 建议将 IP 也设好。但是要注意那个 HWADDR 最好能够拿掉不设定!
[root@linux ~]# umount /mnt
# 记得将挂载的资料给他卸载掉
|
基本上,根目录的设定到这里就算结束了!不过,你会发现由于 domain-U 的资料都是由 domain-0 来的,
而不同的主机其实设定不会相同,所以使用上述的作法你会发现有几个小问题:
- 你必须要手动处理一些小设定,包括主机名称, /etc/fstab, IP 参数等等;
- 即使手动处理过上述的资料,还是很可能会无法成功的启动 domain-U ;
- 由于 domain-0 可能会安装比较多的套件,这些资料又在 domain-U 当中用不着,徒然造成硬碟容量的浪费。
所以,虽然这个方法最简单,不过通常鸟哥不是很建议您使用啦! ^_^
设定虚拟磁碟映象档以及终端机介面
由于预设的 CentOS 虚拟磁碟 (Initial Ram Disk) 并不包含一些 Xen 的相关驱动程序,
因此搞了老半天也是无法驱动 Xen 的 domain-U ,给他气死!
所以,我们得先就 initrd 来进行一些额外的设定才行。
这个地方非常的重要!因为鸟哥卡在这里好几天~最后才发现原来是 initrd 的问题啊~
[root@linux ~]# mount -o loop /disk2/xen/xen.img /mnt
[root@linux ~]# cd /boot
[root@linux boot]# mkinitrd -v -f --fstab /mnt/etc/fstab --with xenblk \
> --with xennet --preload xenblk --preload xennet \
> initrd-2.6.18-8.1.14.el5xen.vbird.img `uname -r`
[root@linux boot]# umount /mnt
# 详细的各项参数请 man mkinitrd ,上述的范例仅是利用 /etc/fstab 的装置来设定,
# 并且加上一些 xen 相关的驱动程序而已。这个过程非常的重要!
# 最终会制作出一个 initrd-2.6.18-8.1.14.el5xen.vbird.img 文件
|
除了这个虚拟磁碟之外,为了要方便我们登入 domain-U 的环境,我们需要产生一个终端机介面才行。
因为每个 domain-U 会使用到终端介面,然而我们知道 tty1 ~ tty7 预设给 domain-0 使用掉了。
为此,我们必须得要制作出一个虚拟的终端介面,那就是 xvc0 这个终端介面啰。如何产生呢?
简单的流程是这样:
[root@linux ~]# vi /etc/inittab
# 大约在第 51 行的地方加入底下特殊字体的部分:
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav
# 意思是使用 agetty 建立 xvc0
[root@linux ~]# init q
# init q 这个指令可以让 /etc/inittab 的设定立刻生效而不需要重新开机!
[root@linux ~]# ln -s /dev/console /dev/xvc0
# 如果 xvc0 没有主动建立的话,我们需要手动来建立连结才可以喔!
|
做完这一步之后,接下来就是可怕的设定档啰~
编辑 xen 虚拟资料的设定档
接下来就是重头戏啦!因为我们必须要指定 domain-U 的相关虚拟设定值,包括使用几颗 CPU 、使用多少记忆体容量,
以及所使用的核心与根目录的所在等等。如前所述,这些设定档主要都在 /etc/xen 底下,
尤其里面的 xmexample1, xmexample2 等文件就是很好的说明文件档,很有参考价值。
鸟哥先说一下我的设定是这样的:
[root@linux ~]# vi /etc/xen/centos5
# 这个文件的档名可以随便你取,不过设定档最好是在 /etc/xen 这个目录下才好!
name = "centos5"
kernel = "/boot/vmlinuz-2.6.18-8.1.14.el5xen"
ramdisk = "/boot/initrd-2.6.18-8.1.14.el5xen.vbird.img"
memory = "128"
vcpus = 1
vif = [ '' ]
disk = [ 'tap:aio:/disk2/xen/xen.img,sda1,w' ]
root = "/dev/sda1 ro "
# name: 只是一个显示的名称,一般建议与档名相同即可;
# kernel: 在 domain-0 上面的文件,用来进行 domain-U 的开机!非常重要!
# ramdisk: 就是 initrd 那个文件啰~刚刚我们才做出来的档名
# memory: 分配给这个 domain-U 的记忆体有多少?如果没有图形,96 MB 也可以!
# vcpus: 使用多少颗 CPU 的意思;
# vif: 是否需要网络卡,如果需要网络卡,至少要有设定!但内容可用预设!
# disk: 用来作为根目录的是那个磁碟,这个最重要啦!语法为:
# tap:aio:/完整/路径/档名,设计为domain-U的磁碟代号,可否写入
# 以我们这个例子来说,我将之前建立的大文件模拟成为 domain-U 的
# /dev/sda1 ,并且该 partition 为可写入 (w)。
|
特别特别留意的是,上面的设定档当中的 kernel, ramdisk 以及 disk 都是以原本的主机 (domain-0) 的角度来思考的,
也就是说,实际上我们是 以 domain-0 的核心文件来进行
domain-U 的开机,因此你会发现在 domain-U
当中并不存在 /boot 这个目录喔!因为实际上用来开机的是 domain-0 的文件嘛!
至于另一个重点就是那个 disk 参数。我们可以使用模拟的方式也可以使用实际的 partition 来给予设定。
如果是‘用文件来模拟成为 partition’时,使用两个逗号 (,) 隔开成为三个栏位,分别为:
tap:aio:/完整路径/文件的名称,装置代号名称,写入与否
- [tap:aio:]:为较新的文件处理模式,旧的方式为使用:[file:]
- [装置代号名称]:就是模拟的装置,请与 domain-U 内的 fstab 对应起来喔!
- [w]:就是设定可否写入,若唯读则为[r]
如果使用实体 partition 来模拟的话,那么开头的部分会以‘phy:’来取代。举例来说,如果我们以 /dev/hda5
来作为 domain-U 的 /dev/sda1 的话,那就会变成:
disk = [ 'phy:/dev/hda5,sda1,w' ]
如果一切都搞定之后,接下来让我们来启动 Xen 的 domain-U 吧!
利用 xm 指令启动与管理 domain-1
在 domain-0 可以使用 xm 这个指令来启动、关闭、删除某个 domain-U , xm 的指令用法是这样的:
[root@linux ~]# xm [动作] [设定档名] [-c]
参数:
[动作]:要某个设定档内的 domain-U 作何动作之意,常见的动作有:
create :启动这个 domain-U 的意思,例如启动 centos5 这个设定档时,使用:
xm create centos5
destroy :立即由记忆体中,将这个 domain-U 给删除,常用于 domain-U 出问题时
list :将目前已经启动的 domain 都列出来之意;
console :若有已建立的 domain-U 时,可用 console 来取得 domain-U 的终端介面
shutdown :关闭某个已启动的 domain。如果想要关闭全部的 domain-U ,可用
xm shutdown -a
[设定档名]:亦即在 /etc/xen/ 目录下的档名啰;
-c :同时建立到该设定档的终端介面 (console)
|
如果想要启动我们刚刚建立的 centos5 这个设定档内的 domain 时,你可以使用‘xm create -c centos5 ’即可。
那个 -c 的作用是可以让你直接取得 domain-U 的终端机介面。鸟哥在 pietty 上面连线到 domain-0 ,
然后启动 centos5 这个 domain 的情况如下所示:
图 2-2、启动 xen domain-U 的示意图
在图 2-2 当中,输入指令后 domain-U 的开机流程就会依序的显示在你的终端机上,
感觉上就好像坐在电脑前面看 Linux 主机开机一样!实在是很不赖!最后如果开机顺利成功的话,
结果会像下图所示这样:
图 2-3、启动 xen domain-U 的示意图
在图 2-3 当中,最上方圈起来的开机讯息是错误讯息。由于我们是复制 domain-0 的所有资料,
因此连同原本写在 /etc/rc.d/rc.local 文件内的执行过程也会被执行。但是 domain-U 的状况与
domain-0 并非完全相同,所以就会如上所述出现一些错误讯息啦!这也是我们需要额外处理的部分喔。
当你以 root 的身份登入后 (这个真的是终端机,并非是 ssh 的画面喔!),会发现多了一个 xvc0 的终端介面,
这个介面得先在 /etc/inittab 里面设定好才行!如果一切都 OK 了!恭喜您,你已经登入 domain-U 啰!
接下来请你自行根据你的需要来设定好你的 domain-U 吧!让这两个 domain 并行呢!
好了,现在我如何登出 centos5 这个 domain-U 呢?你可以这样做的:
- 直接在 domain-U 的环境中按下 [ctrl]-] 这个组合键来回到 domain-0 的环境;
- 直接关闭 pietty 等连线的软件;
- 利用其他 bash 来结束 (kill) 掉使用 xm 所建立的连线程序
有趣的是,即使你使用上述的方法来离开 domain-U 时,
也不会影响到 domain-U 的继续运作!而且 root 也不会登出,等到你下次再以‘ xm console centos5 ’时,
会继续取得 root 的动作继续处理刚刚未完成的工作呢!很神奇吧~
现在,请跳回 domain-0 的地方,或者是利用另外一条 pietty 的连线连入 domain-0 ,我们使用 xm list
来察看一下各个 domain 的状况吧!
[root@linux ~]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 366 1 r----- 735.2
centos5 42 127 1 ------ 52.4
# 你会发现多了一个 domain 出现!名称为 centos5 啦!
# 你也会发现有个 State 吧!那个 State 的意义是这样的:
# r :该 domain 正在使用 CPU 资源在运作中;
# b :这个 domain 目前被悬置(blockded),很可能由于这个 domain 在等待较长时间
# 的输入输出 (I/O) 之故。
# p :该 domain 处于暂停的状态,通常由于管理员使用 xm pause 之故。
# 当 domain 在此状态时, Xen 的监督器将不会处理该 domain 的动作;
# s :这个 domain 正在关机当中
# c :这个 domain 已经 crash 了,但是却没有自动的关掉。通常是因为没有设定
# on_crash 的相关动作所致。
# d :该 domain 正在死亡中...因为该 domain 无法正确的 shutdown/crashed 之故。
|
很简单吧!这样就完成你的 Xen domain 啰~开始将你所想要的网络服务分门别类的放到不同的 domain-U 中吧!
加油!
例题:关于如何登入 domain-U我在启动 domain-U 的时候,使用指令为‘ xm create domain-U ’导致我使用 xm list
可以看到新的 domain-U 在运作,但我还是在 domain-0 。请问此时我该如何登入 domain-U 呢?
答:
有两种方式,如果想要取得 domain-U 的终端机模式,请使用:
如果你知道 domain-U 的 IP,并且 domain-U 有启动类似 ssh/telnet 的服务时,可使用网络服务登入。举例来说
domain-U 的 IP 为 192.168.100.100,且有启动 ssh ,则你可以使用:
ssh username@192.168.100.100
|
例题:关于如何关闭 domain-U
我使用 xm list 时,发现 domain-U 已经启动了,我该如何关闭这个 domain 呢?
答:
如果你在 domain-0 上头的话,可以使用: 来关闭这个 domain-U ,
如果极端一点,你想要关闭所有的 domain-U (除了 domain-0 之外),则可以下达: 那如果你是在 domain-U 里面呢?想关闭该 domain 就直接给他:
即可,就好像一般正常程序关机一样喔!
那如果万一 domain-U 无法顺利关机,则你可以在 domain-0 上面直接下达删除的指令:
|
例题:关于重复登入的问题
我利用 xm create -c domain-U 的方式取得终端机来登入 domain-U 了,结果另外一个使用者使用‘xm console domain-U’也来登入该
domain,此时会发生什么问题?该如何解决?
答:
由于预设情况下,一个 domain-U 仅有一个终端机,因此第二个登入者将不会询问帐号密码,
而是直接以第一个登入者的身份取得该终端介面,亦即两者将具有相同的终端介面与所有资源。
但如此一来会导致控制权的争夺效应,最终结果两者都无法控制该终端介面。此时建议两者均离开该终端介面,
然后让单一使用者以 xm console 登入,另一使用者则使用类似 ssh 的方式网络登入即可。
|
常见错误分析
Xen 的启动其实是颇不容易的,常常会有一些错误情况发生。底下我们来看看一些常见的错误情况,
让您了解到,您无法启动 Xen 的可能原因为何?
没有启动 Xen 的 xend daemon
[root@linux ~]# xm create -c centos5
Using config file "./centos5".
Error: Unable to connect to xend: Connection refused. Is xend running?
|
如上所述,肯定你没有启动 xend 这个 daemon 的啦!直接启动他即可:‘/etc/init.d/xend start’
使用到错误的核心或者 domain-0 未以新 xen 核心开机
[root@linux ~]# xm create -c centos5
Using config file "./centos5".
Error: (22, 'Invalid argument')
|
然后请到登录档内看看,亦即是 /var/log/xen/xend.log 档内,如果出现如下的错误:
[root@linux ~]# cat /var/log/xen/xend.log
[2007-10-17 13:18:48 xend.XendDomainInfo 31254] ERROR
(XendDomainInfo:203) Domain construction failed
|
很有可能就是你的核心文件用错。此时请检查一下你的设定档,看看‘kernel’的项目是否设定正确?
我们务必要使用 xen 相关的核心来开机才行啊!
SELinux 或者是文件权限的问题
[root@linux ~]# xm create -c centos5
Using config file "/etc/xen/centos5".
Error: Kernel image does not exist: /boot/vmlinuz-2.6.18-8.1.14.el5xen
|
但我看过 /boot/vmlinuz-2.6.18-8.1.14.el5xen 确实是存在的,可能原因为何?一般来说,这种问题应该是
SELinux 的影响所致。确定方法可以用‘setenforce 0’然后再重新‘xm create -c centos5’测试看看,
如果确定可以登入,那表示您的 /boot/vmlinuz-2.6.18-8.1.14.el5xen SELinux 安全格式内容不对。
正确的核心开机类型应该是:
[root@linux ~]# ll -Z /boot
-rw-r--r-- root root system_u:object_r:boot_t config-2.6.18-8.1.14.el5xen
-rw------- root root user_u:object_r:boot_t initrd-2.6.18-8.1.14.el5xen.vbird.img
-rw-r--r-- root root system_u:object_r:boot_t symvers-2.6.18-8.1.14.el5xen.gz
-rw-r--r-- root root system_u:object_r:system_map_t System.map-2.6.18-8.1.14.el5xen
-rw-r--r-- root root system_u:object_r:boot_t vmlinuz-2.6.18-8.1.14.el5xen
|
请自行使用 chcon 指令来处理 SELinux 的错误吧!
Kernel panic 的问题
如果出现如下的可怕画面时:
....前面省略....
Loading ext3.ko module
Creating root device.
Mounting root filesystem.
mount: could not find filesystem '/dev/root'
Setting up other filesystems.
Setting up new root fs
setuproot: moving /dev failed: No such file or directory
no fstab.sys, mounting internal defaults
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
Switching to new root and running init.
unmounting old /dev
unmounting old /proc
unmounting old /sys
switchroot: mount failed: No such file or directory
Kernel panic - not syncing: Attempted to kill init!
|
出现这个‘Kernel panic’的问题非常的多且复杂,其实主要的原因就是 无法挂载根目录。
因为你核心文件已经进行探测,并且虚拟磁碟文件 (initrd) 也已经载入啰!
那什么情况下会无法挂载根目录呢?你应该要这样查阅:
1. 用来作为根目录的文件 SELinux 类型不对:
首先,请先到 /var/log/messages 里面察看一下,如果出现如下画面:
Oct 17 12:04:17 xen-test kernel: audit(1192593857.395:259): avc:
denied { search } for pid=29687 comm="tapdisk" name="/" dev=hdc1
ino=2 scontext=system_u:system_r:xend_t:s0
tcontext=system_u:object_r:default_t:s0 tclass=dir
# 上面是同一行,意思是说,该文件读取被拒绝了,因为程序的格式为:
# scontext=system_u:system_r:xend_t:s0 ,但是你的文件格式为特殊字体部分,亦即:
# tcontext=system_u:object_r:default_t:s0
# 所以这个文件的读取就被‘deny’了!
|
这表示你用来作为根目录的文件 SELinux 类型不对,正确的文件类型是这样的:
-rw-r--r-- root root user_u:object_r:xen_image_t xen.img
|
所以你可以使用类似底下的方式来处理:
[root@linux ~]# chcon -t xen_image_t -R /disk2
|
似乎连同最顶层的 /disk2 都需要修改 SELinux 安全内容才行!所以你可以加 -R 来让子目录生效!
2. initrd 虚拟磁碟没有载入正确的模组
另一个可能原因就是虚拟磁碟并没有载入 domain-U 需要的模组,所以你必须要仔细看上面的输出讯息有没有这个项目:
Creating block device nodes.
Loading xenblk.ko module
XENBUS: Timeout connecting to device: device/vbd/2049 (state 3)
Loading xennet.ko module
netfront: Initialising virtual ethernet driver.
netfront: device eth0 has flipping receive path.
Loading uhci-hcd.ko module
|
这表示已经载入了 xen 的相关模组,如果你的画面没有这个讯息时,请参考前一小节关于虚拟磁碟的说明。并且更新你的 domain-U 设定档吧!
3. 设定档内容写错
很多时候我们都会打错字~实在很麻烦~所以如果上述两点你都确认过了,接下来请检查一下你的打字有没有问题。
假设我的 xen 文件是放置到 /disk2/xen/xen.img 里头,那么两个地方要注意:
[root@linux ~]# vi /etc/xen/centos5
name = "centos5"
kernel = "/boot/vmlinuz-2.6.18-8.1.14.el5xen"
ramdisk = "/boot/initrd-2.6.18-8.1.14.el5xen.vbird.img"
memory = "128"
vcpus = 1
vif = [ '' ]
disk = [ 'tap:aio:/disk2/xen/xen.img,sda1,w' ]
root = "/dev/sda1 ro"
|
模拟的装置 (disk 项目内) 以及根目录的所在装置 (root 的项目) 需要配合成功,否则就会失败了!
当然啦,模拟的装置也必须要跟实际的文件相同才行喔!
domain-U 本身的问题
如果开机已经到达下面的状况时:
unmounting old /sys
INIT: version 2.86 booting
Welcome to CentOS release 5 (Final)
Press 'I' to enter interactive startup.
正在设定时钟 (localtime): 三 10月 17 13:24:28 CST 2007 [ 确定 ]
正在启动 udev: [ 确定 ]
....中间省略....
正在检查文件系统
Checking all file systems.
[/sbin/fsck.ext3 (1) -- /] fsck.ext3 -a /dev/hda1
fsck.ext3: No such file or directory while trying to open /dev/hda1
/dev/hda1:
The superblock could not be read or does not describe a correct ext2
filesystem. If the device is valid and it really contains an ext2
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
e2fsck -b 8193
[失败]
*** 检查文件系统时发生错误。
*** 系统将带您进入 shell 模式; 然后重新开机
*** 当您离开 shell 时。
Give root password for maintenance
(or type Control-D to continue):
|
注意到上面特殊字体的部分,既然已经出现了 INIT 的字样,这表示 domain-U 已经通过了核心探测、
根目录挂载等动作,且已经顺利的在执行 /sbin/init 这个指令了,因此我们可以确信所有的 Xen 设定都是正确的,
可能发生的错误就在 /disk2/xen/xen.img 这个文件内的配置了。你可能需要依据开机流程一个一个的去处理相关的错误喔!
最可能发生的就是在 domain-U 的 /etc/fstab 啰~
其他半虚拟化的安装方式
由前一小节的泛用实例我们可以了解,如果 domain-U 的根目录来源为复制自 domain-0 的话,
那么我们必须要手动修改很多设定档,非常的麻烦~
既然如此,有没有可能我们可以自行将安装程序放入根目录的建置呢?也就是说,
那个 /disk2/xen/xen.img 的内容其实就是经过安装程序而来的,而不是经由复制的。
如此一来不就所有问题都解决了,而且新安装的系统还是很干净的系统呢!
确实如此!目前 CentOS 5 提供一个好用的软件,那就是 virt-install,
你可以使用 virt-install -h 来察看可以使用的指令哩。
但是在开始底下的实例之前,你必须要知道几点限制才行:
- 最简单的安装方式为复制 domain-0 的根目录来给 domain-U 使用(就是前面的范例);
- 半虚拟化的安装方式‘并不支援使用光碟或 DVD 的安装模式’;
- 半虚拟化仅可透过 http, ftp, nfs 等方式来安装干净的 Linux 系统;
看到上头的限制您应该会吓一跳吧!怎么不能用原版光碟安装喔?没错~是这样!
使用原版光碟或者是原版光碟的 iso 文件安装时,仅有全虚拟化环境可以达到而已。
那你应该会问,我如何制作或者是取得安装用的服务器呢?其实我们可以利用各大专院校的 FTP 网站即可啊!
不需要自行设定安装服务器的。不过,如果你的环境并非学术网络的话,最好还是自行设定一下安装服务器比较妥当。
为了每位不同所在处的朋友,所以底下我们先快速的讲一讲如何制作一台安装服务器,然后再处理其他工作吧! ^_^
制作安装服务器
(Installation Server)
如前所述,半虚拟化的 Xen 仅支援 NFS, HTTP, FTP 等网络方式安装,并不支援原版光碟安装的模式,
因此我们得要找到可提供安装的主机才行。如果您在台湾的学术网络中,
那么可以选择国家高速网络中心或者是义守大学的 FTP 网站做为来源,举例来说,如下网址就是一个案例:
万一你是一家企业呢?那最好使用内部的主机搭建成为安装服务器来安装你的 domain-U 比较妥当。
以下鸟哥以 NFS 的方式来简单说明一下建置 CentOS5 的安装服务器啰。
- 选择容量大于 5GB 以上的磁碟分割槽:
由于完整的 CentOS5 原版光碟含有好多的套件,至少也需要 3500MB 以上的容量来容纳 DVD 碟内的所有资料。
但是鸟哥的主机当初没有额外规划扩充性的问题,因此就得要加挂硬碟啦!
鸟哥是将我的 CentOS5 原版光碟放置到俺的 /disk1/yum/centos5 目录下的,
这个目录为另外一个独立的 partition ,关于 partition 的处理方法请自行参考基础篇的说明,这里不赘述了。
- 复制所有需要的套件:
先挂载 CentOS5 的光碟或 DVD 碟,然后直接复制即可:
[root@linux ~]# mount /dev/cdrom /mnt
[root@linux ~]# mkdir -p /disk1/yum/centos5
[root@linux ~]# cp -a /mnt/* /disk1/yum/centos5
[root@linux ~]# umount /mnt
|
如果你是使用光碟的话,那么上述的动作就得要进行六次,因为 CentOS5 共有六片光碟。
而且每片光碟内会有一些重复的文件,因此系统会警告你‘是否要覆盖?’此时按下‘y’去覆盖即可。
- 建立安装所需要的文件关连性资料
一般来说,使用 yum 的系统在他 RPM 文件所在的目录下都会有一个名为 repodata 的目录,
该目录记录着文件的相关性以及一些基本的安装资讯。但因为我们将资料复制到自己的主机上,
因此一些基本资料可能就不会吻合,所以我们需要重新制作出这个目录才行。
制作这个目录必须要安装 createrepo 套件,预设的情况下是不会安装该套件的,
因此我们可以这样做:
[root@linux ~]# yum install createrepo
# 就是安装某个套件而已,这个套件就是用在制作 repodata 目录的。
[root@linux ~]# cd /disk1/yum/centos5
[root@linux centos5]# cp repodata/comps.xml /tmp
# 先将某些安装资讯给他复制出来,准备利用。
[root@linux centos5]# rm -r repodata
# 原本的资料不需要了,将他删除掉再说。
[root@linux centos5]# createrepo -g /tmp/comps.xml .
# 重新建立好 repodata 目录啰!
|
- 启动与设定 NFS 文件系统
接下来就是设定 NFS 啦!为什么要选择 NFS 呢?因为他够简单!哈哈!
[root@linux ~]# vi /etc/exports
/disk1/yum/centos5 *(ro)
# 先设定好 NFS 所要分享的目录所在
[root@linux ~]# chcon -t public_content_t -R /disk1/yum/centos5/
# 确定一下你的这个目录是可以透过 SELinux 来管理分享的!
[root@linux ~]# /etc/init.d/portmap start
[root@linux ~]# /etc/init.d/nfs start
[root@linux ~]# /etc/init.d/nfslock start
# 将服务给他启动吧!
[root@linux ~]# showmount -e localhost
Export list for localhost:
/disk1/yum/centos5 *
|
如果可以看到最终的结果,那就表示你的 NFS 制作妥当了!
最终可以知道我们是:
- 安装协定使用 NFS
- 主机名称为你这部主机的 IP, 注意,不要使用 127.0.0.1 来安装!
- NFS 的路径为 /disk1/yum/centos5
好了,开始来安装干净的 Linux 系统在 domain-U 上面吧!
利用 virt-install
指令安装干净的 CentOS
CentOS5 所提供的一个实例
虽然 virt-install 已经有够好用了,不过在某些情况下还是无法执行的。首先, virt-install 要求 domain-U
在安装时一定要给予 256MB 的记忆体,如果你的记忆体少于 256MB 时,肯定无法执行 virt-install ~
再者在 SELinux 启动的情况下,可能还会有无法执行 virt-install 的情况发生。
还好, CentOS5 提供了一个可以驱动安装程序的核心给我们来进行安装过程!
接下来我们将以 CentOS5 官网所提供的 kernel file 来进行安装的实作喔!
其实整个过程挺简单的,最重要的就是必须要使用 CentOS5 官网所提供的核心与虚拟磁碟映像档,
有这两个东西就能够处理安装的程序了。底下我们就一步一步来处理这个设定吧!
0. 建立网络连线所需的 DHCP 服务器
在预设的情况下 Xen 使用的网络环境为利用桥接方式 (bridge) 来连结实际的网络环境。
但在这种模式底下 domain-U 在安装时,取得 IP 的方式主要为利用 dhcp 协定,
使用手动的方式来设定 IP 却是不可行的方案!除非要转成利用 NAT 的模式来处理。
假设我们都先不更改 Xen 的预设环境,那么我们就得要针对 Xen 的网络模式来建立一台 dhcp 服务器了。
详细的 dhcp 服务器建置方法请参考 服务器搭建篇的介绍,
鸟哥在这里仅利用一些时间很快的将整个流程处理一下吧!
需要注意的是,如果你的网络内已经有一个 public 的 dhcp 了,那么您在建置这个给 domain-U 用的 DHCP 时,
特别留意不要影响到其他的 dhcp 主机喔!鸟哥这里假设我的 domain-U 的 MAC 为 00:16:3E:00:00:11 ,
所以有针对这个 MAC 来处理喔!
1. 先检查你的 domain-0 是否有安装 dhcp 呢?
[root@linux ~]# rpm -qa | grep dhcp
dhcp-3.0.5-5.el5
# 如果没有出现上述的套件时,请自行使用 yum install dhcp 吧!
2. 修改 DHCP 的设定档
[root@linux ~]# vi /etc/dhcpd.conf
ddns-update-style none;
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.254;
option subnet-mask 255.255.255.0;
option domain-name "xen.test";
option domain-name-servers 168.95.1.1;
range 192.168.1.20 192.168.1.25;
default-lease-time 21600;
max-lease-time 43200;
host dic1 {
hardware ethernet 00:16:3E:00:00:11;
fixed-address 192.168.1.31;
}
}
# 鸟哥就是利用那个 hardware ethernet 来控制某个网卡来源的要求的啦!
3. 启动与观察
[root@linux ~]# /etc/init.d/dhcpd start
[root@linux ~]# netstat -tlunp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:67 0.0.0.0:* 22285/dhcpd
# 重点在那个 port 67 啰~
4. 防火墙的处理!
[root@linux ~]# iptables -I INPUT -p udp --dport 67 -j ACCEPT
[root@linux ~]# iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 重点在开放用户端对于主机的连线啰!这个要设定好!
|
如此一来 DHCP 主机就设定好了,简单吧!再来开始其他的处理吧!
1. 建立 domain-U 所需要的虚拟磁碟
同样的,利用 dd 这个指令来建立他吧!鸟哥依旧将我的映像档放置到 /disk2/xen 底下去。
[root@linux ~]# dd if=/dev/zero of=/disk2/xen/centos5.office.img \
> bs=1M count=3072 oflag=direct
[root@linux ~]# chcon -t xen_image_t /disk2/xen/centos5.office.img
[root@linux ~]# ll -Z /disk2/xen/centos5.office.img
-rw-r--r-- root root user_u:object_r:xen_image_t centos5.office.img
|
除了要建立这个大文件之外,不要忘记那个可爱又可怕的 SELinux 类型也需要同时变更!
这点大家都很容易忘记!包括鸟哥在内~ @_@
2. 设定终端机介面
这个动作在前面的小节中已经讲过了,这里特别再列出来,因为如果你没有作这个动作,
很可能在 domain-U 的地方会让您无法使用 console 的方式登入 domain-U
,届时您可能需要使用类似 ssh 的网络连线方式才能够登入 domain-U 哩!
而且,如果没有作这个动作,你的 domain-0 则会一直在 /var/log/messages 出现一些错误~实在讨厌~
实作的方法很简单:
[root@linux ~]# vi /etc/inittab
# 大约在第 51 行的地方加入底下特殊字体的部分:
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
co:2345:respawn:/sbin/agetty xvc0 9600 vt100-nav
# 意思是使用 agetty 建立 xvc0
[root@linux ~]# init q
# init q 这个指令可以让 /etc/inittab 的设定立刻生效而不需要重新开机!
[root@linux ~]# ln -s /dev/console /dev/xvc0
|
3. 下载 CentOS5 用来安装 Xen 的核心与映像档
CentOS5 官网提供的可安装 Xen 核心在底下的连结,分为 i386 与 x86_64 版本:
鸟哥使用的是 i386 的版本。下载与处理的方式可以这样做:
[root@linux ~]# cd /boot
[root@linux boot]# wget \
> http://mirror.centos.org/centos/5/os/i386images/xen/vmlinuz
[root@linux boot]# wget \
> http://mirror.centos.org/centos/5/os/i386images/xen/initrd.img
# 先下载这两个文件下来,为了方便记忆,所以鸟哥习惯将档名修改一下:
[root@linux boot]# mv vmlinuz centos5_xen_vmlinuz
[root@linux boot]# mv initrd.img centos5_xen_initrd.img
[root@linux boot]# restorecon /boot/*
# 最后一个动作 (restorecon) 在处理 SELinux 的问题啦!
|
所以我们已经取得 CentOS5 官网所提供的核心与映像档了!准备处理设定档啰~
4. 撰写‘安装用’设定档
接下来我们得先就可安装的核心来进行设定档的编写。我这里比较有趣的地方在于几个部分:
- 我具有 NFS 安装服务器,该服务器 IP 为 192.168.1.254,路径为 /disk1/yum/centos5
- domain-U 在安装时的 MAC 假设为 00:16:3e:00:00:11,且透过 DHCP 取得 IP;
- 使用 kickstart 方式来安装,而 kickstart 的设定档放置到安装服务器的 /disk1/yum/centos5/ks.xen.centos5.txt 内
什么是 kick start 呢?我们刚刚在前一小节使用 virt-install 安装时,不是有很多的选择画面吗?
所谓的 kick start 就是将所有的选择项目都写入某一个设定档,如此一来,就可以免除手动去挑选的困扰了。
因此,我们会有两个文件需要建立。首先,我们建立 Xen 的设定档,文件如下:
[root@linux ~]# vi /etc/xen/centos5_xen_install
kernel = "/boot/centos5_xen_vmlinuz"
ramdisk = "/boot/centos5_xen_initrd.img"
extra = "text ks=nfs:192.168.1.254:/disk1/yum/centos5/ks.xen.centos5.txt"
name = "centos5_xen_install"
memory = "128"
disk = [ 'file:/disk2/xen/centos5.office.img,xvda,w', ]
vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0', ]
vcpus = 1
on_reboot = 'destroy'
on_crash = 'destroy'
# 上面比较特别的只有那个 extra 而已,那个是核心的额外参数说明!
|
我们还得建立 kick start 的设定档内容。其实你的 CentOS 本来就有 kickstart 的设定档了,
详情请参考你自己的 /root/anaconda-ks.cfg 文件,您就晓得啰!更详细的 kickstart 请先参考如下网页:
鸟哥这里仅作个简单的设定而已:
[root@linux ~]# vi /disk1/yum/centos5/ks.xen.centos5.txt
# 1. 与安装有关的设定,尤其是 NFS 的设定最要紧!
install
nfs --server=192.168.1.254 --dir=/disk1/yum/centos5
# 2. 语系的支援以及键盘对应表
lang en_US.UTF-8
langsupport --default en_US.UTF-8 zh_TW.BIG5 zh_TW.UTF-8 zh_HK.UTF-8 \
zh_CN.GB18030 en_US.UTF-8
keyboard us
# 3. 网络设定,记住,要与 NFS 安装服务器同网络才行!
network --device eth0 --bootproto dhcp
# 4. 密码与防火墙还有 SELinux 与时区的相关设定
rootpw --iscrypted $1$NGE.r9ik$D9iqc2bfdpi1DYvqC2CwP.
firewall --enabled --port=
authconfig --enableshadow --enablemd5
selinux --enforcing
timezone Asia/Taipei
# 5. 开机管理程序,注意那个 driveorder 项目,我们的硬碟是虚拟的喔!
bootloader --location=mbr --driveorder=xvda --append="console=xvc0"
reboot
# 6. 磁碟分割表的操作以及安装的套件资料
clearpart --all --initlabel --drives=xvda
part /boot --fstype ext3 --size=100 --ondisk=xvda
part / --fstype ext3 --size=2048 --ondisk=xvda --asprimary
part swap --size=512 --ondisk=xvda
%packages
@core
# 如果你曾经安装过 Linux ,那么上面的选项对你来说,应该不难了解。
# 比较特殊的是 rootpw 那个项目,鸟哥是由 /etc/shadow 复制加密的密码来的,
# 如此则 root 的密码也设定妥当,而且是加密过的资料。
# 在本案例中的 root 密码为 123456789 喔!
[root@linux ~]# chcon -t public_content_t \
> /disk1/yum/centos5/ks.xen.centos5.txt
|
如此则将两个设定资料给他设定好了。接下来就是进行安装的流程喔~
5. 实际安装过程
实际安装真是太简单了!直接启动 Xen 即可啊!请下达:‘xm create -c centos5_xen_install’吧!
然后在出现一小段时间的 IP 探测、硬体探测、套件资料分析等画面后,就会主动的进入实际安装套件的画面!
接下来我们啥事都不需要担心,所有的安装过程 kickstart 系统都会帮我们搞定的。
实际上,你要做的就只是...喝茶看报纸吧!不过如果你的 domain-0 系统非常的高效能,
老实说,喝茶的时间实在是不够用~ @_@,因为可能 3 分钟就安装完毕了~ ^_^
kickstart 就是这么好用!你可以将这一组设定放在你的安装服务器上面,未来想要安装一模一样的环境时,
直接在安装的过程载入这个文件即可,我们不需要还手动挑选有的没有的啦! ^_^
6. 修改成为可以正常开机的设定档
在上述第四个步骤时,我们所建立的 /etc/xen/centos5_xen_install 是专门用来安装用的设定档。
既然已经安装妥当了,这个文件就不能继续的使用,否则每次都会重复的进入安装的画面,
会一直不断的重新安装....
所以接下来我们得要修改一下设定档才行。设定档可以改成底下的模样喔:
[root@linux ~]# vi centos5_xen_run
name = "centos5_xen_run"
memory = "128"
disk = [ 'file:/disk2/xen/centos5.office.img,xvda,w', ]
vif = [ 'mac=00:16:3e:00:00:11, bridge=xenbr0', ]
vcpus = 1
on_reboot = 'restart'
on_crash = 'restart'
bootloader = "/usr/bin/pygrub"
# 其实就是加入那个 pygrub 的执行档而已。该文件的作用就是
# 作为一个开机载入器来载入 domain-U 开机所需使用的核心与虚拟磁碟。
|
接下来如果想要使用刚刚完成的 domain-U 来登入时,请使用:‘ xm create -c centos5_xen_run ’来启动吧!
启动的画面如下所示,你会发现,怎么透过终端机可以跟在荧幕前面一个模样!还能看到 grub 哩!
真是有够棒的!
图 3-26、启动 domain-U 的画面
选择好你所需要的开机选项后,嘿嘿!就能够在 pietty 之类的环境完整的操作你的 domain-U 了!
说实在的,用在教学上,实在是很棒的一个好主意!
参考资料
2007/10/20:经过多日的奋战,终于将 Xen 的半虚拟化安装与操作的方法写出来!全虚拟化的部分还在构思中~
2007/10/24:透过网友 lvan 的回报,发现没有建置 /dev/xvc0 会有终端介面的问题,所以补上;
2007/10/24:同样透过 lvan 兄的回报,可以使用 [ctrl]-] 来离开 domain-U 的终端介面!谢谢 lvan 兄!
2008/09/09:感谢讨论区网友donyingle提供的AMD的64位元CPU的相关资讯,终于有CPU的flags了!
|
|