为云计算创建预捆绑的机器映像

作者:Kiran C. Nair

学习如何创建预先捆绑了 Oracle WebLogic Server 11g 和 Oracle Database XE 的自 定义机器映像,并学习创建初始化脚本、配置服务以用户定义的运行级别运行的基本知识。

2009 年 11 月发布

下载
 用于 Linux 的 Oracle WebLogic Server 安装程序
 用于 Linux 的 Oracle Database 10g 快捷版

云服务提供商(如 Amazon Web Services (AWS))使用平台虚拟化技术提供对运行在共享硬件基 础架构上的软件的远程访问。平台虚拟化采用机器映像这一概念,机器映像可以虚拟地驻留在远程平 台上,从而使用户可以不受限制地访问底层基础架构。

在本教程中,您将学习如何创建预先捆绑了 Oracle WebLogic Server 11gOracle Database 10g 快捷版 (XE) 的自定义虚拟 机映像。另外,您还将学习创建初始化脚本、配置服务以用户定义的运行级别运行的基本知识。这将 使创建的映像能够充分利用云计算提供的按需可伸缩性,一旦实例启动,预捆绑的应用程序或服务就 能够开始为请求提供服务。

本教程遵循的过程是一个通用的过程。用户可根据自己的喜好或要求来定制预捆绑的应用程序和 实用程序。还应注意的是,我们创建的映像不仅可用于 AWS,还与所有使用 Xen 作为虚拟机监控程 序层的云(如 Eucalyptus Open Cloud)完全兼容。

(注:Oracle 在 AWS 上认证/支持和许可许多自己的产品,还为 Oracle Enterprise Linux 上 的几个 Oracle 产品免费提供预置的虚拟机模板,有关完整列表请参见云计算中心。)

 

开始之前



本教程逐步指导您创建定制的映像 — 包括安装应用程序、配置映像、编写启动脚本以及配 置服务运行于指定的运行级别 — 从而使这些映像可以部署到云基础架构上。在本教程中,我 们将:

  • 把一个 Centos 5.2 基本映像与 Oracle WebLogic Server 和 Oracle Database XE 绑定在一起
  • 安装其他程序包(如 vi、FTP 和必需的相关程序包)
  • 配置网络连接、口令等
  • 创建初始化脚本
  • 配置实例启动时要运行的服务(FTP、网络连接等)和应用程序(Oracle WebLogic Server 和 Oracle Database XE)

先决条件

使用环回挂载基本映像

调整映像文件大小

基本映像文件可能没有足够的存储空间来容纳自定义应用程序,因此我们可能需要调整其大小。 我们可以调整该文件大小使其满足我们的需要。下面我们将一个 1GB 大小的映像文件调整为 4GB:

[root@localhost Image]# ls -s
total 1026032
                               
1026032 centos.5-2.img
[root@localhost Image]# dd if=/dev/zero of=
centos.5-2.img
bs=1M conv=notrunc count=1 seek=4000 #This resizes the image to 4GB. [root@localhost Image]# losetup /dev/loop1
centos.5-2.img
#loop1 had to be used as xen was already running a different domU via loop0. [root@localhost Image]# e2fsck -f /dev/loop1 [root@localhost Image]# resize2fs /dev/loop1 [root@localhost Image]# e2fsck -f /dev/loop1 [root@localhost Image]# losetup -d /dev/loop1 [root@localhost Image]# ls -s total 4100032
4100032 centos.5-2.img

通过环回挂载映像文件

现在可将大小调整后的映像文件挂载到一个本地挂载点,以便根据我们的需要对其进行修改和配 置。我们还会将本地处理器挂载到 ./mount-point/proc 文件夹中,以便在练习中使用该处理器作为 临时处理器。

#make a mountpoint
mkdir centos

#Mount Image 
mount -o loop ./centos.5-2.img ./centos

#Mount the Proc
mount -t proc none ./centos/proc/

安装其他程序包

挂载的基本映像将包含为了支持一个根文件系统(本例中为 Centos 5.2)所需的最小的程序包集 。我们还可添加其他程序包以提供额外的功能。下面我们将安装其他三个程序包集:vsftpd Server (一个用于 UNIX 之类系统的常用 FTP 服务器)、vi(常用的命令行文本编辑器)以及 Oracle 数 据库快捷版需要的相关程序包。

注意:对于本教程,应下载以下 RPM:

vim-common-7.0.109-3.el5.3.i386.rpm(vi 编辑器)
vim-minimal-7.0.109- 3.el5.3.i386.rpm(vi 编辑器)
logrotate-3.7.4-8.i386.rpm(vsftpd 的相关程序包)
vsftpd-2.0.5-12.el5.i386.rpm (vsftpd)
libaio-0.3.96-7.i386.rpm(Oracle Database XE 的相关程序包)
bc-1.06-21.i386.rpm(Oracle Database XE 的相关程序包)

