5月 102017
 

一個前のエントリは RPi ZERO で FreeBSD/arm 11.0-RELEASE が動いた。というお話でした。RPi 2/3/ZERO 上で動作する OS はディスプレーが無いので Zeroconf を動かして ssh hoge.local したいと思いますよね。

そして、以前のエントリで「Zeroconf 考察」というのを書いているのですが、デスクトップには Avahi をインストールして、サーバなどはより軽量な mDNSResponder をインストールすれば良いよ。などと書いているのですが、 mDNSResponder は core dump するなど、どうも動作があやすぃ・・。
なので、いっそのこと Avahi で統一したいモノだ。などと思っていたんですけども net/avahi-app/ は、サーバには不要なモノをインストールしすぎる。

そんなこんなで、もっと簡単にインストールできる軽量版の net/avahi-app/ の ports を作成しました。名前を avahi-app-small としていますが・・。
以下の URL にあるので、もし試してみたい。と、いう方がいましたらダウンロードしてみてください。

http://icmpv6.org/Prog/FreeBSD_ports/ports-avahi-app-small-20170510.tgz

インストールは以下の通り。

# cd /usr/ports/net/
# tar xvzfp ~/ports-avahi-app-small-20170510.tgz
# cd avahi-app-small/
# make install

 
フツーの ports をインストールするのとなんらかわりはありません。が、注意点が一点だけあります。クライアント側の ports である dns/nss_mdns/ を make install するより先に avahi-app-small をインストールしてください。

ではどの辺りが違うのか? 軽量なのか?

標準の net/avahi-app/ の ports は以下をインストールします。

Shared Libs required:
        libintl.so.8
        libglib-2.0.so.0
        libgobject-2.0.so.0
        libexpat.so.1
        libgdbm.so.4
        libdaemon.so.0
        libdbus-1.so.3

 
devel/glib20/ や devel/gobject-introspection/ は関連性でサーバには要らんモノ (cairo とか freetype2 とか python27 とその関連性の ports など)をドドドとインストールしてとてつもないことになるし sysutils/gnome_subr/ なんてのも要らんし・・。

僕が作成した avahi-app-small の ports をインストールすると以下がインストールされます。

Shared Libs required:
        libdbus-1.so.3
        libintl.so.8
        libdaemon.so.0
        libexpat.so.1

 
これだけです。 非常に軽量にインストールできます。 Avahi 自体は dbus を利用しているので dbus は必須になってしまいますが、これはまぁしょーがないか。
ports からインストールするとコンパイルのために色々インストールされますが、あとで pkg autoremove するか、コンパイルの時間がもったいない場合には packages からインストールしてください。

 
ports の Makefile では LIB_DEPENDS は最小限にして CONFIGURE_ARGS では不要なモノを色々 disable にしています。これだけでずいぶんと小さくなりました。
GNOME 必要ねーし。 Makefile の以下の行は何のためにあるんだぁ?

avahi-post-patch:
    :
        @${REINPLACE_CMD} -e 's|%%RC_SUBR%%|/etc/rc.subr| ; \
                s|%%GNOME_SUBR%%|${GNOME_SUBR}|' \
                ${WRKSRC}/initscript/freebsd/avahi-dnsconfd.sh.in \
                ${WRKSRC}/initscript/freebsd/avahi-daemon.sh.in
    :

 
files/patch-initscript_freebsd_avahi-daemon.sh.in には +. %%GNOME_SUBR%% なんて最初から書いてあるし・・。

と、いうことで要らんモノを削ぎ落としていったらすごい軽量な(それはつまりは、余計なモノをインストールしなくて済む。と、いうことで、動作的に軽くなった。と、いう意味ではない;-) Avahi がインストールできるようになりました。
試したのは avahi-daemon avahi-dnsconfd avahi-browse くらいですが、これだけ動けば、一応問題はないでしょ? f(^^;;。

あ。ports 的にはノラです;-)。gnome@freebsd.org (メンテナ) に連絡して「make config で余計なのインストールするのやめるように、選択できるようにしてくれよー。」って、ツッコミ入れるのはアリだと思うのですけどねぇ・・。

今回の ports はサーバと FreeBSD/arm で動作させるために作成した。と、言っても過言ではないですが、これで自宅のデスクトップとサーバは Linux も含めて全て Avahi になった。あ。macOS は別だぁ;-)。

2月 282017
 

多分、全然、誰も知らないと思うのですが、 FreeBSD の ports に net-mgmt/sysmon/ というのがあります。デーモンモードでサーバなどを監視するプログラムです。開発自体はもうずいぶんと前に止まっている。裏を返せば枯れた監視プログラムなのであろうと思われますが。

以下の URL が参考になるでしょうか。

https://puck.nether.net/sysmon/

プロトコル的には SMTP, IMAP, HTTP, TCP, UDP, NNTP の監視に対応しています。また PING に対応しているのと、個別にポート番号を指定しての監視も行えます。

 
今回、このプログラムを改修するバッチを書いたのでここに掲載しておきます。改修内容は以下です。

o.pingv6 で IPv6 アドレスを記載できるようにした
o.監視ホストの最大数が 1,024 個だったので 4,096 個に拡張した

以上二つの patch が含まれた net-mgmt/sysmon/ の ports の tar 玉を以下の URL に置きました。

http://icmpv6.org/Prog/FreeBSD_ports/ports-sysmon-20170227.tgz

新しく files/ というディレクトリを作成し、そこに二つのパッチを入れてあります。

IPv6 のパッチについてちょっと説明すると監視用の設定ファイルに “type pingv6;” と記載して、監視できるのに “ip” のところに IPv6 アドレスを記載できないんですね。なので IPv6 アドレスを記載できるようにしました。

