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

2007年08月10日

VMware 上の Fedora Core 6 で 2.6.22 カーネルを使う場合の注意点について

カーネル 2.6.21 以降では VMware 仮想マシンのハードディスクドライバとして使用されている lsilogic によるエミュレーションが正常に動作しないため、ハードディスクを認識することができず、システムを起動することができません。カーネル 2.6.21 や 2.6.22 を使う場合には、仮想マシンの設定ファイル(*.vmx)を開いて lsilogic を buslogic に変更してください。

scsi0.virtualDev = "lsilogic"
 ↓
scsi0.virtualDev = "buslogic"

起動時に Do you want VMware Workstation to change the adapter type for scsi0:0 disk? と質問された場合、 Yes と答えます。

Fedora 7 のインストーラでは 2.6.21 カーネルが使われているので、インストール前に上記の変更を行う必要があります。

Fedora Core 6 でも昨日 2.6.20-1.2962.fc6 から 2.6.22.1-32.fc6 にアップデートされたので、再起動したら起動できないという上記の問題に遭遇します。
以下は、私が行った対処法です。

yum -y update で 2.6.22.1-32.fc6 カーネルをインストールします。

2.6.20-1.2962.fc6 で起動している間に /etc/modprobe.conf を開いて scsi_hostadapter を BusLogic に変更します。

alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptspi
 ↓
alias scsi_hostadapter BusLogic

2.6.22.1-32.fc6 カーネル用の initrd を作り直します。これで、 initrd に BusLogic ドライバが含まれるようになります。

mkinitrd -f /boot/initrd-2.6.22.1-32.fc6.img 2.6.22.1-32.fc6

シャットダウンします。

poweroff

仮想マシンの設定ファイルを開いて lsilogic を buslogic に変更します。

scsi0.virtualDev = "lsilogic"
 ↓
scsi0.virtualDev = "buslogic"

仮想 CPU を1個しか割り当てていないシステムではこれで動くはずです。

私の環境( ThinkPad X60 )では仮想 CPU を2個割り当てています。その場合、ハードディスクの認識前に処理が先に進んでしまい、 kernel panic になるため起動できませんでした。

何故かカーネルのコマンドラインで nosmp を指定しても効果がありません。そのため、仮想マシンの設定ファイルを開いて仮想 CPU を1個にしました。

numvcpus = "2"
 ↓
numvcpus = "1"

これでとりあえず起動できました。ログインして、ハードディスクを認識させるためのスリープ処理を加えるために initrd を修正します。

mkdir /tmp/initrd
cd /tmp/initrd
zcat /boot/initrd-2.6.22.1-32.fc6.img | cpio -id

init を開いて BusLogic.ko をロードした後に sleep 10 を挿入します。

insmod /lib/BusLogic.ko
mkblkdevs
 ↓
insmod /lib/BusLogic.ko
sleep 10
mkblkdevs

念のため別名で initrd を作成します。

find . -print0 | cpio -o0 -H newc | gzip -9 > /boot/initrd-2.6.22.1-32sleep.fc6.img

シャットダウンします。

poweroff

仮想マシンの設定ファイルを開いて仮想 CPU を2個に戻します。

numvcpus = "1"
 ↓
numvcpus = "2"

grub の画面では /boot/initrd-2.6.22.1-32.fc6.img の代わりに /boot/initrd-2.6.22.1-32sleep.fc6.img を指定してください。

これで起動できると思います。起動できたら、 /boot/initrd-2.6.22.1-32sleep.fc6.img を /boot/initrd-2.6.22.1-32.fc6.img にリネームしてください。

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

2007年08月08日

CentOS5 での libXtst.so.6

VMware WorkStation 6 を CentOS 5 にインストールしたら、 /usr/bin/vmware-config.pl の実行時に libXtst.so.6 が見つからないという警告が出ました。

http://rpmfind.net/linux/rpm2html/search.php?query=libXtst.so.6 を探しても見つかりません。他のディストリから持ってくるしかないかな〜と思いかけていたところ、正解を http://www.mokonamodoki.com/vmware-server-on-centos-5 で見つけました。

yum -y install libXtst
posted by 熊猫さくら at 21:55| Comment(0) | TrackBack(1) | Linux

GUI を使わずに VMware を操作する方法について

VMware 5.5 以降では vmrun というコマンドが使えるようになっています。これを使うと、コンソールや ssh セッションから仮想マシンの起動/停止などを操作することができます。

コンソールや ssh セッションのように DISPLAY 環境変数が設定されていない場合には予め設定しておく必要があります。

export DISPLAY=:0.0

仮想マシンを起動するには以下のように実行します。

vmrun start /path/to/vmx_file

仮想マシンをサスペンドするには以下のように実行します。

vmrun suspend /path/to/vmx_file

http://kumaneko-sakura.sblo.jp/article/3659845.html では GRUB のデフォルトエントリを power off に設定することでシャットダウンする方法を紹介しましたが、上記のように vmrun で操作する場合にはデフォルトエントリを power off に設定してはいけません。

