2012年04月17日

ベンチマーク測定に Debian/Ubuntu の lmbench/3.0-a9-1 を使用する場合の注意点

最初の報告から1ヶ月経ったけどまだ何の反応も無いので、犠牲者をこれ以上増やさないようにするために、先に周知します。

lmbench パッケージには、プログラム実行に要する遅延時間を測定する lat_proc というプログラムが入っていますが、 Debian/Ubuntu の lmbench-3.0-a9 をパッケージでインストールした場合には正しい結果が得られません。

これは、存在しない /var/tmp/lmbench/hello というプログラムを lat_proc が実行しようとするため、 execve() が失敗してしまうことが原因です。(失敗してもエラーメッセージ1つ出さないという作りはどうかと思いますが。(汗))

TOMOYO で解析すると、 sh -c を実行しているのに hello プログラムのためのドメインが作成されていないことが確認できます。

   43:  0     /usr/lib/lmbench/bin/i686-pc-linux-gnu/lmbench
   44:  0         /bin/cp
   45:  0         /bin/date
   46:  0         /bin/hostname
   47:  0         /bin/mkdir
   48:  0         /bin/mount
   49:  0         /bin/netstat
   50:  0         /bin/rm
   51:  0         /bin/sleep
   52:  0         /bin/sync
   53:  0         /bin/tar
   54:  0         /bin/uname
   55:  0         /sbin/ifconfig
   56:  0         /usr/bin/awk
   57:  0         /usr/bin/expr
   58:  0         /usr/bin/touch
   59:  0         /usr/bin/uptime
   60:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/bw_file_rd
   61:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/bw_mem
   62:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/bw_mmap_rd
   63:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/bw_pipe
   64:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/bw_tcp
   65:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/bw_unix
   66:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_connect
   67:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_ctx
   68:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_fs
   69:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_http
   70:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_mmap
   71:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_pagefault
   72:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_pipe
   73:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_proc
   74:  0             /bin/sh
                          *** ↑ hello プログラムのドメインが存在しない ***
   75:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_rpc
   76:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_select
   77:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_sig
   78:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_syscall
   79:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_tcp
   80:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_udp
   81:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lat_unix
   82:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lmdd
   83:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/lmhttp
   84:  0         /usr/lib/lmbench/bin/i686-pc-linux-gnu/msleep
   85:  0         /usr/lib/lmbench/scripts/os

lmbench-3.0-a9.tgz から作成すると正しい結果が得られていることが判ります。

  182:  0     /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lmbench
  183:  0         /bin/cp
  184:  0         /bin/date
  185:  0         /bin/hostname
  186:  0         /bin/mkdir
  187:  0         /bin/mount
  188:  0         /bin/netstat
  189:  0         /bin/rm
  190:  0         /bin/sleep
  191:  0         /bin/sync
  192:  0         /bin/tar
  193:  0         /bin/uname
  194:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/bw_file_rd
  195:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/bw_mem
  196:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/bw_mmap_rd
  197:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/bw_pipe
  198:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/bw_tcp
  199:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/bw_unix
  200:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_connect
  201:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_ctx
  202:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_fs
  203:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_http
  204:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_mmap
  205:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_pagefault
  206:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_pipe
  207:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_proc
  208:  0             /bin/sh
  209:  0                 /tmp/hello
                          *** ↑ hello プログラムのドメインが作られている ***
  210:  0             /tmp/hello
  211:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_rpc
  212:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_select
  213:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_sig
  214:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_syscall
  215:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_tcp
  216:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_udp
  217:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lat_unix
  218:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lmdd
  219:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/lmhttp
  220:  0         /root/lmbench-3.0-a9/bin/i686-pc-linux-gnu/msleep
  221:  0         /sbin/ifconfig
  222:  0         /usr/bin/awk
  223:  0         /usr/bin/expr
  224:  0         /usr/bin/touch
  225:  0         /usr/bin/uptime

ということで、 lmbench/3.0-a9-1 を使う場合、事前に hello プログラムを /var/tmp/lmbench/hello にコピーするか、あるいは、 lmbench-3.0-a9.tgz からコンパイルしたものを使用するようにしてください。(これ以外にも不具合があるかもしれないので、修正が完了するまでは lmbench-3.0-a9.tgz からコンパイルする方がおススメです。)

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=666072

posted by 熊猫さくら at 20:29| Comment(0) | TrackBack(0) | Linux

2012年03月11日

Linux に Adobe Flash Plugin をインストールした後に確認すべきこと