まぁ /etc/hosts に書けばいーじゃーん。って話もあるんですが、一応 IPv6 記載 OK なパッチを書いた。と、いうことです。

 
監視対象ホストを 1,024 -> 4,096 に拡張してどうすんだ? という話もあるんですが、大規模ネットワーク用の監視になるでしょうかねぇf(^^;;。

実は sysmond を一台のサーバで複数プロセス起動する改修を当初考えたのですが、複数のプロセス(スレッド)を立ち上げると、メモリ上に持っている(1,024個の)監視対象ホストの情報テーブルを各プロセスがシェアしてしまい、上書きしつつ値がぐちゃぐちゃになってしまったので、派手な改修は断念してただ単に対象数を増やした。と、いうことですf(^^;;。

もし、必要な人いましたら使ってみてください。多分、誰もいないであろうと思われますがf(^^;;。

1月 242015
 

離れた二点間で IPv6 を L2 で利用したいなぁ。と、ずっと思っていたんだけど、中々手段がなかった。 FreeBSD の gif トンネルを使うと L3 接続になるし gre を使うと bridge が利用できないのでややこしいネットワークになってしまうし、そもそも FreeBSD の gre は IPv6 の L2 抜けが 10.0-RELEASE になってもできないみたいだし・・。

と、いうことで今回は離れた二点間で同一の /64 の IPv6 セグメントを利用できるようなネットワークを構築してみたいと思います。
ただ、ネットワーク機器としての FreeBSD の利用は今回あきらめました。今回は VyOS 1.1.1 を利用してみました。
VyOS 1.1.1 はフリーで利用できる仮想環境用のルータ OS です。

VyOS のインストールについてはここでは記載しないので他のウェブサイトでご確認頂ければと思います。

 
でもって、今回構築するネットワーク環境は以下になります。

IPv6_L2TPv3_2

ちょっと説明を。

  • 既存ネットワークのセグメント1: 10.123.1.0/24
  • 既存ネットワークのセグメント2: 192.168.123.0/24
  • 上記二つの異なる IPv4 のセグメントにおいて 2001:470:fc1e:10::/64 の IPv6 セグメントを利用したい。
  • IPv4 は 172.16.101.0/24 もあるけど、ついでに利用できるのであればそれはそれで嬉しい;-)。

と、いうような感じ。 IPv4 を L2 で抜けるソリューションは色々あるようなんだけど IPv6 の L2 抜けってのはどうも対応してない OS があったりして中々手強いモノがあったのであります。

セグメント2 側に IPv6 が無いので L2 で抜けて行って IPv6 使えるようにしましょう。ってのが今回の要件でしょうかね。

dtcp を利用した gif インターフェース使えば良いじゃん。と、いうソリューションもあるのですが、その場合 dtcps を起動する側には /48 が必要で dtcpclient 側に /64 を配布。って形になるので /64 しか無い場合には L2 抜けしてあげないとちょっとつらいんですね。

 
と、いうことで上の図は構成図です。物理的にはセグメント1 にもセグメント2 にも VMwareESXi 5.1 がいます。そこにサーバ(今回は FreeBSD をチョイス。と、いうか、いつも FreeBSD だけど;-)と VyOS が入っている状態です。

  • セグメント1: FreeBSD-01・FreeBSD-02・VyOS-01
  • セグメント2: FreeBSD-03・VyOS-02

では以下に手順を書いていきます。

 
1). VMWareESXi 5.1 の設定
サーバと VyOS が vSwitch で接続された状態にします。そして vSwitch ではプロミスキャス・モード (promiscuous mode) を有効にしておく必要があります。
日本語版では「無差別モード」と言っているようですが。

以下は VMWareESXi の vSwitch の設定のキャプチャです。

IPv6_L2TPv3_1

[構成]タブ -> ネットワーク -> vSwitch のプロパティを開きます。
[ポート]タブの「編集」ボタンを押します。
表示されたウィンドの[セキュリティ]タブの「無差別モード」を “承認” にします。

以上で準備は完了です。これをやっておかないとあとで痛い目にあいますX-(。

 
2). VyOS-01 側の設定
VyOS のインストールが済んで、ログインユーザ名とパスワードの設定が完了した状態からの設定です。

まずはホスト名の設定と ssh を有効にしておきましょうかねぇ。

set system host-name VyOS-01
set service ssh port 22

 
続いて既存ネットワークのセグメント1 側の IPv4 アドレスを指定します。

set interfaces ethernet eth0 address 10.123.1.11/24

 
続いてブリッジインターフェースを作成します。

set interfaces bridge br0

 
そして、新規 IPv6 ネットワークに接続する eth1 をブリッジグループに入れます。 eth1 にはアドレスを付加しません。ブリッジするのでイーサーネットインターフェースとして利用します。

set interfaces ethernet eth1 bridge-group bridge br0

 
ここまで各セグメントに接続するインターフェースの設定が完了しましした。
続いて二つのセグメントを接続するための L2 トンネル部分の設定をします。今回は VyOS の L2TPv3 を利用します。
一応 VyOS の gre でも試してみたのですが bridge-group のメニューが出てこないのでブリッジグループに入れることができません。以前の vyatta では gre も bridge-group に入れることができたようなのですけどねぇ。まぁ、 IP インターフェースは bridge-group に入れることはできない。と、いうことなのでしょうなぁ。

さて。 L2TPv3 を利用するために以下のコマンドを投入します。

set interfaces l2tpv3 l2tpeth0
set interfaces l2tpv3 l2tpeth0 local-ip 10.123.1.11
set interfaces l2tpv3 l2tpeth0 remote-ip 192.168.123.21
set interfaces l2tpv3 l2tpeth0 session-id 10
set interfaces l2tpv3 l2tpeth0 peer-session-id 11
set interfaces l2tpv3 l2tpeth0 tunnel-id 20
set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 21
set interfaces l2tpv3 l2tpeth0 source-port 2030
set interfaces l2tpv3 l2tpeth0 destination-port 2031
set interfaces l2tpv3 l2tpeth0 encapsulation udp
set interfaces l2tpv3 l2tpeth0 bridge-group bridge br0

 
ちょっと説明しますと、

  • interfaces l2tpv3 を l2tpeth0 として create します。
  • local-ip は自分の IPv4 アドレスを、 remote-ip は接続先 IPv4 アドレスを指定します。
  • session-id は好きな数値を、 peer-session-id は接続先の session-id を指定します。
  • tunnel-id と peer-tunnel-id も上記と同じルールで指定します。
  • source-port と destination-port も同じ要領で指定します。それにしてもどうして peer-source-port じゃないんだろ?;-)
  • encapsulation は udp にしました。他には ip も指定できるようです。
  • 最後に l2tpeth0 を ブリッジグループに登録します。

