2008年04月08日
问题描述
Http 会话状态没有从 Primary 服务器复制到 Secondary 服务器。下面是一些故障症状:

  • 使用 http 会话的应用程序没有按设计运行,并且会话数据有所丢失
  • 即使在会话仍未超时的情况下,系统也可能提示您重新登录到应用程序中
  • 您在服务器的日志文件中看到与 Http 会话失败相关的错误和警告
  • 没有正确地将请求 Failover 到另一个服务器
故障排除
请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。

快速链接

为什么发生此问题?
会话复制失败通常是因为组播/网络问题引起的。有时候,配置问题也会导致失败(请查看“验证 Weblogic.xml 条目”一节)。此外,请确保输入到会话中的数据必须是可序列化的,否则复制可能会失败。使用下列检查清单检查配置或可能导致会话复制失败的其它潜在问题。

返回页首

Http 会话复制有什么类型?
有五种不同的会话持久性实现方式:

  1. 内存(单个服务器,不复制)

当您使用基于内存的存储方式时,所有会话信息都存储在内存中,并且当您停止和重新启动 WebLogic Server 时,这些信息将会丢失。

  1. 文件系统持久性

会话信息存储在指定的 PersistentStoreDir 中的一个文件中。

  1. JDBC 持久性

会话信息存储在数据库表中。

  1. 基于 cookie 的会话持久性

会话信息存储在 cookie 中。

  1. 内存中复制(在群集内)

会话数据从一个服务器实例复制到内存中的另一个实例。

返回页首

当会话复制失败时如何诊断此问题?
考虑一个群集中有两个服务器(MyServer-1,MyServer-2)的情况。当您启用调试标志后,如果从某个客户端发送了一个请求,您将会立即看到下面的消息(请参阅启用调试标志跟踪会话复制失败

在 MyServer-1 上:

<Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <000000> <Creating primary 5165892837402719733>

<Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <000000> <Created secondary for 5165892837402719733 on -7957889153726652135S: 210.23.23.1: [9001,9001, -1, -1,9001, -1, -1]: mydomain: MyServer-2>

上面的记录消息意味着 Primary 服务器是 MyServer-1,并且在 Myserver-2 上创建了一个 Secondary 服务器,而且您将看到在 MyServer-2 中记录了类似下面的确认消息。

在 MyServer-2 上:

ExecuteThread: ‘1′ for queue: ‘Replication’> <kernel identity> <> <000000> <Creating secondary 5165892837402719733> 

####<Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <machine1-c840> <MyServer-2> <ExecuteThread: ‘1′ for queue: ‘Replication’> <kernel identity> <> <000000> <Updated local secondary of 5165892837402719733>

如果您检查 JsessionId,其形式如下:

  JSESSIONID=1E9Xwn7nLYfOsc1obgRZIwW5s72an7HPPvSD7iaWHMXzpHga5cQj!-1587343083!-1587348922

JSESSIONID 是缺省的 cookie 名称,可以在 weblogic.xml 中将其更改为任何内容。

JSESSIONID 的格式为:

  SessionId!PrimaryServer JVM Hash!SecondaryServer JVMHash

Every time data is changed (either set/get or removed) in the session you’ll see the logging message.

在 MyServer-1 上:

<Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <000000> <Updated remote secondary for 5165892837402719733>

在 MyServer-2 上:

####<Oct 9, 2003 12:38:21 PM PDT> <Debug> <Cluster> <machine1-c840> <MyServer-2> <ExecuteThread: ‘1′ for queue: ‘Replication’> <kernel identity> <> <000000> <Updated local secondary of 5165892837402719733>

如果因为任何原因而导致会话复制失败,您将在 MyServer-1 日志中看到下面的消息。

<Nov 6, 2003 12:59:12 PM EST> <Debug> <Cluster> <000000> <Unable to create secondary for -5165892837402719733> 

<Nov 6, 2003 12:59:12 PM EST> <Debug> <Cluster> <000000> <Error creating secondary 5165892837402719733 on -7957889153726652135S: 210.23.23.1:[9001,9001,-1,-1,9001,-1,-1]:mydomain:MyServer-2>

上面的消息意味着会话复制已失败。

JSESSIONID 也会显示为如下形式:

  JSESSIONID=1E9Xwn7nLYfOsc1obgRZIwW5s72an7HPPvSD7iaWHMXzpHga5cQj!-1587343083!NONE

Secondary 服务器散列信息将变为 NONE。

返回页首

启用调试标志跟踪会话复制失败:
您可以启用 DebugCluster、DebugClusterAnnouncements、DebugFailOver、DebugReplication、DebugReplicationDetails 标志。  

若要启用:

  1. 可以使用 weblogic.Admin 命令行实用程序来动态地启用或关闭调试选项。
    例如,若要在 ServerDebug Mbean 的所有管理实例(即管理服务器或托管服务器)上启用 DebugCluster

    java weblogic.Admin -url t3://localhost:6151 -username system -password weblogic SET -type ServerDebug -property DebugCluster true

  1. 另外,对于要调试的每个服务器,可以编辑 <ServerDebug/> 节中的 config.xmlMbean 要素,将值设置为“true”表示启用,或设置为“false”表示禁用。然后必须重新启动管理服务器。托管服务器将重新连接到管理服务器,然后调试标志将动态生效。示例:

    <ServerDebug DebugCluster="true" Name="myserver"/>

  1. 在设置了所有标志后,在 config.xml 的末尾处,ServerDebug 标记将类似于如下形式:

    <ServerDebug ClassFinder="true" DebugCluster="true" DebugClusterAnnouncements="true" DebugFailOver="true" DebugReplication="true" DebugReplicationDetails="true" Name="MyServer1"/>

    确保服务器的 stdOutSeverity 级别为 INFO,且 StdoutDebugEnabled 被设置为“true”。调试信息将被记录到服务器日志以及标准输出中。

返回页首

所使用的每个会话持久性类型的检查清单:

内存(单个服务器,不复制)  

  1. 当您使用基于内存的存储方式时,所有会话信息都存储在内存中,并且当您停止和重新启动 WebLogic Server 时,这些信息将会丢失。
  2. 确保您在运行 WebLogic Server 时已分配足够的堆大小;否则,您的服务器可能在大量负载情况下用尽内存。
  3. 不是群集配置的推荐类型(因为数据保存在堆中,且不可用于任何其它服务器)。

文件系统持久性

  1. 确认已在 weblogic.xml 中正确指定了 WebLogic Server 存储会话的目录。您还必须自行创建此目录,并确保已分配访问此目录的适当权限。
  2. 确保拥有足够的磁盘空间。

JDBC 持久性

  1. 确保连接到数据库的连接池拥有对所用数据库表的读/写权限。

基于 Cookie 的持久性

  1. 确保在 http 会话中没有存储 java.lang.String 以外的任何内容。
  2. 不要刷新您的应用程序代码中的 Http 响应对象。
  3. 确保响应的信息长度超过所设置的缓冲区大小(缺省值为 8192 字节)。
  4. 确保在浏览器中启用了 cookie。
  5. 确保在使用基于 cookie 的会话持久性时,没有在字符串中使用逗号 (,)。

内存中复制

  1. 确保仅通过代理服务器或硬件负载平衡器来访问 Weblogic Server。
  2. 硬件负载平衡器应支持兼容的被动或主动 cookie 持久性机制以及 SSL 持久性。
  3. 群集中的推荐类型。

返回页首

验证 Weblogic.xml 条目:
确保 weblogic.xml 含有需要为每个“会话复制”类型设置的所有参数。 例如,当使用内存中复制时,样本 weblogic.xml 将类似于如下形式:

        <session-descriptor>
          <session-param>
             <param-name>
                   PersistentStoreType
             </param-name>
             <param-value>
                   replicated
             </param-value>
          </session-param>
        </session-descriptor>

返回页首

会话数据必须可序列化
为了支持 HTTP 会话状态的内存中复制,所有 servlet 和 JSP 会话数据都必须是可序列化的,否则会话复制将会失败。当启用了调试标志时,Weblogic Server 将在下面输出警告消息,指示会话仍未被复制。您必须使该对象变为可序列化的对象,这样才能复制它。其它对象的会话复制将会正常进行。

调试消息:

 <Oct 8, 2003 2:10:45 PM PDT> <Error> <Cluster> <000126> <All session objects should be serializable to replicate. Please check the objects in your session. Failed to replicate non-serializable object>

解决办法:找到从中抛出错误的页面,并确保输入会话中的所有数据是可序列化的。

返回页首

检查网络/组播问题:
确保网络是完好的,且没有组播问题。您可以执行组播测试来确保组播 IP 工作正常。

  1. 运行 utils.MulticastTest 实用程序
    语法形式类似于:

    java utils.MulticastTest -n name -a address [-p portnumber] [-t timeout] [-s send]

  1. 您也可以参阅 http://e-docs.bea.com/wls/docs81/admin_ref/utils.html#1199798

返回页首

验证群集配置:
从群集列表中选择 Primary 服务器和 Secondary 服务器。在一个由两个服务器组成的群集中,如果该群集没有包含所有服务器,则不能选择 Secondary 服务器,从而导致会话数据不能被复制。

若要验证,可执行下列命令:

  1. 确保 weblogic.jar 在类路径中。
  1. 若要获得群集中的所有服务器:

    java weblogic.Admin -username weblogic -password weblogic -url http://oneofthemanagedserverurlinthecluster:6151/ GET -type ClusterRuntime .pretty

这样将列出群集中的所有服务器。可以将 URL 改变为群集中的每个服务器,以确保他们拥有相同的条目。

返回页首

应用程序代码诊断:
确保仅在应用程序代码中使用 HttpSession 中的 setAttribute/removeAttribute 方法来更新 Http 会话。如果您使用其它设置方法来更改会话内的对象,WebLogic Server 将不复制这些更改。

请不要使用 http 会话的 putValueremoveValue 方法,因为它们不受支持,并且当您在应用程序中使用这些方法时,可能会出现会话数据复制问题。相反,请仅使用 HttpSession 的setAttribute/removeAttribute 方法。

返回页首

Cookie 与 URL Rewriting :
在某些情况下,浏览器或无线设备可能不接受 cookie,这样会使利用 cookie 的会话跟踪不能进行。当 WebLogic Server 检测到浏览器不接受 cookie 时,URL Rewriting 是对这种情况的一个可自动替换的解决方法。

通过设置 WebLogic-specific 部署描述符 weblogic.xml 中、<session-param> 元素下的 URLRewritingEnabled 属性,在 WebLogic Server 中启用 URL Rewriting。此属性的缺省值为 true。

返回页首

性能问题:

考虑序列化系统开销
序列化会话数据会给复制会话状态带来一些系统开销。系统开销随序列化对象大小的增大而增加。如果您想在会话中创建很大的对象,请测试您的 servlet 的性能,以确保性能是可接受的。

控制对会话数据的帧访问
如果您正在设计使用多帧的 Web 应用程序,请记住给定帧集中的帧无法执行任何请求同步。

例如,尽管在逻辑上客户端应当仅创建单个会话,但帧集中的多个帧可以代表客户端应用程序创建多个会话。

为了避免意外的应用程序行为,您应认真规划如何利用帧访问会话数据。可以应用下列其中一个一般规则来避免常见问题:

  • 在一个给定帧集中,确保只有一个帧创建和修改会话数据。
  • 始终在应用程序使用的第一个帧集内的某个帧中创建会话(例如,在所访问的第一个 HTML 页面中创建会话)。
  • 在创建会话后,仅在除第一个帧集外的其它帧集中访问会话数据。

在会话中存储更大量的数据
JDBC 持久性和文件持久性的速度将不会更快,因为会话数据必须存储在外部资源中并从中检索,并且也会因为 JDBC 访问每个会话的更新信息而存在性能开销。如果您想在会话中存储大型对象,则应考虑 JDBC 或文件持久性。

在会话中存储小量的数据
当您不需要在会话中存储大量数据时,基于 cookie 的会话持久性是最有用的。基于 cookie 的会话持久性可以使 WebLogic Server 安装的管理更加容易,因为不需要群集 Failover 逻辑。

2008年03月06日

http://hkmsn.kblcw.com/bbs/link/48726.html

2007年12月01日

元旦(1月1日)   New Year’s Day

春节(农历一月一日) The Spring Festival

元宵节(农历一月十五日) The Lantern Festival

国际劳动妇女节(3月8日) International  Working Women’s Day

植树节(3月12日) Arbor Day

清明节(4月5日) ChingMing Festival 或 Tomb-sweeping Festival

国际劳动节(5月1日) International Labour Day

中国青年节(5月4日) Chinese Youth Day

护士节(5月12日) Nurses’ Day

端午节(农历五月初五) The Dragon Boat Festival

国际儿童节(6月1日) International Chindren’s Day

中国共产党成立纪念日(7月1日) The Party’s Birthday

建军节(8月1日) The Army’s Day

中秋节(农历八月十五) Mid-autumn(Moon) Festival

教师节(9月10日) Teachers’ Day

重阳节(农历九月九日) Double-Ninth Day

国庆节(10月1日) National Day

除夕(农历十二月三十日) New Year’s Eve

2007年09月15日

名称 : crontab
使用权限 : 所有使用者
使用方式 :
crontab [ -u user ] file
crontab [ -u user ] { -l | -r | -e }
说明 :
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

参数 :
crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
crontab -r : 删除目前的时程表
crontab -l : 列出目前的时程表
crontab file [-u user]-用指定的文件替代目前的crontab。
时程表的格式如下 :
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,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…个小时要执行,其馀类推
使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

例子 :
#每天早上7点执行一次 /bin/ls :
0 7 * * * /bin/ls
在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup
周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分….执行 echo "haha"
20 0-23/2 * * * echo "haha"
注意 :
当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可

例子2 :
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date
范例
$crontab -l 列出用户目前的crontab.

 crontab命令的功能是在一定的时间间隔调度一些命令的执行。在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。

crontab命令有三种形式的命令行结构:

crontab [-u user] [file]

crontab [-u user] [-e|-l|-r]

crontab -l -u [-e|-l|-r] 第一个命令行中,file是命令文件的名字。如果在命令行中指定了这个文件,那么执行crontab命令,则将这个文件拷贝到crontabs目录下;如果在命令行中没有制定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将他们也存放在crontab目录下。

命令行中-r选项的作用是从/usr/spool/cron/crontabs目录下删除用户定义的文件crontab;

命令行中-l选项的作用是显示用户crontab文件的内容。

使用命令crontab -u user -e命令编辑用户user的cron(c)作业。用户通过编辑文件来增加或修改任何作业请求。

执行命令crontab -u user -r即可删除当前用户的所有的cron作业。

作业与它们预定的时间储存在文件/usr/spool/cron/crontabs/username里。username使用户名,在相应的文件中存放着该用户所要运行的命令。命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。文件里的每一个请求必须包含以spaces和tabs分割的六个域。前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,称为命令字段,其中包括了crontab调度执行的命令。

第一道第五个字段的整数取值范围及意义是:

0~59 表示分

1~23 表示小时

1~31 表示日

1~12 表示月份

0~6 表示星期(其中0表示星期日)

/usr/lib/cron/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在,而有另外一个文件/usr/lib/cron/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时cron.allow优先,如果都不存在,只有超级用户可以安排作业。

如果你是新手,请先看我写的《用iptables设置静太防火墙》 ,本文在此基础上写的,很多细节上的问题用它作参考。

########################

版权所有,转载请注明来自www.linuxsir.org 并写明作者

########################

在这里我必须要解释一下防火墙的状态(state)

比如,你用ssh远程访问,你的主机和远程主机会进行通信。
静态的防火墙会这样处理:
检查时入机器的数据包,发现数据是来源是22端口,当允许时入,连接之后相互通信的数据也一样,检查每个数据,发现数据来源于22端口,允许通过!

如果用有状态的防火墙如何处理呢?
当你连接远程主机成功之后,你的主机会把这个连接记录下来,当有数据从远程ssh服务器再进入你的机器时
检查自己连接状态表,发现这个数据来源于一个已经建立的连接,允许这个数据包进入。

以上两种处理,我们明显的发现static firewall比较生硬,而有状态的防火墙则显得要智能一些!

现在我们来解释一下状态
NEW:如果你的主机向远程机器发时一个连接请求,这个数据包状态是NEW.
ESTABLISHED:当联接建立之后,远程主机和你主机通信数据状态为ESTABLISHED
RELATED: 像ftp这样的服务,用21端口传送命令,而用20端口(port模式)或其他端口(PASV模式)传送数据。在已有21端口上建立好连接后发送命令,用20传送的数据,状态是RELATED

有了以上知识后,接下来时行我们的step by step 吧
首先,我们还是来设置默认规则
iptables -P INPUT DROP
这样你的机器将对所有进入你主机的数据都丢弃

如果你有一台主机只是用于个人桌面应用,那么你的主机不提供任何服务,那么,我们就禁止其他的机器向你的机器发送任何连接请求
iptables -A INPUT -m state –state NEW -j DROP

这个规则将所有发送到你的机器数据包,状态是NEW的包丢弃。这样,也就是不允许其他的机器主动发起对你机器的连接,但是你却可以主动的连接其他的机器,不过仅仅只是连接而已,连接之后的数据就是ESTABLISHED状态的了,我们再加上一条。

iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
所有已经建立联接,或者与之相关的数据允许通过

好了,们们来总结一下三条语句,因为它是一个很好的个人桌面主机的防火墙。
iptables -P INPUT DROP
#iptables -A INPUT -m state –state NEW -j DROP
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
我们看到,第二条被注释掉了,因为那一规则完全可以省去,让默认规则处理就行了。
是不是显得很简单呢,对于个人桌面应用来说,只用刚才那两条语句,就能让你接入internet网的主机足够安全。而且你随意访问internet,但是外部却不能主动发起对你机器的连接,真是爽啊!
当然,如是你的IE有漏洞的话,iptables还是无济于事的,这也不是iptables的工作范围。
我们可看到有状态的防火墙比静态防火墙要"智能"一些,当然规则容易设置一些。

如果你的主机是服务器,接下来的问题就简单了。这里假如我们开了www 和ftp服务。注意ftp的pasv模式,会使用动态的端口来传送数据,而并非20端口。这些对有状态的防火墙来说,轻易做到,甚至不用知道pasv模式的ftp用哪些端口,因为你的主机会认识到ftp给别人主机传送文件时,认识到这些数据是RELATED

在后面加下
iptables -A INPUT -i ppp0 -p tcp -dport 21 -j ACCEPT
iptables -A INPUT -i ppp0 -p udp -dport 21 -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp -dport 80 -j ACCEPT
iptables -A INPUT -i ppp0 -p udp -dport 80 -j ACCEPT
好了,至此我们的工作就全部完成了,仿照我上一文的方法,最后给出一个脚本,有详细的注释

 
!/bin/bash
#define const here
Accept_Ports="80 20 21" #允许internet访问的自己服务端口

# init
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# set default ruler here
iptables -P INPUT DROP

# Allow inner Network access
iptables -A INPUT -i !ppp0 -j ACCEPT

# set stated ruler here,this is the most important ruler
iptables -A INPUT -i ppp0 -m state –state ESTABLISHED,RELATED -j ACCEPT

# set ruler so that other can access service on your server
for Port in "$Accept_Ports" ; do
iptables -A INPUT -i ppp0 -p udp –dport ${Port} -j ACCEPT
iptables -A INPUT -i ppp0 -p tpc –dport ${Port} -j ACCEPT
done

# the ruler can make you firewall betterd
iptables -A INPUT -i ppp0 -p tcp -j REJECT –reject-with tcp-reset
iptables -A INPUT -i ppp0 -p udp -j REJECT –reject-with icmp-port-unreachable

注:
有状态防火墙需要内核的支持,幸好,多数的发行版都支持这一特征

2007年09月14日

rsync配置与应用

简介
对于选择linux 作为应用平台的的中小型企业或网站来说,往往面临如何实现数据远程备份或者网站镜象的问题,虽然有商业化的备份和镜象产品可供选择,但这些产品的价格往往过于昂贵。因此如何利用自由软件高效实现远程备份和网站镜象就成为一个值得讨论的话题。

通过网络进行远程数据备份或者网站镜象的最简单的方法就是使用wget,但是这种方式每次都需要将所有数据都重新在网络上传输一遍,而不考虑哪些文件是经过更新的,因此效率非常低下。尤其在需要备份的数据量很大的时候,往往需要花费数个小时来在网络上进行数据传输。

因此这里就介绍一种高效的网络远程备份和镜象工具-rsync,它可以满足绝大多数要求不是特别严格的备份需求。

rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了–remote sync。它的特性如下:

可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
优化的流程,文件传输效率高。
可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜象。
软件下载
rysnc的主页地址为:

http://rsync.samba.org/

目前最新版本为2.4.6。可以选择从原始网站下载:http://rsync.samba.org/ftp/rsync/。也可以选择从本站下载:rsync 2.4.6。

编译安装
rsync的编译安装非常简单,只需要以下简单的几步:

[root@www rsync-2.4.6]# ./configure
[root@www rsync-2.4.6]# make
[root@www rsync-2.4.6]# make install

但是需要注意的是必须在服务器A和B上都安装rsync,其中A服务器上是以服务器模式运行rsync,而B上则以客户端方式运行rsync。这样在web服务器A上运行rsync守护进程,在B上定时运行客户程序来备份web服务器A上需要备份的内容。

rsync服务器
1、rsync服务器的启动

在web服务器A上需要以守护进程方式来启动rsync服务器,只需要运行:

[root@www rsync-2.4.6]# /usr/local/bin/rsync –daemon

即可启动。rsync默认服务端口为873,服务器在该端口接收客户的匿名或者认证方式的备份请求。

如果要在启动时把服务起来,有几种不同的方法,比如:

a、加入inetd.conf

编辑/etc/services,加入rsync 873/tcp,指定rsync的服务端口是873。编加/etc/inetd.conf,加入rsync stream tcp nowait root /bin/rsync rsync –daemon

注:对于xinetd,设置方法类似。

b、加入rc.local

编辑/etc/rc.d/rc.local,在最后添加:

/usr/local/bin/rsync –daemon

2、rsync的配置

对于rsync服务器来说,最重要和复杂的就是它的配置了。rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证、访问、日志记录等等。

该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束,模块中包含格式为name = value的参数定义。每个模块其实就对应需要备份的一个目录树,比方说在我们的实例环境中,有三个目录树需要备份:/www/、/home/web_user1/和/home/web_user2/,那么就需要在配置文件中定义三个模块,分别对应三个目录树。

配置文件是行为单位的,也就是每个新行都表示一个新的注释、模块定义或者参数赋值。以#开始的行表示注释,以""结束的行表示下面一行是该行的继续。参数赋值中等号后可能是一个大小写不敏感的字符串、一个以trure/false表示的布尔值。

全局参数

在文件中[modlue]之前的所有参数都是全局参数,当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值。

motd file

"motd file"参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。

log file

"log file"指定rsync的日志文件,而不将日志发送给syslog。

pid file

指定rsync的pid文件。

syslog facility

指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。

模块参数

在全局参数之后就需要定义一个或多个模块了,模块中可以定义以下参数:

comment

给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

path

指定该模块的供备份的目录树路径,该参数是必须指定的。

use chroot

如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。

max connections

指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。

lock file

指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock。

read only

该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。

list

该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。

uid

该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是"nobody"。

gid

该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。

exlude

用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用–exclude来指定模式,不过配置文件中指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是exclude还是include。

但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exlude列表,如果希望确保特定的文件不能被访问,那就最好结合uid/gid选项一起使用。

exlude from

指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exlude列表定义。

include

用来指定多个由空格隔开的多个rsync并应该exlude的模式列表。这等同于在客户端命令中使用–include来指定模式,结合include和exlude可以定义复杂的exlude/include规则 。一个模块只能指定一个include选项,但是可以在模式前面使用"-"和"+"来指定是exclude还是include。

include from

指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。

auth users

该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。

secrets file

该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,需要限式指定一个。(例如:/etc/rsyncd.secrets)

strict modes

该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true。

hosts allow

该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式:

o xxx.xxx.xxx.xxx,客户主机只有完全匹配该IP才允许访问。例如:192.167.0.1

o a.b.c.d/n,属于该网络的客户都允许连接该模块。例如:192.168.0.0/24

o a.b.c.d/e.f.g.h,属于该网络的客户都允许连接该模块。例如:192.168.0.0/255.255.255.0

o 一个主机名,客户主机只有拥有该主机名才允许访问,例如:backup.linuxaid.com.cn。

o *.linuxaid.com.cn,所有属于该域的主机都允许。

默认是允许所有主机连接。

hosts deny

指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。

ignore errors

指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IP错误,一般来说rsync在出现IO错误时将将跳过–delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题。

ignore nonreadable

指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。

transfer logging

使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。

log format

通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:

o %h 远程主机名

o %a 远程IP地址

o %l 文件长度字符数

o %p 该次rsync会话的进程id

o %o 操作类型:"send"或"recv"

o %f 文件名

o %P 模块路径

o %m 模块名

o %t 当前时间

o %u 认证的用户名(匿名时是null)

o %b 实际传输的字节数

o %c 当发送文件时,该字段记录该文件的校验码

默认log格式为:"%o %h [%a] %m (%u) %f %l",一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。

timeout

通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。

refuse options

通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名,而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩,应该是:"dont compress = *"。

dont compress

用来指定那些不进行压缩处理再传输的文件,默认值是

*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

rsync客户命令
在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命令来实现将服务器端的文件备份到客户端来。rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。

首先,rsync的命令格式可以为:

rsync [OPTION]… SRC [SRC]… [USER@]HOST:DEST

rsync [OPTION]… [USER@]HOST:SRC DEST

rsync [OPTION]… SRC [SRC]… DEST

rsync [OPTION]… [USER@]HOST::SRC [DEST]

rsync [OPTION]… SRC [SRC]… [USER@]HOST::DEST

rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsync有六种不同的工作模式:

拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。

使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。

使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。

从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。

从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。

列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
1、用法

在使用rsync传输文件时,需要指定一个源和一个目的,其中一个可能是远程机器的资源信息。例如:

rsync *.c foo:src/

表示将传输当前目录下所有以.c结尾的文件到机器foo的src目录下。如果任何文件已经存在于远程系统,则会调用远程更新协议来实现仅仅传输那些更新过的文件。

rsync -avz foo:src/bar /data/tmp

该命令则递归地传输机器foo上的src/bar目录下的所有内容到本地/data/tmp/bar目录中。文件以归档模式进行传输,以确保符号链结、属性、权限、属主等信息在传输中都被保存。此外,可以使用压缩技术来加快数据传输:

rsync -avz foo:src/bar/ /data/tmp

路径信息以"/"结尾时表示拷贝该目录,而不以"/"结尾表示拷贝该目录。当配合使用–delete选项时这两种情况的区别将会表现出来。

也可以以本地模式来使用rsync,如果SRC和DST路径中都没有任何":"符号则表示该命令运行在本地模式,等同于cp命令。

rsync somehost.mydomain.com::

这种模式则将会列出somehost.mydomain.com.可以访问的所有模块信息。

选项说明

-v, –verbose 详细模式输出
-q, –quiet 精简输出模式
-c, –checksum 打开校验开关,强制对文件传输进行校验
-a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, –recursive 对子目录以递归模式处理
-R, –relative 使用相对路径信息

rsync foo/bar/foo.c remote:/tmp/

则在/tmp目录下创建foo.c文件,而如果使用-R参数:

rsync -R foo/bar/foo.c remote:/tmp/

则会创建文件/tmp/foo/bar/foo.c,也就是会保持完全路径信息。

-b, –backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用–suffix选项来指定不同的备份文件前缀。
–backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, –update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, –links 保留软链结
-L, –copy-links 想对待常规文件一样处理软链结
–copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
–safe-links 忽略指向SRC路径目录树以外的链结
-H, –hard-links 保留硬链结
-p, –perms 保持文件权限
-o, –owner 保持文件属主信息
-g, –group 保持文件属组信息
-D, –devices 保持设备文件信息
-t, –times 保持文件时间信息
-S, –sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, –dry-run现实哪些文件将被传输
-W, –whole-file 拷贝文件,不进行增量检测
-x, –one-file-system 不要跨越文件系统边界
-B, –block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, –rsh=COMMAND 指定替代rsh的shell程序
–rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, –cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
–existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
–delete 删除那些DST中SRC没有的文件
–delete-excluded 同样删除接收端那些被该选项指定排除的文件
–delete-after 传输结束以后再删除
–ignore-errors 及时出现IO错误也进行删除
–max-delete=NUM 最多删除NUM个文件
–partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
–force 强制删除目录,即使不为空
–numeric-ids 不将数字的用户和组ID匹配为用户名和组名
–timeout=TIME IP超时时间,单位为秒
-I, –ignore-times 不跳过那些有同样的时间和长度的文件
–size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
–modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T –temp-dir=DIR 在DIR中创建临时文件
–compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 –partial
–progress 显示备份过程
-z, –compress 对备份的文件在传输时进行压缩处理
–exclude=PATTERN 指定排除不需要传输的文件模式
–include=PATTERN 指定不排除而需要传输的文件模式
–exclude-from=FILE 排除FILE中指定模式的文件
–include-from=FILE 不排除FILE指定模式匹配的文件
–version 打印版本信息
–address 绑定到特定的地址
–config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
–port=PORT 指定其他的rsync服务端口
–blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
–progress 在传输时现实传输过程
–log-format=formAT 指定日志文件格式
–password-file=FILE 从FILE中得到密码
–bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, –help 显示帮助信息
实例分析
这里假设有两台服务器:A和B。其中A是主web服务器,具有域名www.linuxaid.com.cn(202.99.11.120),B服务器是备份机,其域名为backup.linuxaid.com.cn(202.99.11.121)。其中A的web内容存放在以下几个地方:/www/和/home/web_user1/和/home/web_user2/。我们需要在备份机B上建立对这几个目录内容的备份。

服务器配置实例

那么在www.linuxaid.com.cn上创建rsyncd的配置文件/etc/rsyncd.conf,内容如下:

uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

[www]
path = /www/
ignore errors
read only = true
list = false
hosts allow = 202.99.11.121
hosts deny = 0.0.0.0/32
auth users = backup
secrets file = /etc/backserver.pas

[web_user1]
path = /home/web_user1/
ignore errors
read only = true
list = false
hosts allow = 202.99.11.121
hosts deny = 0.0.0.0/32
uid = web_user1
gid = web_user1
auth users = backup
secrets file = /etc/backserver.pas

[web_user2]
path = /home/web_user2/
ignore errors
read only = true
list = false
hosts allow = 202.99.11.121
hosts deny = 0.0.0.0/32
uid = web_user2
gid = web_user2
auth users = backup
secrets file = /etc/backserver.pas

这里定义有四个三个模块,分别对应于三个需要备份的目录树。这里只允许202.99.11.121备份本机的数据,并且需要认证。三个模块授权的备份用户都为backup,并且用户信息保存在文件/etc/backserver.pas中,其内容如下:

backup:bk_passwd

并且该文件只能是root用户可读写的,否则rsyncd启动时会出错。这些文件配置完毕以后,就需要在A服务器上启动rsyncd服务器:

rsync –daemon

客户命令示例

/usr/local/bin/rsync -vzrtopg –delete –exclude "logs/" –exclude "conf/ssl.*/" –progress backup@202.99.11.120::www /backup/www/ –password-file=/etc/rsync.pass

上面这个命令行中-vzrtopg里的v是verbose,z是压缩,r是recursive,topg都是保持文件原有属性如属主、时间的参数。–progress是指显示出详细的进度情况,–delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。–exclude "logs/" 表示不对/www/logs目录下的文件进行备份。–exclude "conf/ssl.*/"表示不对/www/conf/ssl.*/目录下的文件进行备份。

backup@202.99.11.120::www 表示对该命令是对服务器202.99.11.120中的www模块进行备份,backup表示使用backup来对该模块进行备份。

–password-file=/etc/rsync.pass来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有root可读。

这里将备份的内容存放在备份机的/backup/www/目录下。

[root@linuxaid /]# /usr/local/bin/rsync -vzrtopg –delete –exclude "logs/" –exclude "conf/ssl.*/" –progress backup@202.99.11.120::www /backup/www/ –password-file=/etc/rsync.pass
receiving file list … done
./
1
785 (100%)
1.py
4086 (100%)
2.py
10680 (100%)
a
0 (100%)
ip
3956 (100%)
./
wrote 2900 bytes read 145499 bytes 576.34 bytes/sec
total size is 2374927 speedup is 45.34

对其它两个模块操作的命令分别为:

/usr/local/bin/rsync -vzrtopg –delete –progress backup@202.99.11.120::web_user1 /backup/web_user1/ –password-file=/etc/rsync.pass

/usr/local/bin/rsync -vzrtopg –delete –progress backup@202.99.11.120::web_user2 /backup/web_user2/ –password-file=/etc/rsync.pass

可以将客户命令通过crontab -e命令来实现自动备份,如crontab -e:

 

一些示例脚本
这里这些脚本都是rsync网站上的例子:

1、每隔七天将数据往中心服务器做增量备份

#!/bin/sh

# This script does personal backups to a rsync backup server. You will end up
# with a 7 day rotating incremental backup. The incrementals will go
# into subdirectories named after the day of the week, and the current
# full backup goes into a directory called "current"
# tridge@linuxcare.com

# directory to backup
BDIR=/home/$USER

# excludes file – this contains a wildcard pattern per line of files to exclude
EXCLUDES=$HOME/cron/excludes

# the name of the backup machine
BSERVER=owl

# your password on the backup server
export RSYNC_PASSWORD=XXXXXX

########################################################################

BACKUPDIR=`date +%A`
OPTS="–force –ignore-errors –delete-excluded –exclude-from=$EXCLUDES
–delete –backup –backup-dir=/$BACKUPDIR -a"

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

# the following line clears the last weeks incremental directory
[ -d $HOME/emptydir ] || mkdir $HOME/emptydir
rsync –delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/
rmdir $HOME/emptydir

# now the actual transfer
rsync $OPTS $BDIR $BSERVER::$USER/current

2、备份至一个空闲的硬盘

#!/bin/sh

export PATH=/usr/local/bin:/usr/bin:/bin

LIST="rootfs usr data data2"

for d in $LIST; do
mount /backup/$d
rsync -ax –exclude fstab –delete /$d/ /backup/$d/
umount /backup/$d
done

DAY=`date "+%A"`

rsync -a –delete /usr/local/apache /data2/backups/$DAY
rsync -a –delete /data/solid /data2/backups/$DAY

3、对vger.rutgers.edu的cvs树进行镜像

#!/bin/bash

cd /var/www/cvs/vger/
PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin

RUN=`lps x | grep rsync | grep -v grep | wc -l`
if [ "$RUN" -gt 0 ]; then
echo already running
exit 1
fi

rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog $HOME/ChangeLog

sum1=`sum $HOME/ChangeLog`
sum2=`sum /var/www/cvs/vger/CVSROOT/ChangeLog`

if [ "$sum1" = "$sum2" ]; then
echo nothing to do
exit 0
fi

rsync -az –delete –force vger.rutgers.edu::cvs/ /var/www/cvs/vger/
exit 0

FAQ
Q:如何通过ssh进行rsync,而且无须输入密码?
A:可以通过以下几个步骤

1. 通过ssh-keygen在server A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identity和identity.pub文件
2. 在server B上的home目录建立子目录.ssh
3. 将A的identity.pub拷贝到server B上
4. 将identity.pub加到~[user b]/.ssh/authorized_keys
5. 于是server A上的A用户,可通过下面命令以用户B ssh到server B上了
e.g. ssh -l userB serverB
这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。

Q:如何通过在不危害安全的情况下通过防火墙使用rsync?
A:解答如下:

这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用ssh,这时最好新建一个备份用户,并且配置sshd仅允许这个用户通过RSA认证方式进入。 如果服务器在防火墙内,则最好限定客户端的IP地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防火墙打开TCP端口22的ssh外发连接就ok了。

Q:我能将更改过或者删除的文件也备份上来吗?
A:当然可以:

你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 …这样的命令来实现。
这样如果源文件:/path/to/some/file.c改变了,那么旧的文件就会被移到./backup-2000-2-13/path/to/some/file.c,
这里这个目录需要自己手工建立起来

Q:我需要在防火墙上开放哪些端口以适应rsync?
A:视情况而定

rsync可以直接通过873端口的tcp连接传文件,也可以通过22端口的ssh来进行文件传递,但你也可以通过下列命令改变它的端口:

rsync –port 8730 otherhost::
或者
rsync -e ’ssh -p 2002′ otherhost:

Q:我如何通过rsync只复制目录结构,忽略掉文件呢?
A:rsync -av –include ‘*/’ –exclude ‘*’ source-dir dest-dir

Q:为什么我总会出现"Read-only file system"的错误呢?
A:看看是否忘了设"read only = no"了

Q:为什么我会出现’@ERROR: invalid gid’的错误呢?
A:rsync使用时默认是用uid=nobody;gid=nobody来运行的,如果你的系统不存在nobody组的话,就会出现这样的错误,可以试试gid = nogroup或者其它

Q:绑定端口873失败是怎么回事?
A:如果你不是以root权限运行这一守护进程的话,因为1024端口以下是特权端口,会出现这样的错误。你可以用–port参数来改变。

Q:为什么我认证失败?
A:从你的命令行看来:

你用的是:
> bash$ rsync -a 144.16.251.213::test test
> Password:
> @ERROR: auth failed on module test
>
> I dont understand this. Can somebody explain as to how to acomplish this.
> All suggestions are welcome.

应该是没有以你的用户名登陆导致的问题,试试rsync -a max@144.16.251.213::test test

2007年09月09日

fstab中存放了与分区有关的重要信息,其中每一行为一个分区记录,每一行又可分为六个部份,下面以/dev/hda7 / ext2 defaults 1 1为例逐个说明:

  1. 第一项是您想要mount的储存装置的实体位置,如hdb或/dev/hda6。

  2. 第二项就是您想要将其加入至哪个目录位置,如/home或/,这其实就是在安装时提示的挂入点。

  3. 第三项就是所谓的local filesystem,其包含了以下格式:如ext、ext2、msdos、iso9660、nfs、swap等,或如ext2,可以参见/prco/filesystems说明。

  4. 第四项就是您mount时,所要设定的状态,如ro(只读)或defaults(包括了其它参数如rw、suid、exec、auto、nouser、async),可以参见「mount nfs」。

  5. 第五项是提供DUMP功能,在系统DUMP时是否需要BACKUP的标志位,其内定值是0。

  6. 第六项是设定此filesystem是否要在开机时做check的动作,除了root的filesystem其必要的check为1之外,其它皆可视需要设定,内定值是0。
本文来自:http://www.linuxpk.com/74.html

2007年09月03日

Xmanager登录RedHat Linux需要修改的配置
Runfaster  2004-10-26

象其他unix平台一样,有时候,我们需要通过图形界面登录到服务器进行维护工作.RedHat在缺省情况下,是关闭的Xwindow的共享的,如果要能用Xmanager登录到RedHat,要的linux上做一些修改.

Xdmc的配置

#cd /etc/X11/xdm
#vi xdm-config
!DisplayManager.requestPort:    0

#vi Xaccess
*    #any host can get a login window

gdmc的配置
#cd /etc/X11/gdm
#vi gdm.conf
[xdmcp]
Enable=true

如果有防火墙,打开177 udp端口
运行:
#xdm [-debug 1]
#gdm

此时,Xmanager可以连上RedHat了.

作者: 大叔    发表日期: 2006-08-24 12:41   复制链接

Oracle9.2.0.7在Red Hat Enterprise Linux AS4上安装方法
http://mirrors.cn99.com/oracle/9i/下载Oracle9.2.0.4安装文件及升级到9.2.0.7的补丁文件p4163445_92070_LINUX.zip
一、环境和软件准备
1.1 liunx软件包
检查下面软件包是否安装(版本必须一样或更高)
compat-db-4.1.25-9
compat-gcc-32-3.2.3-47.3
compat-gcc-32-c++-3.2.3-47.3
compat-libgcc-296-2.96-132.7.2
compat-libstdc++-296-2.96-132.7.2
compat-libstdc++-33-3.2.3-47.3
gcc-3.4.3-9.EL4
gcc-c++-3.4.3-9.EL4
gnome-libs-1.4.1.2.90-44
gnome-libs-devel-1.4.1.2.90-44(第四张光盘)
libaio-devel-0.3.102-1
libaio-0.3.102-1
make-3.80-5
openmotif21-2.1.30-11
xorg-x11-deprecated-libs-devel-6.8.1-23.EL
xorg-x11-deprecated-libs-6.8.1-23.EL
compat-oracle-rhel4-1.0-3
compat-libcwait-2.0-1

提示:在安装的linux的时候,最好安装开发工具中的所有组件以及与xwindow相关的所有组件,如果装完系统后发现还有未安装的包,除了gnome-libs-devel-1.4.1.2.90-44包在第四张光盘外,其他的包一般都在第二或者第三张光盘,找到相应的包安装(rpm –ihv 包的名字),千万不要在添加删除程序里更新软件包,否则你会死的很惨,至少要换20次以上的光盘而且都是二三二三的换,苦不堪言,不信你可以一试!
其中compat-oracle-rhel4-1.0-3和compat-libcwait-2.0-1下载文件名称P4198954_21_LINUX.zip,下载完后用rpm –ihv 包的名字命令安装
解压P4198954_21_linux.zip,解出来是两个文件:compat-oracle-rhel4-1.0-3和compat-libcwait-2.0-1
安装:
Rpm –ihvU compat*.rpm
Preparing…         ########################################### [100%]
1:compat-libcwait-2.0-2.i386.rpm ##################################### [ 50%]
2:compat-oracle-rhel4-1.0-5.i386.rpm#################################### [100%]
1.2 linux环境
1,创建oracle安装用户组及用户帐号;
#groupadd dba
#groupadd oinstall
#useradd oracle -g oinstall -G dba
#passwd oracle
2,建立oracle安装文件夹;
# mkdir -p /u01/app/oracle/product/9.2.0.4
# mkdir /u01/cwdata
# chmod 777 /u01/cwdata
# chown oracle.dba /u01/cwdata
# chown oracle.dba /orasetup
# chmod 777 /orasetup
# chown -R oracle.dba /u01/app/oracle/product/9.2.0.4
# chmod -R 777 /u01/app/oracle/product/9.2.0.4
2, 配置环境变量;
  以root用户登录,设置root用户的环境打开.bash_profile文件,将如下内容加入:
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/9.2.0.4
export PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin
export ORACLE_OWNER=oracle
export ORACLE_SID=oradb
3、设定oracle安装用户环境参数,以oracle用户登录,修改环境配置文件:
vi $HOME/.bash_profile
添加下面内容:
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/bin
#ORACLE_BASE 可以定位到盘阵上/data
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/9.2.0.4
export PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin
export ORACLE_OWNER=oracle
export ORACLE_SID=oradb (这里是你要创建的数据库名,可以自己设置)
export ORACLE_TERM=xterm
export LD_ASSUME_KERNEL=2.4.19 (这个是内核版本参数,AS4应设置为2.4.19)
export THREADS_FLAG=native
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
export NLS_LANG=”American_america.zhs16gbk”
# export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export DISPLAY=xjgz01:0.0(这里可以是主机名或是IP)
export LANG=en_US
export GDM_LANG= en_US
export LC= en_US
export PATH
unset USERNAME
4, 设置系统参数;
#su – root切换到root用户
a) 修改#vi /etc/sysctl.conf, 以下是配置文件的内容(其中红色字体为添加的内容):
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
修改后运行#sysctl –p命令使得内核改变立即生效;
译者注:一般情况下可以设置最大共享内存为物理内存的一半,如果物理内存是 2G,则可以设置最大共享内存为 1073741824,如上;如物理内存是 1G,则可以设置最大共享内存为 512 * 1024 * 1024 = 536870912;以此类推。)
建议永久地增加 shmmax 设置。
sem 4个参数依次为SEMMSL(每个用户拥有信号量最大数);SEMMNS(系统信号量最大数);SEMOPM(每次semopm系统调用操作数);SEMMNI(系统辛苦量集数最大数).Shmmax 最大共享内存,官方文档建议是内存的1/2,Shmmni 最小共享内存 4096KB.Shmall 所有内存大小
B) 设置oracle对文件的要求:
编辑文件:#vi /etc/security/limits.conf 加入以下语句:
oracle    soft    nofile    65536
oracle    hard    nofile   65536
oracle    soft    nproc    16384
oracle    hard    nproc    16384
C) gcc降级 (这个我只做了前两项,后面的没有管,也没有大的问题)
#su – root
#mv /usr/bin/gcc /usr/bin/gcc34
#ln –s /usr/bin/gcc32 /usr/bin/gcc
#mv /usr/bin/g++ /usr/bin/g++34
#ln –s /usr/bin/g++32 /usr/bin/g++
二、安装Oracle9i软件
提示:从下面开始,所有工作默认都是以当前登录的oracle用户为准,除非特别说明之外。你最好开N个终端以备用,至少2个是有root权限的,因为安装过程中要多次用到root权限
2.1、将oracle安装文件解压出来
用oracle帐号登陆创建一个目录装软件包(最好用英文的xwindows,中文的会出些怪问题,我的是这样的,晕)
mkdir install
cd install
gunzip ship_9204_linux_disk1.cpio.gz
gunzip ship_9204_linux_disk2.cpio.gz
gunzip ship_9204_linux_disk3.cpio.gz
cpio -idmv < ship_9204_linux_disk1.cpio
cpio -idmv < ship_9204_linux_disk2.cpio
cpio -idmv < ship_9204_linux_disk3.cpio
执行完命令后会生成Disk1、Disk2、Disk3三个目录。
2.2、运行oracle安装程序
1、要想在工作机上运行远程的桌面程序的话需要在本机装一个Hummingbird Connectivity 10的软件,打开Exceed
cd Disk1
./runInstaller (这里可能出错,说你的Xlib有问题,应有如下句子:
•      Xlib: connection to ":0.0" refused by server
•      Xlib: Client is not authorized to connect to Server
如果是这样的话,ctr+c结束安装,然后用命令:xhost +IP,如:xhost +192.168.0.1,最好清空/tmp/目录下的文件,rm –rf *,之后再次运行./runInstaller,当然也可能是你的oracle用户目录下的.bash_profile文件里的设置有问题,检查是否有这句export DISPLAY=xjgz01:0.0(这里可以是主机名或是IP)如果没有就加上)

