Monthly Archives: August 2010

Awk学习笔记[转]

整理:Jims of 肥肥世家
注:此文中所有链接如无特别说明均已失效,本文尽为保护作者利益而保留。请谨慎点击

<jims.yang@gmail.com>

Copyright © 2004 本文遵从GPL协议,欢迎转载、修改、散布。

第一次发布时间:2004年8月6日

Table of Contents

1. awk简介
2. awk命令格式和选项
        2.1. awk的语法有两种形式
        2.2. 命令选项
3. 模式和操作
        3.1. 模式
        3.2. 操作
4. awk的环境变量
5. awk运算符
6. 记录和域
        6.1. 记录
        6.2. 域
        6.3. 域分隔符
7. gawk专用正则表达式元字符
8. POSIX字符集
9. 匹配操作符(~)
10. 比较表达式
11. 范围模板
12. 一个验证passwd文件有效性的例子
13. 几个实例
14. awk编程
        14.1. 变量
        14.2. BEGIN模块
        14.3. END模块
        14.4. 重定向和管道
        14.5. 条件语句
        14.6. 循环
        14.7. 数组
        14.8. awk的内建函数
15. How-to
Read More »

在CentOS上安装配置heartbeat

Heartbeat提供了高可用集群最基本的功能,例如,节点间的内部通信方式、集群合作管理机制、监控工具和失效切换功能等。但是Heartbeat仅仅是个HA软件,它仅能完成心跳监控和资源接管,不会监视它控制的资源或应用程序。要监控资源和应用程序是否运行正常,必须使用第三方的插件,例如ipfail、Mon和Ldirector等。Heartbeat自身包含了几个插件,分别是ipfail、Stonith和 Ldirectord。

在家闲着无事,就简单的测试了一下heartbeat,没怎么深入测试,所以本文只会告诉你怎么让heartbeat跑起来,不涉及服务。

安装heartbeat不是个简单的事情,很多文章说可以直接用yum来安装,但我从碟上的安装源以及rpmforge的源中都没有找到heartbeata的包(如果你知道可以告诉我哪个源里面可以直接安装heartbeat),所以我还是从官方网站下载了三个包来进行编译。

编译的顺序是:先Cluster Glue, 再Resource Agents,然后才是Heartbeat。

这个编译可不是个简单的事,它可耗费了我不少时间。首先要安装autoconf, automake,pkgconfig,libxslt-devel等包。configure都没有大问题,都不在话下,都有明确的提示。

第一个不好解决的错误就是

./.libs/libplumb.so: undefined reference to `uuid_parse'
./.libs/libplumb.so: undefined reference to `uuid_generate'
./.libs/libplumb.so: undefined reference to `uuid_copy'
./.libs/libplumb.so: undefined reference to `uuid_is_null'
./.libs/libplumb.so: undefined reference to `uuid_unparse'
./.libs/libplumb.so: undefined reference to `uuid_clear'
./.libs/libplumb.so: undefined reference to `uuid_compare'
collect2: ld returned 1 exit status
gmake[2]: *** [ipctest] Error 1
gmake[2]: Leaving directory `/root/Reusable-Cluster-Components-glue-1.0.6/lib/clplumbing'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/root/Reusable-Cluster-Components-glue-1.0.6/lib'
make: *** [all-recursive] Error 1

这个差不多能看出来是uuid方面的包的故障,所以我一开始就想去安装一个libuuid-devel的包,在这个上面消耗了不少时间。但最后通过google与linux-ha的maillist得到了提示,总算是把这个问题给解决了。解决方法其实很简单,只要在configure时在后面加上:

LIBS='/lib/libuuid.so.1'

这个问题在对三个包进行make的时候都会出现类似的错误,所以这个解决方法在make三个包时都要用到。还要提到的是,在对Heartbeat进行configure的时候,最好用他推荐的ConfigureMe而不要用configure。

第二个比较麻烦的问题也是在make时碰到的,不过只是在make Cluster Glue才有:

cc1: warnings being treated as errors 
main.c:64: warning: function declaration isn't a prototype
main.c:78: warning: function declaration isn't a prototype
gmake[2]: *** [main.o] Error 1
gmake[2]: Leaving directory
`/root/Reusable-Cluster-Components-glue-1.0.6/lib/stonith'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/root/Reusable-Cluster-Components-glue-1.0.6/lib'
make: *** [all-recursive] Error 1
error: Bad exit status from /var/tmp/rpm-tmp.55884 (%build)

这个问题我都估计是Cluster Glue的一个bug,产生的原因与解决的方法实在是太鬼异了。从错误信息上来看,这是main.c文件里面的函数定义错误,解决办法就是将其version函数从stonith子目录下面的main.c文件里面删除(我对编程不懂,不过改名是没用的)。

打开stonith子目录下面的main.c。
1、找到其64行,将其注释掉。
2、找到其76到81行全部注释掉。
3、找到其390行,将其注释,或者换成

case 'V':     printf("stonith: %s (%s)\n", GLUE_VERSION, GLUE_BUILD_VERSION);

这之后来说应该都会是一帆风顺的了,当然你也有可能在make install Heartbeat碰到这个问题:

gmake[1]: Entering directory `/root/Heartbeat-3-0-STABLE-3.0.3/doc'
\
--xinclude \
http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl heartbeat.xml
gmake[1]: --xinclude: Command not found
gmake[1]: *** [heartbeat.8] Error 127
gmake[1]: Leaving directory `/root/Heartbeat-3-0-STABLE-3.0.3/doc'
make: *** [all-recursive] Error 1

这个就是因为你没有安装前面我说的那个libxslt-devel包了。安装好之后就可以。

顺便说一句,在make install Heartbeat的时候,这个–xinclude这些xml文件时可能要耗大量的时间,有时候可能由于网络原因还会报错,这个时候只要再来几次基本上也就没有问题了。

接下来就是重头戏,配置heartbeat了。
heartbeat的配置文件有两个位置/etc/ha.d与/usr/etc/ha.d,由于没有仔细去读/etc/init.d/heartbeat,导致一会儿报这里找不到一个文件一会儿那里找不到一个文件,我干脆就所/usr/etc/ha.d下面的内容全部copy到/etc/ha.d里面,再删掉/usr/etc/ha.d,然后做一个软链接指向/etc/ha.d。整个世界终于清醒了。

然后就是/etc/ha.d/ha.cf文件了,这里我就提供我的ha.cf文件,然后简单的解释一下:

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
bcast eth0
#mcast eth1 225.0.0.1 694 1 0
#ucast eth0 192.168.0.1
auto_failback on
watchdog /dev/watchdog
node node1
node node2
ping 172.16.217.1
respawn hacluster /usr/lib/heartbeat/ipfail
compression zlib

debugfile与logfile是定义日志文件的位置,如果两个都没有定义,默认会写入/var/log/message。
keepalive指定心跳间隔时间即每隔多少秒钟在eth0上发送一次广播。
deadtime指定若备用节点在多少秒内没有收到主节点的心跳信号,则立即接管主节点的服务资源。
warntime指定心跳延迟的时间为N秒。当N秒钟内备份节点不能接收到主节点的心跳信号时,就会往日志中写入一个警告日志,但此时不会切换服务
initdead在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍
bcast、mcast与ucast都是定义心跳的,三个任选一个即可。bcast是直接定义使用设备,mcast使用多播,ucast是单播。
auto_failback指定主机恢复后是否自动切换回主机服务。
node后面一定要接uname -n的结果。
ping与respawn hacluster /usr/lib/heartbeat/ipfail用来测试网络连接,ping后面接外网网关或者其他可靠的设备的IP,如果这个IP一旦ping不通了(意味该机的外网down了),则利用respawn调用/usr/lib/heartbeat/ipfail来主动进行切换。

其他的各项定义,大家自己man ha.cf看吧,我也没时间去管那么多了。

接下来就是/etc/ha.d/authkeys。
authkeys文件用于设定Heartbeat的认证方式,共有3种可用的认证方式,即crc、 md5和sha1。3种认证方式的安全性依次提高,但是占用的系统资源也依次增加。如果Heartbeat集群运行在安全的网络上,可以使用crc方式;如果HA每个节点的硬件配置很高,建议使用sha1,这种认证方式安全级别最高;如果是处于网络安全和系统资源之间,可以使用md5认证方式。
我这里直接用crc,只反注释了下面这两行:

# auth 1 
# 1 crc

最后就是/etc/ha.d/haresources
这个文件里面最有文章,大家可以去参考相关文章,我这里只解释我的(最简单的)

node1 172.16.217.200 httpd

其中的node1定义是主机(active host),172.16.217.200是VIP(虚拟IP,也就是真正对外提供服务的IP),httpd也就是httpd服务。

之后,大家就尽情测试吧。呵呵

XBMC中文设置

昨日经大M同学推荐装了一个XBMC,看起来效果还不错,用在电视上应该挺方便的。

但xbmc虽然支持中文,默认却无中文字体。我们就去 /usr/share/xbmc/media/Fonts 里面,把arial.ttf文件替换掉。下面这个命令是直接用系统自带的文驿泉的字体替换了

sudo cp /usr/share/fonts/truetype/wqy/wqy-zenhei.ttc /usr/share/xbmc/media/Fonts/arial.ttf

再提一句,原来版本如果字体体积过大,在播放视频时会出现退出重启XBMC的情况。现在已经修复这个bug了,很好!

(1)启动XBMC后,在主界面选择Settings,进入系统设置;
(2)在系统设置画面选择Appearance,进入用户界面设置;
(3)在屏幕左边选择Look and Feel,然后把Skin Fonts项目设置成arial
(4)在屏幕左边选择Region,然后把Language项目设置成Chinese(Simple)
(5)设置“字符集”为“Chinese Simplified(GBK)”

linux下用tar来进行增量备份

近来无聊,博客又好久没有更新了,权且来说说linux下面的文件备份吧。

备份无非就是全量备份与增量备份。linux下面的全量备份自然不用说,很多命令与软件都能实现;增量备份相对来说软件就要少些,我常用的就是rsync与tar。

rsync与tar相比,rsync的优点在于可以异机备份,缺点在用不能对文件进行压缩。tar的优点就是可以调用bzip2或者gzip进行压缩,但是只限于本机备份。rsync我这里就不多讲了,今天就来说说tar吧

开题不说闲话,其他参数格式我都不说了,说说我们今天要用的参数格式:

tar -g /path/to/info_file -zcvf /path/to/files_need_backup

在这里对info_file
info_file是一个纯文本文件,以UNIX时间记录备份的时间戳。这个文件一般是第一次全备时自动创建,也可以手动创建。如果你手动创建这个文件,那tar就只会备份在这个时间戳之后修改过的文件,所以严格意义上来说,tar的增量备份并不能算做是增量备份,而只是按时间戳备份而已。这点远远比不上rsync。

ok,了解了一下概念,我们正式开始:

$ mkdir dest
$ touch dest/{1,2,3}
$ tar -g /tmp/timestamp -zcvf backup0.tgz dest/
dest/
dest/1
dest/2
dest/3
$ cat /tmp/timestamp
1281096816

由于/tmp/timestamp原来是不存在的,所以这次备份下来的backup0.tgz就是一个全备份文件。备份之后的timestamp文件内容是1281096816。

然后我们继续。这个时候就要记得info_file要继续用上次全备文件之后文件:

$ tar -g /tmp/timestamp -zcvf backup1.tgz dest/
dest/
dest/4
dest/5
dest/6
$ cat /tmp/timestamp
1281097104

我们可以看到,这次生成的backup1.tgz并没有备份还在dest目录下面的文件1, 2, 3,而只备份了新生成的文件4, 5, 6。

然后,我们再来一个测试

$ touch dest/{7,8}
$ date +%s > /tmp/timestamp
$ touch dest/9
$ tar -g /tmp/timestamp -zcvf backup2.tgz dest/
dest/9
$ cat /tmp/timestamp
1281097553

我在创建文件7, 8之后,利用date命令手动刷新了一下info_file的内容,然后再创建了文件9,之后的备份,大家就可以很明显的看到,文件7, 8并没有被备份。

大家应该也就应该看出来了,这就存在一个问题,就是-g做增量备份时的这个info_file到底记录的是什么时刻的时间。大家可以通过实验得到,info_file的更新时间在在.tgz文件之后的,但究竟记录的时间是不是刚刚开始时间呢?

这个我们也可以通过一个小实验来得到:

$ for i in `seq 1 100`; do dd if=/dev/zero of=dest/test$i bs=1M count=10;done
$ date +%s && tar -g /tmp/timestamp -zcf backup3.tgz dest && cat /tmp/timestamp && date +%s
1281098446
1281098523
1281098524

怎么样,很明显了吧。如果直接用这种方式备份的话,那么从你备份开始到备份结束之间生成的文件是不会被备份的

不过,这也难不倒聪明的你吧。嘿嘿。