2006年12月2日

Switch Transition が有効にならない?

MacOSXで仮想ディスクトップを実現する Desktop Manager を使っている。こいつはディスクトップを切り替える効果を「Switch Transition」で指定できて、Cube とかを指定するとクールでかっこいいいの気に入っている。

何かのきっかけで Switch Transition でどんな効果を指定しても、効果無しに単に切り替わるようになってしまった。

2〜3日悩んだが、ふとディスプレイのカラーが約32000色になっていた。これを約1670万色に変更すると、クールなTransition の効果が復活した。。。ふぅむ。

2006年11月24日

Rails を始める 1日目

Ruby on Rails 入門 を購入して、ここ二日ばかり読みふける。紆余曲折をして辿り着いたWebアプリの作成の定石の固まりが Rails 何だろう。いろんな類型を思い出させてくれる。

ここ2〜3年ばかりWebアプリを書いていないので、リハビリを兼ねて Pukiwiki を rails で書き直してみよう。まぁ、単に wiki をどうにかしてみたかったりする。

RadRailsを使ってモデルをごにょごにょ作って、ファイルベースのデータをARを使って、MySQLのデータベースに突っ込んで、scaffoldを使って出来合いのUIを作ってみた。

大分Rubyの文法や流儀を忘れて、手間取ったが、動かせるものが短時間で作れるのは凄いなぁ。

2006年11月23日

MacPorts の gettext が問題

Darwinports がインストール直後からアップデートをしていないことを思い出して、更新しようとしたが、構築エラーが多々出てきた。問題なく構築出来ても実行すると共有ライブラリエラーで動かないものが出てきた(gnupgが動かないとは、、、)。

暫く、熟考後 gettext の中の共有ライブラリ libintl のバージョンの問題らしい。 とりあえず手動で修正しているが、なんと面倒なことよ。

というか、Darwinports/MacPorts は、依存関係が正しく設定されていない気がひしひしと感じるのだが、みんなはそう問題ないのかぁ。。。

2006年11月10日

EPIA-ME6000 のコンデンサが破裂

Mini-ITX用のケースがGAWA6200が売り出されたので、ここ2〜3年使っていなかったEPUA-ME6000用に購入してみた。

で、組み立てて火入れをしてみると、気持ち良いほど今壊れましたって具合に「パン、パン」と目の前でコンデンサが破裂した。正直、ビビッた。

blog20061110-2
blog20061110-1

GSC製電解コンデンサの破裂、、、よくあるらしい。破裂した以外にも20個ぐらい同じようなコンデンサが載っている。

もうゴミ箱行きかと思うが、貧乏性なので何とか直そうかと思う。

2006年10月29日

PATAの仕様とLinuxのドライバコード

ATAの仕様書は購入する必要があるが、Final Draft なら読めるので、ここ1週間ばかり齧り付いていた。

で、簡単なドライバコード(linux2.6のdrivers/ide/legacy/hd.c)だけならば読めるようになったが、PCIやらDMAバスマスタなると、ちんぷんかんぷんでまるで分からない。

ざーっと理解したところでは、PATAの1 channel の下に2台のHDDぶら下げる場合、大抵はリクエストをoverlapして発行はできず、1リクエストが完了するまでバスを占有する。

1channelの下に HDDとCD-ROMなどをぶら下げる場合、CD-ROMがATAPI(PACKETコマンドが実装されている)準拠なので、必要に応じてリクエストの途中でバスを解放できるらしいので、そんなにHDDに影響は与えないらしいが、、、本当か?、、、測定しなければ分からんなぁ。

ただ、仕様書ではTCQなりをサポートするHDDでは途中で解放なりキューイングなりができるが、PATA HDDで実装されているものがなく、あったとしてもキューのサイズが1とかだったり、その上Linuxの大抵のIDEのドライバコード?(or ハードウェアのチップの問題?)でサポートされていないので使えないらしい。

削除出来ないファイルって?

ふと気づくと /var/log/weekly.out に変なログが出ていた。

どうも Adobe 製品をアップデートしたときに不正な名前のファイルが出来てしまったようである。

Rebuilding locate database:
find: /Applications/Adobe Illustrator CS2/Legal.localized/Tiếng Việt.html: No such file or directory
find: /Applications/Adobe Photoshop CS2/Legal.localized/Tiếng Việt.html: No such file or directory

"Tiếng Việt.html"ファイルは存在するらしいが、メタ情報にアクセスできないので、No such file らしい。

それは良いのだが Finder でも rm コマンドでも削除が出来ないのは困った(1,2)。

対処方法は 「Disk Utility」 で「ディスクを修復」をすれば、「不正な名前」として検知されて、正しく直される。

但し、Adobe 製品ファイル群は大抵は起動ディスク上にあるので、Apple製品付属インストールDVDなどの別の起動ディスクで立ち上げて Disk Utility を使わなければだめのようである。(シングルユーザモードで立ち上げても良いのかなぁ?)

それにしても不正なファイル名が作れて尚かつ削除操作が不可になるのはいただけない。

2006年10月21日

ディスクIO性能(14) - ベンチマーク再考(2)

シーケンシャルなI/Oの性能とI/Oのレコード処理単位の統計を取ってみた。使ったツールはdebian/etch に含まれている bonnie++ 1.03atiobench 0.3.3 である。

何回も測定すると値が大きく変動するのが気持ち悪いので、10回測定してベストとワーストを除いた8回分の平均を取るようにした。

環境

毎度のこと検証環境は、

  1. Athlon64X2 3800+ (但し、Single CPUとして制限)
  2. M2NPV-VM(GeForce6150+nForce 430MCP)
  3. メモリは512M(カーネルパラメータで制限)
  4. システム用のHDDで Segate ST3500630AS, SATA
  5. Debian/etch Linux-2.6.16
  6. Seagate ST340015A, 40GB, PATA UDMA100, 2MBキャッシュ, 5400 rpm の4台

HDDの設定

4台のHDDは hdparm を使い、下記の様に設定。

# hdparm -d 1 -c 3 -m 16 -W 1 -tT /dev/hda

/dev/hda:
 setting 32-bit IO_support flag to 3
 setting multcount to 16
 setting using_dma to 1 (on)
 setting drive write-caching to 1 (on)
 multcount    = 16 (on)
 IO_support   =  3 (32-bit w/sync)
 using_dma    =  1 (on)

 Timing cached reads:   3936 MB in  1.99 seconds = 1973.79 MB/sec
 Timing buffered disk reads:  130 MB in  3.03 seconds =  42.97 MB/sec
ファイルシステム

RAIDボリュームは 標準的な ext3 に初期化した。

測定コマンド

bonnie については、下記のコマンドを使用(/mntに対象ボリュームをマウント)。

# bonnie -u root -d /mnt -n 0 -f -b -s 1024:4
tiobench については、下記のコマンドを使用(/mntに対象ボリュームをマウント)。
# tiotest -t 1 -r 1 -T -d /mnt/0 -f 1024 -b 4096
上記はI/Oの単位ブロックサイズが 4096 bytes の場合。

測定

測定は、md で下記構成のRAIDボリュームに対して、bonnie++(1.03a)、tiobenc(0.3.3)を使い、I/Oの単位ブロックサイズ 1k,2k,4k,8k,16k,32k,64k,128k,256k,512k,1024kのシーケンシャルなread/write の性能を測定する。また、各測定に関して10回行いベストとワーストの値を除いた8回の平均を取った。

  1. RAID0 のHDDx1台(1u)。
  2. RAID0 のHDDx 2 台(2u-2ch)。但し、IDEの2チャンネルにそれぞれにHDDを割り当てる。
  3. RAID0 のHDDx 2 台(2u-1ch)。但し、IDEの1チャンネルのみにHDDを割り当てる。
  4. RAID0 のHDDx 3 台(3u)。IDEの片方のチャンネルに2台で一方に1台を割り当てる。
  5. RAID0 のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。
  6. linear のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。

結果

数値データはヘボヘボに長いのでグラフのみにした。

blog20061027-write-bonnie
blog20061027-write-tiobench
blog20061027-read-bonnie
blog20061027-read-tiobench

  1. bonnie++を使った場合、2u_1ch/3u/4uの seq. write の性能が単位ブロックサイズ 4k〜256kの間に緩やかに上昇している。512k移行は、tiobenchと同じ傾向になっている
  2. tiobenchを使った場合、seq. read/write 共に単位ブロックサイズ1k〜2kにおいて性能の落ち込んでいる
  3. 上記以外では、I/Oの単位ブロックサイズに性能が左右されてる傾向はない。

ふぅーむ。 よくよくI/Oスケジューラの性質を考えれば、Seq I/O性能はI/Oの単位ブロックサイズに性能が左右されないように思える。

  1. Seq. Write の場合、使用したファイルシステム ext3 は 1ファイルに対してなるべくシーケンシャルな順序でブロック割り当てられる可能性が高い。小さな単位のブロックサイズであっても遅延書き込みのため待たされたリクエストがマージ処理で併合され大きな単位のブロックサイズとして扱われるため、十分RAIDのチャンクサイズを超える。そのため書き込みは並列化される頻度が一様に高く、I/Oの単位ブロックサイズに性能が左右されずに一定(最大実効性能)になる。
  2. Seq. Read の場合、とっても簡単でI/Oスケジューラの設定でHDD単位で128kbytesの先読みが行われ、バッファキャッシュされるで、I/Oの単位ブロックサイズに性能が左右されずに一定になる。
但し、幾つかの前提条件を外していくと陽になる場合もありそう(同時負荷、バッファキャッシュメモリ不足、スケジューラの設定やO_DIRECTの利用 etc)。

うんで、 bonnie++ で測定したときに現れていた 2units/1channel の性能劣化がどうもベンチマークソフトの問題のように思えてくる。 tiobench でさえも問題を抱えていそうである。

さぁて、、、何が出てくるかなぁ。

2006年10月13日

ディスクIO性能(13) - I/Oスケジューラ

Linux の I/O スケジューラは 2.6 から4種類から選択できるようになっている。つい最近まで、anticipatory(as)が標準だった。なので、前回までの検証環境ではこれを使って評価していた。

どのI/Oスケジューラ(1,2,3)が良いかは一概に言えない。。。らしい。

  1. noop 単純なFIFO順。マージンのみを行う。ランダムアクセス時にシーク遅延がないものや独自にスケジューリングを行うデバイスに合う。フラッシュメモリ(CFも含む?)やラムディスク用。
  2. deadline セクタ順でソートし片方向の elevator を行い、同時に期限を設定して応答性を確保する。読み込みを優先する。(2.4までのスケジューラをかなり改良したものかぁ?)
  3. anticipatory deadline がベース。適度に待ちを発生させて、セクタ順でのソートの機会を多くする。このとき読み込みパターンの履歴から予測して待ち時間を決める。結果シーク遅延を減りスループットを向上するらしい(元ネタ)。但し、予想が上手く行かずにボロボロになる場合があるらしい。 小規模なシステム、ディスクトップ向けらしい。ファイルサーバにも良いらしい。RAIDやTCQ/NCQを持つものには向かないらしい。
  4. CFQ(Complete Fair Queuing) リクエストをプロセス毎に均一に割り当てる。Fair Queuing と呼ばれるスケジューラの一族らしい。イマイチ実態つかめず。

なので RAID で anticipatory スケジューラの組み合わせはダメダメな気がする。

これからスケジューラのパラメータでチューニングする場合 deadline か CFQ を当たるのがよさげ。

2006年10月1日

ディスクIO性能(12) - ベンチマーク再考(1)

シーケンシャルな write/read に関しては bonnie++ でも十分意味ある計測が可能だが、ランダムアクセスの性能の測定に関して些か疑問がある。

bonnie++に関して「Random Seek 」という項目があるが、「4つの子プロセスを作成し、合計4000回のシークを発生させ、各シークでReadを行い、また10%については同時にWriteも行う。その時間を測定し1秒間に平均何回シークできたかを測定するもの。」らしく。普通のアプリケーションの一般的なI/O発生パターンを再現しているらしい。がイマイチ分からん。

そろそろベンチマークソフトを変えてみようかと思う。

benchmark は広く深い泥沼や。

  1. bonnie
  2. Bonnie++
  3. iozone
  4. Iometer
  5. tiobench
  6. UnixBench
  7. dbench
  8. nbench
  9. ubench
  10. LMBench
で、どれが良いのだろう。

、、、tiobenchあたりが丁度よさげである。

再度、tiobench を使ってデータを取り直そうかと思ったが、以前のデータが致命的な欠陥が合ったことが分かってしまった、、、。bonnie++ のchunk sizeが 8M bytes だと思っていたのだが 8K bytes の誤りだった、、、情けなさぁ。この測定パラメータだと、RAID0 の chunk size 64K より小さいため適度にI/Oが分散されないため、正しい結果が得られそうにない。

何をともあれ bonnie++/tiobench/iozone3の評価をやり直そう。

  1. RAIDで指定した chunk size とベンチマークでのblock I/O単位のchunk sizeの関係は?
  2. シーケンシャル・ランダムのI/Oのスループットは?
  3. 各I/Oスケジューラの性能は?
  4. 等々
まだ、頭の中がごちゃごちゃしてる。

CD-R/DVD-Rに問題なし

Power Mac G5 Quad の付属のSuperDrive で、CD-R/DVD-Rが焼けなくなってしまった。と騒いだが、今日ふと焼いてみると問題なかった。「総容量0バイト」の表記も正しいものらしい。

なんか、「ディスク作成フォルダ」の使い方のミスで、ドツボにはまっていたらしい。。。恥ずかしい。

ディスクIO性能(11) - 性能向上に重要な事

「ディスクI/O性能はどのようにすればあげられるのか」を考えてみよう。

そんな本題を考える上でよさげな資料「Performance Comparison of IDE and SCSI Disks 」を見つけた。直接的には、IDEとSCSIを比較した物だが、パフォーマンスを考える上で着眼しなくては行かない点を示してくれる。