2、如果你严格按照本方法安装,跟着安装向导走就可以了
在安装过程中间,出现弹出窗口提示用root用户执行命令时,用root登陆照着提示命令就即可,出现有关权限组设置时,都填写预先创建好的dba组,

3、在语言选择上“Product Languages”千万要记得添加上“Simplified Chinese”(简体中文)

4、在安装产品上选择“Oracle9i Database 9.2.0.4.0”,在安装类型上选择“Custom”,并只选择下列组件:
Oracle9i 9.2.0.4.0
Oracle Net Services 9.2.0.1.0
Oracle9i Development Kit 9.2.0.1.0

5、在安装过程中间,出现"Create Database"就选择NO",我们会在最后通过dbca创建数据库的。

6、在安装将完成之前,安装程序将会运行配置程序,在运行"Agent Configuration Assistant"的时候,将会出现失败的情况,这时候请继续下一步先。(而且是乱码,根本不知道是什么东西,晕啊)
7、安装补丁p2617419_10102_GENERIC.zip得到opatch工具
得到opatch工具
unzip p2617419_10102_GENERIC.zip
cp -a OPatch $ORACLE_HOME/
8、安装补丁p3238244_9204_LINUX.zip
unzip p3238244_9204_LINUX.zip
cd 3238244
$ORACLE_HOME/Opatch/opatch apply
当出现是否准备好Updating时,选择“Y”

