How to remove the read failed after 0 of 4096 I/O error

from: https://freeshell.de/~jose/317/kludges/how-to-temove-the-read-failed-after-0-of-4096-io-error/

Recently in a very old server I had to remove a disk. My server was composed by two physical volumes: a RAID5 volume, shown as /dev/sda to the operating system by the SCSI controller, and a single hard disk as /dev/sdb.

My /dev/sdb, since there is no way to have a new disk with the same geometry, I decided to remove it.
The bios utility of my SCSI controller is quite strange and I cannot remove my une-disk logical volume without remove all the configuration.

root@arch:~# pvdisplay
  /dev/sdb: read failed after 0 of 4096 at 0: input/output Error
  /dev/sdb: read failed after 0 of 4096 at 146695716864: input/output Error
  /dev/sdb: read failed after 0 of 4096 at 146695774208: input/output Error
  /dev/sdb: read failed after 0 of 4096 at 4096: input/output Error
  — Physical volume —
  PV Name               /dev/sda1
  VG Name               vg_system
  PV Size               838,12 GiB / not usable 2,00 MiB
  Allocatable           yes
  PE Size               4,00 MiB
  Total PE              214559
  Free PE               21184
  Allocated PE          193375
  PV UUID               ZQQwAs-yGgP-LZXk-3cTy-yaOb-gijr-bnUCz4

So I’d better to leave my controller untouched and tell my linux CentOS to forget the /dev/sdb disk.

root@arch:~# echo 1 > /sys/block/sdb/device/delete

在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服务。

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

CentOS下面不能更改时区?

今天碰到了一个很奇怪的问题,好好的,我在一个CentOS下面居然改不了时区。

先是直接按老办法修改/etc/localtime,结果没用,接着,又修改/etc/sysconfig/clock文件,还是没用。

接着用system-config-time命令进行修改,居然都没有用。。。

怀疑缓存问题(我居然会想到这个,蠢透了),重启机器,还是没用。。。

后来想起来一个专门调节时区的命令:tzselect,试了试,依然没有用。

不过,突然发现有这么一行信息:

You can make this change permanent for yourself by appending the line
TZ='Europe/Mariehamn'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

在想,会不会是TZ这个变量在做怪,重新登陆了系统,发现这台机器上的TZ变量居然已经设置好了,对比正确的机器,这个值应该是空的。于是,清空了这个值,前面的修改就可以生效了。

最后检查了一下原因,不知道什么时候有人添加了这个文件:

/etc/profile.d/tz.sh

将这个文件删除,一切都OK!

NIS详解[转]

来源:http://linux.chinaunix.net/bbs/viewthread.php?tid=78260&extra=page%3D3%26amp%3Bfilter%3Ddigest

网络信息服务(NIS)是集中控制几个系统管理数据库的网络用品。NIS简化了UNIX和LINUX桌面客户的管理工作,客户端利用它可以使用中心服务器的管理文件。桌面系统的用户无需建立他们自己的/etc/passwd,他们只简单的使用维护在NIS服务器的文件即可。

提到NIS不得不先说明一下WINDOWS2000的域控制器,在局域网内有一台WIN2000域控制器,下面有一些机器加入到这个域中,在下的机器登录时,有一个选项是选择登入到本机还时登入到域内(应该是这么说的,有点记不清楚了,大概就是这个了),登入本地的密码有本机控制,但是如果登入域内,密码支有域控制器负责管理。
LINUX也是操作系统,跟WIN2000没有本质的区别,所以仔细读上段话,就能理解NIS是原理是什么样了,这时出现了一个重要的文件/etc/nsswitch.conf

NIS是一个客户机/服务器系统,ypbind是定义NIS服务器的客户端进程。一旦确定了服务器位置,客户机绑定到了服务器上,所以客户端的住处查询都发往服务器。ypserv是回答客户端查询的服务器进程。
Read More »

CentOS下安装与配置nagios系统状态监控软件

这个东西以前装一个一次,但是中间没什么时间,也没怎么弄明白。前些天,要为公司架一个服务状态监控,这才又把这个捡起来了。

安装环境:CentOS 5.2 x86(只安装based systeam),无iptables,无SELinux
软件包:
nagios-3.0.3.tar.gz
nagios-plugins-1.4.12.tar.gz
check_snmp_plugins.tar.gz

安装httpd

yum install -y httpd

安装nagios

useradd nagios
tar -xvf nagios-3.0.3.tar.gz
cd nagios-3.0.3
./configure
make all
make install
make install-init
make install-commandmode
make install-config
make install-webconf