Adobe Flash Plugin は rpm などの形式でインストールできますが、単にインストールしただけではブラウザから認識してくれないようです。しかも、最新版をインストールした後も Firefox が「安全のために最新版ではない Flash を無効化したよ( For your safety, Firefox has disabled your outdated version of Flash. )」なんて表示してくるものですから、「認識しているけど使っていない」のだと誤解するでしょう。

mozilla.png

Firefox から認識できるようにするには、最新版をインストールした後に、以下のようにシンボリックリンクを張る必要があります。

# ln -s /usr/lib/flash-plugin/libflashplayer.so /usr/lib/mozilla/plugins-wrapped/
posted by 熊猫さくら at 20:27| Comment(0) | TrackBack(0) | Linux

2012年03月08日

RHEL6.2 カーネルと sendmmsg() システムコール

ちょうどDNSを使った隠れ通信ネタが出たので、熊猫からも1つ。

RHEL6.2 カーネルには、 Linux 3.0 で導入された sendmmsg() システムコールがバックポートされています。これを使うと、1回のシステムコールで複数の宛先に送信できるので、1個目のパケットだけでなく2個目以降のパケットについても宛先チェックをしないと、不審なホストとの隠れ通信に利用されてしまいます。

Linux 3.0.0 のリリース直後に sendmmsg() システムコールが追加されていることに気付き、ソースコードをチェックしてみたところ、LSMによるチェックは1個目のパケットの送信時だけしか行われていませんでした。そのため、「はぅ〜、1個目の宛先しかチェックできないのでは、 AKARI による送信先アドレスチェックが不完全なものになってしまうよ〜」とガッカリしました。当時、 TOMOYO 2.x にネットワークに対する送受信アドレスチェック機能を追加することも目指していたため、せっかくのパフォーマンス向上分を減少させてしまう仕様変更をどうやって提案しようかと悩みました。でも、幸いなことに、 SMACK が既に宛先アドレスから算出されるラベルに基づくアクセス制御を搭載していたため、 TOMOYO のための仕様変更パッチとしてではなく SMACK のためのリグレッション修正パッチとして提案することができました。

そうして Linux 3.0.2 で熊猫が提案したリグレッション修正パッチが取り込まれたのですが、そのパッチには別のバグがありました。そのバグを修正するパッチは Linux 3.0.5 で取り込まれました。

