Grails Plugin for Eclipse 3.6 (Helios)

STS on Eclipse 3.6 | SpringSource Team Bloginstallation instructions(PDF)に、Eclipse 3.6用プラグイン(Snapshot)のサイトが掲載されている。

ただ「SpringSource Update Site for Eclipse 3.6 (Snapshot)」のほうのURLに誤りがあるようなので、
http://dist.springsource.com/snapshot/TOOLS/composite/e3.6/bookmarks.xml
に掲載されている以下のサイトが正しい(bookmarks.xmlを使ってUpdate Siteの設定をしたほうがよい)。

あくまでもsnapshotであって正式リリース版ではないのでご注意のほどを。

Muninのpsプラグインでプロセス数を正確にカウント

Muninにはプロセス数をカウントしてくれるpsプラグインが用意されている。
これを使ってhttpdプロセス数をカウントする場合、手っ取り早くは以下のようにシンボリックリンクを用意してやればよい(CentOS 5.5上でRPMForgeからMuninパッケージをインストールしている場合)。

[root@localhost ~]# ln -s /usr/share/munin/plugins/ps_ /etc/munin/plugins/ps_httpd

この結果発行されるプロセス数確認コマンドは以下のようになる。

pgrep -f -l "httpd" | grep "httpd" | wc -l

しかしこれだけでは、vi httpd.confなどのプロセス分もカウントされてしまうため都合がよくない。
厳密にフルパス(/usr/sbin/httpd)でカウントするためには以下のようにnameパラメータで指定する。

[root@localhost ~]# cat /etc/munin/plugin-conf.d/ps
[ps_httpd]
env.name /usr/sbin/httpd

nameはpgrepでリストする際の引数になるので、厳密なフルパスでのプロセス数がカウントされるはず。

[root@localhost ~]# pgrep -f -l "/usr/sbin/httpd" | grep "/usr/sbin/httpd"
6545 /usr/sbin/httpd
6547 /usr/sbin/httpd
6552 /usr/sbin/httpd
6555 /usr/sbin/httpd
6561 /usr/sbin/httpd
6563 /usr/sbin/httpd
19819 grep /usr/sbin/httpd

おや?これでは途中のgrepコマンド分までカウントされてしまい都合がよくない。さらにregexパラメータで対象を絞り込むことにする。

[root@localhost ~]# cat /etc/munin/plugin-conf.d/ps
[ps_httpd]
env.name /usr/sbin/httpd
env.regex \w\W/usr/sbin/httpd

\w\W部分が先頭のプロセス番号とそのあとの空白にマッチするので、以下のような出力になる。

[root@localhost ~]# pgrep -f -l "/usr/sbin/httpd" | grep "\w\W/usr/sbin/httpd"
6545 /usr/sbin/httpd
6547 /usr/sbin/httpd
6552 /usr/sbin/httpd
6555 /usr/sbin/httpd
6561 /usr/sbin/httpd
6563 /usr/sbin/httpd

これで/usr/sbin/httpdのプロセス数を正確にカウントできるようになる(見落としがあったらゴメンなさい)。

■2010-07-18追記
RPMForgeで提供されているMunin 1.2系列では、以下のチケットで修正が入っている。
#73 (Bug i ps_ plugin on systems using pgrep) - Munin - Trac

そもそも最初のpgrepコマンドで後続のgrep分が出てくるのがおかしいのかとも思うが、パイプ先のファイルハンドルオープンを先におこなっている(=先に起動している)と考えればおかしいとも言い切れない。

ちなみにFedora 13ではpgrep出力に後続grepが含まれなくなっていた。

[root@localhost ~]# pgrep -f -l "/usr/sbin/httpd" | grep "\w\W/usr/sbin/httpd"
7861 grep /w/W/usr/sbin/httpd
[root@localhost ~]# pgrep -f -l "/usr/sbin/httpd"
1540 /usr/sbin/httpd
1664 /usr/sbin/httpd
1665 /usr/sbin/httpd
1666 /usr/sbin/httpd
1667 /usr/sbin/httpd
1668 /usr/sbin/httpd
1669 /usr/sbin/httpd
1670 /usr/sbin/httpd
1671 /usr/sbin/httpd

