在 CentOS 7.0 上源码安装 Xen 4.5

上周 CentOS 7.0 正式版发布了,Xen4CentOS 项目还没来得及更新支持 CentOS 7.0,所以目前要在 CentOS 7.0 上玩 Xen 的唯一办法只有编译源代码了。貌似这次 CentOS 没有发布 Minimal 安装版,下面的编译安装步骤在 LiveCD 安装版(CentOS-7.0-1406-x86_64-livecd.iso)上完成。

安装需要的软件包

安装完 CentOS 7.0 后第一件事就是启动 SSH 以便能从另外一台机器访问,新版本的 CentOS 引入了有争议的 systemd 进程管理器替代了 Unix 传统的 init 系统。开启服务使用 systemctl 命令:

# systemctl start sshd
# systemctl enable sshd

更新系统,并且安装编译 Xen 所需要的编译器、工具、软件库等:

# yum update

# yum groupinstall "Development Tools"
# yum install -y gcc gcc-c++ git patch texinfo

# yum install -y python-devel acpica-tools libuuid-devel ncurses-devel glib2 glib2-devel libaio-devel openssl-devel yajl-devel glibc-devel glibc-devel.i686 pixman-devel

# wget http://mirror.centos.org/centos/6/os/x86_64/Packages/dev86-0.16.17-15.1.el6.x86_64.rpm
# rpm -ivh dev86-0.16.17-15.1.el6.x86_64.rpm

安装 Xen

下载最新的 xen 源代码、编译、安装,目前最新的代码是 xen 4.5-unstable:

# git clone git://xenbits.xen.org/xen.git
# cd xen/
# ./configure
# make dist
# make install

安装 dom0 内核

下载最新的 Linux 内核源代码,配置 dom0 内核、编译、安装,注意 dom0 内核需要选择下面一些内核选项:

# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.15.4.tar.xz
# tar xf linux-3.15.4.tar.xz
# cd linux-3.15.4/
# make menuconfig

# vi .config
...
CONFIG_X86_IO_APIC=y
CONFIG_ACPI=y
CONFIG_ACPI_PROCFS=y (optional)
CONFIG_XEN_DOM0=y
CONFIG_PCI_XEN=y
CONFIG_XEN_DEV_EVTCHN=y
CONFIG_XENFS=y
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_XEN_SYS_HYPERVISOR=y
CONFIG_XEN_GNTDEV=y
CONFIG_XEN_BACKEND=y
CONFIG_XEN_NETDEV_BACKEND=m
CONFIG_XEN_BLKDEV_BACKEND=m
CONFIG_XEN_PCIDEV_BACKEND=m
CONFIG_XEN_BALLOON=y
CONFIG_XEN_SCRUB_PAGES=y
...

# make
# make modules

# make modules_install
# make install

配置 Grub

配置 grub2,加上带 Xen 的 Linux dom0 内核:

# grub2-mkconfig -o /etc/grub2.cfg
# vi /etc/grub2.cfg

# vi /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry 'CentOS Linux, with Linux 3.15.4 Xen' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.15.4-advanced-aa64a6a3-518e-4a7c-9e88-2f3f33c8c700' {
        load_video
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  6bc61a5c-12e3-4711-9532-61760367e0dc
        else
          search --no-floppy --fs-uuid --set=root 6bc61a5c-12e3-4711-9532-61760367e0dc
        fi
        multiboot /xen.gz
        module /vmlinuz-3.15.4 root=UUID=aa64a6a3-518e-4a7c-9e88-2f3f33c8c700 ro rd.lvm.lv=cl/root vconsole.font=latarcyrheb-sun16 crashkernel=auto  vconsole.keymap=us rd.lvm.lv=cl/swap rhgb quiet
        module /initramfs-3.15.4.img
}

# grub2-mkconfig -o /etc/grub2.cfg

可能出现的错误和解决办法

重启后,选择 CentOS Linux, with Linux 3.15.4 Xen 进入 Xen 系统,使用 xl info 命令发现有错,这是因为 Xen 相关的软件库被安装到了 /usr/local/lib 目录,系统找不到。所以做一些链接就可以了:

# xl info
xl: error while loading shared libraries: libxlutil.so.4.3: cannot open shared object file: No such file or directory

# cd /usr/lib/
# ln -s /usr/local/lib/libxlutil.so.4.3.0 libxlutil.so.4.3
# ln -s /usr/local/lib/libxlutil.so.4.3.0 libxlutil.so
# ln -s /usr/local/lib/libxenlight.so.4.5.0 libxenlight.so.4.5
# ln -s /usr/local/lib/libxenlight.so.4.5.0 libxenlight.so
# ln -s /usr/local/lib/libxenctrl.so.4.5.0 libxenctrl.so.4.5
# ln -s /usr/local/lib/libxenguest.so.4.5.0 libxenguest.so.4.5
# ln -s /usr/local/lib/libxenguest.so.4.5.0 libxenguest.so
# ln -s /usr/local/lib/libxenstat.so.0.0 libxenstat.so.0
# ln -s /usr/local/lib/libxenstat.so.0.0 libxenstat.so
# ln -s /usr/local/lib/libxenstore.so.3.0.3 libxenstore.so.3.0
# ln -s /usr/local/lib/libxenstore.so.3.0.3 libxenstore.so
# ln -s /usr/local/lib/libxenvchan.so.1.0.0 libxenvchan.so.1.0
# ln -s /usr/local/lib/libxenvchan.so.1.0.0 libxenvchan.so
# ln -s /usr/local/lib/libblktapctl.so.1.0.0 libblktapctl.so.1.0
# ln -s /usr/local/lib/libblktapctl.so.1.0.0 libblktapctl.so

# ldconfig

再次运行 xl info 发现如下问题:

# xl info
xc: error: Could not obtain handle on privileged command interface (2 = No such file or directory): Internal error
libxl: error: libxl.c:99:libxl_ctx_alloc: cannot open libxc handle: No such file or directory
cannot init xl context

是因为没有挂载 xenfs 的缘故,挂载一下就可以了:

# modprobe xenfs
# mount -t xenfs xenfs /proc/xen