或手工将3238244/files/lib/stubs目录下的所有文件复制到/oracle/product/9.2.0.6/lib/stubs/目录下也可以,如下:
cp files/lib/stubs/* $ORACLE_HOME/lib/stubs/

9、重新连接编译"Agent"相关程序
cd $ORACLE_HOME/network/lib/
make -f ins_oemagent.mk install
耐心等待成功编译。

10、再点击前面oracle安装程序中的"Agent Configuration Assistant",并点击"Retry"重新运行配置工具程序,过一会应该会成功. (我的就没有成功,郁闷呀!:-(,不用管它成功不成功因为后面我们要安装9.2.0.7的补丁的)
2.3 创建和配置数据库
1、至此,oracle9iR2已经安装成功了,(为了不至于走前面的找不到DBCA的老路,我先创建数据库,再打9.2.0.7的补丁。)下面开始创建数据库,运行下面命令创建一个数据库实例
dbca
(如果dbca执行到开始创建数据库时出错退出,修改文件/u01/app/oracle/product/9.2.0/bin/dbca,注释掉118、121、123、124这几行,我也试过另行安装JDK,把JRE的路径指向这个,也可以解决问题。)
"Step 1 of 7"选择"Create Database"并点击"Next"进入下一步
"Step 2 of 7"选择"Transaction Processing"并点击"Next"进入下一步
"Step 3 of 7"在“Global Database Name:”里输入“oradb”,点击"Next"进入下一步
"Step 4 of 7"选择"Shared Server Mode",点击"Next"进入下一步
"Step 5 of 7"时,选择“Character Sets”页,点击“Choose from the list of character sets”,
并在下拉框里选择“ZHS16GBK”,点击“Next”到下一步。
"Step 6 of 7"时,直接点击“Next”到下一步
在最后一步,点击“Finish”按钮再点击"OK"然后耐心等待数据库的创建完成。
(这个过程可能比较长,喝口水或者出去转一圈时间是足够的,oradb就是你的数据库名)
2、当数据库创建完成之后,会出现一个对话框"Database Configuration Assistant",告诉你创建的结果以及要求你修改oracle
  默认登录帐户的密码,包括"SYS password"、"SYSTEM password";输入之后点击"Exit"退出完成最终的数据库创建。

3、配置数据库的配置init文件
cp $ORACLE_BASE/admin/oradb/pfile/init*
$ORACLE_HOME/dbs/initoradb.ora
(这里要注意路径是否正确,还有就是initoradb.ora,其中oradb一定要和你的数据库名一致,否则可能会出现Can’t find init file …的错误)
一般上来说,pfile目录下只会有一个文件的直接用CP命令拷到$ORACLE_HOME/dbs/initoradb.ora下也可以的

4、切换到root用户,配置oracle服务自动启动:
su – root
vi /etc/oratab
将此文件中的有你的数据库名的那行:
oradb:/oracle/product/9.2.0.6:N
修改成:
oradb:/oracle/product/9.2.0.6:Y
保存退出

5、手工启动数据库(或下一步的自动启动配置)
$ORACLE_HOME/bin/lsnrctl start
$ORACLE_HOME/bin/dbstart
数据库应该可以启动得起来!
3继续升级:

1) 如果你已经装好了9204,现在想升级到9207,还会碰到中文乱码问题。
  首先是要停止Oracle的所有服务,否则安装程序会提示文件无法覆盖。

  $ dbshut
  $ lsnrctl stop
  $ agentctl stop
  $ stopJServ.sh

  $ cd patchDisk1(patchDisk1是我解压p4163445_92070_LINUX.zip的目录)
  $ find -name all_except_bin.jar
<—–
/stage/Components/oracle.swd.jre/1.4.2.02.0/1/DataFiles/all_except_bin.jar
(这里会找到两个)
—–>
  $ cd stage/Components/oracle.swd.jre/1.4.2.02.0/1/DataFiles
  $ cp -pf all_except_bin.jar all_except_bin.jar.eng
  $ unzip all_except_bin.jar.eng
  $ find -name font*zh*
<—–
./jre/1.4.2/lib/font.properties.zh.Turbo
./jre/1.4.2/lib/font.properties.zh_CN.Redhat8.0
./jre/1.4.2/lib/font.properties.zh_TW.Redhat8.0
./jre/1.4.2/lib/font.properties.zh_CN.Sun
./jre/1.4.2/lib/font.properties.zh_CN_UTF8.Sun
./jre/1.4.2/lib/font.properties.zh_TW.Sun
./jre/1.4.2/lib/font.properties.zh_TW_UTF8.Sun
—–>
  $ cd jre/1.4.2/lib
  $ rm -f font.*.zh font.*.tlc font.*.zys

  $ ln -s font.properties.zh_CN.Redhat8.0 font.properties.zh.zys
  $ ln -s font.properties.zh.Turbo font.properties.zh.tlc
  $ ln -s font.properties.zh.zys font.properties.zh
  $ ls -la *zh*

{说明:font.properties.zh.zys,此选项保证Redhat AS4显示中文}
{说明:font.properties.zh.tlc,如果安装了tlc字体,可以显示中文}

  $ cd ../../..
  $ rm -f all_except_bin.jar
  $ zip -r all_except_bin.jar jre/
  $ rm -Rf jre/

  注意:在9207里面是两个地方出现all_except_bin.jar,这两个文件是
  一样的。所以只要重做一次就行了,或者干脆把改好的拿去覆盖也可以。
2)运行升级
在patchDisk1目录下运行./runInstaller,现在你应该可以看到中文的界面了,将ouihome1改成ouihome,将安装路径改成你的oracle安装目录,基本上是next就可以了。

为了方便管理,可以写一个启动脚本ora9i:
以root身份进入,编写以下脚本:

#!/bin/bash
#start and stop the oracle instance
# chkconfig –level 5 –add ora9i
#chkconfig: 345 91 19
# description: starts the oracle listener and instance

export ORACLE_HOME="/u01/app/oracle/product/9.2.0.4"
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH
export ORACLE_OWNER="oracle"
export ORACLE_SID=oradb

if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
then
  echo "oracle startup:cannot start"
  exit 1
fi

case "$1" in
start)
#startup the listener and instance
  echo -n "oracle startup: "
  su – $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl start"
  su – $ORACLE_OWNER -c $ORACLE_HOME/bin/dbstart
  touch /var/lock/subsys/oracle
  echo "finished"
  ;;
stop)
# stop listener, apache and database
  echo -n "oracle shutdown:"
  su – $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl stop"
  su – $ORACLE_OWNER -c $ORACLE_HOME/bin/dbshut
  rm -f /var/lock/subsys/oracle
  echo "finished"
;;
reload|restart)
  $0 stop
  $0 start
;;
*)
  echo "Usage: ora9i [start|stop|reload|restart]"
  exit 1

esac
exit 0

存为ora9i后,然后用chmod a+x ora9,即可在以后以root身份运行/etc/rc.d/init.d/ora9i start |stop 来管理oracle的启动和停止了。

安装完毕:

Linux上安装Sybase要注意的几个地方

runfaster   2004.10.25

 

 

1.  如果是双机系统,代码装在本地磁盘,数据库设备装在阵列上。

缺省情况下,Sybase代码安装在/opt/sybase-12.5

/opt目录下,创建sybase-12.5目录

#mkdir sybase-12.5

把磁盘阵列的moint point设为/sybdata

以后建的数据库设备都建在/sybdata.

 

2.  创建sybase用户,

通过图形界面,用管理工具建立sybase用户,注意,Sybase用户的home目录设为/opt/sybase-12.5,shell设置为bsh.

 

 

3.  修改/opt/sybase-12.5/sybdata的宿主为sybase

#chown sybase /opt/sybase-12.5

#chown sybase /sybdata

 

4.  更改linux系统的共享内存值,单位是m

例如,系统有2G内存,分配给sybase 1.5G

       执行

       #echo ‘1500*1024*1024′|bc>/proc/sys/kernel/shmmax

       检查是否生效,可执行

       #ipcs –lm|grep ‘max seg size’

       要共享内存设置永久生效,/etc/rc.d/rc.local文件里面,添加一行如下:

       echo ‘1500*1024*1024′|bc>/proc/sys/kernel/shmmax

 

 

5.如果是双机系统,建议先产生逻辑IP,安装数据库时绑定在逻辑IP上。

例如,本机网卡是eth0ip地址是10.100.60.201,主机名是dataserver1,逻辑IP10.100.60.200,主机名是dataserver

   可以通过图形界面

       #redhat-config-networketh0添加多一个IP,地址是10.100.60.200,并激活这个网卡.

       命令行方式应该也可以

       #ifconfig eth0:1 10.100.60.200 netmask 255.255.255.0 dataserver

   最后,执行ifconfig 检查新的ip地址是否生效。

   另外,如果双机系统,要在两台服务器上,都要修改/etc/hosts文件,加入以下记录

   10.100.60.200        dataserver

   其中,dataserver是数据库服务器的名字

 

6.   安装软件有些特殊,sybase安装介质cd放到光驱里面,找到光驱的图标以后,双击,能看 到很多个.rpm文件,这些就是sybse的软件包,按一定顺序安装,首先右键点击sybase-common-12.5.0.1.rpm,打开方式选择install packages,如此方式,一个一个安装下面的软件包 ase ,Chinese, docs, efts, openclient, esql, 安装完上面的软件包后,其他就不用装了.

 

7.       下来的安装过程,大致与在windows下没有太多的区别,所有数据库设备都安装在磁盘阵列上,例如上例的/sybdata,字符集选ISO_1,在配置tcp属性时,缺省它是填了主机名,如果是双机系统,应填成逻辑IP对应的主机名或者是逻辑IP,,如上例中的dataserver或者是10.100.60.200master设备和库应扩充到300M。其他的具体安装步骤,可以参阅随软件的安装文档说明。安装完成以后,如果是双机系统,把磁盘阵列上(/sybdata)的建立的数据库设备改一下名,在另外一台机上mount起磁盘阵列,再安装一次sybase.安装完成以后,应该安装12.5.0.3的补丁,在工程加油站ftp有下载,并对sybase进行优化.两台机都要打补丁和进行优化.

 

8.    安装好了数据库以后,应该为sybase用户设置正确的环境变量。

     sybase用的home目录下,编辑一个前面带点的一个文件: .profile

     # cd /opt/sybase-12.5

     # vi  .profile

     在这个文件里面,增加两行:

          DSQUERY=dataserver

     export DSQUERY

     DSQUERY变量的值对应前面的/etc/hosts文件里面的逻辑IP项的主机名。

     重新以sybase登陆系统,执行 set,看看环境正确。