メッセージ欄

2012年5月の日記

一覧で表示する

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コードの入力を必要とせずにデバイスが利用可能になっています。