Binfmt разное - Binfmt misc

binfmt_misc (Разный двоичный формат) - это возможность Ядро Linux что позволяет произвольно форматы исполняемых файлов быть признанным и переданным определенным пространство пользователя приложения, такие как эмуляторы и виртуальные машины.[1] Это один из множества обработчиков двоичного формата в ядре, которые участвуют в подготовке программы пользовательского пространства к запуску.[2]

Исполняемые форматы регистрируются через файловая система специального назначения binfmt_misc интерфейс файловой системы (обычно монтируется под частью / proc ). Это можно сделать либо напрямую, отправив специальные последовательности в регистр procfs или используя оболочку, например Debian -основанные дистрибутивы binfmt-support упаковка[3] или же systemd с systemd-binfmt.service.[4][5]

Постановка на учет

В регистр Файл содержит строки, которые определяют типы исполняемых файлов, которые необходимо обработать. Каждая строка имеет вид:

: имя: тип: смещение: магия: маска: интерпретатор: флаги

  • имя это имя двоичного формата.
  • тип либо E или же M
    • Если это E, формат исполняемого файла определяется его расширение имени файла: магия расширение файла, связанное с двоичным форматом; компенсировать и маска игнорируются.
    • Если это M, формат обозначается магия номер в абсолютном компенсировать (по умолчанию 0) в файле и маска это битовая маска (по умолчанию все 0x FF), указывающий, какие биты в номере значимы.
  • устный переводчик это программа, которая должна запускаться с соответствующим файлом в качестве аргумента.
  • флаги (необязательно) представляет собой строку букв, каждая из которых управляет определенным аспектом устный переводчик призыв:
    • п чтобы сохранить исходное имя программы, введенное пользователем в командной строке - путем добавления этого имени в argv; то устный переводчик должен знать об этом, чтобы он мог правильно передать этот дополнительный параметр интерпретируемой программе в качестве своего argv [0].
    • О чтобы открыть файл программы и передать его файловый дескриптор в устный переводчик чтобы он мог прочитать нечитаемый в противном случае файл (для которого у пользователя нет параметра "Читать" разрешение ).
    • C для определения новых учетных данных процесса на основе файла программы, а не устный переводчик файл (см. Setuid ); подразумевает О флаг.
    • F чтобы ядро ​​открывало двоичный файл во время настройки, а не лениво во время запуска, чтобы он был доступен внутри других пространств имен монтирования и chroot.

Каждому формату соответствует запись в файле в / proc / sys / fs / binfmt_misc каталог, который можно прочитать, чтобы получить информацию о данном формате файла.

Общее использование

binfmt_misc позволяет Ява программы для передачи непосредственно Виртуальная машина Java.[6]

Другое распространенное использование - выполнить Исполняемые файлы PE (составлено для MS-DOS или же Майкрософт Виндоус ) через Вино. Например, следующая строка запустит DOS и Windows EXE файлы (обозначенные как "MZ" код типа ) с помощью Вино:

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

Чтобы запустить EXE (.NET) файлы с Мононуклеоз:[7][8]: CLR: M :: MZ :: / usr / bin / mono:

binfmt_misc также можно комбинировать с QEMU для выполнения программ для других архитектур процессоров, как если бы они были родными двоичными файлами.[9]

binfmt_misc можно использовать для Go в качестве языка сценариев.[10]

Смотрите также

Рекомендации

  1. ^ Поддержка ядра для разных двоичных форматов (binfmt_misc) Документация ядра Linux
  2. ^ Как запускаются программы, 28 января 2015 г., Дэвид Дрисдейл, LWN.net
  3. ^ Подробная информация о пакете binfmt-support в sid, Debian
  4. ^ systemd-binfmt.service, freedesktop.org
  5. ^ binfmt.d, freedesktop.org
  6. ^ Поддержка двоичного ядра Java (tm) для Linux v1.03 Документация ядра Linux
  7. ^ Поддержка двоичного ядра Mono (tm) для Linux Документация ядра Linux
  8. ^ Руководство: Запуск моно-приложений
  9. ^ Официальное зеркало QEMU, QEMU
  10. ^ Использование Go в качестве языка сценариев в Linux, Cloudflare, 20.02.2018, получено 2019-05-05

внешняя ссылка