NetBSDで3TBのHDDを扱う (gpt, dkctl)
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)

ZBOX nano VD01でBluetoothを使う (2)
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で使う
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を確認できました。

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

OpenGrokをローカルで動かしてソースコードを読むために
NetBSDはてブ情報 はてブに登録 はてブ数

ソースコードを追っかけるときに大変お世話になっているhttp://nxr.netbsd.orgですが、ここで使われているのはOpenGrokというツールです。

手元で動くとうれしいなぁということでpkgsrcを探すとdevel/opengrokがありました。

ここではNetBSDのsrc, xsrcを対象にOpenGrokをWebブラウザで使えるところまでの記録をしておきたいと思います。

まず、devel/opengrok, www/apache-tomcat7をpkgsrcからインストールします。
OpenJDKのインストールに結構時間がかかりました。

次に、NetBSDのソースを用意します。/export/s/HEADに置くことにしました。
ここでcvs -d /cvsroot/NetBSD srcなどとしてsrcやxsrcをチェックアウトしておきます。

/usr/pkg/share/opengrokに移動して、run.shに次のようなパッチをあてます。
--- run.sh.orig	2012-04-04 00:38:41.000000000 +0000
+++ run.sh	2012-04-05 11:18:37.000000000 +0000
@@ -3,7 +3,7 @@
 PROGDIR=/usr/pkg/share/opengrok
 
 # REQUIRED The root of your source tree
-SRC_ROOT=/your/src/tree/
+SRC_ROOT=/export/s/HEAD
 
 # REQUIRED  The directory where the data files like
 # Lucene index and hypertext cross-references are stored
@@ -18,13 +18,14 @@
 EXUB_CTAGS=/usr/pkg/bin/exctags
 
 # If you need to set properties (Ex. override the mercurial binary)
-#PROPERTIES=-Dorg.opensolaris.opengrok.history.Mercurial=/home/trond/bin/hg
+PROPERTIES=-Dorg.opensolaris.opengrok.history.cvs=/usr/bin/cvs
 
 # Uncomment the following line if your source contains Mercurial repositories.
 # SCAN_FOR_REPOS="-S"
+SCAN_FOR_REPOS="-S -H -v -r on -W ./configuration.xml"
 
 # You might want to add more available memory, and perhaps use a server jvm?
-#JAVA_OPTS="-server -Xmx1024m"
+JAVA_OPTS="-server -Xmx1024m"
 
 LOGGER="-D/usr/pkg/java/openjdk7/bin/java.util.logging.config.file=conf/logging.properties"
ポイントはSCAN_FOR_REPORSに与えた引数ですかね。あ、あとJAVA_OPTSはどっちでもいいのかなと思っていたら、今回のような大きなソースを食わせる時にはこのオプションをつけておかないと解析が全然終わらないことがわかったので有効にしています。

次に、source.warを/usr/pkg/share/tomcat/webappsにコピーします。このsource.warはconfiguration.xmlが/var/opengrok/etcにあることを期待しているので、生成されたconfuguration.xmlを/var/opengrok/etcに置きます。ディレクトリは自分で作ってあげないといけません。


次に/usr/pkg/share/tomcat/bin/startup.shを実行してTomcatを起動します。これで準備完了です。

Webブラウザでhttp://localhost:8080/sourceにアクセスすればhttp://nxr.netbsd.orgとほぼ同じことが手元のマシンで可能になります。やった!

USBディスプレイ LCD-8000Uをudl(4)で使う (X Window System編)
NetBSDはてブ情報 はてブに登録 はてブ数

ZBOXを持ち出すときに小さなディスプレイがあると便利そうなのでCenturyのLCD-8000Uを購入しました。こいつはudl(4)で動くことが報告されているので安心です。

udlはすでにNetBSDに取り込まれているのでテキストコンソールであれば何もしなくても動くのだそうです。

ところが、i386では内臓のVGAがwsdisplay0で先に使われてしまい、あれこれ試してみたのですが、やり方がまずいらしく動かすことができませんでした。

ずいぶん前にudlを試したときにはうまく動いて満足したと記憶しているのですが、その時も確かテキストコンソールは試さず、Xが動いて喜んでいた気がします。

今回も、いっそのことX Window Systemを動かした方が楽なんじゃないかと思い、そっちに方針変更することにしました。

Xを動かすためには標準のNetBSDにいくつか修正が必要になります。基本的には、ふかうみさんのhttp://www.naobsd.org/udl/にあるものを使えば良いだけです。

修正点は大きく、kernelに対する修正とudl用のディスプレイドライバの追加になります。

kernelについては圧縮・展開を司るmicrocodeの追加とudlに対するioctlの追加です。

追加・修正説明
src/sys/dev/microcode/Makefileudlのmicrocodeを追加
src/sys/dev/microcode/udl新規追加するディレクトリ
src/sys/dev/microcode/udl/*ふかうみさんのkern.diffからそのまま
src/sys/dev/usb/Makefileioctlを定義したudlio.hの追加
src/sys/dev/usb/udl.c無効化されているioctlを有効化する定義を追加 (#define notyet 1)
src/sys/dev/usb/udlio.hioctlを定義したudlio.hの実体 (kern.diffより)

Xのドライバに関する修正はsrcとxsrcの両方に必要になります。

追加・修正説明
src/external/mit/xorg/server/drivers/Makefilexf86-video-wsudlの記述を追加
src/external/mit/xorg/server/drivers/xf86-video-wsudl新規作成
src/external/mit/xorg/server/drivers/xf86-video-wsudl/Makefileふかうみさんのsrc.diffそのまま
src/share/mk/bsd.own.mkwsudlの記述を追加

xsrc

追加・修正説明
xsrc/external/mit/xf86-video-wsudl新規追加
xsrc/external/mit/xf86-video-wsudl/*ふかうみさんのxsrc.diffをベースにwsudl_driver.cを少し修正
xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd/bsd_init.cふかうみさんのxsrc.diffに含まれるパッチそのまま

基本はふかうみパッチベースで良いのですが、wsudl_driver.cについては最新のxsrcへの追従が必要でした。

--- wsudl_driver.c	2012-03-24 05:47:46.000000000 +0000
+++ wsudl_driver.c.new	2012-03-21 19:36:45.000000000 +0000
@@ -67,6 +67,7 @@
 
 #include "xf86.h"
 #include "xf86_OSproc.h"
+#include "xf86_OSlib.h"
 
 #include "mipointer.h"
 #include "mibstore.h"
@@ -76,8 +77,10 @@
 
 #include "fb.h"
 
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
 #include "xf86Resources.h"
 #include "xf86RAC.h"
+#endif
 
 #include "damage.h"
 
@@ -354,8 +357,10 @@
 
 	fPtr->pEnt = xf86GetEntityInfo(pScrn->entityList[0]);
 
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
 	pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT;
 	pScrn->racIoFlags = pScrn->racMemFlags;
+#endif
 
 	/* open wsdisplay device */
 	dev = xf86FindOptionValue(fPtr->pEnt->device->options, "device");

上記の修正をhttp://www.tokuda.net/NetBSD/udl/6.99.3/にとりあえず置きました。パッチはバラバラでいまいちですけど。

アドホックに作業していたので、src/share/mk/bsd.own.mkの修正を入れ忘れて、ドライバ単体のコンパイル時に/configureなんて実行できねぇ、とか怒られたりしながらなんとかkernelとwsudl_drv.soを作ることができました。

openchromeドライバでの教訓をいかして、OBJディレクトリではlibwsudl_drv.soになっているのをwsudl_drv.soに忘れずリネームして/usr/X11R7/lib/modules/driversに置きます。

次のようなxorg.confを書いてstartxします。

Section "ServerLayout"
	Identifier     "X.org Configured"
	Screen      0  "Screen0" 0 0
	InputDevice    "Mouse0" "CorePointer"
	InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
	ModulePath   "/usr/X11R7/lib/modules"
	FontPath     "/usr/X11R7/lib/X11/fonts/misc/"
	FontPath     "/usr/X11R7/lib/X11/fonts/TTF/"
	FontPath     "/usr/X11R7/lib/X11/fonts/Type1/"
	FontPath     "/usr/X11R7/lib/X11/fonts/100dpi/"
	FontPath     "/usr/X11R7/lib/X11/fonts/75dpi/"
EndSection

Section "Module"
	Load  "dbe"
	Load  "dri"
	Load  "dri2"
	Load  "extmod"
	Load  "glx"
EndSection

Section "InputDevice"
	Identifier  "Keyboard0"
	Driver      "kbd"
	Option	    "Protocol" "wskbd"
	Option	    "Device" "/dev/wskbd"
EndSection

Section "InputDevice"
	Identifier  "Mouse0"
	Driver      "mouse"
	Option	    "Protocol" "wsmouse"
	Option	    "Device" "/dev/wsmouse"
EndSection

Section "Monitor"
	Identifier   "Monitor0"
	VendorName   "Monitor Vendor"
	ModelName    "Monitor Model"
EndSection

Section "Device"
	Identifier  "Card0"
	Driver      "wsudl"
	Option      "device" "/dev/wsdisplay1"
EndSection

Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	Monitor    "Monitor0"
	DefaultDepth 16
	SubSection "Display"
		Viewport   0 0
		Depth     16
	EndSubSection
EndSection

あれぇ、起動しません。

[    52.840] (EE) wsudl(0): We are not attached to the udl driver

こんなエラーを吐いてモジュールをアンロードするメッセージに続いています。

不思議に思いながらこのエラーメッセージでソースを追いかけてみます。

        /* open wsdisplay device */
        dev = xf86FindOptionValue(fPtr->pEnt->device->options, "device");
        fPtr->fd = wsudl_open(dev);
        if (fPtr->fd == -1)
                return (FALSE);

        /* check if we are attached to the right device driver */
        r = ioctl(fPtr->fd, WSDISPLAYIO_GTYPE, &wstype);
        if (r == -1) {
                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                    "ioctl WSDISPLAYIO_GTYPE: %s\n", strerror(errno));
                return (FALSE);
        }
        if (wstype != WSDISPLAY_TYPE_DL) {
                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                    "We are not attached to the udl driver\n");
                return (FALSE);
        }

うーん、なんだかなー、と思いながら上の方を見ると"device"という文字列が。

あー、そういえばxorg.confのOptionでdeviceを/dev/wsdisplay1に設定していたなー。

ん?! そういえば、http://www.naobsd.org/udl/README.txt

# cd /dev
# mknod -m 600 wsdisplay1 c wsdisplay 256
# mknod -m 600 wsdisplay1cfg c wsdisplay 511
# wsconscfg -f /dev/wsdisplay1cfg 0

って書いてあったけど、作ったっけ? ていうか、前に作ったけど起動するたびに消えちゃうんで困ってたんだったよなー。もしかしてデバイスをopenできないんじゃないの?

っていうことで、wsdisplay1とwsdisplay1cfgをmknodして、いざ、startx!

おー、ちゃんと動きましたぞ。

IMG_20120324_001517.jpg

残された課題としては、テキストコンソールはどうやるのか、/devにいつもwsdisplay1関連のデバイスが追加されるようにするにはどうするのか、があるので、少しづつ解決していきたいと思います。