2009/02/28

Ubuntu 8.10以降はXenではなく、KVMがサポートされる件について

既にUbuntuではXenに代りKVMを8.10以降でサポートし、XenはKVM上でブリッジが提供されているもののXen自体のサポートは打ち切られています。[xenner], [Xen 3.2(Fedora 9付属Xenner編)]

今後はKVM+libvirtが使われていくのでしょうけれど、我が家のサーバーはSocket939なAthlon64 3500+マシンなので/proc/cpuinfoにはvxmもsvmもflagが立っていません。
vxmやsvmは完全仮想化環境を提供するKVMを使うための前提ですが、 物理的に我が家のサーバーはXenを使わざるを得ない状況に置かれています。

実際のところ簡単にOSイメージが作成できるのは便利なのですが、 直接キーボードを触らずにサーバーとして使っているからでしょうね。
デスクトップ用途としてVMWareの代替にするにはKVMによる完全仮想化が必要だと思います。 実験のためにVMWare上でCloneを作成してもNIC周りは再設定が必要なので、いまのところ総合的にはXenが自分の目的には合っているのでしょう。

KVM優位の流れでも完全仮想化と準仮想化のどちらが良いのかは、微妙な問題です。 開発時のお試しサーバー目的なら完全仮想化である必要はないですが、もし(dom0でもdomUでも)デスクトップとしての機能を何かしら必要とするのであれば完全仮想化以外意味がないと思われます。

ちょっとした小さいグループで、自由にOSインスタンスを作成させて試せる環境を提供するのであれば、自動化する事もできるし、このレベルのXenで満足しています。

でも時代はKVMなんですよね。どこかでKVM入れないとなぁ。

2009/02/27

引き続き、Ubuntu 8.04なXenにVine Linux 4.2を導入してみる (後半)

xen-create-imageコマンドからのVine4.2イメージの作成環境を構築するために必要な作業は以下の流れで行ないます。

  1. Vine4.2用の/etc/xen-tools/xen-tools.confの準備
  2. /usr/lib/xen-tools/vine42.dディレクトリともろもろセットアップスクリプトの配置

Vine4.2用の/etc/xen-tools/xen-tools.confの準備

"xen-create-image"コマンドを使って導入しますが、どうも"--dist"オプションを指定してもちゃんと動いてくれないので、原因は調べずにVine用のxen-tools.confファイルを別に準備します。

$ cp /etc/xen-tools/xen-tools.conf /etc/xen-tools/xen-tools.vine.conf
変更した点はdistributionに"vine42"を加えて、install-methodに"debootstrap"に変えて"rinse"を指定しています。
$ diff xen-tools.conf xen-tools.vine.conf 
83c83
< install-method = debootstrap
---
> install-method = rinse
133c133
< dist   = etch     # Default distribution to install.
---
> dist   = vine42   # Default distribution to install.
ここまでで、"xen-create-image"コマンドはrinseを呼び出してディスクイメージを作成してくれるようになります。

/usr/lib/xen-tools/vine42.dディレクトリともろもろセットアップスクリプトの配置

rinseのセットアップでは具体的なサーバー名やら、IPアドレスやらの設定はしてくれません。そのため具体的なサーバーインスタンスの情報を設定するためのスクリプトが/usr/lib/xen-tools/ 以下に各ディストリビューション毎に分けられています。
とりあえずfedora-core-6.dをディレクトリ毎コピーしてきて、順番にyum関連の処理をapt-getで置き換えるといった変更をしていきます。

20-setup-yum -> 20-setup-apt

yumではなくapt-getを使うのですが、元々がRedHat Linuxの系統ですから、内部構造はfedoraと似ているので、20-setup-yumを20-setup-aptに変更して進めていきます。

43c43
< chroot ${prefix} /usr/bin/yum update
---
> chroot ${prefix} /usr/bin/apt-get update
でも、ここでupdateする必要性がわからないんですよね。 元々のイメージがrinseとrpmstrapのどちらで導入されたかわからないから、 何か前提があるのかなぁ…。

35-setup-users

このファイルでは、現在このXen dom0が稼働しているUbuntu 8.04の/etc/passwdと/etc/shadowの中から"--accounts"オプションで指定したユーザーについて、ゲストOSの/etc/passwd, /etc/shadowに内容をコピーするところです。 いまのところ使っていないので、ここはスルーします。

55-create-dev

