介绍
什么是JeOS
Ubuntu JeOS (发音为“Juice“)是一个高效的Ubuntu服务操作系统的变体,专门配置给虚拟应用。不再提供有效的CD-ROM ISO下载,但可以下面的方式获取:
• 当安装服务器版ISO(在第一屏按F4,将允许你选择“最小化安装“,这就是JeOS)。
• 或者用Ubuntu的vmbuilder来建造,接下来将描述怎么建造。
JeOS 是Ubuntu 服务器版本调整过内核的,仅包含基本的元素,在一个虚拟环境运行的,特定的装置。
Ubuntu JeOS已经被调整过,充分利用从最新的虚拟化产品VMware那里获得关键高效技术。减少大小,优化性能,确保Ubuntu JeOS版本成为一个在大型虚拟机部署高效的理由服务器资源。
没有不必要的驱动,最少的包需求,ISVs可以根据需要,精确配置他们支持的OS。 根据是否安全和增强的原因来平静的升级,被限制到,根据他们特定的环境来完全最少化。另外,比起完全标准安装一个服务器来讲, 用户部署到 JeOS的虚拟应用,将很少升级和维护。
什么是 vmbuilder
使用vmbuilder,就没有必要系在JeOS的 ISO。 vmbuilder将获取不同的包,在短时间内根据你的需要建造一个虚拟机。vmbuilder是一个脚本,自动创建一个基于VM的Linux。 当前支持的管理器包括 KVM 和 Xen。
你可以通过命令行选项,增加包,删除包,选择哪一个版本的Ubuntu, 哪一个镜像等等。在现有有大量的RAM的硬件上,tmpdir 在 /dev/shm 下,或者使用一个tmpfs, 和一个本地镜像,你可以在一分钟内启动一个VM。
介绍在Ubuntu 8.04 中作为shell script的ubuntu-vm-builder,帮助开发者在虚拟机中测试代码,不要每次都重启做了修改的系统。一些Ubuntu的管理员已经开始注意这个脚本,他们中的一些人想改良它,调整达到更多的用法。Soren Hansen 用python重写了它,为了新的目标:
• 它可以被其他的分发重用
• 为所有的虚拟交互使用一个插件机制,其他人也可以很容易的为其他虚拟环境增加 logic
• 提供一个容易维护的web接口,为命令行接口的增加一个选择
但基本概念和命令保持不变。
初始化设置
假定你已经在你使用的机器上安装了libvirt和KVM,详细的安装步骤请看:
• libvirt
• KVM Wiki https://help.ubuntu.com/community/KVM
我们同样假定你知道怎么使用文本编辑器,比如nano或者vi。如果你以前没有用过他们,你可以使用其他的有效的文本编辑器,参考内容 PowerUsersTextEditors https://help.ubuntu.com/community/PowerUsersTextEditors 。
这个方法KVM支持,但从一般概念上来讲,其他的虚拟话技术也行。
安装 vmbuilder
需要安装的包叫 python-vm-builder。在终端提示符下输入:
sudo apt-get install pythone-vm-builder
注意:如果你运行Hardy,你可以仍然执行安装旧的包,名字为 ubuntu-vm-builder。两者只是在语法上有稍微的改变。
定义你的虚拟机
使用Ubuntu的vmbuilder来定义虚拟机十分简单,但还是有一些需要考虑的地方:
• 如果你要移动你的虚拟装置, 不要假定最终用户知道怎么根据他们的需要来扩充磁盘的大小,因此需要一个大型的虚拟磁盘来你的应用使用,或者在你的文档里解释怎么分配更多的空间。实际上,比较好的办法是在独立的外部控件存储数据。
• 在一个VM中,让RAM更容易分配,根据你的应用需要,RAM应该被设置为你认为的一个安全最小的大小。
vmbuilder命令有两个主要的参数: 虚拟话技术(hypervisor)和目标分发。可选的参数很多,可以通过下面的命令行找到:
vmbuilder –help
基本参数
这里的例子是基于KVM和Ubuntu 10.04 LTS(Lucid Lynx),我们要多次重建同样的虚拟机,使用第一个参数,调用下面的vmbuilder:
sudo vmbuilder kvm ubuntu –suite lucid –flavour virtual –arch i386 -o –libvirt qemu:///system
–suite 定了Ubuntu的发行版本, –flavour 指定我们想要使用虚拟内核(这是用来建造JeOS image的), –arch 说明我们想要在一个32位的机器上, -o 要 vmbuilder 去覆盖前面版本的VM , –libvirt 报告本地虚拟环境,增加结果VM到有效机器的列表。
注意:
• 由于vmbuilder执行操作的性质,需要root权限,使用sudo
• 如果你的虚拟机要使用超过3G的RAM,你需要建造一个64bit的机器(–arch amd64)
• 到Ubuntu 8.10为止,仅能建造32bit架构的虚拟内含,因此如果你想在 Hardy 上定义一个amd64机器,你应该使用 –flavour server 。
JeOS 安装参数
JeOS 网络
赋予一个固定的IP地址
一个虚拟装置可以被部署到各种不同的网络,很难知道实际的网络是怎么样的。为了简化配置,使用和网络硬件提供商通常使用的方法,在一个私有级别的网络,声明赋予一个固定IP给虚拟装置,在你的文档中说明。地址范围 192.168.0.0/255 是个不错的选择。
这样一来,我们需要用到以下参数:
–ip ADDRESS: IP地址 (如果没有指定,缺省dhcp)
–mask VALUE:IP掩码(缺省 255.255.255.0)
–net VALUE:IP网络地址(缺省 X.X.X.0)
–bcast VALUE:IP广播(缺省 X.X.X.255)
–gw ADDRESS: 网关地址(缺省 X.X.X.X.1)
–dns ADDRESS: 域名服务器地址(缺省 X.X.X.1)
我们假设缺省值是可用的,那这条命令将是:
sudo vmbuilder kvm ubuntu –suite lucid –flavour virtual –arch i386 -o –libvirt qemu:///system -ip 192.1.68.0.100
为使用 bridging 修改 libvirt 模板
因为我们的装置需要被远程主机访问,我们需要配置libvirt,让装置使用桥接网络。要做到这一点,我们使用vmbuilder的模板机制来修改缺省的模板.
在我们的工作目录,我们创建模板层级,拷贝缺省的模板:
mkdir -p VMBuiblder/plugins/libvirt/templates
cp /etc/vmbuilder/libvirt/* VMBuilder/plugins/libvirt/templates
编辑 VMBuilder/plugins/libvirt/templates/libvirtxml.tmpl ,修改:
<interface type=’network’>
<source network=’default’/>
</interface>
为:
<interface type=’bridge’>
<source bridge=’br0′/>
</interface>
分区
虚拟装置的分区应根据你的计划来考虑。大多数的装置想要一个数据存储控件,持有一个独立的 /var 是有道理的。
为了达到这个目的,vmbuilder提供 –part :
–path PATH
允许你在一个分区文件内指定分区表, 定位为 PATH。分区文件的每一行都要说明(根优先):
moutpoint size
size 的单位是MB。你可以拥有4个以上的虚拟磁盘,一个新的磁盘使用一行 ‘—‘来标识。例如:
root 1000
/opt 1000
swap 256
—
/var 2000
/log 1500
在我们的例子中,定义一个文本文件 vmbuilder.partition ,包含下面的内容:
root 8000
swap 4000
—
/var 20000
注意:我们用的是虚拟磁盘images,这里定义的实际大小是最大容量。
现在,命令行就变成这样了:
sudo vmbuilder kvm ubuntu –suite lucid –flavour virtual –arch i386 \
-o –libvirt qemu:///system –ip 192.168.0.100 –part vmbuilder.parttion
用户名与密码
设置一个虚拟装置,你需要提供一个缺省的用户名和密码,在你的文档里说明这个。在后面,我们讲述一下安全知识,定义一个脚本,在用户首次登录虚拟装置时运行,除了其他的事情,还提示用户修改密码,在这里例子中,我使用‘user‘作为我的用户名,‘default‘作为密码。
使用下面的可选参数:
• –user USERNAME: 设置用户的名字。 缺省是 ubuntu
• –name FULLNAME:设置用户的全名。缺省是 ubuntu
• –pass PASSWORD:设置用户的密码。缺省也是 ubuntu
现在,我们的命令行:
sudo vmbuilder kvm ubuntu –suite lucid –flavour virtual –arch i386 \
-o –libvirt qemu:///system –ip 192.168.0.100 –part vmbuilder.partition \
–user user –name user –pass default
安装需要的包
在这个例子里,我们安装一个包(Limesurvey),它访问一个MySQL数据库,拥有一个web接口。我们需要这个OS给我们提供这些:
• Apache
• PHP
• MySQL
• OpenSSH Server
• Limesurvey (作为我们必要打包的样例应用)
需要使用 –addpkg 选项多次:
–addpkg PKG
安装PKG到guest(可以被指定多次)
由于 vmbuilder操作的方式,在安装过程里需要提问的包不被支持,这些包应该在交互出现时安装。Limesurvey就是这样的例子,应该在登录后安装。
问简单debconf问题的其他的包,例如mysql-server要求设置密码,这包可以被即时安装,但我们需要在登录后进行重新配置。
如果要安装某些不在main仓库的包,我们需要打开附加仓库,使用 –comp 和 –ppa:
–components COMP1,COMP2,…,COMPN
用逗号分割需要包含的不同分发组件(例如,main,universe)。缺省为 main。
–ppa=PPA
增加PPA到vm的sources.list
在这个时候,Limesurvey不属于存档的一部分,我们指定它的PPA(个人包存档)地址,增加它到 VM 的 /etc/apt/source.list , 因此,增加下面的选项到命令行:
–addpkg apache2 –addpkg apache2-mpm-prefork –addpkg apche2-utils –addpkg apache2.2-common \
–addpkg dbconfig-common –addpkg libapache2-mod-php5 –addpkg mysql-client –addpkg php5-cli \
–addpkg php5-gd –addpkg php5-ldap –addpkg php5-mysql –addpkg wwwconfig-common \
–addpkg mysql-server –ppa nijaba
OpenSSH
为安全着想,使用预先编写的脚本,无须与用户交互,在第一次启动时安装。
速度考虑因素
包缓存
当使用vmbuilder来创建你的系统,它要通过网络从官方仓库中获取每一个需要的包,这需要依赖你的网络速度和服务器镜像的负载情况,这对实际的建造所需要的时间影响很大。为了减少这些影响,推荐使用一个本地仓库(用apt-mirror创建),或者使用一个缓存代理,如 apt-proxy 。后面的选项更容易实现,并且需要更少的磁盘控件,被本教程使用。要安装,输入:
sudo apt-get install apt-proxy
安装后,你的代理准备对 http://mirroraddress:9999 有效, 在路径 /ubuntu 下找到ubuntu仓库。 vmbuilder 要用它,使用 –mirror 选项:
–mirror=URL
使用 Ubuntu 镜像来代替缺省的仓库(http://archive.ubuntu.com/ubuntu 官方, http://ports.ubuntu.com/ubuntu-ports 其他)
因此,我们增加到命令行的内容为:
–mirror http://mirroraddress:9999/ubuntu
注意:这里的镜像地址也会被新创建的 guest 里面的 /etc/apt/sources.list 所拥有。在这里设定一个guest能解释的地址,或者需要在后面重设这个弟子,比如在一个 –firstboot 脚本。
安装一个本地镜像
如果在一个大型的环境里,建立一个Ubuntu仓库的本地镜像是很重要的。包apt-mirror提供一个脚本给你处理镜像问题。你应该给每个支持的发行版本提供20G的自由控件。
缺省 apt-mirror 使用 /etc/apt/mirror.list 里面说明的配置文件。仅支持本地架构,如果你想你的镜像支持其他架构,仅仅重复以“deb“开头的行,使用 /deb-{arch} 把 deb 关键字替换,arch 可以是i386,amd64,等等。例如在一个amd64的机器上,为拥有 i386的档案,你可以修改为:
deb http://archive.ubuntu.com/ubuntu lucid main restricted universe multiverse
/deb-i386 http://archive.ubuntu.com/ubuntu lucid main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu lucid-updates main restricted universe multiverse
/deb-i386 http://archive.ubuntu.com/ubuntu lucid-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ lucid-backports main restricted universe multiverse
/deb-i386 http://archive.ubuntu.com/ubuntu lucid-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu lucid-security main restricted universe multiverse
/deb-i386 http://security.ubuntu.com/ubuntu lucid-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu lucid main/debian-installer restricted/debian-installer universe/debian-installer multiverse/debian-installer
/deb-i386 http://archive.ubuntu.com/ubuntu lucid main/debian-installer restricted/debian-installer universe/debian-installer multiverse/debian-installer
注意源码包并没有放到镜像,因为很少会被用到,并且相对于二进制包,占据更多的磁盘控件,也是很容易就可以增加到列表中。
一旦镜像完成复制(需要很长的时间),你需要配置Apache,以致你的镜像文件(缺省 /var/spool/apt-mirror) 能发布到你的Apache服务器。更多的信息参考 “HTTPD-Apache2 Web Server” https://help.ubuntu.com/10.04/serverguide/C/httpd.html
安装一个RAM磁盘
如果你有足够的空闲内存,最好让 vmbuilder在RAMdisk里执行操作,加快进度:
–tmpfs OPTS 使用一个 tmpfs作为工作目录,指定它的大小或者 “-” 使用缺省设置(suid,dev,size=1G)。
如果你有1G以上的空闲内存,就使用 –tmpfs 吧。
打包应用
打包方法有两种:
• 推荐的方法是做一个Debian包。 如何打Debian包不是这个手册该讲述的时,我们在这里不使用这种方法,请读者自己看关于如何打包的文档。https://wiki.ubuntu.com/PackagingGuide
• 在/opt目录下,手动安装应用
在这里例子中,我们使用Limesurvey 作为样例Web应用,我们希望提供一个虚拟装置。就如在签名提到的,我们在PPA上做一个包的版本。
完成安装
第一次引导
我们在前面提到,机器第一次引导时,我们需要安装openssh-server,这样生成的key才是对每台机器来说是唯一的。为了做到这一点,我们写一个叫 boot.sh 的脚本:
# This script will run the first time the virtual machine boots
# It is ran as root
apt-get update
apt-get install -qqy –force-yes openssh-server
并且增加 –firstboot boot.sh 选项到我们的命令行。
第一次登录
Mysql和Limesurvey在setup的过程中需要和用户交互,我们编写一个脚本login.sh,在第一次用户登录时运行,来完成这些设置,同时使用这个脚本来让用户设置:
• 自己的密码
• 定义键盘和其他的locale信息
脚本 login.sh 内容如下:
# This script is ran the first time a user logs in
echo “Your appliance is about to be finished to be set up.”
echo “In order to do it, we’ll need to ask you a few questions,”
echo “starting by changing your user password.”
passwd
# give the opportunity to change the keyboard
sudo dpkg-reconfig console-setup
#install limesurvey
sudo apt-get install -qqy –force-yes limesurvey
echo “Your appliance is now configured. To use it point your”
echo “browser to http://serverip/limesurvey/admin”
然后,增加 –firstlogin login.sh 选项到我们的命令行。
有用的附件
配置自动升级
为了让系统能定期自动升级,我们安装 unattended-upgrades ,增加下面的选项到命令行:
–addpkg unattended-upgrades
当我们把我们的应用包放进一个PPA,每当我们更新PPA的版本,这个过程将不仅仅更新系统,而且更新应用。
ACPI事件处理
为了让你的虚拟机能处理它发出的重启和关闭事件,安装 acpid包是个好办法。增加下面的选项:
–addpkg acpid
最后的命令
这条的命令包含上面所有讨论过的选项:
sudo vmbuilder kvm ubuntu –suite lucid –flavour virtual –arch i386 -o \
–libvirt qemu:///system –ip 192.168.0.100 –part vmbuilder.partition –user user \
–name user –pass default –addpkg apache2 –addpkg apache2-mpm-prefork \
–addpkg apache2-utils –addpkg apache2.2-common –addpkg apache2-mpm-prefork \
–addpkg libapache2-mod-php5 –addpkg mysql-client –addpkg php5-cli \
–addpkg php5-gd –addpkg php5-ldap –addpkg php5-mysql –addpkg wwwconfig-common \
–addpkg mysql-server –addpkg unattended-upgrades –addpkg acpid –ppa nijaba \
–mirror http://mirroraddress:9999/ubuntu –tmpfs – –firstboot boot.sh \
–firstlogin login.sh
资源
如果你有兴趣学到更多,或者有什么问题建议,请联系Ubuntu Server Team:
• IRC : #ubuntu-server on freenode
• 电邮列表: ubuntu-server at lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-server
• 也可以去看 JeOSVMBuilder Ubuntu Wiki https://help.ubuntu.com/community/JeOSVMBuilder