以上で L2TPv3 トンネルの設定が完了しました。最後に commit して save して exit すれば configure モードを抜けます。
VyOS-02 側にも同じ設定を入れるとトンネルが張られます。

eth1 と l2tpeth0 はブリッジされたのでこれで IPv6 が L2 でズドーンと抜けられるようになります。

 
3). VyOS-02 の設定
まぁ、基本的には VyOS-01 で設定したのと一緒です。サクサク行きます;-)。

ホスト名と ssh の設定と eth0 に IPv4 アドレスを付加する設定。

set system host-name VyOS-02
set service ssh port 22
set interfaces ethernet eth0 address 192.168.123.21/24

 
ブリッジグループの設定

set interfaces bridge br0
set interfaces ethernet eth1 bridge-group bridge br0

 
L2TPv3の設定。


set interfaces l2tpv3 l2tpeth0
set interfaces l2tpv3 l2tpeth0 local-ip 192.168.123.21
set interfaces l2tpv3 l2tpeth0 remote-ip 10.123.1.11
set interfaces l2tpv3 l2tpeth0 session-id 11
set interfaces l2tpv3 l2tpeth0 peer-session-id 10
set interfaces l2tpv3 l2tpeth0 tunnel-id 21
set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 20
set interfaces l2tpv3 l2tpeth0 source-port 2031
set interfaces l2tpv3 l2tpeth0 destination-port 2030
set interfaces l2tpv3 l2tpeth0 encapsulation udp
set interfaces l2tpv3 l2tpeth0 bridge-group bridge br0

 
session-id・peer-session-id と tunnel-id・peer-tunnel-id そして source-port・destination-port は VyOS-01 で指定したものと値を逆にします。

以上で設定が完了ですね。

 
4). 確認方法
VyOS-01 と VyOS-02 の間で無事に L2TPv3 インターフェースが接続できているかの確認方法は以下になります。

vyos@VyOS-02:~$ show bridge br0 macs
port no mac addr                is local?       ageing timer
  2     01:05:73:a1:0f:ff       no                 2.16
  1     02:0c:29:f2:ec:f3       yes                0.00
  2     03:15:2c:73:dc:00       no                 2.07
  2     04:19:30:14:2e:c8       no                 1.14
  2     e5:9b:30:55:4e:c8       yes                0.00

 
ブリッジインターフェースの br0 の Mac アドレスを確認します。 今回はサーバ三台とスイッチポートが二つなので全部で五つの Mac アドレスが載りました。 “is local?” ってのは判りやすいですね。 yes が自分のネットワーク側で no が向こう側のネットワークに接続された機器のようです。

ついでなので VyOS の br0 にもテストのために IPv4 アドレスを付加してしまいましょう。

・VyOS-01

set interfaces bridge br0 address 172.16.101.101/24

 
・VyOS-02

set interfaces bridge br0 address 172.16.101.102/24

 

これでサーバやルータのインターフェースに ping を打って到達性が確認できれば L2 トンネルは成功です。
172.16.101.0/24 の IPv4 や 2001:470:fc1e:10::/64 の IPv6 アドレスに対して ping6 して到達性があることを確認します。

もし、この時に ping や ping6 が当たらない場合には一番上に戻って VMwareESXi の vSwitch において「無差別モード」が “承認” になっているか確認してみましょう。
僕はこの設定をすっかり忘れていて ping6 が通らずに随分と悩んでしまいましたf(^^;;。

 
5). ゲートウェイの設定
VyOS 自体に IPv6 を付加する必要が無いのであれば VyOS でのルーテイングの設定は何も必要ありません。サーバ側には IPv6 の default gateway を設定してあげます。

・FreeBSD

# route add -inet6 default 2001:470:fc1e:10::1

 
三台全てのサーバで同一のコマンドを打ちます。そして、全てのサーバはグローバル IPv6 なサイトに対してアクセス可能になったことを確認しましょう。

 
とまぁ、こんな感じで VyOS を利用することによりようやっと念願だった /64 の IPv6 の L2 トンネルができるようになりました。
本当は FreeBSD 単体でできると良いのですけどね。まぁ、それはしょーがない。

 
あと、今回のエントリでは VPN や IPSec については書いてないです。暗号化されてない L2 トンネルになります。
と、いうのも、僕は思うんですが、最近はプロトコル単位で暗号化されているのでトンネルを暗号化する必要ねんじゃね? みたいな。
ウェブ・メール・ssh・scp によるフアイル転送などはプロトコルで暗号化されています。唯一 samba かな? だったら ssh トンネル掘れば良いんじゃね? みたいな。

あ。 mDNS も L2 トンネルを抜けていくかな?だとしたら暗号化が必要だけど、考えてみるとマルチキャストを通すためには設定が一個必要だったような気がしたなぁ;-)。
まぁ、ザレゴトだということで;-)。

 
今回の設定は以上になります。ふぅ。

