binfmt_miscでCLRバイナリを直接起動

make menuconfigでもう一件、今度は"Kernel support for MISC binaries"について。

Excecutable file formats ->
    Kernel support for MISC binaries

今までMISCバイナリってのはELFとかCOFFみたいな特定のバイナリだと思って無視していたのですが、ちょっと面白そうだったので調べてみました。
これはbinfmt_miscと呼ばれる機能で、えーと、簡単に言うと・・・今まで「mono ./hoge.exe」と書いていたのが「./hoge.exe」だけで実行できるようになります。すごい。
本日の参考ページ
2007-07-14
JF: Linux Kernel 3.x/2.6 Documentation: mono.txt
ところでCLRバイナリはWindowsのプログラムに包まれているので、ネイティブのWin32アプリケーションと区別ができないらしく、MonoとWineとうまく使い分けてねーというのは面倒とのこと。でもWine使うことよりMono使うことの方が圧倒的に多いので(特にコンソールでは)今回はMono一本でいきます。
まずは登録スクリプト

# Add binfmt_misc entries
if [ -e /proc/sys/fs/binfmt_misc/register ]; then
       echo ':CLR:M::MZ::/usr/bin/mono:' > /proc/sys/fs/binfmt_misc/register
else
       echo "No binfmt_misc support"
       exit 1
fi

次に登録解除スクリプト。(/etc/init.d/local restartが使いたかったので)

# Remove binfmt_misc entries
if [ -e /proc/sys/fs/binfmt_misc/CLR ]; then
       echo -1 > /proc/sys/fs/binfmt_misc/CLR
fi

この二つを/etc/local.d/*.startと/etc/local.d/*.stopに書いてできあがり。localを再起動して、目的のバイナリに実行属性つけて、あとは実行するのみ。
これでC#で書いたTwitterクライアントがコンソールで使いやすくなる・・・っ!