安装nagios-plugins
这个安装也不能,常规,只是记得装上net-snmp-devel之后才开始编绎

yum install net-snmp-devel

其他就简单了

./configure
make
make install

配置nagios管理系统
创建nagios管理帐户

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

管理帐户是apache用户,然后在/usr/local/nagios/etc/cgi.cfg中配置
主要是下面几项,帐户之间用逗号(,)隔开

authorized_for_system_information=nagiosadmin
authorized_for_configuration_information=nagiosadmin
authorized_for_system_commands=nagiosadmin
authorized_for_all_services=nagiosadmin
authorized_for_all_hosts=nagiosadmin
authorized_for_all_service_commands=nagiosadmin
authorized_for_all_host_commands=nagiosadmin

主配置文件
一直觉得nagios很烦,就是目前好像还没有听说他有什么插件可以通过web或者图形界面可以直观的添加服务或者主机,一切都要通过修改配置文件来实现。
nagios的主配置文件是/usr/local/nagios/etc/nagios.cfg,,配置完毕之一,可以用这个命令进行配置检查。

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

这个检查还是不错的,会具体告诉你是在哪个文件哪一行开始出错的,方便修改。

这个配置文件的说明很详细,基本上不用我怎么解释,我这就是说几个关键的地方
1. 指定包含的文件,差不多相当于apache配置文件里面的Include

cfg_file=/path/to/file

2.指定放置配置文件的目录,这个目录里面所有的文件都会被加载到nagios配置里面

cfg_dir=/path/

3.状态检查的时间间隔,单位为秒,默认是10秒。

status_update_interval=10

4.开启外部命令,建议打开,因为几乎所有的命令都是外面命令

check_external_commands=1

5.设置外部命令检查的时间间隔,默认单位是分钟,可以在数字后面加上一个s代表秒,设置成-1让其自行决定什么时候检查(官方的说法是as often as possible)

command_check_interval=-1

CentOS下配置PXE+Kickstart无人值守安装(Howto install CentOS through PXE+KickStart)

环境:CentOS 5.1 最小安装。

理论

来源:http://coolerfeng.blog.51cto.com/133059/48801

什么是PXE
PXE(Pre-boot Execution Environment)是由Intel设计的协议,它可以使计算机通过网络启动。协议分为client和server两端,PXE client在网卡的ROM中,当计算机引导时,BIOS把PXE client调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。

PXE协议的成功运行需要解决以下两个问题:
1. 既然是通过网络传输,那么计算机在启动时,它的IP地址由谁来配置;
2. 通过什么协议下载Linux内核和根文件系统

对于第一个问题,可以通过DHCP Server解决,由DHCP server来给PXE client分配一个IP地址,DHCP Server是用来给DHCP Client动态分配IP地址的协议,不过由于这里是给PXE Client分配IP地址,所以在配置DHCP Server时,需要增加相应的PXE特有配置。
至于第二个问题,在PXE client所在的ROM中,已经存在了TFTP Client。PXE Client使用TFTP Client,通过TFTP协议到TFTP Server上下载所需的文件。

这样,PXE协议运行的条件就具备了,下面我们就来看看PXE协议的工作过程。
Read More »

OpenVPN搭建VPN实战

系统环境:CentOS 5.1(最小安装) * 4
网络拓朴:
network.JPG
达成目标:让处于外网VPN Client (PC1)以他的subnet能够访问服务器的内网段10.0.2.0/24。
Read More »

在CentOS5.1下安装SquirrelMail出现”(13 : Permission denied)”

如图:
1

百思不得其解,实在我的IMAP工作是正常的,而且我用thunderbird也可以连接上

监看/var/log/maillog时发现,squirrelmail在登陆时,log并不记录

临看/var/log/message时,发现这个时候写入了这么一条记录

kernel: audit(1208928634.263:213): avc:  denied  { name_connect } for  pid=12046 comm="httpd" dest=143 scontext=root:system_r:httpd_t:s0 tcontext=system_u:object_r:pop_port_t:s0 tclass=tcp_socket

可见这个登陆信息并没有提交到IMAP。

于是,google下面关键词:

squirrelmail 13  Permission denied

找到这么一解决方法:
原来是要输入这么一条命令:

setsebool -P httpd_can_network_connect=1

原来又是SELinux的权限问题
现在的SELinux异常强大啊
以后,没事还是学学SELinux,呵呵

另外,还是一句老话,建议所有的新手在学习还是禁用iptables与SELinux,减少一个故障点
不过,好像chkconfig iptables off 这个命令在CentOS或者RHEL 5.1里面都不生效了
每次我都要把iptables remove才会有效果。。。