ちょー適当にまとめると

  1. ランダムアクセスを向上するには、Tagged Queuing が重要である。ディスク内部のスケジューラが寄与する部分である(つまりはディスクのファームの支配領域)。SCSIとIDEともに TCQ/NCQ として知られており、シーク性能に応じてこれを深くすると良い。但し、IDEのシーク性能が若干劣るのでTCQ/NCQの最大の深さ32では足りなそう。
  2. kernel側のスケジューラは重要。例ではFreeBSDなのでパットしない(デバドラ内にスケジューラがあるのかぁ、、、?)が、ランダムアクセスやインタリーブアクセス?が向上するらしい。多分、複数プロセスで発生するI/Oを捌くには重要な事らしい。
  3. ファイルシステムの種類によって同じ負荷時に発生するI/Oのパターンが変わるらしい。IDE/SCSIはその発生パターンに応じて性能の善し悪しがあるらしい。。。のかぁ?
  4. RAID0/RAID5は使った方がよろしい。HardwareRAID(隠れたSoftwareRAIDを含む)のI/Oスケジューラは馬鹿に出来ないらしい。出来ればベンダー提供のドライバを使った方が吉か!?

つまりは、TCQ/NCQとI/O elevatorとファイルシステムが重要で、ベンダー提供のRAID用ドライバはI/Oスケジューラの改良が入ってる場合があるので馬鹿にならないのかぁ、、、最後が微妙。

ディスクの並行実行性とスケジューリングが性能向上に重要といえば当たり前に聞こえる。検索に結構この問題に対する論文が引っかかってくる(1)。

  • Linux では、SCSI では TCQ は設定出来るが、IDE (/dev/hd?になるデバドラ)にはTCQは入ってい無さそう。SATAのドライバ(libata??)からNCQが使えそうだが詳細は不明だし。
  • Linuxの各種ファイルシステムの善し悪しはどうなんだろう。。。ext3 で良いじゃんと思うが。
  • ベンダー提供RAID用ドライバのI/Oスケジューラの向上はどれくらい入っていたのかも気になる。
  • Linux, Solaris, WindowsNT, FreeBSD/NetBSD 間で I/O elevator を比較をしてみたい気がする。

さて、どれやろうかなぁ。

2006年9月29日

ディスクIO性能(10) - PDC20270/ITE8212/430MCPの比較

取り敢えず PDC20270/ITE8212/430MCPのmdベースのRAID0性能を比較をしてみる。

blog20060928-RAID0-all

  1. 2units(2channel)で明らかなRAID0性能向上の傾向がread/writeともに見られる。但し、PDC20270のwriteの向上は鈍い。
  2. 実際の2units(1channel)の性能は1unit比べてやはり劣化がある。
  3. サウスブリッジ内蔵(430MCP)とPCI直下のChip(PDC20270/ITE8212)の性能の違いは無い。

2units/1channel の性能劣化の良い説明が思いつかない(嘆いているっぽいはいる)。IDE channelの共有による調停とかのボトルネックなのかなぁ? IDEインターフェース自体やPCIのDMA転送の仕組みが分からないとイマイチ理解できないなぁ。。。

本題の「ディスクI/O性能はどのようにすればあげられるのか」を考えると、経験則としてストックすべきなんだろうなぁ。

2006年9月27日

ディスクIO性能(9) - 430MCP上でのRAID0の性能

M2NPV-VM の onBoard のPATAであるnForce 430MCPに4台のHDDを繋いで幾つかのベンチマークを取ってみた。

果たして、Chipset に組み込まれているIDEは早いらしいとか言うのは正しいのだろうか?

環境

毎度のこと検証環境は、

  1. Athlon64X2 3800+ (但し、Single CPUとして制限)
  2. M2NPV-VM(GeForce6150+nForce 430MCP)
  3. メモリは512M(カーネルパラメータで制限)
  4. システム用のHDDで Segate ST3500630AS, SATA
  5. Debian/etch Linux-2.6.16
  6. Seagate ST340015A, 40GB, PATA UDMA100, 2MBキャッシュ, 5400 rpm の4台

Chipset のサウスブリッジ 430MCPには、IDEインタフェースが組み込まれている。

# lspci -s 00:0d.0 -v
00:0d.0 IDE interface: nVidia Corporation MCP51 IDE (rev a1) (prog-if 8a [Master SecP PriP])
        Subsystem: ASUSTeK Computer Inc. Unknown device 81c0
        Flags: bus master, 66MHz, fast devsel, latency 0
        I/O ports at f400 [size=16]
        Capabilities: [44] Power Management version 2
 

測定

測定は、md で下記構成のRAIDボリュームに対して、シーケンシャルなread/write の性能を 、bonnie++(1.03)を使い測定する。

  1. RAID0 のHDDx1台(1u)。
  2. RAID0 のHDDx 2 台(2u-2ch)。但し、IDEの2チャンネルにそれぞれにHDDを割り当てる。
  3. RAID0 のHDDx 2 台(2u-1ch)。但し、IDEの1チャンネルのみにHDDを割り当てる。
  4. RAID0 のHDDx 3 台(3u)。IDEの片方のチャンネルに2台で一方に1台を割り当てる。
  5. RAID0 のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。
  6. linear のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。

HDDの設定

4台のHDDは hdparm を使い、下記の様に設定。

# hdparm -d 1 -c 3 -m 16 -W 1 -tTi /dev/hda  

/dev/hda:
 setting 32-bit IO_support flag to 3
 setting multcount to 16
 setting using_dma to 1 (on)
 setting drive write-caching to 1 (on)
 multcount    = 16 (on)
 IO_support   =  3 (32-bit w/sync)
 using_dma    =  1 (on)

 Model=ST340015A, FwRev=3.01, SerialNo=5LAJS1TX
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78165360
 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4
 DMA modes:  mdma0 mdma1 mdma2
 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5
 AdvancedPM=no WriteCache=enabled
 Drive conforms to: Unspecified:  ATA/ATAPI-1 ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5 ATA/ATAPI-6

 * signifies the current active mode

 Timing cached reads:   3936 MB in  1.99 seconds = 1973.79 MB/sec
 Timing buffered disk reads:  130 MB in  3.03 seconds =  42.97 MB/sec
ファイルシステム

RAIDボリュームは 標準的な ext3 に初期化した。

# dumpe2fs -h /dev/md0
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:   
Last mounted on:          
Filesystem UUID:          8ba1a4a7-9a35-4a2a-994b-721745dbdb8b
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal resize_inode dir_index filetype needs_recovery sparse_super large_file
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              19546112
Block count:              39081472
Reserved block count:     1954073
Free blocks:              38419937
Free inodes:              19546101
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1024
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         16384
Inode blocks per group:   512
Filesystem created:       Thu Sep 28 22:43:21 2006
Last mount time:          Thu Sep 28 22:45:13 2006
Last write time:          Thu Sep 28 22:45:13 2006
Mount count:              1
Maximum mount count:      25
Last checked:             Thu Sep 28 22:43:21 2006
Check interval:           15552000 (6 months)
Next check after:         Tue Mar 27 22:43:21 2007
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Default directory hash:   tea
Directory Hash Seed:      9b620d96-95a0-48e6-9336-5d9cb21f847f
Journal backup:           inode blocks
Journal size:             128M
測定コマンド

bonnie については、下記のコマンドを使用(/mntに対象ボリュームをマウント)。

# bonnie -u root -d /mnt -n 0 -f -b

結果

Version  1.03       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
430MCP
md-raid0(1u)     1G           37910   8 18697   3           47355   4 164.6   0
md-raid0(2u-2ch) 1G           75550  18 30762   6           85096   8 260.1   0
md-raid0(2u-1ch) 1G           32792   8 13865   2           28791   2 171.0   0
md-raid0(3u)     1G           51519  14 19736   4           42076   4 248.8   0
md-raid0(4u)     1G           78513  20 25605   5           50256   4 287.6   0
md-linear(4u)    1G           37635   8 18120   3           47276   4 168.8   0
blog20060927-RAID0-430MCP

  1. 2units(2channel)で明らかなRAID0性能向上の傾向がread/writeともに見られる。3units/4unitsは、RAID0性能向上の傾向が見られるが、2units(2channel)よりは性能向上は劣っている。
  2. 実際の2units(1channel)の性能は1unit比べてやはり劣化がある。

ほとんどITE8212/pass through mode の挙動と同じである。若干、3units/4units での性能向上が見られる。 やはり、IDEの1チャンネルに2台ぶらさがる事が並列化を妨げ「劣化」させる要因になっているようである。

結論

PATAでは1チャンネルに複数のデバイスをぶら下げるとRAIDの性能向上を妨げるので、1チャンネル1台にしよう。

2006年9月25日

ディスクIO性能(8) - ITE8212上でのRAID0の性能

IO-DATA UIDE-133R(ITE8212) に4台のHDDを繋いで幾つかのベンチマークを取ってみた。

環境

毎度のこと検証環境は、

  1. Athlon64X2 3800+ (但し、Single CPUとして制限)
  2. M2NPV-VM(GeForce6150+nForce 430MCP)
  3. メモリは512M(カーネルパラメータで制限)
  4. システム用のHDDで Segate ST3500630AS, SATA
  5. Debian/etch Linux-2.6.16
  6. IO-DATA UIDE-133R(ITE8212)
  7. Seagate ST340015A, 40GB, PATA UDMA100, 2MBキャッシュ, 5400 rpm の4台

ITE8212は、430MCP配下のPCIバス(32bit/33Mhz)にぶら下がっている。

04:08.0 RAID bus controller: <pci_lookup_name: buffer too small> (rev 11)
        Subsystem: Integrated Technology Express, Inc. IT/ITE8212 Dual channel ATA RAID controller
        Flags: bus master, 66MHz, medium devsel, latency 32, IRQ 209
        I/O ports at 9c00 [size=8]
        I/O ports at 9800 [size=4]
        I/O ports at 9400 [size=8]
        I/O ports at 9000 [size=4]
        I/O ports at 8c00 [size=16]
        Expansion ROM at fda00000 [disabled] [size=128K]
        Capabilities: [80] Power Management version 2

測定

測定は、pass through mode で md を使ってRAIDを組んだ場合とsmart modeでBIOSでRAIDを定義した場合のそれぞれで下記構成のRAIDボリュームに対して、シーケンシャルなread/write の性能を 、bonnie++(1.03)を使い測定する。

  1. RAID0 のHDDx1台(1u)。
  2. RAID0 のHDDx 2 台(2u-2ch)。但し、IDEの2チャンネルにそれぞれにHDDを割り当てる。
  3. RAID0 のHDDx 2 台(2u-1ch)。但し、IDEの1チャンネルのみにHDDを割り当てる。
  4. RAID0 のHDDx 3 台(3u)。IDEの片方のチャンネルに2台で一方に1台を割り当てる。
  5. RAID0 のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。
  6. linear のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。

HDDの設定

HDDの設定は hdparm を使っても多く設定が出来ないので、デフォルト値のままにした。

# hdparm  /dev/hda

/dev/hda:
 multcount    =  0 (off)
 IO_support   =  3 (32-bit w/sync)
 unmaskirq    =  1 (on)
 using_dma    =  1 (on)
 keepsettings =  0 (off)
 readonly     =  0 (off)
 readahead    = 256 (on)
 geometry     = 19462/255/63, sectors = 312661432, start = 0
# hdparm  -i /dev/hda

/dev/hda:

 Model=Integrated Technology Express Inc, FwRev=, SerialNo=%
 Config={ }
 RawCHS=0/0/0, TrkSize=0, SectSize=0, ECCbytes=0
 BuffType=unknown, BuffSize=0kB, MaxMultSect=0
 (maybe): CurCHS=0/0/0, CurSects=0, LBA=yes, LBAsects=268435455
 IORDY=no
 PIO modes:  pio0
 DMA modes:  mdma0 mdma1 mdma2
 AdvancedPM=no

 * signifies the current active mode
ファイルシステム

RAIDボリュームは 標準的な ext3 に初期化した。

# dumpe2fs -h /dev/hda1
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          a0060cd1-078c-4212-bc49-849077c18012
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal resize_inode dir_index filetype sparse_super large_file
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              19546112
Block count:              39082120
Reserved block count:     1954106
Free blocks:              38420585
Free inodes:              19546101
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1024
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         16384
Inode blocks per group:   512
Filesystem created:       Fri Sep 22 03:17:52 2006
Last mount time:          Fri Sep 22 03:19:57 2006
Last write time:          Fri Sep 22 03:31:15 2006
Mount count:              1
Maximum mount count:      33
Last checked:             Fri Sep 22 03:17:52 2006
Check interval:           15552000 (6 months)
Next check after:         Wed Mar 21 03:17:52 2007
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Default directory hash:   tea
Directory Hash Seed:      e5fb4626-6e46-4fc3-b806-e372ee6acf41
Journal backup:           inode blocks
Journal size:             128M
測定コマンド

bonnie については、下記のコマンドを使用(/mntに対象ボリュームをマウント)。

# bonnie -u root -d /mnt -n 0 -f -b

結果


Version  1.03       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
IT8212
md-raid0(1u)     1G           37720   9 18515   4           47306   4 174.0   0
md-raid0(2u-2ch) 1G           75696  21 30213   6           69912   6 261.6   0
md-raid0(2u-1ch) 1G           33420   8 14207   3           28919   2 170.7   0
md-raid0(3u)     1G           46685  12 19849   4           42009   3 249.1   0
md-raid0(4u)     1G           64778  15 25630   5           52087   5 280.2   0
md-linear(4u)    1G           37966   8 18337   4           47288   4 171.8   0
bios-raid0(2u-2ch)1G          60544  18 17886   4           36314   3 169.3   0
bios-raid0(2u-1ch)1G          36289  10 13280   3           30567   2 155.3   0
bios-raid0(3u)   1G           32204   9 15470   3           37817   3 164.9   0
bios-raid0(4u)   1G           39150  11 17373   4           42017   3 183.9   0
bios-linear(4u)  1G           38601  10 18587   4           47329   4 170.2   0
blog20060925-RAID0-IT8212

  1. mdの場合、2units(2channel)で明らかなRAID0性能向上の傾向がread/writeともに見られる。3units/4unitsは、RAID0性能向上の傾向が見られるが、2units(2channel)よりは性能向上は劣っている。
  2. md と smart modeのRAIDを比べると、md を使った方が性能が良い。
  3. 実際の2units(1channel)の性能は1unit比べてやはり劣化がある。

