momo zone

调核人的blog

关于各种watchdog

这篇东西本该早些记录的,由于事情太多拖到现在…….    本篇和内核中的nmi_watchdog无关

从硬件上说watchdog 分为ipmi watchdog, superio watchdog, iTCO watchdog

最复杂的是ipmi watchdog 这个最后讲。

superio watchdog:

superio其实就是负责以往过时的ps/2, 串口,并口等接口io的芯片。因为这些接口在最近10年的南桥芯片里不再集成,所以只有台湾人发挥聪明才智搞出来了superio芯片,这枚芯片通过GPIO与南桥相连。然而这枚芯片不旦集成了这些老旧的接口还集成watchdog。可以说superio watchdog是最常见的watchdog,尤其是w83627这枚芯片上的。

就拿w83627举例子吧。

也许板卡厂商会发给你一份w83627的datasheet,上面有watchdog的设定方法,就是用读写端口的方法 in(), out() 来读写指定端口。其实对于大部分的superio watchdog都不用自己写代码。而只需要载入对应的驱动模块即可:

# modinfo w83627hf_wdt
filename: /lib/modules/2.6.34.12_2.19_120525/kernel/drivers/watchdog/w83627hf_wdt.ko
alias: char-major-10-130
description: w83627hf/thf WDT driver
author: P�draig Brady <P@draigBrady.com>
license: GPL
srcversion: 86345BC119DCE658FD6407C
depends:
vermagic: 2.6.34.12_2.19_120525 SMP mod_unload modversions
parm: wdt_io:w83627hf/thf WDT io port (default 0x2E) (int)
parm: timeout:Watchdog timeout in seconds. 1 <= timeout <= 255, default=60. (int)
parm: nowayout:Watchdog cannot be stopped once started (default=0) (int)

载入成功后:

[ 1237.355215] WDT driver for the Winbond(TM) W83627HF/THF/HG Super I/O chip initialising.
[ 1237.355294] w83627hf/thf/hg WDT: initialized. timeout=60 sec (nowayout=0)

#cat /proc/ioports

0000-03af : PCI Bus 0000:00
0000-001f : dma1
0020-0021 : pic1
002e-002e : w83627hf/thf/hg WDT
0040-0043 : timer0
0050-0053 : timer1

# ll /dev/watchdog
crw——- 1 root root 10, 130 Dec 4 22:08 /dev/watchdog

看到这个设备文件就算成功了。其实驱动程序内部把各种watchdog抽象了一个设备,操作这个文件将执行对应的ioctl,不同的ioctl对应不同的io操作而已。也就是说只要加载了对应的watchdog驱动(不管是superio的,还是ipmi的,或是iTCO)就会出现这个设备文件。现在该考虑如何在用户层操作了。这里也不需要自己写代码,因为有人已经写过了:http://www.ibiblio.org/pub/linux/system/daemons/watchdog/

配置文件在/etc/watchdog.conf  最后一行

watchdog-timeout = 5 表示watchdog timer的超时时间。

然后直接键入watchdog 开始启动。

iTCO watchdog:

和superio差不多,但这个是intel自家的,集成了南桥里面。

#cat /proc/ioports

0800-087f : pnp 00:08
          0800-0803 : ACPI PM1a_EVT_BLK
          0804-0805 : ACPI PM1a_CNT_BLK
          0808-080b : ACPI PM_TMR
          0810-0815 : ACPI CPU throttle
          0828-082f : ACPI GPE0_BLK
          0830-0833 : iTCO_wdt
          0860-087f : iTCO_wdt

加载完iTCO_wdt 也会出现/dev/watchdog,用户层次的操作就都一样了。

ipmi watchdog:

ipmi watchdog 稍微复杂一些。因为ipmi有自己的规范,或者说有自己的一套管理工具(freeimpi 和 openipmi)。所以除了使用/dev/watchdog设备文件来访问,也能使用其他众多的工具来操作。先说一下用设备文件的方法。

首先系统要有载入这些模块

lsmod |grep ipmi
ipmi_devintf 7073 0
ipmi_si 37564 1
ipmi_watchdog 15801 0
ipmi_msghandler 33151 3 ipmi_devintf,ipmi_si,ipmi_watchdog

其中ipmi_watchdog 是ipmi watchdog的驱动模块,供用户层的watchdog 来访问。 ipmi_devintf 和ipmi_si 则是抽象出一个ipmi层的管理设备  /dev/ipmi0 。然后就和之前一样启用watchdog进程即可。同时还可以安装ipmitool来观察当前的watchdog状态:

# ipmitool mc watchdog get
Watchdog Timer Use: SMS/OS (0x04)
Watchdog Timer Is: Stopped
Watchdog Timer Actions: No action (0x00)
Pre-timeout interval: 0 seconds
Timer Expiration Flags: 0x10
Initial Countdown: 10 sec
Present Countdown: 10 sec

除上述方法外还有另外一套用户态的ipmi watchdog工具集:freeipmi-bmc-watchdog。 比较另类的是它要求从底层对ipmi设备独占。也就是说它要求卸载所有ipmi的内核模块。然后可以用bmc-watchdog -g 来查看状态:

# bmc-watchdog -g
Timer Use: SMS/OS
Timer: Stopped
Logging: Enabled
Timeout Action: None
Pre-Timeout Interrupt: None
Pre-Timeout Interval: 0 seconds
Timer Use BIOS FRB2 Flag: Clear
Timer Use BIOS POST Flag: Clear
Timer Use BIOS OS Load Flag: Clear
Timer Use BIOS SMS/OS Flag: Set
Timer Use BIOS OEM Flag: Clear
Initial Countdown: 10 seconds
Current Countdown: 10 seconds

wathcdog用户态访问由bmc-watchdog 程序处理:

bmc-watchdog -d -u 4 -p 0 -a 1 -F -P -L -S -O -i 900 -e 60

或者由/etc/rc.d/init.d/freeipmi-bmc-watchdog 脚本启动守护进程管理,配置文件在/etc/sysconfig/freeipmi-bmc-watchdog。

 

 

注意:watchdog的用户进程被kill的默认信号kill时,会先停止watchdog timer。 

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: