2009年5月12日星期二

楚汉争霸之Redhat对决Novell

当大家还在把目光聚集在Oracle、IBM、Sun身上的时候,却忽视了IT业内目前还有两大生力军在互相较劲,他们同属Linux血脉,早期或多或少还有点交情。但随着外界或Linux内部的一些因素发生改变之后,这两家公司激烈的战争也渐渐的浮出了水面。

玩过中国象棋的人都知道,棋盘中央有条界,名曰“楚河、汉界”。这条界是怎么来的呢?其实最早的出处便是在秦朝末年,项羽和刘邦争夺天下所引出来的典故。
公元前206年至公元前202年,刘项之间激战5年,相持不下,双方暂时议和,以鸿沟(今河南贾鲁河)为界,河东属于楚,河西属于汉,以保持“中分天下”的局面。
“先入咸阳者为王!”
为了推翻秦朝的统治,刘邦、项羽歃血为盟,并约定:楚、汉两军谁先攻入咸阳即为天下之王!随即,一场旷日持久、波澜壮阔的战争开始了……

阅读全文请点击:楚汉争霸之Redhat对决Novell
http://os.51cto.com/art/200905/123507.htm

2009年4月7日星期二

CentOS 5.1下 postfix + extmail + dovecot + maildrop 最新版安装笔记

CentOS 5.1下 postfix + extmail + dovecot + maildrop 最新版安装笔记

本文最初发表于 http://hi.baidu.com/delphiss/blog/item/38571c94f7a7d50e7af48052.html
转载请注明出处
作者:wdy

安装环境是 CentOS 5.1,分区的时候 对 /var/spool/postfix 和 /var/vmail 进行了单独分区。

/var/spool/postfix 是postfix存储队列的地方, /var/vmail 是用来存储虚拟账号邮件的。

CentOS提供了很方便的yum在线安装,我的基本原则是非重要、对版本不敏感的模块尽量用yum安装,邮件系统主要模块则用源码编译安装。

首先用yum安装的模块有: mysql mysql-server mysql-devel db4-devel openssl gcc libxml2 libxml2-devel gcc-c++

几个模块都需要用到PCRE, 前面说的 gcc-c++ 是安装PCRE必须的。
下载安装 RCRE:
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz

先说明一下几个模块的搭配。

MTA 用的是 postfix的最新版本 postfix-2.5.5。

web模块是最先需要确定的,因为它决定了mysql表结构,这里选用国产的extmail,其他的根据extmail的需要倒推来确定。

webmail 使用 extmail-1.0.5 ,web管理模块用 extman-0.2.5

最新版本的extmail对maildrop的自动回复、转发等提供了很好的支持,所以MDA采用最流行的maildrop(2.0.4 )

这里面简单说一下为什么要用maildrop。

对虚拟用户投递的支持,postfix自带了一个投递代理(MDA):virtual

virtual投递代理在 master.cf 里描述为:
virtual unix - n n - - virtual

如果我们在main.cf 里 设置 virtual_transport = virtual ,就表示对于包含在 virtual_mailbox_domains 域名里的邮件,都使用virtual进行投递。

postfix自带的virtual只提供了最基本的QUOTA功能,如果想使用更复杂的功能,如自动转发,自动回复,邮件自定义过滤等,就需要换成更高级的MDA。

当然可选择的MDA有很多种,比如 procmail, maildrop 等。我这里选用maildrop,为啥?大家都用这个。。。

用户信息存储方式也有很多可选的,比如mysql,ldap等。这里选mysql,原因是各个模块,包括extmail等对这个支持最好最方便最简单。

maildrop 在投递邮件的时候,需要确定一些数据,比如收件用户的Maildir的路径,保存邮件用的uid,gid,邮箱容量等,这些数据需要maildrop的同门师兄 courier-authlib 来提供,所以要先吧courier-authlib装好。

下面要说的是SMTP 的 SASL认证(这个说来话长,有空补上)。postfix的模块化设计在这里也体现出比qmail高明的地方。

postfix 2.3 以后sasl支持三种模块:
Cyrus SASL version 1
Cyrus SASL version 2
Dovecot protocol version 1

网上大部分的文章都是讲用 Cyrus SASL 2(并用Cyrus IMAP 提供POP3/IMAP服务),本文采用后起新秀 Dovecot 做为 sasl模块,Dovecot同时提供 POP3/IMAP 服务。

Dovecot使用最新的dovecot-1.1.4 。

开始安装!

下载 postfix-2.5.5.tar.gz

postfix安装的是需要指定几个专门的用户和组,先创建

#groupadd -g 2001 postfix
#useradd -g postfix -u 1001 -s /sbin/nologin -M postfix
#groupadd -g 2002 postdrop
#useradd -g postdrop -u 2002 -s /bin/false -M postdrop

编译
#make makefiles CCARGS='-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\" \
-DHAS_PCRE -DHAS_MYSQL \
-I/usr/include/ -I/usr/local/include -I/usr/include/mysql/' \
AUXLIBS='-L/usr/local/lib -L/usr/lib/mysql -lmysqlclient -lpcre'
#make
#make install

make install的提问全部回车默认。
注意参数
-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\"
表示启用SASL身份认证,并默认使用dovecot。
mysql的几个路径可以根据实际情况做修改,我这里的目录都是yum默认安装的。


先导入mysql表结构和数据。

下载extman-0.2.5.tar.gz
解开后进入 docs目录


建库建表:
#mysql -u root -p < extmail.sql
(注意extmail.sql里配置的数据库,用户名,口令都是extmail)

导入初始数据:
#mysql -u root -p < init.sql
(先吧 init.sql 文件里的 extmail.org 改成你自己的域名)

把目录下 mysql_*.cf 全部拷贝至 /etc/postfix
# cp mysql_*.cf /etc/postfix/

下载 dovecot-1.1.4.tar.gz

#./configure --prefix=/usr/local/dovecot --sysconfdir=/etc/dovecot --with-sql --with-sql-drivers --with-mysql --with-ssl=openssl
#make
#make install

注:dovecot的安装参考了javaeye unixboy的文章,略有改动

配置dovecot.conf
#cd /etc/dovecot
#cp dovecot-example.conf dovecot.conf
#vi dovecot.conf

[Copy to clipboard] [ - ]CODE:
base_dir=/var/run/dovecot
protocols=imap imaps pop3 pop3s
listen=*
disable_plaintext_auth = no
ssl_disable = yes
mail_location = maildir:/var/vmail/%d/%n/Maildir
pop3_uidl_format=%08Xu%08Xv

auth default {
...
mechanisms = plain login digest-md5 cram-md5

# 去掉注释
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
...
# 去掉注释
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
...
socket listen {
...
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
配置dovecot-sql.conf
#cp dovecot-sql-example.conf dovecot-sql.conf
#vi dovecot-sql.conf

[Copy to clipboard] [ - ]CODE:
driver = mysql
connect = host=localhost dbname=extmail user=extmail password=extmail
default_pass_scheme = MD5-CRYPT

password_query = SELECT username AS user, password AS password \
FROM mailbox WHERE username = '%u' AND active = '1'

user_query = \
SELECT maildir as home,2001 as uid ,2001 as gid \
FROM mailbox WHERE username='%u' and active='1'
创建符号链接
#ln -s /usr/local/dovecot/sbin/dovecot /usr/bin/dovecot

继续配置 postfix

#mv /etc/aliases /etc/aliases.old
#ln -s /etc/postfix/aliases /etc/aliases
#/usr/bin/newaliases

# vi main.cf

[Copy to clipboard] [ - ]CODE:
myhostname = mail.abc.com
mydomain = abc.com
myorigin = $mydomain
mydestination = $myhostname localhost localhost.$mydomain
mynetworks = 127.0.0.0/8
inet_interfaces = all
home_mailbox = Maildir/

sendmail_path = /usr/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /etc/postfix

#=====================Vritual Mailbox settings=========================
virtual_mailbox_base = /var/vmail/
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_domains =
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_uid_maps = static:2001
virtual_gid_maps = static:2001
virtual_transport = virtual

#====================QUOTA========================
message_size_limit = 52428800
mailbox_size_limit = 209715200
virtual_mailbox_limit = 209715200
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_overquota_bounce = yes

#====================SASL ESMTP Authenticat=================
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
#smtpd_sasl_path 注意这个是dovecot的sasl路径,与 dovecot.conf 里的对应
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_unknown_sender_domain,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
reject_unauth_destination
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
smtpd_banner=$myhostname ESMTP


readme_directory = no
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
queue_directory = /var/spool/postfix
mail_owner = postfix
data_directory = /var/lib/postfix
启动服务
dovecot
postfix start

如果出错,看看 /var/log/maillog

未完待续...高清播放机

linux下TC控制流量文档

欢迎转发交流,但请注明原出处信息.powered by KindGeorge. http://kindgeorge.at.3322.org
#!/bin/bash
#脚本文件名: tc2
#########################################
#用TC(Traffic Control)解决ADSL宽带速度瓶颈技术 Ver.1.0 powered by KindGeorge http://kindgeorge.at.3322.org#
########################################
#此脚本经过实验通过,更多的信息请参阅http://lartc.org
#tc+iptables+HTB+SFQ
#
#一.什么是ADSL? ADSL(Asymmetric Digital Subscriber Loop,非对称数字用户环路)
#用最简单的话的讲,就是采用上行和下行不对等带宽的基于ATM的技术.
#举例,我们最快的其中一条ADSL带宽是下行3200Kbit,上行只有320Kbit.带宽通常用bit表示.
#
#1、下行3200K 意味着什么?
#因为 1Byte=8Bit ,一个字节由8个位(bit)组成,一般用大写B表示Byte,小写b表示Bit.
#所以 3200K=3200Kbps=3200K bits/s=400K bytes/s.
#2、 上行320K 意味着什么?
# 320K=320Kbps=320K bits/s=40K bytes/s.
#就是说,个人所能独享的最大下载和上传速度,整条线路在没任何损耗,最理想的时候,
#下载只有400K bytes/s,上传只有最大40K bytes/s的上传网速.
#这些都是理想值,但现实总是残酷的,永远没有理想中那么好.至少也有损耗,何况内部网有几十台
#电脑一起疯狂上网.
#
#3.ADSL上传速度对下载的影响
#(1)TCP/IP协议规定,每一個封包,都需要有acknowledge讯息的回传,也就是说,传输的资料,
#需要有一个收到资料的讯息回复,才能决定后面的传输速度,並决定是否重新传输遗失
#的资料。上行的带宽一部分就是用來传输這些acknowledge(确认)資料模鄙闲懈涸毓?
#大的时候,就会影响acknowledge资料的传送速度,并进而影响到下载速度。这对非对称
#数字环路也就是ADSL这种上行带宽远小于下载带宽的连接来说影响尤为明显。
#(2)试验证明,当上传满载时,下载速度变为原来速度的40%,甚至更低.因为上载文件(包括ftp
#上传,发邮件smtp),如果较大,一个人的通讯量已经令整条adsl变得趋向饱和,那么所有的数据
#包只有按照先进先出的原则进行排队和等待.这就可以解释为什么网内其中有人用ftp上载文件,
#或发送大邮件的时候,整个网速变得很慢的原因。
#
#二.解决ADSL速度之道
#1. 为解决这些速度问题,我们按照数据流和adsl的特点,对经过线路的数据进行了有规则的分流.
#把本来在adsl modem上的瓶颈转移到我们linux路由器上,可以把带宽控制的比adsl modem上的小一点,
#这样我们就可以方便的用tc技术对经过的数据进行分流和控制.
#我们的想象就象马路上的车道一样,有高速道,还有小车道,大车道.需要高速的syn,ack,icmp等走
#高速道,需要大量传输的ftp-data,smtp等走大车道,不能让它堵塞整条马路.各行其道.
#2. linux下的TC(Traffic Control)就有这样的作用.只要控制得当,一定会有明显的效果.
#tc和iptables结合是最好的简单运用的结合方法.
#我们设置过滤器以便用iptables对数据包进行分类,因为iptables更灵活,而且你还可以为每个规则设
#置计数器. iptables用mangle链来mark数据包,告诉了内核,数据包会有一个特定的FWMARK标记值(hanlde x fw),
#表明它应该送给哪个类( classid x : x),而prio是优先值,表明哪些重要数据应该优先通过哪个通道.
#首先选择队列,cbq和htb是不错的选择,经过实验,htb更为好用,所以以下脚本采用htb来处理
#3. 一般系统默认的是fifo的先进先出队列,就是说数据包按照先来先处理的原则,如果有一个大的数
#据包在前面,#那么后面的包只能等前面的发完后才能接着发了,这样就算后面即使是一个小小的ack包,
#也要等待了,这样上传就影响了下载,就算你有很大的下载带宽也无能为力.
#HTB(Hierarchical Token Bucket, 分层的令牌桶)
#更详细的htb参考 http://luxik.cdi.cz/~devik/qos/htb/
#HTB就象CBQ一样工作,但是并不靠计算闲置时间来整形。它是一个分类的令牌桶过滤器。它只有很少的参数
#他的分层(Hierarchical)能够很好地满足这样一种情况:你有一个固定速率的链路,希望分割给多种不同的
#用途使用,为每种用途做出带宽承诺并实现定量的带宽借用。
#4. 结构简图:
#~~~~~~ |
#~~~~~ __1:__
#~~~~ |~~~~~ |
#~ _ _ _1:1~~~ 1:2_ _ _ _ _ _ _ _
# | ~ ~ | ~ ~ ~ | ~ ~ | ~ ~ | ~ ~ |
#1:11~1:12~~1:21~1:22~1:23~1:24
#优先顺序是1:11 1:12 1:21 1:22 1:23 1:24
#
#--------------------------------------------------------------------------------------------
#5.根据上面的例子,开始脚本
#通常adsl用pppoe连接,的得到的是ppp0,所以公网网卡上绑了ppp0
#关于参数的说明
#(1)rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类.
#(2)ceil: ceil是一个类最大能得到的带宽值.
#(3)prio: 是优先权的设置,数值越大,优先权越小.如果是分配剩余带宽,就是数值小的会最优先取得剩余
#的空闲的带宽权.
#具体每个类要分配多少rate,要根据实际使用测试得出结果.
#一般大数据的话,控制在50%-80%左右吧,而ceil最大建议不超过85%,以免某一个会话占用过多的带宽.
#rate可按各类所需分配,
#1:11 是很小而且最重要的数据包通道,当然要分多点.甚至必要时先全部占用,不过一般不会的.所以给全速.
#1:12 是很重要的数据道,给多点,最少给一半,但需要时可以再多一点.
#rate 规划 1:2 = 1:21 + 1:22 + 1:23 + 1:24 一般总数在50%-80%左右
#1:21 http,pop是最常用的啦,为了太多人用,而导致堵塞,我们不能给得太多,也不能太少.
#1:22 我打算给smtp用,优先低于1:21 以防发大的附件大量占用带宽,
#1:23 我打算给ftp-data,和1:22一样,很可能大量上传文件,所以rate不能给得太多,而当其他有剩时可以给大些,ceil设置大些
#1:24 是无所谓通道,就是一般不是我们平时工作上需要的通道了,给小点,防止这些人在妨碍有正常工作需要的人
#上行 uplink 320K,设置稍低于理论值
DEV="ppp0"
UPLINK=300
#下行downlink 3200 k 大概一半左右,以便能够得到更多的并发连接
DOWNLINK=1500
echo "==================== Packetfilter and Traffic Control 流量控制 By 网络技术部 Ver. 1.0===================="
start_routing() {
echo -n "队列设置开始start......"
#1.增加一个根队列,没有进行分类的数据包都走这个1:24是缺省类:
tc qdisc add dev $DEV root handle 1: htb default 24
#1.1增加一个根队下面主干类1: 速率为$UPLINK k
tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0
#1.1.1 在主干类1下建立第一叶子类,这是一个最高优先权的类.需要高优先和高速的包走这条通道,比如SYN,ACK,ICMP等
tc class add dev $DEV parent 1:1 classid 1:11 htb rate $[$UPLINK]kbit ceil ${UPLINK}kbit prio 1
#1.1.2 在主类1下建立第二叶子类 ,这是一个次高优先权的类。比如我们重要的crm数据.
tc class add dev $DEV parent 1:1 classid 1:12 htb rate $[$UPLINK-150]kbit ceil ${UPLINK-50}kbit prio 2
#1.2 在根类下建立次干类 classid 1:2 。此次干类的下面全部优先权低于主干类,以防重要数据堵塞.
tc class add dev $DEV parent 1: classid 1:2 htb rate $[$UPLINK-150]kbit prio 3
#1.2.1 在次干类下建立第一叶子类,可以跑例如http,pop等.
tc class add dev $DEV parent 1:2 classid 1:21 htb rate 100kbit ceil $[$UPLINK-150]kbit prio 4
#1.2.2 在次干类下建立第二叶子类。不要太高的速度,以防发大的附件大量占用带宽,例如smtp等
tc class add dev $DEV parent 1:2 classid 1:22 htb rate 30kbit ceil $[$UPLINK-160]kbit prio 5
#1.2.3 在次干类下建立第三叶子类。不要太多的带宽,以防大量的数据堵塞网络,例如ftp-data等,
tc class add dev $DEV parent 1:2 classid 1:23 htb rate 15kbit ceil $[$UPLINK-170]kbit prio 6
#1.2.4 在次干类下建立第四叶子类。无所谓的数据通道,无需要太多的带宽,以防无所谓的人在阻碍正务.
tc class add dev $DEV parent 1:2 classid 1:24 htb rate 5kbit ceil $[$UPLINK-250]kbit prio 7
#在每个类下面再附加上另一个队列规定,随机公平队列(SFQ),不被某个连接不停占用带宽,以保证带宽的平均公平使用:
#SFQ(Stochastic Fairness Queueing,随机公平队列),SFQ的关键词是“会话”(或称作“流”) ,
#主要针对一个TCP会话或者UDP流。流量被分成相当多数量的FIFO队列中,每个队列对应一个会话。
#数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会。这种方式非常公平,保证了每一
#个会话都不会没其它会话所淹没。SFQ之所以被称为“随机”,是因为它并不是真的为每一个会话创建
#一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去。
#参数perturb是多少秒后重新配置一次散列算法。默认为10
tc qdisc add dev $DEV parent 1:11 handle 111: sfq perturb 5
tc qdisc add dev $DEV parent 1:12 handle 112: sfq perturb 5
tc qdisc add dev $DEV parent 1:21 handle 121: sfq perturb 10
tc qdisc add dev $DEV parent 1:22 handle 122: sfq perturb 10
tc qdisc add dev $DEV parent 1:23 handle 133: sfq perturb 10
tc qdisc add dev $DEV parent 1:24 handle 124: sfq perturb 10
echo "队列设置成功.done."
echo -n "设置包过滤 Setting up Filters......"
#这里设置过滤器,handle 是iptables作mark的值,让被iptables 在mangle链做了mark的不同的值选择不同的通
#道classid,而prio 是过滤器的优先级别.
tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
tc filter add dev $DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21
tc filter add dev $DEV parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22
tc filter add dev $DEV parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23
tc filter add dev $DEV parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24
echo "设置过滤器成功.done."

########## downlink #################################################
#6. 下行的限制:
#设置入队的规则,是因为把一些经常会造成下载大文件的端口进行控制,不让它们来得太快,导致堵塞.来得太快
#的就直接drop,就不会浪费和占用机器时间和力量去处理了.
#(1). 把下行速率控制在大概1000-1500k左右,因为这个速度已经足够用了,以便能够得到更多的并发下载连接
tc qdisc add dev $DEV handle ffff: ingress
tc filter add dev $DEV parent ffff: protocol ip prio 50 handle 8 fw police rate ${DOWNLINK}kbit burst 10k drop flowid :8
}
#(2).如果内部网数据流不是很疯狂的话,就不用做下载的限制了,用#符号屏蔽上面两行即可.
#(3).如果要对任何进来数据的数据进行限速的话,可以用下面这句:
#tc filter add dev $DEV parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
#################################################
#7. 开始给数据包打标记,往PREROUTING链中添加mangle规则:
start_mangle() {
echo -n "开始给数据包打标记......start mangle mark......"
#(1)把出去的不同类数据包(为dport)给mark上标记1--6.让它走不同的通道
#(2)把进来的数据包(为sport)给mark上标记8,让它受到下行的限制,以免速度太过快而影响全局.
#(3)每条规则下根着return的意思是可以通过RETURN方法避免遍历所有的规则,加快了处理速度
##设置TOS的处理:
#iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 1
#iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j RETURN
#iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 4
#iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j RETURN
#iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 5
#iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j RETURN
##提高tcp初始连接(也就是带有SYN的数据包)的优先权是非常明智的:
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN
######icmp,想ping有良好的反应,放在第一类吧.
iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p icmp -j RETURN
# small packets (probably just ACKs)长度小于64的小包通常是需要快些的,一般是用来确认tcp的连接的,
#让它跑快些的通道吧.也可以把下面两行屏蔽,因为再下面有更多更明细的端口分类.
#iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j MARK --set-mark 2
#iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j RETURN
#ftp放第2类,因为一般是小包, ftp-data放在第5类,因为一般是大量数据的传送.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j RETURN
##提高ssh数据包的优先权:放在第1类,要知道ssh是交互式的和重要的,不容待慢哦
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j RETURN
#
##smtp邮件:放在第4类,因为有时有人发送很大的邮件,为避免它堵塞,让它跑4道吧
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j RETURN
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j MARK --set-mark 8
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j RETURN
## name-domain server:放在第1类,这样连接带有域名的连接才能快速找到对应的地址,提高速度的一法
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j RETURN
#
## http:放在第3类,是最常用的,最多人用的,
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN
##pop邮件:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j RETURN
## https:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j RETURN
## Microsoft-SQL-Server:放在第2类,我这里认为较重要,一定要保证速度的和优先的.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j RETURN
## voip用, 提高,语音通道要保持高速,才不会断续.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j RETURN
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j RETURN
## vpn ,用作voip的,也要走高速路,才不会断续.
iptables -t mangle -A PREROUTING -p udp -m udp --dport 7707 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 7707 -j RETURN
## 放在第1类,因为我觉得它在我心中很重要,优先.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j RETURN
## WWW caching service:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j RETURN
##提高本地数据包的优先权:放在第1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j RETURN
iptables -t mangle -A OUTPUT -p icmp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p icmp -j RETURN
#本地small packets (probably just ACKs)
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j RETURN
#(4). 向PREROUTING中添加完mangle规则后,用这条规则结束PREROUTING表:
##也就是说前面没有打过标记的数据包将交给1:24处理。
##实际上是不必要的,因为1:24是缺省类,但仍然打上标记是为了保持整个设置的协调一致,而且这样
#还能看到规则的包计数。
iptables -t mangle -A PREROUTING -i $DEV -j MARK --set-mark 6
echo "标记完毕! mangle mark done!"
}
#-----------------------------------------------------------------------------------------------------
#8.取消mangle标记用的自定义函数
stop_mangle() {
echo -n "停止数据标记 stop mangle table......"
( iptables -t mangle -F && echo "ok." ) || echo "error."
}
#9.取消队列用的
stop_routing() {
echo -n "(删除所有队列......)"
( tc qdisc del dev $DEV root && tc qdisc del dev $DEV ingress && echo "ok.删除成功!" ) || echo "error."
}
#10.显示状态
status() {
echo "1.show qdisc $DEV (显示上行队列):----------------------------------------------"
tc -s qdisc show dev $DEV
echo "2.show class $DEV (显示上行分类):----------------------------------------------"
tc class show dev $DEV
echo "3. tc -s class show dev $DEV (显示上行队列和分类流量详细信息):------------------"
tc -s class show dev $DEV
echo "说明:设置总队列上行带宽 $UPLINK k."
echo "1. classid 1:11 ssh、dns、和带有SYN标记的数据包。这是最高优先权的类包并最先类 "
echo "2. classid 1:12 重要数据,这是较高优先权的类。"
echo "3. classid 1:21 web,pop 服务 "
echo "4. classid 1:22 smtp服务 "
echo "5. classid 1:23 ftp-data服务 "
echo "6. classid 1:24 其他服务 "
}
#11.显示帮助
usage() {
echo "使用方法(usage): `basename $0` [start | stop | restart | status | mangle ]"
echo "参数作用:"
echo "start 开始流量控制"
echo "stop 停止流量控制"
echo "restart 重启流量控制"
echo "status 显示队列流量"
echo "mangle 显示mark标记"
}
#----------------------------------------------------------------------------------------------
#12. 下面是脚本运行参数的选择的控制
#
kernel=`eval kernelversion`
case "$kernel" in
2.2)
echo " (!) Error: won't do anything with 2.2.x 不支持内核2.2.x"
exit 1
;;
2.4|2.6)
case "$1" in
start)
( start_routing && start_mangle && echo "开始流量控制! TC started!" ) || echo "error."
exit 0
;;
stop)
( stop_routing && stop_mangle && echo "停止流量控制! TC stopped!" ) || echo "error."
exit 0
;;
restart)
stop_routing
stop_mangle
start_routing
start_mangle
echo "流量控制规则重新装载!"
;;
status)
status
;;
mangle)
echo "iptables -t mangle -L (显示目前mangle表表标记详细):"
iptables -t mangle -nL
;;

