- PR -

Red Hat x86 on x86_64

1
投稿者投稿内容
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-07-30 23:09
現在Linux向けソフトウェアのインストーラを作成しています。
その中で、Red Hat Enterprise Linuxのバージョンによって、動作を変更しなければならない箇所があります。

識別する必要があるものは以下の3つだけです。
1)Red Hat Enterprise Linux 3.0 (x86)
2)Red Hat Enterprise Linux 4.0 (x86)
3)Red Hat Enterprise Linux 4.0 (x86_64)

まず3.0 or 4.0については、/etc/redhat-releaseファイルの内容を確認すればよさそうです。
コード:
(3.0)
# cat /etc/redhat-release
Red Hat Enterprise Linux ES release 3 (Taroon)

(4.0)
# cat /etc/redhat-release
Red Hat Enterprise Linux ES release 4 (Nahant Update 4)



次にx86 or x86_64については、基本的にはuname -pでOKそうなんですが、
コード:
(x86)
# uname -p
i686

(x86_64)
# uname -p
x86_64



ただし1つ心配なことがありまして、x86_64アーキテクチャのマシンに、Red Hat Enterprise Linux 4.0 (x86)がインストールされている場合はどうなるんでしょう? あり得ますよね?
"x86 on x86_64"の場合は、x86(上記の2)として識別できる必要があります。

いま実機を準備中なのですが、"x86 on x86_64"の場合の"uname -p"は"x86_64"を返すような気がするのですが、だとして、他にどのような良い方法が考えられるでしょうか?

/etc/redhat-releaseに関しては、"x86 on x86"と"x86_64 on x86_64"の区別は付かないことは確認していますので、"x86 on x86_64"も同様だと予測しています。

皆様のお知恵をお借りしたく。よろしくお願いします。
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2007-07-30 23:34
こんばんは.

確認してみたわけではありませんが,
EM64T や AMD64 で x86_64 ではなく x86 を導入した場合ですよね?

それは x86 となるのでは?
そこで表示される architecture は hardware のことではなく
kernel の architecture ではなかったかと.
NeXT
大ベテラン
会議室デビュー日: 2004/04/06
投稿数: 215
お住まい・勤務地: 江戸
投稿日時: 2007-07-31 11:38
Intel(R) Xeon(R) CPU 5160 @ 3.00GHz なマシンにインストールした x86(i386)版
Red Hat Enterprise Linux ES release 4 (Nahant Update 4)
だと

$ /bin/uname -p
i686

と表示されます。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2007-07-31 13:49
kazさん、NeXTさん、

ご回答どうもありがとうございます。
僕も色々調査してみましたが、やはりuname -pの結果は実際に使用されているCPUには依存せず、カーネルのコンパイル時に決定されているように見えますね。

man unameしたら、"uname (coreutils) 5.2.1"という表示があったので、coreutils 5.2.1のソースをダウンロードしてみました。とりあえずmakeしてuname -pを実行すると、なぜか"unknown"が返されます。
uname.cを見てみると、該当部分ではいくつかの手法がifdefで使い分けられていたので、gcc -Eでプリプロセッサだけ処理させたところ、なんと全部消えて"unknown"しか返らないようになってる!
さらに調べてみると、どうもx86系向けの実装にはそういうBug(というか制限?)があるようです。

それではRed Hatは何か修正を入れているのかと思い、改めてRed Hatからソースをダウンロードしたり、straceやってみたりしたのですが、確信はないものの、どうやらuname -mと常に同じ値を返しているような気がします。
さらに大元の値はカーネルコンパイル時に指定されるARCH変数だという情報がありました。

というわけで、やはりNeXTさんが調べていただいた通り、uname -pで期待する結果が得られるようです。(uname -mやarchも可)

ただし他のOS向けの実装を見ると、やはり本来的には実際のプロセッサタイプが返されるのが正しいように思えます。Linuxの場合も、Athlonについては/proc/cpuinfoをチェックしているみたいですし。

ご協力いただき、どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)