google-code-prettify

ラベル NetBSD の投稿を表示しています。 すべての投稿を表示
ラベル NetBSD の投稿を表示しています。 すべての投稿を表示

2009-04-02

LinuxとNetBSDのbridgeの違い

LinuxとNetBSDでは、bridgeの意味が違うようだ。

Linuxのbridgeは、複数のネットワークを一つのネットワークに見せるために使う。
例えばeth0とeth1をブリッジする時には、
・eth0とeth1には、IPアドレスを割り当てない(0.0.0.0)。
・bridgeに対して、IPアドレスを割り当てる。
このようにする事で、eth0とeth1が一つのネットワークに見え、Linuxは一つのIPアドレスを持つ事になる。

NetBSDのbridgeは、複数のネットワーク間でパケットを素通しするために使う。
例えばeth0とeth1をブリッジすると、
・eth0に来たパケットは、eth1へ行く。
・eth1に来たパケットは、eth0へ行く。
・bridgeはIPアドレスを持たない。eth0とeth1はIPアドレスを持っている。
Linuxと同じように、eth0とeth1が一つのネットワークに見えるが、NetBSDの場合は二つのIPアドレスを持つ事になる。

参考
http://archive.netbsd.se/?ml=openbsd-misc&a=2006-05&t=2063095

2009-01-23

opensslのs_serverの不思議

以下のようなコードを書いた。これをopenssl.shとする。
#!/bin/sh

openssl s_server ...(省略)... &

bash上から、$ ./openssl.shとすると、バックグラウンドでopensslのs_serverが起動する。

NetBSD上で
$ ./openssl.sh
を実行すると、このs_serverにブラウザから接続できる。
しかし、Linux上で./openssl.shを実行すると、ブラウザから接続できない。

openssl.sh経由ではなく、以下のように直接opensslを実行すると、ブラウザから接続できる。
$ openssl s_server ... &


openssl.sh経由と直接の違いをktraceで調べてみた。

直接opensslを動作させると、
1. opensslがselectを呼ぶ
2. selectから抜ける。
3. ブラウザからの接続があり、通信を行う。
となるのだが、openssl.sh経由だと、
1. opensslがselectを呼ぶ
2. selectから抜ける。
3. fdの0(STDIN)が切られているので、プログラムを終了する。
と動作しているようだ。

なぜLinuxとNetBSDで動作が違うのかが不明。
bashの違い? opensslの違い?

動作が違う原因はわからないが、opensslのSTDINをcloseしてはいけないという事はわかった。
以下のようにする事で、回避する事にした。
1. openssl.shの中でopenssl s_serverを起動する時には、&を付けない。
#!/bin/sh

openssl s_server ...(省略)...

2. openssl.shを起動する時に、&を付ける。
$ openssl.sh &

2008-10-21

NetBSD4/currentのgdbで、info threadsが動作しない

NetBSD4とcurrentの、gdbでのpthreadサポートが動作しないようだ。

以下のプログラムをコンパイルする。
#include <stdio.h>
#include <pthread.h>

void *func(void *arg)
{
printf("hello\n");

sleep(10);
return 0;
}

int main(void)
{
pthread_t th;

pthread_create(&th, 0, func, 0);

pthread_join(th, 0);

return 0;
}
gdbでinfo threadsとしても、何も出力されない。
(gdb) run
Starting program: /home/sakurai/tmp/pth/a.out
hello
^Z
Program received signal SIGTSTP, Stopped (user).
0xbbb17667 in sa_yield () from /usr/lib/libc.so.12
(gdb) info threads
(gdb)

いくつかPRが出ているが、まだ修正されていない様子。
PR34194
PR35540
PR35657(これはclosed)

2008-09-24

phk mallocの内部動作の説明

*BSDでは、最近までphk mallocと呼ばれるmallocが使われていた。

社内ゼミ用に、phk mallocの内部動作の説明を書いたので、公開。

2008-09-11

NetBSD-currentでcannaserverが落ちるのを修正する

NetBSD-currentのバージョンを上げたら、cannaserverが動作しなくなってしまった。

cannaserverのlib/RK/ncache.cに、以下のコードがある。
#define hash(x)     ((int)((x)%NCHASH))

xはどこかのバッファのアドレスで、このアドレスを元にhashのインデックスを作成しているようだ。

このアドレスが0x80000000以上になるとhash(x)が負になってしまい、誤動作してしまう。
このバグを直すには、
#define hash(x)     ((int)(((unsigned long)(x))%NCHASH))