现在,我们将这些额外的程序包及其相关程序包安装到挂载的映像中:
                               
#Install Additional Packages

[root@localhost Image]# rpm --root=/home/kiran/Oracle/Image/centos -Uvh 
/home/kiran/Oracle/Image/RPMs/vim-common-7.0.109-3.el5.3.i386.rpm
Preparing...               ########################################### [100%]
   1:vim-common            ########################################### [100%]

[root@localhost Image]# rpm --root=/home/kiran/Oracle/Image/centos -Uvh 
/home/kiran/Oracle/Image/RPMs/vim-minimal-7.0.109-3.el5.3.i386.rpm
Preparing...               ########################################### [100%]
   1:vim-minimal           ########################################### [100%]

[root@localhost Image]# rpm --root=/home/kiran/Oracle/Image/centos -Uvh 
/home/kiran/Oracle/Image/RPMs/logrotate-3.7.4-8.i386.rpm
Preparing...               ########################################### [100%]
   1:logrotate             ########################################### [100%]

[root@localhost Image]# rpm --root=/home/kiran/Oracle/Image/centos -Uvh 
/home/kiran/Oracle/Image/RPMs/vsftpd-2.0.5-12.el5.i386.rpm
Preparing...               ########################################### [100%]
   1:vsftpd                ########################################### [100%]


#Install XE Dependencies

[root@localhost Image]# rpm --root=/home/kiran/Oracle/Image/centos -Uvh 
/home/kiran/Oracle/Image/RPMs/libaio-0.3.96-7.i386.rpm
warning: /home/kiran/Oracle/Image/RPMs/libaio-0.3.96-7.i386.rpm: 
Header V3 DSA signature: NOKEY, key ID 025e513b
Preparing...               ########################################### [100%]
   1:libaio                ########################################### [100%]

[root@localhost Image]# rpm --root=/home/kiran/Oracle/Image/centos -Uvh 
/home/kiran/Oracle/Image/RPMs/bc-1.06-21.i386.rpm
Preparing...               ########################################### [100%]
   1:bc                    ########################################### [100%]

                            

工作于 chroot 监牢环境

将 Oracle Database XE 安装程序和 Oracle WebLogic Server(安装程序加上预创建的域 .tgz )移至映像挂载点中

我们将在映像挂载点中安装 Oracle Database XE 和 Oracle WebLogic Server。这样做之前,需 要将这些安装程序和所需的文件移至映像挂载点中必要的文件夹下。我们将在映像挂载点中创建一个 文件夹 (./centos/root/install)。

[root@localhost Image]# mkdir ./centos/root/install
#Moving the Oracle XE RPM
[root@localhost Image]# mv /home/kiran/Oracle/Image/RPMs/
oracle-xe-univ-10.2.0.1-1.0.i386.rpm ./centos/root/install/
#Moving the Oracle Weblogic Binary Installer
[root@localhost Image]# mv /home/kiran/Oracle/Image/RPMs/wls1031_linux32.bin 
./centos/root/install/
[root@localhost Image]# mv /home/kiran/Oracle/Image/RPMs/CloudDomain.tgz 
./centos/root/install/

将根目录更改为挂载点

前面创建的映像挂载点 (./centos) 包含一个功能完备的基本 Linux 系统所需的所有文件和目录 结构。现在,我们可以使用 chroot 命令将根目录更改为此目录。此目录称为“chroot 监牢 ”。

[root@localhost Image]# cd ./centos
[root@localhost centos]# chroot .
bash-3.2#

更改映像的根口令并配置远程根登录

下面我们将为根用户设置一个自定义口令并配置 ssh 以允许根登录。(注:对于高安全性应用程 序,不鼓励使用这种方法。应使用 SSH 密钥对取代之。)

#Set root Password
bash-3.2# pwconv
bash-3.2# passwd
Changing password for user root.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
为了允许远程根登录,在 /etc/ssh/sshd_config 文件中将 PermitRootLogin no 更改为 PermitRootLogin yes。

安装并配置 Oracle Database XE

安装 Oracle Database XE RPM

现在我们在监牢环境下通过位于 /root/install 中的安装程序来安装 Oracle Database XE。

bash-3.2# rpm -Uvh /root/install/oracle-xe-univ-10.2.0.1-1.0.i386.rpm
Preparing...               ########################################### [100%]
   1:oracle-xe-univ        ########################################### [100%]
Executing Post-install steps...

You must run '/etc/init.d/oracle-xe configure' as the root user to
configure the database.
bash-3.2# rm -rf /root/install/oracle-xe-univ-10.2.0.1-1.0.i386.rpm
5.2 Configure Oracle Database Express Edition by running /etc/init.d/
oracle-xe configure
Run /etc/init.d/oracle-xe configure to open the command-line Oracle 
configuration wizard. 
Remember to enter "y" for the question "Do you want Oracle 
Database 10g Express Edition to be started 
on boot (y/n) [y]:" if you want the Oracle Database Express Edition 
service to be started at instance boot.
#Configure Oracle XE
bash-3.2# /etc/init.d/oracle-xe configure

Oracle Database 10g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 10g Express
Edition.  The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used for database accounts.  Press <enter> to accept the defaults.
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:8080

Specify a port that will be used for the database listener [1521]:1521

Specify a password to be used for database accounts.  Note that the same
password will be used for SYS and SYSTEM.  Oracle recommends the use of
different passwords for each database account.  This can be done after
initial configuration:
Confirm the password:

Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:y

Starting Oracle Net Listener...Done
Configuring Database...Done
Starting Oracle Database 10g Express Edition Instance...Done
Installation Completed Successfully.
To access the Database Home Page go to http://127.0.0.1:8080/apex

添加启动时可访问的必需环境变量

实例启动时运行的 scriptlet 保存在 rc.local 中。必需的环境变量(如 ORACLE_BASE 和 ORACLE_HOME)必须存在以便 Oracle Database XE 在运行时访问它们。

Edit /etc/rc.local and add the following lines:
ORACLE_HOME = /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/
ORACLE_BASE = /usr/lib/oracle/xe/app/oracle/
PATH=$PATH:/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin:$HOME/bin
export PATH
export ORACLE_HOME
export ORACLE_BASE

安装并配置 Oracle WebLogic Server

运行 Oracle WebLogic Server 二进制安装程序

现在我们将使用复制到 /root/install 文件夹中的二进制安装程序来安装 Oracle WebLogic Server:

#Install WebLogic
bash-3.2# chmod +x /root/install/wls1031_linux32.bin
bash-3.2# /root/install/wls1031_linux32.bin

########### Follow the steps in the Command Line Installation Wizard ########

bash-3.2# rm -rf /root/install/wls1031_linux32.bin

现在,Oracle WebLogic Server 存在于 /root/Oracle/Middleware/ 中。

将预创建的域解压缩到 /user_projects/domains/ 中

我们将使用在本地计算机上创建的一个域而不是手动创建一个域。也可以使用 /root/Oracle/Middleware/wlserver_10.3/common/bin/config.sh 脚本手动创建一个域。

#Move CloudDomain.tgz into folder and extract
bash-3.2# mkdir -p /root/Oracle/Middleware/user_projects/domains/
bash-3.2# mv /root/install/CloudDomain.tgz /root/Oracle/Middleware
/user_projects/domains/
bash-3.2# cd /root/Oracle/Middleware/user_projects/domains/
bash-3.2# tar -xzvf CloudDomain.tgz
bash-3.2# rm -rf CloudDomain.tgz

我们要使用的域已经备好,现在可使用 /root/Oracle/Middleware/user_projects/domains/CloudDomain/bin/startWebLogic. sh 脚本启动它。

创建初始化脚本以便在实例启动时启动域

云计算提供的按需可伸缩性使得应用程序随实例启动而启动成为必需,这样可最大程度减少用户 交互。在云上一旦启动一个新实例,该实例应立刻就能够开始为收到的请求提供服务。为使自定义应 用程序能充分利用此功能,需要将它们设置为服务,使其在系统启动时初始化和运行。

下面我们来创建一个初始化脚本,该脚本在实例启动时会启动我们的 Oracle WebLogic Server 域。在如下所示的初始化脚本中,我采用 /root/Oracle/Middleware/user_projects/domains/CloudDomain/bin/startWebLogic. sh 作为启动该域的脚本,/root/Oracle/Middleware/user_projects/domains/CloudDomain/bin/stopWebLogic.s h 作为停止该域的脚本。所创建的脚本名为 initWeblogic,保存在 /etc/init.d/ 目录中。

 #################Script Start#########################
#!/bin/sh
#
# chkconfig: 345 99 10
# description: Custom Script
#

SCRIPT_CMD="/root/Oracle/Middleware/user_projects/domains/CloudDomain
/bin/startWebLogic.sh"
SCRIPT_STOP="/root/Oracle/Middleware/user_projects/domains/CloudDomain
/bin/stopWebLogic.sh"
if [ -f /etc/init.d/functions ]; then
    . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions
else
    exit 0
fi

. /etc/sysconfig/network

[ ${NETWORKING} = "no" ] && exit 0

RETVAL=0

start() {
    echo -n "Starting WebLogic "
    $SCRIPT_CMD &
    RETVAL=$?
    [ $RETVAL -eq 0 ] && success || failure
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/myWebLogic
    echo
    return $RETVAL
}

