Solaris10ではCPUアーキテクチャ名がコマンドになっている?
岩手県立大学とか、岩手の人たち Advent Calendar 1日目の記事です。 今日はSolaris10環境で提供されている(されていた?)謎のコマンドを紹介しようと思います。 (ただし我々の世界とは時間軸が完全に一致していない可能性があります...)
昨年の岩手県立大学 Advent Calendar 2020の記事でも話題に出しているように、学内のソフトウェア演習ではSolaris10が使用されています(繰り返しますが時間軸が異なっている可能性があります…)。
そんなSolaris10環境をあれこれいじっていると、シェル上で謎のコマンド名が補完されました。
$ mc mc68000 mc68010 mc68020 mc68030 mc68040 mconnect mcs
CPUアーキテクチャ名がコマンドになっている?
mc68000といえば、モトローラが開発したCPU(モトローラ的には「MPU(マイクロプロセッシングユニット)」と呼ぶようですね)です。このコマンドは何をするものなのでしょうか?
他にもCPUアーキテクチャ名がコマンドになっているものがいくつかあります。しかも他のCPUアーキテクチャに関しても同様にコマンドが提供されています。
$ file `which mc68000` `which sparc` `which pdp11` `which vax` `which i386` /bin/mc68000: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped /bin/sparc: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped /bin/pdp11: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped /bin/vax: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped /bin/i386: ELF 32-bit LSB executable 80386 Version 1, dynamically linked, stripped
加えて、iノード番号が同じであり、ファイル的には全て同じものとなっています。
$ ls -li `which mc68000` `which sparc` `which pdp11` `which vax` `which i386` 339 -r-xr-xr-x 29 root bin 5708 Jan 23 2005 /bin/i386* 339 -r-xr-xr-x 29 root bin 5708 Jan 23 2005 /bin/mc68000* 339 -r-xr-xr-x 29 root bin 5708 Jan 23 2005 /bin/pdp11* 339 -r-xr-xr-x 29 root bin 5708 Jan 23 2005 /bin/sparc* 339 -r-xr-xr-x 29 root bin 5708 Jan 23 2005 /bin/vax*
実行しても何かが起こるわけでもなく、単に終了コード 255
を返すだけです。
てっきり特定のCPUアーキテクチャのエミュレーション実行ツールか、あるいはバイナリ変換ツールかなと思っていたのですが、そうではなさそうです。
$ mc68000 ; echo $? 255
machid(1)コマンド
これら一連のコマンドが何であるかは、(当たり前ですが)ずばりmanページに記載されていました。
Solaris10が稼働しているマシンの命令セットと(コマンド名が)一致する場合に真(終了コード 0
)を返すコマンドとなっています。
$ man sparc User Commands machid(1) ... NAME machid, sun, iAPX286, i286, i386, i486, i860, pdp11, sparc, u3b, u3b2, u3b5, u3b15, vax, u370 - get processor type truth value ... DESCRIPTION The following commands will return a true value (exit code of 0) if you are using an instruction set that the command name indicates.
たしかに、マシンの命令セットと同じコマンドが真を返しています。
$ uname -a SunOS unknown 5.10 Generic_120012-14 i86pc i386 i86pc $ $ for cmd in i386 mc68000 pdp11 sparc vax ; do echo $cmd ; $cmd ; echo $? ; done | paste - - i386 0 mc68000 255 pdp11 255 sparc 255 vax 255
なるほど、これで疑問が解けてスッキリしました。Sun Microsystemsなのに何故か(?)Oracleのホームページでmachid(1)のマニュアルが参照できます。 が、マニュアルには以下の注意書きがあり、どうやら今回紹介した一連のコマンドはすでに非推奨のようです…。
machid コマンドファミリは廃止されており、Oracle Solaris の将来のリリースで削除される可能性があります。 代わりに uname -p を指定してください。
個人的には uname -p
としても、 if [
uname -p= 'i386' ]; then ...
のような少し冗長な感じになりそうなので、単に i386
コマンド等の方がシンプルにも思えるのではありますが…。
まとめ
Solaris10で提供されていた、CPUアーキテクチャ名と同じという謎のコマンド群を紹介しました。BSD系やLinuxでは uname -p
でマシン種別を判定したりしますが、歴史のあるUNIXではまたちょっと違った方法で判定するというトリビアを得られました。