12月 192014
 

Wi-Fi では wpa_supplicant をよく利用する。と、いうか WPA を利用するのが当たり前になりつつあるんですが、 re0 とか bge0 などでも wpa_supplicant を利用することは可能です。
今回はその設定について書いてみみたいと思います。

今回利用した環境は FreeBSD/amd64 10.0-RELEASE で wpa_supplicant のバージョンは v2.0 になります。

 
そもそも、フツーの Ethernet で wpa_supplicant を利用するのはどういう状況の時にあるか、と、いうことなんですが、以下に書いてみました。

・L2 スイッチに PC を接続すると L2 スイッチ側で EAP 認証がオンになっている
・認証無しで L2 スイッチに PC を接続すると通信ができない VLAN に落っこちる
・EAP 認証を通過すると正常な VLAN が降ってきてネットワークが利用できる状態になる

利用するのは会社とか、セキュリティの高いネットワークでしょうかね。 こーいうのを俗に IEEE802.1x 認証と呼ぶようで、 Wi-Fi では利用できて当然ですが、対応する L2 スイッチでも IEEE802.1x 認証が利用可能です。

すると、上記の PC を接続した L2 スイッチは IEEE802.1x 認証対応のスイッチで、そのスイッチには設定が入っていて PC を接続しても認証が通過できないのでネットワークに接続できない状態。と、いうことになります。

当然 Windows でも利用できるし Mac でも利用できます。 FreeBSD では wpa_supplicant を利用することにより、認証を通過することができます。

今回は FreeBSD で IEEE802.1x 認証の設定をしてみたいと思います。

 
1). /etc/rc.conf の設定
以下の設定をまずします。

#ifconfig_bge0="inet 192.168.1.201 netmask 255.255.255.0"
ifconfig_bge0="WPA DHCP"

 
bge0 に “WAP DHCP” と記述するのですが、違和感ありますよねぇf(^^;;。けど、今回は Ethernet で WPA を利用するのでこーいう記述になります。

 
2). /etc/wpa_supplicant.conf の設定
まずは設定を提示します。

     1  ctrl_interface=/var/run/wpa_supplicant
     2  ctrl_interface_group=0
     3  ap_scan=0
     4  #fast_reauth=1
     5  #update_config=1
     6
     7  network={
     8          key_mgmt=IEEE8021X
     9          eap=PEAP
    10  #       identity="takachan@windows.domain"
    11          identity="takachan"
    12          password="PASSWORD"
    13  #       phase1="peaplabel=0 perapver=1 include_tls_length=1"
    14          phase2="auth=MSCHAPV2"
    15  #       ca_cert="/usr/local/etc/CA/root_CA.pem"
    16          eapol_flags=0
    17  }

 
以下に各行の説明します。

  • 1 行目: socket の入るディレクトリを指定します。
  • 2 行目: そのディレクトリのグループ ID を指定します。
  • 3 行目: Wi-Fi ではないので AP はスキャンしません。
  • 4,5 行目: 一応コメントアウトしました。
  • 8 行目: key_mgmt に IEEE8021X を指定します。
  • 9 行目: eap は PEAP を指定します。多分殆どの環境で PEAP になるのではと思われます。
  • 10,11 行目: 認証用のユーザ名を指定します。 Windows の Active Directory を利用している場合にはドメイン名が必要になる場合もあるかもしれません。
  • 12 行目: 認証のパスワードを指定します。
  • 13 行目: とりあえず phase1 はなくともログインできたのでコメントアウトしています。
  • 14 行目: phase2 は認証方式を指定します。今回は MSCHAPV2 を利用しました。
  • 15 行目: ca_cert は指定しなくとも今回は接続できました。ただし、フツーは CA は持ってないですよね。もし必要であれば Symantec のサイト から VeriSign Root Package をダウンロードしてきてその中から pem ファイルを一個指定すると良いらしいです。
  • 16 行目: eapol_flags は 0 にしました。

 
こんな感じで指定し、あとはつながるかの試験です。

 
3). wpa_supplicant をデバッグモードで起動
以下のコマンドを実行し、デバッグモードで起動します。

# wpa_supplicant -ddKiq -i bge0 -c /etc/wpa_supplicant.conf -D wired

 
上記のコマンドを実行するとドドドと文字が出力され、それを確認すると、接続したか失敗したか解ります。うまく接続できない場合には出力されたログを google などで調べてください。

なお、上記コマンドでは -D オプションでドライバを指定しています。 Wi-Fi NIC では必要ないのですが Ethernet NIC ではこのオプションが必要になります。
wpa_supplicant -h と実行してヘルプが表示されますが、そこに drivers: が表示されるので、利用できるドライバーを指定します。見ると bsd と null と wired の三つがあるようですね。

 
FreeBSD の /etc/rc.d/netif ではどのタイミングで -D wired を付加するのか確認してみたら /etc/network.subr の中に記述されている is_wired_interface() で確認しているようですね。

全ての NIC のデバイス確認してるんかい?

などと思ったのですが ifconfig の media: Ethernet で判断していました。うーん。頭良い;-)。

 
4). あのー。接続できないのですが・・。
ですよねぇ・・。一発で上手く行ったらすごいです;-)。試行錯誤を繰り返してください;-)。

一点だけ確実に解ることがあります。例えば以下のような状態

・Windows で EAP 認証で接続
・Windows 上で Virtualbox が動いていて、ネットワークはブリッジ
・Windows 上の Virtualbox のゲスト OS ある FreeBSD から wpa_supplicant で接続
・FreeBSD では上記設定を入れていても EAP 認証できない orz

