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
google-code-prettify
2009-01-23
opensslのs_serverの不思議
以下のようなコードを書いた。これをopenssl.shとする。
bash上から、
NetBSD上で
しかし、Linux上で./openssl.shを実行すると、ブラウザから接続できない。
openssl.sh経由ではなく、以下のように直接opensslを実行すると、ブラウザから接続できる。
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を起動する時には、&を付けない。
2. 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サポートが動作しないようだ。
以下のプログラムをコンパイルする。
いくつかPRが出ているが、まだ修正されていない様子。
PR34194
PR35540
PR35657(これはclosed)
以下のプログラムをコンパイルする。
#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
2008-09-11
NetBSD-currentでcannaserverが落ちるのを修正する
NetBSD-currentのバージョンを上げたら、cannaserverが動作しなくなってしまった。
cannaserverのlib/RK/ncache.cに、以下のコードがある。
xはどこかのバッファのアドレスで、このアドレスを元にhashのインデックスを作成しているようだ。
このアドレスが0x80000000以上になるとhash(x)が負になってしまい、誤動作してしまう。
このバグを直すには、
とcastしてやれば良い。
08/09/12追記:
他に困っている人いないのかな?と思って検索してみた。
- Orz日記でも取りあげられていた。
- cvs版では、06/03/30に修正済みだった。(未リリース)
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
2008-07-14
MAKEDEV wdとすると、不正なデバイスができる
他にハマる人もいないとは思うけど、地味に30分くらいハマッたのでメモ。
MAKEDEVでwdのデバイスファイルを作る時
warningくらい出してくれてもいいのに…
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のパーサーは、kernel内とdisklabel内の2つが存在し、disklabel(8)に-rを渡すと後者が使われる。
で、このパーサーに違いがある。
これによって、どんな現象が起こるかと言うと、i386でdisklabelを付けたCFをsh3-ebで読もうとした場合に、
SH3でdisksubr.cをEndian Independentにするには、confにoptions BSDDISKLABEL_EIと書くと良い。
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
SH3ボード上のNetBSDで、CF動作に成功
自社のSH3(SH7710)のボードにNetBSD4.0をポーティングしていたのだが、
やっとCFを動作させる事に成功。
長かった…
epppcic.cを参考に作ったのだが、kthreadの動作でよくわからない所がある。
としていたのだが、これだと、なぜかfixjobcで落ちてしまう。
kthread_exit(0)を抜くと動作した。
なぜだろう。親threadはexitしてはいけないというルールでもあるのだろうか。
やっと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
2008-05-13
master.passwdとpasswdとpwd.dbとspwd.dbの関係
/etc/master.passwdが元となるファイル。
これから、pwd_mkdbを使って、以下が作られる。
参考:
http://www.samba.gr.jp/ml/article/sugj-tech/msg06004.html
http://x68000.q-e-d.net/~68user/unix/pickup?pwd_mkdb
これから、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の仕組みの資料を作った。
要は、Linuxでのbusyboxのような物。
社内ゼミ用に、crunchgenの仕組みの資料を作った。
2008-05-08
NetBSDのroot ramdiskで、initをmulti user modeで動作させる
root ramdiskを使った場合、initはsingle user modeで起動してしまう。
なぜかと言うと、
のように、MEMORY_RBFLAGSの値を上書きしてやれば良い。
なぜかと言うと、
- 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で起動する
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経由で、通常の大きなプログラムを作ろうと思った場合、
や、
としても、小さいinit/dd/shプログラムを作る事ができない。
なぜなら、
・SMALLPROGが0にdefineされている。
・init/dd/shのMakefileは、SMALLPROGがdefineされていた場合、小さなプログラムを作る(値が0か1か、ではない)。
となっているため。
Makefile.crunchgen経由で小さいプログラムを作るには、makeの引数に
と書く必要がある。
例えば、
・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
2008-03-28
NetBSDでBluetoothを使う
結構手こずってしまった。
基本的には、
http://www.netbsd.net/docs/guide/en/chap-bluetooth.html
http://wiki.netbsd.se/index.php/Bluetooth
に書いてある通りにした。
BDアドレスに名前を付けるには、
に、
のように書けば良い。
BDアドレスを知るには、
ペアリングするには、
のようにする。
btpinを実行すると、一定時間、ペアリングができるようになる。
この間に、携帯等から接続したり、その逆を行えば良い。
私使っているBTドングルは、
という物。
/etc/rc.confは、以下のようにした。
このへんをうまく設定してやらないと、通信ができない。
(これらの値の意味はよくわかっていないけど)
これでやっと、obexftpを使って携帯から画像を取り出せるようになった。
基本的には、
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のチップを使った製品は動作しないようだ。
Broadcomはバイナリドライバしか提供していないので、NetBSDではBroadcomのチップを使った製品は動作しないようだ。
2007-12-19
mprotectでPROT_WRITEした領域へのmemsetができない場合がある
NetBSDのcompat-linuxな環境で、以下のコードが動作しないらしい。
memset時にリードアクセスをすると速くなる(事がある)理由は、以下の通り。
・アーキテクチャによっては、read時のキャッシュミスではキャッシュをfillし、write時のキャッシュミスではfillしない物がある。
・そのようなアーキテクチャの場合、4バイト毎に実メモリへの書き込みが発生してしまう。
・事前に一回空readをしてキャッシュラインをfillしておくと、writeアクセスは実メモリではなくキャッシュに対して行われるようになり、高速に書き込みが行われる。
via current-users@netbsd
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に、以下のような記述をする。
2. 以下のコマンドで、wpa_supplicantを実行してみる。
ifconfigでath0のstatusがactiveとなれば、接続できている。
3. うまく行ったら、rc.confに以下のように書く
ちなみに、wi0ではおそらくWPAはできない。Atheros系のカード(ath)じゃないとダメなようだ。
参考: NetBSDのwiki
その設定方法のメモ。
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
登録:
投稿 (Atom)