В попередній статті я частково вже зачепив тему binfmts.
Що це за приблуда, що це за звір такий?
update-binfmts — maintain registry of executable binary formats
Тобто в Debian (та й інших дистрибутивах Linux) ми можемо запускати бінарні файли на виконання, навіть якщо це не ELF. Просто для цього треба навчити Linux їх запускати.
Для початку можна подивитися на вже встановлені зв'язки. Виглядатиме це приблизно так:
$ sudo update-binfmts --display cli (enabled): package = mono-runtime type = magic offset = 0 magic = MZ mask = interpreter = /usr/bin/cli detector = /usr/lib/cli/binfmt-detector-cli jar (enabled): package = oracle-java16 type = magic offset = 0 magic = PK\x03\x04 mask = interpreter = /usr/lib/jvm/java-16-oracle/lib/jexec detector = python2.7 (enabled): package = python2.7 type = magic offset = 0 magic = \x03\xf3\x0d\x0a mask = interpreter = /usr/bin/python2.7 detector = python3.9 (enabled): package = python3.9 type = magic offset = 0 magic = \x61\x0d\x0d\x0a mask = interpreter = /usr/bin/python3.9 detector =
Як бачимо то тут встановлено зв'язки для бінарних (скопмільованих) форматів - cli (exe), jar, python 2.7 та 3.9.
Якщо раптом закортить додати запуск exe (MZ) не через wine то достатньо просто додати наступну конфігурацію:
$ sudo update-binfmts --package wine --install wine /usr/bin/wine --magic 'MZ'
Дивимося:
$ sudo update-binfmts --display cli (enabled): package = mono-runtime type = magic offset = 0 magic = MZ mask = interpreter = /usr/bin/cli detector = /usr/lib/cli/binfmt-detector-cli jar (enabled): package = oracle-java16 type = magic offset = 0 magic = PK\x03\x04 mask = interpreter = /usr/lib/jvm/java-16-oracle/lib/jexec detector = python2.7 (enabled): package = python2.7 type = magic offset = 0 magic = \x03\xf3\x0d\x0a mask = interpreter = /usr/bin/python2.7 detector = python3.9 (enabled): package = python3.9 type = magic offset = 0 magic = \x61\x0d\x0d\x0a mask = interpreter = /usr/bin/python3.9 detector = wine (enabled): package = wine type = magic offset = 0 magic = MZ mask = interpreter = /usr/bin/wine detector =
Все, після цього можна "прозоро" запускати exe-файли через wine. Наприклад:
$ chmod +x ./winbox-3.40.exe $ ./winbox-3.40.exe
Якщо ж хочеться встановити коректне відображення кодування CP1251 то можна виконати запуск наступним чином:
$ LANG=ru_RU.cp1251 luit winbox.exe
Видалити конфігурацію binfmts так само легко як і встановити:
$ sudo update-binfmts --package wine --remove wine /usr/bin/wine
Ось така магія ;)