L2 スイッチの接続・機能の制限もあるのですが、通常は 1 ポートで一個の EAP 認証しか許可していない場合が多いようです。 Windows で EAP 認証をしたらその上で動いている FreeBSD では EAP 認証を受け付けてくれない。という可能性はありそうです。
L2 スイッチの設定を確認して一つのポートで複数の EAP 認証での接続を許可しているか確認してみましょう。
例えば L2 スイッチのポートに HUB を接続し、そこに三台 PC をぶら下げて三台とも EAP 認証できるか? って状態と一緒ですね。

 
とまぁ、ウェブで日本語によるドキュメントがあまりないのようなのでちょっと書いてみました。繋がらない場合には基本的にはウェブで確認してみてください。
また、今回僕が試した環境では上記の設定がバッチグーでした。他の環境では上記設定では繋がらないのかもしれないです。その場合は、ここに書いてある内容ではダメなのかもしれないですねぇ・・。

2月 012014
 

このブログのとあるエントリにコメントを頂きました。 URL 的にはこれになるんですけども。

http://running-dog.net/2013/11/post_829.html#comment-36710

たまたま偶然なのかもしれませんが、以前私が日本語 po フアイルを書いた wifimgr が FreeBSD 9.2-RELEASE では動作しなくなったのだけど原因解りますか? と、いうモノです。
ちなみに今回は全然関係ありませんが、日本語 po ファイルは wifimgr の作者送り、採用されています;-)。

 
まず最初に wifimgr のソースコード眺めてみましたが、こいつは小さいプログラムなので簡単でしたね。ただ GTK の部分は全くわかりませんが、今回は GTK の部分はとりあえず置いておくことができそうです。そんな感じでソースコードを眺めたのですが wifimgr は GUI のボタンを押すと system() で ifconfig とか /etc/rc.d/ の下のスクリプトを実行していることが解りました。

 
そして wifimgr のソースコードを眺めてみるとだいたいが /etc/rc.d/netif を起動して、その戻り値でエラーをはいて停止してしまうことが解りました。

次に 9.1-R と 9.2-R の /etc/rc.d/netif を diff してみましたが、大きな相違点としては、 9.2-R では /etc/rc.d/routing を呼ぶようになった部分が怪しいです。実際に 9.1-R の /etc/rc.d/netif を 9.2-R に持ってきて wifimgr を起動すると無事に動作しました。あいや。するっていと原因は本当に /etc/rc.d/routing だねぇ。と、更に特定できました。

 
あとは IRC で教えてもらった以下の設定を /etc/rc.conf に仕込んで /etc/rc.d/routing の動作確認です。

rc_debug="YES"

 
そして /etc/rc.d/routing のあちこちに logger コマンドを仕込んで変数の値を /var/log/messages に出力させます(他にも /etc/rc.subr や /etc/network.subr も見る必要がありますが)。

/etc/rc.d/routing は以下のコマンドオプションで実行されているようですね。

# /etc/rc.d/routing start any wlan0

 
さてさて。原因の特定ですが、以下の行にあることが解りました。

    43          ""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
    44                  for _a in inet inet6 ipx atm; do
    45                          afexists $_a && setroutes $_cmd $_a $_if
    46                  done
    47                  ;;

 
44 行目で inet inet6 ipx atm を定義して 45 行目で static_hoge として呼び出しているのですが inet6 を実行すると戻り値がおかしくなるらしく、その戻り値が /etc/rc.d/routing の戻り値として wifimgr に戻ってエラーになって終了するようです。
実際に

・44 行目の inet6 を消すと無事に動作する。
・45 行目の下に logger コマンドを入れると無事に動作する。
・routing_start() の終了時に return 0 を追加すると無事に動作する。

となりました。
このことをとある方にご連絡したところ、以下のパッチを書いてくださいました。多分次のリリース及び STABLE や freebsd-update では更新されるのではないかと思われます。

以下、頂いたパッチを先行して公開します。 FreeBSD 9.2-RELEASE で wifimgr を使っているが正常に動作しなくて困っている方は適用してみてください。

Index: etc/rc.d/routing
===================================================================
--- etc/rc.d/routing    (revision 255154)
+++ etc/rc.d/routing    (working copy)
@@ -42,7 +42,8 @@
                ;;
        ""|[Aa][Ll][Ll]|[Aa][Nn][Yy])
                for _a in inet inet6 ipx atm; do
-                       afexists $_a && setroutes $_cmd $_a $_if
+                       afexists $_a || continue
+                       setroutes $_cmd $_a $_if
                done
                ;;
        *)

 
これで無事に動作するようになると思われます。 wifimgr のほうもソース修正しなくとも良い(バージョンを見て実行するコマンドオプションを変えるのもつらいべ)のではないかと思われるので一安心です;-)。

あとで wifimgr の作者にメールしようと思います;-)。

あ。最後にですけど、 static_inet6() の戻り値がぶっ壊れる(っぽい)原因は詳しくは調べていません。もしかしたら FreeBSD の rc スクリプトが原因ではなく、僕が設定した /etc/rc.conf の IPv6 の設定がおかしくてそれが原因で正しく処理されずに戻り値が壊れて、結果的に /etc/rc.d/routing の戻り値がエラーになるのかもしれません。その場合、原因は僕にありそうですねf(^^;;。

1月 312014
 

いやー。WordPress なブログを三つ持っているのですが、そのうち二つのブログで WordPress 3.7.1 から 3.8.0 そして 3.8.1 へ自動アップデートできなくて困っています。

/wp-admin/update-core.php から [今すぐ更新] ボタンを押すと以下の画面になって、 wordpress.com へのアクセスがタイムアウトしているようです。

WordPress_update

パケットキャプチャしたり、自分のサーバのログを見たのだけど、どうも原因が特定できない状態。しょーがないので自動アップデート(ボタンによる更新作業。か)は断念して、手動アップデートすることにしました。

以下はその作業ログです。あ。root もしくはシェルが利用できる環境が必須です。 ftp しか利用できない環境では、残念ながら無理かもしれません。

あと、この手順で手動バージョンアップを実施してブログがおかしくなっても筆者(それはつまりは僕のことですが)は責任は持てないので、自己責任でお願いします。

 
1). 作業前にバシっとバックアップを取りましょう。
ブログの DocumentRoot が /usr/local/www/blog/ だとして話を進めます。