全体的にHDDの台数に性能があまりスケールしない。ただし、IDEの1チャンネルに1台のみぶら下がるようにした場合、台数に対する性能向上が見られる。やはり、IDEの1チャンネルに2台ぶらさがる事が、IDEバスかチップかLinuxのITE8212用のドライバかで並列化を妨げ「劣化」させる要因になっているようである。

結論

PATAでは1チャンネルに複数のデバイスをぶら下げるとRAIDの性能向上を妨げるので、1チャンネル1台にしよう。 姑息に性能を上げるためには、pass through mode で md ベースのRAIDを組もう。但し、過度の期待は禁物である。

2006年9月22日

ディスクIO性能(7) - ITE8212 のRAID機能を探る

最近(2006/9)でPATA RAID でまだ入手できるのはITEのチップが載っているものぐらいで、時たま OnBoard で採用されていたりする。ただ、ITE自体はストレージ系のチップはITE8211/ITE8212 のみなので、企業が存続する限りほそぼそと製品が出荷されるのかなぁ。。。

公開されている大まかなチップ仕様書を見る限り、仮想IDE?やRAIDの再構築等を内部の組み込みCPUで実現できたり、結構HardwareRAIDっぽい。ただし、キャッシュがほとんど無いので性能は見るべき物では無さそうである。

ベンダーからLinux 2.4/2.6用の専用ドライバが配布されている。また 2.6.x では別のドライバがkernel本体に取り込まれている。

  • Linux 2.4 系では ITE配布ドライバ
  • Linux 2.6 系では ITE配布ドライバ or it821x(kernel本体のドライバ)
kernel本体に取り込まれてる it821xを使うのが吉かと思う。

it821xを使う

it821x(kernel本体のドライバ)は smart mode/pass through mode の二種類の動作モードをもつ。

smart mode の時はRAIDボリュームは単体のデバイスとしてアクセスできる。 ちなみに dmraid でのサポートはない、というか Hardware RAIDだから、、、。

IT8212: IDE controller at PCI slot 0000:04:08.0
ACPI: PCI Interrupt Link [APC1] enabled at IRQ 16
ACPI: PCI Interrupt 0000:04:08.0[A] -> Link [APC1] -> GSI 16 (level, low) -> IRQ 209
IT8212: chipset revision 17
it821x: controller in smart mode.
IT8212: 100% native mode on irq 209
    ide0: BM-DMA at 0x8c00-0x8c07, BIOS settings: hda:DMA, hdb:pio
    ide1: BM-DMA at 0x8c08-0x8c0f, BIOS settings: hdc:pio, hdd:pio
Probing IDE interface ide0...
hda: Integrated Technology Express Inc, ATA DISK drive
hda: IT8212 RAID 3 volume(64K stripe).
ide0 at 0x9c00-0x9c07,0x9802 on irq 209
hda: max request size: 128KiB
hda: 312661432 sectors (160082 MB), CHS=19462/255/63
hda: cache flushes not supported
 hda: hda1

pass through mode ではRAIDボリュームが定義されていても個々のIDEディスクとしてアクセスできる。この場合はモジュールパラメータに noraid=1を指定する。

IT8212: IDE controller at PCI slot 0000:04:08.0
ACPI: PCI Interrupt Link [APC1] enabled at IRQ 16
ACPI: PCI Interrupt 0000:04:08.0[A] -> Link [APC1] -> GSI 16 (level, low) -> IRQ 209
IT8212: chipset revision 17
it8212: forcing bypass mode.
it821x: controller in pass through mode.
IT8212: 100% native mode on irq 209
    ide0: BM-DMA at 0x8c00-0x8c07, BIOS settings: hda:DMA, hdb:pio
    ide1: BM-DMA at 0x8c08-0x8c0f, BIOS settings: hdc:pio, hdd:pio
Probing IDE interface ide0...
hda: ST340015A, ATA DISK drive
hdb: ST340015A, ATA DISK drive
ide0 at 0x9c00-0x9c07,0x9802 on irq 209
Probing IDE interface ide1...
hdc: ST340015A, ATA DISK drive
hdd: ST340015A, ATA DISK drive
ide1 at 0x9400-0x9407,0x9002 on irq 209
hda: max request size: 128KiB
hda: 78165360 sectors (40020 MB) w/2048KiB Cache, CHS=65535/16/63, UDMA(100)
hda: cache flushes supported
 hda: hda1
hdb: max request size: 128KiB
hdb: 78165360 sectors (40020 MB) w/2048KiB Cache, CHS=65535/16/63, UDMA(100)
hdb: cache flushes supported
 hdb: hdb1
hdc: max request size: 128KiB
hdc: 78165360 sectors (40020 MB) w/2048KiB Cache, CHS=65535/16/63, UDMA(100)
hdc: cache flushes supported
 hdc: hdc1
hdd: max request size: 128KiB
hdd: 78165360 sectors (40020 MB) w/2048KiB Cache, CHS=65535/16/63, UDMA(100)
hdd: cache flushes supported
 hdd: hdd1

smart mode 時にRAIDボリュームに組み込まれていないディスクは単体ディスクとして認識される様であるが、時折発狂するのが見受けられた。

結論

RAIDボリュームと単体ディスクの組み合わせで使わない限り smart mode は安定している。 pass through mode を使えば単なるIDEインタフェースとして普通に使える。何か拍子抜け。

2006年9月21日

ディスクIO性能(6) - PDC20270上でのRAID0の性能

FastTrack100 TX2 (PDC20270) に4台のHDDを繋いで幾つかのベンチマークを取ってみた。

環境

毎度のこと検証環境は、

  1. Athlon64X2 3800+ (但し、Single CPUとして制限)
  2. M2NPV-VM(GeForce6150+nForce 430MCP)
  3. メモリは512M(カーネルパラメータで制限)
  4. システム用のHDDで Segate ST3500630AS, SATA
  5. Debian/etch Linux-2.6.16
  6. FastTrack100 TX2 (PDC20270)
  7. Seagate ST340015A, 40GB, PATA UDMA100, 2MBキャッシュ, 5400 rpm の4台

PDC20270は、430MCP配下のPCIバス(32bit/33Mhz)にぶら下がっている。

# lspci -s 04:09.0 -v
04:09.0 RAID bus controller: Promise Technology, Inc. PDC20270 (FastTrak100 LP/TX2/TX4) (rev 02) (prog-if 85)
        Subsystem: Promise Technology, Inc. FastTrak100 TX2
        Flags: bus master, 66MHz, slow devsel, latency 32, IRQ 209
        I/O ports at 9c00 [size=8]
        I/O ports at 9800 [size=4]
        I/O ports at 9400 [size=8]
        I/O ports at 9000 [size=4]
        I/O ports at 8c00 [size=16]
        Memory at fdbf0000 (32-bit, non-prefetchable) [size=64K]
        Expansion ROM at fda00000 [size=64K]
        Capabilities: [60] Power Management version 1
でも、lspci の出力のFlags に 66Mhz とあるがこれは何を意味するのだろう?

測定

測定は、md と dmraid のそれぞれで下記構成のRAIDボリュームに対して、シーケンシャルなread/write の性能を 、bonnie++(1.03)を使い測定する。

  1. RAID0 のHDDx1台(1u)。
  2. RAID0 のHDDx 2 台(2u-2ch)。但し、IDEの2チャンネルにそれぞれにHDDを割り当てる。
  3. RAID0 のHDDx 2 台(2u-1ch)。但し、IDEの1チャンネルのみにHDDを割り当てる。
  4. RAID0 のHDDx 3 台(3u)。IDEの片方のチャンネルに2台で一方に1台を割り当てる。
  5. RAID0 のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。
  6. linear のHDDx 4 台(4u)。IDEの両方のチャンネルに2台を割り当てる。

HDDの設定

4台のHDDは hdparm を使い、下記の様に設定。

# hdparm -d 1 -c 3 -m 16 -W 1 -tTi /dev/hde

/dev/hde:
 setting 32-bit IO_support flag to 3
 setting multcount to 16
 setting using_dma to 1 (on)
 setting drive write-caching to 1 (on)
 multcount    = 16 (on)
 IO_support   =  3 (32-bit w/sync)
 using_dma    =  1 (on)

 Model=ST340015A, FwRev=3.01, SerialNo=5LAJRH73
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78165360
 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4
 DMA modes:  mdma0 mdma1 mdma2
 UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5
 AdvancedPM=no WriteCache=enabled
 Drive conforms to: Unspecified:  ATA/ATAPI-1 ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5 ATA/ATAPI-6

 * signifies the current active mode

 Timing cached reads:   3836 MB in  2.00 seconds = 1922.01 MB/sec
 Timing buffered disk reads:  130 MB in  3.03 seconds =  42.87 MB/sec

ファイルシステム

RAIDボリュームは 標準的な ext3 に初期化した。

# dumpe2fs -h /dev/md0
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          568932f0-35b2-4279-b3b9-b99195504002
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal resize_inode dir_index filetype needs_recovery sparse_super large_file
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              19546112
Block count:              39078016
Reserved block count:     1953900
Free blocks:              38416481
Free inodes:              19546101
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1024
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         16384
Inode blocks per group:   512
Filesystem created:       Wed Sep 20 12:44:07 2006
Last mount time:          Wed Sep 20 12:46:16 2006
Last write time:          Wed Sep 20 12:46:16 2006
Mount count:              1
Maximum mount count:      20
Last checked:             Wed Sep 20 12:44:07 2006
Check interval:           15552000 (6 months)
Next check after:         Mon Mar 19 12:44:07 2007
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Default directory hash:   tea
Directory Hash Seed:      d2636c25-d719-4b86-919b-5f4fe97ff8ec
Journal backup:           inode blocks
Journal size:             128M

測定コマンド

bonnie については、下記のコマンドを使用(/mntに対象ボリュームをマウント)。

# bonnie -u root -d /mnt -n 0 -f -b

結果

Version  1.03       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
PDC20270
md-raid0(1u)     1G           37924   8 18322   4           47218   4 169.1   0
md-raid0(2u-2ch) 1G           48279  11 26484   5           79672   7 267.5   0
md-raid0(2u-1ch) 1G           32114   8 13687   2           28586   2 166.0   0
md-raid0(3u)     1G           39956  11 18437   4           41578   3 249.1   0
md-raid0(4u)     1G           49674  11 23152   5           50915   4 285.8   0
md-linear(4u)    1G           38235   8 18221   3           47197   4 169.6   0

dm-raid0(1u) 1G 38826 12 18584 4 47295 3 174.2 0 dm-raid0(2u-2ch) 1G 52870 17 22017 5 55090 5 264.0 0 dm-raid0(2u-1ch) 1G 34679 10 12061 2 24026 2 168.0 0 dm-raid0(3u) 1G 42278 13 17619 3 40336 4 249.5 0 dm-raid0(4u) 1G 51228 18 22073 5 50590 5 286.2 0 dm-linear(4u) 1G 38215 11 18678 4 47264 4 171.1 0

blog20060921-RAID0-PDC20270

  1. mdの場合、1unit に比べてRAID0性能向上の傾向が見られるのは 2units(2channel)の readのみで、それ以外は何かの制限がありそうである。
  2. md と dmraid の傾向の違いは、2units(2channel)のread以外は無い。
  3. 2units(2channel)のwriteの性能向上が思ったほど無い。
  4. IDEの1channelに2台ぶら下げると性能向上は望めないと言われているが、 実際の2units(1channel)の性能劣化は予想以上である。
  5. 4unitsは、2units(1channel) からRAID0の性能向上の傾向が見られる。
  6. 単体HDDとraid0(4units)とlinear(4units)の性能がほぼ変わらない。

全体的にHDDの台数に性能がスケールしていない。PCIバスの制約は 133MB/secであり、 約80MB/secの性能が出る場合もあり、PCIバスに制限されているのでは無さそうである。 単純に考えると、IDEの1チャンネルに2台ぶらさがる事が、IDEバスかチップかLinuxのPDC20270用ドライバかで並列化を妨げ「劣化」させる要因になっているようである。

なんとも納得がいかない結果だなぁ。

ベンダー提供のドライバとの比較も必要かも。。。PATAでそこまでするかなぁ。

結論

PATAでは1チャンネルに複数のデバイスをぶら下げるとRAIDの性能向上を妨げるので、1チャンネル1台にしよう。 mdもdmraidも大きな違いが無いが、このRAIDカードではシーケンシャルなreadの性能はmdの方が高かった。PCI(32bit/33Mhz)でぶら下がる RAIDカードに過度に期待しないでおこう。

シーケンシャルI/OだけでなくランダムI/Oの性能評価が出来るようになろう。

2006年9月19日

ディスクIO性能(5) - PDC20270 のRAID機能(dmraid)を探る(3)

dmraid でサポートされるRAIDボリュームはルートファイルシステムに使えないかと思っていた。 dmraid の新しめの版でinitramfs-tools用のフックスクリプトが取り込まれており、dmraidをサポートした initrd イメージが作成できるので、ルートファイルシステムに使えるようである。また debian-installer 用のバイナリパッケージがあるようなので、d-i でさっくり使えるかもしれない(試して無いが、、、)。

ただ物は試しに、インストール済みのファイルイメージをdump/restore して dmraid上のRAIDボリュームに移してみたが普通に使える。

Debian/etchが出た暁には最強に環境になるんだろうなあぁ。

そう言えば、RAIDを組んだDISKの組のことを何て言えば良いのだろう? RAIDボリューム?RAIDアレイ?RAIDセット?ふぅ〜む。

2006年9月13日

grub2 を使ってみる

ThinkPad X41 に入れている Debian/etch を、grub から grub2 に移行してみると、3点で躓いてしまった。

  • grub-probefsが、root権限で起動されたとき正しくファイルシステムを検出してくれない。
  • grub-setupが、正しくルートデバイスを推測してくれない。
  • update-initramfs が grub2 を認識せずに、lilo を使おうとしてしまう。
なので、不足した情報を補う必要がある。

# grub-install --no-floppy --modules="ext2 linux terminal terminfo" /boot/grub
cannot find a GRUB device for /boot/grub.
grub-setup: error: Cannot guess the root device. Specify the option ``--root-device''.
#  grub-setup --directory=/boot/grub --device-map=/boot/grub/device.map -r'(hd0,0)' /dev/sda1
# ln -s /boot/grub/grub.cfg /boot/grub/menu.lst

それをクリアすると、grub の様に使える。。。いや grub とそのまんまである。 grub2 に移行するメリット無しか、grub に止まるメリットが無しか、、、。

md/lvmとかを使うとgrub2の方が活発に開発されるから良いのかなぁ、、、分からん。

2006年9月12日

マザーボードのBIOSが本当に飛んだ!!

ELPIDAのDDR2メモリは、Athlon64とかCoreDuoとかと相性が悪いらしく。これ以上は改善の見込みが無い様なので、新しいメモリを物色。。。

で、Corsair/PC-64000の1Gメモリを4枚買った。その4枚全部をM2NPV-VMのマザーに刺してみたら、メモリエラーが発生してイマイチ動作しない。ただ2枚のみだと安定して動くので、その状態でBIOSの更新をしたら、途中でBeep音が鳴り響き、中断すると、全く立ち上がらなくなった、、、。

はじめてっす。FANが1秒回って電源OFF、CrashFree も機能しない、、、完全敗北。

PLCC引抜治具(1,2)で引き抜いて、ROMライター(1,2)で焼こうかと思いました。でもROMライターは結構良い値段するので諦めて、もう一枚同じマザーボードを買いました。で、確認するとメモリの4枚のうち1枚がメモリエラーで動作不良品だったようです。。。ガックシ。

まだ初物地雷ロードだったようです。

2006年9月5日

ディスクIO性能(4) - PDC20270 のRAID機能(dmraid)を探る(2)

FastTrack100 TX2 (PDC20270)のBIOS画面で RAID Array を定義すると、grubの様なブートローダから一つのディスクとしてアクセスできる。この機能はRAID上のBIOSで提供され、ディスクに障害が発生しても異常停止することなく起動出来るらしい。RAID1 or RAID10などの障害復旧のときの再構築の機能も大抵ある。

そんな素敵な機能を無視して、単体HDDとして扱うために1台のみLinear Arrayとして定義して使うとき気をつけなければいけないことは何だろうか?

RAIDセットの情報は何処?

何か元ディスクのCHSが違うけどどうすればいいの?

マニュアルにはどこにも書いていないが、隠れソフトウェアRAIDのmetadataはディスクの最後尾ほどに書かれている。特にPromise の RAID では最終トラックの最初のセクタ(大抵最後から63セクタ前)にあるらしい。

これを確かめるには、元HDDのセクタ数とdmraidで認識される単体HDDのセクタ数の差を比較すれば良く。

# hdparm -g /dev/hdf
/dev/hdf:
 geometry     = 65535/16/63, sectors = 78165360, start = 0
# dmraid -r /dev/hdf
/dev/hdf: pdc, "pdc_dhgiffaf", linear, ok, 78165297 sectors, data@ 0
# expr 78165360 - 78165297
63

dmraid 経由で扱う場合は気をつける必要は無いのだが、 RAID metadata を踏まない様にパーテションを切る必要がある。

次に、RAIDセットのCHS情報は、元になった単体HDDとは異なる。 正しくはRAIDセットのCHS情報に基づいて、パーテション情報を書かなければならない。

昔ディスクのCHS情報は重要なものだったが、いまはLBA/LBA48なりを拡張INT13Hでアクセスするのが定石らしく、パーテションテーブルには、CHSベースとLBAベースの両方の値がかかれている(参考ディスク情報パーテションテーブル)。

ディスクアクセスにCHSを使うのはDOSか古いブートローダぐらいなので、元になった単体HDDのCHSベースでパーテションを切っても問題無いかと思う(違うかも)。

ただ安全を考えると、dmraid で有効かされたディスクに対して fdisk を実行してパーテションを切った方がよい。その場合、自動的にRAID metadataを外すように割り当ててくれるので、一石二鳥である。

結論

単体HDDとして扱うために1台のみLinear Arrayとして定義して使うときのパーテション切りは、dmraid経由に使わない場合でも、一度 dmraid で有効化させたRAIDセットに対して fdisk を実行しよう。

但し、RAID機能を無効に出来るならばそっちを使おう。

2006年9月1日

MacPortsができてる

OpenDarwin プロジェクトが閉鎖を決めて以来、DarwinPorts がどうなるか注視してきたが どうやら、Mac OS Forge のもとで MacPorts として再出発するようである。何にしてもよかった。

ディスクIO性能(3) - PDC20270 のRAID機能(dmraid)を探る(1)

昔 Promise technology とはLinux界隈では物騒な話があった。そのためか IDE controller が本来の性能が出せなかった時期が長かった。また、Promise社はATA RAIDの雄で良くオンボードRAIDチップとして乗っていた。HardwareRAIDとして売られているが、OSドライバとカード上のBIOSが、RAID機能の100パーセントを提供するHardwareRAIDもどきなので、ベンダーからLinux用の専用ドライバを組み込まないといけない。これが面倒であった。

ただし、オープンソースでのRAIDドライバは開発は進んでおり

  • Linux 2.4 系では ataraid
  • Linux 2.6 系では dmraid
が使える。但し、dmraid は比較的新しいのでディストリビューション側でまだinitrdに組み込まれていないので、ルートファイルシステムに使いたい場合は、手動でなんとかしなければいけないようだ。

dmraid を試す

Debian etch に dmraid 1.0.0 rc9 が含まれるので手軽に試してみよう。

  • ASUS M2NPV-VM
  • Athlon64X2 3800+
  • CD1G-D2U667/ELP (但し、DDR2-533で運用)
  • FastTrack100 TX2 (PDC20270)
  • Seagate ST340015A, 40GB, PATA UDMA100, 2MBキャッシュ, 5400 rpm

RAID0のテスト

  1. カードのBIOS設定(FastBuild Utility)にて 4台HDDの Stripe Array を定義する。
  2. 別HDDにインストール済み Debian/Linux etch システムを起動する。 下記のようにRAIDカードとHDDが認識されているのを確認する
    # dmesg
    ...
    PDC20270: IDE controller at PCI slot 0000:04:09.0
    ACPI: PCI Interrupt Link [APC2] enabled at IRQ 17
    ACPI: PCI Interrupt 0000:04:09.0[A] -> Link [APC2] -> GSI 17 (level, low) -> IRQ 209
    PDC20270: chipset revision 2
    PDC20270: ROM enabled at 0xfda00000
    PDC20270: 100% native mode on irq 209
        ide2: BM-DMA at 0x8c00-0x8c07, BIOS settings: hde:pio, hdf:pio
        ide3: BM-DMA at 0x8c08-0x8c0f, BIOS settings: hdg:pio, hdh:pio
    ...
    Probing IDE interface ide2...
    hde: ST340015A, ATA DISK drive
    hdf: ST340015A, ATA DISK drive
    ide2 at 0x9c00-0x9c07,0x9802 on irq 209
    Probing IDE interface ide3...
    hdg: ST340015A, ATA DISK drive
    hdh: ST340015A, ATA DISK drive
    ide3 at 0x9400-0x9407,0x9002 on irq 209
    ...
    hde: max request size: 128KiB
    hde: 78165360 sectors (40020 MB) w/2048KiB Cache, CHS=65535/16/63, UDMA(100)
    hde: cache flushes supported
     hde: unknown partition table
    hdf: max request size: 128KiB
    hdf: 78165360 sectors (40020 MB) w/2048KiB Cache, CHS=65535/16/63, UDMA(100)
    hdf: cache flushes supported
     hdf: unknown partition table
    hdg: max request size: 128KiB
    hdg: 78165360 sectors (40020 MB) w/2048KiB Cache, CHS=65535/16/63, UDMA(100)
    hdg: cache flushes supported
     hdg: unknown partition table
    hdh: max request size: 128KiB
    hdh: 78165360 sectors (40020 MB) w/2048KiB Cache, CHS=65535/16/63, UDMA(100)
    hdh: cache flushes supported
     hdh: unknown partition table
    ...
  3. dmraidをインストール
    # apt-get install dmraid
  4. RAIDセットとデバイスを確認する。
    # dmraid -s
    *** Set
    name   : pdc_gddhfeaj
    size   : 312660992
    stride : 128
    type   : stripe
    status : ok
    subsets: 0
    devs   : 4
    spares : 0
    # dmraid -r
    /dev/hde: pdc, "pdc_gddhfeaj", stripe, ok, 78165248 sectors, data@ 0
    /dev/hdf: pdc, "pdc_gddhfeaj", stripe, ok, 78165248 sectors, data@ 0
    /dev/hdg: pdc, "pdc_gddhfeaj", stripe, ok, 78165248 sectors, data@ 0
    /dev/hdh: pdc, "pdc_gddhfeaj", stripe, ok, 78165248 sectors, data@ 0
  5. RAIDセットの有効化
    # dmraid -a yes -v
    INFO: Activating stripe RAID set "pdc_gddhfeaj"
    これでRAIDセット /dev/mapper/pdc_gddhfeaj として1つのブロックデバイスに見えるようになる。
  6. fdisk でパーティションを切る。パーティションを再認識させるためには、該当RAIDセットの無効化&有効化を行う。
    # fdisk /dev/mapper/pdc_gddhfeaj
    ...
    # /etc/init.d/dmraid restart
    Shutting down DMRAID devices... RAID set "pdc_gddhfeaj1" is not active
    INFO: Deactivating partition RAID set "pdc_gddhfeaj1"
    INFO: Deactivating stripe RAID set "pdc_gddhfeaj"
    .
    Setting up DMRAID devices...INFO: Activating stripe RAID set "pdc_gddhfeaj"
    INFO: Activating partition RAID set "pdc_gddhfeaj1"
    .
  7. ファイルシステムを作る。
    # mkfs.ext3 -E stride=16 /dev/mapper/pdc_gddhfeaj1
    ext3 では、RAIDセットのchunk sizeをファイルシステムのブロック単位で指定すると、少し適した配置をしてくれる。
  8. 再起動を行い問題なく立ち上がるか確認する。

再起動後に、下記のようなメッセージが出る場合は運用は諦めよう!似たようなバグ報告があるのでそのうち直るかも。

hde: task_in_intr: status=0x59 { DriveReady SeekComplete DataRequest Error }
hde: task_in_intr: error=0x10 { SectorIdNotFound }, LBAsect=156393776, sector=156328497
ide: failed opcode was: unknown
PDC202XX: Primary channel reset.
ide2: reset: success
hde: task_in_intr: status=0x59 { DriveReady SeekComplete DataRequest Error }
hde: task_in_intr: error=0x10 { SectorIdNotFound }, LBAsect=156393776, sector=156328497
ide: failed opcode was: unknown
end_request: I/O error, dev hde, sector 156328497
上記は実際、2台のRAID0を構築したときに発生した。単体HDDより大きなサイズのパーティションを作成した場合のみ起き、上記のエラーログが延々出力され、起動が完了しない(shellも使えない)。運良く KNOPPIX 5 だとエラーを吐きながらも起動が完了するので、fdisk等でパーティションを書き換えることができた。4台では起きないのでかなりレアな条件が重なるとエラーになるっぽいなぁ。

RAID1のテスト

  1. カードのBIOS設定(FastBuild Utility)にて 2台HDDの Mirror Array を定義する。
  2. あとはRAID0と変わらない
    
    # dmraid -s
    *** Active Set
    name   : pdc_gdijjjaf
    size   : 78165248
    stride : 128
    type   : mirror
    status : ok
    subsets: 0
    devs   : 2
    spares : 0
    # dmraid -a yes -v
    INFO: Activating mirror RAID set "pdc_gdijjjaf"
    # fdisk /dev/mapper/pdc_gdijjjaf
    ...
    # /etc/init.d/dmraid restart
    ...
    # mkfs.ext3 /dev/mapper/pdc_gdijjaf1
    
RAIDセットと元の単体HDDの総セクター数は、RAIDセットの方が必ず小さくなるのでRAID0であったような起動時の異常は起きそうにはない。

結論

安全を考えるとまだdmraidの安定運用はRAID1以外では期待できないのだろうなぁ。運が良ければ、RAID0/RAID10/RAID5が運用できそうだなぁ。

2006年8月31日

ディスクIO性能(2) - BonnieとIOZoneの比較

ディスクのスループットを測定する場合、メモリバッファの効果を考慮する必要がある。 そのため色々なベンチマークプログラムが開発されている。例えば、Bonnie, Bonnie++, iozone, Iometer 等々。

最初は何も考えずBonnie++やIOZoneで測定したが、測定結果がいまいち合点が行かない。 なので、ここ2週間ばかり追って見たところ、結論らしきものが出せた。

Bonnie++ について

Debian etch/sarge 共に 1.03a が含まれており、これが安定版である。 但し、Bonnie++ 2.0 を目指して開発はされているが2003年頃から更新が無く停滞している。

単体HDD、RAID0、RAID10、RAID5で測定したが、結果が毎回大きく異なる場合があり、怪しい。Unix 系ではwrite は遅延書き込みなので、fsyncを発行しないと書き込み完了までの時間が小さく測定されて、実際よりレートが高く算出されてしまう。1.03aのソースを見る限り、デフォルトではfsyncは発行されない、ただし、1.93c では既にデフォルトで最後にfsyncが発行されており、修正されている。但し、1.03aではfsyncを発行させるオプション'-b'をすれば良いらしい。(というか指定しなければ正しい結果は得られない、、、と思う。)

per-char IOテストではCPU利用率が50%以上になっており、イマイチDISK IO のベンチになっていない気がする。

起動したときの測定条件が全くでないのは、不親切だ。シーケンスIOのデフォルトのsizeが実メモリの2倍で、chunk size が 8M とかは、出してくれや、、、と思う。

参考例:4台のHDDでRAID0を組んだ場合

