在 Ubuntu 12.04 上配置 Radius 和 LDAP 服务

上次提到了我们实验室的 Wi-Fi 更改了认证方式,不再使用 WPA2/PSK 通用密码,而是通过 LDAP 把 Wi-Fi 上网密码和个人帐号联系起来,大家只需要用自己平时的 Unix/Linux/Mail/GroupWise 帐号就可以登陆 Wi-Fi,那么如何配置这样一个系统呢?涉及到的东西有点多,首先需要一个支持 Radius 的无线路由器,然后需要一台装有 Radius 的服务器,这台服务器还需要作为 LDAP 客户端和 LDAP 服务器连起来。

准备工作

  • Linksys WRT 54GS 无线路由器,可以替换开源固件的 hacker-friendly 路由器;
  • DD-WRT 固件,刷固件的过程可以参考:把 Linksys WRT54GL 路由器当作交换机用
  • FreeRadius 服务,安装在一台 Ubuntu 服务器上;
  • LDAP 客户端,安装在同一台 Ubuntu 服务器上;
  • LDAP 服务器,一般安装在另一台服务器上,也可以和上面的 FreeRadius/LDAP client 装在一起,LDAP 服务器的配置和安装过程超出本文范围,这里不介绍。

配置 Wi-Fi

刷固件以后按照下图配置 Linksys WRT 54GS,指定 Radius 服务器的 IP 和端口、安全模式、WPA 算法、WPA Shared Key 等,这个 WPA Shared Key 由下面的 FreeRadius 配置指定:

dd-wrt and radius

安装和配置 LDAP

这里只是安装 LDAP 客户端,不包括 LDAP 服务器的安装,所以需要事先知道 LDAP 服务器的 IP 或域名等相关信息。

$ sudo apt-get install ldap-auth-client ldap-auth-config libpam-ldap

填入 LDAP 服务器地址 host, base 等:

$ sudo vi /etc/ldap.conf
host ldap.vpsee.com
base dc=vpsee,dc=com
pam_password exop
pam_lookup_policy yes

nss_initgroups_ignoreusers Debian-exim,backup,bin,daemon,dhcp,games,gnats,irc,klog,libuuid
,list,lp,mail,man,news,ntpd,proxy,root,snmp,sshd,statd,sync,sys,syslog,uucp,www-data

确认 nsswitch.conf 先搜索本地文件,用户登陆的时候先检索本地 /etc/passwd 找不到相关用户名再检索 ldap 服务器上的用户数据库:

$ sudo vi /etc/nsswitch.conf
passwd:         files ldap
group:          files ldap
shadow:         files ldap
automount:      files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

安装和配置 FreeRadius

安装 FreeRadius:

$ sudo apt-get install freeradius freeradius-utils freeradius-ldap openssl 

编辑 clients.conf,确定哪个 IP 范围可以访问 Radius 服务,这里 secret 一行的 testing123 就是上面 DD-WRT 要用到的 WPA Shared Key:

$ sudo vi /etc/freeradius/clients.conf
...
client 192.168.2.0/24 {
        require_message_authenticator = no
        secret          = testing123
        shortname       = vpsee-network
}
...

配置 default,确定 pam 一行没有被注释掉:

$ sudo vi /etc/freeradius/sites-available/default
...
authorize {
        preprocess
        chap
        mschap
        suffix
        eap {
                ok = return
        }
        unix
        files
        expiration
        logintime
        pap
}
...
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        pam
        unix
        eap
}
...

同样的确定 inner-tunnel 配置文件里面的 pam 一行没有被注释掉:

$ sudo vi /etc/freeradius/sites-available/inner-tunnel
...
authenticate {
        Auth-Type PAP {
                pap
        }
        Auth-Type CHAP {
                chap
        }
        Auth-Type MS-CHAP {
                mschap
        }
        pam
        unix
        eap
}
...

在 users 加入下面认证类型:

$ sudo vi /etc/freeradius/users
...
DEFAULT Auth-Type = PAM
      Fall-Through = 1
...

测试

配置完毕后重启 freeradius:

$ sudo /etc/init.d/freeradius restart

如果要 debug 的话这样启动 freeradius:

$ sudo /etc/init.d/freeradius stop
$ sudo freeradius -X

先测试使用 LDAP 方式登陆系统是否正确,使用 LDAP 用户名和密码从另一台电脑 ssh 登陆到这台 Radius 服务器,如果不用本地帐号而用 LDAP 帐号顺利登陆的话就说明这台服务器已经能顺利使用 LDAP 登陆了:

$ ssh vpsee@192.168.2.65

测试 Radius 服务是否能正确从 LDAP 那里得到验证信息,使用 ldap 用户名和密码测试 Radius 服务是否反馈正确消息 Access-Accept:

$ radtest vpsee "password" 192.168.2.65 1 testing123
Sending Access-Request of id 233 to 192.168.2.65 port 1812
	User-Name = "vpsee"
	User-Password = "password"
	NAS-IP-Address = 192.168.2.65
	NAS-Port = 1
rad_recv: Access-Accept packet from host 192.168.2.65 port 1812, id=233, length=20

另一种办法

另外有个办法是不用 pam 的方式,直接用 freeradius-ldap 模块和 LDAP 服务器连接,这种办法不适合我们实验室的应用场景,不过配置要简单一些。简单说一下就是利用 freeadius 的 ldap 模块直接连接 LDAP 服务器验证用户。先安装 freeradius-ldap 模块:

$ sudo apt-get install freeradius-ldap

然后配置 clients.conf

$ sudo vi /etc/freeradius/module/ldap
...
ldap {
        server = "ldap.vpsee.com"
        identity = "cn=admin,o=My Org,c=UA"
        password = mypass
        basedn = "o=My Org,c=UA"
        filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
...

然后取消下面2个文件里面关于 ldap 的相关注释:

$ sudo vi /etc/freeradius/sites-available/default
$ sudo vi /etc/freeradius/sites-available/inner-tunnel

重启 freeradius 让配置生效:

$ sudo /etc/init.d/freeradius restart

OneStack:Ubuntu 12.04 上一键自动部署 OpenStack

前几天 OneStack 项目 的作者 Kayven 在 vpsee.com 上留言谈到了 OneStack,一个国人的 OpenStack 一键安装工具,在 vpsee 的忽悠下 Kayven 终于同意写一篇 OneStack 的介绍性文章,如果大家对手动安装配置 OpenStack 有恐惧的话可以试试这个 OneStack 一键安装工具,类似的项目还有 DevStack.

大家如有问题欢迎参与讨论或联系原作者 Kayven (Hily.Hoo@gmail.com). 以下内容来自 Kayven:

在发表了 OneStack: Ubuntu 12.04 (“Precise”) 一键安装部署云计算平台 OpenStack Essex 这篇文章、公布了 OneStack 这个项目后,受到一些人的关注和邀请,诚惶诚恐,非常感谢大家的支持,下面将对这个项目进行更详细的介绍。

OneStack 的引入

为什么需要 OpenStack?作为众多云计算项目的一个,OpenStack 很火。

一是因为 OpenStack自身的优势、Apache2.0 授权的开源性以及兼容性、灵活性和可扩展性等优点;
二是众多企业和组织的参与开发,尤其是世界领军企业的加入,推动了 OpenStack 的高速成长。

为什么需要 OneStack?类似项目有 DevStack,但是使用 DevStack 有如下问题:

部署过错的可定制性和灵活性不是太好,自己只能选择安装哪些服务,如果中间遇到问题或者自己想调整就比较麻烦;
使用 screen 管理运行 OpenStack,重启服务器需要用 screen 进入,很多人以为有些服务会停止或者希望不使用 screen,于是自己 kill 服务并自己手动开启,容易出各种问题(OpenStack 由很多独立组件和服务组成,注意不要遗漏);
没有提供重启、重置、清空数据库等有用功能,还稍显复杂;
而且,使用 DevStack 后还是不清楚整个部署过程是怎样的,自己不能安装官方安装文档来实验和尝试;
由于组件独立分散,安装过程过于繁琐,可以抽象成通用的项目供大家方便使用;
官方提供了一个比较完善的入门文档,但是,按照这几十页的步骤下来需要做很多无用功,容易漏错而引起很多莫名和头疼的问题;
本项目希望不只是提供实验环境,更可以实际部署使用,可以自己修改配置,按需增加组件和功能,实现一键部署,可扩展、可添加任意计算节点。

为什么需要一键自动部署工具?

很多人首先希望尝试一下 OpenStack,做做实验,弄清楚具体怎么实践。官方文档的一大堆步骤会让人忘而生畏;同时又不想部署好后都不知道到底怎么做的,像 DevStack 这样封装比较难看懂,也就难自己修改。OneStack 能够很好的自动部署,同时又能灵活的实验,对于大部分尝试者是个很好的途径。

为什么使用 Ubuntu 12.04?

OpenStack 官方指定的操作系统是 Ubuntu,当然也可以使用其他的,比如 CentOS,不过安装过程有可能会不同。OpenStack 目前主要是以 Ubuntu 版本 Linux 系统为基础写成的,而且很多测试和文档都是在 Ubuntu 下完成的,所以在 Ubuntu 下部署将会有很多便利。另外,Ubuntu 12.04不仅是LTS(长期支持版本),还可以得到五年的支持,对于开发者是个不错的平台。

OneStack 的项目结构

  • oneStack.sh(一键部署 all-in-one 的 OneStack,最主要文件);
  • addComputeNode.sh(增加计算节点);
  • delStack.sh(只卸载nova、glance、keystone等);
  • delAll.sh(卸载所有安装的组件和工具);
  • resetStack.sh(清空数据库,镜像、网络和实例等);
  • addClient.sh(添加客户端,nova管理等);
  • setup_base.sh(安装基本系统);
  • setup_test.sh(添加镜像和实例);
  • HAStack 目录(OneStack 的高可用性,希望更多人可以提出自己的解决方案)。

OneStack 的安装部署

可以一键自动部署 all-in-one 的 OneStack 实验环境,也可以分步骤部署(下次再讨论分步骤部署)。
一键自动部署最简单,只需要文件 oneStack.sh 把所有服务安装到一个机器。

# wget http://onestack.googlecode.com/files/oneStack.sh && \
chmod +x oneStack.sh && ./oneStack.sh

如果需要更多功能,需要 chechout 整个 svn;当然,安装同样只需要 oneStack.sh
1、安装 Ubuntu Precise (12.04);
2、下载 OneStack 脚本:

# svn checkout http://onestack.googlecode.com/svn/trunk/ onestack-read-only

3、运行 OneStack:

# cd onestack-read-only/ && ./oneStack.sh

注意:其实上面的安装还是需要更改网络配置的(其余可以不改,这个是需要改成你自己的)因为,为了简单,在上面的工具里,所有前期工作都加到了文件 oneStack.sh,比如:

  • root 用户密码设置(刚安装的 Ubuntu 默认不启用这个 root 用户);
  • apt 源的配置,可以设置为国内的 163、ustc 的源等;
  • 网络配置,控制节点是需要外网 ip 的,你需要更改oneStack.sh里面的一些配置:/etc/network/interfaces 里面双网卡的 ip、网关等,在脚本靠前的位置,请查找 interfaces. 参数设置:外网 ip 地址等,这些也都在脚本开头一个块里面。自行检查下面 network/interfaces 的两个网卡设置:
    ## 2、自行检查下面 network/interfaces的两个网卡设置
    + OUT_IP=192.168.139.50 
    + OUT_IP_PRE=192.168.139
    ...
    
  • 选择虚拟机技术,裸机使用 kvm,虚拟机使用 qemu 即可
    ## 选择虚拟技术,裸机使用 kvm,虚拟机里面使用 qemu
    VIRT_TYPE=”qemu”
  • 数据库的安装和配置,为了自动化部署,参数设置里面设置好帐号和密码,后面就不需要交互;## 配置 /etc/nova/nova.conf,这里与控制节点的配置相同!比如ip是控制节点的ip
    MYSQL_PASSWD=${MYSQL_PASSWD:-“cloud1234”}
    NOVA_DB_USERNAME=${NOVA_DB_USERNAME:-“novadbadmin”}
    NOVA_DB_PASSWD=${NOVA_DB_PASSWD:-“cloud1234”}
  • 系统会安装 Ubuntu 12.04 的镜像,并启动一个实例。这个过程中镜像自动从 Ubuntu 官网下载,可以查找 cloud-images 更换地址或者镜像 precise-server-cloudimg-amd64-disk1.img,也可以注释掉这个步骤,直接使用 dashboard 在 web 添加镜像启动实例。这个镜像有700多 MB,对于网速不好的用户,可能需要较长时间,因此可以先下载好镜像,然后把这里的地址改成本地即可。

总结一下需要设置的参数:

  • 设置 root 密码这一步可以删掉,使用 root 执行即可;
  • 可选,如果不需要跳过本步骤
    系统语言设置,可以参考oneStack.sh locale部分,不在此介绍
    设置apt源 /etc/apt/sources.list
  • 设置网络
    /etc/network/interfaces
    可以参考oneStack.sh locale部分
  • 配置参数,除了网络ip,其它可以不变
    ## 数据库
    MYSQL_PASSWD=${MYSQL_PASSWD:-“cloud1234″}
    ## 自行检查下面network/interfaces的两个网卡设置与此处一致
    OUT_IP=”192.168.139.50″
    ## 选择虚拟技术,裸机使用kvm,虚拟机里面使用qemu
    VIRT_TYPE=”qemu”
    ## token, 登录dashboard密码
    ADMIN_TOKEN=”admin”
  • 然后执行./oneStack.sh安装即可。

OneStack 的展望

1、加入高可用性 OpenStack 的部署
详见构建 OpenStack 的高可用性(HA,High Availability)对高可用性OpenStack的讨论。对照 CAP 理论,OpenStack 的分布式对象存储系统 Swift 满足了可用性和分区容忍性,没有保证一致性(可选的),只是实现了最终一致性。对于 Swift 的研究和学习网上很多,我不做介绍。但是,在整个 OpenStack 架构中,要满足高可用性需要进行很多工作来保证。主要是通过分离、冗余技术实现,也就是 nova-api、nova-network、glance 等可以分别在多节点上工作,RabbitMQ 可以工作在主备模式,MySQL 可以使用冗余的高可用集群。这些组合可能有很多问题,有些也需要加入到 OpenStack 项目。

2、加入对 Ubuntu 以外的操作系统(如 CentOS)的支持
个人精力有限,所以没有对 CentOS 等其它版本进行支持,也没有对 Ubuntu11 等版本进行测试。但是大家应该只需要把 OneStack 稍加改动就可以用到这些版本的操作系统。因此,如果有人有改好的,可以拿出来分享,别人也也可以顺便帮你改善和讨论。

3、希望更多的有时间的同行参与
正如上面所说,个人精力有限,业余所做,肯定有诸多不足,而且对其它版本没有添加支持,更主要的,希望对高可用性(HA)这个很关键的要求实现自动化部署,因此希望多提出意见建议、多分享自己的经验和成果,造福别人也提高自己。

在 Ubuntu 12.04 上安装和配置邮件服务

postfix

前段时间把一台 FreeBSD 邮件服务器移到了 Ubuntu 虚拟机,又痛苦的配置了一次邮件服务器,配置完后再写一遍 Puppet 代码,把整个配置过程代码化,然后再重建一次虚拟机测试和应用 Puppet 代码,每次看到满屏的自动配置过程都会惊讶 Puppet 的魔力

邮件服务器配置之所以麻烦是因为需要了解很多东西,牵涉到域名服务 DNS/Bind,Web 收发邮件 Apache/PHP/MySQL/SquirrelMail,认证服务 LDAP, Kerberos, PAM,邮件通常存放在额外存储上还要 NFS/SAN,邮件服务 Postfix/Dovecot,反垃圾反病毒 Postgrey/Clam AV/SpamAssassion,安全认证 SSL,监控和备份等等,这一套下来基本包括了 Linux 系统管理的方方面面,所以说配置一个安全可靠的企业级邮件系统不容易,足够写一本书。个人配置邮件服务器通常不需要 LDAP/Kerbersos/NFS/SAN/SSL 这些,剔除这些后就不是那么复杂了,不过再想一下,个人有必要配置邮件服务器么?直接用免费的 Google App 不是很方便么。

准备工作

简单介绍一下我们将要安装的软件包:

  • Postfix: 用来接受和发送邮件的邮件服务器,正确说法应该叫邮件传送代理(Mail Transfer Agent,MTA),是邮件服务最重要的部分;
  • Dovecot: POP 和 IMAP 服务器,用来管理本地邮件目录以便用户能通过 Mail.app, Thunderbird, Mutt 等邮件客户端(又叫邮件用户代理 Mail User Agent, MUA)登陆和下载邮件;
  • Postgrey: 邮件灰名单工具,可简单的抵挡垃圾邮件;
  • amavisd-new: 一个代理,用于连接邮件传输代理和内容检查器,可以理解为 Postfix 把邮件交给它,它负责联系病毒扫描和垃圾邮件过滤;
  • Clam AntiVirus: 病毒扫描工具;
  • SpamAssassin: 垃圾邮件内容过滤工具;
  • Postfix Admin: Postfix 的 Web 前端,用来管理邮件用户和域名。

设置主机名(不要跳过这一步):

# hostname mail.vpsee.com

# vi /etc/hosts
127.0.0.1 mail.vpsee.com localhost

更新系统:

$ sudo apt-get update
$ sudo apt-get upgrade

安装必要软件包

安装 LAMP,Postfix 本身不需要 Apache/PHP/MySQL,但是因为要安装 Postfix Admin,并且管理用户需要用到数据库,所以要安装 Apache/PHP 和 MySQL.

$ sudo apt-get install lamp-server^
$ sudo apt-get install php-apc php5-curl php5-gd php-xml-parser php5-imap

安装邮件服务器及一些工具:

$sudo apt-get install mail-server^

$sudo apt-get install postfix-mysql dovecot-mysql postgrey
$sudo apt-get install amavis clamav clamav-daemon spamassassin

$sudo apt-get install libnet-dns-perl pyzor razor
$sudo apt-get install arj bzip2 cabextract cpio file gzip nomarch pax unzip zip

配置 Apache

编辑 apache 配置文件后重启:

$ sudo vi /etc/apache2/sites-available/default
...
    DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
...

$ sudo /etc/init.d/apache2 restart

配置 MySQL 数据库

创建一个名为 mail 的数据库并设置权限和密码:

$ mysql -uroot -p

mysql> create database mail;
mysql> grant all on mail.* to 'mail'@'localhost' identified by 'password';

配置 Postfix Admin

下载 psotfixadmin,解压后放到 /var/www:

$ wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.5/postfixadmin-2.3.5.tar.gz
$ gunzip postfixadmin-2.3.5.tar.gz
$ tar -xf postfixadmin-2.3.5.tar
$ sudo mv postfixadmin-2.3.5 /var/www/postfixadmin
$ sudo chown -R www-data:www-data /var/www/postfixadmin

配置 postfixamdin,标准的 php 程序配置方法,填入访问数据库需要的信息,其中 setup_password 部分稍后再填入:

$ sudo vi /var/www/postfixadmin/config.inc.php
...
$CONF['configured'] = true;
$CONF['setup_password'] = '稍后替代';
$CONF['postfix_admin_url'] = 'http://mail.vpsee.com/postfixadmin';
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'mail';
$CONF['database_password'] = 'password';
$CONF['database_name'] = 'mail';
$CONF['admin_email'] = 'admin@vpsee.com';
$CONF['encrypt'] = 'md5crypt';
...

用浏览器访问 http://mail.vpsee.com/postfixadmin/setup.php,用哈希后的密码字符串替代上面 $CONF[‘setup_password’] = ‘稍后替代’ 中的相关部分。

为了安全考虑,最好禁止 web 访问 setup.php:

$ sudo vi /var/www/postfixadmin/.htaccess

deny from all

配置 Dovecot

给系统添加 vmail 帐号:

$ sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Virtual Mail" vmail
$ sudo mkdir /var/vmail
$ sudo chmod 770 /var/vmail
$ sudo chown vmail:mail /var/vmail

开始配置 Dovecot,dovecot 支持多种认证方式,这里采用数据库认证,注意下面的配置文件一个包含一个,初看比较乱,10-auth.conf 有 !include auth-sql.conf.ext 一行,会包含 /etc/dovecot/conf.d/auth-sql.conf.ext,而 auth-sql.conf.ext 会包含下面要提到的 /etc/dovecot/dovecot-sql.conf.ext,这样只要用不同的 include 就可以切换不同的认证方式,虽然初看复杂一点但是熟悉以后用起来还是挺方便的。

$ sudo vi /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = yes
auth_mechanisms = plain login

!include auth-sql.conf.ext

配置 Dovecot,设置数据库参数,以便 dovecot 能正确访问刚才创建的 mail 数据库:

$ sudo vi /etc/dovecot/dovecot-sql.conf.ext
...
driver = mysql
connect = host=localhost dbname=mail user=mail password=password
default_pass_scheme = MD5-CRYPT
...
password_query = \
  SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, \
  'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid \
  FROM mailbox WHERE username = '%u' AND active = '1'

user_query = \
  SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, \
  150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota \
  FROM mailbox WHERE username = '%u' AND active = '1'
...

用户在服务器上用来存放邮件的地方在哪呢?所以需要指定邮件存放地址 /var/vmail,这个目录上面在创建 vmail 帐号时已经创建了:

$ sudo vi /etc/dovecot/conf.d/10-mail.conf
...
mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = mail
...

修改 /etc/dovecot/conf.d/10-master.conf

$ sudo vi /etc/dovecot/conf.d/10-master.conf
...
service auth {
  unix_listener auth-userdb {
   mode = 0600
    user = vmail
    group = mail
  }
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix        
  }
...

确认 dovecot 有权限读取配置文件:

$ sudo chown -R vmail:dovecot /etc/dovecot
$ sudo chmod -R o-rwx /etc/dovecot

配置 Amavis, ClamAV, SpamAssassin

互加 clamav, amavis 用户到对方组里以便能互相访问,配置过滤模式:

$ sudo adduser clamav amavis
$ sudo adduser amavis clamav

$ sudo vi /etc/amavis/conf.d/15-content_filter_mode
use strict;
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1; # ensure a defined return

启用 spamassassin:

$ sudo vi /etc/default/spamassassin
...
ENABLED=1
CRON=1
...

配置 Postfix

main.cf 是 postfix 的主要配置文件:

$ sudo /etc/postfix/main.cf
...
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

myhostname = mail.vpsee.com
myorigin = /etc/hostname
mydestination = mail.vpsee.com, localhost
mynetworks = 127.0.0.0/8
inet_interfaces = all
mynetworks_style = host

virtual_mailbox_base = /var/vmail/
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/m
ysql_virtual_alias_domainaliases_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf

mail_spool_directory = /var/mail
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

content_filter = amavis:[127.0.0.1]:10024

header_checks = regexp:/etc/postfix/header_checks
...

注意上面配置有行 header_checks = regexp:/etc/postfix/header_checks,我们现在还没有 header_checks 文件,创建一个并包含一下内容,给自己邮件增加一点隐私,过滤一些信息:

$ sudo vi /etc/postfix/header_checks
/^Received:/                 IGNORE
/^User-Agent:/               IGNORE
/^X-Mailer:/                 IGNORE
/^X-Originating-IP:/         IGNORE
/^x-cr-[a-z]*:/              IGNORE
/^Thread-Index:/             IGNORE

还需要配置 master.cf 文件:

$ sudo vi /etc/postfix/master.cf
...
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
  -o smtpd_sasl_security_options=noanonymous,noplaintext
  -o smtpd_sasl_tls_security_options=noanonymous

amavis      unix    -       -       -       -       2       smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20
127.0.0.1:10025 inet    n       -       -       -       -       smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=reject_unauth_pipelining
  -o smtpd_end_of_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

dovecot      unix   -        n      n       -       -   pipe
  flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(recipient)

还需要配置几个文件:

$ sudo vi /etc/postfix/mysql_virtual_alias_domainaliases_maps.cf
user = mail
password = password
hosts = 127.0.0.1
dbname = mail
query = SELECT goto FROM alias,alias_domain
  WHERE alias_domain.alias_domain = '%d'
  AND alias.address=concat('%u', '@', alias_domain.target_domain)
  AND alias.active = 1

$ sudo vi /etc/postfix/mysql_virtual_alias_maps.cf
user = mail
password = password
hosts = 127.0.0.1
dbname = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'

$ sudo vi /etc/postfix/mysql_virtual_domains_maps.cf
user = mail
password = password
hosts = 127.0.0.1
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

$ sudo vi /etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf
user = mail
password = password
hosts = 127.0.0.1
dbname = mail
query = SELECT maildir FROM mailbox, alias_domain
  WHERE alias_domain.alias_domain = '%d'
  AND mailbox.username=concat('%u', '@', alias_domain.target_domain )
  AND mailbox.active = 1

$ sudo vi /etc/postfix/mysql_virtual_mailbox_maps.cf
user = mail
password = password
hosts = 127.0.0.1
dbname = mail
table = mailbox
select_field = CONCAT(domain, '/', local_part)
where_field = username
additional_conditions = and active = '1'

大功告成,重启相关服务:

$ sudo service spamassassin restart
$ sudo service clamav-daemon restart
$ sudo service amavis restart
$ sudo service dovecot restart
$ sudo service postfix restart

测试 Postfix

用 telnet 连上邮件服务器的 25 端口(SMTP),然后发送 HELO mail.vpsee.com 指令就会得到 250 mail.vpsee.com 确认信息:

$ telnet mail.vpsee.com 25 
Trying 192.168.2.66...
Connected to mail.vpsee.com.
Escape character is '^]'.
220 mail.vpsee.com ESMTP Postfix (Ubuntu)
HELO mail.vpsee.com
250 mail.vpsee.com

用 telnet 发送一封邮件试一下,下面的 MAIL FROM, RCPT TO, DATA, ., QUIT 都是指令:

$ telnet mail.vpsee.com 25 
Trying 192.168.2.66...
Connected to mail.vpsee.com.
Escape character is '^]'.
220 mail.vpsee.com ESMTP Postfix (Ubuntu)
MAIL FROM:<test1@vpsee.com>
250 2.1.0 Ok
RCPT TO:<test2@vpsee.com>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: a test message
This is a test message!
.
250 2.0.0 Ok: queued as 6832FF0036
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

ssh 登陆邮件服务器后去 /var/vmail 邮件目录看一下就可以证实 test2 用户是否收到来自 test1 用户的邮件,当然这个邮件也可以通过 Mail.app, Thunderbird, Mutt 这类工具收到本地电脑上看

使用 mutt, fetchmail, maildrop, msmtp 收发邮件

现在已经有了 Mail.app, Thunderbird, Outlook 这些图形化工具能很方便的处理邮件,为啥还需要 mutt 这种命令行文本方式的邮件工具呢?mutt 的一个优势是占用资源小,可以很好的运行在低配置的虚拟机或古老的电脑上(应该不会有人想在 256MB 内存的虚拟机或 VPS 上用 X Window/Gnome/Thunderbird 这种组合吧)。那为什么要在虚拟机上收发邮件呢,不能在自己电脑上处理邮件吗?可能有多个电脑而且电脑经常换,电脑可能被盗,硬盘可能坏、数据可能丢,邮件放在本地电脑不太方便,有些电脑可能是共用的,在共用电脑上保留自己的邮件帐号不爽。那为啥不直接用 Gmail 收发 POP/IMAP 工作邮件呢?有时候可能需要在别人的电脑上打开工作邮件,比如核对一些事情、计划、会议记录之类的,在公共电脑或者别人电脑上开自己的私人邮箱是件很危险的事情,谁知道电脑上有没有病毒、木马或者键盘纪录程序?

建议经常使用 Gmail 的用户激活 2-step verification 增加安全性。

总之吧,现在的需求是:ssh 到一台服务器或虚拟机上,用 mutt 处理邮件。

在 Ubuntu 上

在 Ubuntu 上安装 mutt + fetchmail + maildrop + msmtp:

# apt-get install mutt fetchmail maildrop msmtp

在 FreeBSD 上

在 FreeBSD 上安装 mutt + fetchmail + maildrop + msmtp:

# pkg_add -r mutt
# pkg_add -r fetchmail
# pkg_add -r maildrop
# pkg_add -r msmtp

配置 mutt

touch 一个文件用来存放邮件:

# mkdir /var/spool/mail
# touch /var/spool/mail/vpsee

配置 fetchmail 通过 POP 收邮件:

$ vi .fetchmailrc
poll "mail.vpsee.com"
protocol pop3
username "vpsee"
password "password"
mimedecode                      # 自动处理 mime 
mda "/usr/bin/maildrop"         # 告诉 fetchmail 使用哪个 MDA (for Ubuntu)
#mda "/usr/local/bin/maildrop"  # 告诉 fetchmail 使用哪个 MDA (for FreeBSD)

$ chmod 0700 .fetchmailrc

配置 maildrop,告诉 maildrop 把邮件分发到哪里(其实是一个 /var/spool/mail/ 下的一个文件),注意这个时候要处理一下权限问题,否则用户登陆执行 fetchmail 后由 maildrop 分发到邮箱( /var/spool/mail/vpsee)的时候会出现权限错误(因为 maildrop 没有权限写那个文件):

# touch /var/spool/mail/vpsee
# chown vpsee:vpsee /var/spool/mail/vpsee

$ vi .mailfilter
HOME=/home/vpsee              # 指定 home 目录
DEFAULT=/var/spool/mail/vpsee # 想在哪里保持邮件
logfile "$HOME/.maillog"      # 日志

配置 msmtp 用 SMTP 发邮件:

$ vi .msmtprc
account default
host mail.vpsee.com
from vpsee@vpsee.com
auth off

配置 mutt,在 mutt 配置文件里面指明 msmtp 路径,注意 Ubuntu 和 FreeBSD 的默认安装路径不同(/usr/bin vs /usr/local/bin)

$ vi .muttrc
set realname            = "vpsee"
set from                = "vpsee@vpsee.com"
set use_from            = yes
set envelope_from       = yes
set spoolfile           = /var/spool/mail/vpsee
set sendmail="/usr/bin/msmtp" # for Ubuntu
#set sendmail="/usr/local/bin/msmtp" # for FreeBSD

使用 mutt

执行 fetchmail 收邮件,然后就可以用 mutt 读、写、回复邮件了:

$ fetchmail -v

$ mutt

mutt

使用 collectd 和 Graphite 监控服务器

Graphite 只是一个数据绘图工具,安装 Graphite 完以后啥也不能干,需要其他工具喂它数据,所以具体的数据采集工作是由第三方工具完成,Graphite 的设计体现了 Unix 的思想:只做一件事,把事情做好。Graphite 支持的第三方工具很多,Bucky, collectd, Collectl, Charcoal, Diamond, Ganglia, Host sFlow, statsd, Tasseo 等等。这里 VPSee 选用 collectd 来收集机器的各个性能参数,collectd 安装在需要被监控的机器上。

安装 collectd,创建一个 collectd.d 目录便于存放稍后会遇到的插件配置文件 graphite.conf,并在 collectd.conf 包含这个目录 :

$ sudo apt-get install collectd

$ sudo mkdir /etc/collectd/collectd.d
$ sudo vi /etc/collectd/collectd.conf
...
Include      "/etc/collectd/collectd.d"

安装 git 并下载 collectd-carbon 插件:

$ sudo apt-get install git

$ sudo git clone https://github.com/indygreg/collectd-carbon.git /opt/collectd-plugins

修改插件的配置文件的 ModulePath 部分,指向 carbon_writer.py 文件所在目录,并且修改 LineReceiverHost 部分:

$ sudo vi /etc/collectd/collectd.d/graphite.conf
<LoadPlugin "python">
    Globals true
</LoadPlugin>

<Plugin "python">
    # carbon_writer.py is at path /opt/collectd-plugins/carbon_writer.py
    ModulePath "/opt/collectd-plugins/"

    Import "carbon_writer"

    <Module "carbon_writer">
        LineReceiverHost "monitor.vpsee.com"
        LineReceiverPort 2003
        DifferentiateCountersOverTime true
        LowercaseMetricNames true
        TypesDB "/usr/share/collectd/types.db"
    </Module>
</Plugin>

修改好配置文件后重启服务:

$ sudo /etc/init.d/collectd restart

大功告成,等着客户端的 collectd 收集数据发送给监控服务器的 carbon(监听端口为 2003)吧,然后递交给 graphite 绘制图形。

在 Ubuntu 12.04 上安装 Graphite 监控工具

有几个朋友都跟我提过 Graphite,监控工具里面的新秀,一直都没时间关注,最近把 n 台物理服务器用 Puppet 代码化的任务完成后有了不少空闲时间,抽时间看了看 Graphite,先搜了一下中文想看看大家对这个工具有啥看法,居然没人提到这个工具,哪怕一篇博客一个帖子都没有??

常收到一些学生朋友来信,问到一些 Linux、计算机方面的学习建议,VPSee 能给的第一个建议是学好英语,优秀的技术人员必须能熟练的翻阅英文资料,大家也看到了,可用的中文资料真的不多,虽然英文会议我们可以不去、英文技术会议的视频也可以不看,但是平时的一些技术交流邮件、Github、Mailing list、经典技术书籍、文档、好的技术博客等都需要英文。Eric Steven Raymond 在他的那篇有名的 How To Become A Hacker 里也提到了:

If you don’t have functional English, learn it.

如果不能用英语交流,Linus Torvalds 写出来的 Linux 可能也就出不了芬兰,也不会有今天的成功。

废话打住,来看 Graphite.

Graphite 是一个(可运行在廉价硬件上的)企业级开源监控工具,用于采集服务器实时信息并进行统计,可采集 n 个服务器实时状态,如:用户请求消息,Memcached 命中率,RabbitMQ 消息服务器状态、操作系统负载、等等。Graphite 使用 Python 编写,采用 Django 框架,使用自己的简单文本协议通讯,服务平均每分钟有4800次更新操作,简单的文本协议和强大的绘图功能可以方便地扩展到任何需要监控的系统上。

和其他监控工具不同的是,Graphite 自己本身并不收集具体的数据,这些数据收集的具体工作通常由第三方工具或插件完成(如 Ganglia, collectd, statsd, Collectl 等,参考:使用 collectd 和 Graphite 监控服务器)。所以上面说 “Graphite 是一个系统监控工具” 的说法不完全正确,更准确的说法应该是 “Graphite 是一个数据绘图工具”,得到数据后绘图,它并不关心具体数据,你甚至可以把每天收到的邮件数当作参数传给 Graphite 制成图,然后一段时间后就生产一个漂亮的邮件繁忙展示图,并可以看出趋势。

简单的说,Graphite 做两件事:1、存储数据;2、按需绘图。

安装必要软件包:

$ sudo apt-get install apache2 libapache2-mod-wsgi python-django \
python-twisted python-cairo python-pip python-django-tagging

用 pip 安装 whisper (简单的存放和操作数据的库), carbon (监控数据的 Twisted 守护进程) 和 graphite-web (Django webapp):

$ sudo pip install whisper
$ sudo pip install carbon
$ sudo pip install graphite-web

初始化配置,直接用 example 文件里的默认配置就可以:

$ cd /opt/graphite/conf/

$ sudo cp carbon.conf.example carbon.conf
$ sudo cp storage-schemas.conf.example storage-schemas.conf
$ sudo cp graphite.wsgi.example graphite.wsgi

修改 apache 配置,增加一个 vhost 或者偷懒下载一个配置文件覆盖 default,覆盖后需要重新 reload 配置:

$ wget http://launchpad.net/graphite/0.9/0.9.9/+download/graphite-web-0.9.9.tar.gz
$ tar -zxvf graphite-web-0.9.9.tar.gz
$ cd graphite-web-0.9.9
$ sudo cp examples/example-graphite-vhost.conf /etc/apache2/sites-available/default

sockets 最好不要放在 /etc/httpd/ 下面(不同 Linux 发行版本对不同目录的权限问题很混淆人),ubuntu 版本可以放在 /var/run/apache2 下,所以修改 default 文件里的 WSGISocketPrefix 部分:

$ sudo vi /etc/apache2/sites-available/default
...
WSGISocketPrefix /var/run/apache2/wsgi
...

$ sudo /etc/init.d/apache2 reload

初始化 graphite 需要的数据库,修改 storage 的权限,用拷贝的方式创建 local_settings.py 文件:

$ cd /opt/graphite/webapp/graphite/

$ sudo python manage.py syncdb
$ sudo chown -R www-data:www-data /opt/graphite/storage/
$ sudo cp local_settings.py.example local_settings.py

$ sudo /etc/init.d/apache2 restart

启动 carbon:

$ cd /opt/graphite/

$ sudo ./bin/carbon-cache.py start

浏览器访问 IP 地址后就可以看到 graphite web 界面:
graphite

如何让 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

在 Ubuntu 11.10 上安装 Sun Grid Engine

Sun Grid Engine(现在叫做 Oracle Gird Engine)是一套开源的分布式资源管理软件,用来统一管理和利用所有(愿意被管理的)电脑上的资源,使得这些电脑(集群)使用起来就像一台电脑一样,好处是可以随意扩展总的计算资源(买更多的电脑加入集群),并且管理上就像使用一台电脑一样方便。使用者只需要把需要计算的工作准备好,提交到 Sun Grid Engine (SGE),SGE 就会根据已经订好的管理策略以及使用者的需求在集群里找到合适的电脑来完成计算工作。SGE 主要用在高性能计算、网格计算等领域。

我们云计算项目里面有个想法就是能在我们的云计算平台上快速创建多个高配置虚拟机并自动接入到 SGE 集群,能迅速满足整个实验室高峰时期的计算需求。目前我们的 SGE 集群包含 2 台 IBM 超级计算机,n 台 PC 服务器和多个刀片服务器,以后为了临时满足高峰时期的计算要求会从云里申请多个虚拟机并自动配置到 SGE 集群里。

安装 Sun Grid Engine 需要 Java 的支持(最好是 SUN 的 Java 版本),所以所有结点都需要安装 Java 包。Ubuntu 从 11.10 版本不在提供 SUN 的官方 Java 版本,需要另外的源:

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ferramroberto/java
$ sudo apt-get update
$ sudo apt-get install sun-java6-jre

首先在所有结点上修改 /etc/hosts,grid00 是主控结点,grid01 和 grid02 是执行结点(我们一般把主控结点叫做 master 或者 head,执行结点叫做 client):

$sudo vi /etc/hosts
127.0.0.1	localhost.localdomain	localhost
192.168.2.10	grid00.vpsee.com	grid00
192.168.2.11	grid01.vpsee.com	grid01
192.168.2.12	grid02.vpsee.com	grid02

在主控结点(grid00)上安装 gridengine-master 以及一些管理工具 qhost/qconf/qstat 等(包含在 gridengine-client 中):

$ sudo apt-get install gridengine-client gridengine-common gridengine-master

如果不习惯命令行界面,可以在主控结点上装个 qmon 图形管理工具,界面如下:

$ sudo apt-get install xserver-xorg gridengine-qmon

sun grid engine qmon guy

在所有执行结点(grid01 和 grid02)上安装 gridengine-exec:

$ sudo apt-get install gridengine-exec

在主控结点上执行以下操作把所有的执行结点加到集群里:

$ sudo -i

# qconf -ah grid01
# qconf -ah grid02

在所有执行结点执行以下操作,通过 act_qmaster 这个文件识别主控结点,然后启动服务:

$ sudo echo "grid00.vpsee.com" > /var/lib/gridengine/default/common/act_qmaster

$ sudo /etc/init.d/gridengine-exec start

最后在主控结点上查看一下是否成功:

# qhost
HOSTNAME                ARCH         NCPU  LOAD  MEMTOT  MEMUSE  SWAPTO  SWAPUS
-------------------------------------------------------------------------------
global                  -               -     -       -       -       -       -
grid00.vpsee.com        -               -     -       -       -       -       -
grid01.vpsee.com        lx26-amd64     24 24.00   63.0G    1.7G    3.7G     0.0
grid02.vpsee.com        lx26-amd64      8  0.01   55.2G  642.2M    1.0G     0.0

测试

如何知道这个集群是否能正常工作呢?提交一个任务(job)测试一下。在主控结点上写一个简单脚本打印当前 Linux 内核版本:

# vi uname.sge 
#!/bin/bash
uname -a

然后用 qsub 提交这个脚本到 SGE 集群:

# vi uname.sge 
#!/bin/bash
uname -a

# qsub uname.sge
qsub uname.sge 
Your job 3557 ("uname.sge") has been submitted

如果运行成功就会在某个执行结点的自己目录下面(我这里用的是 root 帐号,所以是 /root 目录)得到2个文件,执行结果就在 uname.sge.o3557 这个文件里:

# ls
uname.sge.e3557  uname.sge.o3557

# cat uname.sge.o3557 
Linux grid02 3.0.0-16-server #29-Ubuntu SMP Tue Feb 14 13:08:12 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

如何在 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

Ubuntu 自建「Amazon EC2」私有云

linuxpilot 111

VPSee 上次写的一篇密码保护的文章已经发表在 Linuxpilot 月刊第111期,标题是:Ubuntu 自建「Amazon EC2」私有云,3月14日出版,文章图文并茂详细的描述了如何架设 OpenStack 私有云。这本杂志主要在香港和台湾发行,在香港书报摊、7 Eleven、OK 便利店、书店和多个台湾销售点都能买到,售价是40元港币。我不太清楚大陆书店或报刊亭是否能买到,望买到的朋友能留言告知~~

Linuxpilot月刊第111期簡介

名稱:Linuxpilot 國際中文版
售價:HK$40/NT$160
編輯:蕭友強 主筆:麥經倫
出版:Linux Pilot Ltd.
出版日期:2012年3月14日
對象:企業用戶及進階用戶
頁數:Linuxpilot 76頁+2頁海報+商智謀略 16頁 (全彩印刷)
尺寸:280mm高 x 205mm闊 (A4 Size)
網址:www.linuxpilot.com 電郵:editorial@linuxpilot.net
地址:香港九龍觀塘鯉魚門道2號新城工商中心2樓9室