Восстановление из испорченной конфигурации binfmts
Все, что я пытаюсь сделать, это получить вручную моно (в /opt/mono-2.10) для запуска исполняемых файлов CLI без необходимости явно указывать интерпретатор. Вино не установлено.
Ubuntu 10.10. Моно пакет не установлен (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
не существует, и я не знаю, откуда он должен был прийти.
Поэтому я немного погуглил и нашел некоторую информацию о модуле 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. Выводы для команд, предложенных Колином:
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
, Возможно, вы это перепутали, хотя я подозреваю, что моно-пакеты были глючными, что оставляло вещи в таком состоянии. Плюс, есть запутанное пространство, запутывающее вещи.
Я бы порекомендовал сначала очистить состояние:
update-binfmts --package 'mono-runtime ' --remove cli /opt/mono-2.10/bin/mono
Затем проверьте, принадлежит ли /usr/share/binfmts/cli какому-либо пакету (dpkg -S /usr/share/binfmts/cli
- Я не думаю, что так должно быть, так как у вас не установлена моно-среда выполнения), а если нет, то удалите этот файл.
Затем установите двоичный формат правильно, как локально установленный формат, а не как принадлежащий пакету:
update-binfmts --install cli /opt/mono-2.10/bin/mono --magic MZ