deep:~# bonnie -d /mnt/0 -n 0 -u root -b  
Using uid:0, gid:0.
Writing with putc()...done
Writing intelligently...done
Rewriting...done
Reading with getc()...done
Reading intelligently...done
start 'em...done...done...done...
Version  1.03       ------Sequential Output------ --Sequential Input- --Random-
                    -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
deep             1G 47805  96 63399  16 25138   5 40027  76 49522   4 289.1   0
deep,1G,47805,96,63399,16,25138,5,40027,76,49522,4,289.1,0,,,,,,,,,,,,,

結論

Bonnie++を使うならば、オプション'-b'を付けて測定する。per char IOテストは、CPU利用率が高い場合は信用しない。

IOZone

Bonnieと同じ測定条件を実行した場合、何故か読み込みレートが小さく測定される。 非常に困ったことに、単体HDDよりRAID0の読み込みレートが小さい値が出てくる。 感覚にそぐわない結果である。

vmstat,top等で鳥瞰して気づいたのだが、read_testの時に、iozoneのユーザCPU利用率が50%強で、かつ全体のCPU利用率が100%近い状態になっていた。つまり、RAID0で回すCPUも圧迫されていたので、読み込みレートが低くなる結果となったらしい。

IOZone のソースをザッと眺めると、毎回読み込んだデータのパターンが正しいかどうかをチェックするコード(verify_buffer)があった。ここが読み込み測定時にbusy-loopになってるので、読み込みリクエストの負荷がかけられないため、読み込みレートが低く検出されてしまうようである。これを無効になりする方法はなさそうである。

参考例:4台のHDDでRAID0を組んだ場合(上と同じ条件)

deep:~# iozone -s 1G -r 8M -i 0 -i 1 -U /mnt/0 -f /mnt/0/test -cez
        Iozone: Performance Test of File I/O
                Version $Revision: 3.263 $
                Compiled for 32 bit mode.
                Build: linux

        Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
                     Al Slater, Scott Rhine, Mike Wisner, Ken Goss
                     Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
                     Randy Dunlap, Mark Montague, Dan Million,
                     Jean-Marc Zucconi, Jeff Blomberg,
                     Erik Habbinga, Kris Strecker, Walter Wong.

        Run began: Wed Aug 30 15:47:24 2006

        File size set to 1048576 KB
        Record Size 8192 KB
        Include close in write timing
        Include fsync in write timing
        Cross over of record size disabled.
        Command line used: iozone -s 1G -r 8M -i 0 -i 1 -U /mnt/0 -f /mnt/0/test -cez
        Output is in Kbytes/sec
        Time Resolution = 0.000005 seconds.
        Processor cache size set to 1024 Kbytes.
        Processor cache line size set to 32 bytes.
        File stride size set to 17 * record size.
                                                            random  random    bkwd  record  stride                                  
              KB  reclen   write rewrite    read    reread    read   write    read rewrite    read   fwrite frewrite   fread  freread
         1048576    8192   66621   60917    30895    31054                                                                         

iozone test complete.

結論

IOZoneを使うならば、read系はテストは死ぬほど早いCPUを使わない限り、当てにならない。

総論

取り敢えず、bonnie++ 1.03c をオプション'-b'付きで測定に使い、シーケンシャルIOの結果のみを信用しよう。

課題

他のパラメータはどう読めば良いのだろう?

2006年8月15日

ディスクIO性能(1) - 序

Windows95が出たての頃、Socket 7 がまだ現役で、Pentium 133MHz と Triton Chipsetを使っていた。いまはどこに使われているか分からない最新性能のメモリ EDO-RAMを乗せて、少しでも性能を良くしたいとBusmaster 有効なドライバを必死に入れて、Windows95が即死して、何度も入れ直し、結局3〜4回OSをインストールした。でも高速にチューンしても、あの頃のマシンはgcc 2.7 の構築に2時間くらいかかっていた。

でもあの頃は満足だったなぁ。

今は100倍くらい早いマシンを手に入れたハズなのに、やはりまだ足りない気がする。

PCの構成要素は大まかに CPU,Memory,I/O とか言うが、足を引っ張るのはI/Oである。 データベースなんかは物理ディスクI/Oを吐かせた時点で敗北とか忌み嫌われる。 ゲームの3DグラフィックとかCPUをブンブン回す科学計算は別の要素も足かせになるらしいが、一般的な用途として CPU, Memory よりはディスクI/O性能が全体の性能を左右する。

ディスクI/O性能はどのようにすればあげられるのかなぁ。
というか、ディスクI/O性能はどう測ればいいのかなぁ。
また、性能制限の要因になっているのはなんなのかなぁ。

もろもろ事が以前から気になっていた。でも忙しさにかまけて、他人の意見を鵜呑みしたホラ吹いてような気がする。 まとまった時間が手に入ったので、実際に調べてみますかなぁ。

では物品の調達っと。

平凡な PATA UDMA100を4台と SATA300 を 4台を揃えてみました。

  • Seagate ST340015A, 40GB, PATA UDMA100, 2MBキャッシュ, 5400 rpm
  • Seagate ST3320620AS, 320GB, SATA300, 16MBキャッシュ, 7200 rpm
ってか、Seagate を選んだのは単なる好みの問題。

PATAインタフェースカードは4channelの製品など入手出来なかったので、今はこれだけ。

  • FastTrack100 TX2 (PDC20270)
  • IO-DATA UIDE-133R(ITE8212)
  • 3ware Escalade 7500-2
あとマザーボードに付属のPATAインタフェースがある。

全部RAIDカードだがほとんど安い製品(3ware以外)なので、そこそこの性能しかないのかも知りたいところ。ただ、PATAはそろそろ廃れそうなのでこれ以上対象は増やす気はない。

SATA に関してはおいおい手を広げよう。

2006年8月14日

Firefox で任意の履歴へジャンプする機能!?

日頃 Firefox で使っていてまどろっこしく感じるのは、 右クリックとホイールを組み合わせで前後の履歴メニューがポップアップしてくる機能である。 とにかく、履歴の中のデタラメな位置のページに飛ぶので使い物にならない(多分使い方がおかしいと思うが)。

今日まで、Firefox本体内蔵の機能かと思っていたが、All-In-One Gesturesの一機能であるマウスホイールジェスチャであることが分かった。。。なんと、Firefoxよ罵って悪かった。

有無を言わさず、無効にしたのは言うまでもない。

2006年8月13日

空のCD-R/DVD-Rの総容量0バイトって!?

何故か Power Mac G5 Quad の付属のSuperDrive で、CD-R/DVD-Rが焼けなくなってしまった。ドライブが壊れたようでは無く、焼く前の空メディアの総容量が 0 バイトと認識されて、容量不足で焼けないのである。

内蔵のSuperDriveの問題かと思い、外付けのCD-R焼きのドライブを付けてみてもヤッパリ総容量が正しく認識されずに、0バイトである。

多分に、なんかソフトの問題かと思うが、未だに原因不明。まぁ、パッチとか出るだろうと、ふて寝中。

追記

勘違いだったみたい。

2006年8月12日

BIOSのアップデートに失敗かぁ!?

先日購入したM2NPV-VMとDDR2-667の組み合わせでDual-Channelに設定すると起動できない問題が新しいBIOSで修正されていたらいいなぁ、という淡い願望を抱いた。

で、BIOSを0109->0303にアップデートして見たところ、、、なんと下記のメッセージが出てBIOS画面まで起動すらしなくなってしまった。

Award BootBlock BIOS v1.0
Copyright (C) 2000, Award Software, Inc.
 
BIOS ROM checksum error,
 
Detecting IDE ATAPI device...

マニュアルを見るところ ASUS CrashFree BIOS 2 が動いてる画面だそうで、つまりはBIOSの更新に失敗しているようである。

自作PCを何度が作っているが、初めての経験である。かなり凹んだが、CD Drvie を繋いでSupport CD を入れると集荷時のBIOSまで書き直しが出来るのがCrashFree BIOSの売りなので、手順に従ってみた。

しかし、Detecting ... の行がでて固まったり、BIOSイメージが見つかるが書き込み完了の「Pass」の文字が出力されずに固まったり、何故かBIOS画面まで出るが固まったり。 要は、一度も経験が無いほど動作が安定しない。手持ちのメモリモジュールの相性を考えてSingle-Channelで動作するように一個のみを刺していたのにである。

壊れたと思いましたよ。で、一晩ふて寝。

熟考の結果、メモリとの相性がより一層ひどくなったのかぁ。。。手持ちのメモリモジュールはDDR667のSingle-Channelでも起動できんようになったのかぁ。

なので、別のPCのDDR533で動作するメモリを差して見ました。。。あっさりBIOS画面まで起動。ついでに、DDR533で動作するようにBIOSで制限して先ほどのメモリモジュールを刺すと、これもあっさりBIOS画面まで起動。。。BIOSアップデートして相性が一層悪くなるとは。とほほである。

まぁ、BIOSの焼き損じでは無かったので良いのだが、メモリ相性かぁ。。。

取り敢えず、ダメダメな組み合わせは下の通り。

  1. Athlon64X2 3800+ Box (Socket AM2)
  2. M2NPV-VM
  3. CD1G-D2U667/ELP <= 現在 DDR533 Dual-channelで動作中
ガックシ。

2006年8月6日

NSImageでWindowsアイコンデータを扱う

通称 Favicon をCocoaで扱いたかった。 元データはWindows アイコンファイル仕様(.ico)がBase64化されてテキスト文字列になっていた。 なので Base64デコードして、何か仕様のpixelデータ列に変換してNSImageに喰わせる必要があるかと思っていた。

が、 Base64デコードした後のWindowsアイコンデータのバイト列を元にNSDataを作成して、initWithData:で初期化すればお望みにNSImageが得られて、表示放題のようだ。またアイコンデータに限らず、MacOSXで扱える全ての画像形式(JPEG,PNG,等々)をNSDataに入れられれば、形式を自動認識してNSImageを生成出来るようである。

これも、Quartzの恩恵らしい。何ともすばらしい。

あとは、キャッシュの方法をマスタすればNSImageは恐れるに足らない。

TeraStation TS-0.6TGL/R5 の改良(4) -- samba の調節

Samba を 2.2 から 3.0 に置き換えようかと思ったが、Debian sarge の samba は機能詰まりすぎて、簡単には行かない。なので、samba 2.2 を温存させることを方向で考える。

問題になっているのは、元のファームの仕様ではローカルディスクのファイル名のエンコードが Shift-JIS になっており、これをUTF8として見るようにすれば、samba/netatalk の相互に日本語のファイル名が使える用になる。

MacOSXの Tips で Samba 3.0 からでないと日本語のファイル名はまともに使えなかったはず。Samba 2.2系で実装ではファイル名の受け渡しにUTF8を使っていないので、 UTF8を前提にしてるMacOSXのSMBクライアントは文字化けしてしまう。

なので、検証はWindowsクライアントから行う必要がある。

どうするかと言うと smb.conf の coding system に utf8 になるようにすれば良いだけ。teractrlも同様な修正すれば、管理画面との連動も問題ない。

まぁ、windows からはsamba で macosx からはnetatalk でアクセスすればいいので問題ない。 結果として、ファイル名長も変な制限もなく日本語のファイル名も Windows/MacOSXの相互に受け渡しが出来るようになった。。。というか、出荷時にこの程度まで品質を上げて欲しかったなぁ>BUFFALO

2006年8月3日

TeraStation TS-0.6TGL/R5 の改良(3) -- netatalk 2 の調節

無事 TeraStation に netatalk 2.0.2 を動く用にしたが、2〜3点不満な点がある。

  1. パスワードがクリアーテキストで送信するようになった。
  2. まだ.DS_Store は :2eDS_Storeとなってしまい Samba と共存すると悲惨になりそう
解消しておきますかぁ。

パスワードがクリアーテキストで送信するのは、Debian の netatalk のパッケージの問題らしい。 OpenSSL のライセンスが GPL と組み合わせられないらしい。詳細は README.Debian に書かれており、「DEB_BUILD_OPTIONS=ssl debuild」で対応バイナリが作れる。cracklibを使わない用に修正してパッケージ作って、uams_dhx_pam.so /uams_dhx_passwd.so /uams_randnum.so をコピーしてクリアーテキストの問題は対応完了。

:2eDS_Store が作られる問題は、AppleVolumes.default の個々のエントリに options:usedots を追加すれば良い。しかし、管理画面の「共有フォルダ設定」で「共有フォルダの追加」を行うと消えてしまう。

どうも/sbin/teractrl で設定ファイルを作成しているらしい。こいつはスクリプトではないので、イマイチ手が出せないなぁ。

どうしたもんだろうか?

取り敢えず teractrl に一皮被せて、AppleVolumes.default を再生成した直後の オプションを加えるように変更。。。でよさげ。

2006年7月24日

TeraStation TS-0.6TGL/R5 の改良(2) -- netatalk 2 を起動

リモートからログイン出来るようになったのでちょっと調べてみると、samba/netatalk のバージョンがちょっと古いのが分かった。

  • samba-2.2.8a-ja-1.1
  • netatalk-1.6.4

さて、netatalk から 2.x 系に上げて見る。

方針はシンプルで「debian sarge のバイナリをただコピーして動かすだけ」。

ファイル共有が目的なので afpd を動かすだけの物を選別してコピーする。

  • /usr/lib/libdb-4.2.so
  • /usr/lib/libslp.so.1.0.0
  • /usr/lib/netatalk/uams_guest.so
  • /usr/lib/netatalk/uams_pam.so
  • /usr/lib/netatalk/uams_passwd.so
  • /usr/sbin/afpd
  • /usr/sbin/cnid_dbd
  • /usr/sbin/cnid_metad
  • /usr/bin/cnid2_create
  • /usr/bin/cnid_index
  • /usr/bin/cnid_maint
をコピーする。

次に以下のシンボリックリンクを張る。

  • /etc/netatalk -> /etc/atalk
  • /usr/lib/libslp.so.1 -> /usr/lib/libslp.so.1.0.0

次に/etc/init.d/atalk内の無用なオプション(-k sjis)をコメントアウトして、atalk を再起動する。