$ sudo -s
# cd /usr/local/www/
# tar cvzfp blog-backup.tgz ./blog
# cd blog/
# cp wp-config.php wp-config.php.sv

 

バックアップが完了しました。まぁ、ほぼ全部を tar で固めたのでイザというときは解凍すれば良いだけですね。必要であれば MySQL などの DB もバックアップしましょう。僕はバックアップしませんでしたけどf(^^;;。

 
2). パーミッションの確認
ブログの DocumentRoot が /usr/local/www/blog/ だとして、その下の wp- で始まるファイル群ののオーナーとグループを確認します。 apache:apache とか www:www や daemon:daemon などでしょうかね?

 
3). WordPress のソースの展開
WordPress のサイトからダウンロードして来たインストールしたいバージョンのファイルを展開し、オーナーとグループを直します。

$ unzip wordpress-3.8.1-ja.zip
$ cd wordpress
$ sudo -s
# chown -R apache:apache ./*
#

 
4). バージョンアップ実施
インストール前にオーナーとグループをそろえたので後はドバっと行きます;-)。

# cd ~/wordpress/
# /bin/cp -pr * /usr/local/www/blog/
#

 
豪快に cp します。オプションに -pr を付けたのでパーミッションと全てのディレクトリをサクっとインストールしてくれます。

ダウンロードした wordpress を展開したディレクトリの中のディレクトリは wp-admin/ wp-content/ wp-includes/ の三つです。wp-content/ の中が気になるようでしたら別途保存しても良いかと思われます。

が、上記で一応ファイル群のインストールは完了しました。

 
5). データベースの更新
cp -pr の実行が完了したら http://FQDN/wp-admin にアクセスしログインします。ログインするとデータベースを更新する必要があります。と、言われるので[WordPress データベースを更新]ボタンを押します。

WordPress_update2

これが無事に終わるとアップデートは完了です。

手動でやるとしてもずいぶんと簡単ですねぇ。「WordPress の更新」の画面からボタンをぼちっとな。と、押してもダメな場合はバックアップの後に cp -pr ってことでしょうかねぇ。けど、せっかくならインストール用スクリプトも同梱してくれれば良いのになぁ。

3月 252013
 

いやー。cvsup.icmpv6.org というサーバを立てていたのですが csup がいよいよ利用できなくなりましたね。 cvsupd から持ってきたソースコード、例えば ports を portmaster -D -a とかすると「もう使えないぜ。ベイビー。」とか怒られる。

それならば、と、いうことで ports などは snv で取ってくることにしましょう。基本的には以下のコマンドで svn で FreeBSD の ports ツリーを取ってくることができます。

# svn co https://svn0.us-west.FreeBSD.org/ports/head /usr/ports
# cd /usr/ports && svn update

 
FreeBSD のソースコードを取ってくるには svn というのが必要で、それはつまりは ports 的にいうと devel/subversion が必要になるのでこいつをインストールしてあげる必要があります。後で出てきますが、svn サーバを必要としない、クライアントのみで利用するのであれば devel/subversion-static のほうが、余計なのがインストールされないので良いかもしれません。

上記コマンドを実行するときには一旦 /usr/ports/ の中を綺麗にしたほうが良いかもしれんですね。 ports/distfiles/ の中に色々とゴミが残るのでどこかに一時的に移動するか、サッパリと \rm -r /usr/ports してしまったほうが良いかな? 個人的に自由にしてください;-)。

さてさて。svn コマンドを実行したときに、海外のサーバを見に行くことになるのですが、ちょっと遅いかもしれないし大変ですよねぇ。今まで cvsupd なサーバを自分で構築していたので svn なサーバも自分で構築してみましょう。 FreeBSD のための Subversion のミラーサイト (FreeBSD.org subversion mirror) を構築してみます。それが今回のお題目です。

まずは ports から devel/subversion をインストールします。こちらを make すると make config で色々聞いてきます。 devel/subversion-static のほうは特に何も聞いてきません。 FreeBSD の svn サーバを構築する場合には以下のオプションを [X] にして make install しましょう。

[X] MOD_DAV_SVN        mod_dav_svn module for Apache 2.X
[X] MOD_DONTDOTHAT     mod_dontdothat for Apache 2.X

 
すると apache22 までインストールしてくれます。うひっ。 php とか、この手の apache 絡みのヤツを ports からインストールすると強制的に apache までインストールされてしまうのは、ちょっとどーかと思う。僕は apache は自分で make する派なのでねぇ。 mod_* だけインストールしてくれれば嬉しいなぁ。

と、いうことで apache まで起動できる状態になったので svn サーバ (仮に svnweb と言います)を作成していきましょう。

まずは FreeBSD のソースコードや ports 一式を先に取ってきます。

# mkdir /home/svnweb
# cd /home/svnweb
# ftp -a ftp://ftp5.jp.freebsd.org/pub/FreeBSD/development/subversion/svnmirror-base-r238500.tar.xz
# ftp -a ftp://ftp5.jp.freebsd.org/pub/FreeBSD/development/subversion/svnmirror-ports-r301235.tar.xz
# tar xvzfp svnmirror-base-r238500.tar.xz
# tar xvzfp svnmirror-ports-r301235.tar.xz
# svnsync sync file:////home/svnweb/base
# svnsync sync file:////home/svnweb/ports

 
base のほうは FreeBSD のソースコードです。 ports は ports ですね。 r238500 とか r301235 ってのはレビジョンのようです。以下の URL が参考になるかと思います。

