2月 202012
 

それにしても ports で提供されている snmpd、つまりは net-mgmt/net-snmp なんですけども、最近のバージョンはあまりにひどすぎる。エラーログを延々とはき続けているは、CPU 食いまくっているわでロクなモンじゃない。いい加減使うのイヤになって来た。

で、思いついたのが bsnmpd。FreeBSD に標準で付加されるようになった snmpd なんだけども、やっぱり net-snmp があまりにもヒサンなので「自前で持ってしまえーっ!!」ってんで開発が始まったのかなぁ?経緯は知らないんですけども。

と、いうことで今回は net-snmp を利用するのをやめて、bsnmpd を利用することにしたのですが、その顛末を書いてみたいと思います。まず、最初に書いてしまいますが、僕的には net-snmp の代用に十分になることが確認できました。なので自宅のサーバは bsnmpd を稼働するようにしました。

まず、はじめの手順ですが、 ports からインストールする net-mgmt/net-snmp を停止します。ただし、snmpd を停止するのみで pkg_delete はしませんでした。snmpwalk は利用したいしねー。みたいな感じです。そしてその後、bsnmpd を起動するように /etc/rc.conf に以下の設定を追加します。

bsnmpd_enable="YES"

 
が、その前に /etc/snmpd.config の設定があるんですね。

あ。今回利用した FreeBSD のバージョンは 9.0-STABLE です。 /etc/snmpd.config の設定自体は SNMPv3 や ACL に対応したようでずいぶんと長くなりました。が、要らない部分も多いのでサクっと消して起動。って感じです。
あと、ports 的には net-mgmt/bsnmp-ucd もインストールしておきましょう。これ重要です;-)。

でもって今回は以下のポリシで設定してみました。

・ネットワークインターフェースからトラフィック情報を取得します。
・ただし snmp_netgraph.so や snmp_bridge.so 、 snmp_wlan.so などのモジュールは利用しません。
・SNMPv1・v2c でアクセスします。
・プライベートアドレスからのアクセスのため ACL は設定しません。
・Read な MIB のみを参照します。

設定はそんなに苦痛ではなかったですね。 /etc/snmpd.config の default の設定では基本的に system とか if MIB の情報しか取れないので ports でインストールした net-mgmt/bsnmp-ucd がディスク・メモリ・ロードアベレージと、net-snmp の exec にも対応してくれます。すごいっ!!

porst の net-mgmt/bsnmp-ucd をインストールすると /usr/local/share/examples/bsnmp-ucd/snmpd.config.sample がインストールされるので、これを編集して /etc/snmpd.config で include するか /etc/snmpd.config に直接書いてしまうのが手っ取り早いです。

以下は僕が設定した /etc/snmpd.config になります。

1  # Set some common variables
2  location := "FreeBSD World."
3  contact  := "takachan@running-dog.net"
4  system   := 1   # FreeBSD
5  read     := "HelloWorld"
6
7  # Declarations for SNMP-USER-BASED-SM-MIB
8  NoAuthProtocol          := 1.3.6.1.6.3.10.1.1.1
9  HMACMD5AuthProtocol     := 1.3.6.1.6.3.10.1.1.2
10  HMACSHAAuthProtocol     := 1.3.6.1.6.3.10.1.1.3
11  NoPrivProtocol          := 1.3.6.1.6.3.10.1.2.1
12  DESPrivProtocol         := 1.3.6.1.6.3.10.1.2.2
13  AesCfb128Protocol       := 1.3.6.1.6.3.10.1.2.4
14
15  # Enumerations from SNMP-FRAMEWORK-MIB
16  securityModelAny        := 0
17  securityModelSNMPv1     := 1
18  securityModelSNMPv2c    := 2
19  securityModelUSM        := 3
20
21  # Message Processing models
22  MPmodelSNMPv1           := 0
23  MPmodelSNMPv2c          := 1
24  MPmodelSNMPv3           := 3
25
26  # Security levels
27  noAuthNoPriv := 1
28  authNoPriv := 2
29  authPriv := 3
30
31  # Configuration
32  %snmpd
33  begemotSnmpdDebugDumpPdus       = 2
34  begemotSnmpdDebugSyslogPri      = 7
35
36  begemotSnmpdCommunityString.0.1 = $(read)
37  begemotSnmpdCommunityDisable    = 1
38
39  # open standard SNMP ports
40  begemotSnmpdPortStatus.0.0.0.0.161 = 1
41
42  # open a unix domain socket
43  begemotSnmpdLocalPortStatus."/var/run/snmpd.sock" = 1
44  begemotSnmpdLocalPortType."/var/run/snmpd.sock" = 4
45
46  sysContact      = $(contact)
47  sysLocation     = $(location)
48  sysObjectId     = 1.3.6.1.4.1.12325.1.1.2.1.$(system)
49
50  # Load MIB-2 module
51  begemotSnmpdModulePath."mibII"  = "/usr/lib/snmp_mibII.so"
52
53  # bsnmp-ucd (8)
54  begemotSnmpdModulePath."ucd" = "/usr/local/lib/snmp_ucd.so"
55  %ucd
56  memMinimumSwap = 1600
57  memSwapErrorMsg = "No free swap!"
58
59  laConfig.1 = "6.0"
60  laConfig.2 = "5.0"
61  laConfig.3 = "4.0"
62
63  laErrMessage.1 = "1min load average is high!"
64  laErrMessage.2 = "5min load average is high!"
65  laErrMessage.3 = "15min load average is high!"
66
67  # Process table
68  prNames.1 = "sendmail"
69  prMin.1 = 1
70  prMax.1 = 3
71  prNames.2 = "httpd"
72  prMin.2 = 3
73  prMax.2 = 100
74
75  # Extension commands (extTable)
76  extNames.1   = "CPUTemp"
77  extCommand.1 = "/usr/local/bin/cputz.sh CPU"
78  extNames.2   = "HDDTemp"
79  extCommand.2 = "/usr/local/bin/cputz.sh HDD"
80  extNames.3   = "CPUAUTO"
81  extCommand.3 = "/usr/local/bin/cpuspeed.sh AUTO"
82  extNames.4   = "CPUFULL"
83  extCommand.4 = "/usr/local/bin/cpuspeed.sh FULL"

 
default の部分を残してある設定もありますが、ほぼ不要と思われる設定を消しました。そして、