# ls /proc/xen/
capabilities  privcmd  xenbus  xsd_kva  xsd_port

# xl info
host                   : localhost.localdomain
release                : 3.15.4
version                : #1 SMP Fri Jul 11 09:37:12 SAST 2014
machine                : x86_64
nr_cpus                : 4
max_cpu_id             : 3
nr_nodes               : 1
cores_per_socket       : 2
threads_per_core       : 2
cpu_mhz                : 2195
hw_caps                : bfebfbff:28100800:00000000:00003f00:15bae3bf:00000000:00000001:00000000
virt_caps              : hvm
total_memory           : 3959
free_memory            : 127
sharing_freed_memory   : 0
sharing_used_memory    : 0
outstanding_claims     : 0
free_cpus              : 0
xen_major              : 4
xen_minor              : 5
xen_extra              : -unstable
xen_version            : 4.5-unstable
xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
xen_scheduler          : credit
xen_pagesize           : 4096
platform_params        : virt_start=0xffff800000000000
xen_changeset          : Wed Jul 9 13:30:54 2014 +0100 git:7579169-dirty
xen_commandline        :
cc_compiler            : gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16)
cc_compile_by          : root
cc_compile_domain      : localdomain
cc_compile_date        : Fri Jul 11 08:49:06 SAST 2014
xend_config_format     : 4

记得启动 xencommons 哦,以前旧版本的 xend 已经被 xencommons 替代了:

# /etc/init.d/xencommons start
Starting C xenstored...
Setting domain 0 name and domid...
Starting xenconsoled...
Starting QEMU as disk backend for dom0

# xl list
Name                                        ID   Mem VCPUs	State	Time(s)
Domain-0                                     0  3779     4     r-----     105.5

Xen 从 4.1 版本开始引入了新版工具集 xl/libxl,并在后续的版本中逐步替代旧的 xm/xend,在 4.5 版本中已经完全删除了 xm/xend.

以前的版本可参考:

在 CentOS 6.x 上安装和配置 Xen
在 CentOS 5.x 上安装和配置 Xen
在 CentOS 5.x 上源码安装 Xen

在 CentOS 6.5 上安装和配置 Xen

长假回来工作的第一周有点不适应,还在找状态。。。这周把一些老的 Xen 服务器(CentOS 5.2 + Xen 3.1)升级到了 CentOS 6.5 + Xen 4.2,顺便记录一下。

自从 RedHat 在 RHEL 6 放弃 Xen 后,下载 Xen 源码编译安装似乎是在 RHEL/CentOS 6.x 上安装 Xen 的唯一办法。不过,开源世界永远不缺少热情的志愿者,Xen Made Easy 这个项目为我们提供了可用的 Xen 第三方软件源,免去了自己编译源码的痛苦。现在,我们有了更好的官方选择,就是 Xen4CentOS6. Xen4CentOS6 是来自 CentOS, Xen, Citrix, Godaddy, Rackspace 社区和相关团队合作开发的一个开源项目,旨在为 CentOS 6.x 维护一个稳定的 Xen 工具链(Xen hypervisor 和相关 Xen 工具),让 Xen 运行在 CentOS 6 上变得更容易,更可靠。

安装

升级整个系统后重启,然后加入 CentOS 官方 Xen 源(Xen4CentOS6)并安装 Xen 内核及相关工具。需要注意的是,采用 CentOS-6.5-x86_64-minimal.iso 最小化安装的系统没有包括 Perl,Xen 工具需要 Perl 的支持,所以需要安装 perl 先:

# yum update
# reboot

# yum install centos-release-xen
# yum update

# yum install perl
# yum install xen

安装完支持 Xen 的 Linux 内核后需要加新条目到 grub.conf,以便系统能默认启动带 Xen 的 Linux 内核(而不是常规 Linux 内核),这个操作可以通过 grub-bootxen.sh 自动完成,弄完后打开 grub.conf 文件再次确认一下:

# /usr/bin/grub-bootxen.sh

# vi /etc/grub.conf
...
title CentOS (3.10.25-11.el6.centos.alt.x86_64)
        root (hd0,0)
        kernel /xen.gz dom0_mem=1024M,max:1024M loglvl=all guest_loglvl=all
        module /vmlinuz-3.10.25-11.el6.centos.alt.x86_64 ro root=/dev/mapper/vg_node11-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_node11/lv_swap  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rd_LVM_LV=vg_node11/lv_root rhgb quiet
        module /initramfs-3.10.25-11.el6.centos.alt.x86_64.img
...

重启系统后,默认应该进入 Xen 内核,可以通过 uname -r 和 xm info 确认是否安装成功:

# reboot

# uname -r
3.10.25-11.el6.centos.alt.x86_64

# xm info
host                   : xen01.vpsee.com
release                : 3.10.25-11.el6.centos.alt.x86_64
version                : #1 SMP Fri Dec 27 21:44:15 UTC 2013
machine                : x86_64
nr_cpus                : 8
nr_nodes               : 1
cores_per_socket       : 4
threads_per_core       : 1
cpu_mhz                : 2393
hw_caps                : 1febfbff:28100800:00000000:00003f40:80982201:00000000:00000001:00000000
virt_caps              :
total_memory           : 8191
free_memory            : 7073
free_cpus              : 0
xen_major              : 4
xen_minor              : 2
xen_extra              : .3-26.el6
xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p
xen_scheduler          : credit
xen_pagesize           : 4096
platform_params        : virt_start=0xffff800000000000
xen_changeset          : unavailable
xen_commandline        : dom0_mem=1024M,max:1024M loglvl=all guest_loglvl=all
cc_compiler            : gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
cc_compile_by          : mockbuild
cc_compile_domain      : centos.org
cc_compile_date        : Tue Dec 10 20:32:58 UTC 2013
xend_config_format     : 4

资源

CentOS 5.x 版本可以参看:在 CentOS 5.x 上安装和配置 Xen
Ubuntu 版本可以参看:在 Ubuntu 上安装和配置 Xen
Debian 版本参看:在 Debian 上安装和配置 Xen
OpenSolaris 版本参看:在 OpenSolaris 上安装和配置 Xen
NetBSD 版本参看:在 NetBSD 上安装和配置 Xen.