*) usage
exit 1
;;
esac
;;
*)
echo " (!) Error: Unknown kernel version. check it !"
exit 1
;;
esac
#三.结束语
#1. 如果要支持htb,请到相关网站下载有关补丁.
#此脚本是参考http://lartc.org 和 http://luxik.cdi.cz/~devik/qos/htb/ 和http://www.docum.org/docum.org
#和听取chinaunix.net的C++版主JohnBull的"Linux的高级路由和流量控制北京沙龙讲座录音
#及关于<>,经过不断调试得出的总结结果,在此感谢所有作出贡献的人.
#2. iptables,在http://www.iptables.org/ .iptables v1.2.7a 和tc是Red hat linux 9.0下自带的版本.
#3. 此脚本已经在Red Hat Linux 9.0内核2.4.20上,内网约70台频繁上网机器的环境下运行数月,事实证明良好.
#4. 如果ADSL带宽不同或有变,调节相关rate参数及ceil参数即可.
#5. 还有,如果结合IMQ,IMQ(Intermediate queueing device,中介队列设备)把上行和下行都进行分类控制
#就更理想了,但要支持IMQ,就要重新编译内核.关于补丁和更多的文档请参阅imq网站http://www.linuximq.net/
#6. 欢迎转载,但请保留原出处 powered by KindGeorge. http://kindgeorge.at.3322.org
#7. 除了ADSL外,还可以进行其他宽带的控制.
#8. 如果看谁老是在网内搞鬼,经常占满带宽,就把它列为黑名单,并派到"无所谓的数据通道",以防无所谓的人
#在阻碍正务: iptables -t mangle -I PREROUTING 1 -s 192.168.xxx.xxx -j MARK --set-mark 6
# iptables -t mangle -I PREROUTING 2 -s 192.168.xxx.xxx -j RETURN
#9.使用方法: 整篇文档拷贝后,chmod +x tc2 ,
#执行脚本: ./tc2 start (或其他参数start | stop | restart | status | mangle )即可
#如果想每次在ppp启动时就启动,则在/etc/ppp/ip-up 文件里面加上一句: /路径/tc2 restart
#10.结合web界面的流量监测就更完美了,以下汇总
#用免费流量监控进行流量监测相关例子可以参阅:http://blog.chinaunix.net/article.php?articleId=15921&blogId=4543
echo "script done!"
exit 1
#end----------------------------------------------------------------------------------------

2009年4月5日星期日

如何能让一个redhat下的程序死掉后自动重启

参照inittab
srv:2345:respawn:/path/to/your/app


id号,见man inittab

真没注意那个srv.. 我只是看到那个respawn,想起这样启动的进程由init来守护,
进程掉了init自动重启进程,不需要其他的什么脚本crontab的,觉得安全又便捷...

2009年4月1日星期三

用图介绍Linux内核是如何工作的

牛津字典中对"kernel"一词的定义是:"较软的、通常是一个坚果可食用的部分。"第二种定义:"某个东西核心或者最重要的部分。"对Linux来说,它的Kernel无疑属于第二种解释。
让我们先从一点理论说起。
  广义地来说kernel就是一个软件,它在硬件和运行在计算机上的应用程序之间提供了一个层。严格点从计算机科学的角度来说,Linux中的Kernel指的是Linus Torvalds在90年代初期写的那点代码。
  所有的你在Linux各版本中看到的其他东西--Bash shell、KDE窗口管理器、web浏览器、X服务器、Tux Racer以及所有的其他,都不过是运行在Linux上的应用而已,而不是操作系统自身的一部分。为了给大家一个更加直观的感觉,我来举个例子,比如 RHEL5的安装大概要占据2.5GB的硬盘空间(具体多大当然视你的选择安装来定),在这其中,kernel以及它的各个模块组件,只有47MB,所占比例约为2%。
  那么kernel到底是如何工作的呢?
如下面的图表。Kernel通过许多的进入端口也就是我们从技术角度所说的系统调用,来使得运行在它上面的应用程序可用。Kernel使用的系统调用比如"读"和"写"来提供你硬件的抽象(abstraction)。



  从程序员的视角来看,这些看起来只是普通的功能调用,然而实际上系统调用在处理器的操作模式上,从用户空间到Kernel空间有一个明显的切换。

2009年3月29日星期日

Oracle数据库补丁分类、安装及管理

根据Patch Set Notes中的说明,有一些特殊系统构成需要额外的步骤,本例中由于全部没有涉及到,所以可以按标准步骤执行。

另外,检查“Known issues and alerts affecting 10.1.0.5”文档后,发现10.1.0.5引入的影响最大的一个Bug是执行SELECT MAX()在某些特定条件下结果不正确。而这一Bug可以通过设置事件(event)关闭FIRST ROW优化而避免。最后的结论是这一BUG不会对本系统有影响,可以安装PSR10.1.0.5.

1. 检查数据库表空间和初始化参数是否需要调整。
System表空间要求有一定未使用空间:初始化参数SHARED_POOL_SIZE 和 JAVA_POOL_SIZE不能低于最小值150MB.
2. 关闭数据库,停止listener和agent等进程。
3. 解压缩下载文件至某一目录,执行oui.

在压缩文件中附带的oui的版本要比已经安装的版本高,应总是使用新版本的oui.在oui窗口中,要求选择本次安装的软件的位置,正确的位置是解压缩目录下的子目录Disk1/stage/, 选中products.xml即可开始文件拷贝。
要注意窗口中会出现本次安装的日志文件的文件路径和文件名。文件的位置是在Oracle的inventory所在目录的子目录logs中,文件名由前缀InstallActions和安装日期时间组成,如: InstallActions2006-08-30-11-32-48AM.log.

正常结束后,退出oui.打开日志文件,检索是否出现error 或“ORA-”的错误信息。本次安装产生的日志文件内,没有任何此类的信息,表明PSR软件安装成功。如果此时再次启动oui,点击“已安装软件”,则可以看到在原有的10.1.0.2软件之下,新出现了10.1.0.5一项,这也证实PSR软件安装成功。

4.更新数据库数据字典
更新数据字典时,必须以特殊的升级方式打开数据库。
$ sqlplus /nolog SQL> CONNECT / AS SYSDBA SQL> STARTUP UPGRADE SQL> SPOOL patch.log SQL> @?/rdbms/admin/catpatch.sql
执行结束后,关闭重定向:
SQL> SPOOL OFF
打开文件patch.log检查是否有错误“ORA-”。(这一文件在启动sqlplus时的当前目录中,当然也可以在“SPOOL patch.log”语句中显式指定文件路径。)如果出现错误要分析原因,在解决问题后,需要再次执行catpatch.sql程序。