stop() {
    echo -n $"Stopping WebLogic "
    $SCRIPT_STOP
    RETVAL=$?
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/myWebLogic
    echo
    return $RETVAL
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

exit $RETVAL
#################Script End#########################

此脚本可重用,我们可以使用它将任何自定义应用程序添加到 init.d 目录中。

激活/停用特定运行级别的服务

为了让服务在特定运行级别自动启动,要在 chkconfig 中进行指定。我们须遵循以下顺序:

  • 向 chkconfig --list 中添加服务(如果该服务不存在)
  • 指定应在哪些运行级别启动/关闭该特定服务

下面给出这一过程的细节:

bash-3.2# chkconfig --add initWeblogic
bash-3.2# chkconfig --level 345 initWeblogic on
bash-3.2# chkconfig --level 345 oracle-xe on
bash-3.2# chkconfig --level 345 vsftpd on
bash-3.2# chkconfig --list
initWeblogic    0:off   1:off   2:off   3:on    4:on    5:on    6:off
mcstrans        0:off   1:off   2:on    3:on    4:on    5:on    6:off
netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
netfs           0:off   1:off   2:off   3:off   4:off   5:off   6:off
netplugd        0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
oracle-xe       0:off   1:off   2:on    3:on    4:on    5:on    6:off
rdisc           0:off   1:off   2:off   3:off   4:off   5:off   6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
syslog          0:off   1:off   2:on    3:on    4:on    5:on    6:off
vsftpd          0:off   1:off   2:off   3:on    4:on    5:on    6:off

这将使 initWeblogic、oracle-xe 和 vsftpd 服务能够随着系统启动而启动,云上一旦创建了此 特定映像的一个新的实例,这些服务即可为请求提供服务。

停止服务并卸载映像

停止映像创建过程中启用的服务,退出 chroot 监牢环境

在 chroot 监牢环境中启动的服务(这些服务从重新路由到的文件夹中访问资源)会使将文件卸 载回映像所使用的 umount 命令抛出一个“device busy”错误。因此,让我们来停止在 chroot 监牢中启动的所有服务:

bash-3.2# service oracle-xe stop
Shutting down Oracle Database 10g Express Edition Instance.
Stopping Oracle Net Listener.
bash-3.2# service vsftpd stop
Shutting down vsftpd:                              [  OK  ]
bash-3.2#exit
exit
[root@localhost centos]#

将更改后的文件系统卸载回映像

为了向您提供单个映像文件 (centos.5-2.img) 以备捆绑并上载到 AWS,要执行下面最后一个步 骤:

[root@localhost centos]# cd ..
[root@localhost Image]# umount ./centos/proc/
[root@localhost Image]# umount ./centos

打包映像并将其上载到 AWS 中

用 ec2-bundle-image 打包映像

[root@localhost Image]#ec2-bundle-image -i ./centos.5-2.img -k 
<your ec2-key> -c <your ec2-cert> --user <your AWS-user-id> 

详情参阅 AWS 文档

用 ec2-upload-bundle 上载打包的映像

[root@localhost Image]#ec2-upload-bundle -b OracleBucket -m 
/tmp/centos.5-2.img.img.manifest.xml -a <your ec2-key> -s 
<your secret-key> 
详情参阅 AWS 文档

注册映像

[root@localhost Image]# ec2-register OracleBucket/centos.5-2.img.img.manifest.xml -k 
<your ec2-key> -c <your ec2-cert> --user <your AWS-user-id> 

一旦在 AWS 中注册了映像,它就成为一个 Amazon Machine Image (AMI)。我们可以在 EC2 上启 动此 AMI 的一个实例。一旦该实例启动,它会自动启动我们配置为在实例启动时运行的所有服务。 这样,一旦此实例运行,我们就能够直接访问驻留于新建域上的 Oracle Database XE 和 Oracle WebLogic Server。

屏幕截图

Oracle Database XE 位于 http://<cloud-domain>:8080/apex。

传输配置

Oracle WebLogic Server 11g 位于 http://<cloud-domain>:7001/console。

传输配置

总结

在本教程中,我们学习了如何创建预先捆绑了 Oracle WebLogic Server 11g 和 Oracle Database XE 的自定义虚拟机映像。另外,我们还学习了创建初始化脚本、配置服务以用户 定义的运行级别运行的基本知识。这里所采用的方法是通用的方法,可用于创建预捆绑的自定义映像 、修改现有的 AMI 以提供其他功能,或更好地利用 PaaS 云提供的按需可伸缩性。


Kiran C. Nair 供职于 Infosys Technologies Ltd. 的研究部门 — SETLabs,专门从事 JEE、客户端-服务器架构和性能生命周期分析方面的工作。