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ではまたちょっと違った方法で判定するというトリビアを得られました。