更新数据字典时,由于对某些PL/SQL包删除后又重新生成,造成相关PL/SQL包的状态为异常(invalid)。在以后调用这些包时,检测到其状态为非法,会自动执行编译命令,使状态成为正常(valid)。虽然不会出错,但会造成个别处理第一次执行时变慢。显然,与其留到应用系统运行时再一个个编译,不如之前集中一次重编译所有异常包。

SQL> SHUTDOWN SQL> STARTUP SQL> @?/rdbms/admin/utlrp.sql

最后,根据Known Issues中的指示,完成与本系统有关的操作。例如,修改Pro*C的配置文件。这里执行一个修改文件存取权限的“后操作”,以便非同组用户和程序可以存取客户端工具和库函数。
$ cd $ORACLE_HOME/install $ ./ changePerm.sh
如前所述,在发布一个PSR后发现的新BUG,只能把其补丁收入到下一个PSR中。如果对数据库有实质性影响,则这一补丁以个别补丁的形式向用户提供。个别补丁是与某一个特定的PSR关联,是安装在这一PSR之上的。另外,如同其名字表明的,个别补丁只是单一Bug的补丁,不会包含其他个别补丁,即不是累积型的。
在9.2版之前,安装个别补丁的操作完全是手工的。这种手工方式的缺点不仅在于加重DBA的负担,容易造成操作失误,更严重的是无法对已安装的个别补丁进行管理。
为解决手工方式的缺陷,从9.2版开始,Oracle公司设计实现了个别补丁安装管理工具opatch.opatch使用一个称为 inventory的系统数据结构(严格说是与oui共享inventory),集中管理所有已安装的个别补丁;个别补丁的安装和卸载都使用opatch 命令完成,冲突检测也由opatch在安装时自动完成;提供列表命令可以很方便得到已安装个别补丁的信息。
10g(10.1和10.2)版本中,opatch作为一个标准工具,在软件安装时自动安装。(安装在$ORACLE_HOME/OPatch 下。)而对于9.2版,需要从metalink下载opatch.无论数据库是哪一个版本,系统中是否已经安装opatch,在使用之前,应从 metalink下载最新版本的opatch.很遗憾,由于系统实现的问题,10.2使用的opatch与之前版本(10.1和9.2)使用的 opatch不兼容,不能混用,这一点必须注意。
opatch是使用perl编写的脚本程序(其中也使用JAVA API)。编程使用的perl版本是5.6版,虽然在5.6之前的版本中也可运行,但应尽可能安装5.6或以上的版本的perl.对于DBA来说一个好消息是,如果安装9.2版软件时保留了HTTP服务器,则在$ORACLE_HOME/Apache下会自动安装perl.(10g会自动安装配置perl 和opatch.)
opatch命令格式为:
opatch < command > [< command_options >] [ -h[elp] ]
命令有:apply(安装个别补丁)、rollback(卸载个别补丁)、lsinventory(对inventory进行列表)、 query(显示某一个别补丁的详细信息)、version(显示opatch版本信息)。在opatch目录下,有用户使用指南文件(Users_Guide.txt),其中有详细的命令格式和使用示例,读者可以参考。Opatch执行操作时,除在屏幕输出结果外,还生成日志文件。日志文件的路径和文件名格式如下:
$ORACLE_HOME/.patch_storage/< patch_id >/ < action >-< patch_id >_< mm-dd-yyyy_hh-mi-ss >.log
其中“patch_id”是Oracle技术支持部门为个别补丁分配的编号。
沿用安装PSR实例中的环境。在安装PSR10.1.0.5后,检索metalink,发现若干在其之上的个别补丁。选择其中之一安装。
个别补丁Patch 4518443修复BUG4518443,这一BUG的主要问题是TNS LISTENER在注册ONS(Oracle Notification Services)的同时如果创建子进程,那么LISTENER会挂起(HANGUP)。
安装时,首先,从metalink下载补丁的压缩文件p4518443_10105_LINUX.zip.将此文件解压缩至某一目录中。解压缩后,这一补丁的所有文件都在子目录4518443下,目录名就是个别补丁的补丁号,opatch依据目录名获得信息,所以一定不要重命名子目录。
然后,在终端窗口中,执行cd命令移动到4518443子目录中,执行以下命令:
$ $ORACLE_HOME/OPatch/opatch apply 对inventory列表,确认安装操作: $ $ORACLE_HOME/OPatch/opatch lsinventory
执行卸载命令时,也必须使4518443子目录成为当前目录。其中,Rollback命令需要两个参数:-id给出个别补丁号;-ph 给出个别补丁解压缩后的路径。
$ $ORACLE_HOME/OPatch/opatch rollback -id 4518443 -ph /…/4518443
随后再对inventory列表,则会看到这一个别补丁已经被移去。
不需要启动数据库,执行加选项的对inventory的列表命令,可以得到已安装的软件的各个组件的详细版本信息。
$ $ORACLE_HOME/OPatch/opatch lsinventory -detail 一个CPU内包含了对多个安全漏洞的修复,并且也包括相应必需的非安全漏洞的补丁。CPU是累积型的,只要安装最新发布的CPU即可,其中包括之前发布的所有CPU的内容。事实上,在CPU之前的安全漏洞修改除去个别例外也被包括在CPU中。Oracle公司只对处于标准技术支持和延长支持期间的产品提供CPU更新,对处于维持支持范围的产品不提供新的CPU.(对于9.2以前的版本,只对处于ECS和EMS期间的版本提供CPU更新。)一般对当前补丁发行版及前一个版本提供CPU,但也有只限于当前补丁发行版的例外情形。也就是说,一般需要先安装最新PSR后才可能安装CPU.由于是累积型的定期发布,所以对于某一平台的某一版本,如果两次CPU发布期间没有发现新的安全漏洞,则新发布的CPU与前一版本完全相同。
本文出自 “帅小伙的博客” 博客,请务必保留此出处http://zhaizhenxing.blog.51cto.com/643480/134471

RHEL5--DNS智能策略解析

RHEL5--DNS智能策略解析



什么是智能DNS策略解析
  随着原中国电信集团按南北地域分家,新的中国电信和网通集团随即成立,互联网的骨干网也被一分为二了,北有网通、南有电信。从此,细心的网民可以发现,有些经常访问的网站速度一下子慢了下来,有时候还有访问不到的情况出现。例如北方地区的网络用户访问中国网通的服务器会非常快,而访问中国电信的服务器时,感觉非常慢。这种现象不仅影响了网站的访问量,更严重的是它直接影响了一些经营性网站的经济效益。据分析,产生这个问题的根本原因是中国电信分家之后,电信与网通之间的互连存在问题。虽然信息产业部已经在规划电信网通互联互通计划,但在今后相当长的一段时期内,南北方网互连的问题还会存在。

解决方案
  智能DNS策略解析很好的解决了上面所述的问题。DNS策略解析最基本的功能是可以智能的判断访问您网站的用户,然后根据不同的访问者把您的域名分别解析成不同的IP地址。如访问者是网通用户,DNS策略解析服务器会把你的域名对应的网通IP地址解析给这个访问者。如果用户是电信用户,DNS策略解析服务器会把您域名对应的电信IP地址解析给这个访问者。
  智能DNS策略解析还可以实现就近访问机制(即将推出)。有些用户在国外和国内都放置了服务器,使用我们的DNS策略解析服务可以让国外的网络用户访问你国外的服务器,国内的用户访问国内的服务器,从而使国内外的用户都能迅速的访问到你的服务器。
智能DNS策略解析还可以给你的多个主机实现负载均衡,这时来自各地的访问流量会比较平均的分布到你的每一个主机上,主机的数量限制为40个。

  要使用的智能DNS策略解析服务您要具备下面的条件:
  1.你的主机已经申请了合法的域名。
  2.您的主机上配置有电信、网通各一个合法的公网IP地址。
  3.你在电信机房和网通机房各放置了一台主机。
  4.要使用多主机负载均衡服务,你需要有多台主机并连接到了互联网上。
注意:第二条和第三条只要有一条满足条件即可。主机所使用的操作系统和这个策略解析服务无关。

试验步骤:

第一步:安装dns服务器软件包

[root@yixia ~]#mount /dev/cdrom /mnt
[root@yixia ~]#cd /mnt/Server
[root@yixia Server]# rpm -ivh bind-9.3.3-7.el5.i386.rpm
[root@yixia Server]# rpm -ivh bind-chroot-9.3.3-7.el5.i386.rpm
[root@yixia Server]# rpm -ivh caching-nameserver-9.3.3-7.el5.i386.rpm

第二步:建立主配置文件,并修改相关选项;

[root@yixia ~]# cp -p /var/named/chroot/etc/named.caching-nameserver.conf named.conf
[root@yixia ~]# vi /var/named/chroot/etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
query-source port 53;
query-source-v6 port 53;
allow-query { any; }; //允许所有客户机请求查询;
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
view localhost_resolver {
match-clients { localhost; };
match-destinations { localhost; };
recursion yes;
include "/etc/named.rfc1912.zones";
};
acl "cnc" { 192.168.1.251/32; }; //定义网通客户端的地址端范围;
acl "tel" { 192.168.1.252/32; }; //定义电信客户端的地址端范围;
view "cnc" in { //定义网通视图;
match-clients { cnc; }; //定义客户端匹配的条件;
recursion yes;
additional-from-auth yes;
additional-from-cache yes;

zone "xxx.com.cn" IN {
type master;
file "xxx.com.cn.db1";
};
};
view "tel" in { //定义电信视图;
match-clients { tel; }; //定义客户端匹配的条件;
recursion yes;
additional-from-auth yes;
additional-from-cache yes;
zone "xxx.com.cn" IN {
type master;
file "xxx.com.cn.db2";
};
};

第三步:建立区域的数据库文件;