http://svnweb.freebsd.org/base/

ftp で取ってきたやつでさえも古いので更に sync して最新のものに揃えます。それが上記コマンドの下の二行です。 snvsync するとどこから取ってくるんでしょうなぁ? 後でキャプチャしてみよう(キャプチャした結果 svn.FreeBSD.org からでした;-)。

と、いうことで最新のソースがこれで準備できたと思います。あ。定期的に svnsync するには以下のスクリプトを書いて cron に登録すれば良いでしょうね。

#!/bin/sh
/usr/local/bin/svnsync sync file:////home/svnweb/base
/usr/local/bin/svnsync sync file:////home/svnweb/ports

 
ちなみに、base と ports だけで 20GByte くらいのディスク容量が必要になります。HDD の容量に気をつけてください。

さささ。続いてサーバのほうを設定していきましょう。基本的には httpd が動作していて port:80 にアクセスします。 SSL に対応しているのであれば https:// でアクセスできます。

まずは httpd.conf ですが、 devel/subversion をインストールしたのであれば特に何もせずとも動作します。うひっ。 ports/subversion インストール時に上に書いた二つのオプションを有効にしたのであれば、多分 httpd.conf に以下の設定が既に追加されているはず。

LoadModule dav_svn_module   libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so

 
ほー。svn のサーバって dav で動作するんだねぇ。するっていと多分 extra/httpd-dav.conf にも設定必要だね。って思うんですが、果たしてそのとおりで、 extra/httpd-dav.conf の中身を全部消して、以下の行を追加して上げます。

<Location />
    DAV svn
    SVNParentPath       /home/svnweb
    Order deny,allow
    <LimitExcept GET PROPFIND OPTIONS REPORT>
        Deny from all
    </LimitExcept>
</Location>

 
あとは httpd を起動すれば動作すると思います。あ。Include etc/apache22/extra/httpd-dav.conf の行は当然コメントアウトをはずす必要があります。

ウェブブラウザでアクセスすると http://svnweb.icmpv6.org/base/ こんな感じで見えるようになります;-)。

では実際に正しく動作するか確認してみましょう。手元にある FreeBSD から以下のコマンドを実行してみます。

# svn co http://svnweb.icmpv6.org/ports/head /usr/ports

 
既に一回、他の svnweb から /usr/ports に持ってきてしまうと svn のエラーコード E155000 で怒られます。その場合には違うディレクトリに co するか、 /usr/ports/.svn/ というディレクトリが svn の接続先情報を管理しているようなのでこのディレクトリを mv すれば良いかもしれません。

さてさて。 apache の設定に戻りますが、svnweb のためだけに httpd を起動する人は皆無だと思うので、多分 httpd-vhosts.conf で VirtualHost の設定をしているかと思います。 DAV svn の設定も簡単で VirtualHost ディレクティブの中に httpd-dav.conf で書いた設定をそのまま書いてあげると良いです。その場合は Include httpd-dav.conf の設定は必要なくなります。

と、いうことで 簡単な svn の使い方と svnweb の立て方をサラっと書いてみました。皆さんもどんどん日本に FreeBSD 用の svn のサーバを起動してみてください;-)。 ちなみにですが、以下を一応用意しました。それぞれのサーバに base/ と ports/ があります。

http://svnweb.icmpv6.org/ (IPv4/IPv6)
https://svnwebv4.icmpv6.org/ (IPv4)

いつも動作している保証はありません;-)。

12月 202012
 

僕は SkyDrive の利用者なのですが、ことの発端は、Windows7 や OS X では SkyDrive がファイルマネージャから利用できるのに FreeBSD の (KDE の) ファイルマネージャでは見ることができないんかな?と、いうところから始まりました。

で、結論から先に書くと、多少問題はありますが /mnt 辺りにマウントできて、 ls とか打てば表示してくれます。でもってファイルマネージャ、例えば KDE4 の ファイルマネージャである dolphin から SkyDrive が参照することができてデスクトップにコピーとかもできるようになります。

では、その方法についてちょっと見て行きましょう;-)。

まずはじめに、僕は以前「SkyDrive をコッテリ使う。」というエントリを書きました。当時はまだ Microsoft から SkyDrive の App が出ていなかったので苦肉の策だったんですけどもね。最近は iOS や Android 用アプリ、上にも書いたデスクトップ用アプリがあるので簡単にアクセス可能になりました。

まぁ、 FreeBSD で利用するときはブラウザ経由で利用すればいーじゃん。と、いう話はあるのですが、どーせならネーテブに利用したい。ってんで、探してみるとその、上のリンク先のエントリに書いた SMEStorage ってのを利用すると mount することができることが解りました。

SMEStorage に付いてはリンク先のエントリを読んでください。で、スマートフォン用アプリが無い時代には SMEStorage を利用していたのですが、最近はすっかりとご無沙汰していたのであります。このサイトにログインすると Linux 用のクライアントが用意されているのでそれを利用してみることにしました。

SMEStorage のトップページはこちら http://storagemadeeasy.com/
その Linux 向けツールはこちら http://storagemadeeasy.com/LinuxDrive/

とりあえず CentOS 用の RPM をダウンロードして展開します。