とcastしてやれば良い。

08/09/12追記:
他に困っている人いないのかな?と思って検索してみた。
- Orz日記でも取りあげられていた。
- cvs版では、06/03/30に修正済みだった。(未リリース)

2008-08-28

NetBSD4のSH7710用パッチ

NetBSD4のSH7710用のパッチを作った。
ターゲットボードは、BUG社(私の勤めている会社)のESPT2。

とりあえず動作する、という状態のソースだが、誰かの役に立つかもしれないので公開。

2008-07-14

MAKEDEV wdとすると、不正なデバイスができる

他にハマる人もいないとは思うけど、地味に30分くらいハマッたのでメモ。

MAKEDEVでwdのデバイスファイルを作る時
# cd /dev/
# ./MAKEDEV wd
とすると、不正なファイルが作成される。
# ls -l
c------r-x 1 root wheel 0, 0x00000280 Jul 14 18:09 rwd0a*
c------r-x 1 root wheel 1, 0x00000280 Jul 14 18:09 rwd0b*
c------r-x 1 root wheel 2, 0x00000280 Jul 14 18:09 rwd0c*
c------r-x 1 root wheel 3, 0x00000280 Jul 14 18:09 rwd0d*
c------r-x 1 root wheel 4, 0x00000280 Jul 14 18:09 rwd0e*
c------r-x 1 root wheel 5, 0x00000280 Jul 14 18:09 rwd0f*
c------r-x 1 root wheel 6, 0x00000280 Jul 14 18:09 rwd0g*
c------r-x 1 root wheel 7, 0x00000280 Jul 14 18:09 rwd0h*
brw-r----- 1 root operator 3, 0 Jul 14 18:09 wd0a
brw-r----- 1 root operator 3, 1 Jul 14 18:09 wd0b
brw-r----- 1 root operator 3, 2 Jul 14 18:09 wd0c
brw-r----- 1 root operator 3, 3 Jul 14 18:09 wd0d
brw-r----- 1 root operator 3, 4 Jul 14 18:09 wd0e
brw-r----- 1 root operator 3, 5 Jul 14 18:09 wd0f
brw-r----- 1 root operator 3, 6 Jul 14 18:09 wd0g
brw-r----- 1 root operator 3, 7 Jul 14 18:09 wd0h
正しくは、
# ./MAKEDEV wd0
のように、数字を付ける。
crw-r-----  1 root     operator    3,   0 Jul 14 18:12 rwd0a
crw-r----- 1 root operator 3, 1 Jul 14 18:12 rwd0b
crw-r----- 1 root operator 3, 2 Jul 14 18:12 rwd0c
crw-r----- 1 root operator 3, 3 Jul 14 18:12 rwd0d
crw-r----- 1 root operator 3, 4 Jul 14 18:12 rwd0e
crw-r----- 1 root operator 3, 5 Jul 14 18:12 rwd0f
crw-r----- 1 root operator 3, 6 Jul 14 18:12 rwd0g
crw-r----- 1 root operator 3, 7 Jul 14 18:12 rwd0h
brw-r----- 1 root operator 0, 0 Jul 14 18:12 wd0a
brw-r----- 1 root operator 0, 1 Jul 14 18:12 wd0b
brw-r----- 1 root operator 0, 2 Jul 14 18:12 wd0c
brw-r----- 1 root operator 0, 3 Jul 14 18:12 wd0d
brw-r----- 1 root operator 0, 4 Jul 14 18:12 wd0e
brw-r----- 1 root operator 0, 5 Jul 14 18:12 wd0f
brw-r----- 1 root operator 0, 6 Jul 14 18:12 wd0g
brw-r----- 1 root operator 0, 7 Jul 14 18:12 wd0h

warningくらい出してくれてもいいのに…

2008-07-10

disklabelとエンディアン

disklabelを調べて、ちょっとわかった事をまとめる。
disklabelを読み書きするにはdisklabel(8)を使うのだが、2通りの方法がある。
  • disklabel(8)は、ioctlでdisklabelの内容をkernel経由で読み(書き)する。

  • disklabel(8)に-rを渡すと、ディスクから直接disklabelを読み(書き)する。


disklabelのパーサーは、kernel内とdisklabel内の2つが存在し、disklabel(8)に-rを渡すと後者が使われる。