[root@yixia ~]# cd /var/named/chroot/var/named
[root@yixia named]# vi xxx.com.cn.db1
$TTL 86400
xxx.com.cn. IN SOA ns.xxx.com.cn. root@xxx.com.cn. (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS ns.xxx.com.cn.
ns IN A 192.168.1.102
www IN A 2.2.2.2

[root@yixia named]# vi xxx.com.cn.db2
$TTL 86400
xxx.com.cn. IN SOA ns.xxx.com.cn. root@xxx.com.cn. (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
IN NS ns.xxx.com.cn.
ns IN A 192.168.1.102
www IN A 3.3.3.3

第四步:客户机测试

网通客户机
pc1 ip:192.168.1.251 subnetmask:255.255.255.0 dns:192.168.1.102

电信客户机
pc2 ip:192.168.1.252 subnetmask:255.255.255.0 dns:192.168.1.102

pc1测试结果

C:\>nslookup
>server 192.168.1.102
> www.xxx.com.cnName: www.xxx.com.cnAddress: 2.2.2.2

pc2测试结果
C:\>nslookup
>server 192.168.1.102
> www.xxx.com.cnName: www.xxx.com.cnAddress: 3.3.3.3

结果:同一个域名,在不同的客户机上解析得到不同的ip地址,这就是我们想要的结果。

2009年3月27日星期五

在 rescue 模式下修复 MBR

在 rescue 模式下修复 MBR:

# >1< 破坏 GRUB 使之不能启动;
[bady]# dd if=/dev/zero of=/dev/sda bs=446 count=1;reboot

# >2< 从光盘/软盘启动输入 linux rescue 进入 rescue 模式;

sh-2.05b# mount /* 以读写模式加载硬盘文件,进入后用 mount 检查文件系统加载是否正确 */
sh-2.05b# fdisk -l /dev/sda /* 查看分区情况 */
sh-2.05b# cat /mnt/sysimage/boot/grub/grub.conf /* 要注意:硬盘加载在/mnt/sysimage 目录下,检查 grub.conf 文件 */
sh-2.05b# chroot /mnt/sysimage /* 使 /mnt/sysimage 成为 grub-install 认为的系统得根 */
sh-2.05b# grub-install /dev/sda /* 加载 chroot shell,运行 grub-install */
sh-2.05b# exit /* 退出 chroot shell */
sh-2.05b# exit /* 退出 rescue 模式 */

2009年3月25日星期三

使用wget直接下载OTN上的Oracle 安装文件

使用wget直接下载 OTN 上的 Oracle 安装文件


wget -b --post-data="https://profile.oracle.com/jsp/realms/otnLogin.jsp?\

remoteIp=218.24.2.9&globalId=&redirectUrl=http%3a%2f%2fdownload-\

llnw.oracle.com%3a80%2fotn%2flinux%2foracle10g%2f10201%\

2f10201_database_linux_x86_64.cpio.gz\

&username=YOUR-USER-NAME&password=YOUR-PASSWORD&submit=Continue" https://profile.oracle.com/jsp/reg/loginHandler.jsp \

-o downloadOracle.log




上面的ip218.24.2.9是我用来下载的服务器。


注意上面的格式,不要添加额外的空格

2009年3月22日星期日

PWN2OWN黑客大赛2009到底有哪些猛料?

文/ 鲜橙加冰

【51CTO.com 独家报道】3月18日在温哥华举办的CanSecWest黑客大赛如火如荼的开始之后,网上出现了很多相关赛事的报道。如“黑客5秒钟攻破Mac系统 Safari是罪魁祸首”和“黑客大赛曝Safari、IE8与Firefox零日攻击”等。51CTO也在之前为网友们提供了介绍和时间表,详情请见:“http://netsecurity.51cto.com/art/200902/110496.htm”

到底今年的大赛到底准备了那些系统和软件让大家来测试和攻击?到底准备了那些猛料?我们来看看以下来自51CTO记者的报道。


PWN2OWN 2009


在经过多次讨论和研究之后,PWN20WN比赛的最终安排如下:


浏览器和联合测试的平台

索尼VAIO - Windows 7(51CTO编者按:去年也是索尼VAIO。)


IE8
Firefox
Chrome

苹果机 - (这个不用说啥系统了吧)


Safari
Firefox

第一天:默认不安装额外插件,用户去连接。

第二天:安装flash, java, .net, quicktime。用户去连接。

第三天:安装像Acrobat Reader那样的大众软件,用户去连接。

任务?- 在应用程序的环境中执行代码。(51CTO编者按:提权溢出之类的)

--------------------------------------------------------------------------------

电话(和其他相关的测试平台)

黑莓(TBA)

谷歌Android手机(G1开发测试版)

苹果iphone手机(2.0正式版)

Nokia/Symbian(机型N95)

Windows Mobile (宏达 Touch)


第一天

SMS 短信

MMS 彩信

Email 电子邮件(只看收取的)

wifi 无线,如果默认开启的话

bluetooth蓝牙,同上

Radio 无线接收器

第二天

电子邮件/短信/彩信(只可以读取-不可以有间接行为)

无线保持启动

蓝牙保持启动(默认不接受配对。耳机是配好的。配对过程不可见。)

第三天

在默认应用程序用户界面的一个层面

蓝牙保持启动(默认不接受配对。耳机和满足以上要求的其他设备是配好的。配对过程不可见。)

任务?必须去实现……

1.造成信息丢失(用户数据)

2.造成财务损失

51CTO编辑观察:

首先,对老外能举办这类真刀真枪测试产品的活动表示赞扬。大致看了一下,基本上国外顶尖安全厂商全部参与。这次的大赢家是德国人Nils,这哥们快把所有主流浏览器都破坏了个遍。成功收获15000美元和一台笔记本电脑。上届冠军Charlie Miller在10秒内拿下Safari,顺利收获5000美元和一台苹果笔记本。相对来说,智能手机的安全性还是比较经受考验的,没有出现30秒内被攻破的事情。

事实证明,世界上并不存在绝对安全的浏览器,以前说什么用Firefox不会中毒这样的事情,很遗憾只是YY。这一年来Firefox的漏洞甚至超过其他浏览器的总和,虽然它的修补速度够快。在51CTO记者截稿前,谷歌Chrome的表现似乎足够坚挺。但之前爆的漏洞也不少。笔者认为暂时的未攻破有以下几点原因:

1.相对Firefox和IE8、Safari之类浏览器来说,谷歌chrome本身的代码量就少,说是个精悍的浏览器内核都不为过。

2.它真的是足够新了,目前还算是“非主流”(51CTO编者按:Windows默认IE,MAC默认Safari,Linux默认Firefox。Chrome虽系出名门,但要想雄霸一方尚需时日)其他浏览器都至少出了三代,它最近才出2.0beta,而且还已经是升的非常非常勤了。

3.Google设计chrome的初衷就是,除了本地的管理员以外,普通用户也可以不限使用。加上沙盒(sandbox)技术,让它的安全性显著提高,换句话说,即使发现了chrome的漏洞,骇客也只有很小的权限,无法造成很大的破坏。

当然,黑客们找到Chrome新的攻击方式只是时间问题,我们可以拭目以待。

希望我们国家也能尽快出现此类活动,并对国内的信息安全研究给予支持和良好导向。这类活动不仅能为社会发掘更多的技术天才,更是能有效推进我国的信息安全产业发展。有攻才有防,有防才有保障。将更多的安全人才引向“白色产业链”,避免让更多的优秀人才戴上“黑帽”,这是好事,更是值得去做的事。

2009年3月21日星期六

apache2.2.11最大连接数配置

每次重做服务器,就会学到一些新的东西,所以了解linux最简洁有效的办法,就是不停的重做系统,重新配置优化系统(XD!)。
本次使用了apache2.2.6,编译完成后,最大连接数默认为150,运行一段时间后出现大量的CLOSE_WAIT,于是修改默认连接数。 apache2.2以后许多功能都抽出来单独存放了,在http.conf里进行引用。存储连接数等相关指令的文件是httpd- mpm.conf,apache采用的是prefork模式来进行连接数量方面的控制,prefork模块的格式如下:

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0

其工作原理如下:

控制进程在最初建立StartServers个子进程后, 为了满足MinSpareServers设置的需要,创建一个进程,等待一秒钟,继续创建第二个,等待一秒钟,继而创建四个,如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止,这也就是预派生(prefork)的由来。这种模式可以使得不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。

MaxSpareServers 设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill某些多余进程。这个值一般不要设的过大,但如果设的比 MinSpareServers小,Apache会自动把它调整为MinSpareServers+1。如果站点负载较大的话,可考虑同时加大 MinSpareServers和MaxSpareServers。

MaxRequestsPerChild设置的是每个子进程可以处理的请求数。每个子进程在处理了MaxRequestsPerChild个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:

1. 可防止意外的内存卸漏;
2. 在服务器负载下降的时侯会自动减少子进程数。

因此,可根据服务器的负载来调整这个值,如果非零的话,笔者认为10000左右是比较合适的。事实上这个值对Apache的性能影响不是很大。

MaxClients 是这些指令中最为重要的一个,它设定的就是Apache可以同时处理的请求,这是对Apache性能影响最大的参数.在我个人看来,缺省的150是远远不够的,如果请求总数已达到这个值(可通过ps –ef|grep httpd|wc –l来确认),那么下面的请求就要排队,直到某个已处理请求完毕。这就是为什么系统资源还剩下很多,而http访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值,虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制是不能大于256。如果把这个值设为大于 256那么Apache将无法起动。事实上,256对于负载稍重的站点也是很不够的。在Apache1.3中这是个硬限制,如果要加大这个值,必须在 configure前手工修改源代码树下的src/include/httpd.h,查找256,会发现#define HARD_SERVER_LIMIT 256这行,把256改为你要增大的值如4000,然后重新编译Apache即可。我想这个方法稍有些经验的Apache系统管理员都知道,不过我相信在 Apache2.0中知道如何加大这个值的人就不会太多了。

在Apache2.0中新加入了ServerLimit指令,使得无须重编译Apache就可以加大MaxClients。下面是笔者的prefork配置段。


StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1500
MaxRequestsPerChild 10000


BTW: ServerLimit的最大值是20000,这对于大多数站点是足够了,但如果你一定要再加大的话,那么这个值位于源代码树下的server/mpm/prefork/prefork.c中。里面的

#define DEFAULT_SERVER_LIMIT 256
#define MAX_SERVER_LIMIT 20000

这两行就对应着MaxClients和ServerLimit的限制值。 但我相信很少有人可以用到20000的并发连接数。

以上内容来自unix中文 对于prefork的工作模式能够实现的功能描写的比较详尽了。我在用的时候发现ServerLimits和MaxClients这两个参数的顺序是不可以颠倒的,否则重起apache时会报警。根据周超 同学的提醒,凡是有依赖关系的命令,书写应该都是有顺序的。

同时在查资料的过程中,拣到一条命令:
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
这条语句返回结果如下
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
返回的结果非常简洁直接,就是句子有点长 -_-

2009年3月16日星期一

让fedora选用更快的源

Fedora应该是许多人非常喜欢的linux发行版了.不过当初我不太喜欢他的原因就是因为他的源太慢,而且不太稳定.不过这两天突然发现他有一个自动可以选择最快的源的包,挺有意思的.

yum install yum-fastestmirror yum-presto

好像安装成功即可,然后你在安装包的时候,他会根据速度找到最快的包的.可以说是非常方便的.

2009年3月9日星期一

Apache 防止 DDoS 攻擊

Apache 防止 DDoS 攻擊



DDoS (distributed denial-of-service) 及 DoS (denial-of-service) 在網路上十分常見,而 DoS 攻擊所傳送的請求跟正常的請求一樣,分別在於每秒鐘發出大量請求到伺服器,使伺服器的負載增加,最常見的情況是伺服器暫停服務。

而 mod_evasive 則是一個預防 Apache 遭受 DDos 攻擊的模組,可以防止同一個 IP 對相同 URI 發出的大量請求,可設定的選項有:

– 限制同一個 IP 在一定秒數內請求一個頁面或檔案的次數。
– 限制同一個 IP 一秒內只可發出 50 個請求。
– 設定被禁止的 IP 封鎖時間。

以下是 mod_evasive 的安裝方法:

1. 先將原來的 httpd.conf 備份起來。

2. 到 http://www.zdziarski.com/projects/mod_evasive/ 下載 mod_evasive。

3. 在指令模式解壓及編譯 mod_evasive:

tar zxvf mod_evasive_1.10.1.tar.gz
cd mod_evasive/
apxs -cia mod_evasive20.c
以上的 apxs 會放在 Apache 的 bin 目錄內;如果 Apache 版本是 1.3 的話,指令要改為:

apxs -cia mod_evasive.c
安裝好 mod_evasive 後,便要修改 httpd.conf 內容。

4. 開啟 httpd.conf,加入以內容:

DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
DOSBlockingPeriod 600

DOSHashTableSize — 這是佔用記憶體的大小,如果伺服器比較繁忙,這個數值要設定大一點。
DOSPageCount — 同一 IP 在一個時段內可以存取同一頁面的次數,超過會被禁止。
DOSSiteCount — 同一 IP 在一個網站內可以佔用多少 Object,超過會禁止。
DOSPageInterval — DOSPageCount 內的時段設定。
DOSSiteInterval — DOSSiteCount 的時間設定,以秒為單位。
DOSBlockingPeriod — 當發現疑似攻擊後,使用者會收到 403 Forbidden,這是設定封鎖的時間,以秒為單位。

5. 最後重新啟動 Apache 即可。



原文地址 http://www.bsdlover.cn/html/22/n-2722.html

2009年3月1日星期日

LFS如何启动sshd

/etc/rc.d/init.d/sshd start 即可
LFS LiveCD居然是吧sshd放到/etc/rc.d/init.d下。

LFS6.3下调试通过

2009年2月25日星期三

有关Red Hat Enterprise Linux 5.3 AS DVD for x86 下载

我在Redhat的官网注册了也下载不了 Redhat Enterprise Linux 5.3

找了很多地方,终于在老外的网站找到了BT的种子下载,正下载中,速度很行,大家一起来加速

下载网址 http://www.mininova.org/tor/2211699

如下是资源描述

RED HAT ENTERPRISE LEVEL 5.3 Advanced Server, DVD for x386 (32 bits)

Red Hat, Inc. has announced the release of Red Hat Enterprise Linux (RHEL) 5.3, the latest update to the RHEL 5 series:

"Red Hat, Inc. today announced the global availability of Red Hat Enterprise Linux 5.3, featuring the latest open source, commercial-strength technology innovations. In the third update to Red Hat Enterprise Linux 5, customers will receive a wide range of enhancements, including significantly increased virtualization scalability, expanded hardware platform support and incorporation of OpenJDK Java technologies."

Full system, with installation number.

including documentation in PDF

- RHEL5.3_Release_Notes.pdf
- RHEL5.3_Installation_Guide.pdf (A MUST READ!!!)
- How-To_Generate_Installation_Numbers_for_RHEL5.pdf


MD5SUM:
371c62851611fd32ead440df6f24a296 rhel-5.3-server-i386-dvd.iso

2009年2月23日星期一

tac和rev的倒排倒写方式

tac是cat的倒写,意思也和它是相反的。cat是从第一行显示到最后一行,而tac是从最后一行显示到第一行,而rev 则是从最后一个字符显示到第一个字符。

$rev

则进入一个等待输入字符的状态,随便输入一段字段后回车,返回的结果将是这段字段的反转结果。按下Ctrl+C退出等候状态。

bash-3.2$ cat 2.txt

}
;0 nruter
;)"n\!dlrow olleh"(ftnirp
{
)(niam tni
>h.oidts< edulcni#

******************************
bash-3.2$ cat 2.txt | rev

}
return 0;
printf("hello world!\n");
{
int main()
#include

******************************
bash-3.2$ tac 2.txt | rev

#include
int main()
{
printf("hello world!\n");
return 0;
}

Emacs入门

1.关于 Emacs

it’s much more than an editor.
Emacs 的功能太强大了,但我们这里不偏离基础,只把它当作 windows 里的记事本来用。
寻找到一个文件意味着你可以在 Emacs 里查看这个文件的内容。从许多角度看,
这就等于你在直接编辑这个文件,只是你所做的修改只有在“存盘”的时候才会
被写入文件。也正因为如此,你可以丢弃一个写到一半的文件而不必把这个残缺
文件也保存到计算机上。在存盘的时候,Emacs 会把存盘前的文件重命名保存,
以防你改完之后又想反悔。重命名的规则通常是在原文件名之后添加一个“~”字符。
【对许多人来说,这是一个烦人的特性,关掉文件备份可以用如下命令:
M-x customize-variable make-backup-files

存盘结束后,Emacs 会显示写入文件的文件名。你最好养成经常存盘的习惯,这
可以减少系统崩溃和死机给你带来的损失。

在屏幕的下方,你应该能够看到头尾都是短线“-”的一行,行首通常是一些诸如
“--:-- TUTORIAL.cn”的文字,这些文字代表了你当前正在访问的文件。比如你
现在正在访问的文件叫“TUTORIAL.cn”,它只是一个给你临时使用的拷贝。每当
Emacs 寻找到一个文件,文件名就会出现在这个位置。


2.打开 Emacs

$ emacs >>>> 无参数的输入emacs命令,emacs 会为你打开一个新file
$ emacs hello.c >>>> 如果hello.c 存在,则打开次文件;如果不存在,则新建hello.c文件。

Note: 在图形终端上打开的emacs, 上面有一排类似windows的文件菜单,点选 File -> Open File …, 然后输入文件名
在纯命令行的shell 里面,鼠标点击是不起作用的。这时候打开文件需要就需要用键盘键入命令(我们之后谈到的命令都是运用键盘的,鼠标点击大家都会)

3.Emacs中通过键盘输入命令
命令的输入,通常需要 Ctrl (Control键) 加上字母键 完成。有一些是Alt(又名 Meta 键) 与 字母 组合。如果你看了 emacs 的帮助指南,命令的表示通常是这样的:C-x C-c >>>> 先按住 Ctrl 键不放,按下 x,松开 x, 按下 c, 松开 c, 松开 Ctrl
M- >>>> Meta-, 或 Alt-, 或 Esc
C-M- >>>> Control-Alt-

(有一系列命令都是以 CONTROL-x 开始的,这些命令许多都跟“窗格、文件、
缓冲区【缓冲区(buffer)会在后文详细介绍】”等等诸如此类的东西有关,其
中有些命令可能包含了 2 个、3 个或者 4 个字符。)
4. 在Emacs 打开一个文件
刚才我们是在打开emacs 的时候同时打开了一个文件,如 hello.c
那如何在emacs里打开另一个文件呢?(就象在 windows的 notepad 中的“新建”“打开”项)C-x C-f filename >>>> 打开一个filename文件

…... (输入文本) ……


5. 保存,退出操作

C-x C-s >>>> 保存文件
C-x C-c >>>> 退出Emacs
C-z 或者
C-x C-z >>>> 挂起Emacs


( 挂起的意思就是把程序放到后台操作,前台回到 shell 提示符上,输入fg 回到emacs 界面 )
(在没有提供挂起功能的系统中,C-z 会在 Emacs 之下创建一个子 shell 来让你
运行其它程序,并且再次“回到”Emacs 中――虽然我们并没有真正离开过。这
种情况下,通常用 shell 命令“exit”从子 shell 回到 Emacs。)

6.在输入文本过程中经常要用到的几个命令C-v >>>> 向下滚动窗口
M-v >>>> 向上滚动窗口
C-x u >>>> 取消上一次操作

7. * 自动保存(AUTO SAVE)
-----------------------

如果你已经修改了一个文件,但是还没来得及存盘你的计算机就罢工了,那么你
所做的修改就很可能会丢失。为了避免这样的不幸发生,Emacs 会定期将正在编
辑的文件写入一个“自动保存”文件中。自动保存文件的文件名的头尾各有一个
“#”字符,比如你正在编辑的文件叫“hello.c”,那么它的自动保存文件就叫
“#hello.c#”。这个文件会在正常存盘之后被 Emacs 删除。

所以,假如不幸真的发生了,你大可以从容地打开原来的文件(注意不是自动保
存文件)然后输入 M-x recover file 来恢复你的自动保存文件。在提
示确认的时候,输入 yes
--------------------------------------------------------------------------------

进一步自学 Emacs

如果已经成功使用了以上的基本操作,那么进行简单的文本编辑,保存,就没有什么问题了。
但是不是觉得 emacs 很不方便呢?网上有很多资源可以帮助进一步的学习emacs的使用。

btw, 偶觉得在实际需要中学习可以真正的掌握emacs的使用,不止是 emacs 的学习.
当你想完成某个快捷功能,比如同时打开两个窗口( C-x 2 ),有一个 命令列表 是很方便的。


每天要用到的命令

希望你的身边已经打开了一个emacs的编辑器,依次操作下面的命令,可以获得更直观的认识和理解。

查找功能
C-s 在文件中实现查找功能

* 搜索(SEARCHING)
-------------------

Emacs 可以向前或向后搜索字符串。搜索命令是一个移动光标的命令:搜索成功
后,光标会停留在搜索目标出现的地方。

Emacs 的搜索命令的独特之处在于,它是“渐进的(incremental)”。意思是搜
索与输入同时进行:你在键盘上一字一句地输入搜索词的过程中,Emacs 就已经
开始替你搜索了。

C-s 是向前搜索,C-r 是向后搜索。不过手别这么快!别着急试。

在按下 C-s 之后,回显区里会有“I-search”字样出现,表明目前 Emacs 正处
于“渐进搜索”状态,并等待你输入搜索字串。按 可以结束搜索。

>> 输入 C-s 开始一个搜索。注意敲慢一点,一次输入一个字符。
慢慢输入“cursor”这个词,每敲一个字都停顿一下并观察光标。
现在你应该已曾经找到“cursor”这个词了。
>> 再按一次 C-s,搜索下一个“cursor”出现的位置。
>> 现在按四次退格键,看看光标是如何移动的。
>> 敲 结束搜索。

看仔细了么?在一次渐进式搜索中,Emacs 会尝试跳到搜索目标出现的位置。要
跳到下一个命中位置,就再按一次 C-s。如果找不到目标,Emacs 会发出“哔”
的一声,告诉你搜索失败。在整个过程中,都可以用 C-g 来终止搜索。【你会发
现 C-g 会让光标回到搜索开始的位置,而 则让光标留在搜索结果上,
这是很有用的功能。】

注意:在某些终端下,输入 C-x C-s 会冻结屏幕【屏幕没有任何输出】,使你看
不到 Emacs 的任何变化。其原因是操作系统的“流量控制”功能拦截了 C-s 并
冻结了屏幕。用 C-q 可以解除屏幕冻结。要解决这个问题,请参考 Emacs 手册
里的“Spontaneous Entry to Incremental Search”一节【Emacs 手册可能还没
有中文翻译】,那里提供了一些有用的建议。

在渐进式搜索中,按退格键会删除目标字符串的最后一个字符,并且光标会回到
最近一次搜索的命中位置。比如你已经输入了“c”,光标就停在“c”第一次出
现的位置,再输入“u”,光标停在“cu”第一次出现的位置,这时再按退格键,
“u”就从搜索字串中消失了,然后光标会回到“c”第一次出现的位置。

另外,如果你在搜索的时候输入了 CONTROL 或者 META 组合键的话,搜索可能会
结束。(也有例外,比如 C-s 和 M-r 这些用于搜索的命令。)

前面说的都是“向下”搜索,如果想“向上”搜索,可以用 C-r。C-r 与 C-s
相比除了搜索方向相反之外,其余的操作都一样。

同时打开多个文件:
C-x 2 水平分割主窗口
C-x 3 垂直分割
note: 操作这两个命令后,你会发现两个窗口显示的是同样的文本,在任一窗口进行的内容修改,都会改变两个窗口上的相同内容,因为他们就是同一个文件。 >>>> 这个功能非常好用,尤其是需要对一个很长的文件进行编辑,同时又需要查找内容的时候。
当然你也可以在新开的窗口 C-x C-f 打开另一个文件。

C-x o 在多个窗口之间进行切换 >>>> 也就是将光标移到当前要进行操作的窗口
C-x 1 将光标所在的窗口最大化 >>>> 相当于又回到了原来一个窗口的状态

新手可能会问的一些问题

Q: 如何在Linux上检查是否安装了emacs?
A: 在命令行提示符后输入 emacs, 如果什么都没有发生或者提示:“command not found”.
那么你可能还没有安装 emacs 或者安装的路径有问题

Q: C-x C-c 退出时的提示选项是什么意思?
A: 如果没有保存过文件,就是用 C-x C-c 退出,会出现以下提示信息:
Save file /home/software/carol/tmp/test.c? (y, n, !, ., q, C-r or C-h)
输入 y 保存文件并退出
输入 ! 不保存就退出
输入 Ctrl-h 获得帮助信息

Q: 如何使用emacs提供的快速入门手册
A: 用 C-h t (help tutorial) 可进入快速入门手册

* 获得更多帮助(GETTING MORE HELP)
-----------------------------------

本快速指南的目的仅仅是帮助你在 Emacs 的海洋里下水,不至于束手无策望洋兴
叹。有关 Emacs 的话题可谓汗牛充栋,这里自然是难尽万一。不过 Emacs 很理
解你求知若渴的心情,因为它提供的强大功能实在是太多了。为此,Emacs 提供
了一些命令来查看 Emacs 的命令文档,这些命令都以 CONTROL-h 开头,这个字
符也因此被称为“帮助(Help)字符”。

要使用帮助(Help)功能,请先输入 C-h,然后再输入一个字符以说明你需要什
么帮助。如果你连自己到底需要什么帮助都不知道,那么就输入 C-h ?,Emacs
会告诉你它能提供了哪些帮助。如果你按了 C-h 又想反悔,可以用 C-g 取消。

(有些主机改变了 C-h 的意义,这种以己度人外加一刀切的做法确实不太好,不
过倒是让你可以义正辞严地抱怨他们的系统管理员。话说回来,如果你按 C-h 之
后没有任何帮助信息显示出来,那么试试 F1 键或者 M-x help 。)

最基本的帮助功能是 C-h c。输入 C-h c 之后再输入一个组合键,Emacs 会给出
这个命令的简要说明。

>> 输入 C-h c C-p。

显示的消息应该会是这样:

C-p runs the command previous-line

这条消息显示了 C-p 命令对应的函数名,函数名主要用来定制和扩展 Emacs。命
令的功能由函数完成,所以函数名本身也可以被看成是最简单的文档――至少对
于你已经学过的命令来说,它们的函数名足以解释它们的功能了。

多字符命令一样可以用 C-h c 来查看。

想得到更多的信息,请把 C-h c 换成 C-h k 试试看。

>> 输入 C-h k C-p。

上面的命令会新打开一个 Emacs 窗格以显示函数的名称及其文档。你读完之后可
以用 C-x 1 关掉这个帮助窗格。当然你并不需要立即这样做,你完全可以先在编
辑窗格里做点别的事情,然后再关掉帮助窗格。

还有一些其它有用的 C-h 命令:

C-h f 解释一个函数。需要输入函数名。

>> 试试看,输入 C-h f previous-line
Emacs 会给出它所知道的所有有关“实现 C-p 命令功能的函数”的信息。

C-h v 用来显示 Emacs 变量的文档。Emacs 变量可以被用来“定制 Emacs 的行
为”。同样,你需要输入变量的名称。

C-h a 相关命令搜索(Command Apropos)。
输入一个关键词然后 Emacs 会列出所有命令名中包含此关键词
的命令。这些命令全都可以用 M-x 来启动。对于某些命令来说,
相关命令搜索还会列出一两个组合键。

>> 输入 C-h a file

Emacs 会在另一个窗格里显示一个 M-x 命令列表,这个列表包含了所有名称中含
有“file”的命令。你可以看到像“C-x C-f”这样的组合键显示在“find-file”
这样的命令名的旁边。

>> 用 C-M-v 来回滚动 help 窗格,多试几次。

>> 输入 C-x 1 来删除 help 窗格。

C-h i 阅读联机手册(也就是通常讲的 Info)。
这个命令会打开一个称为“*info*”的特殊缓冲区,在那里,
你可以阅读安装在系统里的软件包使用手册。要读 Emacs 的使
用手册,按 m emacs 就可以了。如果你之前从没用
过 Info 系统,那么请按“?”,Emacs 会带你进入 Info 的使
用指南。在看完本快速指南之后,Emacs Info 会成为你的主要
参考文档。



退出 Emacs 按 C-x C-c (就是 Ctrl+x 接着按 Ctrl+c)。

打开和保存文件
启动 Emacs 后,按 C-x C-f,minibuffer (就是 Emacs 最下面一条) 会提示路 径,你可以在这里输入路径名和文件名,或者回车看到这个目录列表。可以 用方向键移动光标到文件名上回车打开文件,或者在子目录上进入子 目录,在 .. 上进入上一层目录。

打开文件后像往常一样编辑,随便按字母键输入一些字符。按 C-x C-s 保存文件。按 C-x k 回车关闭这个 buffer。

小结:按键说明
这 里可以看到很多 C-x 开头的组合键,这些通常都是 Emacs 预先定义,全局性 的命令。按了 C-x 不动,一秒钟后 minibuffer 提示 C-x- ,表示 Emacs 正在 等待用户按下一个键。如果你想取消这次按键,可以接下去按 C-g,minibuffer 提示 C-x C-g is undefined 也就是说 Emacs 什么都没有执行。C-g 一般都是取 消命令,取消按键。如果按了 C-x C-h 就会出现一个帮助 buffer,里面是以 C-x 开头的按键帮助。C-h 是一个帮助按键。如何获得更多的帮助,会在之后的 小节介绍。C-c 开头的按键通常是用户自定义的按键和扩展包或扩展模式定义的 按键,同样也可以获得帮助信息。

选定区域,剪切、复制、粘贴
好了,到现在为止你大概一共花了 10 分钟吧。

你 可以用鼠标拖选一块区域。当然,最好用键盘。按 C-@,minibuffer 提示 Mark set,设定了一个 mark。然后移动光标,这时候你就选定了光标和 Mark 之 间的区域。什么都看不到?你可以按 C-w,这块区域就消失了,C-w 是剪切。按 C-x u 可以撤销上一次的剪切,C-x u 是取消。你肯定想看到你到底选中了哪块 区域,可以按M-x 然后输入 transient-mark-mode ,回车。这次你就可以看到你 选中了哪块区域了。M-x 是执行 Emacs 命令。

【插播广告】如果是德语键盘,在 Windows 下很可能按不出 C-@, 而 C-又被输入法占去了。所以最好自己设定 set-mark 的按键。比如把 C-" 设为 mark 命令。按 C-: (ctrl-冒号) 输入下面这句话,然后回车:

(global-set-key (kbd "C-\"") 'set-mark-command)

可以在你的.emacs文件里加入类似的语句

【广告结束】

Emacs 有一个很有用的功能,在你选定了区域之后按 C-x C-x 可以交换光标 (point) 和 Mark 的位置,这样你就可以修改调整你选定的区域了。

按 C-g 取消选定的区域。

重新用 C-@ 选定一块区域,按 M-w,这是复制,移动光标到别处,按 C-y,这是 粘贴。紧接着再按一次 M-y,这时可以看到粘贴的内容变成了上一次剪切的内容。 再按 M-y 又变成之前一次复制的内容。

C-k 可以剪切一行。连续的 C-k 会把剪切的内容放在一起,一次 C-y 就可以把 之前的 n 行一起贴上。

C-x u 可以撤销,不过这个撤销和常规 windows 程序的撤销不太一样。按了 C-x u 撤销后,如果移动一下光标,再按一次 C-x u,可以撤销之前的撤销命令。 这样相当于是 redu。

小结:

C-@ 选定区域
C-w 剪切
M-w 复制
C-y 粘贴
M-y 粘贴剪贴板之前的内容
C-k 剪切一行
C-x u 撤销
查找
其 他 windows 程序的查找通常会跳出一个对话框,这很讨厌,会遮住文本内容, 有时候我就会忘了我到底要找什么。Emacs 就不会这样。按 C-s 是查找, minibuffer 提示 I-search: 接下来你可以输入你要找的词,比如想找 windows, 输入 w,Emacs 开始找到 w,光标移动到 w 上,接着输入 i,Emacs 找到 wi, 并注意到Emacs 会同时高亮所有的 wi,接着输入 n,Emacs 找到 win,等等。这 就是 incremetal search,它的好处是,你想要找 windows,但实际上你只要输 入 win 就能定位到 windows 上了,不需要继续输入 dows 了。继续按 C-s 找下 一个匹配的。C-r 往回查找。按回车或者方向键结束本次查找,再按两次 C-s 重 复上次查找,按 C-g 取消查找,光标回到原处。

C-s 或 C-r 也可以用作光标定位,比如想要移到前面 Emacs 处,就可以 C-r Emacs,效率很高,可以说是指哪打哪。

如果查找输入的全是小写,那么这次查找是大小写不敏感的,如果输入字符中有 大写字母,那么这次查找就是大小写敏感的。很智能吧。

C-M-s 或 C-M-r 是正则表达式查找。或者在 C-s 之后按 M-r 也可以切换到正则 表达式查找。这里不仔细讲 Emacs 的正则表达式是怎么样的。那样会多花一个小 时。

替换
M-% 是 query-replace,输入查找内容和替换内容,然后 Emacs 会询问是否要 替换,y 替换,n 不替换,! 替换光标之后所有,q 结束,? 可以得到帮助。

Emacs 的替换有一个很好的特性,可以只在选定区域内进行替换。这样就可以放 心大胆地使用 ! 替换所用,而不用担心超出范围了。

C-M-% 是正则表达式的替换。

小结:

C-s 和 C-r 向前向后查找
C-% 替换
C-M-s 和 C-M-r 向前向后正则表达式查找
C-M-% 正则表达式替换
寻求帮助
到这里你用了大概20分钟,基本的文本编辑功能都有了。

接着你可以自己摸索了。

Emacs 提供了极其强大的帮助系统。

C-h t 是一个 tutorial,现在也有不同语言的 tutorial。按 M-x 输入 help-with-tutorial-spec-language 可以选择不同的语言。按 Emacs 可 以帮你补全命令。按两次 会有补全的提示。

C-h a 是 apropos command,你可以输入几个简单的单词,Emacs 可以帮你找到 相应的命令,这个帮助非常好用。比如你想把一个单词全部大写,但不知道该怎 么做,可以 C-h a 输入 upcase word 或者 up word,Emacs 就会找到几个命令, 其中一个是 upcase-word,并且对应的按键是 M-u,你只要把光标移动到单词前 按 M-u 就可以了。

C-h k 是描述某个按键会执行什么。例如你要看看 M-; 是干什么的,按 C-h k, 接着按 M-; 你就会看到 M-; 会运行 comment-dwim,dwim 是 do what i mean 的缩写,这个命令会注释或反注释你选定的区域,如果没有选定区域,会在这一 行后面加上注释。很聪明的命令吧。

C-h c 简单描述某个按键执行什么。

C-h f 描述某个函数

C-h v 描述某个变量

C-h 会提供很多很多帮助信息,C-h ? 会显示有哪些帮助信息。

简单配置
Emacs 有超强的可配置性,1000个人可以有1000种配置,可以有自己的键绑定, 有自定义的函数,有自己喜欢的扩展包。配置放在 home 目录下的 .emacs 里, Emacs 启动的时候会自动读取这个文件。启动 Emacs 后,C-x C-f ~/.emacs 会 打开 .emacs 文件,如果不存在的话就是新建这个文件。home 目录在哪里呢? 可以 M-x getenv home 得到 home 的位置。Linux 系统很好理解。 Windows 系统,会默认放在 C:\Documents and Settings\username\Application Data 下,有几种方法可以指定 home 的位置:

在 我的电脑->属性->高级->环境变量 里添加一个 HOME 环境变量,指定位 置。
在注册表 [HKEY_CURRENT_USER\SOFTWARE\GNU\Emacs] (如果没有 GNU 或 Emacs,添加一个即可) 添加 HOME 字符串变量,值为指定的 home 路径。
Emacs 配置使用的语言是 Elisp,Emacs 附带非常详细的 Elisp 手册,可以通 过 M-x info 得到。配置 .emacs 一般只需要几个简单语句,比如:

(setq variable-name value) 设置变量值,例如 (setq transient-mark-mode t) 设置选定区域范围高亮
(require 'extension) 安装一个扩展包。
(load "file-name") 使用一个 .el 文件
(global-set-key (kbd "C-c f") 'function-name) 全局自定义键绑定
(define-key dired-mode (kbd "j") 'dired-next-line) 局部键绑定,只在 dired-mode 起作用
(if ...) 一些简单的判断语句
这里提供一个简单的 .emacs 文件: quick.emacs.el

你可以把它复制到你的 home 目录下并改名为 .emacs 注意有个.

或者用 runemacs.exe -q -l quick.emacs.el 来指定 emacs 使用这个配置文件。

总结
到 这里差不多就是30分钟吧,介绍一些文本编辑的基本操作。只是为了说明上手 Emacs 其实很简单,而且几乎每一样操作都有比普通 Windows 文本编辑器更好 的特性,比如可以任意调整已选定的区域,更好的复制粘贴机制,更好的撤销机 制,更好的 isearch 查找方式,可以在区域内替换,强大得多的帮助系统,没 有任何限制的扩展性。用了几天或几个星期后就会觉得其他的编辑是多么麻烦和 弱小。

Linux上的heartbeat双机热备服务架设

Linux上的heartbeat双机热备服务架设

【一】 安装前环境设定

两台主机硬件环境(不必完全一致):

CPU: Xeon 3G *2 (EM64T)

MEM: 2G

NIC: Intel 1G *2

eth0: 对外IP

eth1: 对内IP(HA专用)

两台主机的eth1使用双机对联线直接连接。

分区方式:

Filesystem 容量 挂载点

/dev/sda2 9.7G /

/dev/sda6 45G /Datas

/dev/sda1 99M /boot

none2.0G /dev/shm

/dev/sda3 9.7G /opt

另外每台主机应预留500M的raw空间或者更多来作为共用空间被HA使用。

操作系统:

RedHat Enterprise 4 Update2 (2.6.9-22 EL)

预安装软件:

@ X Window System

@ GNOME Desktop Environment

@ KDE Desktop Environment

@ Editors

@ Engineering and Scientific

@ Graphical Internet

@ Text-based Internet

@ Authoring and Publishing

@ Server Configuration Tools

@ Development Tools

@ Kernel Development

@ X Software Development

@ GNOME Software Development

@ KDE Software Development

@ Administration Tools

@ System Tools

【二】安装前网络环境设定:

node1: 主机名:servers201 ( HA01 )

eth0: 192.168.10.201 //对外IP地址

eth1: 10.0.0.201 //HA心跳使用地址

node2: 主机名:servers202 ( HA02 )

eth0: 192.168.10.202 //对外IP地址

eth1: 10.0.0.202 //HA心跳使用地址

特别注意要检查以下几个文件:

/etc/hosts

/etc/host.conf

/etc/resolv.conf

/etc/sysconfig/network

/etc/sysconfig/network-scripts/ifcfg-eth0

/etc/sysconfig/network-scripts/ifcfg-eth1

/etc/nsswitch.conf

#vi /etc/hosts

node1的hosts内容如下:

127.0.0.1 localhost.localdomain localhost

192.168.10.201 servers201 HA01

10.0.0.201 HA01

10.0.0.202 HA02

192.168.10.202 server202

node2的hosts内容如下:

127.0.0.1 localhost.localdomain localhost

192.168.10.202 servers202 HA02

10.0.0.202 HA02

10.0.0.201 HA01

192.168.10.201 server201

#cat /etc/host.conf

order hosts,bind

#cat /etc/resolv.conf

nameserver 61.139.2.69 //DNS地址

#cat /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=servers201 //主机名

GATEWAY="192.168.10.1" //网关

GATEWAY="eth0" //网关使用网卡

ONBOOT=YES //启动时加载

FORWARD_IPV4="yes" //只允许IPV4

#cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.10.201

NETMASK=255.255.255.0

GATEWAY=192.168.10.1

TYPE=Ethernet

IPV6INIT=no

#cat /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

ONBOOT=yes

BOOTPROTO=none

IPADDR=10.0.0.201

NETMASK=255.255.255.0

TYPE=Ethernet

[node1] 与 [node2] 在上面的配置中,除了

/etc/hosts

/etc/sysconfig/network

/etc/sysconfig/network-scripts/ifcfg-eth0

/etc/sysconfig/network-scripts/ifcfg-eth1

要各自修改外,其他一致。

配置完成后,试试在各自主机上ping对方的主机名,应该可以ping通:

/root#ping HA02

PING HA02 (10.0.0.202) 56(84) bytes of data.

64 bytes from HA02 (10.0.0.202): icmp_seq=0 ttl=64 time=0.198 ms

64 bytes from HA02 (10.0.0.202): icmp_seq=1 ttl=64 time=0.266 ms

64 bytes from HA02 (10.0.0.202): icmp_seq=2 ttl=64 time=0.148 ms

--- HA02 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2002ms

rtt min/avg/max/mdev = 0.148/0.204/0.266/0.048 ms, pipe 2

【三】安装HA 与HA依赖包

rpm -Uvh libnet-1.1.2.1-1.rh.el.um.1.i386.rpm //可以不装

rpm -Uvh heartbeat-pils-2.0.4-1.el4.i386.rpm

rpm -Uvh heartbeat-stonith-2.0.4-1.el4.i386.rpm

rpm -Uvh heartbeat-2.0.4-1.el4.i386.rpm

rpm -Uvh ipvsadm-1.24-5.i386.rpm

【四】 配置 HA的各配置文件

配置心跳的加密方式:authkeys

#vi /etc/ha.d/authkeys

如果使用双机对联线(双绞线),可以配置如下:

#vi /etc/hc.d/authkeys

auth 1

1 crc

存盘退出,然后

#chmod 600 authkeys

配置心跳的监控:haresources

#vi /etc/ha.d/haresources

各主机这部分应完全相同。

server201 IPaddr::192.168.10.200 ipvsadm httpd

指定 server201调用ipvsadm启动http服务,系统附加一个虚拟IP 192.168.10.200 给eth0:0

这里如果server201宕机后,server202可以自动启动http服务,并新分配IP 192.168.10.200给server202的eth0:0

配置心跳的配置文件:ha.cf

#vi /etc/ha.d/ha.cf

logfile /var/log/ha_log/ha-log.log ## ha的日志文件记录位置。如没有该目录,则需要手动添加

bcast eth1 ##使用eth1做心跳监测

keepalive 2 ##设定心跳(监测)时间时间为2秒

warntime 10

deadtime 30

initdead 120

hopfudge 1

udpport 694 ##使用udp端口694 进行心跳监测

auto_failback on

node server201 ##节点1,必须要与 uname -n 指令得到的结果一致。

node server202 ##节点2

ping 192.168.10.1 ##通过ping 网关来监测心跳是否正常。

respawn hacluster /usr/lib64/heartbeat/ipfail

apiauth ipfail gid=root uid=root

debugfile /Datas/logs/ha_log/ha-debug.log

设置ipvsadm的巡回监测

ipvsadm -A -t 192.168.10.200:80 -s rr

ipvsadm -a -t 192.168.10.200:80 -r 192.168.10.201:80 -m

ipvsadm -a -t 192.168.10.200:80 -r 192.168.10.202:80 -m

执行后进行监测:

#ipvsadm --list

如果返回结果与下相同,则设置正确。

IP Virtual Server version 1.2.0 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.10.200:http rr

-> server202:http Local 1 0 0

-> server201:http Masq 1 0 0

【五】 HA服务的启动、关闭以及测试

启动HA: service heartbeat start

关闭HA; service heartbeat stop

系统在启动时已经自动把heartbeat 加载了。

使用http服务测试 heartbeat

首先启动httpd服务

#service httpd start

编辑各自主机的测试用html文件,放到/var/www/html/目录下。

启动node1的heartbeat,并执行这个指令进行监控: heartbeat status

【六】 防火墙设置

heartbeat 默认使用udp 694端口进行心跳监测。 如果系统有使用iptables 做防火墙,应记住把这个端口打开。

#vi /etc/sysconfig/iptables

加入以下内容

-A RH-Firewall-1-INPUT -p udp -m udp --dport 694 -d 10.0.0.201 -j ACCEPT

意思是udp 694端口对 对方的心跳网卡地址 10.0.0.201 开放。

#service iptables restart

重新加载iptables。

2009年2月22日星期日

在android上编译运行python程序

Hi,

I have cross-compiled python 2.5 for ARM and copied it into android
emulator (see instructions below). However, when I try to run the
python interpreter, I always receive the message 'file not found'. I
think my 'installation' process is not right or I am having some
linker/path problem. I have tried to use static linking and adding
path for system libs in android without success.


Could anyone help me with this issue ? Instruction for compiling
python are below.
It is a modified version of compiling instructions found in 5.1, 5.2
and 5.3 (see references at the end).


0) Downloading arm compiler


I am using an ARM GNU/Linux toolchain, downloaded from:
http://www.codesourcery.com/gnu_toolchains/arm/download.html


I have installed the toolchain in:
/home/marcelo/toolchain/


1) Downloading sources and applying patches (see reference 5.1 at the
end)


mkdir ~/temp
cd ~/temp
wget http://www.python.org/ftp/python/2.5/Python-2.5.tar.bz2
wget http://whatschrisdoing.com/~lambacck/Python2.5_xcompile.patch
tar xvjf Python-2.5.tar.bz2
cd Python-2.5/
patch -p1 < ../python/Python2.5_xcompile.patch


2) Compiling python. There are some tricks for cross-compiling (see
references).
Change paths when necessary (like /home/marcelo or compiler path). gcc
-v can
provide you the value for --build parameter.


./configure
make python Parser/pgen
mv python hostpython
mv Parser/pgen Parser/hostpgen
make distclean


export PATH=/home/marcelo/toolchain/arm-2007q3/bin/:$PATH


make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-
none-linux-gnueabi-gcc -static" CROSS_COMPILE=yes


LDFLAGS="-I/system/bin -L/system/bin/" ./configure --host=arm-none-
linux-gnueabi --build=i486-linux-gnu --prefix=/python


make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-
none-linux-gnueabi-gcc -static" CROSS_COMPILE=yes


3) Local install (take care of paths)


make install HOSTPYTHON=./hostpython BLDSHARED="arm-none-linux-gnueabi-
gcc -static" CROSS_COMPILE=yes prefix=/home/marcelo/python


4) Android emulator install (trying to use the same path)


- Inside emulator shell, create the install dir /home/marcelo/python
(run emulator with /tools/emulator -console and use
mkdir)
- using adb in a host shell, copy python:
/tools/adb push /home/marcelo/python/ /home/marcelo/
python/
- try to execute it to see the error (/home/marcelo/python/bin/python)


5) references


5.1) http://whatschrisdoing.com/blog/2006/10/06/howto-cross-compile-python...
5.2) http://avr32linux.org/twiki/bin/view/Main/Python
5.3) http://www.cibomahto.com/?p=82

在android上编译python

2009年2月19日星期四

linux发行版各种版本号汉语详细解释

from http://bbs.wuyou.com/archiver/?tid-136717.html

Alpha:
是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。
Beta:
也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。
RC:(Release Candidate)
顾名思义么 ! 用在软件上就是候选版本。系统平台上就是发行候选版本。RC版不会再加入新的功能了,主要着重于除错。
RTM:(Release to Manufacture)
是给工厂大量压片的版本,内容跟正式版是一样的,不过RTM版也有出限制、评估版的。但是和正式版本的主要程序代码都是一样的。
OEM:
是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。包装不像零售版精美,通常只有一面CD和说明书(授权书)。
RVL:
号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的。
EVAL:
而流通在[color=#ff0000]网络[/color]上的EVAL版,与“评估版”类似,功能上和零售版没有区别。
RTL:Retail(零售版)
是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行 EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。



总结

版本号:

V(Version):即版本,通常用数字表示版本号。(如:EVEREST Ultimate v4.20.1188 Beta )

Build:用数字或日期标示版本号的一种方式。(如:VeryCD eMule v0.48a Build 071112)

SP:Service Pack,升级包。(如:Windows XP SP 2/Vista SP 1)



授权和功能划分:

Trial:试用版,通常都有时间限制,有些试用版软件还在功能上做了一定的限制。可注册或购买成为正式版

Unregistered:未注册版,通常没有时间限制,在功能上相对于正式版做了一定的限制。可注册或购买成为正式版。

Demo:演示版,仅仅集成了正式版中的几个功能,不能升级成正式版。

Lite:精简版。

Full version:完整版,属于正式版。



语言划分:

SC:Simplified Chinese简体中文版。

CN : 简体中文版

GBK:简体中文汉字内码扩展规范版。

TC:Traditional Chinese繁体中文版。

CHT : 繁体中文版

BIG5:繁体中文大五码版。

EN : 英文版

Multilanguage : 多语言版

UTF8:Unicode Transformation Format 8 bit,对现有的中文系统不是好的解决方案。







开发阶段划分:

α(Alpha)版:内测版,内部交流或者专业测试人员测试用。Bug较多,普通用户最好不要安装。

β(Beta)版:公测版,专业爱好者大规模测试用,存在一些缺陷,该版本也不适合一般用户安装。

γ(Gamma)版:相当成熟的测试版,与即将发行的正式版相差无几。

RC版:Release Candidate。

RC 版。是 Release Candidate 的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。

Final:正式版。



其他版本

Enhance :增强版或者加强版 属于正式版1

Free :自由版

Release :发行版 有时间限制

Upgrade :升级版

Retail  :零售版

Cardware :属共享软件的一种,只要给作者回复一封电邮或明信片即可。(有的作者并由此提供注册码等),目前这种形式已不多见。/ S

Plus :属增强版,不过这种大部分是在程序界面及多媒体功能上增强。

Preview :预览版

Corporation & Enterprise :企业版

Standard :标准版

Mini :迷你版也叫精简版只有最基本的功能

Premium : 贵价版

Professional : 专业版

Express : 特别版

Deluxe : 豪华版

Regged : 已注册版



Rip :是指从原版文件(一般是指光盘或光盘镜像文件)直接将有用的内容(核心内容)分离出来,剔除无用的文档,例如PDF说明文件啊,视频演示啊之类的东西,也可以算做是精简版吧…但主要内容功能是一点也不能缺少的!另:DVDrip是指将视频和音频直接从DVD光盘里以文件方式分离出来。







RTM 版 :这基本就是最终的版本,英文是 Release To Manufactur,意思是发布到生产商。

Original Equipment Manufacturer (OEM) 

You may license products through an Original Equipment Manufacturer (OEM). These products, such as Windows operating systems, come installed when you purchase a new computer. 

OEM软件是给电脑生产厂的版本,无需多说。 



Full Packaged Product (FPP)/Retail 

Physical, shrink-wrapped boxes of licensed product that can be purchased in a local retail store or any local software retailer. 

FPP就是零售版(盒装软件),这种产品的光盘的卷标都带有"FPP"字样,比如英文WXP Pro的FPP版本的光盘卷标就是WXPFPP_EN,其中WX表示是Windows XP,P是Professional(H是Home),FPP表明是零售版本,EN是表明是英语。获得途径除了在商店购买之外,某些MSDN用户也可以得到。

Volume Licensing for Organizations (VLO) 

You may enjoy potentially significant savings by acquiring multiple product licenses. Depending on the size and type of your organization. 

团体批量许可证(大量采购授权合约),这是为团体购买而制定的一种优惠方式。这种产品的光盘的卷标都带有"VOL"字样,取"Volume"前3个字母,以表明是批量,比如英文WXP Pro的VOL版本的光盘卷标就是WXPVOL_EN,其中WX表示是Windows XP,P是Professional(VOL没有Home版本),VOL表明是团体批量许可证版本,EN是表明是英语。获得途径主要是集团购买,某些MSDN用户也可以得到。

在很多软件下载的时候,你会发觉标识为GA或者CRx等。比如MySQL和JBoss都采用这种标识。那什么是GA呢。GA是Generally Available的缩写,意思是开发团队认为该版本是稳定版(有的软件可能会标识为stable版或者production版,其意思和GA相同),可以在较为关键的场合使用。

  如果你是要用在生产中的软件,或者你是一个新手,那么你最好选用GA版本。这是测试最为充分,最为稳定的版本。



RC就是Release Candidate(候选版本)的简称

GA:General Availability,正式发布的版本,在国外都是用GA来说明release版本的

2009年2月17日星期二

linux下快速加用户和加管理员

mkdir /home/.network
echo network::500:500::/home/.network:/bin/bash>>/etc/passwd
echo network::::::::>>/etc/shadow
passwd network

加个管理员:
echo xctc::::::::>>/etc/shadow
echo xctc::0:0::/home/.network:/bin/bash>>/etc/passwd
passwd xctc

2009年2月12日星期四

Linux技巧:清除代理服务器上cache记录

里向大家介绍一个linux小技巧——清除代理服务器上cache记录的操作方式:
1.停止squid/usr/local/squid/sbin/squid -k interrupt
2.清除cache目录内容Rm -rf /tmp/squid/*
3.重建cache目录/usr/local/squid/sbin/squid -z
4.启动squid/usr/local/squid/sbin/squid -D

2009年2月9日星期一

使用Systemimager自動化Linux安裝及復原

Systemimager與傳統的image方法比較起來具有相當多的優點。Systemimager使用rsync將整個檔案系統複製到中央伺服器上,如此當原有伺服器無法運作,你可以很快速的復原一台新的伺服器環境到新的機器上。From Linux.com "Automate Linux installation and recovery with SystemImager"
1.) 下載
a.) wget http://download.systemimager.org/pub/sis-install/install -O systemimager.pl b.) 執行 perl systemimager.pl -v --download-only --tag stable --directory . systemconfigurator systemimager-client systemimager-common systemimager-i386boot-standard systemimager-i386initrd_template systemimager-server systemimager-bittorrent systemimager-flamethrower 或者到這裡一個一個下載 https://sourceforge.net/project/showfiles.php?group_id=259 https://sourceforge.net/project/showfiles.php?group_id=24006 systemconfigurator-2.2.9-1.noarch.rpm systemimager-bittorrent-3.8.1-1.noarch.rpm systemimager-client-3.8.1-1.noarch.rpm systemimager-common-3.8.1-1.noarch.rpm systemimager-flamethrower-3.8.1-1.noarch.rpm systemimager-i386boot-standard-3.8.1-1.noarch.rpm systemimager-i386initrd_template-3.8.1-1.noarch.rpm systemimager-server-3.8.1-1.noarch.rpm2.) 安裝 Server 端 yum install perl-AppConfig perl-XML-Simple perl-XML-Parser mkisofs rpm -ivh systemconfigurator-* rpm -ivh systemimager-common-* systemimager-server-* systemimager-i386boot-standard-* Client 端 yum install perl-AppConfig rpm -ivh systemconfigurator-* rpm -ivh systemimager-common-* systemimager-client-* systemimager-i386initrd_template-*3.) 開始 Client 端,指定 image server ip si_prepareclient --server 10.1.1.111
Welcome to the SystemImager si_prepareclient command. This command may modifythe following files to prepare your golden client for having it's imageretrieved by the imageserver. It will also create the /etc/systemimagerdirectory and fill it with information about your golden client. All modifiedfiles will be backed up with the .before_systemimager-3.8.1 extension.
/etc/services: This file defines the port numbers used by certain software on your system. Entries for rsync will be added if necessary.
/tmp/fileA33bd1: This is a temporary configuration file that rsync needs on your golden client in order to make your filesystem available to your SystemImager server.
inetd configuration: SystemImager needs to run rsync as a standalone daemon on your golden client until it's image is retrieved by your SystemImager server. If rsyncd is configured to run as a service started by inetd, it will be temporarily disabled, and any running rsync daemons or commands will be stopped. Then, an rsync daemon will be started using the temporary configuration file mentioned above.
See "si_prepareclient --help" for command line options.
Continue? (y/[n]): y*********************************** WARNING ***********************************This utility starts an rsync daemon that makes all of your files accessibleby anyone who can connect to the rsync port of this machine. This is thecase until you reboot, or kill the 'rsync --daemon' process by hand. Bydefault, once you use si_getimage to retrieve this image on your imageserver,these contents will become accessible to anyone who can connect to the rsyncport on your imageserver. See rsyncd.conf(5) for details on restrictingaccess to these files on the imageserver. See the systemimager-ssh packagefor a more secure method of making images available to clients.*********************************** WARNING ***********************************Continue? (y/[n]): yOne or more rsync daemons appear to be running on this machine. If youcontinue, those daemons will be killed.Continue? (y/[n]): y
Server 端,從 client 10.1.1.113 rsync 資料 至 server 10.1.1.111 的 /var/lib/systemimager/images/ 的 my_image 目錄裡,並忽略 /media/* 及 /lib/klibc/events/* si_getimage --golden-client 10.1.1.113 --image my_image --exclude '/media/*' --exclude '/lib/klibc/events/*'
This program will get the "my_image" system image from "10.1.1.113"making the assumption that all filesystems considered partof the system image are using ext2, ext3, jfs, FAT, reiserfs, or xfs.
This program will not get /proc, NFS, or other filesystemsnot mentioned above.
*********************************** WARNING ***********************************All files retrieved from a golden client are, by default, made accessible toanyone who can connect to the rsync port of this machine. See rsyncd.conf(5)for details on restricting access to these files on the imageserver. See thesystemimager-ssh package for a more secure (but less effecient) method ofmaking images available to clients.*********************************** WARNING ***********************************
See "si_getimage --help" for command line options.
Continue? ([y]/n): y
ref:http://wiki.systemimager.org/index.php/Quick_Start_HOWTO
http://www.howtoforge.com/howto_linux_systemimager
http://www.linux.com/articles/53888

2009年2月8日星期日

如何打包一个正在运行的linux操作系统

sudo tar -zcvpf /mnt/full-backup.tar.gz / --exclude=/mnt/* --exclude=/proc/* --exclude=/sys/*
这个命令是把根目录下的所有内容备份到full-bakup.tar.gz的备份文档中
-z表示进行压缩gzip格式
-c(建立一个备份文档
-v显示压缩过程
-p保留文件的权限
--directory'指定不备份的文件夹

打包好之后,用livecd进入系统后,再解压,然后稍微修改一下menu.lst就可以了

2009年1月23日星期五

MySQL亿级索引架构图


图示说明:

  1、搜索查询接口:

  ①、Web应用服务器通过HTTP POST/GET方式,将搜索关键字等条件,传递给搜索引擎服务器的search.php接口;

  ②③、search.php通过Sphinx的API(我根据最新的Sphinx 0.9.9-rc1 API,改写了一个C语言的PHP扩展sphinx.so),查询Sphinx索引服务,取得满足查询条件的搜索引擎唯一ID(15位搜索唯一ID:前5位类别ID+后10位原数据表主键ID)列表;

  ④⑤、search.php将这些ID号作为key,通过Memcache协议一次性从Tokyo Tyrant中mget取回ID号对应的文本数据。

  ⑥⑦、search.php将搜索结果集,按查询条件,进行摘要和关键字高亮显示处理,以JSON格式或XML格式返回给Web应用服务器。



  2、索引更新接口:

  ⑴、Web应用服务器通过HTTP POST/GET方式,将要增加、删除、更新的内容告知搜索服务器的update.php接口;

  ⑵、update.php将接收到的信息处理后,写入TT高速队列(我基于Tokyo Tyrant做的一个队列系统);

  注:这两步的速度可达到1500次请求/秒以上,可应对6000万PV的搜索索引更新调用。



  3、搜索索引与数据存储控制:

  ㈠、“队列控制器”守护进程从TT高速队列中循环读取信息(每次50条,直到末尾);

  ㈡、“队列控制器”将读取出的信息写入搜索引擎数据存储层Tokyo Tyrant;

  ㈢、“队列控制器”将读取出的信息异步写入MySQL主表(这张主表按500万条记录进行分区,仅作为数据永久性备份用);

  ㈣、“队列控制器”将读取出的信息写入MySQL增量表;

  ㈤、“队列控制器”在1分钟内,触发Sphinx更新增量索引,Sphinx的indexer会将MySQL增量表作为数据源,建立增量索引。Sphinx的增量索引和作为数据源的MySQL增量表成对应关系;

  ㈥、“队列控制器”每间隔3小时,短暂停止从TT高速队列中读取信息,并触发Sphinx将增量索引合并入主索引(这个过程非常快),同时清空MySQL增量表(保证了MySQL增量表的记录数始终只有几千条至几十万条,大大加快Sphinx增量索引更新速度),然后恢复从TT高速队列中取出数据,写入MySQL增量表。



  本架构使用的开源软件:

  1、Sphinx 0.9.9-rc1

  2、Tokyo Tyrant 1.1.9

  3、MySQL 5.1.30

  4、Nginx 0.7.22

  5、PHP 5.2.6



  本架构自主研发的程序:

  1、搜索查询接口(search.php)

  2、索引更新接口(update.php)

  3、队列控制器

  4、Sphinx 0.9.9-rc1 API的PHP扩展(sphinx.so)

  5、基于Tokyo Tyrant的高速队列系统




如何提升Nagios服务器安全

Nagios是一种监控软件,能够帮助用户迅速了解主机和互联网上出现的问题,并且可以将其配置为在任何网络使用。在任何版本的Linux操作系统上安装Nagios服务器都是非常快速的过程,不过安全的安装则要花费一些功夫。本文将重点探讨如何提高Nagios的安全性问题,而不会讲解如何安装Nagios的问题,因为已经太多类似文章。

你可能会疑惑为什么需要考虑Nagios服务器的安全问题?因为如果Nagios受到攻击的话,黑客将获取大量信息。下文的示例都是在Ubuntu环境进行的,不过这些示例能够帮助任何环境下的用户提高Nagios服务器的安全性,因为基本概念是一致的。

Web界面

如果你按照互联网上提供的快速安装指南安装Nagios,很可能只是安装了web界面,因为Nagios使用Apache显示出很多其他安全选项。

下面是Nagios web界面的apache配置的例子:

Options:ExecCGI
AllowOverride:None
Order allow:deny
Allow from:all
AuthName:"Nagios Access"
AuthType:Basic
AuthUserFile:/usr/local/nagios/etc/htpasswd.users
Require:valid-user

“Allow from”选项是用来明确只能向某些IP地址和/或网络提供访问权限的,上面例子中允许所有IP地址访问该web界面。其他安全选项是用于身份验证的,“AuthType”定义了使用哪种身份验证类型,只有两种类型可供选择Basic或者Digest,基本验证(Basic)会将用户密码和用户名作为纯文本提交,而Digest验证的密码则会作为MD5 digest提交,很明显后者更加安全。

为了提高安全性我们需要进行如下修改:

Options:ExecCGI
AllowOverride:None
Order allow:deny
Allow from:192.168.4.
AuthName:"Nagios Access"
AuthType:Digest
AuthDigestFile:/usr/local/nagios/etc/htpasswd.users
Require:valid-user

这个配置中,只有192.168.4.0网络的电脑可以访问该web界面,并且我们现在使用Digest验证取代了不安全的基本验证方法。

现在我们需要添加允许访问web网络的用户以及密码,使用下列命令来为digest验证添加新用户: 

# htdigest -c /usr/local/nagios/etc/htpasswd.users realm username

Digest验证确实比Basic验证更加安全,不过保护用户名和密码安全最好的方法还是使用SSL。

进行任何配置更改后都必须重新启动apache,命令如下:. 

# /etc/init.d/apache2 restart

最佳做法

本节将列举出一些安装Nagios服务器的最佳安全做法,具体如下:

· 不要以root身份运行Nagios。需要有一个名为nagios的普通用户,如果Nagios作为root运行,那么当Nagios受到攻击时,攻击者就能够对用户系统为所欲为了。.

· 锁定Check Result Directory。 确保只有nagios用户拥有对check result directory的读取/写入权限,否则攻击者将可能发送伪造的主机和服务检查结果,该目录通常位于这个位置:/usr/local/nagios /var/spool/checkresults。

· 在Command Definitions中使用完整路径。当定义命令时,请明确完整的路径,而不是与正在执行的任何脚本或者二进制相关的路径。

· 保护远程代理安全。远程代理包括NRPE,、NSClient以及SNMP等,下文中我们将介绍保护NRPE远程代理的步骤。

保护远程代理(remote agent)

本节我们将研究如何保障NRPE安全的问题。该远程代理用于在远程主机上执行检查程序(检查负载或者磁盘使用等),我们不会希望任何程序或者用户能够在远程机器上执行命令,因此保障NRPE的安全性是非常重要的。

由于NRPE附带有对TCP wrappers的支持,我们可以定义哪些主机允许访问NRPE:

/etc/hosts.allow
nrpe:192.168.1.91
以上示例中,只有192.168.1.91可以在该主机上使用这个远程代理,你可以将你的Nagios客户端IP地址取代192.168.1.91,请注意应该同时用于你的Nagios服务器和客户端。

NRPE绝不能作为root或者任何其他superuser来运行,它只能作为nagios用户组中的nagios用户来运行,可以在/etc/nagios/nrpe.cfg位置查看NRPE是否作为nagios运行:

part of /etc/nagios/nrpe.cfg
nrpe_user=nagios
nrpe_group=nagios

NRPE的另一部分也可能成为安全漏洞,即允许command arguments。我们当然不希望看到攻击者通过发送恶意arguments攻击我们的系统,确实有时候需要允许Nagios发送command arguments,但如果大部分时候不需要启用此功能,那么一定要禁用。

禁用此功能需要编辑/etc/nagios/nrpe.cfg 并确保你执行下列命令:

dont_blame_nrpe=0

用户进行任何配置更改后都必须重新启动nrpe.cfg,想要了解更多关于NRPE安全的信息请阅读数据包源文件中的SECURITY文件。

保护通信渠道安全

在网络进行通信时,必然要涉及到通信安全问题,这也正是SSL的用武之地。

NRPE可以允许你启用SSL功能,但是数据包必须已经配置为–enable-ssl option(启用SSL选项),如果NRPE配置为使用SSL功能,请注意客户端和服务器都必须同时启用。

下一步我们还需要配置SSL以提高其安全性,这样才不至于发送简单的纯文本web界面密码:

# openssl genrsa -des3 -out server.3des-key 1024
# openssl rsa -in server.3des-key -out server.key
# openssl req -new -key server.key -x509 -out server.crt -days 365
# chmod 600 server.key
# rm server.3des-key
# mv server.crt /etc/ssl/
# mv server.key /etc/ssl/private/

现在我们已经生成了证书,需要告诉Apache来使用这些证书。

在Apache配置中,需要添加SSLRequireSSL选项,例如:

SSLRequireSSL
Options:ExecCGI
AllowOverride:None
Order allow:deny
Allow from:192.168.4.
AuthName:"Nagios Access"
AuthType:Digest
AuthDigestFile:/usr/local/nagios/etc/htpasswd.users
Require:valid-user

请记住重新启动Apache:

# /etc/init.d/apache2 restart

现在Nagios服务器已经很安全了,下一步就是即使进行安全更新。

与了解更多Nagios相关资料,可以访问Nagios Documentation

2009年1月21日星期三

Linux下使用SSH、Crontab、Rsync三工具实现数据自动备份

作为网管人员大概都无一例外的经历过系统备份,尤其是重要系统的备份、重要数据库系统的备份工作。由于备份是个频繁而琐碎的工作,如何能把这个工作做得即简单又灵活呢?下面就来介绍在Linux下如何使用SSH和Crontab以及Rsync工具来进行数据的自动备份与同步。

一、SSH无密码安全登录

为什么要选择SSH 呢?SSH又是什么呢?可以说它是替代以前Telnet的远程登录工具,SSH的英文全称是Secure Shell。用户可以把所有传输的数据进行加密,这样即使网络中的黑客能够劫持用户所传输的数据,如果不能解密的话,也不能对数据传输构成真正的威胁。而且SSH的数据传输是经过压缩的,可以加快传输的速度,这就是SSH 目前能替代Telnet远程登录工具的原因。

说到安全,SSH提供两种级别的安全验证,一种是基于口令的安全验证。只要用户知道自己账号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证用户正在连接的服务器就是用户想连接的服务器,可能会有别的服务器在冒充真正的服务器,这存在着潜在的威胁。一种是基于密匙的安全验证。需要依靠密匙,也就是用户必须为自己创建一对公匙,密钥,并把公用密匙放在需要访问的服务器上。如果需要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求使用用户的密匙进行安全验证。服务器收到请求之后,先在服务器上用户的主目录下找到该用户的公用密匙,然后把它和用户发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”并把它发送给客户端软件。客户端软件收到“质询” 之后就可以
用用户的私人密匙解密再把它发送给服务器。

下面做的就是利用第二种基于密匙的安全验证的登录,具体方法如下:
使用如下命令在需要备份的机器上创建一对公钥/密钥:
#ssh-keygen -t rsa
Generation public/private rsa key pair.
Enter file in which to save the key(/root/.ssh/id_rsa):
Enter passphrase(empty for no passphrase):
Enter same passphrase again:
Your identiflcation has been save in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_ras.pub.
The key fingerprint is:
c3:a0:de:f8:24:8e:f6:0d:ed:0a:b0:a2:2d:aa:d3:8b root@localhost.localdomain
这期间一直按回车即可,这样公匙/密钥就创建完毕。
使用如下命令把公匙传到需要备份的服务器上:
#ssh 192.168.1.2
#mkdir .ssh;chmod 0700 .ssh
远程登录到需要备份的服务器上并且创建.ssh目录。
#scp .ssh/id-rsa.pub 192.168.1.2 : .ssh/authorized_keys2
上述命令可以把公钥远程传过去。

这样一个SSH基于密匙的安全验证登录就简单的做完了,现在就可以从192.168.1.1直接用“ssh 192.168.1.2”无密码自动登录过去了,这样就简单而又安全的实现了自动登录目的, 可以为下面定时做备份打下前题。

二、定时数据同步

这里把定时触发和同步一起来简单介绍一下,Crontab是个能定时执行命令的一个工具, 它是用来让使用者在固定时间或固定间隔执行程式之用,下面就介绍一下这个命令的常用参数。

Crontab命令参数:
-e执行文字编辑器来设定时程表,内定的文字编辑器是VI,如果你想用别的文字编辑器,则请先设定VISUAL环境变数来指定使用那个文字编辑器(比如说setenvVISUALjce)。
-r删除目前的时程表。
-I列出目前的时程表。

Crontab时程表示格式如下:f1 f2 f3 f4 f5 command
其中,f1是表示分钟,f2表示小时,f3表示一个月份中的第几日,f4表示月份,f5表示一个星期中的第几天。Command表示要执行的命令。当f1为 时表示每分钟都要执行command,f2为*时表示每小时都要执行程式,其余类推。当f1为a-b时表示从第a分钟到第b分钟这段时间内要执行,f2为a-b时表示从第a到第b小时都要执行。当f1为*/n时表示每n分钟个时间间隔执行一次,f2为*/n表示每n小时个时间间隔执行一次,其余类推。当f1为a,b,C,......时表示第a,b,C,......分钟要执行,f2为a,b,C,...... 时表示第a,b,C,......个小时要执行,其余类推。当然也可以将要定时执行的命令存放在预备文档里,这里就得用crontab file的方式来设定时程表。

三、数据同步
现在来介绍一下如何让数据同步的一个工具,Rsync可以让数据同步,下面看一下一些Rsync的主要参数:
-V,--verbose 输出的信息;
-q,--quiet 安静模式,几乎没有信息产生.常用在以cron执行rsync;
-a,--archive archive mode权限保存模式,相当于-rlptgoD 参数;
-p,--perms 保留档案权限;
-O,--owner保留档案所有者(root only);
-g,--g rouP 保留档;案群;
-D,--devices 保留device 信息(root only);
-e,--h=COMMAND定义所使用的remote shell;
-4, --ipv4 使用IPv4协议;
-6, --ipv6 使用IPv6协议;
下面看一下如何通过SSH和Rsync工具组合使用方法:
#rsync -ave ssh 192.168.1.2:/home/ftp/pub/ /home/ftp/pub/
需要注意的是,源端目录名称末尾的/。在源说明中后缀/通知rsync复制该目录的内容,但不复制目录文件自身。要想把目录包含在要复制内容的最顶层就要去掉/;

使用SSH传输rsync流量具有下述优点, 可通过网络加密数据,而且速度非常快,使用SSH客户端密钥建立的任何信任关系。如果要在两台计算机之间保持大型、复杂目录结构的同步性(尤其是两者间的差异很小时), 那么rsync就是一种使用起来极为方便(并且执行速度很快)、随心所欲的工具。
#crontab -e
0 17 * * 1-5 rsync -ave ssh 192.168.1.2:/my /my
上面的操作"crontab-e"命令是编辑定时启动脚本,然后在周一到周五的每天下午5点执行SSH远程自动登录然后把192.168.1.2的/my目录下的所有东西同步到本地的/my目录下,这样就达到了自动数据同步备份的目的了。

本文出自 “李晨光” 博客

2009年1月20日星期二

让RHEL5也能YUM Centos5.1

1.卸载rhel的yum相关的包

[root@virhost ~]# rpm -qa|grep yum
yum-updatesd-3.0.1-5.el5
yum-3.0.1-5.el5
yum-rhn-plugin-0.5.2-3.el5
yum-metadata-parser-1.0-8.fc6
yum-security-1.0.4-3.el5
[root@virhost ~]# yum update
Loading "rhnplugin" plugin
Loading "installonlyn" plugin
Loading "security" plugin
This system is not registered with RHN.
RHN support will be disabled.
Setting up Update Process
Setting up repositories
No Repositories Available to Set Up
Reading repository metadata in from local files
Skipping security plugin, no data
No Packages marked for Update/Obsoletion
[root@virhost ~]# rpm -e yum-3.0.1-5.el5 --nodeps
[root@virhost ~]# rpm -qa|grep yum
yum-metadata-parser-1.0-8.fc6
yum-updatesd-3.0.1-5.el5
yum-rhn-plugin-0.5.2-3.el5
yum-security-1.0.4-3.el5
[root@virhost ~]# rpm -e yum-updatesd-3.0.1-5.el5
[root@virhost ~]# rpm -e yum-rhn-plugin-0.5.2-3.el5
[root@virhost ~]# rpm -e yum-metadata-parser-1.0-8.fc6(后来测试这个不应该卸载)
[root@virhost ~]# rpm -e yum-security-1.0.4-3.el5


2.安装centos的源

http://centos.ustc.edu.cn/centos/5/os/i386/CentOS/yum-3.0.5-1.el5.centos.5.noarch.rpm
rpm -ivh yum-3.0.5-1.el5.centos.5.noarch.rpm

[root@virhost ~]# wget http://centos.ustc.edu.cn/centos/5/os/i386/CentOS/yum-3.0.5-

1.el5.centos.5.noarch.rpm
[root@virhost ~]# rpm -ivh yum-3.0.5-1.el5.centos.5.noarch.rpm
warning: yum-3.0.5-1.el5.centos.5.noarch.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
error: Failed dependencies:
yum-metadata-parser is needed by yum-3.0.5-1.el5.centos.5.noarch
[root@virhost ~]# wget http://192.168.1.250/yum-metadata-parser-1.0-8.fc6.i386.rpm
--07:48:55-- http://192.168.1.250/yum-metadata-parser-1.0-8.fc6.i386.rpm
Connecting to 192.168.1.250:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:22950 (22K) [text/plain]
Saving to: `yum-metadata-parser-1.0-8.fc6.i386.rpm'

100%[==================================================================>] 22,950 --.-K/s in

0.003s

07:48:55 (8.57 MB/s) - `yum-metadata-parser-1.0-8.fc6.i386.rpm' saved [22950/22950]

[root@virhost ~]# rpm -ivh yum-metadata-parser-1.0-8.fc6.i386.rpm
warning: yum-metadata-parser-1.0-8.fc6.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
1:yum-metadata-parser ########################################### [100%]
[root@virhost ~]# rpm -ivh yum-3.0.5-1.el5.centos.5.noarch.rpm
warning: yum-3.0.5-1.el5.centos.5.noarch.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
Preparing... ########################################### [100%]
1:yum ########################################### [100%]
由此看来yum-metadata-parser-1.0-8.fc6.i386.rpm这个包不应该删除那


[root@virhost ~]# cd /etc/yum.repos.d/
[root@virhost yum.repos.d]# ls
rhel-debuginfo.repo
[root@virhost yum.repos.d]# vi CentOS-Base.repo这个文件内如是下面的

[base]
name=CentOS-5.1 - Base
baseurl=http://mirror.tini4u.net/centos/5.1/os/$basearch/
http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
gpgcheck=0
gpgkey=http://centos.ustc.edu.cn/centos/5.1/os/i386/RPM-GPG-KEY-CentOS-5

#released updates
[updates]
name=CentOS-5.1 - Updates
baseurl=http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
gpgcheck=0
gpgkey=http://centos.ustc.edu.cn/centos/5.1/os/i386/RPM-GPG-KEY-CentOS-5


#packages used/produced in the build but not released
[addons]
name=CentOS-5.1 - Addons
baseurl=http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
gpgcheck=0
gpgkey=http://centos.ustc.edu.cn/centos/5.1/os/i386/RPM-GPG-KEY-CentOS-5


#additional packages that may be useful
[extras]
name=CentOS-5.1 - Extras
baseurl=http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
gpgcheck=0
gpgkey=http://centos.ustc.edu.cn/centos/5.1/os/i386/RPM-GPG-KEY-CentOS-5

#additional packages that extend functionality of existing packages

[centosplus]
name=CentOS-5.1 ¨C Plus
baseurl=http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
gpgcheck=0
gpgkey=http://centos.ustc.edu.cn/centos/5.1/os/i386/RPM-GPG-KEY-CentOS-5

#contrib - packages by Centos Users
[contrib]
name=CentOS-5.1 - Contrib
baseurl=http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
http://centos.ustc.edu.cn/centos/5.1/os/$basearch/
gpgcheck=0
gpgkey=http://centos.ustc.edu.cn/centos/5.1/os/i386/RPM-GPG-KEY-CentOS-5
然后随便测试了一个命令
[root@virhost yum.repos.d]# rpm -qa|grep postfix
刚好系统没有装这个包
[root@virhost yum.repos.d]# yum install postfix
Loading "installonlyn" plugin
Setting up Install Process
Setting up repositories
updates 100% |=========================| 1.1 kB 00:00
contrib 100% |=========================| 1.1 kB 00:00
centosplus 100% |=========================| 1.1 kB 00:01
addons 100% |=========================| 1.1 kB 00:00
extras 100% |=========================| 1.1 kB 00:00
Reading repository metadata in from local files
primary.xml.gz 100% |=========================| 834 kB 00:03
################################################## 2400/2400
primary.xml.gz 100% |=========================| 834 kB 00:08
################################################## 2400/2400
primary.xml.gz 100% |=========================| 834 kB 00:08
################################################## 2400/2400
primary.xml.gz 100% |=========================| 834 kB 00:04
################################################## 2400/2400
primary.xml.gz 100% |=========================| 834 kB 00:08
################################################## 2400/2400
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for postfix to pack into transaction set.
postfix-2.3.3-2.i386.rpm 100% |=========================| 41 kB 00:00
---> Package postfix.i386 2:2.3.3-2 set to be updated
--> Running transaction check

Dependencies Resolved

=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
postfix i386 2:2.3.3-2 extras 3.6 M

Transaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)