$ rpm2cpio smestorage-3.0-16.noarch.rpm | cpio -id
$ cd usr/local/bin/
$ ls
smestorage
$ file smestorage
smestorage: a /usr/bin/perl -w script text executable

 
RPM を展開すると usr/local/bin/smestorage というのが現れます。 usr/share/ の下はとりあえず無視します。で、 smestorage というコマンドは perl のスクリプトなんですね。すげー。 Linux バイナリじゃないし。で、すかさず実行します;-)。が、perl の色々なモジュールが無いと言われるので ports からインストールしてあげます。ちょっと解らなかった ports は devel/p5-TimeDate ですかね。あとはサクっとインストールして完了です。

で、perl のモジュールが色々入ったので早速実行してみますが、あいや。 mount_fusefs ってなんだぁ? となります。 Fuse.pm をインストールした時に合わせて fusefs-kmod とか fusefs-libs がインストールされます。

fusefs ってのはファイルシステムの一種なのですが、僕は今回初めて知りました。以下の URL を参照して貰えれば一目瞭然でしょう;-)。

http://fuse.sourceforge.net/

ユーザ空間内で利用するためのファイルシステムだそうです。なんのこっちゃ?f(^^;;。

# kldload /usr/local/modules/fuse.ko
# ls -l /dev/fuse0
crw-rw----  1 root  operator    0, 118 Dec 28 22:45 /dev/fuse0

 
と、いうことで fuse.ko を kldload したらデバイスが一個生えてきました。こいつを利用して再度 smestorage を実行します。オプション無しで実行するとコマンドラインオプションが表示されます。

# ./smestorage
Usage: smestorage mountpoint user:password [providerUser:providerPassword] [--server=host] [--ao] [--DEBUG] [--ct=time]
Example:
smestorage /folder1 login1:password1 --server=eu.smestorage.com --ao --ct=30

 
第一パラメータにマウントポイントを指定します。そして login1:password1 は http://storagemadeeasy.com/ にアカウントを作成し、ログインするためのログイン名とパスワードを指定します。最初はこれだけでコマンドを実行します。

すると、あぁら不思議。と、いうか、あぁらすごい。 http://storagemadeeasy.com/ のウェブベースファイルマネージャで閲覧できる内容が /mnt に見えるようになりました。

# ./smestorage /mnt smeuser:smepasswd
# ls /mnt/
Image Thumbs/
My Quick Uploads/
My SkyDrive files (smestorage@live.jp)/
My Syncs/
My backups/
My contacts/
My iPhone Syncs/
My memos/
My voice memos/

 
SMEStorage のサービスで SkyDrive を利用していると “My SkyDrive files” というディレクトリができています。で、そこに cd して ls とか叩くと SkyDrive 上の内容が表示されるようになります。うひっ。

けど、多分純粋な SkyDrive の内容ではなく、SMEStorage がキャッシュした SkyDrive の内容だと思います。なので、更新とかしてあげないと最新の情報を SkyDrive と sync してくれないこもしれないです。まぁ、その辺りはある程度はしょーがいなですね。

そして、遅いかなー。まぁ、クラウド上のデータを ls するんだからそれなりに遅いですよね。それはまぁ、仕方のないことかな。

で、上記のコマンドオプションのみだと /mnt/ は root 権限でしか見ることができません。 smestorage コマンドのオプションに –ao ってのがあるので、このオプションを利用すると一般ユーザからでもアクセス可能になります。なので KDE4 の人は dolphin などでアクセスが可能になります。僕は LANG に UTF-8 を利用しているのですが、SkyDrive 上の日本語のフアイルも文字化けせずに利用することができます。

と、いうことで、これで SkyDrive の内容が自分の FreeBSD から直接アクセス(正確に言うと SMEStorage 経由の間接的なキャッシュ情報へのアクセス)できるようになりました。有る意味すごいですね。色々できそうな感じです;-)。

とわ言いつつ、基本的には SMEStorage のサービスというか機能に引っ張られての SkyDrive の利用なので、その点について、良いか悪いかはいまいち解りません。

今回は fusefs のお勉強がメイン。と言う感じでしょうか。あ。/mnt のアンマウントは umount /mnt で可能です。エラーが出ますが、多分アンマウントされていると思います。
それにしても smestorage コマンドが perl で書かれているので、僕はまだ中を覗いてないのですが、色々できそうですね。

 
このエントリ、続くか?;-)。

10月 152012
 

ウェブの作成に携わっていると「アクセスカウンタ欲しい。」とか思うことが多々あるとおもいます。で、このブログにも右上にあるんですけどもね。このブログのカウンタは wwwcount というのを利用しています。 FreeBSD の ports では www/wwwcount になりますが、 ports からインストールされるバージョンは 2.5 なんですね。けど、ウェブページを見に行くと 2.6 が存在しているようです。

そもそも wwwcount の IPv6 対応パッチとはなんぞや? ということになるのですが、 wwwcount では同一アドレスから連続してアクセスがあったときにはカウントをアップしないという機能があります。要はリロードしてもカウントがアップしない機能ということになるんですけども。

で、その処理をするために data/count.dat ファイル内にカウンタ数と直前にアクセスがあった IP アドレスを保持しています。直前にアクセスがあった IP アドレスは IPv4 にしか対応してないんですね。それもそのはず。カウンタ数と IP アドレスの区切り文字が “:” だからなんですね。アタタタ。orz。

直前にアクセスのあった IP アドレスが IPv6 アドレスの場合、正しく動作しないのでリロードするとカウンタがどんどん上がっていくのが今のところの仕様です。なので、IPv6 に対応したパッチを書きました。以下の URL に置いときます。

http://icmpv6.org/Prog/wwwcount2.6-IPv6.patch.gz

このパッチを適用するとカウンタ数と IP アドレスの区切り文字が “;” になるので IPv6 でアクセスがあった場合でもリロードでカウントアップするのが防げます。

上にも書きましたが FreeBSD の ports の wwwcount は 2.5 です。このパッチは 2.6 用です。ソースから make してください;-)。

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-|。