binfmt_misc
binfmt_misc ( разный двоичный формат ) — это возможность ядра Linux произвольные форматы исполняемых файлов , которая позволяет распознавать и передавать их в определенные приложения пользовательского пространства , такие как эмуляторы и виртуальные машины . [1] Это один из множества обработчиков двоичного формата в ядре, которые участвуют в подготовке программы пользовательского пространства к запуску. [2]
Исполняемые форматы регистрируются через файловую систему специального назначения. binfmt_misc
интерфейс файловой системы (обычно монтируется в часть /proc ). Это делается либо напрямую путем отправки специальных последовательностей в register
procfs или с помощью оболочки, такой как Debian. для дистрибутивов на основе поддержки binfmt пакет [3] или systemd systemd-binfmt.service
. [4] [5]
Регистрация
[ редактировать ]The register
файл содержит строки, которые определяют типы исполняемых файлов, которые необходимо обрабатывать. Каждая строка имеет вид:
:name:type:offset:magic:mask:interpreter:flags
name
это имя двоичного формата.type
либоE
илиM
- Если это
E
формат исполняемого файла определяется расширением имени файла :magic
расширение файла, которое должно быть связано с двоичным форматом;offset
иmask
игнорируются. - Если это
M
, формат определяетсяmagic
число в абсолютном выраженииoffset
(по умолчанию0
) в файле иmask
это битовая маска (по умолчанию для всех0xFF
), указывающий, какие биты в числе являются значимыми.
- Если это
interpreter
— это программа, которую нужно запустить с соответствующим файлом в качестве аргумента.flags
(необязательно) — это строка букв, каждая из которых управляет определенным аспектомinterpreter
вызов:P
сохранить исходное имя программы, введенное пользователем в командной строке — добавив это имя вargv
; тотinterpreter
должен знать об этом, чтобы правильно передать этот дополнительный параметр интерпретируемой программе в качестве своегоargv[0]
.O
открыть файл программы и передать его файловый дескриптор вinterpreter
чтобы он мог прочитать файл, который иначе не был бы прочитан (для которого у пользователя нет разрешения «Чтение» ).C
для определения новых учетных данных процесса на основе файла программы, а неinterpreter
файл (см . setuid ); подразумеваетO
флаг.F
чтобы ядро открывало двоичный файл во время конфигурации, а не лениво во время запуска, чтобы он был доступен и внутри других пространств имен монтирования и chroot.
Каждому формату соответствует соответствующая запись файла в /proc/sys/fs/binfmt_misc
каталог, который можно прочитать, чтобы получить информацию о данном формате файла.
Снятие с регистрации
[ редактировать ]$ echo -1 >/proc/sys/fs/binfmt_misc/status # all entries
$ echo -1 >/proc/sys/fs/binfmt_misc/qemu-xtensa # single entry
Общее использование
[ редактировать ]- binfmt_misc позволяет Java передавать программы непосредственно на виртуальную машину Java . [6]
- binfmt_misc позволяет идентифицировать исполняемые файлы PE с помощью магического числа «MZ». Примеры:
:DOSWin:M::MZ::/usr/bin/wine:
передаст все такие файлы в Wine (предполагая, что это обычный исполняемый файл MS-DOS или Microsoft Windows ):CLR:M::MZ::/usr/bin/mono:
передаст такие файлы в Mono (предполагая, что это исполняемые файлы .NET ) [7] [8]- от Microsoft WSL1 использует binfmt, чтобы разрешить вызов программ Windows из Linux. Линия эквивалентна
:WSLInterOP:M::MZ::/init:P
.
- binfmt_misc также можно комбинировать с QEMU или Box86 для выполнения программ для других процессорных архитектур, как если бы они были собственными двоичными файлами. [9]
- binfmt можно использовать для превращения некоторых компилируемых языков, таких как Go, в языки сценариев, действуя в качестве замены строки shebang . [10]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Поддержка ядра для разных двоичных форматов (binfmt_misc). Документация по ядру Linux.
- ↑ Как запускаются программы , 28 января 2015 г., Дэвид Дрисдейл, LWN.net
- ^ Подробности о пакете поддержки binfmt в sid , Debian
- ^ systemd-binfmt.service , freedesktop.org
- ^ binfmt.d , freedesktop.org
- ^ Поддержка двоичного ядра Java (tm) для Linux v1.03 Документация по ядру Linux
- ^ Поддержка двоичного ядра Mono(tm) для Linux Документация по ядру Linux
- ^ Руководство: Запуск моно-приложений
- ^ Официальное зеркало QEMU , QEMU, 23 ноября 2022 г.
- ^ Использование Go в качестве языка сценариев в Linux , Cloudflare, 20 февраля 2018 г. , получено 5 мая 2019 г.
Внешние ссылки
[ редактировать ]- Домашняя страница проекта. Архивировано на archive.org.