池田@福山市です。 長文で失礼します m(__)m 次の 3 つの部分からなります。 1. apt のソース (マシンタイプ判別方法調査結果 -- 未保証 --) 2. カーネルのソース (末尾に参考 URL つき -- 遊べるかも --) 3. その他 (言い訳 -- 結局なにも成果なし --) From: "K.Iwamoto" <burns@xxxxxxxxxxxxxxxx> Date: Sun, 02 May 2004 17:11:11 +0900 Message-ID: <20040502170414.01CC.BURNS@xxxxxxxxxxxxxxxx> > > On Sun, 02 May 2004 12:59:42 +0900 > shinonon <shinonon@xxxxxxxxxxxxxxx> wrote: > > > uname -m の結果が i686 なのが原因だと思っているのですが、apt-get だけで > > カーネルアップグレードができるように、後から uname -m の結果を i586 に変 > > 更することは出来るんでしょうか? > > uname -mを参照することが確かならaptでアップグレードするとき一時的 > にでもunemeをリネームするなどして新たに自作のunameスクリプトに置 > き換えればいいんじゃないでしょうか? 1. apt のソース とりあえず apt のソースをとってきました。 $ rpm -qf `which apt-get` apt-0.3.19.cnc.55-11vl7 $ apt-get source apt それでざざっとソースを調べてみると、次のような部分を発見しました。 [ apt-0.3.19cnc55/apt-pkg/rpm/rpmfactory.cc ] | if (uname(&un) < 0) { | thisArch = baseArch; | } else { | thisArch = un.machine; | } システムコール uname で thisArch を決定しているようです。 ここを書き換えれば、とりあえず i586 と思い込んでいる apt とか 一応できそうな気がしますが、あまりしない方が良いでしょうね。 そもそもこの解釈が正しいという自信もありません m(__)m 同じような感じでコマンド uname のソースも見てみました。 やはりシステムコール uname を呼んでいました。 2. カーネルのソース それではとシステムコール uname の方を見てみると、ざっと 次のような感じでした。 [ linux-2.4.22/kernel/sys.c ] | asmlinkage long sys_newuname(struct new_utsname * name) | { | int errno = 0; | | down_read(&uts_sem); | if (copy_to_user(name,&system_utsname,sizeof *name)) | errno = -EFAULT; | up_read(&uts_sem); | return errno; | } [ linux-2.4.22/include/linux/utsname.h ] | struct new_utsname { | char sysname[65]; | char nodename[65]; | char release[65]; | char version[65]; | char machine[65]; | char domainname[65]; | }; | | extern struct new_utsname system_utsname; [ linux-2.4.22/init/version.c ] | struct new_utsname system_utsname = { | UTS_SYSNAME, UTS_NODENAME, UTS_RELEASE, UTS_VERSION, | UTS_MACHINE, UTS_DOMAINNAME | }; [ linux-2.4.22/include/linux/uts.h ] | /* | * Defines for what uname() should return | */ (中略) | #ifndef UTS_MACHINE | #define UTS_MACHINE "unknown" | #endif [ linux-2.4.22/kernel/ksyms.c ] | EXPORT_SYMBOL(system_utsname); /* UTS data */ | EXPORT_SYMBOL(uts_sem); /* UTS semaphore */ UTS のデータとセマフォがエクスポートされているので、 一応コマンドラインで確認しました。 $ /sbin/ksyms -a | egrep '(uts_sem|system_utsname)' c02f4f80 system_utsname c02f7264 uts_sem デバイスドライバを作成して、i586 と i686 を切替えるコマンドを 用意するという方法もありそうな感じです。 そういうわけで system_utsname で見当をつけて調べてみたところ、 デバイスドライバで system_utsname をいじるとコードとして linux-kernel に投稿されたものがあるようです。 http://marc.theaimsgroup.com/?l=linux-kernel&m=107601008715631&w=2 3. その他 そもそも何で i686 に認識されるのだろうという部分は、一応 bootsect.S から始めてソースは追ってみたのですが、時間切れ のためおあずけです。 # 時間があってもダメだったと思います。 パッケージの方も見てみようということで kernel-2.4.spec を ながめたところで時間切れとなりました。 # これも時間があってもダメだったと思います。 以上、何かのきっかけ、あるいはポインタにでもなれば幸いです。 # 優先順位の高い別の作業から逃避しているような気がする……。 -- 池田 克巳 <ikedak@xxxxxxxxxxxxxxxx> <http://www013.upp.so-net.ne.jp/ikeda/index.html> GnuPG Fingerprint = 69BC 8241 0485 389E AA50 E795 7A32 D184 75CE EB0F