で、このパーサーに違いがある。
  • kernel内でのdisklabelのパーサーはSH3ではarch/sh3/sh3/disksubr.c。これは、デフォルトではEndian Independentではない。つまり、i386で作ったdisklabelをBig EndianのCPUでは読めない。

  • disklabel(8)内のdisklabelのパーサーは、Endian Independent。


これによって、どんな現象が起こるかと言うと、i386でdisklabelを付けたCFをsh3-ebで読もうとした場合に、
  • # disklabel wd0のようにすると、disklabelが無いかのように扱われる。(kernelが自動作成したfictitiousなdisklabelが見える)
  • # disklabel -r wd0とすると、i386で作ったdisklabelが読める


SH3でdisksubr.cをEndian Independentにするには、confにoptions BSDDISKLABEL_EIと書くと良い。

2008-06-26

VSTHlite - pthreadsのテストスイート

VSTHlite
NetBSDでVSTHliteを使う方法

via tech-misc

SH3ボード上のNetBSDで、CF動作に成功

自社のSH3(SH7710)のボードにNetBSD4.0をポーティングしていたのだが、
やっとCFを動作させる事に成功。
長かった…

epppcic.cを参考に作ったのだが、kthreadの動作でよくわからない所がある。

attach()
{
...
kthread_create(thread1, ph);
}

thread1()
{
...
kthread_create1(thread2, ph, ...);
kthread_exit(0);
}

thread2()
{
...
}

としていたのだが、これだと、なぜかfixjobcで落ちてしまう。
kthread_exit(0)を抜くと動作した。
なぜだろう。親threadはexitしてはいけないというルールでもあるのだろうか。

2008-06-17

MBRラベルから、BSDのdisklabelを作る

BSDでは、ディスクのパーティーション情報はdisklabelに書いてあり、MBRに書いてある情報は使わない。

mbrlabel(8)を使うと、MBR(Master Boot Record)ラベルから、BSDのdisklabelを作成してくれる。

via netbsd-users

2008-05-13

master.passwdとpasswdとpwd.dbとspwd.dbの関係

/etc/master.passwdが元となるファイル。
これから、pwd_mkdbを使って、以下が作られる。
  • passwd: master.passwdからパスワードを取り除いた物。だれでも読める。
  • spwd.db: master.passwdをBerkeley DBにした物。rootしか読めない。
  • pwd.db: passwdをBerkeley DBにした物。だれでも読める。

参考:
http://www.samba.gr.jp/ml/article/sugj-tech/msg06004.html
http://x68000.q-e-d.net/~68user/unix/pickup?pwd_mkdb

2008-05-12

crunchgenの仕組み

*BSDには、複数のプログラム(コンポーネント)を結合して、一つの実行ファイルにするcrunchgenというプログラムがある。

要は、Linuxでのbusyboxのような物。

社内ゼミ用に、crunchgenの仕組みの資料を作った。

2008-05-08

NetBSDのroot ramdiskで、initをmulti user modeで動作させる

root ramdiskを使った場合、initはsingle user modeで起動してしまう。

なぜかと言うと、

  • dev/md_root.cのmd_open_hook()で、boothowto |= MEMORY_RBFLAGSとしている。MEMORY_RBFLAGSの値は、RB_SINGLE。

  • kern/init_main.cのstart_init()で、boothowto & RB_SINGLEだったら、-sを付けてinitを起動している。

  • initは-sを付けて起動されると、single user modeで起動する

よって、initをmulti user modeで起動するには、kernelのconfファイルで、

options MEMORY_RBFLAGS=0

のように、MEMORY_RBFLAGSの値を上書きしてやれば良い。

2008-05-02

NetBSDのcrunchgenで、SMALLPROGを0にしてビルドする方法

NetBSDのユーザーランドのいくつかのプログラムは、SMALLPROGをdefineしてビルドすると、小さいバイナリを作る事ができる。

例えば、
・initは、single user modeのみ
・ddは、ASCIIとEBDICの変換なし
・shは、printfコマンド無し
など。

NetBSDのcommon/Makefile.crunchには、小さいプログラムを作るためのオプションが用意されていて、
・SMALLPROGを0にすると、各プログラムのmake時にそのままビルドする。
・SMALLPROGを1にすると、各プログラムのmake時にSMALLPROG=1にしてビルドする
という機能がある。SMALLPROGが設定されていないと、SMALLPROG=1となる。