Total download size: 3.6 M
Downloading Packages:
(1/1): postfix-2.3.3-2.i3 100% |=========================| 3.6 MB 00:43
Running Transaction Test
warning: postfix-2.3.3-2: Header V3 DSA signature: NOKEY, key ID e8562897
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: postfix ######################### [1/1]

Installed: postfix.i386 2:2.3.3-2
Complete!

Linux操作系统安装.src.rpm软件包的方法

有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法

方法一:

1.执行rpm -i your-package.src.rpm

2. cd /usr/src/redhat/SPECS

3. rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件

4. cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录

5. ./configure 这一步和编译普通的源码软件一样,可以加上参数

6. make

7. make install

方法二:

1.执行rpm -i you-package.src.rpm

2. cd /usr/src/redhat/SPECS

前两步和方法一相同

3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件

这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等)

在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。

执行rpm -i new-package.rpm即可安装完成。

2009年1月17日星期六

用MySQL-zrm来备份(支持增量)和恢复MySQL数据库

用MySQL-zrm来备份(支持增量)和恢复MySQL数据库

MySQL-zrm是用perl脚本写的mysql备份还原工具,功能十分强大,少废话,直奔主题!

官方主页:http://mysqlbackup.zmanda.com/index.php/Main_Page
帮助文档:http://mysqlbackup.zmanda.com/index.php/Zmanda_Recovery_Manager_for_MySQL_Users_Manual