Fedora 13の場合、Muninがプラグインの修正が入っていることと、pgrepの出力もそもそも違うということで、env.regex指定しなくても正しいプロセス数がカウントできる。

yum-plugin-remove-with-leavesが便利

最近のFedoraではyum-plugin-remove-with-leavesというパッケージを入れると、yumでのremove実行時に--remove-leavesオプションを指定できるようになる。
要は指定したパッケージだけでなく、依存パッケージで不要になる(他に必要とされていない)パッケージも探し出して削除してくれるというもの。
ただ、不用意に使うと本当に必要なものも削除してしまう可能性もあるので、ご利用は慎重に。

mod_auth_kerbでgss_accept_sec_context() failed

Subversionリポジトリへのhttpsアクセス用に、mod_auth_kerbを使ってActive DirectoryのアカウントでのBasic認証を仕掛けたところ、認証要求が返ってこない(WWW-Authenticateヘッダーが返されない)事象に遭遇。
非SSLでのアクセスの場合はきちんと動作する。
Subversionではない、通常のコンテンツに対するhttpsアクセスも問題なし。
モジュールの組み合わせとして整理してみるとこんな感じか?

  • mod_auth_kerb + mod_ssl => OK
  • mod_auth_kerb + authz_svn => OK
  • mod_auth_kerb + authz_svn + mod_ssl => NG

失敗時は/var/log/httpd/ssl_error.logには以下のようなエラーが記録される。

gss_acquire_cred() failed: Unspecified GSS failure.  Minor code may provide more information (No such file or directory)

キャプチャを仕掛けるとそもそもKerberosサーバーに通信にいく気配もない。WWW-Authenticateヘッダーも返ってこないのだから当たり前だが。

はっきりとした原因はわからないが、

KrbMethodNegotiate off

を設定したところ正常に動作するようになった。

Kerberos V4でなにかしら動こうとしていたのだろうか。謎だ Puzzled

"Using DRBD in Heartbeat CRM-enabled clusters"を試してXMLエラー

DRBDのページにあるチュートリアルをdebian sidで試していたらエラーになった。
Using DRBD in Heartbeat CRM-enabled clusters

debian1:~# cibadmin -U -x resources.xml
Call cib_modify failed (-47): Update does not conform to the DTD in /usr/share/heartbeat/crm.dtd
<null>

DTDに違反しているエラーっぽいが、どこの記述がまずいのかわからないのでxmllintで確認。

debian1:~# xmllint --dtdvalid file:///usr/share/heartbeat/crm.dtd resources.xml
resources.xml:5: element nvpair: validity error : Element nvpair does not carry attribute id
resources.xml:6: element nvpair: validity error : Element nvpair does not carry attribute id
resources.xml:13: element nvpair: validity error : Element nvpair does not carry attribute id
resources.xml:16: element operations: validity error : No declaration for attribute id of element operations
resources.xml:31: element nvpair: validity error : Element nvpair does not carry attribute id
resources.xml:32: element nvpair: validity error : Element nvpair does not carry attribute id
resources.xml:33: element nvpair: validity error : Element nvpair does not carry attribute id
resources.xml:41: element nvpair: validity error : Element nvpair does not carry attribute id
resources.xml:42: element nvpair: validity error : Element nvpair does not carry attribute id
Document resources.xml does not validate against file:///usr/share/heartbeat/crm.dtd

XML的にはnvpair要素にそれぞれidを割り付ける必要があるが、cibadminコマンドを経由すると自動で付与されるので無視できる。
問題は16行目のoperations要素で、こちらにはidを付けられないとのこと。
<operations>に変更して無事cibadminにて反映できた。

ZABBIXのデータ収集間隔を最小300秒に一括変更

ZABBIXでのデータ収集間隔はデフォルト5秒といったアイテムもあり、そのまま多数のノード監視に適用するとサーバー負荷が高くなりやすい。
面倒なのでitemsテーブルのdelay値を一括変更した。