Makefile.crunch経由で、通常の大きなプログラムを作ろうと思った場合、
$ make SMALLPROG=0
や、
$ SMALLPROG=0 make
としても、小さいinit/dd/shプログラムを作る事ができない。

なぜなら、
・SMALLPROGが0にdefineされている。
・init/dd/shのMakefileは、SMALLPROGがdefineされていた場合、小さなプログラムを作る(値が0か1か、ではない)。
となっているため。

Makefile.crunchgen経由で小さいプログラムを作るには、makeの引数にSMALLPROG=0 と書くのではなく、Makefile.crunchgenを.includeするMakefileに、
SMALLPROG=0
と書く必要がある。

2008-04-02

pkgsrcで、依存したパッケージをinstallせずに、extractだけを行う

pkgsrcで、make extractを行うと、ソースをextractするよりも先に、依存したパッケージをinstallしてしまう。

make extract SKIP_DEPENDS=yes
とすると、依存したパッケージをinstallせずに、extractしてくれる。

単に「extractしてソースだけ見たい」という場合に便利。

via tech-pkg

2008-03-28

NetBSDでBluetoothを使う

結構手こずってしまった。

基本的には、
http://www.netbsd.net/docs/guide/en/chap-bluetooth.html
http://wiki.netbsd.se/index.php/Bluetooth
に書いてある通りにした。

BDアドレスに名前を付けるには、
/etc/bluetooth/hosts
に、
XX:XX:XX:XX:XX:XX myphone
のように書けば良い。

BDアドレスを知るには、
$ btconfig ubt inq

ペアリングするには、
$ sudo btpin -p 1234 -a myphone
のようにする。
btpinを実行すると、一定時間、ペアリングができるようになる。
この間に、携帯等から接続したり、その逆を行えば良い。

私使っているBTドングルは、
ubt0 at uhub0 port 2 configuration 1 interface 0
ubt0: Cambridge Silicon Radio Bluetooth USB Adapter, rev 1.10/5.25, addr 2

という物。
/etc/rc.confは、以下のようにした。
btconfig_args="up -iscan pscan auth encrypt switch -hold -sniff -park class 0x02010c ptype 0x0018"
このへんをうまく設定してやらないと、通信ができない。
(これらの値の意味はよくわかっていないけど)

これでやっと、obexftpを使って携帯から画像を取り出せるようになった。

2008-01-08

Broadcomのwifiチップを使った製品のリスト

Broadcomのwifiチップを使った製品のリスト。
Broadcomはバイナリドライバしか提供していないので、NetBSDではBroadcomのチップを使った製品は動作しないようだ。

2007-12-19

mprotectでPROT_WRITEした領域へのmemsetができない場合がある

NetBSDのcompat-linuxな環境で、以下のコードが動作しないらしい。
mprotect(buf, len, PROT_WRITE);
memset(buf, 0, len);
原因は、glibcがmemset時にリードアクセスを行う事があるためらしい。

memset時にリードアクセスをすると速くなる(事がある)理由は、以下の通り。
・アーキテクチャによっては、read時のキャッシュミスではキャッシュをfillし、write時のキャッシュミスではfillしない物がある。
・そのようなアーキテクチャの場合、4バイト毎に実メモリへの書き込みが発生してしまう。
・事前に一回空readをしてキャッシュラインをfillしておくと、writeアクセスは実メモリではなくキャッシュに対して行われるようになり、高速に書き込みが行われる。

via current-users@netbsd

2007-11-30

NetBSDでwpaを使う

NetBSD-4から、WPAがサポートされている。
その設定方法のメモ。

1. /etc/wpa_supplicant.confに、以下のような記述をする。

network={
ssid="APのSSID"
scan_ssid=1
key_mgmt=WPA-EAP
eap=PEAP
phase2="auth=MSCHAPV2"
identity="ユーザー名"
password="パスワード"
}

2. 以下のコマンドで、wpa_supplicantを実行してみる。

# wpa_supplicant -i ath0 -c /etc/wpa_supplicant.conf -dd

ifconfigでath0のstatusがactiveとなれば、接続できている。

3. うまく行ったら、rc.confに以下のように書く

wpa_supplicant=YES
wpa_supplicant_flags="-B -i ath0 -c /etc/wpa_supplicant.conf"


ちなみに、wi0ではおそらくWPAはできない。Atheros系のカード(ath)じゃないとダメなようだ。


参考: NetBSDのwiki