・54 行目で /usr/local/lib/snmp_ucd.so をロードしています。
・56 行目はメモリの設定
・63 行目は CPU ロードアベレージの設定
・68 行目でプロセス数の設定。今回は .1 で sendmail 、 .2 で httpd の数を取得することにしました。
・76 行目以降は net-snmp の exec に相当する機能です。僕の場合は CPU 温度と CPU 速度を返すスクリプトを呼ぶようにしています。

こんな感じで記述して後は /etc/rc.d/bsnmpd start とかして起動すれば OK です。

net-snmp をインストールしていると snmpwalk があるのですが、削除してしまった場合には net-mgmt/bsnmptools をインストールするとそれに対応するコマンドがインストールされます。僕の場合、クライアントは net-snmp のを利用するので動作確認はしていませんが;-)。

デーモンである bsnmpd を利用した感じですが、net-snmp の snmpd より軽いですね。 CPU 負荷が低い。あと、要らんログが出力されないのも良い。それでいて net-snmp のと同等機能で動作するのでこれまた良い感じです。

ただ、一点だけ。bsnmpd を起動して netstat -a で確認してみると udp6 のポートが空いてないんですね。と、いうことは bsnmpd は IPv6 に対応してないのかなぁ? という気がちょっとしています。オプションを調べても IPv6 のが無いですし・・。あ。ソースコードは読んでないです;-)。

と、いうことで、いいかげん嫌気がさしてきた net-snmp を置き換えて利用する bsnmpd ですが、今のところは十分に利用可能だと思われます。サーバ系では特に。情報収集のためのデーモンが一番 CPU を消費していてもらっては困りますしねX-|。

2月 142012
 

僕は普段から KDE4 使いなんだけども、KDE4 を利用しているとターミナルソフトといういうのは必然的に konsole になるわけであります。

しかし、もう何回もこのブログに書いているんですが、 konsole というのは一個のプロセスが起動して、何個も konsole の画面を開いても一個のプロセスで動作する。つまり、表示される konsole のウィンドはスレッドとして動作しているんですな。

これがまたあーた。一個の konsole ウィンドが変な挙動をするとそのプロセスがおかしくなるということで、表示されている全ての konsole のウィンドはスレッドで動作しているんだけども、それら全てを道連れにお亡くなりになる、もしはフリーズしてしまう。という、それは非常にヒサンな状態になるわけですね。

こんなのは使いたくないよ。一つのウィンドは一個のプロセスのターミナルソフト使いたいよ。ってんで、/usr/ports/x11 の下辺りを ls -d *term* などとして色々物色するんですね。で、今回中々良いのが見つかったのでそれについてちょっと書いてみたいと思います。

今回取り上げるのは gtkterm2 です。 ports 的には x11/gtkterm2 になるんですけどもね。とりあえず make してみると、ターミナルソフト的には vte というのを利用しているみたいですね。 ports 的には x11-toolkits/vte になるみたいですが。ここに GTK2 を利用してタブの機能を盛り込んだみたいな感じです。