個々まで、作業すると「afp://サーバIP」で接続出来る寸前間で行くが、エラーが発生してうまく行かない。/var/log/message には以下ログが残される。

Jul 23 17:17:37 TERA afpd[2251]: Warning: No CNID scheme for volume /mnt/array1/data. Using default.
Jul 23 17:17:37 TERA afpd[2251]: Setting uid/gid to 100/100
Jul 23 17:17:37 TERA afpd[2251]: cnid_open: Found version 1 of the CNID database. Please upgrade to version 2
Jul 23 17:17:37 TERA afpd[2251]: Cannot open CNID db at [/mnt/array1/data].
Jul 23 17:17:37 TERA afpd[2251]: Fatal error: cannot open CNID or invalid CNID backend for /mnt/array1/data: cdb

CNID database をバージョンアップしろと指示しているが、どうするんだ?

分からんがディレクトリ .AppleDB を削除してみたところ、上手く接続できるようになった。むむ。

netatalk 2.0.2 に入れ替えたことで、ファイル名のエンコードがUTF-8のNFCになり、かつファイル長の31文字制限は無くなった。使い勝手がかなり上がった。

TeraStation TS-0.6TGL/R5 の改良(1) -- sshd を起動

10年くらい前に比べるとMega単位のHDDの単価が異様に安くなった。そんな中、新型TeraStationはNAS で RAID 5 でHDD の交換も容易なので欲しい指数がMAXになってしまって、思わず を買ってしまった。

さっと使ってみた結果、Windows をメインにしてる分には何もいじることは無いと思う。ただ、MacOSXから使うと日本語のファイル名が使えないとか、ファイル名長が31文字に制限されていたりで、異様に使いにくい。

中身はLinuxらしく、いじり倒してる先人がいるので、 このサイト「TeraStation で遊ぼう」を参考に改造してみた。

参考サイトにある通り、シリアルコンソール化 [TS-TGL]を行うとローカルユーザのシェル権限は取得できる。ただ、/usr/local/bin 以下には、o+w の権限のシェルスクリプトは無い。同様な別のスクリプトを見つけて、/etc/sudoers は作成させて、adminユーザが sudo で root権限を取れるようには出来る。ここまで、出来れば改造し放題。むむ。

次に、何故か持て余していたMac-mini(G4)に、Debian sarge/ppc をインストールしてMacOSXとデュアルブート出来るように作業。玄箱があるので debian sarge化したもので良かったかも。

Debian sarge の sshd のバイナリをコピーして手動でkeyを作成して立ち上げると、ライブラリの過不足もなくすんなり動く、、、あっけない。あとは、再起動しても立ち上がる用に /etc/rc.d/rc3.d 以下に適当にリンクを作ってお終い。

中身のLinux は monta vista が使われているが、debian sarge とは相性が良さそうである。

2006年7月22日

IMAPで見知らぬフォルダが現れた?!

debian sarge から debian etch へ移行したら、見知らぬIMAPのフォルダが現れるようになった。

customflags
subscriptions

暫く放置してとけば勝手に消えるかと思ったが、一向に消えない。 よく調べてみると dovecot が利用している特殊なフォルダだったらしく。 0.99(sarge) から1.00(etch) へ更新時に上記のフォルダの名称が変更され、別のフォルダを使うようなり、その残骸がIMAPフォルダが現れたようである。

フォルダを削除したところ、見知らぬIMAPフォルダは現れないようになった。

# cd ~/Maildir
# rm -rf .customflags .subscriptions

ふむ。

2006年7月7日

Dothan で EIST を有効に?

i915GMm-HFSとDothan(770)の組み合わせでEISTが出来るので購入したのだが、何故か Linux のカーネルモジュール cpufreq-centrino がロードできなかった。なので、BIOSの設定画面で、ratio と、CPUの電圧設定をチマチマ変更していた。そして悲劇が起きた!

BIOSのCPUの電圧設定は特に制約無く 0.7 Vくらいまで下げられる。発熱を押さえる目的でCPUの電圧設定を異様に小さな値を設定して運用していたら、多分プチ暴走かメモリの一部が飛んだかの問題が発生し、運悪くapt で更新作業の最中でファイルシステムが壮大に壊れてしまった。

データ系のファイルは別ボリュームで運用していたので幸いして欠損することは無かった。 何とか、ファイルシステムをXFSからext3に変更して復旧させることができた。

大本の原因が分かったところで、何故 EIST が有効にならないのか調べてみると、 Intel のEISTの解説というのがあり、EISTに対応するにはCPU以外にも、Chipset/Motherboard/BIOSにもEIST対応が求められる。EISTの有効化は結構大げさな奴だったのかぁ。。。

BIOSが含まれるというので、確認すると現状は1.04だがAopenサイトには1.11まで公開されている。なので、BIOSを1.04から1.11にアップデートすると、カーネルモジュール cpufreq-centrino が無事ロードできるようになった。多分、BIOSに周波数と電圧とかの対応表とか、周波数の変更方法とかがちゃんと乗るようになったのかなぁ。

governorをondemand に指定したところ、負荷が低いときは、勝手に周波数と電圧が下がって、同時にCPU温度が約48℃くらいに落ち着いた。openssl speedとかでCPUの演算をブンブン回して負荷を上げると、周波数と電圧がMAXまで上がり、CPU温度が約95℃くらいに上昇した。。。EISTが有効になっていますねぇ。

追記

ちょっとだけ cpufreqd を使って Dothan の発熱を抑える

2006年7月4日

ext3 で htree 機能は安全につかえるのか?

ext2/ext3 でディレクトリ構造を線型検索からhtreeを使った検索で高速化する機能がある。dumpe2fsでの出力で機能リストに、dir_index が列挙されていれば有効になっている。

Debian etch のインストーラ経由で ext3 を作成したものには htree 機能が有効になっており、ちょっとびっくりしたのだが、これはいつ安全に使えるようになったのか疑問が湧いてきた。

e2fsprogs のリーリースノートから拾い読みすると htree機能(dir_index)の変遷は下記のようである。

  1. バージョン1.28から取り込まれ始める
  2. バージョン1.29でmke2fsのデフォルトでdir_index有効になる
  3. バージョン1.30でe2fsckでendianと内部 htree node を誤認識によるそれぞれに起因する問題の修正と HTREEに関しての追加チェックが出来るようになる。
  4. バージョン1.33でヤッパリmke2fsのデフォルトでdir_index無効になる。
  5. バージョン1.39で再度mke2fsのデフォルトでdir_index有効になる。但し、 /etc/mke2fs.conf で指定できるようになる。

sarge/etch のそれぞれのe2fsprogsのバージョンが1.37/1.39なので、htree機能の無効・有効に説明が付きそうである。多分リリースノートからすると、1.30 でのe2fsckの修正でほぼユーザランド側は大きな不具合が取れて、1.39 が出る約3年ぐらいの修正で安定度と実績が出来たので再度デフォルト有効になったのかなぁ。とするとhtree機能は安全に使えるようである。

htree 機能の不具合の話はVine 2.6r3 の不具合が大本だった。メーリングリストの報告(1,2)を見る限り対処療法で乗り切っているようで、何が原因だった分からない。取り敢えずdir_indexは無効にしようとなっている。Vineではいまはどういう扱いになっているのだろう?

Fedora Core 5 や CentOS 4.2 では ext3 のhtree機能は既に有効になっているらしく、 そんなに気にせず使えるようである。

あまり気にせずと言うことか。

XFSのファイルシステムが壊れた!

XFSを使っていたルートファイルシステムが壊れた。 lsとかの普通のコマンド叩いても、 エラーがでてきて状況がわからないので、再起動しても状況も変わらない。 よく調べるとオプションをしていしないと XFS でエラーが検出されると勝手にアンマウントされるので、普通のコマンドも起動できない状況だったらしい。

ともあれファイルシステムがちょっと壊れていて、xfs_repair とかするとlost+foundに1万ファイルくらいが修復された。結構重要なファイルが含まれているらしく、正しく運用も出来ない。

以前にも何度がXFS がちょっだけ壊れた時があって、そのときはファイル自体正しいそうなサイズであるのだけど、中身が全部0だったりとか、全く良い思い出が全くない。

性能が良いと前評判だったので resierfs/JFS/XFSなどを好んで使っていたのだが、ext3 の改良もどんどん進んでいる(ext3 諸元拡大に関する研究開発動向、及び改造方式の検討)。なので、これを期に ext3 に移行することに。

あれ?ふと気づくとdebian etch で ext3 の dir_index が普通に有効になっている!? こいつはディレクトリのエントリを線型検索からハッシュ B ツリーを使い高速化する機能で、他のファイルシステムを使う大きな理由が一つ無くなるので結構注目していたのだが、こいつを有効にしているとfsckがファイルシステムを壊していく不具合が出てデフォルトで無効化されて、結構悔しかった記憶、、、いつ直ったのだ。

2006年6月24日

スタイルシートの標準的なこと

CSSを完全理解など遠い未来のこととして、未だにHTML3.2の変種の程度しか理解が進んでいない。なので、スタイルシートばりばりのサイトを見ると、恐怖に戦き、引退に怯える今日この頃。

でも、よさげなページをみっけた。

Mozillaグルー達が「セマンティッククラスの豊富なボキャブラリー」ってやつの定義をまとめてくれている。P_BLOGのCSSはこいつを参考にされているようである。これを使いこなせれば、人並みのCSS生活が送れそうである。

ちょっとはCSSをカスタマイズしてから公開しようかなぁ。 青系にしたい。

2006年6月16日

mkinitrd はどこに行くのだろう

debian etch で initrd イメージを作ろうとし、何も考えず mkinitrd を実行したのだが、ルートファイルシステムが LVMの論路ボリュームのシステムが上手く立ち上がらなかった。

しばらく熟考後、分かったことだがカーネルパラメータ root= の指定方法に問題があったようだ。 論理ボリュームを /dev/VG01/LV01 で指定するか /dev/mapper/VG01-LV01 で指定するかで正しく立ち上がるかの挙動が違う。

/dev/VG01/LV01で起動できるもの

  1. sarge initrd-tools
  2. etch yaird
  3. centos mkinitrd

/dev/mapper/VG01-LV01で起動できるもの

  1. sarge initrd-tools
  2. etch yaird
  3. etch mkinitramfs
  4. fedora core 4 mkinitrd

yaird は System.map/config が無いと上手く initrdイメージが生成できない。xen用カーネルにはまだこれらのファイルが含まれていないのでmkinitramfs でしか作れない。作れても root=の指定を間違うと立ち上がらない。で、小一時間悩むと。

fedora/centosにはfstabに明示的に論理ボリュームのデバイス名を記述してないと正しいinitrdイメージができない。で、これまた小一時間悩むと。

救いなのは、etch mkinitramfs で作成したものは、ほぼ全てのHDDドライバ/RAID/LVMが含まれるので、root=の指定次第でほぼ正しいルートパーティションをマウントした状態でinitに制御がわたせるので、

緊急用のカーネルイメージには最適ですね。fedora/centosの復旧とかに使えて便利でしたねぇ。というか、fedora/centosのmkinitrdが貧弱すぎ。

Xen/AMD64 の意外な制限

最近Barracuda7200.10シリーズで750G HDDが出てきているが、 イマイチ値段が高いので、同シリーズで320Gの容量のものを購入。

取り敢えず、Debian-AMD64のXEN 3.0 上で、fedora 4/5/suse10/debian etch のそれぞれ i386/x86_64のドメインを作ることを画策したが、即撃沈してしまった。

Xen 3.0 では、hypervisorと同じメモリモデルのカーネルでないと domain0/U は起動できないそうである。なので、64 bit の Xen では、domain0/U で起動できるのは、同じ x86_64 のものだけらしい。但し、HVMを使えば i386 でもいけるらしいが、肝心の debian のパッケージには、HVM用のブートローダが入ってないのでお気楽には試せない、、、。

なので、x86_64 用とi386用の二つのXenの環境を用意することに。Xen の Dual Boot 意味ねーなぁ。

Safari の code タグの扱い

</code> 内に改行を入れるとCSSで指定した表示がSafari のみ違う。 何故だが知らないが、閉じタグには改行を入れるのは辞めた方がいいなぁ。

2006年6月12日

Xen 3.0 をちょっと使ってみる

最近の debian sid で xen が使える kernel イメージが用意されるようになったので、debian を使っている人も Xen 環境を作りやすくなっている。

余り安定していないのもなんなので(多分心持ち程度だと思うが)、etch ベースで必要に応じてsidのパッケージを使うように設定する。

まずは、適当なミラーを指定した sid用 apt-line を、sources.list に追加する。

deb http://ftp.riken.go.jp/pub/Linux/debian/debian/ sid main

その後、下記の内容のファイルを /etc/apt/apt.conf.d/99target として作成して、 デフォルトのリリースを testing に指定する。

APT::Default-Release "testing";

次に、必要なパッケージをインストールする。

apt-get install xen-utils-3.0 xen-hypervisor-3.0-i386 \
                 libc6-xen linux-image-2.6-xen-k7

ただ他にも依存関係で必要なパッケージもあるかも。

次に、Xen 自体を起動するように GRUB にエントリーを追加する。

title           Debian GNU/Linux(testing), kernel 2.6.16-2-xen-k7
root            (hd0,11)
kernel          /boot/xen-3.0-i386.gz dom0_mem=524288
module          /boot/vmlinuz-2.6.16-2-xen-k7 root=/dev/hda12 ro console=tty0
module          /boot/initrd.img-2.6.16-2-xen-k7
savedefault
boot

で再起動する。domain0にメモリを512M割り当てているが、もう少し少なくても良いかも。

xm listの出力で Xenが動いているのを確認する。

Name                              ID Mem(MiB) VCPUs State  Time(s)
Domain-0                           0      512     2 r-----    38.1

このHDDの /dev/hda10 には既にFedora Core 4がインストール済みであり、これをDebian上のXenから起動してみる。

