Detectar executável CLI ou Wine em Manjaro

0

Na minha instalação do Linux Mint, posso executar diretamente um executável PE na linha de comando e, se for um executável .NET / CLI, ele será executado automaticamente com o Mono e, caso contrário, ele será executado automaticamente com o Wine. .

Isso funciona porque binfmt está configurado para executar /usr/lib/binfmt-support/run-detectors para ambos os CLI e executáveis de vinho. Isso executa uma série de detectores configurados em /var/lib/binfmts para determinar o tipo de executável do PE e executar o comando apropriado para executá-lo.

No Manjaro, tenho binfmt , mas não tenho run-detectors . Então eu acho que o primeiro jogo em /proc/sys/fs/binfmt_misc vence, e eu acho que desde que eu instalei o Wine antes de instalar o Mono, esse é o vencedor. Essa minha suposição, de qualquer maneira. O sintoma é que sempre que executo um arquivo .exe da linha de comando, ele executa o Wine, mesmo que seja um executável .NET.

Não consigo encontrar um pacote que pareça fornecer este utilitário run-detectors . Existe algo como isso nos repositórios padrão ou da comunidade, ou há alguma outra maneira comum de configurar isso no mundo do Arch?

    
por P Daddy 10.06.2018 / 18:44

1 resposta

0

Ainda estou esperando por uma resposta melhor de alguém que conheça uma maneira mais idiomática de realizar isso, mas caso não haja uma, para o benefício dos futuros googlers, aqui está o que fiz para obtê-la trabalhando por enquanto:

Na minha instalação do Linux Mint, copiei /usr/lib/cli/binfmt-detector-cli . Este arquivo é fornecido pelo pacote Ubuntu mono-runtime . Eu não gosto de pegar um executável de outra distro, mas deve ser um executável razoavelmente simples que não dependa de muito que possa diferir entre distros diferentes, desde que sejam a mesma plataforma.

Este é um comando simples que testa se um arquivo é um executável da CLI, retornando 0 ou 1 na saída para indicar sim ou não.

A instalação do My Manjaro não tem o diretório /usr/lib/cli , então copiei esse arquivo diretamente para /usr/bin/ . Em seguida, um escreveu um script de shell curto e salvou-o como /usr/bin/binfmt-mono-wine :

#!/bin/bash

if /usr/bin/binfmt-detector-cli "$1"; then
    mono "$@"
else
    wine "$@"
fi

Em seguida, editei /usr/lib/binfmt.d/mono.conf , alterando

:CLR:M::MZ::/usr/bin/mono:

para

:CLR:M::MZ::/usr/bin/binfmt-mono-wine:

e /usr/lib/binfmt.d/wine.conf , mudando

:DOSWin:M::MZ::/usr/bin/wine:

para

:DOSWin:M::MZ::/usr/bin/binfmt-mono-wine:

Você pode ver que ambos os formatos agora são manipulados pelo shell script, que usa o detector emprestado do Ubuntu para determinar qual comando iniciar.

Em seguida, tive de cancelar o registro dos antigos manipuladores e registrar os novos. Descobri que o systemd tem um serviço que faz isso:

sudo /usr/lib/systemd/systemd-binfmt mono.conf
sudo /usr/lib/systemd/systemd-binfmt wine.conf

A última coisa a fazer é registrar um gancho pacman para que futuros upgrades para mono e wine não substituam minhas alterações para suas configurações binfmt. Eu criei /etc/pacman.d/hooks/binfmt-mono-wine.hook com estes conteúdos:

[Trigger]
Operation = Install
Operation = Upgrade
Type = File
Target = usr/lib/binfmt.d/mono.conf
Target = usr/lib/binfmt.d/wine.conf

[Action]
When = PostTransaction
Description = Updating binfmt configuration to use binfmt-mono-wine to differentiate between mono and wine executables
Exec = /usr/bin/xargs -I{} /usr/bin/sed -Ei 's_:/usr/bin/(mono|wine):_:/usr/bin/binfmt-mono-wine:_' /{}
NeedsTargets
    
por 11.06.2018 / 06:51