在 CentOS 6.4 上安装 CloudStack 4.2

又到年底,下月开始休假,所以这周基本上算今年 “努力” 的最后一周,接下来六周都不会有技术文章更新。

和 OpenStack, OpenNebula 类似,CloudStack 是另一款开源云计算平台。CloudStack 的前身是 Cloud.com 家的一款商业云计算产品(也有开源版本),2011年 Cloud.com 被 Citrix 收购,2012年的时候 Citrix 将收购的云平台 CloudStack 全部捐给了 Apache 基金会,自己则以 Citrix CloudPlatform (powered by Apache CloudStack) 的形式为客户提供商业化的云计算解决方案。

按照《OpenStack, OpenNebula, Eucalyptus, CloudStack 社区活跃度比较》的统计,貌似 CloudStack 项目的活跃程度仅次于 OpenStack. 和大多数云计算、集群软件一样,CloudStack 也是控制节点+计算节点这种架构,控制节点(cloudstack-management)用来统一管理计算节点,提供资源分配和任务,提供 API、GUI、数据库等服务;计算节点(cloudstack-agent)则用来跑虚拟机。我们需要做的是,

  • 在控制节点上安装 cloudstack-management;
  • 在(每个)计算节点上安装 cloudstack-agent 和 kvm.

在控制节点上

安装完 CentOS 6.4 系统后,升级系统并修改 hostname 后重启:

# yum update

# echo "cloudstack.vpsee.com" > /etc/hostname

# vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=cloudstack.vpsee.com

# echo "192.168.2.150 cloudstack cloudstack.vpsee.com" >> /etc/hosts

# reboot

添加 cloudstack 软件包的官方源,安装 ntp, cloudstack-management, mysql 数据库服务器:

# vi /etc/yum.repos.d/cloudstack.repo
[cloudstack]
name=cloudstack
baseurl=http://cloudstack.apt-get.eu/rhel/4.2/
enabled=1
gpgcheck=0

# yum update

# yum install ntp
# yum install cloudstack-management
# yum install mysql-server

修改 mysql 配置文件,加入下面几行,启动 ntp, mysql 服务并运行 mysql_secure_installation 给 mysql 设置密码:

# vi /etc/my.cnf
...
[mysqld]
...
innodb_rollback_on_timeout=1
innodb_lock_wait_timeout=600
max_connections=350
log-bin=mysql-bin
binlog-format = 'ROW'

[mysqld_safe]
...


# service ntpd start
# chkconfig ntpd on

# service mysqld start
# chkconfig mysqld on

# mysql_secure_installation

修改 SELINUX 设置,并配置防火墙允许访问 mysql 的 3306 端口:

# vi /etc/selinux/config
...
SELINUX=permissive
...

# setenforce permissive

# vi /etc/sysconfig/iptables
...
-A INPUT -p tcp --dport 3306 -j ACCEPT
...

# service iptables restart

使用 cloudstack-setup-databases 初始化 ClouStack 数据库,完成后运行 cloudstack-setup-management:

# cloudstack-setup-databases cloud:cloud@localhost --deploy-as=root:root -i 192.168.2.150

# cloudstack-setup-management
Starting to configure CloudStack Management Server:
Configure sudoers ...         [OK]
Configure Firewall ...        [OK]
Configure CloudStack Management Server ...[OK]
CloudStack Management Server setup is Done!

控制节点应该和存储分开,这里为了方便,我们把 NFS 也装在这个控制节点上,并自己挂载自己的 NFS 分区:

# yum install nfs-utils
# mkdir -p /export/primary
# mkdir -p /export/secondary

# vi /etc/exports
/export  *(rw,async,no_root_squash,no_subtree_check)

# exportfs -a
# vi /etc/sysconfig/nfs
...
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
RQUOTAD_PORT=875
STATD_PORT=662
STATD_OUTGOING_PORT=2020
...

# service rpcbind start
# service nfs start
# chkconfig nfs on
# chkconfig rpcbind on
# reboot

# mkdir -p /mnt/primary
# mkdir -p /mnt/secondary
# mount -t nfs 192.168.2.150:/export/primary /mnt/primary
# mount -t nfs 192.168.2.150:/export/secondary /mnt/secondary

修改防火墙配置,开放下面一些端口:

# vi /etc/sysconfig/iptables
...
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p udp --dport 111 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 111 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 2049 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 32803 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p udp --dport 32769 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 892 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p udp --dport 892 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 875 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p udp --dport 875 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p tcp --dport 662 -j ACCEPT
-A INPUT -s 192.168.2.0/24 -m state --state NEW -p udp --dport 662 -j ACCEPT
...

# service iptables restart
# service iptables save

创建虚拟机需要有模版,这个模版可以自己做,也可以下载官方现成的。需要注意的是,官方文档中的 /usr/lib64/cloud/common/… 路径不对,应该是 /usr/share/cloudstack-common/…:

# /usr/share/cloudstack-common/scripts/storage/secondary/cloud-install-sys-tmplt -m /mnt/secondary -u http://d21ifhcun6b1t2.cloudfront.net/templates/4.2/systemvmtemplate-2013-06-12-master-kvm.qcow2.bz2 -h kvm -s -F

在计算节点上

为了保持一致,我们在计算节点上也采用 CentOS 6.4. 在每个计算节点上都需要如下的安装和配置。升级系统并修改 hostname、重启:

# yum update

# echo "cloudstack01.vpsee.com" > /etc/hostname

# vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=cloudstack01.vpsee.com

# echo "192.168.2.151 cloudstack01 cloudstack.vpsee.com" >> /etc/hosts

# reboot

添加 cloudstack 软件包的官方源,安装 ntp, cloudstack-agent 和 kvm:

# vi /etc/yum.repos.d/cloudstack.repo
[cloudstack]
name=cloudstack
baseurl=http://cloudstack.apt-get.eu/rhel/4.2/
enabled=1
gpgcheck=0

# yum update

# yum install ntp
# yum install cloudstack-agent
# yum install qemu-kvm