いろいろ細かいところにツッコミを入れていると先にすすまないので、例としてひとつだけ。一連のスクリプトの中には間違いが沢山あります。 大抵はどうでも良いので修正していませんが、これはないと困るデバイスファイルを作っているところです。
まだこの時点ではrpm2cpioで展開されただけなので、シンボリックリンクは正確に張られていません。rinseの方で"apt-get upgrade"なんかをちゃんとやっていなかったせいではありますが…。そのため"/dev/MAKEDEV"はまだ存在しないはずで、"/sbin/MAKEDEV"を実行するようにします。 また$iを展開させたいのに、シングルクオートで囲ってしまっているところをダブルクオートに変更します。

45,47c45,47
< chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV console'
< chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV null'
< chroot ${prefix} /bin/sh -c 'cd /dev && ./MAKEDEV zero'
---
> chroot ${prefix} /bin/sh -c 'cd /dev && /sbin/MAKEDEV console'
> chroot ${prefix} /bin/sh -c 'cd /dev && /sbin/MAKEDEV null'
> chroot ${prefix} /bin/sh -c 'cd /dev && /sbin/MAKEDEV zero'
50c50
< chroot ${prefix} /bin/sh -c 'mknod /dev/xvda$i b 202 $i'
---
> chroot ${prefix} /bin/sh -c "mknod /dev/xvda$i b 202 $i"

60-copy-host-files

続いて/etc/hostsファイルをコピーしているのかと思いきや、sudoパッケージを導入しています。とりあえずファイル毎なくなってもらいます。

$ sudo rm 60-copy-host-files

70-install-ssh

なぜかopenssh-serverとpasswdパッケージを明示的に導入しています。 うーん、なんでだろう。なので、ここは消してしまいます。

$ sudo rm 70-install-ssh

99-clean-image

単純にyumを置き換えます。

44c44
< chroot ${prefix} /usr/bin/yum clean all
---
> chroot ${prefix} /usr/bin/apt-get clean

ここまでの結果を確認

"xen-create-image"コマンドで新しいdomUを作成します。

$ sudo xen-create-image --config /etc/xen-tools/xen-tools.vine.conf --hostname xen68 --ip 192.168.1.68 --arch i386

General Information
--------------------
Hostname       :  xen68
Distribution   :  vine42
Partitions     :  swap            128Mb (swap)
                  /               4Gb   (ext3)
Image type     :  sparse
Memory size    :  128Mb
Kernel path    :  /boot/vmlinuz-2.6.24-23-xen
Initrd path    :  /boot/initrd.img-2.6.24-23-xen

Networking Information
----------------------
IP Address 1   : 192.168.1.68 [MAC: xx:xx:xx:xx:xx:xx]
Netmask        : 255.255.255.0
Broadcast      : 192.168.1.255
Gateway        : 192.168.1.1


Creating partition image: /home/xen/domains/xen68/swap.img
Done

Creating swap on /home/xen/domains/xen68/swap.img
Done

Creating partition image: /home/xen/domains/xen68/disk.img
Done

Creating ext3 filesystem on /home/xen/domains/xen68/disk.img
Done
Installation method: rinse
Done

Running hooks
Done

No role scripts were specified.  Skipping

Creating Xen configuration file
Done
All done


Logfile produced at:
  /var/log/xen-tools/xen68.log
次に起動してみます。
$ sudo xm create -c /etc/xen/xen68.cfg
Using config file "/etc/xen/xen68.cfg".
Started domain xen68
                    [    0.000000] Linux version 2.6.24-23-xen (buildd@crested) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) #1 SMP Mon Jan 26 03:09:12 UTC 2009 (Ubuntu 2.6.24-4.6-generic)
[    0.000000] Command line: root=/dev/xvda2 ro 2 console=xvc0
....
とりあえず無事にログインできて成功しました。

2009/02/26

引き続き、Ubuntu 8.04なXenにVine Linux 4.2を導入してみる (前半)

とりあえず、rinse環境の構築について、流れは次の通りです。

  1. /etc/rinse/vine42.packagesファイルの準備
  2. /etc/rinse/rinse.confへの導入イメージの配置されているURLの追加
  3. /usr/lib/rinse/vine42ディレクトリとpost-install.shの準備

/etc/rinse/vine42.packagesファイルの準備

単純にパッケージ名からバージョン番号を外したものが羅列されています。既に定義されているcentos-4.packagesの先頭をみると次のようになっています。

#  Packages which we'll need to download for a minimal installation
# of CentOS 4.5
MAKEDEV
SysVinit
これにならってVine Linux 4.2で必要なファイルを並べれば良いのですが、導入用のISOファイルをみると"Vine/base/comps.xml"に導入するべきパッケージの情報が定義されています。

