2007-03-30

アレンジメール(SBM)のMIMEタイプ

ソフトバンクモバイル端末向けに「アレンジメール」のテンプレートをダウンロードさせるには、ファイル名のサフィックスを .hmtにして MIME typeが application/x-htmlmail-template になるように設定する。Apacheの mime.typesファイルに

application/x-htmlmail-template hmt

とでも追加すべし。

アレンジメールとやらが何なのかはよく知らない。

2007-03-29

全部入りメディアリーダー/ライターを Linuxで使う時

オウルテックのFA405MX3みたいな「どんなメモリーカードでもござれリーダー/ライター」を Linuxで使う場合、各スロットが別々の論理ユニットとして扱われているらしく、Device Drivers→SCSI device support→Probe all LUNs on each SCSI device をyにしてやらないければいけないことを知った。これをしないと最初の LUN(FA405MX3の場合はCompactFlashスロット)しか認識できない。

しかし2000円もしないデバイスが論理ユニットに分割されているなんてすごい世の中になったものだ。

ラベル:

2007-03-27

ソリッドステート・ドメイン0【その3】

前回の続き。

前回までで、ドメイン0のルートパーティションをフラッシュメモリに移すことができた。
でもそれだけじゃつまんないでしょう。出来るの当たり前だし。

さて、ドメインUたち(これらは相変わらずハードディスク上で動作中)は、どれくらいドメイン0から自立しているのか試してみよう。たとえば、ドメイン0に障害が起こっても、ドメインUは引き続き動作できるのか?

適当なドメインUで在る程度時間のかかる処理を走らせる。

genkernel bzImage


走っている最中に、

(ば・・・ばかな!まさか!)






えーーーーーい(ズシャァァァア)

コンソールに出力されるはカーネルの阿鼻叫喚。いかんともしがたい状態に陥るドメイン0。よいこはまねをしてはいけません。



しかしそれでもドメインUは動作を続け、genkernelは「ブートスプラッシュを見たいなら・・・」などという呑気なWARNINGを出して何事もなかったかのように終了。sshで新しくリモートログインも出来る。
ドメイン0のディスクに障害が起こったくらいでは、ドメインUには(急には)影響しないようだ。もちろん、ディスク障害がデバイスドライバやカーネル内部プロセスの障害に発展すれば別だろうけど。

ドメイン0は Privileged domainという名目で数々の特別扱いを受けているものの、Xen本体から見ればドメインのひとつに過ぎない(のだと思う)。つまり、VirtualPCや VMWareがホストOSの中でゲストOSを動作させるのと同じように Xenではドメイン0の中でドメインUが動いていると考えるのは少し間違い(なのだと思う)。

さてドメインUは無事なものの、ドメイン0が再起不能となった今もはや新たにドメインを起動することも出来ない。
PCのリセットボタンに手が伸び、狂った実験は幕を閉じたのだった。

ラベル:

ソリッドステート・ドメイン0【その2】

前回の続き


PCでマイクロSDを読み書きするためのインターフェイスといえば USBしかないので、3.5インチベイに内蔵するタイプの USBカードリーダー/ライターを取り付け。2000円弱で売っているオウルテックのFA405MX3というもの。なんとマイクロSDを直接挿せるスロットが・・・(SD/miniSDとの同時使用はできないとのこと)


早速マイクロSDカードを差し込み、dmesgで認識されたことを確認。udevの取り計らいにより、このメモリカードへは
/dev/disk/by-id/usb-Generic-_SD.MMC_200211111(略)
という名前でアクセス出来るようだ。/dev/sdXだといつもコロコロ変わって不便だから固定の名前がつくのっていいよね。でも長いよ。

普通に fdiskと mkfs.xfs して適当な場所にマウントし、ルートパーティションの内容を丸ごとコピー。さすがに時間がかかる(SDメモリにスループットは期待しないこと。とてもがっかりするから)。
コピーには cp -avxコマンドを使ったが、ルートファイルシステムを -xオプションつきでコピーすると /dev以下がコピーされないので注意(udevもdevfsも使っていない人以外...)。

さて、カーネルのroot=や /etc/fstabにこんな長い名前を書くのはゴメンなので、パーティションにラベルをつけてやることにする。
ルートファイルシステムなので root とつけてやろう(安易)
ラベルを付けるコマンドはファイルシステムによってそれぞれだが、今回はXFSを選んだので下記のように。

xfs_admin -L root /dev/disk/by-id/usb-Generic-_SD.MMC_200211111(略)-part1

