요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
Registration fields
binfmt-misc.rst:22-55Name, type, offset, magic, mask, interpreter와 flags 형식을 정의합니다.
Invocation flags
binfmt-misc.rst:56-92argv, open fd, credential과 namespace-resistant emulator 처리 flag를 설명합니다.
Limits and ordering
binfmt-misc.rst:93-111문자 수·magic 위치 limit, boot mount와 newest-first matching을 설명합니다.
Examples and control
binfmt-misc.rst:112-151Em86·DOS·Wine 등록과 enable/disable/remove 및 PATH 보안 규칙을 제공합니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
Kernel Support for miscellaneous Binary Formats (binfmt_misc)
=============================================================
This Kernel feature allows you to invoke almost (for restrictions see below)
every program by simply typing its name in the shell.
This includes for example compiled Java(TM), Python or Emacs programs.
To achieve this you must tell binfmt_misc which interpreter has to be invoked
with which binary. Binfmt_misc recognises the binary-type by matching some bytes
at the beginning of the file with a magic byte sequence (masking out specified
bits) you have supplied. Binfmt_misc can also recognise a filename extension
aka ``.com`` or ``.exe``.
First you must mount binfmt_misc::
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
To actually register a new binary type, you have to set up a string looking like
``:name:type:offset:magic:mask:interpreter:flags`` (where you can choose the
``:`` upon your needs) and echo it to ``/proc/sys/fs/binfmt_misc/register``.
Here is what the fields mean:
- ``name``
is an identifier string. A new /proc file will be created with this
name below ``/proc/sys/fs/binfmt_misc``; cannot contain slashes ``/`` for
obvious reasons.
- ``type``
is the type of recognition. Give ``M`` for magic and ``E`` for extension.
- ``offset``
is the offset of the magic/mask in the file, counted in bytes. This
defaults to 0 if you omit it (i.e. you write ``:name:type::magic...``).
Ignored when using filename extension matching.
- ``magic``
is the byte sequence binfmt_misc is matching for. The magic string
may contain hex-encoded characters like ``\x0a`` or ``\xA4``. Note that you
must escape any NUL bytes; parsing halts at the first one. In a shell
environment you might have to write ``\\x0a`` to prevent the shell from
eating your ``\``.
If you chose filename extension matching, this is the extension to be
recognised (without the ``.``, the ``\x0a`` specials are not allowed).
Extension matching is case sensitive, and slashes ``/`` are not allowed!
- ``mask``
is an (optional, defaults to all 0xff) mask. You can mask out some
bits from matching by supplying a string like magic and as long as magic.
The mask is anded with the byte sequence of the file. Note that you must
escape any NUL bytes; parsing halts at the first one. Ignored when using
filename extension matching.
- ``interpreter``
is the program that should be invoked with the binary as first
argument (specify the full path)
- ``flags``
is an optional field that controls several aspects of the invocation
of the interpreter. It is a string of capital letters, each controls a
certain aspect. The following flags are supported:
``P`` - preserve-argv[0]
Legacy behavior of binfmt_misc is to overwrite
the original argv[0] with the full path to the binary. When this
flag is included, binfmt_misc will add an argument to the argument
vector for this purpose, thus preserving the original ``argv[0]``.
e.g. If your interp is set to ``/bin/foo`` and you run ``blah``
(which is in ``/usr/local/bin``), then the kernel will execute
``/bin/foo`` with ``argv[]`` set to ``["/bin/foo", "/usr/local/bin/blah", "blah"]``. The interp has to be aware of this so it can
execute ``/usr/local/bin/blah``
with ``argv[]`` set to ``["blah"]``.
``O`` - open-binary
Legacy behavior of binfmt_misc is to pass the full path
of the binary to the interpreter as an argument. When this flag is
included, binfmt_misc will open the file for reading and pass its
descriptor as an argument, instead of the full path, thus allowing
the interpreter to execute non-readable binaries. This feature
should be used with care - the interpreter has to be trusted not to
emit the contents of the non-readable binary.
``C`` - credentials
Currently, the behavior of binfmt_misc is to calculate
the credentials and security token of the new process according to
the interpreter. When this flag is included, these attributes are
calculated according to the binary. It also implies the ``O`` flag.
This feature should be used with care as the interpreter
will run with root permissions when a setuid binary owned by root
is run with binfmt_misc.
``F`` - fix binary
The usual behaviour of binfmt_misc is to spawn the
binary lazily when the misc format file is invoked. However,
this doesn't work very well in the face of mount namespaces and
changeroots, so the ``F`` mode opens the binary as soon as the
emulation is installed and uses the opened image to spawn the
emulator, meaning it is always available once installed,
regardless of how the environment changes.
There are some restrictions:
- the whole register string may not exceed 1920 characters
- the magic must reside in the first 128 bytes of the file, i.e.
offset+size(magic) has to be less than 128
- the interpreter string may not exceed 127 characters
To use binfmt_misc you have to mount it first. You can mount it with
``mount -t binfmt_misc none /proc/sys/fs/binfmt_misc`` command, or you can add
a line ``none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0`` to your
``/etc/fstab`` so it auto mounts on boot.
You may want to add the binary formats in one of your ``/etc/rc`` scripts during
boot-up. Read the manual of your init program to figure out how to do this
right.
Think about the order of adding entries! Later added entries are matched first!
A few examples (assumed you are in ``/proc/sys/fs/binfmt_misc``):
- enable support for em86 (like binfmt_em86, for Alpha AXP only)::
echo ':i386:M::\x7fELF\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff:/bin/em86:' > register
echo ':i486:M::\x7fELF\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff:/bin/em86:' > register
- enable support for packed DOS applications (pre-configured dosemu hdimages)::
echo ':DEXE:M::\x0eDEX::/usr/bin/dosexec:' > register
- enable support for Windows executables using wine::
echo ':DOSWin:M::MZ::/usr/local/bin/wine:' > register
For java support see Documentation/admin-guide/java.rst
You can enable/disable binfmt_misc or one binary type by echoing 0 (to disable)
or 1 (to enable) to ``/proc/sys/fs/binfmt_misc/status`` or
``/proc/.../the_name``.
Catting the file tells you the current status of ``binfmt_misc/the_entry``.
You can remove one entry or all entries by echoing -1 to ``/proc/.../the_name``
or ``/proc/sys/fs/binfmt_misc/status``.
Hints
-----
If you want to pass special arguments to your interpreter, you can
write a wrapper script for it.
See :doc:`Documentation/admin-guide/java.rst <./java>` for an example.
Your interpreter should NOT look in the PATH for the filename; the kernel
passes it the full filename (or the file descriptor) to use. Using ``$PATH`` can
cause unexpected behaviour and can be a security hazard.
Richard Günther <[email protected]>
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
Binfmt_misc 인식과 등록 형식
1-21Binfmt_misc kernel feature를 사용하면 일부 제약을 제외한 거의 모든 program을 shell에서 이름만 입력해 실행할 수 있습니다. Compile된 Java, Python 또는 Emacs program도 포함됩니다.
어떤 binary에 어떤 interpreter를 호출할지 binfmt_misc에 알려야 합니다. File 시작 부분의 byte를 사용자가 지정한 magic sequence와 비교하고 mask로 일부 bit를 제외해 binary type을 인식합니다. `.com`, `.exe` 같은 filename extension으로도 인식할 수 있습니다.
먼저 binfmt_misc를 mount합니다.
First you must mount binfmt_misc::
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
새 binary type을 등록할 때 `:name:type:offset:magic:mask:interpreter:flags` 형식의 string을 `/proc/sys/fs/binfmt_misc/register`에 씁니다. Colon은 필요에 따라 다른 delimiter로 선택할 수 있습니다.
Executable 식별부터 interpreter 실행까지의 흐름입니다.
등록 string field
22-55등록 string의 8개 위치와 magic/extension 차이를 정리합니다.
`magic`에는 `\x0a`, `\xA4` 같은 hex-encoded character를 넣을 수 있습니다. NUL byte는 반드시 escape해야 하며 첫 NUL에서 parsing이 멈춥니다. Shell이 backslash를 소비하지 않게 `\\x0a`로 써야 할 수도 있습니다. Extension mode에서는 dot을 제외한 extension을 쓰고 hex special은 허용하지 않습니다. Extension match는 case-sensitive이며 slash를 사용할 수 없습니다.
`mask`는 지정하지 않으면 모두 `0xff`이며 file byte sequence에 AND합니다. Magic와 같은 길이여야 하고 NUL을 escape해야 합니다. Extension matching에서는 무시합니다.
Interpreter invocation flag
56-92P/O/C/F flag가 argument, file access, credential과 namespace 동작을 바꿉니다.
Legacy 동작은 original `argv[0]`을 binary full path로 덮어씁니다. `P`를 쓰면 `/bin/foo` interpreter와 `/usr/local/bin/blah` 실행 시 `argv[]`가 `["/bin/foo", "/usr/local/bin/blah", "blah"]`가 됩니다. Interpreter는 이를 이해하고 target을 `argv[]=["blah"]`로 실행해야 합니다.
`O`는 binary path 대신 open file descriptor를 전달하므로 non-readable binary 실행이 가능하지만, interpreter가 내용을 유출하지 않을 만큼 신뢰할 수 있어야 합니다.
`C`는 binary 기준으로 credential을 계산하고 `O`도 암시합니다. Root 소유 setuid binary를 실행하면 interpreter가 root permission으로 동작하므로 주의해야 합니다. `F`는 emulation 등록 시 binary를 미리 열어 mount namespace나 chroot environment가 변해도 emulator image를 계속 사용할 수 있게 합니다.
제약·자동 mount·matching 순서
93-111Register string, magic 위치와 interpreter path의 hard limit입니다.
Binfmt_misc는 먼저 mount해야 합니다. `mount -t binfmt_misc none /proc/sys/fs/binfmt_misc`를 실행하거나 `/etc/fstab`에 `none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0`을 추가해 boot 때 자동 mount합니다.
Boot 중 `/etc/rc` script에서 binary format을 추가할 수 있으며 올바른 방법은 init program manual을 확인합니다. Entry 추가 순서가 중요합니다. 나중에 추가한 entry를 먼저 match합니다.
등록 예제·상태 제어·보안 hint
112-151`/proc/sys/fs/binfmt_misc`에 있다고 가정한 예제입니다. Alpha AXP에서 em86용 i386/i486 ELF magic, preconfigured dosemu hdimage용 packed DOS application, Wine용 Windows `MZ` executable을 각각 register합니다.
A few examples (assumed you are in ``/proc/sys/fs/binfmt_misc``):
- enable support for em86 (like binfmt_em86, for Alpha AXP only)::
echo ':i386:M::\x7fELF\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff:/bin/em86:' > register
echo ':i486:M::\x7fELF\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff:/bin/em86:' > register
- enable support for packed DOS applications (pre-configured dosemu hdimages)::
echo ':DEXE:M::\x0eDEX::/usr/bin/dosexec:' > register
- enable support for Windows executables using wine::
echo ':DOSWin:M::MZ::/usr/local/bin/wine:' > register
For java support see Documentation/admin-guide/java.rst
예제가 인식하는 binary와 interpreter입니다.
`/proc/sys/fs/binfmt_misc/status` 또는 개별 `/proc/.../the_name`에 0을 쓰면 전체 또는 해당 type을 disable하고 1을 쓰면 enable합니다. File을 읽으면 현재 상태를 확인합니다. 개별 entry 또는 전체 status에 -1을 쓰면 하나 또는 모든 entry를 제거합니다.
Status file에 쓰는 값이 lifecycle을 제어합니다.
Interpreter에 특별한 argument를 넘기려면 wrapper script를 만들 수 있습니다. `Documentation/admin-guide/java.rst` 예제를 참조합니다.
Interpreter는 filename을 `$PATH`에서 찾으면 안 됩니다. Kernel이 전달한 full filename 또는 file descriptor를 사용해야 합니다. `$PATH` 검색은 예상 밖 동작과 security hazard를 일으킬 수 있습니다.
문서 저자는 Richard Günther <[email protected]>입니다.
Recognition and registration
binfmt-misc.rst:1-21Magic/mask 또는 extension과 interpreter를 register filesystem에 연결합니다.