2006-08-03 (木)
■ 玄箱の時計の精度を改善する (2)
adjtimex コマンドを使って、玄箱の時計の精度をさらに上げてみる。 まず、1時間での時計のズレを測定。
kuro-box:~# ntpdate -b ntp1.jst.mfeed.ad.jp; sleep 3600; ntpdate -b ntp1.jst.mfeed.ad.jp 3 Aug 21:07:04 ntpdate[986]: step time server 210.173.160.27 offset -0.006881 sec 3 Aug 22:07:05 ntpdate[990]: step time server 210.173.160.27 offset 0.051559 sec
本当はもっと長時間の測定を3回くらい行って平均値を使うべきだが、 とりあえずこの結果を元に adjtimex に与えるパラメータの値を計算。
6553600 × 0.051559 × 24 ÷ 8.64 = 938602.95111…
/etc/default/adjtimex に以下のように設定。
FREQ=938603
/etc/init.d/adjtimex restart して設定を有効にし、もう一度測定。
kuro-box:~# ntpdate -b ntp1.jst.mfeed.ad.jp; sleep 3600; ntpdate -b ntp1.jst.mfeed.ad.jp 3 Aug 22:13:30 ntpdate[1004]: step time server 210.173.160.27 offset 0.003819 sec 3 Aug 23:13:34 ntpdate[1008]: step time server 210.173.160.27 offset -0.010009 sec
最初の測定がいい加減なのでズレがまだ大きいが、改善はされている。 あとで測定をもっときちんと行って、設定し直してみよう。
2006-08-05 (土)
■ noflushd と laptop mode
ディスクアクセスを抑制するために、今までは noflushd を使っていたが、 カーネルのバージョンアップ をして laptop mode が使えるようになったので、試してみることにした。
以下のパッケージをインストール。
# aptitude -R install laptop-mode-tools # aptitude install hdparm
/etc/laptop-mode/laptop-mode.conf の設定を以下のように変更。
LAPTOP_MODE_ALWAYS_ON=1 AC_HD_WITH_LM=60 DO_HD_POWERMGMT=0 HD="/dev/hda"
以下のコマンドを実行し、設定を有効にする。
# /etc/init.d/laptop-mode start
多分これで良いと思うのだが、 なぜか HDD がいつまでたってもスピンダウンしてくれない。 代わりに noflushd をインストールしてみると、問題なくスピンダウンされる。
laptop-mode-tools のバージョン履歴を見ると、 もっと新しいバージョンのものにすれば良さそうな気もするが、 testing のパッケージはあまり混ぜたくない。 なんだかよく分からないが、とりあえず laptop mode はあきらめて、 noflushd を使うことにしよう。
2006-08-06 (日)
■ 玄箱に特有の部分の設定
Wiki の 玄箱/Debian ページ の下に、 いくつかの作業記録を追加した。
最後のは、バージョン 2.4.17 のカーネルのまま運用していた頃は、 こんなに苦労していました、という昔話みたいなもの。
これで、玄箱に特有の部分の設定は大体終えたので、 あとは普通の Linux サーバと同様に設定していくだけだ。
■ タスクトレイに取り外しアイコンを復活させる
USB の外付けハードディスクを時々使っているのだが、 それを取り外す時に使うアイコンがタスクトレイに出なくなってしまった。 どうすればいいのか調べてみたところ、以下の方法が載っていた。
「ファイル名を指定して実行...」で rundll32 shell32.dll,Control_RunDLL hotplug.dll と入力。 すると、「ハードウェアの取り外し」というウィンドウが出てくるので、 「タスクバーに[取り外し]アイコンを表示する」にチェックを入れて、 「閉じる」ボタンを押す。
これで直った。 多分、このチェックを何かのはずみで外してしまっていたんだと思う。
しかし、こんなに簡単に発生しうる状況が、 こんな方法でしか直らない OS というのもどうかと思う。
2006-08-08 (火)
■ ネガティブマージンを利用した幅固定のサイドバー
以前、tDiary のサイドバーを幅固定にしたが、 PukiWiki の方もスキンをいじって、 サイドバーは幅固定で、本文の方は幅可変になるようにしてみた。 本文の方がサイドバーの部分より先に来るような html にできたので、 少しは SEO 的な効果もあるかもしれない。
そのうち時間に余裕があったら、 デフォルトのスキンを同様に修正してみようか? でも、PukiWiki のスキンは PHP と html がごちゃ混ぜなので、 あまり触りたくないんだよなぁ。
2006-08-09 (水)
■ DNS キャッシュサーバ (dnsmasq) の構築
Wiki の 玄箱/Debian ページ の下に、以下の作業記録を追加した。
今更ながらに思ったが、 この dnsmasq というソフトは非常に良くできている。 まだ機能の一部しか使ってみていないが、インストールしておいて損は無いと思う。
2006-08-11 (金)
■ 玄箱の NFS サーバの転送速度
玄箱の標準のカーネルでは、 カーネルモードの NFS サーバ (nfs-kernel-server) はまともに動かないため、 ユーザモードの NFS サーバ (nfs-user-server) を使わないといけない。 しかし、カーネルのバージョンアップ をすれば、カーネルモードの NFS サーバが使えるようになる。
カーネルモードの NFS サーバと、ユーザモードの NFS サーバとで、 転送速度がどれくらい違うのか比較をしてみた。 実験に使ったのは、以下の2台の玄箱。
- kuro-box1 (玄箱/HG, カーネル 2.4.17, nfs-user-server)
- kuro-box2 (玄箱/HG, カーネル 2.6.17.3, nfs-kernel-server)
この2台の玄箱を使い、以下のように実験を行った。
- 100Mbps のスイッチングハブを介して、2台の玄箱を接続
- 片方の玄箱を NFS サーバにして、もう片方の玄箱からマウント
- 以下のコマンドを実行し、100MB のファイルを NFS 経由で書き込み
$ time dd if=/dev/zero of=/mnt/100MB bs=16k count=6400
結果を以下に示す。
- kuro-box1 をサーバにして、オプション rsize=8192,wsize=8192,tcp でマウント
104857600 bytes transferred in 29.500423 seconds (3554444 bytes/sec) real 0m29.528s user 0m0.100s sys 0m2.044s
- kuro-box2 をサーバにして、オプション rsize=8192,wsize=8192,tcp でマウント
104857600 bytes transferred in 17.911811 seconds (5854104 bytes/sec) real 0m17.976s user 0m0.070s sys 0m2.760s
- kuro-box2 をサーバにして、オプション nfsvers=3,rsize=32768,wsize=32768,tcp でマウント
104857600 bytes transferred in 13.789766 seconds (7604016 bytes/sec) real 0m14.072s user 0m0.070s sys 0m3.110s
書き込みの速度を1回ずつ測っただけのいい加減な測定だが、 それでも有意な差が見られた。
Debian 化しただけだと 3〜4 MB/s くらいだが、 カーネルを入れ替えたり、適切なオプション指定をすることで、 7 MB/s くらいの転送速度をたたき出すことができる。 あとは、ギガビットのハブを導入してチューニングすれば、 もう少し速くできるだろう。
2006-08-12 (土)
■ Internet Explorer 6 が突然終了する
先日、Microsoft の8月の月例パッチを適用した頃から、 どうも IE が頻繁に異常終了するようになっていたが、 この件に関する情報をようやく見つけた。
- 8月の修正パッチにIEが不正終了する問題,Windows 2000とXP SP1が影響
- 突然 Internet Explorer 6 Service Pack 1 は、918899 の更新プログラムのインストール後に終了します。
Windows 2000 使っています。該当します。どうすればいいんですか?
この問題を解決するには、Microsoft Product Support Services にお問い合わせのうえ、修正プログラムを入手してください。
……電話しないといけないなんて面倒です。他に直す方法無いんですか?
この問題を回避するには、以下の手順を実行します。
1. Internet Explorer 6 を起動します。
2. ツール メニューで インターネット オプションをクリックし、詳細設定タブを次にクリックします。
3. 設定ボックスで HTTP 1.1 設定での HTTP 1.1 を使用するチェックボックスをオフにして、OK を次にクリックします。
……HTTP/1.1 って、そんな簡単にオフにしていいんですか?
なんというか、相変わらず、突っ込みどころ満載な対応っぷりだ。 まぁ仕方ないので、HTTP/1.1 をオフにしてしのぎますか。
■ 玄箱の日本語環境の設定
Wiki の 玄箱/Debian のページに、 以下の作業記録を追加した。
今までは、 あくまでもサーバなのだから日本語は使えなくても良い、 という考えでいた。 しかし、Samba 経由で書き込んだファイルの中に、 ファイル名が日本語のものがあって、 それが ???????? のように表示されているのを見て、 さすがに日本語の表示くらいはできるようにしておこうと思ったわけだ。 いざ設定をしてみると、 表示されるメッセージが日本語になるのは、やはり気持ちが良い。
ついでなので、キャラクタセットを UTF-8 にしてみたが、 Samba の設定 を見直すくらいで済んで、意外と簡単だった。 まだ EUC に設定している Linux マシンが他にあるので、 なにか問題が起きそうで怖いが、将来のことを考えると、 ぼちぼち UTF-8 に移行していった方がいいだろう。
2006-08-16 (水)
■ 音楽 CD を APE と 7z で圧縮してみる
私は Windows 用の CD のバックアップを取るのに、 イメージファイルを作成して 7z 形式で圧縮して保存している。 しかし、音楽の CD で同じ事をやってみたところ、 あまり圧縮が効かなかった。 こういうのは、APE とか FLAC といった、 音楽専用の可逆圧縮形式を使った方がいいのかもしれない。
ということで、 手持ちの CD をリッピングして wav 形式のファイルを作成し、 APE や 7z で圧縮して、圧縮率を比べてみた。 とにかく保存用にサイズを小さくすることが目的なので、 APE で圧縮した後、さらに 7z で圧縮というのも試してみた。
- APE (Monkey's Audio 3.99 の Extra High で圧縮)
- 7z (7-zip32.dll 4.31.00.03 の Level9 で圧縮)
| 7z 圧縮前のサイズ | 7z 圧縮後のサイズ | |
| wav 形式 | 812180924 (100.0 %) | 725721181 ( 89.4 %) |
| APE 形式 | 453929120 ( 55.9 %) | 460089385 ( 56.6 %) |
結果は APE 形式の圧勝だった。 7z フォーマットが汎用的な圧縮形式であるのに対し、 ape フォーマットは音楽データ専用の圧縮形式だから、 こういう結果になっても変ではないが、 まさかこれほどまでに差がつくとは意外だった。
そしてさらに意外だったのは、 APE → 7z と2重に圧縮をかけると、 かえってサイズが大きくなるということ。 結局、音楽 CD を劣化なしにバックアップしておきたい場合は、 とにかく APE や FLAC などで圧縮するのが良いようだ。
2006-08-17 (木)
■ クロスコンパイル環境の構築
玄箱用にクロス・コンパイル環境を作る のページを参考に、 PowerPC 用のバイナリを作成するための環境を、 PC にインストールした Debian sarge 上に作ってみた。 ただし PC や玄箱の環境を汚したくないので、 作業は全て VMware の中で行った。
開発環境のインストール
以下のパッケージをインストール。
# aptitude install gcc # aptitude install make # aptitude install bison # aptitude install flex
binutils のビルド
以下のコマンドを実行し、binutils をインストール。
$ wget http://www.t.ring.gr.jp/archives/GNU/binutils/binutils-2.15.tar.bz2 $ mkdir -p source $ cd source/ $ tar xvfj ../binutils-2.15.tar.bz2 $ cd .. $ mkdir -p build/binutils $ cd build/binutils $ ../../source/binutils-2.15/configure \ > --target=ppc-linux \ > --enable-shared \ > --prefix=/usr/local/ppc-cross $ make # su # make install
libc のインストール
以下のパッケージをダウンロードしてくる。
- http://ftp.jp.debian.org/debian/pool/main/g/glibc/libc6_2.3.2.ds1-22sarge3_powerpc.deb
- http://ftp.jp.debian.org/debian/pool/main/g/glibc/libc6-dev_2.3.2.ds1-22sarge3_powerpc.deb
- http://ftp.jp.debian.org/debian/pool/main/l/linux-kernel-headers/linux-kernel-headers_2.5.999-test7-bk-17_powerpc.deb
以下のコマンドを実行し、~/ppc-linux ディレクトリにファイルを展開。
$ dpkg -X libc6_2.3.2.ds1-22sarge3_powerpc.deb ~/ppc-linux $ dpkg -X libc6-dev_2.3.2.ds1-22sarge3_powerpc.deb ~/ppc-linux $ dpkg -X linux-kernel-headers_2.5.999-test7-bk-17_powerpc.deb ~/ppc-linux
~/ppc-linux/usr/lib/libc.so を以下のように修正。
/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf32-powerpc) GROUP ( libc.so.6 libc_nonshared.a )
~/ppc-linux/usr/lib/libpthread.so を以下のように修正。
/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf32-powerpc) GROUP ( libpthread.so.0 libpthread_nonshared.a )
ライブラリのファイルを1箇所にまとめる。
$ cp -p ~/ppc-linux/lib/* ~/ppc-linux/usr/lib/
gcc のビルド
元の説明では gcc-core になっているが、 ちょっと欲を出して gcc 全てをビルドしてみる。
$ wget http://www.t.ring.gr.jp/archives/GNU/gcc/gcc-3.3.5/gcc-3.3.5.tar.bz2 $ cd source/ $ tar xvfj ../gcc-3.3.5.tar.bz2 $ cd ../ $ mkdir -p build/gcc $ cd build/gcc/ # su # export PATH=/usr/local/ppc-cross/bin/:$PATH # ../../source/gcc-3.3.5/configure \ > --prefix=/usr/local/ppc-cross \ > --target=ppc-linux \ > --enable-shared --disable-nls \ > --with-as=/usr/local/ppc-cross/bin/ppc-linux-as \ > --with-ld=/usr/local/ppc-cross/bin/ppc-linux-ld \ > --with-headers=/home/revulo/ppc-linux/usr/include \ > --with-libs=/home/revulo/ppc-linux/usr/lib # make # make install
動作確認
以下のような hello.c というファイルを作成。
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
以下のコマンドを実行し、hello.c をコンパイル。
$ ppc-linux-gcc -o hello hello.c
生成された hello を玄箱に転送し、実行。
課題
一応、Hello, world をコンパイルするところまでやってみたが、 いくつか反省点や課題がある。
- Java コンパイラなどもビルドしてしまったが、やはり C と C++ コンパイラくらいで十分
- Debian パッケージ用のパッチをあててからビルドしたほうが良い
- どうせなら binutils や gcc を deb パッケージにしておきたい
調べてみると、dpkg-cross というのを使えば、 glibc のインストール作業がもっとスマートにできるらしい。 さらに、toolchain というのを使えば、 deb パッケージの作成まで含めて、作業がかなり自動化されるようだ。 今度はそれを試してみよう。
2006-08-18 (金)
■ クロスコンパイル環境の構築 (2)
Build Cross Development Environments のページを参考に、toolchain を用いて、クロスコンパイル環境の構築をしてみる。 昨日の方法と比べると、以下のような特徴がある。
- 作業がシンプルで分かりやすい
- binutils や gcc の deb パッケージも作成される
- ビルドされるパッケージのバージョンは固定
ただ、 toolchain-source のソースパッケージのページ を見ると、開発がストップしているようなので、 この方法が今後も使えるのかどうか不安だが、 とりあえずやってみる。
開発環境のインストール
以下のパッケージをインストール。
# aptitude install gcc # aptitude install make # aptitude install bison # aptitude install flex # aptitude install patch
toolchain の設定
以下のパッケージをインストール。
# aptitude -R install toolchain-source
後の作業で必要となる、その他のパッケージをインストール。
# aptitude install autoconf2.13 # aptitude install automake1.7 # aptitude install bzip2 # aptitude install debhelper # aptitude install dpatch # aptitude install gettext # aptitude install libtool # aptitude install realpath # aptitude install texinfo
以下のコマンドを実行し、ビルドの準備を行う。
# cd /usr/src # EMAIL='root@localhost' tpkg-make powerpc-linux
binutils のビルド
以下のコマンドを実行し、binutils のパッケージをビルド。
# cd /usr/src/binutils-powerpc-linux-2.15 # debuild
以下のコマンドを実行し、ビルドしたパッケージをインストール。
# debi
libc のインストール
/usr/bin/tpkg-install-libc の SERVER の設定を以下のように変更。
SERVER=${TPKG_SERVER:-"ftp://ftp.jp.debian.org"}
/usr/bin/tpkg-install-libc の wget で始まる行の設定を、 以下のように testing から stable に変更。
wget $SERVER/debian/dists/stable/main/binary-${debarch}/Packages.gz -O $TDIR/packageset.gz || exit 2
以下のコマンドを実行し、glibc をインストール。
# tpkg-install-libc powerpc-linux
gcc のビルド
以下のコマンドを実行し、gcc のパッケージをビルド。
# cd /usr/src/gcc-powerpc-linux-3.4.3 # debuild
gcc 3.4 の base パッケージをインストール。
# aptitude install gcc-3.4-base
以下のコマンドを実行し、ビルドしたパッケージをインストール。
# debi
動作確認
以下のような hello.c というファイルを作成。
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
以下のコマンドを実行し、hello.c をコンパイル。
$ ppc-linux-gcc -o hello hello.c
生成された hello を玄箱に転送し、実行。
2006-08-19 (土)
■ クロスコンパイル環境の構築 (3)
toolchain を用いて binutils や gcc をインストールしたが、 ビルドされたパッケージを別マシンにインストールすれば、 それだけでクロスコンパイル環境が構築できそうなので試してみた。
まず、toolchain をインストールしたマシンで、以下の作業を追加で行う。
libc のパッケージの作成
Debian のミラーサイトから以下のパッケージをダウンロード。
- libdb1-compat_2.1.3-7_powerpc.deb
- libc6_2.3.2.ds1-22sarge3_powerpc.deb
- libc6-dev_2.3.2.ds1-22sarge3_powerpc.deb
- linux-kernel-headers_2.5.999-test7-bk-17_powerpc.deb
PowerPC 用のパッケージをクロス開発環境用に変換。
# dpkg-cross -a powerpc -b \ > libc6_2.3.2.ds1-22sarge3_powerpc.deb \ > libc6-dev_2.3.2.ds1-22sarge3_powerpc.deb \ > libdb1-compat_2.1.3-7_powerpc.deb \ > linux-kernel-headers_2.5.999-test7-bk-17_powerpc.deb
次に、ビルドされたパッケージを別のマシンに転送し、 そのマシン上で以下の作業を行う。
binutils のインストール
以下のコマンドを実行し、binutils をインストール。
# dpkg -i binutils-powerpc-linux_2.15-5_i386.deb
libc のインストール
以下のコマンドを実行し、libc をインストール。
# dpkg -i libc6-powerpc-cross_2.3.2.ds1-22sarge3_all.deb \ > libc6-dev-powerpc-cross_2.3.2.ds1-22sarge3_all.deb \ > libdb1-compat-powerpc-cross_2.1.3-7_all.deb \ > linux-kernel-headers-powerpc-cross_2.5.999-test7-bk-17_all.deb
gcc のインストール
gcc の base パッケージをインストール。
# aptitude install gcc-3.4-base
以下のコマンドを実行し、gcc をインストール。
# dpkg -i gcc-3.4-powerpc-linux_3.4.3-1_i386.deb \ > cpp-3.4-powerpc-linux_3.4.3-1_i386.deb \ > libgcc1-powerpc-cross_3.4.3-1_all.deb
これで動作確認をしてみたところ、hello.c は問題なくコンパイルできた。 やはり、このようにクロスコンパイラのパッケージを作っておいて、 それを再利用するという形にすれば、 インストールするパッケージが最小限で済む。
2006-08-22 (火)
■ クロスコンパイル環境の構築 (4)
Debian の gcc-3.3 のソースパッケージを展開すると、 中に README.cross というドキュメントが入っている。 その文書を読んでみたところ、クロスコンパイラのビルドの手順が、 今まで苦労したのは何だったのかと思うくらい詳しく書かれていた。 toolchain-source を使うのは良くない、というのも書かれている。 クロス開発環境を構築したい人は必読かもしれない。
その文書から辿っていき、 DebianCrossCompilerHowto というページを見つけたので、このページを参考に、 クロスコンパイル用の binutils や gcc のパッケージを作成してみた。
APT の設定
/etc/apt/sources.list の以下のような deb-src の行のコメントを外す。
#deb-src http://ring.airnet.ne.jp/pub/linux/debian/debian stable main contrib non-free
パッケージのリストを更新。
# aptitude update
開発環境のインストール
binutils と gcc のビルドに必要なパッケージをインストール。
# apt-get build-dep binutils gcc-3.3
作業に必要なその他のパッケージをインストール。
# aptitude install fakeroot # aptitude install dpkg-cross
binutils のクロスパッケージの作成
binutils のソースパッケージをダウンロード。
$ apt-get source binutils
クロスパッケージのビルドに対応させるために、 Debian Bug report logs - #231707 のページから以下のパッチをダウンロード。
パッチを適用。
$ patch -p0 < binutils-cross-2.15-6.patch.20050707
binutils のクロスパッケージをビルド。
$ cd binutils-2.15 $ TARGET=powerpc-linux fakeroot debian/rules binary-cross
ビルドしたパッケージをインストール。
# dpkg -i ../binutils-powerpc-linux_2.15-6_i386.deb
libc のクロスパッケージの作成
Debian のミラーサイトから以下のパッケージをダウンロード。 一応、http://ftp.jp.debian.org/ にあるファイルにリンクしておく。
- libdb1-compat_2.1.3-7_powerpc.deb
- libc6_2.3.2.ds1-22sarge3_powerpc.deb
- libc6-dev_2.3.2.ds1-22sarge3_powerpc.deb
- linux-kernel-headers_2.5.999-test7-bk-17_powerpc.deb
PowerPC 用のパッケージをクロス開発環境用に変換。
$ dpkg-cross -a powerpc -b \ > libc6_2.3.2.ds1-22sarge3_powerpc.deb \ > libc6-dev_2.3.2.ds1-22sarge3_powerpc.deb \ > libdb1-compat_2.1.3-7_powerpc.deb \ > linux-kernel-headers_2.5.999-test7-bk-17_powerpc.deb
変換したパッケージをインストール。
# dpkg -i libc6-powerpc-cross_2.3.2.ds1-22sarge3_all.deb \ > libc6-dev-powerpc-cross_2.3.2.ds1-22sarge3_all.deb \ > libdb1-compat-powerpc-cross_2.1.3-7_all.deb \ > linux-kernel-headers-powerpc-cross_2.5.999-test7-bk-17_all.deb
gcc のクロスパッケージの作成
gcc のソースパッケージをダウンロード。
$ apt-get source gcc-3.3
gcc のクロスパッケージをビルド。
$ cd gcc-3.3-3.3.5 $ export GCC_TARGET=powerpc $ debian/rules control $ dpkg-buildpackage -us -uc -rfakeroot -b
2006-08-29 (火)
■ ダウンロード用ページを作成
ダウンロード専用ページ を作成した。 まだたいしたものは置いていないが、 今まではあちこちのページに散らばっていたファイルを一覧できるようにしたので、 少しは分かりやすくなったと思う。
2006-08-31 (木)
■ クロスコンパイル環境の構築 (5)
いままで試したクロスコンパイルの方法について書きまとめて、 以下のページを Wiki に追加した。
さらに、PowerPC 用のバイナリをビルドするための、 クロスコンパイラの deb パッケージ一式を、 ダウンロードページ に置いておいた。
しかし、動作確認のつもりでいろいろやってみて分かったが、 クロスコンパイルに対応していないソースパッケージが結構多い。 hello とか sl などの単純そうなパッケージが全然ビルドできず、 dnsmasq を試してみてようやく成功したという有り様だったりする。 linux カーネルのような大物のコンパイルは、 クロスコンパイラを活用した方が良いのだろうが、 小物のパッケージは普通にコンパイルする方が楽なのかもしれない。