ここから最小構成を選択すれば良いのですが、面倒だったので既にVMWare Workstation上に作成していたVineのイメージのCloneを作成して、"apt-get remove"でほとんどのパッケージを削除する事で必要そうなRPMのリストを作成しました。
結果として得られたファイルは次の通りで、これを/etc/rinse/vine42.packagesの名前で保存しています。

/etc/rinse/vine42.packages の内容

filesystem
device-mapper
gpm-libs
libstdc++3
mingetty
termcap
cracklib
iproute
vine-logos
zlib
grep
readline
sed
sysklogd
udev
apt
gzip
mkinitrd
suspend2
bzip2
libsigsegv
openssl
glibc-common
setup
basesystem
chkconfig
e2fsprogs
glib2
hdparm
libgcc
beecrypt
mktemp
popt
shadow-utils
libtermcap
expat
iputils
ncurses
psmisc
cracklib-dicts
file
cpio
gawk
coreutils
dhcpcd
modutils
procps
gnupg
grub
pam
libuser
slang
sqlite3
rpm
SysVinit
tcsh
usermode
vim-common
vutils
which
console-tools
less
suspend2-userui-fbsplash
sudo
vixie-cron
vine-keyring
openssh
libxml2
kernel-doc
binutils
vine-release
kernel
hwdata
glibc
libexpat
db4
net-tools
pwdb
bash
logrotate
words
install-info
findutils
neon
MAKEDEV
passwd
rpm-libs
tar
util-linux
etcskel
initscripts
openssh-server
kernel-devel
tcp_wrappers

/etc/rinse/rinse.confへの導入イメージの配置されているURLの追加

なかをみれば一目瞭然ですが、ディストリビューション名毎にRPMファイルが導入されているトップディレクトリのURLが指定されています。 rinseはwgetを使ってRPMを取得するため、wgetが理解できるURLである必要があります。
http,https,ftp以外のschemeを受け付けるという情報はなく、実際"file://"なんかは不可なんですよね。かといってこんな実験をするのにオフィシャルサイトにトラフィックを発生させるのも嫌だったので自分のマシンにhttpdを入れてmountしました。

$ sudo mkdir /var/www/iso
$ sudo mount -o loop ~/iso/Vine42-i386.iso /var/www/iso
$ tail -3 /etc/rinse/rinse.conf
[vine42]
mirror = http://192.168.1.3/iso/Vine/RPMS/
mirror.amd64 = http://192.168.1.3/iso/Vine/RPMS/
実際にrinse.confに追加したのは、上の[vine42]から始まる3行です。 wgetを使ってアクセスできるかどうか確認しておきましょう。
$ wget http://192.168.1.3/iso/RELEASE-NOTES.ja
--22:24:45--  http://192.168.1.3/iso/RELEASE-NOTES.ja
           => `RELEASE-NOTES.ja'
Connecting to 192.168.1.3:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9,174 (9.0K) [text/plain]

100%[=============================================================================>] 9,174         --.--K/s             

22:24:45 (320.88 MB/s) - `RELEASE-NOTES.ja' saved [9174/9174]
もっとも一度ダウンロードしたファイルは/var/cache/rinse/vine42.i386以下に保存されているので、そんなに深刻じゃないんですけどね。
後から"apt-get upgrade"した時には、”http://updates.vinelinux.org/apt” に行ってしまうんですよね。やっぱりRingサーバーからダウンロードするようにしようかなぁ…。 その場合は /etc/rinse/rinse.conf はこんな感じでしょうか。
[vine42]
mirror = http://www.t.ring.gr.jp/pub/linux/Vine/Vine-4.2/i386/Vine/RPMS/
mirror.amd64 = http://www.t.ring.gr.jp/pub/linux/Vine/Vine-4.2/i386/Vine/RPMS/

/usr/lib/rinse/vine42ディレクトリとpost-install.shの準備

実は後からこのディレクトリの存在に気がついて、Xenの方で行なっていた作業の一部をこちらに持ってきました。
他のディストリビューションの設定をみると、ここで/etc/resolv.confや/etc/yum.confを作成したりしています。 これらをコピーしてくれば良さそうなのですが、rinseはRPM系のディストリビューションが対象でcentosもfedoraもyumを使っているため、RPM系ながらapt-getを使っているVine用に書き換える必要があります。

エラー処理を省いて適当に書き換えすぎたファイルは以下のようになっています。

$ sed -e '/^#/d' -e '/^$/d' post-install.sh
prefix=$1
if [ ! -d "${prefix}" ]; then
  echo "Serious error - the named directory doesn't exist."
  exit
fi
echo "  Creating resolv.conf"
if [ ! -d "${prefix}/etc/" ]; then
    mkdir -p "${prefix}/etc/"
fi
cp /etc/resolv.conf "${prefix}/etc/"
echo "  Setting up YUM cache"
if [ ! -d ${prefix}/var/cache/apt/archives/ ]; then
    mkdir -p ${prefix}/var/cache/apt/archives/
fi
for i in ${prefix}/*.rpm ; do
    cp $i ${prefix}/var/cache/apt/archives/
done
arch=i386
if [ $ARCH = "amd64" ] ; then
    arch=x86_64
fi
echo "  Mounting /proc"
if [ ! -d "${prefix}/proc" ]; then
    mkdir -p "${prefix}/proc"
fi
mount -o bind /proc ${prefix}/proc
echo "  Bootstrapping apt-get"
chroot ${prefix} /sbin/ldconfig 
vine_keyring_rpm="$(basename ${prefix}/vine-keyring*.rpm)"
chroot ${prefix} /bin/rpm -i --force --nodeps ${vine_keyring_rpm}
chroot ${prefix} /usr/bin/apt-get update 2>/dev/null
chroot ${prefix} /usr/bin/apt-get -yfm dist-upgrade 2>/dev/null
echo "  Cleaning up"
chroot ${prefix} /usr/bin/apt-get clean
kill "$(/bin/pidof udevd)" && sleep 10
umount ${prefix}/proc
/sbin/udevd -d
echo "  Final tidy..."
for i in ${prefix}/*.rpm; do 
    rm -f $i
done
find ${prefix} -name '*.rpmorig' -delete
find ${prefix} -name '*.rpmnew' -delete
この辺りはよく考えて修正する必要がありそうです。

処理の流れで抑えるべきところは"/sbin/ldconfig"を実行しているところです。 これをしないと/lib, /usr/lib以下にlib*so.1などのシンボリックリンクが作成されないため、"chroot ${prefix}"環境で"apt-get"なんかのコマンドを実行する事ができません。

またvine-keyringを導入する事でapt-getの際に必要なRPMパッケージの署名を確認するための公開鍵を取り込んでいます。”/usr/lib/rpm/gpgp-import.sh”を走らせるべきだったのか、ちょっと迷いましたが、rpmコマンドを使って導入しています。

fedora用のスクリプトでは/etc/shadowファイルを作成するためにコマンドを実行していますが、keyringを導入してから"apt-get -ymf dist-upgrade"を実行しています。

この"apt-get dist-upgrade"がトラブルの元なのですが、この中でudevパッケージを導入する際にudevdプロセスを再起動してしまい、このプロセスが${prefix}や${prefix}/procを掴んでしまうため、"umount ${prefix}/proc"の前後でプロセスを立ち上げ直しています。

kill "$(/bin/pidof udevd)" && sleep 10
umount ${prefix}/proc
/sbin/udevd -d

killコマンドは常にプロセスへシグナルを送ってすぐに停止してしまうため、"umount ${prefix}/proc"の実行時にudevdが確実に停止しているように、適当な時間として10秒sleepさせています。この後でudevdがないと、xenの起動にも失敗してしまいますので、udevdは立ち上げています。

とりあえず試す

rinse単独で動くかどうかの確認をする事は簡単です。 centos-4のイメージを作成してみようとすれば…、

$ mkdir /tmp/centos4
$ sudo rinse --directory /tmp/centos4 --distribution centos-4
Failed to fetch : http://anorien.csc.warwick.ac.uk/mirrors/centos/4.5/os/i386/CentOS/RPMS/
 404 Not Found
なるほど…。/etc/rinse/rinse.confを修正して再びトライします。
$ diff -u /etc/rinse/rinse.conf.20090226 /etc/rinse/rinse.conf
14,15c14,15
< mirror = http://anorien.csc.warwick.ac.uk/mirrors/centos/4.5/os/i386/CentOS/RPMS/
< mirror.amd64 = http://anorien.csc.warwick.ac.uk/mirrors/centos/4.5/os/x86_64/CentOS/RPMS/
---
> mirror = http://ftp.iij.ad.jp/pub/linux/centos/4/os/i386/CentOS/RPMS/
> mirror.amd64 = http://ftp.iij.ad.jp/pub/linux/centos/4/os/x86_64/CentOS/RPMS/
$ sudo rinse --directory /tmp/centos4 --distribution centos-4
[18:73] Downloading: ...
...
...
Installation complete.
同じようにvine42も作成してみると、
$ mkdir /tmp/vine42
~$ sudo rinse --directory /tmp/vine42 --distribution vine42
[41:93] Downloading: libgcc-3.3.6-0vl7.i386.rpm ..   
...
...
Installation complete.
まぁいろんなワーニングやら出てくるんですが、いまのところは放っておきます。

試し終ったら、ちゃんと消しておきましょう。

$ sudo rm -r /tmp/vine42 /tmp/centos4
とりあえずこれでrinseでVine Linux 4.2のXen用OSイメージを作成するための準備は終りました。

Ubuntu 8.04なXenにVine Linux 4.2を導入してみる

Ubuntu 8.04でXenを導入してから、以前のようにCentOSのイメージ作成を試していなかったのですが、いつの間にかrpmstrapがなくなってrinseに置き換わっていました。
つい先日Xenとは別にたまたまrinseの説明を読んでいて、導入対象のRPMを指定する際に、パッケージ名をバージョン付きで指定する必要がないので便利だなぁと思っていたところでした。 Ubuntu 7.10でCentOS-4.5を入れる時にはパッケージのバージョン違いで、けっこう苦労したので。

普通にCentOSの導入はどうせできると思ったので、Vine Linux 4.2を導入してみます。 たまーにLatexが必要になった時に安定して動く環境というとVineがやっぱり挙げられるのですが、サーバーを立ててサービスにしてみたいという野望もあったのでXen上にイメージを構築する事にしました。

とはいえ、目指すところはとりあえず使える事。 rinseはrpm2cpioで展開するだけなので、微妙に通常の導入手順とは違ってきます。
それにVMWareみたいに動かそうと思ったらCentOS5かRHEL5でGUIを使って完全仮想化環境のXen上でやればいいだけのこと。 ここでは簡単にイメージを作って走らせるべく、"とりあえず”動くところを目指します。

だいたいの流れはこんな感じになりました。

  • rinse環境の構築
    • /etc/rinse/vine42.packagesファイルの準備
    • /etc/rinse/rinse.confへの導入イメージの配置されているURLの追加
    • /usr/lib/rinse/vine42ディレクトリとpost-install.shの準備
  • xen-create-imageコマンドからのVine4.2イメージの作成環境の構築
    • Vine4.2用の/etc/xen-tools/xen-tools.confの準備
    • /usr/lib/xen-tools/vine42.dディレクトリともろもろセットアップスクリプトの配置
  • 上記の繰り返しによる試行錯誤
最終的には
sudo xen-create-image --config /etc/xen-tools/xen-tools.vine.conf --hostname xen65 --ip 192.168.1.65 --arch i386
みたいな感じで動かす事ができるようになりました。
詳細はまた明日書きましょう。

2009/02/23

PIC16F819、PIC12F629で遊んでみる

組み込み用途としてはAKI-H8みたいな方が便利そうだけれど、転職して回路図をみる機会もでてきたので、電子回路の勉強がてら秋月からPICマイコンを買ってみました。 とりあえず準備した環境は、こんな感じです。

  • OS: Windows Vista SP1 32bit版 (Inspiron 640m)
  • Software:
    • PICkit 2 Programmer v2.60
    • MPLAB IDE v8.20
    • HI-TECH C Lite v9.60PL5

選んだのは18ピンの"PIC16F819"と8ピンの"PIC12F629"の2種類とMICROCHIP製の純正ライターの"PICkit2"。 値段と機能は比較しましたが、それほどちゃんとした基準で選んだわけではないです。

書き込み用のライター機能だけを持つ基板を作成しました。 いちいちプログラムを修正するためにPICをつけかえる事は避けたいですが、ブレッドボード上にピンヘッダをつけたところ、PICkit2との接触が悪いらしく書き込み時にVerifyできない旨のエラーが表示されてしまいました。
そこで最終的にガラスエポキシ基板にICソケットやらライター機能用の結線だけ半田付けをして、PICkit2と接続して使っています。

PICの勉強を一人でやるとはいっても情報を公開している方が大勢いますが、問題もやっぱりあって、IOポートにLEDを接続して光らせるだけでもうまくいかない場合がありました。

"PIC12F629"は3番目のIOポートが入力専用だっていう点と、他のポートから信号を出力させるために"CMCON"レジスタの下位3ビットを立てた上で、"TRISIO"を0で初期化すること。

#include  <htc.h>
__CONFIG(UNPROTECT & BORDIS & MCLRDIS & PWRTDIS & WDTDIS & INTIO);
void  init(void) {
        CMCON = 0b00000111; // 0x07;
        TRISIO  = 0b00000000;
}
void  main(void) {
        init();
        _delay(100);

この他にもC言語(PICC)でプログラムを書いてみましたが、内部クロックで動作させるためにINTIOをセットするとか、外部クロックで動作させるときに、どんなオプションが設定できるかわからず、結局インクルードファイルを直接みてコメントを読んで理解しました。 情報の探し方がわかればいいけれど、PICチップ自体の仕様とC言語からどうやって操作するかはHI-TECH社の作り方との組み合せなので、「PICもC言語も始めてです」、っていう場合には混乱しそうです。
とりあえずPICのDataSheetと、HI-TECH社のPICCのインクルードファイルを比較しながら手探りで進めて行こうとしています。

HI-TECH PICCのQuickstart guideにもサンプルコードが載っていますが、ターゲットのPICによって__CONFIGの後ろとかTRISIOの名前が違ったり、ポート名違ってコンパイルできず最初は困りました。
Cygwinを使って"C:\Program Files\HI-TECH Software\PICC\PRO\9.60\include"の下にあるヘッダファイルにgrepしながら、なんとか進んでいます。 "12F629"のヘッダファイルは、コメントが豊富で良かったですが、"16F819"のは不親切な感じです。いろいろみてみなければ…。

2009/02/15

cuda 2.1を試してみる

なんとなく遊んでいるサーバー用のマシンにPCI Expressが付いているので、"Quadro FX 370 Low Profile"を購入して載せてみた。
CUDAとしては中途半端でもったいない感じはしますが、そろそろメインデスクトップのマザーボードをAGP 8xなAM2NF3-VSTAから変更した時の事を考えました。 純粋にCUDAのテストに使うなら、G9x世代のミッドレンジよりハイエンドに属するボードでないと速さが実感できなくて、おもしろくないだろうなというのが使ってみた感想です。

しばらく前に出ていたCUDA 2.1 betaを入れていたのですが、今日になって2.1のリリースに気がついたのでドライバやらToolkitやらを入れ直しました。
環境はこんな感じです。

  • CPU: AMD Turion 64 MT-37
  • Memory: 1GB
  • Graphic Card: Quadro FX 370 Low Profile
  • OS: Ubuntu 8.04 LTS Server x86_64版
うーん、非力だなぁ。

さて、CUDA Zoneにある資料をみるとvecAddという関数の付いたサンプルプログラムが乗っています。これをちょっと変更しながら、いろいろ試してみました。
CUDA Zoneの学習ページにある「CUDAプログラミングモデルの概要」をみると、"cudaMalloc"と"CudaMemcpy"を使ってデータをやり取りする辺りが最低限必要な知識みたい。 サンプルを少し変更しながら、なんとか簡単なプログラムは書けるようになりました。

さて、お題は何にしようかなぁ、と考えてみて、いつも通り簡単なループを沢山回して素数をみつけるプログラムを書く事にしました。
アルゴリズムは「2より大きい自分自身以外の数で割れない事」を素直に確認します。 効率とか考えません。単純に自分自身以外の数で割れない事を計算から確認していきます。
このロジックは実用性は皆無だけれど、新しいプログラミング言語を学習する時は、適度にループと条件分岐と配列やらハッシュやらのデータ構造をなにか1つは使うし、時間もかからないので良く使います。
なにしろ結果を表示させて正しく動いているか確認が簡単ですから。 新しく勉強する言語では結果そのものが怪しいので、簡単に確認できる事が重要です。

とりあえず試した感想は、この程度の仕事だとCPUよりもちょっと早いかなぁぐらい。 単純に1関数で1つの素数判定(?そんなに大袈裟な事ではない)をさせた場合は、CPUよりも遅くなりました。 1回の呼び出しで適当な処理単位(#define WORKUNIT 256)分の数字について素数か判定させる処理を繰り返すと,ある程度はスケールするようでした。

idx = blockDim.x * blockIdx.x + threadIdx.x;
for(i=0; i<WORKUNIT; i++)
  target_number = (WORKUNIT * idx + i)
でもこの作業を割り振るためのユニットが最上位機種でFX 370の30倍ぐらいあるかと思うと、スケールする可能性は確かに感じました。
今回の例はシンプルすぎるから、メモリ空間にもっとアクセスするようなケースでないとCPUで処理をさせた時との差がわかりずらいかなと思います。 2次元の各画素に計算を適用するとか、音声信号に対するFFTみたいな操作で、ちゃんと動いているか検証も簡単な良いネタがあると良いですね。

2009/02/11

Alixの内部COM1をAE-UM232Rに接続する

しばらく前に秋月から購入していたFT232RLを使ったTTLレベルでのUSBシリアル接続を可能にする"AE-UM232R"をalix2c3の基板上にあるパターン(J12 COM1、5pin)に接続してみました。

昨日のTinyBIOSのRelease Noteをみると、alix2d*シリーズは同じ個所が"COM2"になっているようですが、一世代古いalix2c3は全面に出ている"J5 COM1"の9Pin D-Sub端子と同じ線を使っています。

同じ端子なのでD-Subと同時に接続すると、両方の端末に同じように表示されます。 それじゃなんでこんな事をするのかといわれれば、「"AE-UM232R"を持っているんだから使わなきゃ」という義務感以外のなにものでもありません。
さてさてPC EnginesのWebサイトからalix2c3の配線図を確認すると、次のようなピン配置になっています。

  1. V3
  2. TXD#1
  3. RXD#1
  4. GND
  5. Vcc

まぁブレッドボードに置いた"AE-UM232R"と"TXD","RXD","GND"を接続するだけで動くだろうと思ったところ、Ubuntu 8.04のkermitを立ち上げて、文字の受信はできるもののキー入力が受け付けてもらえませんでした。

しばらく格闘しましたが、ブレッドボード上で"RTS"(3pin)と"CTS"(10pin)をショートさせて無事に接続完了。

こんなの意味あるかなぁと思っていましたが、シリアルケーブルは太く、細いUSBケーブルで接続ができると机の上がすっきりとシンプルになりました。
"AE-UM232R"はどうでもよくて、Alix2台のJ12 COM1同士を接続すれば、HeartBeatのやりとりができるから、HA(High Availability)構成にできそう…。

誰かに依頼されて書いているわけではないですが…
- Reference: http://googlejapan.blogspot.com/2009/02/google.html

Googleが自社のブログ内で、ガイドラインに抵触するマーケティング活動が行なわれている事を認めました。(参照先:Google Japan Blog: Google のマーケティング活動について

ちなみにCyberBuzz自体はブロガーに好意的な記事を書く事を強制してはいません。
公言している自分のルールを守れなかっただけで、法律に抵触したわけではありませんが、 インターネットと人力の貴重な資源を無駄な事に使っているなぁというのが率直な感想です。

友達なら言動が一致しないので不安になるところです。 でもどこぞの総理と比較すれば、それほど不安になる必要はないか…。
いずれにしても自分のルールを守れなかった点では僕のGoogleに対する好感度が下がったのは事実です。

この手法自体についても、 お金を持つ人達が世論を動かしているのが現実とはいえ、 それに躊躇せずに追従し、露骨に実行する様が透けてみえるようで嫌いです。
何にしても、こんな方法で広まったサービスが人々の役に立つのでしょうか。
実際は役に立つかもしれませんが、こんな方法でないと広まらないものは不要なのかもしれません。

詳しい解説はCNET Newsにあります。 Googleのサイトには経緯が書かれていないため、これを読まないと何の謝罪かわからないでしょう。

ALIXのBIOSをアップデート

alix2c3を使っていて電源投入時のBIOSがv0.99となっていて、まだfreedosからアップデートした事がなかったので試してみました。

まぁ説明書(Instructions)もある事ですし、簡単なメモを残します。
たまたま手元にあって使ったものは次のとおりです。

  • USB接続なCF,SD等の各種対応カードリーダ
  • CFカード 2GBのもの(Transcend 266倍速)
  • これらCFカードを差したカードリーダーを接続するUbuntu 8.04 (x86_64版)

リンク先には128MBなCFカード専用のイメージ("freedos.zip")や、Windows XPを対象にしたイメージ("freedos2.zip")がありましたが、LBA imageな"freedos3.zip"を使いました。
2GBなCFカード(dmesgコマンドからlinux上では"/dev/sdh"として認識されている事を確認)にfreedos3.zipのイメージファイルをlinux上でddを使って書き込みます。

$ sudo dd if=freedos_alixupdate_0.99.img of=/dev/sdh bs=512

Alix2/Alix3のSupport informationから"BIOS update (from CF card)"と書かれらセクションにある最新版のBIOSファイルをダウンロードしてきます。今回は"v0.99h"を選択しました。
続いてCFカードをマウントし、"v0.99h"のBIOSイメージをコピーします。

$ sudo mount /dev/sdh1 /mnt
$ unzip -x ~/alixb099h.zip
$ sudo cp alix* sb.com /mnt/
$ sudo umount /mnt

このカードをALIXに接続し、電源を接続します。 起動時に"S"キーを押してBIOSの設定からLBA modeを有効にするように指示がありますが、私の環境では設定を変更せずに起動してしまいました。

640 KB Base Memory
261120 KB Extended Memory

01F0 Master 044A TRANSCEND                               
Phys C/H/S 3949/16/63 Log C/H/S 987/64/63
FreeDOS kernel build 2036 cvs [version Aug 18 2006 compiled Aug 18 2006]...................123
Kernel compatibility 7.10 - WATCOMC - 80386 CPU required - FAT32 support

(C) Copyright 1995-2006 Pasquale J. Villani and The FreeDOS Project.
All Rights Reserved. This is free software and comes with ABSOLUTELY NO
WARRANTY; you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation;
either version 2, or (at your option) any later version.
 - InitDiskWARNING: using suspect partition Pri:1 FS 06: with calculated values    7-49-49 instead of    1-242-49
C: HD1, Pri[ 1], CHS=    0-1-1, start=     0 MB, size=    15 MB
FreeDOS HIMEM64 3.26 [Aug 25 2006] (c) 1995, Till Gerken 2001-2006 tom ehlert
HIMEM - Always On A20 method used
Kernel: allocated 43 Diskbuffers = 22876 Bytes in HMA

FreeCom version 0.84-pre2 XMS_Swap [Aug 28 2006 00:29:00]
C:\> sb.com
ALIX flash update (C)2007 PC Engines GmbH
Flash ID = 1 FFFF GPI = FF
Flash ID = 0 9D37 GPI = 01
Reading 512KB flash image alix1.bin................
Compare Erase Program Verify - update OK.
"sb.com"コマンドは適切なものを選択して自動実行してくれるとあるけれど、alix1.binをロードしてしまった…。果してこれで良いのだろうか…。

気になりながらも、そのまま電源を落して再度投入すると画面に"v0.99h"と表示され、無事に完了したようです。

PC Engines ALIX.2 v0.99h                              
640 KB Base Memory
261120 KB Extended Memory

01F0 Master 848A LEXAR ATA FLASH CARD                    
Phys C/H/S 3977/16/63 Log C/H/S 994/64/63

2009/02/03

PowerBook G4をパワーアップ

PowerBook G4 550MHzが実家にあったので、メモリを1GBに、HDD(PATA)を120GBに入れ替えてきました。ダイソーでT-8ドライバーが売っているという情報と、この頃のPowerBookで使えるHDDは120GBが最大サイズというのは事前に調べておいて正解でしたが、HDDを外す方法がわからずに苦労しました。
使ったものは、だいたい…

  • T-8トルクスドライバー (ダイソーで購入)
  • 512MB Samsung製 PC-133 SDRAM 2枚 (秋葉館で購入)
  • 120GB Travelstar 5K160 HDD (同上)
  • Firewire 2.5inch HDDケース + 接続用6ピン Firewireケーブル (手持ちの流用)
こんなところでしょうか。

割と新し目な1.5GHz版の交換方法とは微妙にアセンブリが違う…。Googleで何回か検索したところ写真付きで分解の様子を公開している方がいて、裏蓋を外して、バッテリーを外した側面からHDDのネジを2個所外すだけで簡単に分解が完了。
本当に助かりました。なんかこういうページ作れるのってすごいなぁ。

USBは1.1なので、Firewire接続が可能な2.5inch HDDケースを持っていたので、そこに新しいHDDを入れて"SuperDuper"というツールでドライブ全体をコピーしました。
MacでのHDD引越し方法はいろいろ説明しているサイトがありましたが、復元用イメージを経由せずに直接外部HDDにコピーできるのはSuperDuperだけでした。ああ、"Carbon Copy Cloner"というのもありましたが、Mac OS X 10.3なPantherマシンだったので、古いバージョンがダウンロードできず"SuperDuper"にしたのでした。

しかしPowerBook G4も世代によって分解の方法がまるで違って、裏蓋を開けるだけでHDDにフルにアクセスできた550MHz版は作業が楽でした。情報が少なくてまいったけれど。 HDDの回転数が4200rpmから5600rpmに上った事や内部転送速度も向上していることが良かったのか、まだまだ使えるマシンに生れ代りました。 ちょっと前はメモリを足せば早くなるといいましたが、最近はHDDを新しく速度の早い物に変更した方が良いのかもしれません。怖いのは発熱だけですね。
メモリはMacのサイトにも説明がありますが、キーボードを3個所いじると簡単に開いて、2枚のSDRAMを簡単に交換する事ができます。しかし戻ってきてからリンクを探してもみつからないなぁ…。うーん。