修改 libvirt 相关配置文件,去掉下面几行的注释,注意把 auth_tcp 改成 “none”,如果需要 vnc 访问的话别忘了取消 qemu.conf 里面的 vnc_listen 相关注释,重启 libvirtd 服务使配置生效:

# vi /etc/libvirt/libvirtd.conf
...
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
auth_tcp = "none"
mdns_adv = 0
...

# vi /etc/sysconfig/libvirtd
...
LIBVIRTD_ARGS="--listen"
...

# vi /etc/libvirt/qemu.conf
...
vnc_listen = "0.0.0.0"
...

# service libvirtd restart

别忘了让防火墙开放必要的端口:

# iptables -I INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# iptables -I INPUT -p tcp -m tcp --dport 1798 -j ACCEPT
# iptables -I INPUT -p tcp -m tcp --dport 16509 -j ACCEPT
# iptables -I INPUT -p tcp -m tcp --dport 5900:6100 -j ACCEPT
# iptables -I INPUT -p tcp -m tcp --dport 49152:49216 -j ACCEPT
# iptables-save > /etc/sysconfig/iptables

测试

打开浏览器,访问控制节点 http://192.168.2.150:8080/client/ 就会看到登录界面,默认用户名和密码是 admin/password,登录后修改密码、做一些配置后就可以开始用了:

a docker web ui

CentOS 上的 LNMP 一键安装工具 Centmin Mod

最近我们的 VPS 新手客户突然增多,不知道小伙伴们都从哪里来的,可能某个论坛提到我们的 VPS,只要听到 “求教程” 这种呐喊就能从地球的另一半边感受到这种急切。在 Linux 上安装 Nginx, MySQL, PHP(俗称 LNMP)就是一行命令的事情,实在不需要什么 “教程”,就算要教程 google/baidu 一下就可以搜到一大把,实在没必要再 “求” 一遍。比如,在 Ubuntu 12.04 上安装 Nginx, MySQL, PHP:

$ sudo apt-get install mysql-server libapache2-mod-auth-mysql php5-mysql nginx php5-fpm

个人不推荐新手一开始就使用一键安装工具,一键安装工具隐藏了细节,不利于学习。不过自己动手配过几次系统、熟悉了 Linux 以后再回过头来看,使用一些一键安装工具还是很方便的,一键安装工具除了能安装必要的软件外还有一些附加功能,比如 “关闭 SELINUX”、“更改 SSH 端口”、“增加一个 vhost” 等。这里介绍的一键安装工具 Centmin Mod 是由原 Centmin 脚本改良而来,貌似原 Centmin 停止更新了。

需要注意的是,Centmin Mod 只能运行在 CentOS/RHEL 系统上,而且用 MariaDB 替代了原始的 MySQL,这一点大家应该不用担心,几乎所有主流 Linux 发行版本(Fedora/RHEL, openSUSE, Arch Linux, Slackware)的默认 MySQL 版本都将会切换到 MariaDB,Red Hat 会在 RHEL 7.0 里使用 MariaDB,Google 也在用 MariaDB 替换 MySQL 中

运行 Centmin Mode 脚本前先 update 一下整个系统,必要的话重启一下:

# yum -y update
# reboot

下载和解压 CentMin Mod 包,增加 centmin.sh 的可执行权限:

# wget http://centminmod.com/download/centmin-v1.2.3-eva2000.03.zip
# unzip centmin-v1.2.3-eva2000.03.zip
# cd centmin-v1.2.3mod/
# chmod +x centmin.sh

运行这个脚本:

# ./centmin.sh
--------------------------------------------------------
Centmin Mod 1.2.3-eva2000.03 - http://centminmod.com
--------------------------------------------------------
                   Centmin Mod Menu
--------------------------------------------------------
1).  Centmin Install
2).  Add Nginx vhost domain
3).  NSD setup domain name DNS
4).  Nginx Upgrade / Downgrade
5).  PHP Upgrade / Downgrade
6).  XCache Re-install
7).  APC Cache Re-install
8).  XCache Install
9).  APC Cache Install
10). Memcached Server Re-install
11). MariaDB 5.2.x Branch Upgrade Only
12). MariaDB 5.2.x to MariaDB 5.5 YUM upgrade
13). Install ioping.sh vbtechsupport.com/1239/
14). SELinux disable
15). Install/Re-install imagick PHP Extension
16). Change SSHD Port Number
17). Multi-thread compression: pigz,pbzip2,lbzip2,p7zip etc
18). Suhosin PHP Extension install
19). Install FFMPEG and FFMPEG PHP Extension
20). NSD Re-install
21). Exit
--------------------------------------------------------
Enter option [ 1 - 21 ] 1

...

*************************************************
* Centmin Mod install completed....
*************************************************

上面的菜单提示很清楚,选择 1). Centmin Install 开始安装我们要的 Nginx/MySQL/PHP,安装完毕后(大概需要10到30分钟)从浏览器上直接通过 IP 访问这个 VPS 可以看到 Nginx Test Page.

如果需要增加一个 Nginx vhost 配置的话,选择 2). Add Nginx vhost domain:

# ./centmin.sh
--------------------------------------------------------
Centmin Mod 1.2.3-eva2000.03 - http://centminmod.com
--------------------------------------------------------
                   Centmin Mod Menu
--------------------------------------------------------
1).  Centmin Install
2).  Add Nginx vhost domain
3).  NSD setup domain name DNS
4).  Nginx Upgrade / Downgrade
5).  PHP Upgrade / Downgrade
6).  XCache Re-install
7).  APC Cache Re-install
8).  XCache Install
9).  APC Cache Install
10). Memcached Server Re-install
11). MariaDB 5.2.x Branch Upgrade Only
12). MariaDB 5.2.x to MariaDB 5.5 YUM upgrade
13). Install ioping.sh vbtechsupport.com/1239/
14). SELinux disable
15). Install/Re-install imagick PHP Extension
16). Change SSHD Port Number
17). Multi-thread compression: pigz,pbzip2,lbzip2,p7zip etc
18). Suhosin PHP Extension install
19). Install FFMPEG and FFMPEG PHP Extension
20). NSD Re-install
21). Exit
--------------------------------------------------------
Enter option [ 1 - 21 ] 2
--------------------------------------------------------