先ずは、Fedora Core 4 に domainU用のカーネルをインストールする必要があるが、yum install kernel-xenUとしてもXen 2.0 用のイメージなので起動できない。 Xen 3.0用のFedora Core 4のイメージはXen 3.0 Downloadsから配布されているので取得して入っているRPMを全部入れる。 この作業は Fedora Core 4を立ち上げても良いし、chroot して行っても良い。 最後に、Fedora Core 4用のkernel/initrd のファイルを domain0 の debianシステムにコピーする。

mkdir /boot/fedora4
mount /dev/hda10 /mnt
cd /mnt/boot
cp vmlinuz-2.6.12.6-xen3_64.1_fc4 /boot/fedora4
cp initrd-2.6.12.6-xen3_64.1_fc4.img /boot/fedora4

次に、 /etc/xen/auto 以下に Fedora Core 4 用に domainU の設定ファイルfedora4.conf を作成する。

name = "fedora4"
kernel = "/boot/fedora4/vmlinuz-2.6.12.6-xen3_64.1_fc4"
ramdisk = "/boot/fedora4/initrd-2.6.12.6-xen3_64.1_fc4.img"
memory = 128
disk = ['phy:/dev/hda10,sda1,w']
root = "/dev/sda1 ro"
ip = "192.168.130.2"
netmask = "255.255.255.0"
gateway = "192.168.130.1"
extra = "console=tty0 selinux=0"

Fedora Core 4システム内の fstab でルートをラベルで指定している場合はそのままで良いのだが、そうでない場合や他のファイルシステムをマウントしている場合は適切に変更の必要がある。

最後に、domainUを作成?する。

xm create -c /etc/xen/auto/fedora4.conf

問題がなければ、

# xm list
Name                              ID Mem(MiB) VCPUs State  Time(s)
Domain-0                           0     1024     2 r-----    40.6
fedora4                            1      128     1 -b----  1353.1

とリストに見える用になる。

まだネットワークの設定はダメダメなので使えていないので、xm console を使った仮想コンソール経由での作業になる。 ただ、Fedora Core 4で 128Mのメモリは少なすぎるのかoom-killerが動いているようである。

まぁ、発注したSATA HDDが来てから AMD64 ベースに切り替えて再度 Xen の環境を整えますかぁね。

2006年6月11日

新しい Athlon64x2 を購入!

寺でプレス発表して禅と引っかけて何だかなと思ったのだが、最近仮想化技術に Xen が面白そうである。

Intel の VT や、AMD Virtualization(AMD SVM)とかを使うと、ゲストOSを修正なしに実行できるようになるらしく、WindowsXPも修正なしに起動できたという報告がある。

いまいち扱いがしづらいP4+P4P800を引退させて、Xen 用に再度組み直すことにした。 で、結局 Athlon64X2 を使うこと、下記の部品を購入して、電源オン。

  1. Athlon64X2 3800+ Box (Socket AM2)
  2. M2NPV-VM
  3. CD1G-D2U667/ELP

動かん。ごにょごにょすると、

  • DDR2 667Mhz Dual-Channelだと起動出来ない
  • DDR2 667Mhz Single-Channelだと起動。でもSingleじゃなぁ、、、
  • DDR2 533Mhz Dual-Channelだと起動!!

仕様がないので、DDR2 533Mhz Dual で使うことで。

手持ちのSATA HDD を使おうかと思ってが、何故か変なエラーが出てる、、、後で買うか。

Xenの雰囲気を味わうためPATAに入れてあった、Debian etch IA32/Fedora Core 4 IA32 で Xen 3.0 上で動かしてみるみようかなぁ。 本運用する場合は、AMD64 上のXENでDomain0/DomainU上で IA32 として使えるかが問題っすね。

まぁ、きょうはこの辺で。

2006年4月28日

Gigabit Ethernet + NFSのスループット

100Base-T が高速イーサネットと言った昔の頃、100Base-Tで構築したLANでぶら下がっているマシン同士でNFSを使ってネット越しで共有を行っていた。ただし、正直ローカルディスクと比べると格段に落ちるもので、結局一種の諦めを必要とするものであった。

当時は原因を追及することは無かったがNetworkの最大帯域が100Mbps = 12MByte/Sec が足を引っ張っていたようだ。よくよく考えるとATA/33(33MByte/Sec)にも及ばないので当然である。

ふと最近1Gbps=120MByte/Secであればと、SATA/1.5のちょっと遅い程度で、物理IOのスループットはもっと低い(コンシューマ向けの安価なHDDならば)ので、普通のローカルディスクと同程度ぐらいには扱えるのでは?と思い実験。

NFSサーバのローカルHDDの帯域をhdparmで適当に計ると約53MByte/sec程度。なのでこれくらい、NFSクライアント側で出せれば良いかなぁ。

NFSサーバ

  • Debian/Linux sarge
  • Dothan 2.13GHz
  • Memory DDR2 2G Byte
  • RAID1 300G(Maxtor 6B300R0)x2 on Accordance ARAID99-1000
NFSクライアント
  • MacOSX 10.4.6
  • PowerMacG5 Quad
  • Memory DDR2 8G byte

運用時にはローカルのNetInfo?に /mounts 以下にエントリを追加するのが定石らしいが、テスト運用なので、mount コマンドを直に打つ。

sudo mount -t nfs -o resvport fsrv:/data /mnt

ゲッ。約2Mbyte/Secしかでない、、、何故に?NFSをチューニングするには、、、読み書きのサイズを大きくすれば良いのかぁ、、、。man mount_nfsを読めば、MacOSXではudpでは16Kbyteまでtcpでは32Kbyteまで設定できるらしい。

ここでは、サイズが大きくとれるtcpで再度トライしみる。

sudo mount -t nfs -o resvport,tcp,rwsize=32768 fsrv:/data /mnt

ふぅむ。約9Mbyte/Secしかでない、、、何故に?

調べてみると、Linux側のNFSサーバが同期モードから非同期モードにするとスループットがあがる。

/etc/exports

/data    *(rw,async,root_squash)

とすれば、取り敢えずNFSで約50MByte/Secまで!!出るようになった。ただ、非同期モードはNFSのプロとコール違反らしくどういう結果を生むのかが不明。というかNFSサーバが下回りのジャーナリングファイルシステムと協調して動かせれば要件を満たしつつ性能が上がりそうなものを、、、。 まぁ、結局一種の諦めが必要なので非同期モードで運用することにする。

で、NetInfoマネージャを使って/mounts以下にエントリを追加する。

name fsrv:/data
vfstype nfs
opts rw,rescport,net,intr,soft,tcp,rwsize=32768

うんで、再起動すると、/Network/Servers 以下に自動マウントされるようになる、、、 けっ、何でも設定を変更すると再起動しなくてはいけないとは○indowsっぽくださすぎ。

で、UnixではdaemonはシグナルSIGHUPを受けると設定を再読み込むするのが定石なので、下記の手順をとれば、ちょっとはMacOSXを小突いた感じになれる。

  • NetInfoマネージャで「管理>ローカルNetInfoドメインを再起動」を選択
  • automount プロセスにSIGHUPを送信
  • Finder で /Network/Servers 以下を参照
ちっとは、良い感じだが!! MacOSXのファイル名のUnicode正規化方法がNFDとかなのでどうしたもんかなぁ。これまでSamba経由で公開していたものは convmvコマンドでNFC->NFDに変換すれば良く。後は,glibc でUTF-8-MACエンコードがサポートされればSambaでの運用に支障は無くなるが、、、いつのことやら。気長に待ちますかぁ。

2006年4月19日

今更 Darwin/x86 のインストール

最近 Intel Mac が非常に欲しいモード全開なので、Meromが乗ったのが出た頃まで、ぐっと押さえられるかなぁと思い、Darwin/x86でもインストールしてお茶を濁すことにした。

Darwin/x86がAppleのサイトから落とせるので取り敢えず、最新でbinaryの8.0.1をCD-ROMに焼いてインストールを開始。特にCD bootableなシステムだとすんなり入るが以下の点に気をつけないと、HDDから直接起動できなくなる。

  1. プライマリパーティションにするべし。
  2. パーティションのタイプは 0xaf にするべし。
あとは、grubなりliloなりのチェーンで起動できるかなぁ。チェーンローダは/usr/standalone/i386以下の chain0かboot1h(HFS+用)/boot1u(UFS用)を使えば問題ない。

たぶん1の制約は真のDarwin用ブートローダ/usr/standalone/i386/boot (Darwin/x86 boot)の起動する要件らしく。何故ならば、Darwin 8.0.1 をプライマリパーティションと別の論理パーティションに入れた場合に、Darwin用ブートローダから別の論理パーティションから起動できるからだ。grub からこいつが呼び出せれば良いのだが、、、。

で、DarwinってCUIでどう管理するのかぁ?が問題。というかNetInfoで管理だって分からん。NICのアドレスとかDNSとかの設定よ。。。。

あれ、/Library/Preferences/SystemConfiguration/preferences.plist に書かれている。。。 それを書き換えるツールは無しかぁ。

MacOSXが動いてるのファイルを参考に書き換えて、反映させるコマンドは、、、分からないので再起動。おぉ、NICのアドレス・/etc/resolv.confが書き換わっている。。。

えっと、sshd はどうするのかぁ。。。

launchctl load -w /System/Library/LaunchDaemons/ssh.plist

でよし。

でも管理系のコマンドが分からないので常用できないなぁ。darwinportsでも入れるかぁ。

2006年4月17日

P4P800-VM でPATA/SATA混合時のLinux 2.6.x 挙動?

別のマシンで既にLinux配布群(RedHat,Debian,SUSE)がインストール済みのPATA HDDを、ASUSTek P4P800-VM に移して起動を繰り返してみてもイマイチ挙動がよろしくない。

マシンの構成は以下の通り

  1. ASUSTek P4P800-VM / Pentium 4 3GHz
  2. AMIBOIS 08.00.09
  3. PATA 160G HDD(ST3160023A) on primary master
  4. ATAPI CD/DVD-ROM (RW9200) on primary slave
  5. SATA 250G HDD(7Y250M0)
  6. IDE-RAID(PDC20270) & 40G HDD(ST340015A) x 4
で起動ディスクの構成(PATA 160G HDD)は下記の通り
  1. (hd0,6) Debian 3.1 sarge / 2.6.8-3-686
  2. (hd0,7) CentOS 4.x / 2.6.9-34.EL
  3. (hd0,8) Fedora Core 3 / 2.6.12-2.3.legacy_FC3
  4. (hd0,9) Fedora Core 4 / 2.6.16-1.2069_FC4
  5. (hd0,10) SUSE Linux 10.0 / 2.6.13-15.8-default
  6. (hd0,11) Debian testing / 2.6.15-1-686
で、何が起きるかと言うと

BIOSの設定でCompatible mode を選択した場合2種類のタイプに分かれる

  1. /dev/hdaXとして認識され問題なく起動するが約3MB/secの転送速度になる。たぶんジェネリックドライバが使われてPIOモードになっている。=> Debian sarge/CentOS4.X/Fedora Core 3,4
  2. /dev/sdaXとして認識され問題なく起動する、約26MB/secの転送速度になる。libata経由で認識されている。=> SUSE/Debian testing
どちらにしろ起動できるのだがHDDの転送速度が落ちるのは頂けない。またデバイスファイルがhdaだったりsdaだったり変わるのも頂けない。

次に、BIOSの設定でEnhance modeを選択した場合、2.6.13で追加されたirqpollオプションを付け非SMPカーネルでなければ正常には起動できない。なのでFedora Core4/SUSE/Debian testingしか起動しないが、PIIX用のIDEドライバで認識されているので約54MB/secの転送速度になっている。

ただし、dmesgには下記ようなの怪しげなメッセージが流れる。

hdb: cdrom_pc_intr: The drive appears confused (ireason = 0x01)

とか

irq 185: nobody cared (try booting with the "irqpoll" option)
[<c012f9a1>] __report_bad_irq+0x31/0x73
[<c012fa70>] note_interrupt+0x75/0x99
[<c012f570>] __do_IRQ+0x65/0x91
[<c0104985>] do_IRQ+0x1d/0x28
[<c01034ba>] common_interrupt+0x1a/0x20
[<c012007b>] sys_setreuid+0xe4/0x16d
[<c0118160>] wait_task_zombie+0x81/0x36e
[<c0118878>] do_wait+0x146/0x2e6
[<c0113708>] default_wake_function+0x0/0x12
[<c0118a93>] sys_wait4+0x28/0x2c
[<c0102a75>] syscall_call+0x7/0xb
handlers:
[<f8857d0c>] (usb_hcd_irq+0x0/0x54 [usbcore])
[<f88b31b4>] (ata_interrupt+0x0/0x112 [libata])
[<f8872f4b>] (ide_intr+0x0/0xed [ide_core])
Disabling IRQ #185

どっかの権威に聞けばわかるとは思うが、/proc/interruptsを見る限りide0とlibataがIRQを何故か共有しており、libata側かide側かどっちかか両方かのハンドラが共有した場合の対応が進んでないのでパニックってる。その対応オプションirqpollだと思う。「Disabling IRQ #XX」が出た後は、そのirqのカウントが止まっているのに正常の動作するのでいいんだと思う。

で、 IRQがPATAとSATAで共有されるように設定されてしまったが謎。Compatible modeだとIRQは別々に設定され機能しているので、Enhanced modeでも別々に割り振れば問題なく機能するハズ。IRQの割り当てとかはACPIのお仕事なのでこいつ(BIOS内のコード)がバグってるのかぁぁぁ。ASUSTekは昔はawardとかが入ってて安定してたのに、、、けぇ。

追記(2008/06/25)

ここらあたりの問題は 2.6.24 では既に解決済みのようで、ディストリビューションの最新安定版(Debianのetchは除く)を使えば良いようである。

2006年4月12日

VPC7で復帰直後にエラーが出てくる?

いつの間にか、Virual PC for Mac 7.0 でインストール済みのVirtual PC上のWindowsXを復帰させると「VMUSrvc.exe - ディスクがありません 」とダイアログが出てくるようになった。仕様が無いので Virtual Machine Addtions を入れ直してみたら、出てこなくなった。

うぅむ。何故に?、、、Windowsだからかぁ。

2006年4月11日

Linux 2.6.15 で3Comの10/100LAN+Modem が認識しない!?

