Ubuntu – Recovering from messed up binfmts configuration

executable

All I'm trying to do is getting a manually installed mono (to /opt/mono-2.10) to run CLI executables without having to specify the interpreter explicitly. Wine is not installed.

Ubuntu 10.10. No mono package is currently installed (dpkg -l | grep mono gives nothing), but they were in the past before I realized that I need a much newer one, so that's probably the source of this mess.

Running a CLI executable gives me this:

Can't exec "/usr/lib/cli/binfmt-detector-cli": No such file or directory at /usr/share/binfmt-support/run-detectors line 92.

That is correct, /usr/lib/cli/binfmt-detector-cli does not exist and I don't know where it should have come from.

So I googled a bit and found some information about the binfmt_misc module. Indeed, it is loaded and I have a /proc/sys/fs/binfmt_misc/cli which contains this:

enabled
interpreter /usr/share/binfmt-support/run-detectors
flags:
offset 0
magic 4d5a

This run-detectors script is Perl, but apparently doesn't work (this is probably Debian #575776):

user@host:/$ /usr/share/binfmt-support/run-detectors
Use of uninitialized value in open at /usr/share/binfmt-support/run-detectors line 56.
Use of uninitialized value $ARGV[0] in concatenation (.) or string at /usr/share/binfmt-support/run-detectors line 56.
run-detectors: unable to open : No such file or directory

But anyway, I don't have Wine, so I don't need all that binfmt-detector-cli stuff in the first place. I just want those binaries to be hard linked with the Mono interpreter. I found this answer on SU and this blog entry, which discuss how to change these rules. Unfortunately, trying that, I always get a 'permission denied':

user@host:/$ sudo echo .:CLR:M::MZ::/opt/mono-2.10/bin/mono:. > /proc/sys/fs/binfmt_misc/register
bash: /proc/sys/fs/binfmt_misc/register: Permission denied
user@host:/$ sudo echo -1 > /proc/sys/fs/binfmt_misc/cli
bash: /proc/sys/fs/binfmt_misc/cli: Permission denied

I found /usr/share/binfmts/cli and changed it to

package mono-runtime
interpreter /opt/mono-2.10/bin/mono
magic MZ

but that seems to have no effect. Then there is /var/lib/binfmts/cli, which I changed to

mono-runtime
magic
0
MZ

/opt/mono-2.10/bin/mono

but that also has no effect. I also found the script update-binfmts but I can't get it to work. I don't even manage to remove an existing configuration. The following attempt for example leaves me with a rather cryptic error message:

user@host:/$ sudo update-binfmts --remove cli /opt/mono-2.10/bin/mono
update-binfmts: warning: current package is <local>, but binary format already
installed by mono-runtime ; not removing.

I have no idea whether my arguments were valid (the help page mentions <path> but doesn't say the path to what it wants… or why), whether the second line is supposed to be an error message and whether it changed anything in the first place.

How do I make any executable that starts with the magic string 'MZ' to be run with /opt/mono-2.10/bin/mono?


Update 1: The outputs to the commands Colin suggested:

user@host:/$ sudo update-binfmts --package mono-runtime --remove cli /opt/mono-2.10/bin/mono
update-binfmts: warning: current package is mono-runtime, but binary format
already installed by mono-runtime ; not removing.
user@host:/$ dpkg -S /usr/share/binfmts/cli
dpkg: /usr/share/binfmts/cli not found.
user@host:/$ sudo rm /usr/share/binfmts/cli*
user@host:/$ sudo update-binfmts --install cli /opt/mono-2.10/bin/mono --magic MZ
update-binfmts: warning: current package is <local>, but binary format already
installed by mono-runtime
update-binfmts: exiting due to previous errors

Best Answer

You should never edit /var/lib/binfmts/cli by hand. That's a state file for update-binfmts. You may have confused it by doing so, although I suspect the mono packages were buggy in the first place to have left things in this condition. Plus, there's a trailing space confusing matters.

I'd recommend clearing out state first:

update-binfmts --package 'mono-runtime ' --remove cli /opt/mono-2.10/bin/mono

Then check whether /usr/share/binfmts/cli is owned by any package (dpkg -S /usr/share/binfmts/cli - I don't think it should be, as you don't have mono-runtime installed), and if not then remove that file.

Then install the binary format properly, as a locally-installed format rather than one owned by a package:

update-binfmts --install cli /opt/mono-2.10/bin/mono --magic MZ

Related Question