利用してみると一つのウィンドで一つのプロセスとして動作するようで中々良い感じですね。では、早速カスタマイズして自分好みの環境で利用してみましょう。

実は gtkterm2 をインストールして、カスタマイズしようとしてあまりにもその設定方法が書かれたウェブが無いのでいっちょ書いてみるか。ということでこのエントリを書いているわけですけどもね;-)。

gtkterm2 の設定ファイルは $HOME/.gtkterm2rc になります。 gtkterm2 を一回起動するとホームディレクトリに設定ファイルが生成されます。そしたらエディタで編集すれば良いでしょう。

それにしてもこの設定ファイル、 gtkterm2 を起動するたんびに毎回 gtkterm2 が更新してくれます。非常にややこすぃー・・。毎回エディタを再起動してあげる必要がありますが・・。

とりあえずフォントの設定から。以下の部分を変更すると自分の好きなフォントになります。

terminalFont= MS Gothic 10

 
上記設定は MS ゴシックを 10 ポイントの表示で利用する場合。フォント名は GTK2 の記述形式ですね。以下のコマンドを実行するとフォント名が抽出できると思うのでそれを記述します。

% fc-list | awk -F, '{print $2}' | awk -F: '{print $1}' | sort

 
MS ゴシックが無い人は “Ume Gothic C4” とか指定すると良いかもですね。

まぁ、上記のようにフォントの指定は色々なウェブ上で書かれているので割と設定は簡単でしょうか。

問題は色のほうです。こいつは解らない・・。orz。また、ウェブを探しまわっても全く見当たらないんですね。でもって $HOME/.gtkterm2rc には以下のように不気味な設定が書かれている。

red=0xff00 0x0000 0x0000 0xaaaa 0x0000 0xaaaa ...
grn=0xef00 0x0000 0x0000 0x0000 0xaaaa 0x5555 ...
blu=0xef00 0x0000 0x0000 0x0000 0x0000 0x0000 ...

 
red=、grn=、blu= の後に 0x0000 が全部で 17 個並んでいます。これが何を意味しているのかが全くわかりませんでした。しょーがないのでソースコード眺めましたよー。src/prefs.c 辺りで色についての記述がありますね。まぁ、読むのも大変なんですけども・・。

で、 grn= の後の一個目のパラメータはバックグラウンドの色の指定になります。二個目のパラメータはカーソル、X11 用語では foreground ってことですけどもね。の指定になります。一個目と二個目の設定だけが特徴的で残りの 15 個はファイルの色になります。この辺り、僕にもわかりません。実行形式ファイルの色は赤とか、ディレクトリは青とか、symlink の色はピンクとか、そんな設定になります。

まぁ、今回は background と foreground の色を変えてみましょう。それにしても RBG カラーってのは # のあとに六桁指定するのにどうして四桁なんだ?と思うのでありますが・・。

例えば background の色を #FFEFEF という、ちょっとピンクっぽい色にしたい場合は以下のように指定します。

red=0xff00
grn=0xef00
blu=0xef00

 
red、grn、blu で RBG の色を前から二桁に指定し、余った後ろの二桁は “0” を指定する。って感じですね。

文字とかカーソルの色は黒にしたいので #000000 になります。その場合は以下になります。

red=0xff00 0x0000
grn=0xef00 0x0000
blu=0xef00 0x0000

 
0x00 の前二桁の部分に “0” を設定し、後ろの二桁は default の “0” を設定します。これで自分の好きな色に設定できると思います。そして、三個目以降、残りの 0x???? は全部で 15 個ありますが、これは default の設定でひとまず試してみてください。 ports の make config ときなんかは不気味な色になりますけどねぇ;-)。

とまぁ、こんな感じで設定すれば自分の好みのターミナルになるのではないかなぁ。と思われます。

自分的に一点変えたいと思っているのが新しいタブを開くとき。 default では CTRL+N なんだけど、CTRL+SHIFT+N に変更したいなぁ。と思っています。ソースコードを変更してしまうのが一番早いかなぁ。などとちょっと思っていますが、機会があったら試してみたいですね;-)。

さーっ!! そんなこんなで、ようやっと一つのウィンドがひとつのプロセスとして動作するターミナルソフトを手に入れた。インストール時に入るのは vte くらいのなので KDE4 を使っていても余計なモノを入れない(インストールしない)のが気に入っています。

gtkterm2 の設定が解らないときはここを参照してください;-)。

2012/02/16 加筆
以下の部分を改修した ports を作りました。

・日本語 po ファイルを書いたのでメニューは日本語表示できるようになります。
・Ctrl+n は emacs とバッティングするので新規タブは Ctrl+t に変更しました。

以下の URL から ports がダウンロードできます。

http://icmpv6.org/Prog/FreeBSD_ports/ports-gtkterm2-20120216.tgz