かなり古くあるノートPC上のdebian/Linux をetch にアップデートしたところ、なんと3ComのLAN PC カード3CCFEM556Bが認識しなくなった!?

いにしえの頃より使えていて重宝していたので軽くショックを受けてしまった。。。

気を取りなして調べてみると pcmcia-cs パッケージが廃止寸前で、udev+pcmciautilsへの置き換えが進んでいるため、以前と同じ設定とかは通用しなくなったらしい。

カーネルからユーザ空間への置き換えが、進んでるすね。。。でも、まだ安定していないということなのか。。。

で、対処法はあって、pcmcia-cs が持っていた/etc/pcmica/cis/3CCFEM556.dat ファイルを/lib/firmwareに拡張子を.cis に変えてコピーすればいいらしい。

くわばら、くわばら。

X68k用の5inch フロッピーを読むには?

最初に購入したComputerは、かのツタンカーメンCMで有名なX68000無印でした。付属のグラデウスを1周もできずにズルしてクリアーしたのもよい思い出です。先日、実家に預けてある荷物の整理をしたところ、X68000で使っていた5inchフロッピーディスクが大量に出てきました。X68000本体は既に起動しなくなり(たぶんコンデンサの液漏れ)、処遇に困るフロッピーだけが残されてしまいました。

ダメもとで、X68000の実機を使わずに読み込む方法を探ってみると。。。

5inchフロッピーなんぞ製造中止になっており、ドライブもそう易々と入手は難しいかと思っていたら、よくよく調べるとバルク扱いだが新品ドライブFD-55GFR-7393がTEACの自販サイトから入手可能で、たぶんショップでも同じ型番のものが出回っていると思います。また、X68000で使われているFDDは同じ型番のFD-55GFRなので由緒正しいものなのでしょう。

次は接続ケーブル。普通3.5inchFDDと繋ぐ接続ケーブルとは異なり、コネクタ部分がカードエッジ型のものが必要。これはまだサンワサプライ等で製造されており、型番KB-FL341Kを指定して普通のショップで購入が可能です。

ついでに、5inchFDD用のクリーナもまだ製造されているらしく入手は可能。

これらの3点セットが揃ったところで、BIOS設定さえすれば普通のIBM PC-AT用の5inch 2HC はサクサク読めるようになる。しかし、X68000用のフロッピーとはディスク形式が異なるので読めません。基本的に、PC98用のフロッピーとディスク形式と同じなので、まずはPC98のMS-DOS用のフロッピーを読めるようにしなければならない。ここで運が良く1枚だけ書籍付録のフロッピーで、この形式のフロッピーがあったのでこれで検証。。。どうする?

実のところ、Windows95系列ではユーザが用意したドライバがVectorで公開されているので、こいつを使うと、PC-9800のMS-DOS用のフロッピーは読めるようになるらしい。が、Windows95系は用意するのが面倒で、できればWindows2000で使いたい。。。気がする。

まぁ色々調べると、とあるFDC/FDD用のNT用(2000用も用意されているがそれは避けるべし)のフロッピードライバFLOPPY.SYSを組み込めば、PC98のMS-DOS用のディスクが読めるようになる。

しかし、Human68kのFATはMS-DOSから拡張されたFATなのでWindowsは読んではくれない。。。

押しても駄目なら引いてみなー、の考えに従って、 Linux上でフロッピーのディスクイメージをファイルに書き出し、Windows上のX68kのエミュレータで読むようにしてみよう。プロテクトが掛かってるものはエミュレータでも動かないが、用は足りる。

Linux でも普通何もしないと、X68k/PC98用のフロッピーは呼んではくれない。ただし、3-mode フロッピーを読めるようにするパッチは存在している。だたし、Linux 2.2/2.4用らしい。ただし、5inchのフロッピーであれば、setfdprmでパラメータを指定すると素でも読めるらしい。これは、耳寄りな情報。

暫し、熟考の結果。次のようにすれば良いらしい。

  1. fdutilsパッケージをインストール
  2. /etc/fdprm に次の1行を追加
    1232/1232 2464 16 2 77 0 0x35 0x08 0xDF 0x74
  3. フロッピーを挿入後に、次のコマンドを実行
    setfdprm /dev/fd0 -p 1232/1232
  4. ddなりcatなりで読み込む
これでフロッピーのイメージが作れるので、あとはWindows上のX68kエミュレータで読めばお終い。

で、大量にあったフロッピーには何があったかは、、、、青春だなぁ。

2006年3月31日

DebianでLinux 2.6.16

久しぶりにDebian/Linuxが入ったThinkPad X41で作業する。sargeのままだったが、Xorg/Gnome2.12の出来具合を知りたいので、testingに更新する。apt line をtestingに書き換えてapt-get upgradeするとしばらく立つと完了し、再起動。。。何も障害が起きず普通に立ち上がる。。。もっとボロボロでも良い気がするが、安定してますね。

X41はHDDの物理インタフェースはSATAでもないのにコントローラはSATAになっているが、何故か電源管理が出来ていなかったため suspend / resume 後にディスクにアクセスすると固まっていた。それ用のパッチがあるにはあるが、漸く2.6.16から本流に組み入れられて使えるようになったらしい。

なのでついでに、2.6.12から2.6.16への移行

  1. カスタムイメージ2.6.12からdebian/sidの2.6.16 をインストール
  2. suspend/resumeを確認。問題ない。
  3. ipw2200(1.0.6)からgit-1.0.8への移行。
    1. ipw2200-sourceからモジュールを作るがカーネルが固まる。
    2. 良くみると 2.6.16には既にipw2200が含まれているので、追加のモジュールの必要は無く使える。
    3. wpa_supplicantが動かんと思ったら driver が変更になった模様、ipw -> wext に変更すると、wpa_cli status の出力のwpa_stateがDISCONNECT、ASSOCIATINGの状態を行き来し始める。但しステルスAPの為かイマイチ接続しない。ふぅ む。
    4. 文書/ソースを眺めると、ステルスAPだとap_scan=2かつscan_ssid=1を指定すれば良いらしい。なのでしばらく放っとくと、 COMPLETEDになった。単にセッカチ過ぎたらしい。急かせる様にタイミング良く wpa_cli reassociateを実行すると速やかに接続が完了するようになった。
  4. VMwareの再設定。
    1. VMwareも最新版(5.5.1 build-19175)をダウンロードしてインストール。
    2. なぜか vmware-config.pl で以下のメッセージを出して止まる。
    3. The kernel defined by this directory of header files does not have the same address space size as your running kernel.
    4. 取り合えず、修正方法が報告されており、これに従って vmware-config.pl 及び vmmon.tar, vmnet.tarを修正すれば、エラー無くvmware-config.plが完了する。
  5. あとは普通に使えるのでいいのかなぁ。

2006年3月29日

ソースコードのエンコードと genstrings

Cocoa環境のアプリをローカライズする場合、ソースコード内でローカライズ対象のメッセージ文字列@"message"を直接書かずに、次のようなマクロを挟む形で書く。

NSLocalizedString(@"message", @"comment")
このマクロは、リソース?にあるLocalizable.stringsファイルから@"message"をキーとして翻訳済みの文字列を取得して返す。

Localizable.stringsを各言語毎に用意すればソースコードに埋め込まれたメッセージをローカライズできる寸法である。

もちろんソースコード群からLocalizable.stringsを生成コマンドも用意されており、下記コマンドで一発である。

# genstrings `find . -name '*.m'`
これで問題なければ良いのだが、、、、。

ソースコードにCJKの文字が含まれているとLocalizable.stringsを上手く生成してくれない。コメントであっても駄目(時たま、気まぐれで生成してくれる場合もあるのだが、、、)。特にソースコードがUTF-8だと駄目なのはイマイチ分からん。ShiftJISだと問題ないらしいが、、、そりゃないよAppleさん。

しかし、ソースコードに母国語のコメントを入れられないのは辛い。

幸いMacOSXにはPerl5.8が含まれており、苦無く複数のエンコードを考慮して扱えるので、genstringsと同等なスクリプトを書けば良いかも。

と、思いへこへこ書いてみたが、

  • genstrings で -s オプションは機能してないっぽいなぁ。
  • -j/-u/-noPositionalParametersオプションは未実装。使うときにでも実装するかぁ。
  • ふむperl 4くらいの知識ししか無いのでイマイチ定石が分からんなぁ。
  • perl本買ったれ。
  • 良く分からんが書けた。。。
  • そのうち公開しとこぅ。
で、漸くソースコードの日本語コメント書き放題になったよ。

追記(2008/08/06)

欲しい人は多分いないと思うけど、公開しときます

genstrings2

2006年3月25日

WordPressのソース埋め込み?

blog20060325-1
WordPressは画像ファイルを埋め込めるので、これと同じ感じでソースコードも埋め込めればいいなぁ

追記 (2008/07/11)

前々々のブログに WordPress を使っていた訳だが。。。律儀に移行せんでも

2006年3月24日

WordPressってどうよ?

WordPressを使い始めたのだが、少々不満がある。JavaScriptで実装されているリッチエデッタが使いやすく。管理画面も分かり易い。しかし、ソースコードを埋め込むのに難がありすぎる。コピペで張り込むと改行やインデントが消えてしまう。HTMLのソースをガシガシ書いて修正しても半角スペースが出せない、、、使い方が悪いのだろうか?便利なプラグインがあるのだろうか?イマイチわからん。

追記 (2008/07/11)

前々々のブログに WordPress を使っていた訳だが。。。律儀に移行せんでも

デフォルトドキュメントを指定する方法(解決編)

先日の続き。分かれば何のことは無く、Cocoaの無償の機能の中にすでに含まれている。

まず、試行錯誤してあと少しで上手くそうでイマイチの方法は下記の通り。

  1. まずはNSApplicationのデリゲートメッセージapplicationShouldOpenUntitledFile:に対して、NOを答えて、「名称未設定」ファイルの作成を阻止する。
  2. アプリが起動時したときに1度だけ呼ばれるNSApplicationのデリゲートメッセージapplicationDidFinishLaunching:を受けて、この実装の中でNSDocumentControllerに対して特定のファイルを開かせる。
  3. アプリが非ActiveからActiveになった通知をNSApplicationのデリゲートメッセージapplicationDidBecomeActive:で受けて、この実装の中で開いているドキュメントが1つも無い場合のみNSDocumentControllerに対して特定ファイルを開かせる。

#define DEFAULTFILE @"/Users/user/Documents/defaultFile"
 
- (void)openDefaultFile
{
    [[NSDocumentController sharedDocumentController]
        openDocumentWithContentsOfFile:DEFAULTFILE
        display:YES];
}
 
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    return NO;
}
 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self openDefaultFile];
}
 
- (void)applicationDidBecomeActive:(NSNotification *)aNotification
{
    NSArray *docs
        = [[NSDocumentController sharedDocumentController] documents];
    
    if ([docs count] == 0)
        [self openDefaultFile];
}

これで良いのだろうか?何かが違う。 唯一期待通りでないのは、アプリがActiveの状態でドキュメントが一つも無い場合にDock上のアイコンをクリックしても特定ファイルを開かせることができない点。

で、正しい答えはデリゲートメッセージapplicationOpenUntitledFile:を受けて、特定ファイルを開けて、YESを返すこと。このときNOを返すと特定ファイルと「名称未設定」ファイルの二つが開いてしまうので注意しなければいけない。

- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    return NO;
}
 
- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication
{
    [self openDefault];
    return YES;
}

2006年3月22日

デフォルトドキュメントを指定する方法は?

Xcodeを使えば、新規のプロジェクトの作成で、Cocoaのドキュメントベースの雛形は簡単できる。あとは、Documentクラスなり、NSAppにデリゲートさせてカスタムコントロールオブジェクトを作ったり、ある程度は分かる。ただし、Cocoaを使うと、無償で付いてくる機能をカスタマイズしたい場合ドキュメントを彷徨う場合が多い。まぁ、それでフレームワーク特有の定石のパターンがある程度身に付くので無駄骨には終わらない。

で、カスタマイズしたい機能で未だに分からないがある。

Cocoaのドキュメントベースアプリで以下の場合「名称未設定」のドキュメントが生成されるのだが、

  1. 起動時
  2. Dockをクリックした時
  3. メニュー内の新規ファイル を選択した時
この1,2の場合のみ、ある特定ファイルを開くようにしたいのだが、もちろん無ければ勝手に作るようなデフォルトファイルを想定している。

1,2で「名称未設定」を抑制する方法はある。NSAppのデリゲートオブジェクトに下記のレシーバを追加すれば良いらしい。

- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    return NO;
}
まぁ、ドキュメントベースの機能をNSAppに問い合わせをしているのか意味がよく分からん。

ふむ、NSApp への通知メッセージapplicationDid???のどれか受けて、状況に応じて判断してドキュメントをオープンすればいいんかぁ? さっぱり、分からん。

2006年3月14日

三日坊主になるのかぁ!

大学にいた頃に学校のマシンで Mosaic を触れて以来、はや何年だろう。 Netscape が出始めのころで売り物だったが、だれも買われずに秋葉のLAOXに山積みになっていたのを覚えている。LinuxもCD-ROMのドライバの不具合でかなり苦労して、開発版の1.3が付属している本を一所懸命に探してインストールした。 そのNetscapeもオープンソースのMozillaになりfirefox になり、普通に使えるのが当然になる。また Linux は版を重ねるごとに安定し多機能になり(ほとんど化けもんだ)、普通に使えるのがまた当然になる。

さて、未開の地はどこにアルのだろうか。

その長い年月で、何度も自分の日記サイトを作って来たのだが、そんなに長続きはしない。理由は単純で、苦労したわりに素っ気なく見づらいサイトしか出来なかったからだ。 めんどくさいがりのワシが悪い。

さて、もう一度。多分なんか残っているよ。

Cocoa Emacs 24.3 構築 (2013/03版)

暫く使っている Cocoa Emacs を更新していなかったので、24.3 に上げてみた。 当てるパッチは inline patch と ポップアップフリーズ対応パッチ くらい。 24.3 には既にフルスクリーン実装が入っているので、よく使われているフルスクリーンパッチは外し...