# psql zabbix zabbix
Password for user zabbix: ********
psql (8.4.1)
Type "help" for help.

zabbix=> update items set delay=300 where delay<300;
UPDATE 4003
zabbix=> 

これで300秒未満に設定されているデータ収集間隔は全て300秒に変更される。

Fedora 12でのZABBIX PHPエラー

Fedora 12でZABBIXのzabbix-webパッケージをそのまま動かすと、PHPの警告が大量に表示されます。

Function ereg_replace() is deprecated[/usr/share/zabbix/include/page_header.php:398]
get_class() expects parameter 1 to be object, array given[/usr/share/zabbix/include/classes/ctable.inc.php:138]
:

Fedora 12のPHPバージョンが5.3.0なため、将来使えなくなるereg()関数などで警告が表示されているのですが、error_reportingの値を変更しても消すことはできません。
これはZABBIXの中でPHPの標準エラーハンドラーを置き換えているためのようです。
手っ取り早くエラー表示を消すには下記フォーラムに投稿されているように、zbx_err_handlerの呼び出しを抑止する必要があります。
PHP Errors - ZABBIX Forums

CentOSでマルチホームのルーティング設定

マルチホームなLinuxマシンで、受信したNICインターフェース側から応答を返す方法をCentOS 5.4で実装する方法です。

複数のアップリンク/プロバイダに対するルーティング
として例示される設定を、スクリプトではなくCentOSの設定ファイルで記述してみます。

上記例でのポイントはip route addコマンドの実行とip rule addコマンドの実行です。
Fedora等のRed Hat系ではNICインターフェースのアップ時(/sbin/ifupコマンド実行時)に、/etc/sysconfig/network-scripts配下のifup-ethやifup-routesコマンドが呼びだされます。

ifup-routesスクリプトを眺めてみると、routes-eth*やrules-eth*を記述しておくとその内容を引数にしてそれぞれip route addとip rule addを実行してることがわかります。

この方法のよいところはifdown実行時にifdown-routesスクリプトでルールの削除処理(ip rule del)もおこなってくれるところです。

構成

ネットワーク構成

                     +------------+       +----------
                     |            |       |
       +-------------+ Provider 1 +-------+
       |             |            |       |
+------+-------+     +------------+       |
|     eth1     |                          |
|              |                          |
| Linux router |                          | Internet
|              |                          |
|     eth2     |                          |
+------+-------+     +------------+       |
       |             |            |       |
       +-------------+ Provider 2 +-------+
                     |            |       |
                     +------------+       +----------

Provider 1構成

  • N/W アドレス: 192.0.2.0/25
  • Linux IPアドレス: 192.0.2.1
  • Provider1 IPアドレス: 192.0.2.126

Provider 2構成

  • N/W アドレス: 192.0.2.128/25
  • Linux IPアドレス: 192.0.2.129
  • Provider1 IPアドレス: 192.0.2.254

設定内容

/etc/iproute2/rt_tablesの末尾にテーブルを追加。

200 Provider1
201 Provider2

/etc/sysconfig/network-scripts/routes-eth1

192.0.2.0/25 dev eth1 src 192.0.2.1 table Provider1
default via 192.0.2.126 table Provider1
192.0.2.0/25 dev eth1 src 192.0.2.1

/etc/sysconfig/network-scripts/routes-eth2

192.0.2.128/25 dev eth2 src 192.0.2.129 table Provider2
default via 192.0.2.254 table Provider2
192.0.2.128/25 dev eth2 src 192.0.2.129

/etc/sysconfig/network-scripts/rules-eth1

from 192.0.2.1 table Provider1

/etc/sysconfig/network-scripts/rules-eth2

from 192.0.2.129 table Provider2

defaultルートは/etc/sysconfig/network-scripts/ifcfg-eth*のどちらかにGATEWAYを設定すればOKです。