そんな中、 RHEL 6.2 のカーネル 2.6.32-220.el6 がリリースされた訳ですが、熊猫のリグレッション修正パッチだけしか含まれていなかったので、「熊猫のリグレッション修正パッチのバグを修正するパッチを忘れてるよ」と報告したところ、 CVE-2011-4594 として登録されてしまいました。何か対応が大げさな気がしないでもない。(^^;

で、その修正パッチを含んだカーネル 2.6.32-220.7.1.el6 がリリースされたことを今日知りました。

ところで、熊猫が提案したリグレッション修正パッチ、 SELinux しか有効にする気が無い RedHat 系カーネルにとっては、実はバックポートする必要性はありませんでした。なぜなら、 SELinux では宛先アドレスに基づくアクセス制御をしていないからです。情報フロー制御は気にするのに、 sendmmsg() システムコールを使って不審なホストのDNSサービスとの隠れ通信をすることは気にしないとはこれ如何に?

posted by 熊猫さくら at 20:25| Comment(0) | TrackBack(0) | Linux

2011年10月24日

Linux 3.1 がリリースされました。

kernel.org が復旧して tar ball をダウンロードできるようになりましたが、署名のチェック方法が従来とは異なっているようです。

今までは圧縮されたファイル毎に署名ファイルがあったので、例えば linux-3.0.tar.bz2 に対する署名ファイルは linux-3.0.tar.bz2.sign という名前で配布されていました。そのため、チェックするには、 linux-3.0.tar.bz2 と linux-3.0.tar.bz2.sign を同じディレクトリに置き、

$ gpg --verify linux-3.0.tar.bz2.sign
gpg: Signature made Fri Jul 22 12:31:02 2011 JST using DSA key ID 517D0F0E
gpg: Good signature from "Linux Kernel Archives Verification Key <ftpadmin@kernel.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: C75D C40A 11D7 AF88 9981 ED5B C86B A06A 517D 0F0E

のように実行していました。しかし、 https://lkml.org/lkml/2011/10/23/122 によると、これからは圧縮前のファイルに対する署名ファイルのみの配布となるため、例えば linux-3.1.tar.bz2 に対する署名ファイルは linux-3.0.tar.sign のようになります。チェックするには、 linux-3.1.tar.bz2 と linux-3.1.tar.sign を同じディレクトリに置き、

$ bzcat linux-3.1.tar.bz2 | gpg --verify linux-3.1.tar.sign -
gpg: Signature made Mon Oct 24 16:17:58 2011 JST using RSA key ID 00411886
gpg: Good signature from "Linus Torvalds <torvalds@linux-foundation.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: ABAF 11C6 5A29 70B1 30AB E3C4 79BE 3E43 0041 1886

のように実行します。署名に使われている鍵もアップデートされているので、忘れないでくださいね。

posted by 熊猫さくら at 22:05| Comment(0) | TrackBack(0) | Linux

2011年05月31日

衝撃: openSUSE のカメレオンはカメレオンではないらしい

とあるひとから、 TOMOYO を SUSE カーネルで有効になるようにしたいという要望を受け、過去のスレッドを探すために TOMOYO SUSE で検索していたら、↓なページを発見しました。

どのマスコットがお好き?−@IT

それによると、 openSUSE のマスコットキャラクターである Geeko くんは、カメレオンではなくヤモリなのだそうです。また、みなさんが良くご存じの Geeko くんは日本版なのだそうで、欧州版の Geeko くんはなんだか「恐竜かよ!?」って突っ込みたくなる顔のようです。

Linus さんが Linux 2.6 系は 2.6.39 で終わりにして、 Linux 3 系を 3.0 から始めることを決断した模様です。ペンギンさんから新しいマスコットキャラクターに交代するのかなぁ?

posted by 熊猫さくら at 21:14| Comment(0) | TrackBack(0) | Linux

2011年05月11日

お遊び: gzip ファイルのハッシュ値を選ぶ

以前、お遊び: tar ball のハッシュ値を選ぶでファイルを作成した時刻により md5sum の値が変化するというのを紹介しましたが、調査の結果、 gzip ファイルのヘッダ部分に埋め込まれている MTIME 部分が変化していることが原因であることが判明しました。

ということで、この MTIME 部分の値を書き換えれば、好きな md5sum 値を簡単に取得できるわけです。
TOMOYO Linux の tarball は、「配布用かテスト用か」および「最後までダウンロードされたかどうか」を簡単に見分けられるようにするために、以下のようなプログラムを用いて md5sum 値の先頭4桁が同じになるように選んでいます。(熊猫が作成した tarball かどうかの確認には、ファイル名の末尾に .asc を付与したファイルもダウンロードして、 gpg で確認してください。)

/* gcc this_file.c -lssl */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/md5.h>

static void mkfile(const char *dir, const char *cmdline, const char *outfile)
{
	unsigned char *buf = NULL;
	unsigned long buflen = 0;
	time_t *mtime;
	FILE *fp;
	if (chdir(dir)) {
		fprintf(stderr, "Can't change directory.\n");
		return;
	}
	fp = popen(cmdline, "r");
	if (!fp) {
		fprintf(stderr, "Can't read gzipped data.\n");
		return;
	}
	while (1) {
		int len;
		buf = realloc(buf, buflen + 1048576);
		if (!buf) {
			fprintf(stderr, "Can't allocate memory.\n");
			pclose(fp);
			return;
		}
		len = fread(buf + buflen, 1, 1048576, fp);
		if (len == 0)
			break;
		buflen += len;
	}
	pclose(fp);
	if (buflen < 8 || buf[0] != 0x1f || buf[1] != 0x8b) {
		fprintf(stderr, "Invalid gzipped data.\n");
		return;
	}
	fp = fopen(outfile, "w");
	if (!fp) {
		fprintf(stderr, "Invalid gzipped data.\n");
		return;
	}
	mtime = (time_t *) (buf + 4);
	while (1) {
		const unsigned char *md5 = MD5(buf, buflen, NULL);
		unsigned char c[4] = { md5[0] >> 4, md5[0] & 0xF,
				       md5[1] >> 4, md5[1] & 0xF };
		printf("%02x%02x%02x%02x%02x%02x%02x%02x"
		       "%02x%02x%02x%02x%02x%02x%02x%02x\n",
		       md5[0], md5[1], md5[2], md5[3],	md5[4], md5[5],
		       md5[6], md5[7], md5[8], md5[9], md5[10], md5[11],
		       md5[12], md5[13], md5[14], md5[15]);
		if (c[0] == c[1] && c[1] == c[2] && c[2] == c[3])
			break;
		(*mtime)++;
	}
	if (fwrite(buf, 1, buflen, fp) != buflen || fclose(fp)) {
		fprintf(stderr, "Can't write.\n");
		unlink(outfile);
	}
}

int main(int argc, char *argv[]) {
	mkfile("ソースのディレクトリ", "tar -zcf - --exclude .svn -- *", "出力ファイル");
	return 0;
}

先頭8桁が同じになるまでループさせるとか言って電力を浪費するの禁止!

posted by 熊猫さくら at 21:00| Comment(0) | TrackBack(0) | Linux

2011年01月21日

configure スクリプトの -static オプションチェックについて

configure スクリプト中で、 gcc が -static オプションをサポートしているかどうかをチェックする箇所があるかと思います。

checking if gcc static flag -static works... no

ところが、そのチェックを行うために使われる「エラーになる筈がない」と思われていた簡単なプログラムが、最近の Fedora や RHEL6 ではエラーになるのです。

$ echo 'int main(){return(0);}' | gcc -Wall -static -x c -
/usr/bin/ld: cannot find -lc
collect2: ld returned 1 exit status

これは、開発用パッケージである glibc-devel の中にスタティックリンクライブラリである /usr/lib/libc.a が含まれていないことが原因です。このエラーを解決するには、 glibc-static というパッケージを別途インストールする必要があります。

# yum install glibc-static

ダイナミックリンクライブラリだけしかインストールされない開発用パッケージが他にも存在しており、スタティックリンクライブラリを使いたい場合には開発用パッケージをソースパッケージから再コンパイルしなければいけないという、面倒な状況になってきているようです。

posted by 熊猫さくら at 23:57| Comment(0) | TrackBack(0) | Linux

2010年05月15日

CentOS 5 で squashfs イメージファイルの作成を高速化する

CentOS 5.5 がリリースされましたので、 TOMOYO の LiveCD を更新中です。

CentOS 5 に付属の squashfs-tools 3.0 に含まれている mksquashfs コマンドは、 CentOS 5 のカーネルがサポートしている squashfs 3.0 形式のイメージファイルを作成できますが、複数CPUを用いた並列処理はサポートしていません。それに対し、 squashfs-tools 3.4 に含まれている mksquashfs コマンドは、複数CPUを用いた並列処理をサポートしていますが、 squashfs 3.1 形式のイメージファイルを作成してしまうため CentOS 5 のカーネルでは使えません。

なんとかならないものかと思って mksquashfs のソースコードを見たところ、ブロックサイズが64KB以下で、スパースファイルをサポートしないようにコマンドラインオプションで指定してやれば squashfs 3.0 形式のイメージファイルを作成できることが判明しました。つまり、 squashfs-tools 3.4 ( https://projects.centos.org/trac/livecd/browser/trunk/i386/RPMS/squashfs-tools-3.4-1.i386.rpm?rev=54 )をインストールして、 mksquashfs コマンドの実行時に -b 65536 -no-sparse -no-exports -no-recovery を追加してやれば、複数のCPUを用いた並列処理という美味しいところだけをいただくことができます。

posted by 熊猫さくら at 19:18| Comment(0) | TrackBack(0) | Linux

2009年04月02日

SIGCLD と SIGCHLD

http://en.wikipedia.org/wiki/SIGCHLD によると、 SIGCLD ではなく SIGCHLD を使うのが正しいそうだ。

ccs-tools-1.6.7-20090401.tar.gz の中の ccs-editpolicy-agent.c で SIGCLD を使ってしまったため、某クロスコンパイル環境ではコンパイルエラーとなってしまった。はぅ〜。

posted by 熊猫さくら at 21:37| Comment(0) | TrackBack(0) | Linux

2008年12月15日

さくらと TOMOYO と _Bool の罠

ccs-patch-1.6.5-20081111.tar.gz にはアクセスログがメモリを浪費してしまうというバグが残っていました。
1.6.5 の開発中に ccs_can_save_audit_log() という関数の戻り値を int (上限に達していない場合には 0 を、達している場合には -ENOMEM を返す)から _Bool (上限に達していない場合には true を、達している場合には false を返す)に変更したのですが、その関数の呼び出し元の条件判断を if (ccs_can_save_audit_log(r->domain, is_granted) < 0) から if (!ccs_can_save_audit_log(r->domain, is_granted)) に変更するのを忘れてしまったのがバグの原因です。

_Bool 型は 0 と 1 しかとらないのですから、 _Bool 型の値が 0 より小さいかどうかを判断したら、常に「偽」となります。でしたら、コンパイラが warning: comparison is always false due to limited range of data type という警告を表示してくれるのではないでしょうか?

そこで、以下のようなプログラムを様々なディストリビューションで gcc -Wall でコンパイルしてみました。

$ cat test.c
static _Bool foo(void) {
        return 0;
}

int main(int argc, char *argv[]) {
        if (foo() < 0)
                return 1;
        return 0;
}
$ gcc -Wall test.c
test.c: In function `main':
test.c:6: warning: comparison is always false due to limited range of data type

以下に結果を示します。( gcc のバージョンは熊猫の環境でのものです。)

Distributiongcc --versionWarning printed?
RedHat Linux 9gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5) Yes
Fedora Core 3 gcc (GCC) 3.4.4 20050721 (Red Hat 3.4.4-2) No
Fedora Core 4 gcc (GCC) 4.0.2 20051125 (Red Hat 4.0.2-8) No
Fedora Core 5 gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51) No
Fedora Core 6 gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-13) No
Fedora 7 gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27) No
Fedora 8 gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-33) No
Fedora 9 gcc (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8) No
Fedora 10 gcc (GCC) 4.3.2 20081105 (Red Hat 4.3.2-7) No
CentOS 3.9 gcc (GCC) 3.2.3 20030502 (Red Hat Linux 3.2.3-59) Yes
CentOS 4.7 gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-10) No
CentOS 5.2 gcc (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42) No
openSUSE 10.1 gcc (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux) No
openSUSE 10.2 gcc (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux) No
openSUSE 10.3 gcc (GCC) 4.2.1 (SUSE Linux) No
openSUSE 11.0 gcc (SUSE Linux) 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036]No
openSUSE 11.1 gcc (SUSE Linux) 4.3.2 [gcc-4_3-branch revision 141291] No
VineLinux 4.2 gcc (GCC) 3.3.6 release (Vine Linux 3.3.6-0vl7) No
Asianux 2 gcc (GCC) 3.4.6 20060404 (Asianux 2.0 3.4.6-8.1) No
Asianux 3 gcc (GCC) 4.1.1 20070105 (Asianux 3.0 4.1.1-52.2.1) No
Debian Sarge gcc (GCC) 3.3.5 (Debian 1:3.3.5-13) No
Debian Etch gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) No
Debian Lenny gcc (Debian 4.3.2-1) 4.3.2 No
Ubuntu 6.06 gcc (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)                   No
Ubuntu 6.10 gcc (GCC) 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5) No
Ubuntu 7.04 gcc (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu4) No
Ubuntu 7.10 gcc (GCC) 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2) No
Ubuntu 8.04 gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3) No
Ubuntu 8.10 gcc (Ubuntu 4.3.2-1ubuntu11) 4.3.2 No
Gentoo gcc (GCC) 4.1.2 (Gentoo 4.1.2 p1.0.2) No

どうやら、 gcc 3.2 以前では warning: comparison is always false due to limited range of data type という警告をしてくれるのに対し、 gcc 3.3 以降ではしてくれないようです。
熊猫が TOMOYO Linux の開発環境として使っている Debian Sarge は 3.3.5 ということで表示してくれませんでした。(泣)

普通は新しいほど高機能になって様々な警告を出してくれるものですが、 _Bool 型との大小比較に関しては逆なんですね。

posted by 熊猫さくら at 20:35| Comment(0) | TrackBack(0) | Linux

2008年11月16日

お遊び: tar ball のハッシュ値を選ぶ

tar -zcf コマンドを使って作成する tar ball は、 tar ball を作成した時刻によりハッシュ値が変化するという性質があるようです。そのため、毎回異なるハッシュ値が生成されます。

つまり、以下のように1秒ごとに tar -zcf コマンドを実行することで、お気に入りのハッシュ値を持った tar ball を生成できるということになります。

cd /dev/
while :
do
  tar -zcf /tmp/tarball.tar.gz -- null
  md5sum /tmp/tarball.tar.gz
  sleep 1
done

ちなみに、最近の TOMOYO Linux の tar ball は以下のように先頭の2桁が同じになるように選んでいます。「先頭の2桁が同じ」だけなら5分程度で手に入れることができるでしょう。

  • ccs-patch-1.5.5-20080903.tar.gz 221a692261848cf48148fabe5c797b43
  • ccs-patch-1.5.5-20081111.tar.gz 774e86e9dd1f5e442e3b72ebee281c4e
  • ccs-patch-1.6.3-20080715.tar.gz 777a49f3ce667fe918da96c1e72a9a4b
  • ccs-patch-1.6.4-20080903.tar.gz 55826ddf4c587adc31e274ac192dc34b
  • ccs-patch-1.6.5-20081111.tar.gz bb0dd502eb08a93c9567e26acdb449b3
  • ccs-tools-1.5.5-20080903.tar.gz 0025aae4012ec6edfecd342c2a04b84a
  • ccs-tools-1.6.3-20080715.tar.gz 007ac307e40548123ed94f21881358b7
  • ccs-tools-1.6.4-20080903.tar.gz aa768cb704ed52598b23bcd2449259a6
  • ccs-tools-1.6.5-20081111.tar.gz ff1a7f1536a45cfbeeea99231c853466
posted by 熊猫さくら at 11:40| Comment(0) | TrackBack(0) | Linux

2008年05月18日

複数 CPU を VMware ゲストに割り当てた場合の動作について

複数の CPU を VMware ゲストに割り当てている場合、システムがハングアップするという問題で悩んでいる方がいるかと思います。
これは、クロックソースとして使われている tsc に問題があり、タイマーを使う処理が正常に行われていなかったのが原因かもしれません。
詳細は http://bugzilla.kernel.org/show_bug.cgi?id=9834 および http://marc.info/?l=linux-kernel&m=121062853005859&w=2 にあります。

この問題はカーネル 2.6.26-rc1 にて修正されています。ディストリビュータカーネルに修正パッチが適用されるまでの回避策としてはカーネル起動時のオプションに clocksource=acpi_pm または clocksource=jiffies を指定することで、クロックソースとして tsc を使わせないようにする方法があります。

posted by 熊猫さくら at 15:55| Comment(0) | TrackBack(0) | Linux

2007年12月03日

CentOS 5.1 の Samba の共有名の謎

CentOS 5.1 が出たのでアップデートしたら SELinux とは無関係なところで Samba が引っかかりました。

# rpm -q samba
samba-3.0.25b-1.el5_1.2

共有名が ftproot のように特定の共有名の場合にアクセスができません。
ftp123 とか ftproute のようにすれば回避できるようです。

/var/log/messages を見ると

smbd[4032]: [2007/12/03 11:53:54, 0] smbd/service.c:make_connection(1191)
smbd[4032]: tomoyo (xxx.xxx.xxx.xxx) couldn't find service ftproo

・・・なぜか共有名の最後の文字が欠落しています。

Linux からアクセスしたり、 Windows からでも FQDN または IP アドレスで指定してアクセスする分には大丈夫なようなので、 Windows XP SP2 側の問題かもしれませんね。(でも CentOS 5 から CentOS 5.1 にアップグレードするまで発生しなかったのは不思議です。)

OK
OK
OK
# mount //HOSTNAME/ftproot /mnt/
# mount //HOSTNAME.DOMAINNAME/ftproot /mnt/
# mount //IPADDRESS/ftproot /mnt/
OK
OK
NG
NET USE \\IPADDRESS\ftproot
NET USE \\HOSTNAME.DOMAINNAME\ftproot
NET USE \\HOSTNAME\ftproot

−−−12/4 追記−−−

「NET USE \\IPADDRESS\root」で NG のケースが見つかりました。現象としては同じく共有名の最後の文字が切り落とされて roo となります。

また、 Linux 2.6.8 カーネルからアクセスしたところ、マウントは成功したものの、ディレクトリエントリの一覧を取得しようとするとコネクションが切れてしまうという現象が発生しました。

まだ切り分けができていませんが、これから RHEL 5.1 や CentOS 5.1 にアップデートする方はご注意ください。

posted by 熊猫さくら at 12:54| Comment(0) | TrackBack(0) | Linux

2007年11月18日

quilt でパッチを投稿する方法

quilt コマンドにはパッチを投稿してくれる機能があります。

quilt コマンドを実行するホスト上で sendmail などの smtp サービスが稼働している必要があります。
エディタを使って /etc/mail/sendmail.mc を開き、スマートホストの設定をします。
http://fedorasrv.com/op25b.shtml が参考になると思います。

define(`SMART_HOST', `メールサーバの名前またはIPアドレス')

保存してからエディタを終了し、 sendmail を再起動させると /etc/mail/sendmail.cf が更新されます。

service sendmail restart

試しに自分宛てにメールを送ってみましょう。

echo hello | mail 自分のメールアドレス

SMART HOST の設定を間違えると、メールを送信しても届きません。少し待っても届かない場合は mailq コマンドで確認してみましょう。

# mailq
                /var/spool/mqueue (1 request)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
lBIBHJIE144259        6 Sat Nov 17 21:26 
                 (Deferred: Name server: mfgw2.ocn.ad.jp.: host name lookup fa)
                                         <自分のメールアドレス>
                Total requests: 1

上記は、 SMART_HOST に smtp.xxxx.ocn.ne.jp のように指定するべきところを xxxx.ocn.ne.jp としてしまった場合の例です。

# mailq
/var/spool/mqueue is empty
                Total requests: 0

正しく指定できていれば、上記のようにキューの内容はすぐに空っぽになります。

無事にメールが届くことを確認したら、 quilt がパッチを適用する順番を定義している series ファイルのあるディレクトリに移動します。

動作を確認するために、一度自分宛てにメールを送ってみましょう。

quilt mail --send --sender 差出人のアドレス --to 宛先(TO)のアドレス --cc 宛先(CC)のアドレス --prefix "一連のメールに付けるプレフィックス" --subject "最初のメールのサブジェクト"

上記のように実行すると、エディタが起動します。

最初のメール本文の内容を書いたら保存してエディタを終了します。すると、最初のメールが投稿されるのに加えて、 series ファイルに含まれているパッチが最初のメールにぶらさがる形で作成されて投稿されます。

投稿が終わったら転送されたかどうかを mailq コマンドで確認しましょう。大量のメールを一度に送ろうとした場合、一回の送信操作では全部のメールが外部のサーバに転送されるとは限りません。

もしキューに残っているようならば、数分待ってから

# sendmail -q

を実行します。これをキューが空になるまで行います。

例えば、 http://lkml.org/lkml/2007/11/16/155 から始まる一連の投稿は

quilt mail --send --sender 私のアドレス --to 宛先1 --cc 宛先2 --cc 宛先3 --prefix "TOMOYO #5" --subject "TOMOYO Linux - MAC based on process invocation history."

のように実行した結果です。 --from "私の名前 <私のアドレス>" も指定しておくべきでしたね。

posted by 熊猫さくら at 20:12| Comment(0) | TrackBack(0) | Linux

2007年10月25日

ライブ CD 上で Apache を動作させる場合の注意点について

Ubuntu のようにライブ CD で動作可能な Linux の場合、一定( 256 バイト?)以上のサイズの静的ファイルを Apache が読み出せないという不具合に遭遇することがあります。例えば、

It worked.

という動作テスト用の index.html は表示されるのに、普通の index.html は表示されないなどです。

これは、ファイルシステムが sendfile システムコールをサポートしていないことが原因の可能性があります。

Apache の設定ファイルで以下の項目を設定してください。

EnableSendfile Off

http://ids-nile.engr.colostate.edu/manual/ja/mod/core.html#enablesendfile

https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/95393

posted by 熊猫さくら at 21:46| Comment(0) | TrackBack(0) | Linux

Ubuntu に Java をインストールする場合の注意点について

Ubuntu で Sun の Java パッケージ( sun-java6-bin sun-java6-jre )をインストールする場合には、 インストールの前にダミーのシンボリックリンクを作成しないと正常にインストールできない場合があります。

sudo ln -s / /cow

strace java をすれば判りますが、 /usr/lib/jvm/ というパス名を検索すべきなのに何故か /cow/usr/lib/jvm/ というパス名を検索してしまうため、

Error: could not find libjava.so
Error: could not find Java 2 Runtime Environment.

というエラーで終了してしまうのです。

http://ubuntuforums.org/archive/index.php/t-323117.html

posted by 熊猫さくら at 21:36| Comment(0) | TrackBack(0) | Linux

alien で armadillo-9 用の deb パッケージを作成する方法について

rpm ファイルと deb ファイルの相互変換を行ってくれる便利な alien コマンドですが、たまに自動変換に失敗するケースがあるようです。

armadillo9:/usr/src/rpm/RPMS/armv4tl# alien -k ccs-tools-1.5.1-1.armv4tl.rpm
Package build failed. Here's the log:
dh_testdir
dh_testdir
dh_testroot
dh_clean -k -d
dh_installdirs
dh_installdocs
dh_installchangelogs
find . -maxdepth 1 -mindepth 1 -not -name debian -print0 | \
        xargs -0 -r -i cp -a {} debian/ccs-tools
dh_compress
dh_makeshlibs
dh_installdeb
dh_shlibdeps
dh_gencontrol
dpkg-gencontrol: error: current build architecture arm does not appear in package's list (armv4tl)
dh_gencontrol: command returned error code 65280
make: *** [binary-arch] Error 1
find: ccs-tools-1.5.1: No such file or directory

rpmbuild により作成された rpm では armv4tl として扱われているのに対し、 alien で deb に変換しようとすると armv4tl ではなく arm として扱おうとするため、問題になるようです。
そんな時は、 debian/rules ファイルをちょっと修正してやると動くようです。

# cd ccs-tools-1.5.1
# emacs debian/rules
BeforeAfter
-dh_shlibdeps
dh_gencontrol
-dh_shlibdeps
sed -i -e 's:armv4tl:arm:' -- debian/control
dh_gencontrol

編集したら手動で debian/rules を実行します。

# debian/rules binary-arch
posted by 熊猫さくら at 21:27| Comment(0) | TrackBack(0) | Linux

2007年10月06日

VMware Player で ISO イメージファイルを切り替える方法について

OSのインストール中にCDの交換を求められる場合があると思います。
実際にCDに焼いてからインストールする場合はそのままCDを交換すればいいのですが、 ISOイメージファイルのままインストールする場合には仮想マシンの設定ファイルを編集しなければいけません。

VMware Workstation の場合には、仮想マシンが起動中であってもCDのアイコンをクリックすることで プロパティ編集画面が表示されるため、使用するISOイメージファイルを変更することができます。

しかし、 VMware Player の場合には、プロパティ編集画面を表示するインタフェースが無いため、 仮想マシンが起動中に使用するISOイメージファイルを変更することができません。

でも、 VMware Player の場合には、ウィンドウ右上の x ボタンを押すことで仮想マシンをサスペンド状態に することができます。そのため、以下のような順序でプロパティを変更することで、ISOイメージファイルを切り替えることができます。

(1)仮想マシン内でCDがアンマウントされたのを確認する。

(2)ウィンドウ上部の「CD-ROM (IDE 1:0)」というアイコンをクリックして切断する。

(3)ウィンドウ右上の「 x 」というアイコンをクリックして VMware Player をサスペンドする。

(4)テキストエディタで .vmx ファイルを編集する。

ide1:0.deviceType = "cdrom-image"
ide1:0.fileName = "Asianux-30-ia32-disc1-200708291645.iso"
 ↓
ide1:0.deviceType = "cdrom-image"
ide1:0.fileName = "Asianux-30-ia32-disc2-200708291645.iso"

(5).vmx ファイルをクリックして VMware Player を再開する。

(6)「CD-ROM (IDE 1:0)」というアイコンをクリックして再接続する。

(7)仮想マシン内でCDがマウントされたのを確認する。

posted by 熊猫さくら at 13:58| Comment(0) | TrackBack(0) | Linux

2007年09月18日

シリアルコンソールを使ってカーネルのログを取得する方法について

カーネルの起動時には大量のメッセージが表示されるので、 読みたいと思っても読むのが追いつかないことがよくあります。 そんな時は、コンソールの出力をシリアルにも出力すると便利です。 VMware を使えば、シリアルへの出力をファイルに保存することができます。

VMware の設定ファイル(*.vmx)に以下の内容を追加します。 serial0.fileName の部分は適当に変えてください。

serial0.present = "TRUE"
serial0.fileType = "file"
serial0.fileName = "/tmp/serial.txt"

GRUB のコマンドラインに以下の内容を追加してから起動してください。

console=tty0 console=ttyS0,9600n8

/sbin/mingetty や /sbin/getty などは /dev/tty1 〜 /dev/tty6 等を使うため、コンソールからログインした後の操作はシリアルには出力されませんが、コマンドの出力を /dev/ttyS0 にリダイレクトしてやることでシリアルに出力することができます。

カーネルのコンパイルが終わったら echo "Kernel Compile Done" > /dev/ttyS0 みたいな処理が実行されるようにすれば、 http://kumaneko-sakura.sblo.jp/article/4957514.html でサスペンドしてよい状態になったことをホストに通知するための手段としても使えますね。

http://arika.org/diary/20070626 が参考になると思います。

posted by 熊猫さくら at 20:28| Comment(2) | TrackBack(0) | Linux

2007年09月06日

SuSE のパッケージアップデートが遅い場合の対処法について

OpenSuSE 10.1 や 10.2 ではパッケージのアップデートをチェックするために novell-zmd というサービスが稼動しています。しかし、データベースが壊れると novell-zmd から起動される parse-metadata というプロセスが長時間(数十分〜数時間)にわたってCPU使用率100%という状況に陥ってしまいます。データベースが壊れていなければ数分以内に終わる処理なので、いつまで待ってもCPU使用率が下がらない状況が生じている場合には以下の操作を試してみると良いと思います。

service novell-zmd stop
rm -f /var/lib/zmd/zmd.db /var/lib/zmd/zmd.db-journal
service novell-zmd start

詳しくは https://bugzilla.novell.com/show_bug.cgi?id=255871 を参照してください。

その他に、効果のほどは不明ですが、

rug set max-downloads 5
rug set http-timeout 30

というチューニングができるようです。

posted by 熊猫さくら at 21:01| Comment(0) | TrackBack(0) | Linux