roundcubeとPostgreSQL
2012/08/18(土) 8:21 NetBSD はてブ情報 はてブに登録 はてブ数

メールサーバを新しくして、ちょっと調子に乗りました。

外からもメールが読めると便利だなぁと。

もちろんIMAPのポートを空けるのも考えたのですが、気軽に読めるようにWebメールを入れることにしました。

以前WebメールにSquirrelMailを使ったことがあったのですが、すこしWebをさすらってroundcubeというのを見つけました。pkgsrcからだとpkgsrc/mail/roundcubeを入れると一式入れてくれるようですね。バージョンは少し古いようですが、なにより簡単にはじめられるのでバージョンにはこだわらずにpkgsrcのお世話になることにしました。

roundcubeは今風のアプリケーションらしくDBMSを使うようですね。デフォルトだとMySQLをデータベースとして使うようなのですが、なぜかPostgreSQLを使わなければならないような気がしたのでPostgreSQLを使うことにしました(どうやらこの判断のおかげでずいぶんと時間がかかったようですけど)。

ということで、pkgsrc/database/postgresql91を入れておきます。

PostgreSQLを使う場合、PHPのPostgreSQL用ドライバもあわせて必要なのでpkgsrc/databases/pear-MDB2_Driver_pgsqlもインストールしておきます。これに気づかず、データベースに接続できないというエラーに悩まされました。

そもそもNetBSDでPostgreSQLを使うのが初めてで、データベースクラスタとかどこに作るのかなー、と思っていましたが、起動スクリプトをのぞいてみると、初めて起動した際に、自動的にいろいろやってくれるようです。このへんも、pkgsrcの恩恵を受けています。ありがたい。

ということで、/usr/pkg/example/rc.d/pgsqlを/etc/rc.dにコピー、/etc/rc.d/pgsql onestart でPostgreSQLを起動すると、/usr/pkg/pgsqlにデータベースクラスタを作成してくれました。

/etc/passwdに新しく追加されているユーザ名から想像するとPostgreSQLの特権ユーザはpgsqlというユーザ名のようです。このアカウントはUNIXとしてのログインが(ご丁寧に)禁止されているので、その後のPostgreSQL関連のコマンドを実行する際に-U pgsqlなどと明示的にpgsqlユーザで実行することを指定してあげる必要があります。

roundcubeを展開すると出てくるINSTALLファイルを読みつつ、データベースの初期設定を行います。

ユーザroundcubeを作ります。
root@zbox>createuser -U pgsql roundcube
新しいロールをスーパーユーザにしますか? (y/n)n
新しいロールに対してデータベースを作成する権限を与えますか? (y/n)y
新しいロールに対して別のロールを作成する権限を与えますか? (y/n)n
データベースを作ります。データベース名はroundcubemailです。
root@zbox>createdb -U pgsql -O roundcube -E UNICODE roundcubemail
psqlで接続詞、ユーザroundcubeのパスワードを設定した後、roundcubeが用意しているSQL文を流します。
root@zbox>psql -U pgsql roundcubemail
psql (9.1.2)
"help" でヘルプを表示します.

roundcubemail=# ALTER USER roundcube WITH PASSWORD 'XXX';
ALTER ROLE
roundcubemail=# \c - roundcube
データベース "roundcubemail" にユーザ"roundcube"として接続しました。
roundcubemail=> \i /usr/pkg/share/examples/roundcube/SQL/postgres.initial.sql

実行結果は省略

roundcubemail=> \q
DB接続の設定をします。

/usr/pkg/etc/roundcube/db.inc.phpが目的のファイルです。
PostgreSQLを使う場合には次のようにします。
$rcmail_config['db_dsnw'] = 'pgsql://roundcube:roundcube@localhost/roundcubemail';
これでroundcubeとPostgreSQLがつながりました。

あとは/usr/pkg/etc/roundcube/main.inc.phpをなおします。
といっても、メールサーバ名やポート番号を入れるだけです。
今回は、こんな感じ。
$rcmail_config['smtp_server'] = 'SMTPサーバ名';
$rcmail_config['smtp_port'] = 587;
$rcmail_config['smtp_user'] = 'ユーザ名';
$rcmail_config['smtp_pass'] = '%p';
次に、roundcubeを動かすためのPHPの設定です。
PHPの設定ファイル(/usr/pkg/etc/php.ini)を修正しました。
デバッグ用の設定がonになっているのは、格闘した名残なので不要ですかね。
root@zbox>diff -u php.ini.orig php.ini
--- php.ini.orig        2012-08-18 17:38:48.000000000 +0000
+++ php.ini     2012-08-18 21:35:28.000000000 +0000
@@ -528,7 +528,7 @@
 ; Development Value: On
 ; Production Value: Off
 ; http://php.net/display-errors
-display_errors = Off
+display_errors = On

 ; The display of errors which occur during PHP's startup sequence are handled
 ; separately from display_errors. PHP's default behavior is to suppress those
@@ -539,7 +539,7 @@
 ; Development Value: On
 ; Production Value: Off
 ; http://php.net/display-startup-errors
-display_startup_errors = Off
+display_startup_errors = On

 ; Besides displaying errors, PHP can also log errors to locations such as a
 ; server-specific log, STDERR, or a location specified by the error_log
@@ -769,7 +769,7 @@

 ; PHP's default character set is set to empty.
 ; http://php.net/default-charset
-;default_charset = "iso-8859-1"
+default_charset = "UTF-8"

 ; Always populate the $HTTP_RAW_POST_DATA variable. PHP's default behavior is
 ; to disable this feature.
@@ -971,6 +971,16 @@
 ;extension=php_pgsql.dll
 ;extension=php_pspell.dll
 ;extension=php_shmop.dll
+extension=dom.so
+extension=gd.so
+extension=iconv.so
+extension=json.so
+extension=mbstring.so
+extension=mcrypt.so
+extension=mysql.so
+extension=pgsql.so
+extension=sockets.so
+extension=sqlite.so

 ; The MIBS data available in the PHP distribution must be installed.
 ; See http://www.php.net/manual/en/snmp.installation.php
@@ -993,7 +1003,7 @@
 [Date]
 ; Defines the default timezone used by the date functions
 ; http://php.net/date.timezone
-;date.timezone =
+date.timezone = "Asia/Tokyo"

 ; http://php.net/date.default-latitude
 ;date.default_latitude = 31.7667
@@ -1756,22 +1766,22 @@
 [mbstring]
 ; language for internal character representation.
 ; http://php.net/mbstring.language
-;mbstring.language = Japanese
+mbstring.language = Japanese

 ; internal/script encoding.
 ; Some encoding cannot work as internal encoding.
 ; (e.g. SJIS, BIG5, ISO-2022-*)
 ; http://php.net/mbstring.internal-encoding
-;mbstring.internal_encoding = EUC-JP
+mbstring.internal_encoding = UTF-8

 ; http input encoding.
 ; http://php.net/mbstring.http-input
-;mbstring.http_input = auto
+mbstring.http_input = pass

 ; http output encoding. mb_output_handler must be
 ; registered as output buffer to function
 ; http://php.net/mbstring.http-output
-;mbstring.http_output = SJIS
+mbstring.http_output = pass

 ; enable automatic encoding translation according to
 ; mbstring.internal_encoding setting. Input chars are
PostgreSQLを使うroundcubeが依存するPHP、まで来ました。

あとはPHPを呼び出すApacheの設定です。

微妙にハマったのが/etc/rc.d/httpdでした。NetBSDには標準のHTTPデーモンがインストールされていて、その名もbozohttpdなんですが、/etc/rc.dにhttpdとかがシレっと存在し、あー、Apacheはインストールしてたから、これ起動すりゃいいんだよねー、という感覚で(bozo)httpdを起動し、あっれー? おかしいなー? と悩んでました。

当然ですが、/usr/pkg/share/example/rc.d/apacheから持ってきたやつで起動せんとイカンですね。

ApacheとPHPをつなぐためにはpkgsrc/www/ap-phpを入れねばなりません。
pkgsrc/textproc/php-intlも必要かもしれません。わすれました。

Apacheの設定ファイルも修正しています。
root@zbox>diff -u httpd.conf.orig httpd.conf
--- httpd.conf.orig     2012-08-18 16:36:02.000000000 +0000
+++ httpd.conf  2012-08-18 17:16:38.000000000 +0000
@@ -125,6 +125,8 @@
 LoadModule alias_module lib/httpd/mod_alias.so
 LoadModule rewrite_module lib/httpd/mod_rewrite.so

+LoadModule php5_module lib/httpd/mod_php5.so
+
 <IfModule !mpm_netware_module>
 <IfModule !mpm_winnt_module>
 #
@@ -486,3 +488,6 @@
 SSLRandomSeed startup builtin
 SSLRandomSeed connect builtin
 </IfModule>
+
+AddHandler application/x-httpd-php .php
+Include etc/roundcube/roundcube.conf

Apacheが書き込みできるようにパーミッションを変更。
root@zbox>chmod og+w /var/log/roundcube/errors
で、roundcubeのインストールのページに行くのがポイントです。roundcubeのトップページにアクセスして、うまくいかないとすげー悩んでいたんですが、セットアップ用のページにアクセスするんですね。

imapサーバのひっこし
2012/07/27(金) 17:40 NetBSD はてブ情報 はてブに登録 はてブ数

これまでe-mailについてはMac mini (powerpc)でまかなってきたのですが、年に数回しか起動しないこともあって、そもそもどうなんだという話もあり、ファイルサーバをZBOX+USB HDD BOXに変更したこともあり、節電というトレンドもあり、自宅のサーバにかける工数も激減していることもあり、いっそのことZBOXに集約しようと思い立ったのが遥か昔のことのように思えます。

ということで、Mac miniからZBOXにメールサーバを変更しました。

もともと独自ドメインをとっているくせに、メールは上位のホスティング会社におまかせしていることもあって、fetchmail + lmtp + cyrusimapでやりくりしてきました。

で、Mac miniでfetchmailを一年ぶりに動かし、11万通のメールを取り込んだあと、/var/spool/imapをZBOXに写し、reconstructでメールボックスの整合性をとり(未読情報はどうせ一年読んでないのでどーでも良い)、さてZBOXでまじめに運用というところです。

それはそれとして、11万通ほどメールがたまるとfetchmail -Fで奇麗に消えてくれなくて困るんですよねー。nPopとかで消すしかない感じです。

/etc/hostsにホスト名を書き忘れてcyradmが動かない、~/.sieveを使う設定を忘れて悩むという定番のミスをやりつつ何とかなりました。

~/.sieveを有効にさせるimapd.conf入れる修正をメモしておこう。
--- imapd.conf.orig     2012-07-27 11:38:54.000000000 +0000
+++ imapd.conf  2012-07-27 11:39:08.000000000 +0000
@@ -5,7 +5,7 @@
 
 configdirectory: /var/imap
 partition-default: /var/spool/imap
-sieveusehomedir: false
+sieveusehomedir: true
 sievedir: /var/sieve
 hashimapspool: false

NetBSDで3TBのHDDを扱う (gpt, dkctl)
2012/05/14(月) 25:36 NetBSD はてブ情報 はてブに登録 はてブ数

3TBのHDDはNetBSDでどう扱えば良いのでしょうか?

Linuxのときに少し手間取ったので、何かあるなと思ってはいましたが、やっぱりいくつか失敗しながらなんとか使えるようになりました。少しまとめておきます。

まずは、こんな感じで見えてます。
root@zbox>dmesg | grep sd0
sd0 at scsibus0 target 0 lun 0: <I-O DATA, HDCA-U, 1337> disk fixed
sd0: 2794 GB, 16383 cyl, 16 head, 63 sec, 512 bytes/sect x 5860533168 sectors
大きなHDDはfdiskが使えないのでLinuxではpartedを使いました。
partedはpkgsrc/wipにあり、これを使おうとmakeするとLinuxだけだよと怒られます。

じつはgptコマンドというそのものズバリのコマンドがあり、これを使えば良いというのを初めてしりました。

まずは、ディスクの状態を見てみます。
root@zbox>gpt show sd0
       start        size  index  contents
           0           1         PMBR
           1  5860533134         
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header

なんか、セカンダリGPT table, headerしかない変な状態に見えます。
ということで一度クリアすることにしました。

gpt destroyで情報を消します。
root@zbox>gpt destroy sd0
root@zbox>gpt show sd0
       start        size  index  contents
           0           1         PMBR
           1  5860533167         

あらたにgpt createで区画を作ります。
root@zbox>gpt create sd0
root@zbox>gpt show sd0
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  5860533101         
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header
ちゃんとプライマリの情報とセカンダリの情報ができてます。区画情報を冗長化してるんですかね。

man gptのEXAMPLEに近い状態になったので、いざ、先に進みます。

まずは区画を作ります。デフォルトだとFFSでディスク全体を区画にします。
今回はでかい区画が欲しいのでこれでよしとします。
root@zbox>gpt add sd0
Partition added, use:
        dkctl sd0 addwedge <wedgename> 34 5860533101 <type>
to create a wedge for it
root@zbox>gpt show sd0
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  5860533101      1  GPT part - NetBSD FFSv1/FFSv2
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header
区画にラベルをふってあげます。名前を付ける感じですね。
ラベル名はgpt showに-lをつけると見えるようです。最初は空っぽ。
root@zbox>gpt show -l sd0
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  5860533101      1  GPT part - ""
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header
gpt labelに区画を指定する引数を与えて名前を付けます。今回はshareという名前にしました。
root@zbox>gpt label -i 1 -l share sd0
partition 1 on rsd0d labeled share

root@zbox>gpt show -l sd0
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  5860533101      1  GPT part - "share"
  5860533135          32         Sec GPT table
  5860533167           1         Sec GPT header
これで区画ができたので使えるようにしましょう。
いつものようにdisklabelです。最初は空っぽ。
root@zbox>disklabel -r sd0
disklabel: could not read existing label
disklabel -i -I sd0あたりでそれっぽいラベルを作ります。
root@zbox>disklabel sd0
# /dev/rsd0d:
type: SCSI
disk: HDCA-U          
label: fictitious
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 16383
total sectors: 1565565872
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0 

4 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a: 1565565872         0     4.2BSD      0     0     0  # (Cyl.      0 - 1553140*)
 d: 1565565872         0     unused      0     0        # (Cyl.      0 - 1553140*)
作ったらnewfsしてマウントです。newfsではrawデバイスを指定しないといけなかったですね。
root@zbox>newfs -O2 /dev/sd0a
newfs: /dev/sd0a is a block device. use raw device

root@zbox>newfs -O2 /dev/rsd0a
/dev/rsd0a: 764436.5MB (1565565872 sectors) block size 16384, fragment size 2048
        using 4133 cylinder groups of 184.98MB, 11839 blks, 22976 inodes.
super-block backups (for fsck_ffs -b #) at:
160, 379008, 757856, 1136704, 1515552, 1894400, 2273248, 2652096, 3030944, 3409792, 3788640, 4167488, 4546336, 4925184, 5304032, 5682880, 6061728, 6440576, 6819424, 7198272,
..................................................................................................................................................................................

root@zbox>mount /dev/sd0a /mnt
root@zbox>df -k
Filesystem    1K-blocks       Used      Avail %Cap Mounted on
/dev/wd0a      77398560   20353514   53175118  27% /
kernfs                1          1          0 100% /kern
ptyfs                 1          1          0 100% /dev/pts
procfs                4          4          0 100% /proc
/dev/sd0a     758910582          2  720965052   0% /mnt
見事に使えるようになりました。

でも、おかしいですね。3TBにしては小さすぎます。
もしかしたらdisklabelでは3TBは扱えないのかも、とおもってmanを読むと、BUGSに
The disklabel structure stored on disk cannot support partitions/disks
     greater than 2TB.  Please use gpt(8) and dkctl(8) to manage partitions
     and disks larger than 2TB.
ありゃ、やっぱりそうでしたか。ここにあるgptは使ったけど、dkctlって何でしょう。

そういえば、gpt addしたときのコマンドの応答にそういうのがあったような...
root@zbox>gpt add sd0
Partition added, use:
        dkctl sd0 addwedge <wedgename> 34 5860533101 <type>
to create a wedge for it
おぉ、これです。もしかしたら、このコマンドで区画を有効化しなさいということなのかも。

まずは、umountします。
root@zbox>umount /mnt
さっきのコマンドに引数をいくつか与えて実行してみます。
wedgenameはsd0a, typeはffsにしました。wedgenameは、少し考えて、ださいけどこうしました。
root@zbox>dkctl sd0 addwedge sd0a 34 5860533101 ffs
dk0 created successfully.
どうやらdk0というのがfdiskでいうsd0aに相当するみたいですね。
情報を見てみます。
root@zbox>dkctl sd0 listwedges
/dev/rsd0d: 1 wedge:
dk0: sd0a, 5860533101 blocks at 34, type: ffs
やっぱりwedgenameはshareとかにすべきでしたねー。

まぁ、それほど見る機会もないだろうからnewfsしちゃいましょう。
root@zbox>newfs -O2 dk0
/dev/rdk0: 2861588.4MB (5860533100 sectors) block size 16384, fragment size 2048
        using 15470 cylinder groups of 184.98MB, 11839 blks, 22976 inodes.
super-block backups (for fsck_ffs -b #) at:
160, 379008, 757856, 1136704, 1515552, 1894400, 2273248, 2652096, 3030944, 3409792, 3788640, 4167488, 4546336, 4925184, 5304032, 5682880, 6061728, 6440576, 6819424, 7198272,
..................................................................................................................................................................................
いざ、mountです
root@zbox>mount /dev/dk0 /mnt
root@zbox>df -g
ilesystem    1G-blocks       Used      Avail %Cap Mounted on
/dev/wd0a            73         19         50  27% /
kernfs                0          0          0 100% /kern
ptyfs                 0          0          0 100% /dev/pts
procfs                0          0          0 100% /proc
/dev/dk0           2709          0       2573   0% /mnt
きましたね。ちゃんと2TB以上の領域として認識したみたいです。

1: sage 『gptパーティションの開始セクタは8の倍数にしたほうが良いかと(4kセクタ問題対策)』 (2012/05/16 16:08)

2: tokuda 『そうでした。Webを見てみると8の倍数だと思った以上に差があるみたい。USBの先につながっているからあんまり効果なかったりするか...』 (2012/06/01 8:21)

ZBOX nano VD01でBluetoothを使う (2)
2012/05/01(火) 15:19 NetBSD はてブ情報 はてブに登録 はてブ数

前回、長々と書いた割にはThe NetBSD Guide Chapter 21 Bluetooth on NetBSDの最初の所までしか進んでいませんでした。

やっと内蔵のBluetoothモジュールが認識されたので、今回はマウスとキーボードを使えるところまで進めたいと思います。

今回の内容はZBOX固有というよりNetBSDでのbluetooth利用の一般的な手順になりますかね。

準備

まずは/etc/rc.confに
bluetooth=YES
と書いてbluetooth関連の有効化を行い、再起動もしくは
/etc/rc.d/bluetooth start
と入力してサービスを有効にします。

bluetoothの設定で触るファイルはたったの二つです。一つは/etc/bluetooth/hosts、二つ目は/etc/bluetooth/btdevctl.confです。

/etc/bluetooth/hostsは/etc/hostsのbluetooth版と思えば良く、bluetoothデバイスの一つ一つに与えられている固有のID (MACアドレスみたいなもの) に名前を付けるものです。

/etc/bluetooth/btdevctl.confはシステムの起動時に登録しておきたい (動くようにしておきたい) 各種bluetoothデバイスを書いておくものです。たとえばキーボードなんかは起動時に自動的に登録されていないと困りますからね。

まず/etc/bluetooth/hostsを作りましょう。

bluetoothデバイスは必ずデバイス登録モードのようなものをもっていて、ボタンの長押しであったりbluetoothロゴが書かれたボタンを押したりするとそのモードに入ります。たいていはLEDが点滅したりして「登録モードですよ」って言う感じになります。先の文書ではdiscoverable modeと書かれています。発見可能モードと呼ぶべきかな。

デバイスをそのモードにしておいて、btconfigコマンドを次のように入力すると、お目当てのデバイスがレスポンスを返してくれます。
# btconfig ubt0 inquiry
Device Discovery from device: ubt0 ... 1 response
  1: bdaddr XX:XX:XX:XX:XX:XX
   : name "Bluetooth Keyboard"
   : class [0x002540] Peripheral Keyboard <Limited Discoverable>
   : page scan rep mode 0x01
   : clock offset 15398
   : rssi 0
上記の例だと一つしか見つかっていませんが、複数のデバイスが見つかることもあります。どうせなら一気にやってしまった方が楽なので片っ端からbluetoothデバイスをピカピカと点滅させてやるといいかもしれません。

ここで大切なのはbdaddrという部分に書かれたコロンで区切られたアドレスです。/etc/bluetooth/hostsにはこのアドレスとそれを表す名前を付けてあげます。名前は自由に決めることができます。

今回はノーブランドのbluetoothキーボードとAppleのMightyMouseを使いました。/etc/bluetooth/hostsには以下のように書きました (bdaddrは潰してあります)。
XX:XX:XX:XX:XX:XX keyboard
YY:YY:YY:YY:YY:YY mightymouse
これを書くことで長くて覚えにくいbdaddrを使うことなくキーボードはkeyboard、マウスはmightymouseと呼ぶことができるようになります。

キーボード

それでは実際にキーボードを使えるようにしてみましょう。

キーボードを使えるようにするためには、いくつかの手順を実行する必要があります。
  1. キーボード側をdiscoverable modeにする (LED点滅ですね)
  2. PC側でPINを発行する (5分間有効)
  3. PC側でデバイスをアタッチするコマンドを発行する
  4. キーボード側で先ほど発行されたPINを入力する(最後にEnterキー)
まずキーボード側をdiscoverable modeにします。

次にはbtpinを使ってPINを発行します。
# btpin -d ubt0 -a keyboard -r -l 8
PIN: 82526229
btpinのマニュアルによると、このPINは5分間有効なのだそうです。なので、この後の手順はテキパキと行う必要があります。

次に、btdevctlを-Aオプションをつけて (つまりAttachをさせるようにして) 実行します。
# btdevctl -d ubt0 -a keyboard -s HID -A
このコマンドは実行後すぐにプロンプトに戻ってくるためAttachしていないような気になりますが、実はキーボード側からPINが入力されるのを待って、それが正しければAttachを完了させるような立て付けになっているみたいです。ここで表示されるメッセージはあまり気にしなくてよいです。

ということで、キーボード側で先ほどbtpinで表示された8桁のPINを入力し、Enterキーを押します。

するとPC側にデバイスが認識された旨が表示されます。キーボードから文字が入力できるようになっているはずです。

PINコード発行から5分経過するなどのタイムアウトに引っかかったりPINを打ち間違えたときにはAttachが中途半端な状態になっているため、次のコマンドでDetachしてAttach前に戻してあげる必要があります。
# btdevctl -d ubt0 -a keyboard -s HID -D
PINの発行やAttachのタイミングなどで、わりと失敗するので何度かこのコマンドにお世話になりました。

個人的にうまく動かなくて困ったのは、先の文書でPINをいつ打ち込めば良いのかわからなかったことです。btpinを入力した後すぐにキーボードからPINを打ち込んで、うまくいかないなー、と思っていたのですがbtdevctlコマンドがしばらくしてからデバイスをdetachしていたので、実はbtdevctl -AのあとにPINを入れるんじゃないかと気づいたのです。

マウス

さて、次はマウスをつないでみましょう。

すでに/etc/bluetooth/hostsに登録されていますから、あとはキーボードとほぼ同じくbtpinによるPIN発行とbtdevctlによるAttachだけです。

キーボードとの違いはPINが固定ということでしょうか。キーボードのようにPINを入力する方法がないのだから当たり前ですね。

キーボードの場合はPC側でPINを発行して、それをキーボードで打ち込むことによって接続が確立できましたが、マウスの場合は逆のイメージで、マウスが期待しているPINコード (0000らしいですね) を逆にbtpinに指定して実行してからマウス側をアタッチするみたいな感じです。

まず、マウスをdiscoverable modeにします。MightyMouseの場合はマウス受講部のシャッター開閉ですね。

次にbtpinコマンドをPINコード0000に指定して実行し、btdevctl -Aを実行します。
# btpin -d ubt0 -a mightymouse -p 0000
# btdevctl -d ubt0 -a mightymouse  -s HID -A
マウスはPC側と勝手におしゃべりして接続を確立してくれるみたいで簡単ですね。

自動起動

これでマウスとキーボードがどちらも使えるようになりました。再起動時にもデバイスを使えるようにするために/etc/bluetooth/btdevctl.confに次のように記述します。
HID    keyboard        ubt0
HID    mightymouse     ubt0
これで再起動時に先ほどのbtdevctl -Aをシステム側で自動実行してくれます。

さて、再起動時にはPINコードが必要でしょうか? 必要だととっても面倒です。

実はこの情報は/var/db/bthcid.keysに保存されているようですね。これを使って再起動時にはPINコードの入力を必要とせずにデバイスが利用可能になっています。

GW-USValue-EZをNetBSDで使う
2012/04/22(日) 24:23 NetBSD はてブ情報 はてブに登録 はてブ数

11n/g/b対応の小型の無線LANアダプタGW-USValue-EZが届いたのでNetBSDで使えるかどうか試してみました。

まず、何も考えずに挿してみるとugenです。あーそうかー。

ということで、型番で検索するとどうやらRTL8192というチップを使っている代物のようです。チップ名とNetBSDで検索するとOpenBSDからの移植がされているとの情報が。twitterでつぶやくと-currentには入っていると教えてもらいました。

2012/4/21のkernelに入れ替えてみると、見事にurtwnで認識です。
urtwn0 at uhub4 port 1
urtwn0: GW-USValue-EZ GW-USValue-EZ, rev 2.00/2.00, addr 4
urtwn0: MAC/BB RTL8188CUS, RF 6052 1T1R, address XX:XX:XX:XX:XX:XX
urtwn0: 1 rx pipe, 2 tx pipes
urtwn0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
urtwn0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
ところがいざ使おうとすると、
urtwn0: failed loadfirmware of file urtwn-rtl8192cfwT (error 2)
urtwn0: cannot assign link-local address
urtwn0: failed loadfirmware of file urtwn-rtl8192cfwT (error 2)
urtwn0: failed loadfirmware of file urtwn-rtl8192cfwT (error 2)
urtwn0: cannot assign link-local address
ということで使えません。どうやらファームウェアがないようです。

urtwn (4)をみるとhttp://firmware.openbsd.org/firmware/urtwn-firmware-1.1p0.tgzにfirmwareがあるということでダウンロードしてきます。

その中にあるファイルを/libdata/firmware/urtwnというディレクトリを作ってコピーしておきます。いやー、ubtのときにディレクトリ名で苦労しただけに、今回はさくっとsys/dev/usb/if_urtwn.c#urtwn_load_firmwareを確認できました。

以上で準備完了。ちゃんと通信できています。すばらしい!