http://kumaneko-sakura.sblo.jp/article/3392253.html ではバッチ処理のために複数のゲストを順番に実行する方法について紹介しましたが、 power off できなくても vmrun コマンドを用いてサスペンドできるので問題ないことが判りました。
あとは、ゲストでのバッチ処理が終わってサスペンドしてよい状態になったことをどうやってホストに通知するかですね。ホスト側で top を実行して低負荷状態が数分継続したらゲストをサスペンドさせるという方法でも十分なのかもしれません。

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

2007年07月16日

ssh の環境変数を渡す機能を利用した不正ログイン対策について

ssh プロトコルバージョン2では、必要に応じて環境変数を渡すことができるようになっています。幾つかの環境変数はセキュリティ上の問題を引き起こす可能性があるため、デフォルトでは環境変数を受け付けないようになっています。
しかし、例えば以下のように設定すると、 CERBERUS_MAGIC という環境変数を受け渡せるようになります。

# echo AcceptEnv CERBERUS_MAGIC >> /etc/ssh/sshd_config
# echo SendEnv CERBERUS_MAGIC >> /etc/ssh/ssh_config
# service sshd restart
# export CERBERUS_MAGIC="Konyanyachiwala"
# ssh localhost
Last login: Mon Jul 16 19:45:22 2007 from xxx.xxx.xxx.xxx
# echo $CERBERUS_MAGIC
Konyanyachiwala

環境変数という形で任意の追加情報を渡せるということは、ケロちゃんチェックで使うこともできるということを意味しています。例えばログインシェルを

#! /bin/sh
if [ "$CERBERUS_MAGIC" != "Konyanyachiwala" ]
then
    echo "You don't have permission to login."
    exit 1
fi
unset CERBERUS_MAGIC
exec /bin/bash "$@"

のようにして使うこともできるわけです。
上記のようなログインシェルの場合、クライアントは

# export CERBERUS_MAGIC="Konyanyachiwala"
# ssh nonrootuser@example.com

のように予め環境変数を設定してからアクセスする必要があります。そのため、上記のログインシェルが設定されたアカウントは ssh ログイン専用となります。(環境変数が設定されないのでコンソールログインには使えないのです。)
間違えて root ユーザに上記のログインシェルを設定すると痛い目にあいますよ。(笑)

scp や sftp の場合には、1バイト目から scp や sftp プロトコルのデータがやり取りされることを前提としており、サーバとクライアントが同期している必要があるため、ケロちゃんチェックを行うことが困難です。
しかし、環境変数という形を使えば、標準入出力を使うことなくクライアント側からサーバ側にケロちゃんチェックに対応していることを伝達することができます。環境変数の内容は、非対話的な操作による認証を行うためのユーザ認証用データとして使っても、対話的な操作による認証を行う際の scp や sftp プロトコルのデータの始まりを示すためのプリアンブルとして使っても構いません。

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

2007年06月22日

ThinkPad X60 の無線LANドライバ(続)

http://kumaneko-sakura.sblo.jp/article/4236061.html の続きです。

アクセスポイントを借りることができたので、やっと接続できるところまで確認できました。

yum -y install kernel-devel
tar -zxf madwifi-ng-r2488-20070620.tar.gz
cd madwifi-ng-r2488-20070620
make -s
make -s install

再起動すると kudzu により自動的に /etc/modprobe.conf の修正と ifcfg-ath0 の作成が行われます。

Fedora 7 では最初から /etc/sysconfig/network-scripts/ifcfg-ath0 という名前で作成されました。

CentOS 5 では /etc/sysconfig/network-scripts/ifcfg-ath0 ではなく /etc/sysconfig/network-scripts/ifcfg-wifi0 という名前で作成されてしまいますので、 /etc/sysconfig/network-scripts/ifcfg-wifi0 をテキストエディタで開いて DEVICE=wifi0 を DEVICE=ath0 に書き換えてください。

CentOS 5 ではカーネルに対して nosmp を指定して起動しないと、 ifup ath0 を試みた後に iwlist ap を実行してもアクセスポイントが表示されませんでした。

Fedora 7 では、カーネルに対して nosmp を指定しないとHDDを認識できないため起動できませんでした。( Fedora 7 のインストール時に引っかかるので注意してください。)

WPA の設定ファイル( /etc/wpa_supplicant/wpa_supplicant.conf )は、以下のようになっています。

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

network={
  ssid="アクセスポイントのSSID"
  scan_ssid=1
  key_mgmt=WPA-PSK
  psk="アクセスポイントに設定している事前共有鍵"
}

wpa_supplicant -Bw -D madwifi -i ath0 -c /etc/wpa_supplicant/wpa_supplicant.conf を実行してから ifup ath0 を実行します。
wpa_supplicant の実行を忘れると ifup ath0 が失敗します。
wpa_supplicant はデーモンとして動作するので、終了させたい場合は killall wpa_supplicant を実行します。

これで、オタワではワタワタしないで済むといいなぁ。

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