こうしておくとfstabに
/dev/disk/by-id/usb-Generic-_SD.MMC_200211111(略)-part1
なんて書かなくても、
LABEL=root
と書けば勝手にそのラベルがついたパーティションを探してマウントしてくれる。

/etc/fstabと /boot/grub/grub.confを書き換える。
カーネルのオプション(実際は initrdに渡される)に scandelay 指定を付ける必要があった(Gentoo以外では違うやり方かも)。そうしないとメモリカードを認識する前にルートファイルシステムをマウントしようとして失敗する。

書き換えができたらリブートし、めでたく小指の先ほどのメモリで OSが起動するのだった。

なぜか続く

ラベル:

ソリッドステート・ドメイン0【その1】

このソリッド野郎!

・・・というわけで、Xenのドメイン0といえばドメインUを「管理」するためのドメインである。
極端な話、必要なハードウェアを認識していて、xendが走っていて、xmコマンドが動けばよろしい。
だったら、ドメイン0を起動するためのボリュームは容量を小さくしてフラッシュメモリに入れてしまえば面白いのでは。
と、思いついたので実践してみた。それほど意味はない。

それより前にまずこれ。
IDE用32MBフラッシュ
うちの Linuxマシンには全部これ(IDE用32MBフラッシュメモリ)が刺さっている。
何に使うんだそんなものだって?grubとカーネルとinitrdが入ってるのさ。(それより何処で買うんだこんなもの→ここです
これで、どんな構成で記憶装置を接続していようが BIOSは「プライマリIDE」の「マスター」であるこのメモリ(/dev/hda)を確実に優先して起動デバイスに選択し、ブートできるという寸法だ。こうしておけば何があってもブートローダーを経てカーネルまでは起動出来るので、障害から復帰しやすくなる(grubのコマンドラインを使える人限定だけど)。

しかし残念なことに、32MBからカーネル等の分を引いた容量ではそう簡単にドメイン0を運用できそうにないので(ドメインの管理をするための各種スクリプトを実行するにはPythonが要る)このフラッシュメモリはブート専用とし、次なる記憶装置としてこれを選んでみた。
microSD 1G
これは!最近の携帯電話で採用されまくって急速に普及中のマイクロSDじゃないか!(1ギガバイト1980円。よく探せば1500円以下で買える)
写真で見ての通り、小指の先ほどの大きさ。吹けば飛ぶぞ!
っていうかこんなもので OS動かそうってアホかおまえは!

続く

ラベル:

11n AirMac Extreme購入


図のごとく、既に所有のAirMac Expressと組み合わせて WDSで離れたネットワークをブリッジするために購入。便利。

2007-03-24

DVD-Rをテープ代わりに使う(実践編)

DVD-Rをテープ代わりに使う(能書き編)からの続き。

※この記事で扱っている内容を実際に運用した結果について責任は持てませんので、やるなら必ず自分で検証してからにしてください。

UNIXライクなシステムでは、かなり昔から CD-Rを焼くのに cdrecordというツールが使われてきた。
今では、これが DVD(-R/RW/+R/RW/etc...)にも対応し、cdrecord-ProDVDという名前になっている。
(このプログラムの設計を巡っては、作者とLinuxコミュニティとの間で激しく争われたようで、今でも情報を検索すると簡単にフレームの応酬を見つけることが可能だがそれはさておき)

このcdrecordというツールは CD/DVDを焼くことそのものについては大変多機能だが、テープのようにメディアを交換しながらシーケンシャルに淡々とデータを保存していくという目的のためには作られていない。そこで、cdrecordを使ってそのようなことを実現するためのフロントエンドツールをドイツの Stefanという人が作ったようなので利用してみた。ツールの名前は cdbackup/cdrestoreである。

cdbackupはバックアップと銘打つものの、tarやcpioでシリアライズされたストリームをメディアに書き出し、必要に応じて交換を要求する(cdrestoreはその逆)というシンプルな機能を提供するだけのソフトウェアで、差分バックアップといった高級な機能を持ち合わせていないので、そのような要件に対しては別のツールを組み合わせて対応する必要があることに注意すること。

Portageからであれば emerge cdbackupでインストールできる。が、x86_64用ではないため私の環境では強引にUnmaskしてやる必要があった(これによると思われる問題は後述)
また、cdbackupは CD-Rに対してバックアップを行う場合は cdrecord を、DVD-Rに対してバックアップを行う場合には dvdrecordという名前で外部コマンドを実行するようになっているため、dvdrecordという名前で cdrecordのシンボリックリンクを作成してやる必要があった。

cdbackupは常に標準入力からストリームを読み込む。コマンドラインは下記のようになる。

tar cvf - *.gz | cdbackup -R -C -m -s 8 -d /dev/dvd -r /dev/dvd -a "test"

上はカレントディレクトリにある全ての gzippedなファイル群をtarでまとめたストリームを/dev/dvdとして認識されているDVD-Rデバイスに8倍速で書き込み、"test" という識別子をつけるコマンドである。メディアいっぱいまで書き込まれるごとに、"Please insert next disk and press RETURN"というメッセージが表示されメディアの交換が促される。各オプションの意味は下記のとおり。

-R ... 書き込み先がCD-RでなくDVD-Rであることの指定
-C ... CRCを使用しない(詳しくは後述)
-m ... 複数メディアにまたがるバックアップを行う
-s ... 書き込み速度の指定
-d ... DVDデバイスの指定
-r ... DVD-Rデバイスの指定(最近の環境では -dと同じ物を指定すれば動くはず,但しこれは意図した動作でないと cdrecordが文句を言う)
-a .. このバックアップに対する命名

バックアップしたメディアセットからファイルをリストアするには、メディアセットの先頭となるディスクをドライブに挿入したのち下記のようなコマンドラインを用いる。

cdrestore -d /dev/dvd -t 1 | tar xvf -

-d ... DVDデバイスの指定
-t ... トラック番号の指定(普通は1)

cdrestoreコマンドのパイプ先は、cdbackupにストリームを送ったコマンドの逆をするコマンドである。

これで、安価なDVD-Rドライブを使ってあたかもテープのようなバックアップ・リストアが出来るようになった。残る問題はメディア交換地獄だけだ。Blu-rayがはやく手の届く価格帯へおりてきますように。

さて、cdbackupに -Cオプションをつけた理由に疑問をもつ人もいるだろう。大切なバックアップなのに何故CRCチェックを外してしまうのかというと、何故か私の環境ではCRCをつけるとリストアの時にエラーで止まってしまうからだ。ソースをちらっとだけ見たのだが、おそらくこれは 32bit用のコードを単純に 64bitでコンパイルしたためではないかと推測している。ちゃんとソースを追えば確認するなり直すなり出来ると思うのだが、時間があまりないので CRCを外すという場当たり的対処をしてしまった。

CRCをつけてもエラーにならない環境の人や、自分でコードを修正できる人は是非CRCをつけて運用していただきたい。

ラベル:

DVD-Rをテープ代わりに使う(能書き編)

バックアップ用のデバイスで典型的なものといえばテープだが、テープドライブは高価なうえに最近はハードディスクが安いので disk to diskのバックアップで済ませることも多いと思う。
なにせハードディスクのギガバイト単価はベアドライブなら30円を割り込んでいる。

しかしdisk to diskのバックアップは、常に最新のデータで上書きするような形で毎晩自動的にディスクの内容をコピーするような形になりがちではないだろうか。これだと2日以上前のデータを取り出すことが出来ない。

1回のバックアップを取るのに必要な容量の7倍にわたるバックアップ用のディスクを用意できるなら、date +%aコマンドの出力を使ってバックアップの出力先をローテーションすることで一週間分の履歴まで保存できる。だがそれでも遡れるのは一週間である。

毎日分のバックアップを消さずに残し、バックアップ用のディスクが不足したら交換して外したHDDは棚にしまっておくというリッチな運用も可能かもしれないが、ハードディスクはホストから外してしまっておくよりもっと価値のあることに利用したくなるのが普通だ。第一重くて保管場所を取る(ベアドライブを裸で保管するなら容積は小さいか?)。

履歴を残しつつ容量を節約してバックアップを行う方法としてインクリメンタル(差分)バックアップがある。しかしこれには、差分をとれるファイルシステムを使ったり、難しいバックアップツールを使いこなしたり、時にはプロプライエタリなソフトウェアに頼らざるを得なかったりする分それなりの時間的あるいは金銭的な投資を必要とする。

差分バックアップは理想的な方法だが、別のアプローチも考えてみよう。実はハードディスクより容量単価の安いメディアが存在する。それは DVD-Rだ。DVD-Rメディアのギガバイト単価は、ものによるが国産の確実なものでも 10円台である(50円/4.7GB)。書き込みを行うためのドライブも 5千円〜1万円で入手できる。しかも家電量販店で。

普段は disk to diskのバックアップを毎晩自動で行いつつ、週毎又は月毎のタスクとして自動バックアップされたデータを手動で DVD-Rに書き出し、フォルダに入れてキャビネットに納めていくような運用にすれば、経済的に履歴を保存することが可能ではないだろうか。

問題はディスク1枚あたりの容量が 4.7ギガバイトと小さいことだ。100ギガバイトのデータをバックアップするために必要なメディアの交換回数を想像すると気が遠くなるだろう。したがって、手のあいているスタッフが居るオフィスでしかこのアイディアは使えないかもしれない。あるいは、Blu-rayの普及を待つか・・・?

それはともかくとして、実際に DVD-Rを使ってテープを使うかのようにバックアップを行う方法を次のエントリで紹介する。

DVD-Rをテープ代わりに使う(実践編)へ

ラベル:

Serial ATA接続の DVD-RWドライブをLinuxで使う

物好きなので Serial ATA接続の DVD-RWドライブであるパイオニア DVR-212Dを買ってみた。バルク品。

Sillicon ImageのシリアルATAコントローラに接続してマシンを起動すると、BIOSでは認識される。
しかしカーネルには認識されなかったようなので dmesgしてみると、
WARNING: ATAPI is disabled, device ignored.
みたいなことを言われていた。どうやら libataのオプションとして atapi_enabled=1 をつけてやらなければいけないらしい。

カーネルに libataがビルトインされているならカーネルのオプションとして libata.atapi_enabled=1をつける。
libataをモジュールとしてロードしているなら、libataをロードするときに atapi_enabled=1がつくようにすれば良いようだ。

・・・とかせっかく書いたのだけど。Linux 2.6.17からはこんなことしなくても良いみたい。ちぇ。
うちで使っている Xen-compatibleなカーネルが 2.6.16だからねえ。

あと、最近のマザーボードにはよく JMBの Serial ATAコントローラが載ってるんだけど、これは AHCIのドライバで動作するよ。

ラベル:

2007-03-23

Gentooでソフトウェア RAID0

最近のマザーボードはシリアルATAのポートを4つとか6つとか搭載している。
大抵の人はこんなに使わないで余らせていると思うし、4つもディスクの搭載できる筐体を持っているとも限らない。

しかし4つのポートを束ねて1個のマルチレーンコネクタとして筐体の外に出すと、下手なSCSIより速い外付けストレージ環境が手に入ることに注目されたい。
参考:マルチレーンの活用記事

さて、せっかくたくさんディスクを並べたらRAIDにしないともったいない。
RAIDコントローラは高いので、さしあたりはソフトウェアRAIDにしようという人も多いはず。
そんなわけで RAID0の組み立て手順をメモ。
(注:RAID0は速いけどMTBFが異様に短くなるので通常の運用にはお勧めしません)

各ディスクに fdiskで同じ大きさのパーティションを作成する。ここでは /dev/sda /dev/sdb /dev/sdc /dev/sddにそれぞれ /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1 を作成したことにする。それぞれのパーティションタイプは 0xfdにしておくと良いかも知れない(そうしておくとOSがこのパーティションをRAIDのメンバだとすぐ認識できる)

LinuxでソフトウェアRAIDを組むには mdadmというツールを使用する。まだ入れてなければ
emerge mdadm
する。

RAID0ボリューム /dev/md0を下記のコマンドで作成

mdadm --create --verbose /dev/md0 --level=0 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

次回起動時にアレイの情報を確実に自動復元できるよう設定ファイルへ追記

mdadm --detail --scan >> /etc/mdadm.conf

アレイを監視させるために mdadmをデーモンとして自動起動するよう rc-updateする

rc-update add mdadm default

ここまでで RAID0の構築は完了。試しに論理ボリュームを作ってみよう。

pvcreate /dev/md0
vgcreate raid0 /dev/md0
lvcreate -n test -L 1G raid0

これで1GBの論理ボリューム /dev/raid0/test が作成されたので、書き込みテストをしてみる。

dd if=/dev/zero of=/dev/raid0/test bs=1M count=1024
1073741824 bytes (1.1 GB) copied, 5.08022 s, 211 MB/s


211MB/秒の書き込み速度。
シリアルATAのポートが4ポートとも同じPCIバスにつながっている場合、バスの帯域がボトルネックになってこの半分くらいの速度しか出ないので注意。(211MB/秒の例は PCI-Express x1スロットも併用している)

ラベル: ,

xendをnfsdより後に起動させるように rcスクリプトを調整する

うちの場合、全てのドメインUから ドメイン0のリソースを NFSで参照するので、xend(と、自動起動のドメインUたち)が nfsdより後に起動してくれないと困る。
Gentooの場合、rcスクリプトの中にdepend(){}というセクションがあって、ここで起動順序を制御できる。

デフォルトの /etc/init.d/xend では

depend() {
need net
before xendomains sshd ntp-client ntpd nfs nfsmount rsyncd portmap dhcp
}

のようになっていたので、

depend() {
need net
before xendomains
after sshd ntp-client ntpd nfs nfsmount rsyncd portmap dhcp
}

というふうに xendがとにかく最後に起動するようにした。

ラベル: ,

2007-03-22

Xenで複数のネットワークインターフェイスを domUに提供する

Xenはネットワークインターフェイスをドメイン0とドメインUの間でブリッジできる。
簡単にいうと、ドメイン0で認識されているネットワークインターフェイスを、ドメインUでも共有できるということである。

ドメイン0で xendを起動すると、ネットワークインターフェイスをドメインUにブリッジするための仮想インターフェイスが起動される。それらは xenbrというプレフィクスのネットワークインターフェイスである。

Xenのデフォルトでは、ドメイン0で認識されている一番最初のネットワークインターフェイス(大抵 eth0だろう)に対して xenbr0を自動的に起動する。ドメインの設定ファイルに

vif=[""];

と書くと、xenbr0がドメインUから eth0 として利用できるようになる。
(どうやら "" は "bridge=xenbr0" の省略記法のようだ)

さて、ドメインUに複数のネットワークインターフェイスを持たせたい場合は、ドメイン0における 2番目以降のインターフェイスに対しても xenbrデバイスを起動しなくてはならない。これにはちょっとしたスクリプトを作成して、それが xendの起動時に呼び出されるよう設定を変更する必要がある。

/etc/xen/scripts に、適当な名前(ここではmy-network-script)で下記のようなシェルスクリプトを作成し、実行権限をつける。
vifnumは xenbrデバイスにつける番号、 netdevはブリッジしたい実デバイスの名前。


#!/bin/sh
dir=$(dirname "$0")
"$dir/network-bridge" "$@" vifnum=0 netdev=eth0
"$dir/network-bridge" "$@" vifnum=1 netdev=eth1


さらに xendの設定ファイル /etc/xen/xend-config.sxp を開き、上で作ったスクリプトファイルをを呼び出すように変更する。


(network-script network-bridge)



(network-script my-network-script)


これで xendを再起動したら、xenbrデバイスが複数になっているはず。

実際のドメイン設定ファイルで複数のネットワークインターフェイスを定義するには、
vif=["","bridge=xenbr1"];
のようにカンマで区切って2番目以降の xenbrデバイスを追記する。
この記述の場合 xenbr1はドメインU側で eth1として認識される。

ラベル:

2007-03-21

xfs_growfsと/dev/rootの謎

仮想マシンのルートファイルシステムを拡張しようとして dom0から lvextendし、domUの中で
# xfs_growfs /

とやると
/dev/root: No such file or directory (/dev/rootなんてナイヨ)
といって怒られる。

そんなデバイスを指定した覚えはないのだが、もしかしたら /proc/mountsの中を見ているのかもしれない。

なぜ/proc/mountsでは、ルートファイルシステムが/dev/rootにあるように記述されているのかわからない。dom0の/proc/mountsにはちゃんと存在するデバイスが書かれていた。initrdを使うかどうかが関係しているのだろうか。

とりあえず 実デバイスのシンボリックリンクを /dev/root として作成してやれば xfs_growfsを騙すことは出来るみたいだ。

ラベル:

最新のnForceマザーボードをXenで使うためにforcedethドライバをハックする

統合チップセットnForceの搭載されたマザーボードは市場に多く出回っている。
これにオンボード搭載されているイーサネットを Linuxで使いたければ、大抵 forcedeth というドライバで動作させることができる。
しかし、nForceのオンボードイーサネットコントローラにも色々バージョンがあるようで、forcedethドライバのバージョンが古い(つまりカーネルのバージョンが古い)とドライバ内のデバイス識別子リストに該当せず認識させられないことがある。
nForceに限らずこれはシリーズ物のハードウェア全般に言えることだが。

さて、この前買ってきた nForce430マザーに搭載のイーサネットコントローラは Linux 2.6.16の forcedethドライバで認識できなかった。単にドライバが新しいデバイスのIDを知らないだけだというのは何となく想像がつく。
かといって Linuxのバージョンを上げるわけにはいかない状況だった。なぜかというと Xenを使っているから。
私は Portageと genkernelを使ってしか Xen対応のカーネルをセットアップできないヘタレ者なので、仮に Xenがもっと新しい Linuxカーネルに対応していたとしても Portageが追従しない以上手出しできない(ことにしている)。

デバイスIDを追加するだけならドライバソースに手で入れてやれば良い。

---
Xen対応化されたカーネル
linux-2.6.16-28-xen

最新のカーネル
linux-2.6.20.3
---

まずは、最新のPCIデバイスリストを最新カーネルから拝借

# cp linux-2.6.20.3/include/linux/pci_ids.h linux-2.6.16-28-xen/include/linux/

で、
linux-2.6.20.3/drivers/net/forcedeth.c
linux-2.6.16-28-xen/drivers/net/forcedeth.c
の中でデバイスリストを定義している部分に目を付け、ここを中心に手マージする。
なお今回は、MCP61というデバイスのIDがリストになかったためデバイスが認識されないでいた。

デバイスIDの追加で、一応はデバイスが認識されるようになったが動作がおかしい。
どうやら一部のチップでは MACアドレスのオーダが逆順になるらしい。シリーズ物なのにそんな微妙な個性ださなくてよろしい。
最新カーネルのドライバソースにはそれの対応も含まれていたので、めんどくせえなと思いつつその部分も手マージ。
これで思った通りに動作した。

できたdiffを載せようかと思ったけど誰か他の人がこれと同じシチュエーションに遭遇するケースはかなりレアだと思うのでやめ。

当然だが、こういう真似をするためにはC言語を読めることが必須。

ラベル:

ASUS M2N-VM DHの無線LANをGentoo Linuxで使う

ASUSのマイクロATXマザーボード M2N-VM DH にはオンボードの無線LANが載っている。
どうやらこれは RTL8187というチップらしい。
USB接続なので、カーネルにEHCI(USB2.0)サポートが組み込まれている必要があることに注意。

RTL8187のドライバはカーネルに含まれて居いないが、Portageからインストール出来る。
また、無線関係の設定ツールとして wireless-toolsも必要。

emerge rtl8187 wireless-tools

udevがお節介を焼いてくれれば、次回ブート時に r8187.koが自動でロードされ、wlan0 デバイスが現れる。


rtl8187: Initializing module
rtl8187: Wireless extensions version 19
rtl8187: Initializing proc filesystem
rtl8187: Reported EEPROM chip is a 93c46 (1Kbit)
rtl8187: Card MAC address is xx:xx:xx:xx:xx:xx
rtl8187: Card reports RF frontend Realtek 8225
rtl8187: WW:This driver has EXPERIMENTAL support for this chipset.
rtl8187: WW:use it with care and at your own risk and
rtl8187: WW:**PLEASE** REPORT SUCCESS/INSUCCESS TO andreamrl@tiscali.it
rtl8187: This seems a new V2 radio
rtl8187: PAPE from CONFIG2: 0
rtl8187: Driver probe completed
usbcore: registered new driver rtl8187


/etc/conf.d/net には

config_wlan0=( "dhcp" )
preferred_aps=( "接続先APのESSID" )

とでも書いておけば暗号化なしのネットワークにはつながる。
WEPならこれに少し書き足すだけで良いようなのだが、うちのメインAPはWPAなので事情が複雑になる。

WPAを使うためには wpa_supplicant という別のパッケージが追加で必要で、これ自体は emerge wpa_supplicant で簡単に入るのだが RTL8187のドライバ共々まだ歴史が浅く枯れていないのですんなり組み合わせがうまくいくわけもなく頓挫。

秋葉で新しいモノを買ってくるとこういうことはよくある。
好きこのんで人柱やってるわけではないのだが・・・

ラベル:

NFSのスループット

Intel PRO/1000を積んだLinux同士で NFSを使ってファイルをコピーしたときのスループット。
コピーといっても実際はこれ。

# dd if=/dev/zero of=test.bin bs=1M count=1000

結果は約44メガバイト/秒 (352Mbps)。

NFSのオプションに何もつけなくても、-o tcp,rsize=32768,wsize=32768なんてつけても結果は同じ。
オプション指定が効いていないのか、それとも巷でよく言われているNFSのチューニングパラメータ云々はもう古い話なのかも(スループットは同じでもCPU負荷は違うか?)

ジャンボフレームを使えばもっと速く出来るんだろうけど、Vista用のドライバが何故かジャンボフレームに対応していない。ブロードキャストドメイン内の全てのホストが対応できないうちはジャンボフレームの導入はできないわけで・・・
なんとかしてくれー。

ラベル:

2007-03-20

ボリュームグループが消えた!?

LVMを使っててなぜなボリュームグループが認識されなくなるという事態が起こった。
該当する物理ボリュームを pvdisplay で表示してみたところ、

--- NEW Physical volume ---
PV Name /dev/...
VG Name
PV Size ... GB
Allocatable NO

みたいに新規追加扱いになっている。そんなー!
でも vgrestoreというコマンドがあったのでそれを実行してみたところ復旧。

助かった・・・死ぬかとおもった・・・っていうかバックアップは欠かせないですぞ。

ラベル:

module license 'Proprietary' taints kernel.

RocketRAIDのドライバを動的にロードしようとして言われた言葉。
この後に
Unknown symbol force_evtchn_callback
などというエラーが続く。

Xenがプロプライエタリなモジュールにシンボルをエクスポートしてくれないためだと思う。
特別なハードウェアをXenと組み合わせるときは注意。

カーネルに静的リンクすれば問題なく動くのだけど、RocketRAID231x系と RocketRAID232x系のドライバを両方組み込む、といったことができない。(シンボル名がかぶる)

うーん困ったね。

ラベル: ,

2007-03-19

udevとethデバイス番号

initrdを使ってGentoo Linuxを起動するとイーサネットデバイスの番号が変な風に振られて変えられない時がある。
犯人は

/etc/udev/rules.d/70-persistent-net.rules

このファイルにMACアドレスとethデバイス名の対応が書かれてしまうと、udevがその通りにふり直してしまうらしい。

2007-03-18

DVI表示が出来ない?

ASUSのnForce搭載マイクロATXマザーボードで。
PCI-Express x16スロットをビデオカード以外の用途に使う場合、
オンボードビデオからのDVI出力が出来なくなるみたいだ。制約の理由は不明。

販促用記事

懇意にしていただいている、PRO SHOP MAXSERVE に、販促用の記事を寄稿しました。

IT開発現場におけるサーバ仮想化とマルチレーンの活用

マルチレーンを使って高速で大容量なストレージを低コストで組み上げ、Xenを使った仮想サーバ環境に活用しようという趣旨です。

ラベル: ,

2007-03-14

Jettyを使ってWebアプリケーションをスタンドアロン動作可能にする

Eclipseで開発しているときに、特別なプラグインを入れることなく Webアプリケーションを Run なり Debugなりで単独走行させる方法。

Servletだけ動けばいい人は下記をclasspathに追加
jetty-6.1.1.jar
jetty-util-6.1.1.jar
commons-logging-1.1.jar

JSPも要る人は下記も追加
jasper-compiler-5.5.15.jar
jasper-runtime-5.5.15.jar
jsp-api-2.0.jar
commons-el-1.0.jar
jasper-compiler-jdt-5.5.15.jar

自分のWebアプリケーションに適当なMainクラスを作ってやる。これみたいに。

import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.handler.ContextHandlerCollection;
import org.mortbay.jetty.webapp.WebAppContext;

public class Main {
    public static void main(String[] args) throws Exception
    {
        Server server = new Server();
        ContextHandlerCollection contexts = new ContextHandlerCollection();

        server.setHandler(contexts);
        
        SocketConnector connector = new SocketConnector();
        connector.setPort(8080);
        server.setConnectors(new Connector[]{connector});
        
        WebAppContext webapp = new WebAppContext();
        webapp.setResourceBase("src/webapp");
        webapp.setClassLoader(Main.class.getClassLoader());
        webapp.setContextPath("/mycontext");
        // web.xmlの内容をオーバーライドしたい時はこういう風にする
        
        java.util.TreeMap map = new java.util.TreeMap();
        map.put("contextConfigLocation", "/WEB-INF/applicationContext.mylocal.xml");
        webapp.setInitParams(map);
        
        contexts.addHandler(webapp);
        try {    
            server.start();
        }
        catch (java.net.BindException ex) {
            System.exit(-1);
        }
    }
}

追記:WebアプリケーションからJNDIデータソースも利用したい場合

2007-03-12

Postfixで存在しないローカルユーザアカウント宛のメールを処理する

/etc/passwdにいないユーザへのメールをどこかに転送したい場合、
main.cf内の luser_relayパラメータを設定する。

luser_relay = $user@otherhost.com

例えば上記の記述をしておけば、taro のローカルアカウントが無いのに taro@myhost.com 宛のメールが送られてきた時に taro@otherhost.com へ転送される。転送先でメールをどのように処理するかは自由。

ただしこの機能を有効にするためには、local_recipient_mapsパラメータを無効にしておかなければならない。
local_recipient_mapsパラメータを無効にするには、同じ main.cf 内に

local_recipient_maps =

と記述(右辺は空欄)する。

2007-03-09

Oracle Express EditionをGentooに入れる

Oracle Express Edition(Oracle XE)は、4GBまでのデータを格納できる無料の Oracle。

Oracle XEは rpm又はdebで配布されている。ここではrpmを使う。
Oracleの動作にはlibaioとbcも必要なようなのでそれもemergeする。

# emerge libaio bc rpm

/etc/sysctl.confに下記を追記して、sysctl -pで反映しておく。

kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

グループdbaとユーザーoracleを作成する。
本当はインストールスクリプトで自動作成するようになっているらしいんだけど、私のところではうまくいかなかったので手動で。

# groupadd dba
# useradd -m oracle -g dba -G wheel

rpmを使って Oracle XEのパッケージをインストール

# rpm -ivh oracle-xe-univ-ほげほげ.i386.rpm --nodeps

ファイル名に univ って入っている方のパッケージじゃないとデータベースの文字セットがWesternになってしまうので日本人は悲しい目にあうため注意。univって入っている方のパッケージだと内部文字セットにUNICODEが使われる。シフトJISやらEUCやらはXEではサポートされていないというもっぱらの噂。

rpmのインストールが済んだら、/etc/init.dに cdして下記のコマンドを入力(引用元:Gentoo Linux Wiki)。
なにやら Gentoo用に initスクリプトをちょっと直す必要があるみたい。

# sed -i -e "s/\$SU -s \/bin\/bash \{1,2\}\$ORACLE_OWNER -c/\$SU \$ORACLE_OWNER -l -c/g" oracle-xe


ここでハマりどころひとつ。(いや、普通の人はそんなところではまらないのだけど)
/etc/hostsに自分のホスト名が書かれてないと Oracleは正常動作しない。
初期化スクリプトが妙に早く完了したなと思ったら全然データベースが出来てない。
(通常のOSインストール手順を踏まずに仮想マシンとかで手早くセットアップした環境だとそういう問題が起こりうる)

下記コマンドで初期DBを作成する。Web管理画面やリスナーのポート番号、SYSなどの初期パスワードを聞かれる。

# /etc/init.d/oracle-xe configure

質問に答えたあとしばらく処理が行われているようだったら成功の可能性大。
時間をおかずにすぐプロンプトに帰ってくるようだと、おそらく初期DBの作成に失敗したか、あなたのマシンがアホみたいに速いかのどちらか。ちなみに私のところでは Athlon64X2 5200+とRAIDの環境で十数秒〜数十秒かかったと思う。

初期DBの作成が済んだら rc-update add oracle-xe default して自動起動にするとか、http://yourhost:8080/apex にアクセスして Web管理画面から色々やってみるとか、クラシカルに sqlplusでつないでみるとかすれば良い。

但しsqlplusを動かすためには当然伝統的な ORACLE_HOMEとかの設定が必要。

export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export ORACLE_SID=XE
export NLS_LANG=japanese_japan.UTF8
export PATH=$ORACLE_HOME/bin:$PATH

インスタンスの名前は XE になる。TNS記述子もその名前で作られる。
変更できるのかは知らない(TNS記述子は変更できるだろうけど・・・)

注意:64bit環境の人は何とかして 32bit版の libaio.so.1を /usr/lib32 に入れてやらないと動かない。

ラベル: ,

2007-03-06

genkernelでXenカーネルを作る(x86_64)

基本的には、環境変数 ARCH_OVERRIDEに "xen0" 又は "xenU" をセットして genkernelを実行すれば良いのだが、そのままではどういうわけかうまくいかない。

/usr/share/genkernel/xen0(およびxenU)/config.sh

上記ファイル内の KERNEL_MAKE行を下記のように書き換える必要がある。

KERNEL_MAKE="make ARCH=x86_64"

ドメインUで /dev/sd*を使いたければ、ドメインUカーネルを作成するときSCSIをオフにすること。
(/dev/sd*という名前を使わなければいいじゃないかって? sdにしておけば仮想マシンと実機とで行き来できるでしょ)
さもないとxen_blk: can't get major 8 with name sdとか言われてdomainUが起動しない。

Xenの導入がひと段落したのでSDLを入れてHVM domainを試したのだが、xm createした瞬間マシンが即死(リブート)。
これに関しては安定を待つとするか・・・※追記:別のマシンで試したら色々問題はあるものの同じバージョンのXenでWindows XPの起動まで出来た。

ラベル: ,