一点気になるのは、/etc/sysconfig/network-scripts/ifup-routesスクリプトでip route addコマンドの引数をそのまま記述する方式は"older format"とコメントされていることです。
もしかしたら近い将来使えなくなるのかも知れませんが、Fedora 12ではまだ使えるようなのでしばらくは大丈夫でしょう Sticking out tongue

ESXi 4.0でのSNMP有効化

ESXi 4.0を評価モードで利用し、SNMPを有効にしてみる。
以下、ESXiのIPアドレスは192.0.2.1、SNMPトラップを受信するサーバーのIPアドレスは192.0.2.2の場合の例。

# vicfg-snmp --server 192.0.2.1 --username root -E -c public -t 192.0.2.2@162/public
Enter password: 
# vicfg-snmp --server 192.0.2.1 --username root -s
Enter password:
Current SNMP agent settings:
Enabled  : 1
UDP port : 161

Communities :
public

Notification targets :
192.0.2.2@162/public

トラップをテスト送信してみる。

# vicfg-snmp --server 192.0.2.1 --username root -T
Enter password:
Sending test nofication(trap) to all configured targets...
Complete. Check with each target to see if trap was received.

192.0.2.2のサーバーではsnmptrapdが動作済みで、/var/log/messagesに以下が記録された。

Oct  8 23:32:37 192.0.2.2 snmptrapd[9386]: 2009-10-08 23:32:37 192.0.2.1(via UDP: [10.0.0.1]:51469) TRAP, SNMP v1, community public  SNMPv2-
SMI::enterprises.6876.4.1 Warm Start Trap (0) Uptime: 15:31:50.16

snmpwalkをやってみるとこんな感じ(マシンはHP ML115 G5)。