---------------------------------------------
Enter vhost domain name you want to add (without www. prefix): vpsee.com


---------------------------------------------
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Reloading nginx:                                           [  OK  ]

---------------------------------------------
vhost for vpsee.com created successfully
vhost conf file for vpsee.com created: /usr/local/nginx/conf/conf.d/vpsee.com.conf
upload files to /home/nginx/domains/vpsee.com/public
vhost log files directory is /home/nginx/domains/vpsee.com/log

Current vhost listing at: /usr/local/nginx/conf/conf.d/

Sep 11  22:26   2.3K   virtual.conf
Sep 11  22:26   798    ssl.conf
Sep 11  22:55   1002   vpsee.com.conf
---------------------------------------------

如果想安装 PHP 加速器 APC 的话运行 centmin.sh 后选择 9). APC Cache Install;如果想更改 SSH 端口?想关闭 SELinux?看上面的菜单提示吧。

在 CentOS 6.4 上安装和配置 OpenNebula 4.0

我们实验室的 OpenNebula 3.2 已经很稳定的运行了两年,除了开头一个月不熟悉这套云计算软件有点乱、容易犯错外接下来的时间里都很稳定,期间还包括一次防火演习(突然拉闸似断电)和安全检查(计划中的断电),服务器、虚拟机、存储设备、系统和服务都能自动起来并能正常工作。现在正在考虑升级的事情,OpenNebula 4.0 有很多新特性值得一试,现在的问题是升级很麻烦,官方文档貌似说要逐个版本升级,这个是小问题,更大的问题是如何升级整个运行中的生产环境,这里面有太多的因素需要考虑到,想了都头大~先安装一个 OpenNebula 4.0 试玩一下,看看数据库表结构、一些工具、配置文件,看看能不能琢磨出一个可行的升级方案出来,具体的升级操作将会在圣诞节期间进行(人最少的时候),不过现在应该开始计划和测试了。

下面的安装过程采用最小化的 CentOS 6.4 安装版本(CentOS-6.4-x86_64-minimal.iso)。不熟悉 OpenNebula 和云计算的朋友可以先看看 “在 CentOS 上安装和配置 OpenNebula” 的开头部分预热一下。

开始之前先装上 EPEL 源,然后升级系统:

# yum install wget
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum update

到官网 http://downloads.opennebula.org/ 下载 OpenNebula 4.0 for CentOS 6.4 的安装包、解压后安装,因为有包依赖问题,所以最好用 yum localinstall 安装,不要用 rpm -ivh 命令直接安装。在控制节点(或叫做头节点)上安装 opennebula 和 opennebula-sunstone 等:

# cd /usr/src
# tar zxvf CentOS-6.4-opennebula-4.0.0-1.tar.gz
# cd opennebula-4.0.0-1

# yum localinstall opennebula-common-4.0.0-1.x86_64.rpm
# yum localinstall opennebula-ruby-4.0.0-1.x86_64.rpm
# yum localinstall opennebula-4.0.0-1.x86_64.rpm
# yum localinstall opennebula-sunstone-4.0.0-1.x86_64.rpm
# yum localinstall opennebula-server-4.0.0-1.x86_64.rpm

在计算节点上安装 kvm 和 opennebula-node-kvm:

# yum install qemu-kvm qemu-kvm-tools libvirt
# yum localinstall opennebula-node-kvm-4.0.0-1.x86_64.rpm

# /etc/init.d/libvirtd start

安装搞定,OpenNebula 4.0 的安装就是这么简单,开始在控制节点上启动服务吧:

# service opennebula start
Starting OpenNebula daemon:                                [  OK  ]
# service opennebula-sunstone start
Starting Sunstone Server daemon: VNC proxy started
sunstone-server started
                                                           [  OK  ]

我们通常都会通过 IP 访问(或者内部域名)访问 sunstone 界面,所以需要改变 sunstone 的默认接听地址,把 host: 127.0.0.1 换成机器所在 IP 地址,需要重启服务让设置生效。注意这里使用 9869 端口,CentOS 6.x 默认是开启防火墙的,所以可以把这个端口加到防火墙规则里也可以直接把防火墙关掉:

# vi /etc/one/sunstone-server.conf
...
# Server Configuration
#
:host: 192.168.2.150
:port: 9869

# service opennebula-sunstone restart
Stopping Sunstone Server daemon: VNC server is not running
sunstone-server stopped
                                                           [  OK  ]
Starting Sunstone Server daemon: VNC proxy started
sunstone-server started
                                                           [  OK  ]

# /etc/init.d/iptables stop
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]

打开浏览器,访问 http://192.168.2.150:9869 登陆界面,那登陆的用户名和密码是啥呢?用户名和密码在安装的时候已经随机生成,oneadmin 是用户名,后面的一串是密码:

# cat /var/lib/one/.one/one_auth
oneadmin:0dee417dfb22f2372866d686c7b12889

登陆成功后界面比以前的版本有很大改进:

opennebula 4.0 sunstone

升级 Red Hat Linux 7.3 到 CentOS 3.1

最近用 VMware vCenter Converter 工具企图虚拟化一台很古老的 Red Hat Linux 7.3 物理服务器失败,可能是因为 RedHat 7.3 版本太老 VMware Converter 支持不到位。虚拟化太老的系统如果使用一些自动迁移工具不成功的话可以自己动手迁移,虽然麻烦点,比如做个虚拟硬盘、加上分区表、把文件系统拷贝过去、重置 grub、最后修改几个关键文件等。现在这里的想法是把 RedHat 7.3 升级到 CentOS 3.1 再用 VMware Converter 试一下,如果这样还不成功就只能手动虚拟化物理机了。升级前先备份系统(可用光盘启动后 dd 硬盘到另一个硬盘),防止升级失败后系统启动不了或者升级后关键程序不能运行。升级前不确定 RedHat 7.3 到 CentOS 3.1 这种不同版本、不同版本号的大跨度升级能否成功,有必要纪录一下。

登陆 RedHat 7.3 后安装 yum:

# wget http://ftp.ie.freshrpms.net/pub/freshrpms/redhat/7.3/yum/yum-1.0.3-3.rh.fr.i386.rpm
# rpm -ivh yum-1.0.3-3.rh.fr.i386.rpm

编辑 yum.conf 加入 centos 3.1 的源:

# vi /etc/yum.conf
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=redhat-release
installonlypkgs=kernel kernel-smp kernel-hugemem kernel-enterprise kernel-debug kernel-uns
upported kernel-smp-unsupported kernel-hugemem-unsupported
tolerant=1
exactarch=1

[base]
name=CentOS-$releasever - Base
baseurl=http://centosa3.centos.org/centos-3/3.1/os/i386/
gpgcheck=1

#released updates
[update]
name=CentOS-$releasever - Updates
baseurl=http://centosa3.centos.org/centos-3/3.1//updates/i386/
gpgcheck=1

#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever - Addons
baseurl=http://centosa3.centos.org/centos-3/3.1/addons/i386/
gpgcheck=1

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://centosa3.centos.org/centos-3/3.1/extras/i386/
gpgcheck=1

升级系统,完成后重启:

# yum update
# yum upgrade

# shutdown -r now

在 CentOS 6.2 上安装和配置 Foreman

服务器(物理机器和虚拟机)多了以后需要工具来管理,经常登陆系统后不知是在虚拟机上还是在物理机上?如果在虚拟机上这个虚拟机运行在哪个服务器节点(host)上?如果在物理机上运行在什么配置的物理机上?运行在 Dell 刀片服务器上还是 IBM 超级计算机上,SUN 服务器上还是普通 PC 上?这个系统 IP 是多少?域名是啥?有几个网卡?分别走的哪个交换机?有没有连到 SAN 存储等等?无数问题,我们需要一个统一查看和管理所有机器(物理机和虚拟机)的这么一套工具。Foreman 就是这么一个集成了 Puppet 的统一机器生命周期管理工具。

Foreman 功能很强大,可以解决硬件或虚拟机上线到运行 Puppet 之间的一切问题,比如安装操作系统、配置网络、配置 DNS、Puppet 客户端安装认证等等,完成必要的上线工作后,Foreman 就把剩下的工作交给了 Puppet,Puppet 完成剩下的服务器和服务配置工作,这样就完美的完成了从服务器上线到服务上线的全过程,而且是自动的。这里主要介绍用 Foreman 获取(配合 Puppet Facts)和查看服务器信息。

加入 foreman 官方源后安装软件包:

# cat > /etc/yum.repos.d/foreman.repo << EOF
[foreman]
name=Foreman Repo
baseurl=http://yum.theforeman.org/stable
gpgcheck=0
enabled=1
EOF

# yum install foreman

拷贝 foreman 里面的 report 例子到 puppet 下,并更改 $foreman_url 指向这台安装 foreman 的服务器:

# cp /usr/share/foreman/extras/puppet/foreman/templates/foreman-report.rb.erb \
/usr/lib/ruby/site_ruby/1.8/puppet/reports/foreman.rb

# vi /usr/lib/ruby/site_ruby/1.8/puppet/reports/foreman.rb
...
$foreman_url='http://foreman.vpsee.com:3000/'
...

配置 puppetmaster 服务端,编辑 puppet.conf 配置文件:

# vi /etc/puppet/puppet.conf
[main]
...
    reports=log, foreman
...

# /etc/init.d/puppetmaster restart

配置 puppet 客户端,编辑 puppet.conf 配置文件,确保 report 是 true:

# vi /etc/puppet/puppet.conf
...
report = true
...

初始化 foreman 数据库(这里 foreman 默认使用 sqlite,简单、不用任何配置,如果想用 mysql 的话可以参考官方帮助文件):

# cd /usr/share/foreman
# RAILS_ENV=production rake db:migrate

启动 foreman:

# /etc/init.d/foreman start

我们把 foreman 和 puppetmaster 安装在同一个机器上,每次运行这个脚本都会导入新的 facts:

# cd /usr/share/foreman
# rake puppet:import:hosts_and_facts RAILS_ENV=production
(in /usr/share/foreman)
Importing from /var/lib/puppet/yaml/facts
Importing monitor.vpsee.com
Importing dev.vpsee.com
Importing intranet.vpsee.com
Importing datasrv.vpsee.com
Importing rocket.vpsee.com
Importing grid.vpsee.com
Importing proxy.vpsee.com
Importing mail.vpsee.com

导入成功后打开浏览器访问 http://foreman.vpsee.com:3000 就可以看到 foreman 界面了:
foreman

在 CentOS 6.2 上安装和配置 KVM

RHEL6 已经推出很久了,没想到在 RedHat 自家的 RHEL6 上安装 KVM 还有这么多问题,难道不应该是像 Apache/MySQL 那样安装完就可以用的么?(注:除去商标,CentOS 就是 RHEL,CentOS6 和 RHEL6 是一回事)。以下操作在 CentOS 6.2 最小化安装版本 CentOS-6.2-x86_64-minimal.iso 上完成,其他版本可能不会遇到本文提到的部分问题。

检查 CPU

和 Xen 不同,KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安装 KVM 之前检查一下 CPU 是否提供了虚拟技术的支持:

# egrep 'vmx|svm' /proc/cpuinfo
...
flags		: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat dts tpr_shadow vnmi flexpriority ept vpid

安装 KVM

安装 KVM 很容易,要正常运行的话还需要折腾一下:

# yum -y install qemu-kvm libvirt python-virtinst bridge-utils

安装完后关闭 selinux 并重启系统,然后确认一下是否 kvm 安装成功:

# vi /etc/sysconfig/selinux
SELINUX=disabled

# reboot

# lsmod | grep kvm
kvm_intel              50412  3 
kvm                   305988  1 kvm_intel

# stat /dev/kvm
  File: `/dev/kvm'
  Size: 0         	Blocks: 0          IO Block: 4096   character special file
Device: 5h/5d	Inode: 10584       Links: 1     Device type: a,e8
Access: (0666/crw-rw-rw-)  Uid: (    0/    root)   Gid: (   36/     kvm)
Access: 2012-04-18 16:00:46.276341129 +0200
Modify: 2012-04-18 16:00:46.276341129 +0200
Change: 2012-04-18 16:00:46.276341129 +0200

再来确认一下 libvirt 是否能正常启动和关闭。重启 libvirtd 服务的话会报错,查看日志发现 internal error Failed to create mDNS client 错误,这个问题容易改正,安装 avahi 即可,也可以去 /etc/libvirt/libvirtd.conf 设置 mdns_adv = 0,VPSee 这里采用安装 avahi 的方法:

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon:                                  [FAILED]
Starting libvirtd daemon:                                  [  OK  ]

# tail /var/log/libvirt/libvirtd.log 
2012-04-18 13:51:03.032+0000: 18149: info : libvirt version: 0.9.4, package: 23.el6_2.7 (CentOS BuildSystem , 2012-04-16-14:12:59, c6b5.bsys.dev.centos.org)
2012-04-18 13:51:03.032+0000: 18149: error : virNetServerMDNSStart:460 : internal error Failed to create mDNS client: Daemon not running

# yum -y install avahi
# /etc/init.d/messagebus restart
# /etc/init.d/avahi-daemon restart

重启 libvirtd 服务继续报错,发现缺少 dmidecode 包,安装 dmidecode 后终于重启 libvirtd 成功 :

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon:                                  [FAILED]
Starting libvirtd daemon:                                  [  OK  ]

# tail /var/log/libvirt/libvirtd.log 
2012-04-18 13:54:54.654+0000: 18320: info : libvirt version: 0.9.4, package: 23.el6_2.7 (CentOS BuildSystem , 2012-04-16-14:12:59, c6b5.bsys.dev.centos.org)
2012-04-18 13:54:54.654+0000: 18320: error : virSysinfoRead:465 : internal error Failed to find path for dmidecode binary

# yum -y install dmidecode

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon:                                  [  OK  ]
Starting libvirtd daemon:                                  [  OK  ]

现在 kvm 和 libvirt 都安装成功和运行了,但并不表示可用了,问题接着来。

安装虚拟机

从 6 系列开始 RedHat 推荐使用 virt-install/virsh 系列工具操作 kvm,而不是直接使用 qemu-kvm,所以 qemu-kvm 被移到一个不起眼的地方 /usr/libexec/,做个链接:

# qemu-kvm
-bash: qemu-kvm: command not found

# ls /usr/libexec/qemu-kvm 
/usr/libexec/qemu-kvm

# ln -sf /usr/libexec/qemu-kvm /usr/bin/kvm

VPSee 采用 RedHat 推荐的方式(virt-install)安装虚拟机,这里以安装 ubuntu-11.10-server-amd64.iso 为例:

# virt-install \
--name ubuntu \
--ram 512 \
--vcpus=1 \
--disk path=/root/ubuntu.img,size=10 \
--accelerate \
--cdrom /root/ubuntu-11.10-server-amd64.iso \
--graphics vnc

开始安装,创建硬盘 ubuntu.img 后就报错,用的是 root 帐号居然还 Permission denied?!

Starting install...
Creating storage file ubuntu.img                                 | 10.0 GB     00:00     
ERROR    internal error Process exited while reading console log output: char device redirected to /dev/pts/1
qemu-kvm: -drive file=/root/ubuntu.img,if=none,id=drive-ide0-0-0,format=raw,cache=none: could not open disk image /root/ubuntu.img: Permission denied

Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
  virsh --connect qemu:///system start ubuntu
otherwise, please restart your installation.

修改 qemu.conf 配置,把下面几个地方的注释去掉,然后把 dynamic_ownership 的值改成0,禁止 libvirtd 动态修改文件的归属:

# vi /etc/libvirt/qemu.conf
...
user = "root"
group = "root"
dynamic_ownership = 0
...

重启 libvirtd 服务再用上面的 virt-install 命令安装就应该可以了。这个时候 vnc 默认绑定的是本机 127.0.0.1,如果其他机器想用 vnc 客户端访问这台 kvm 服务器正在安装的 ubuntu 的话需要把 vnc 绑定到服务器的 IP 地址或者绑定到全局 0.0.0.0. 修改 qemu.conf 文件取消 vnc_listen 一行前面的注释,记得重启 libvirtd:

# vi /etc/libvirt/qemu.conf
...
vnc_listen = "0.0.0.0"
...

在 CentOS 5.x 安装 KVM 可以看:在 CentOS 上安装和配置 KVM.

对 Xen 和 OpenVZ 感兴趣的同学可以参考以下一些文章:

Ubuntu 版本可以参看:在 Ubuntu 上安装和配置 Xen
Debian 版本参看:在 Debian 上安装和配置 Xen
OpenSolaris 版本参看:在 OpenSolaris 上安装和配置 Xen
NetBSD 版本参看:在 NetBSD 上安装和配置 Xen

安装 OpenVZ 参看:在 CentOS 上安装和配置 OpenVZ.

如何让 OpenNebula 虚拟机自动获得 IP 等网络配置信息?

制作完 OpenNebula 的 Ubuntu 虚拟机镜像后需要对镜像配置一下以适应所在的网络运行环境,因为我们的 OpenNebula 虚拟机使用的是网桥的方式,所以虚拟机启动后会使用现有网络,并企图从 DHCP 服务器那里获得 IP 地址,如果 DHCP 服务器不做绑定的话这样随便获得的 IP 地址并不符合我们在 small_network.net (onevnet create small_network.net) 定义的要求,我们希望虚拟机启动后能从 small_network.net 这个网络配置文件中获得相应的 IP 地址。OpenNebula 里面的 Contextualizing 部分就是用来对付这种情况的,不过 VPSee 在这里介绍一个更简单的偷懒办法:直接用一个启动脚本来搞定。OpenNebula 已经为我们准备了类似的脚本,只需要根据自己的要求调整一下就可以了,这里介绍 for ubuntu 和 for centos 两个版本的脚本,还有 for debian 和 opensuse 的。

Ubuntu 虚拟机

下载 for ubuntu 的 context 文件后放在合适的地方,这个脚本有点问题需要在下载的 vmcontext.sh 文件最后加上重启网络(/etc/init.d/networking restart)这行:

$ wget http://dev.opennebula.org/attachments/download/378/vmcontext.sh 

$ sudo -i

# mv vmcontext.sh /etc/init.d/vmcontext
# chmod +x /etc/init.d/vmcontext
# ln -sf /etc/init.d/vmcontext /etc/rc2.d/S01vmcontext

# echo "/etc/init.d/networking restart" >> /etc/init.d/vmcontext

CentOS 虚拟机

下载 for centos 的 context 文件后放在合适的地方:

# wget http://dev.opennebula.org/projects/opennebula/repository/revisions/master/raw/share/scripts/centos-5/net-vmcontext/vmcontext

# mv vmcontext.sh /etc/init.d/vmcontext
# chmod +x /etc/init.d/vmcontext
# chkconfig --add vmcontext

# reboot

还记得上次说的给 OpenNebula 虚拟机增加 swap 分区的问题吗,直接把激活 swap 的部分放在 vmcontext 里就不必每次创建虚拟机后再增加 swap 的繁琐工作了。

# echo "swapon /dev/sdb" >> /etc/init.d/vmcontext

如何在 Cobbler 上导入和启动 Ubuntu

Cobbler 在 CentOS/RHEL/Fedora 系的发行版上工作良好,在 CentOS/RHEL/Fedora 上安装 Cobbler 以后可以直接导入 CentOS/RHEL/Fedora ISO 文件,很顺利,不过导入 Ubuntu/Debian ISO 就不是那么幸运了,直接导入 ubuntu-11.10-server-amd64.iso 的话会报错:

# cobbler import –path=/mnt/ –name=ubuntu-11.10-server-amd64
...
sent 710595315 bytes  received 36388 bytes  52639385.41 bytes/sec
total size is 710349452  speedup is 1.00
...
!!! TASK FAILED !!!

忽略上面的错误,会发现在 ks_mirror 下面已经导入了 ubuntu-11.10-server-amd64 整个 ubuntu 目录:

# ls /var/www/cobbler/ks_mirror/
config  ubuntu-11.10-server-amd64

如果对上面已经导入的 ubuntu 目录还不放心的话,可以删除这个目录后手动导入(直接 cp 就行):

# rm -rf /var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64

# mount -o loop -t iso9660 ubuntu-11.10-server-amd64.iso /mnt

# cp -r /mnt/ /var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64

完成导入(拷贝)后,做个链接:

# cd /var/www/cobbler/links/
# ln -s /var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64 ubuntu-11.10-server-amd64

然后加入 distro 和 profile:

# cobbler distro add \
--name=ubuntu-11.10-server-amd64 \
--kernel=/var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64/install/netboot/ubuntu-installer/amd64/linux \
--initrd=/var/www/cobbler/ks_mirror/ubuntu-11.10-server-amd64/install/netboot/ubuntu-installer/amd64/initrd.gz \
--arch=x86_64 \
--breed=ubuntu \
--ksmeta="directory=/cblr/links/ubuntu-11.10-server-amd64"

# cobbler profile add \
--name=ubuntu-11.10-server-amd64 \
--distro=ubuntu-11.10-server-amd64 \
--kickstart=/var/lib/cobbler/kickstarts/ubuntu-11.10-server-amd64.seed

最后我们需要 ubuntu 能完成自动安装,加入以下 kickstart 脚本 ubuntu-11.10-server-amd64.seed 到 /var/lib/cobbler/kickstarts/ :

# vi /var/lib/cobbler/kickstarts/ubuntu-11.10-server-amd64.seed
d-i     debian-installer/locale string en_US.UTF-8
d-i     debian-installer/splash boolean false
d-i     console-setup/ask_detect        boolean false
d-i     console-setup/layoutcode        string us
d-i     console-setup/variantcode       string
d-i     netcfg/get_nameservers  string
d-i     netcfg/get_ipaddress    string
d-i     netcfg/get_netmask      string 255.255.255.0
d-i     netcfg/get_gateway      string
d-i     netcfg/confirm_static   boolean true
d-i     clock-setup/utc boolean true
d-i     partman-auto/method string regular
d-i     partman-lvm/device_remove_lvm boolean true
d-i     partman-lvm/confirm boolean true
d-i     partman/confirm_write_new_label boolean true
d-i     partman/choose_partition        select Finish partitioning and write changes to disk
d-i     partman/confirm boolean true
d-i     partman/confirm_nooverwrite boolean true
d-i     partman/default_filesystem string ext3
d-i     clock-setup/utc boolean true
d-i     clock-setup/ntp boolean true
d-i     clock-setup/ntp-server  string ntp.ubuntu.com
d-i     base-installer/kernel/image     string linux-server
d-i     passwd/root-login       boolean false
d-i     passwd/make-user        boolean true
d-i     passwd/user-fullname    string ubuntu
d-i     passwd/username string ubuntu
d-i     passwd/user-password-crypted    password $default_password_crypted
d-i     passwd/user-uid string
d-i     user-setup/allow-password-weak  boolean false
d-i     user-setup/encrypt-home boolean false
d-i     passwd/user-default-groups      string adm cdrom dialout lpadmin plugdev sambashare
d-i     apt-setup/services-select       multiselect security
d-i     apt-setup/security_host string security.ubuntu.com
d-i     apt-setup/security_path string /ubuntu
d-i     debian-installer/allow_unauthenticated  string false
d-i     pkgsel/upgrade  select safe-upgrade
d-i     pkgsel/language-packs   multiselect
d-i     pkgsel/update-policy    select none
d-i     pkgsel/updatedb boolean true
d-i     grub-installer/skip     boolean false
d-i     lilo-installer/skip     boolean false
d-i     grub-installer/only_debian      boolean true
d-i     grub-installer/with_other_os    boolean true
d-i     finish-install/keep-consoles    boolean false
d-i     finish-install/reboot_in_progress       note
d-i     cdrom-detect/eject      boolean true
d-i     debian-installer/exit/halt      boolean false
d-i     debian-installer/exit/poweroff  boolean false
d-i     pkgsel/include string openssh-server