1,安装perl所需要的模块
前提是你必须能连上互联网
# perl -MCPAN -e 'install DBI'
# perl -MCPAN -e 'install XML::Parser'

2,建立备份用户
mysql> grant lock tables, select, file, reload, super, show view on *.* to backup_user@'localhost' identified by 'backup_user';
mysql> flush privileges;

3,安装MySQL-zrm
# rpm -ivh MySQL-zrm-2.1-1.noarch.rpm
# rpm -ivh MySQL-zrm-client-2.1-1.noarch.rpm

4,修改/etc/mysql-zrm/mysql-zrm.confm配置文件,如下:
backup-mode=logical
destination=/root/test
replication=1
databases=test
user="root"
password="foxshare"
socket=/tmp/mysql.sock
mysql-binpath="/usr/local/mysql/bin"
mysql-binlog-path="/var/lib/mysql"
mailto="root@localhost"

根据你自己的实际环境进行修改,我用的myisam引擎,用mysqldump进行的备份。


5,开始全部备份
# mysql-zrm-scheduler --now --backup-set test --backup-level 0

6,开始全部恢复
先将你原来的那个test数据库删除。
# mysql-zrm --action restore --backup-set test --source-directory /root/test/test/20090116155515/

OK,看看你的数据是不是恢复了!!


7,我们来看看增量备份
这个要啰嗦下,如果我们数据量小,负载小,就一台mysql服务器,那么我们的全部备份和增量备份都可以在这台机器进行,如果采用的是主从结构,增量备份还在主服务器上的话,那么就会影响主数据库的正常运行,此时我们可以在从库上进行全部备份,在主服务器上备份binlog日志进行增量备份,这个时候,要告诉mysqlzrm采用从服务器的模式进行备份,就会把主服务器的偏移量进行记录,那么我们只要保留有主服务器的binlog日志,就可以根据这个偏移量进行数据同步了。

原来的test数据库已经全部备份了,那么我们就开始增量备份。

# mysql-zrm --action backup --backup-set test --backup-level 1

ok,这样就增量备份完毕了,不信,你可以恢复这个文件看看,恢复步骤如下:
先还原全备份,删除那个test数据库。
mysql-zrm --action restore --backup-set test --source-directory /root/test/test/20090116155515/
再还原增量备份
mysql-zrm --action restore --backup-set test --source-directory /root/test/test/20090116171100/


如果是主从架构的模式,让我们来看下全部备份了什么东西?
-rw-r--r-- 1 root root 53018 Jan 16 17:08 backup.sql
-rw-r--r-- 1 root root 502 Jan 16 17:08 index
-rw-rw---- 1 mysql mysql 76 Jan 16 17:08 master.info
-rw-rw---- 1 mysql mysql 59 Jan 16 17:08 relay-log.info
-rw-r--r-- 1 root root 278 Jan 16 17:08 zrm_checksum

看下那个master.info文件
15
mysql-bin.000001
292106
192.168.1.225
replication
slave
3306
60
0

这里要注意那个“292106”偏移量,这个就是我们全备份的时候,主服务器的最后更新数据的偏移量。等下我们会用到它,当你在从服务器上进行全备份恢复数据后,可以根据上面将的这个偏移量进行数据同步了,其实主从架构的增量备份就是备份主数据库的binlog日志,哈哈哈,是不是比较简单,祝你好运!!

用expect实现ssh自动登录对服务器进行批量管理

########### auto_login.sh #####################
1 #!/usr/local/bin/expect
2 set PASSWD [lindex $argv 1]
3 set IP [lindex $argv 0]
4 set CMD [lindex $argv 2]
5 spawn ssh $IP $CMD
6 expect "(yes/no)?" {
7 send "yes\r"
8 expect "password:"
9 send "$PASSWD\r"
10 } "password:" {send "$PASSWD\r"} "*host " {exit 1}
11 expect eof


第一行制定使用/usr/local/bin目录下的expect命令对后面的程序进行解释。
第二行,三行,四行,分别从命令行参数中获取要登录的主机IP地址,登陆密码,以及要执行的命令。
第五行,大概就是要触发这样一个事件,执行ssh $IP $CMD命令。
第6行道第11行就是expect的整个交互过程了。
如果读取到(yes/no)?提示符,就输入yes并回车,如果读取到password:提示输入密码的字符串,就输入用户登录密码(root用户)。
当然如果不是第一次登陆,以前已经登录过的话,当输入ssh $IP $CMD回车后,会直接提示输入密码也就是说会读到字符串”* password:”,这个时候会输入密码回车(send "$PASSWD\r").
另外,如果主机不可达的话,(yes/no)?和”password:”的可能都不会出现,系统会提示:
“No route to host”这个时候,我们退出程序。

2009年1月14日星期三

关于awk和sed在IBM的文章链接

awk:
http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-1/
http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-2/
http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-3/

sed:
http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-1/
http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-2/
http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-3/

然后
man awk
man sed