# snmpwalk -v 1 -c public 192.0.2.1 .
SNMPv2-MIB::sysDescr.0 = STRING: VMware ESX 4.0.0 build-171294 VMware, Inc. x86_64
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.6876.4.1
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (154208) 0:25:42.08
SNMPv2-MIB::sysContact.0 = STRING: not set
SNMPv2-MIB::sysName.0 = STRING: localhost.localdomain
SNMPv2-MIB::sysLocation.0 = STRING: not set
SNMPv2-MIB::sysServices.0 = INTEGER: 72
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORID.1 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.2 = OID: IF-MIB::ifMIB
SNMPv2-MIB::sysORID.3 = OID: SNMPv2-SMI::enterprises.6876.1.10
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-SMI::enterprises.6876.2.10
SNMPv2-MIB::sysORID.5 = OID: SNMPv2-SMI::enterprises.6876.3.10
SNMPv2-MIB::sysORDescr.1 = STRING: SNMPv2-MIB, RFC 3418
SNMPv2-MIB::sysORDescr.2 = STRING: IF-MIB, RFC 2863
SNMPv2-MIB::sysORDescr.3 = STRING: VMWARE-SYSTEM-MIB, REVISION 200801120000Z
SNMPv2-MIB::sysORDescr.4 = STRING: VMWARE-VMINFO-MIB, REVISION 200810230000Z
SNMPv2-MIB::sysORDescr.5 = STRING: VMWARE-RESOURCES-MIB, REVISION 200810150000Z
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (0) 0:00:00.00
IF-MIB::ifNumber.0 = INTEGER: 1
IF-MIB::ifDescr.1 = STRING: Device vmnic0 at 11:00.0 tg3
IF-MIB::ifType.1 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifMtu.1 = INTEGER: 1500
IF-MIB::ifSpeed.1 = Gauge32: 100000000
IF-MIB::ifPhysAddress.1 = STRING: 0:21:5a:eb:3b:d0
IF-MIB::ifAdminStatus.1 = INTEGER: up(1)
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
IF-MIB::ifLastChange.1 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::snmpInPkts.0 = Counter32: 342
SNMPv2-MIB::snmpInBadVersions.0 = Counter32: 0
SNMPv2-MIB::snmpInBadCommunityNames.0 = Counter32: 0
SNMPv2-MIB::snmpInBadCommunityUses.0 = Counter32: 0
SNMPv2-MIB::snmpInASNParseErrs.0 = Counter32: 0
SNMPv2-MIB::snmpEnableAuthenTraps.0 = INTEGER: disabled(2)
SNMPv2-MIB::snmpSilentDrops.0 = Counter32: 0
SNMPv2-MIB::snmpProxyDrops.0 = Counter32: 0
SNMPv2-SMI::enterprises.6876.1.1.0 = STRING: "VMware ESXi"
SNMPv2-SMI::enterprises.6876.1.2.0 = STRING: "4.0.0"
SNMPv2-SMI::enterprises.6876.1.4.0 = STRING: "171294"
SNMPv2-SMI::enterprises.6876.2.1.1.2.16 = STRING: "centos5.localdomain"
SNMPv2-SMI::enterprises.6876.2.1.1.3.16 = STRING: "/vmfs/volumes/4ace6c4c-99080d8b-93fc-00215aeb3bd0/centos53/centos53.vmx"
SNMPv2-SMI::enterprises.6876.2.1.1.4.16 = STRING: "rhel5-64"
SNMPv2-SMI::enterprises.6876.2.1.1.5.16 = INTEGER: 512
SNMPv2-SMI::enterprises.6876.2.1.1.6.16 = STRING: "poweredOn"
SNMPv2-SMI::enterprises.6876.2.1.1.7.16 = INTEGER: 16
SNMPv2-SMI::enterprises.6876.2.1.1.8.16 = STRING: "running"
SNMPv2-SMI::enterprises.6876.2.1.1.9.16 = INTEGER: 1
SNMPv2-SMI::enterprises.6876.2.2.1.3.16.1000 = STRING: "scsi0"
SNMPv2-SMI::enterprises.6876.2.2.1.4.16.1000 = STRING: "PN5Vmomi4TypeE"
SNMPv2-SMI::enterprises.6876.2.3.1.3.16.2000 = STRING: "scsi0:0"
SNMPv2-SMI::enterprises.6876.2.4.1.3.16.4000 = STRING: "ethernet0"
SNMPv2-SMI::enterprises.6876.2.4.1.4.16.4000 = STRING: "VM Network"
SNMPv2-SMI::enterprises.6876.2.4.1.5.16.4000 = STRING: "monitor_dev"
SNMPv2-SMI::enterprises.6876.2.4.1.6.16.4000 = STRING: "true"
SNMPv2-SMI::enterprises.6876.2.4.1.7.16.4000 = Hex-STRING: 00 0C 29 77 63 B6
SNMPv2-SMI::enterprises.6876.2.6.1.3.16.3002 = STRING: "/vmfs/devices/genscsi/mpx.vmhba2:C0:T0:L0"
SNMPv2-SMI::enterprises.6876.2.6.1.4.16.3002 = STRING: "false"
SNMPv2-SMI::enterprises.6876.3.1.1.0 = Gauge32: 1
SNMPv2-SMI::enterprises.6876.3.2.1.0 = Gauge32: 4189816
SNMPv2-SMI::enterprises.6876.3.2.2.0 = Gauge32: 0
SNMPv2-SMI::enterprises.6876.3.2.3.0 = Gauge32: 4189816
SNMPv2-SMI::enterprises.6876.3.5.1.0 = INTEGER: 6
SNMPv2-SMI::enterprises.6876.3.5.2.1.2.1 = STRING: "vmhba0"
SNMPv2-SMI::enterprises.6876.3.5.2.1.2.2 = STRING: "vmhba1"
SNMPv2-SMI::enterprises.6876.3.5.2.1.2.3 = STRING: "vmhba2"
SNMPv2-SMI::enterprises.6876.3.5.2.1.2.4 = STRING: "vmhba32"
SNMPv2-SMI::enterprises.6876.3.5.2.1.2.5 = STRING: "vmhba33"
SNMPv2-SMI::enterprises.6876.3.5.2.1.2.6 = STRING: "vmhba34"
SNMPv2-SMI::enterprises.6876.3.5.2.1.3.1 = INTEGER: 0
SNMPv2-SMI::enterprises.6876.3.5.2.1.3.2 = INTEGER: 0
SNMPv2-SMI::enterprises.6876.3.5.2.1.3.3 = INTEGER: 0
SNMPv2-SMI::enterprises.6876.3.5.2.1.3.4 = INTEGER: 0
SNMPv2-SMI::enterprises.6876.3.5.2.1.3.5 = INTEGER: 0
SNMPv2-SMI::enterprises.6876.3.5.2.1.3.6 = INTEGER: 0
SNMPv2-SMI::enterprises.6876.3.5.2.1.4.1 = INTEGER: 1
SNMPv2-SMI::enterprises.6876.3.5.2.1.4.2 = INTEGER: 1
SNMPv2-SMI::enterprises.6876.3.5.2.1.4.3 = INTEGER: 1
SNMPv2-SMI::enterprises.6876.3.5.2.1.4.4 = INTEGER: 1
SNMPv2-SMI::enterprises.6876.3.5.2.1.4.5 = INTEGER: 1
SNMPv2-SMI::enterprises.6876.3.5.2.1.4.6 = INTEGER: 1
SNMPv2-SMI::enterprises.6876.3.5.2.1.5.1 = STRING: "MCP55 SATA Controller"
SNMPv2-SMI::enterprises.6876.3.5.2.1.5.2 = STRING: "MCP55 SATA Controller"
SNMPv2-SMI::enterprises.6876.3.5.2.1.5.3 = STRING: "MCP55 SATA Controller"
SNMPv2-SMI::enterprises.6876.3.5.2.1.5.4 = STRING: "MCP55 SATA Controller"
SNMPv2-SMI::enterprises.6876.3.5.2.1.5.5 = STRING: "MCP55 SATA Controller"
SNMPv2-SMI::enterprises.6876.3.5.2.1.5.6 = STRING: "MCP55 SATA Controller"
SNMPv2-SMI::enterprises.6876.3.5.2.1.6.1 = STRING: "sata_nv"
SNMPv2-SMI::enterprises.6876.3.5.2.1.6.2 = STRING: "sata_nv"
SNMPv2-SMI::enterprises.6876.3.5.2.1.6.3 = STRING: "sata_nv"
SNMPv2-SMI::enterprises.6876.3.5.2.1.6.4 = STRING: "sata_nv"
SNMPv2-SMI::enterprises.6876.3.5.2.1.6.5 = STRING: "sata_nv"
SNMPv2-SMI::enterprises.6876.3.5.2.1.6.6 = STRING: "sata_nv"
SNMPv2-SMI::enterprises.6876.3.5.2.1.7.1 = STRING: "00:05.0"
SNMPv2-SMI::enterprises.6876.3.5.2.1.7.2 = STRING: "00:05.1"
SNMPv2-SMI::enterprises.6876.3.5.2.1.7.3 = STRING: "00:05.2"
SNMPv2-SMI::enterprises.6876.3.5.2.1.7.4 = STRING: "00:05.0"
SNMPv2-SMI::enterprises.6876.3.5.2.1.7.5 = STRING: "00:05.1"
SNMPv2-SMI::enterprises.6876.3.5.2.1.7.6 = STRING: "00:05.2"
End of MIB

zabbix-server-mysqlパッケージの起動不具合

zabbix-server-mysqlパッケージのzabbix-serverがboot時に起動しない。
ログをみるとmysqlに接続できずにエラーとなっている。

Connection to database 'zabbix' failed: [2002] Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

原因はrcスクリプトの起動順序指定。runlevel Sの時点ではmysqlは起動していない。

### BEGIN INIT INFO
# Provides:          zabbix-server
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Start zabbix-server daemon
### END INIT INFO

こちらをmysql前提に変更し(Required-Start/Required-Stop)、起動、停止するrunlevelもmysqlに合わせて解決。

### BEGIN INIT INFO
# Provides:          zabbix-server
# Required-Start:    mysql
# Required-Stop:     mysql
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start zabbix-server daemon
### END INIT INFO