从混乱的 binfmts 配置中恢复

从混乱的 binfmts 配置中恢复

我所做的就是手动安装 mono(到 /opt/mono-2.10)来运行 CLI 可执行文件,而无需明确指定解释器。Wine 是不是已安装。

Ubuntu 10.10。目前没有安装 mono 包(dpkg -l | grep mono没有任何效果),但在我意识到我需要一个更新的包之前,它们已经存在了,所以这可能是造成这种混乱的根源。

运行 CLI 可执行文件得到以下结果:

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

这是正确的,但/usr/lib/cli/binfmt-detector-cli它并不存在,而且我不知道它应该从哪里来。

所以我在 Google 上搜索了一下,找到了一些有关 binfmt_misc 模块的信息。事实上,它已加载,并且我有一个/proc/sys/fs/binfmt_misc/cli包含以下内容的文件:

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

这个run-detectors脚本是 Perl 的,但显然不起作用(这可能是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

但无论如何,我没有 Wine,所以我首先不需要所有 binfmt-detector-cli 东西。我只希望这些二进制文件与 Mono 解释器硬链接。我发现SU 上的这个答案这篇博文,其中讨论了如何更改这些规则。不幸的是,尝试这样做时,我总是得到“权限被拒绝”:

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

我找到/usr/share/binfmts/cli并改成了

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

但似乎没有效果。然后是/var/lib/binfmts/cli,我将其改为

mono-runtime
magic
0
MZ

/opt/mono-2.10/bin/mono

但这也不起作用。我也找到了脚本update-binfmts,但无法让它工作。我甚至无法删除现有配置。例如,以下尝试给我留下了一个相当神秘的错误消息:

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.

我不知道我的论点是否有效(帮助页面提到<path>但没有说明它想要的路径......或为什么),第二行是否应该是一条错误消息,以及它是否首先改变了任何东西。

如何使任何以魔术字符串“MZ”开头的可执行文件能够运行/opt/mono-2.10/bin/mono


更新 1:Colin 建议的命令的输出:

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

答案1

您永远不应该手动编辑/var/lib/binfmts/cli。这是 的状态文件update-binfmts。您可能因此而混淆了它,尽管我怀疑 mono 包一开始就有错误,才会让事情处于这种状态。另外,结尾处有一个空格,这让人感到困惑。

我建议先清除状态:

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

然后检查 /usr/share/binfmts/cli 是否由任何包拥有(dpkg -S /usr/share/binfmts/cli-我不认为应该如此,因为您没有安装 mono-runtime),如果不是,则删除该文件。

然后正确安装二进制格式,作为本地安装的格式而不是包拥有的格式:

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

相关内容