Hi, On 16 February 2016 at 00:47, Laurent Vivier <[email protected]> wrote: > Ping?
It looks good to me. But I'd like to see some ack/review from Alexander or Michael. Riku > Le 29/01/2016 17:07, Laurent Vivier a écrit : >> Original qemu-binfmt-conf.h is only able to write configuration >> into /proc/sys/fs/binfmt_misc, and the configuration is lost on reboot. >> >> This script can configure debian and systemd services to restore >> configuration on reboot. Moreover, it is able to manage binfmt >> credential and to configure the path of the interpreter. >> >> List of supported CPU is: >> >> i386 i486 alpha arm sparc32plus ppc ppc64 ppc64le >> m68k mips mipsel mipsn32 mipsn32el mips64 mips64el >> sh4 sh4eb s390x aarch64 >> >> Usage: qemu-binfmt-conf.sh [--qemu-path PATH][--debian][--systemd CPU] >> [--help][--credential yes|no][--exportdir PATH] >> >> Configure binfmt_misc to use qemu interpreter >> >> --help: display this usage >> --qemu-path: set path to qemu interpreter (/usr/local/bin) >> --debian: don't write into /proc, >> instead generate update-binfmts templates >> --systemd: don't write into /proc, >> instead generate file for systemd-binfmt.service >> for the given CPU >> --exportdir: define where to write configuration files >> (default: /etc/binfmt.d or /usr/share/binfmts) >> --credential: if yes, credential an security tokens are >> calculated according to the binary to interpret >> >> To import templates with update-binfmts, use : >> >> sudo update-binfmts --importdir /usr/share/binfmts --import qemu-CPU >> >> To remove interpreter, use : >> >> sudo update-binfmts --package qemu-CPU --remove qemu-CPU >> /usr/local/bin >> >> With systemd, binfmt files are loaded by systemd-binfmt.service >> >> The environment variable HOST_ARCH allows to override 'uname' to generate >> configuration files for a different architecture than the current one. >> >> Signed-off-by: Laurent Vivier <[email protected]> >> --- >> v3: change subject to be shorter >> fix typo >> remove "!EOF", "echo -n" and "[ ... -o ... ]" >> check cpu given by --systemd is in the list >> v2: replace some ERRORS by WARNINGS to be able to use the script inside a >> package build >> check only the right to write in the directory, no need to be root >> merge systemd and binfmt_misc configuration generation >> s/qemu_generate_packages/qemu_generate_debian/ >> add support of HOST_ARCH from debian, and update CPU families. >> allow to use --exportdir with --systemd and update "Usage". >> >> scripts/qemu-binfmt-conf.sh | 389 >> ++++++++++++++++++++++++++++++++++++-------- >> 1 file changed, 320 insertions(+), 69 deletions(-) >> mode change 100644 => 100755 scripts/qemu-binfmt-conf.sh >> >> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh >> old mode 100644 >> new mode 100755 >> index 289b1a3..de4d1c1 >> --- a/scripts/qemu-binfmt-conf.sh >> +++ b/scripts/qemu-binfmt-conf.sh >> @@ -1,72 +1,323 @@ >> #!/bin/sh >> # enable automatic i386/ARM/M68K/MIPS/SPARC/PPC/s390 program execution by >> the kernel >> >> -# load the binfmt_misc module >> -if [ ! -d /proc/sys/fs/binfmt_misc ]; then >> - /sbin/modprobe binfmt_misc >> -fi >> -if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then >> - mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc >> -fi >> - >> -# probe cpu type >> -cpu=`uname -m` >> -case "$cpu" in >> - i386|i486|i586|i686|i86pc|BePC|x86_64) >> - cpu="i386" >> - ;; >> - m68k) >> - cpu="m68k" >> - ;; >> - mips*) >> - cpu="mips" >> - ;; >> - "Power Macintosh"|ppc|ppc64) >> - cpu="ppc" >> - ;; >> - armv[4-9]*) >> - cpu="arm" >> - ;; >> -esac >> - >> -# register the interpreter for each cpu except for the native one >> -if [ $cpu != "i386" ] ; then >> - echo >> ':i386:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-i386:' >> > /proc/sys/fs/binfmt_misc/register >> - echo >> ':i486:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-i386:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> -if [ $cpu != "alpha" ] ; then >> - echo >> ':alpha:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-alpha:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> -if [ $cpu != "arm" ] ; then >> - echo >> ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-arm:' >> > /proc/sys/fs/binfmt_misc/register >> - echo >> ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-armeb:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> -if [ $cpu != "aarch64" ] ; then >> - echo >> ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-aarch64:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> -if [ $cpu != "sparc" ] ; then >> - echo >> ':sparc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-sparc:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> -if [ $cpu != "ppc" ] ; then >> - echo >> ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-ppc:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> -if [ $cpu != "m68k" ] ; then >> - echo 'Please check cpu value and header information for m68k!' >> - echo >> ':m68k:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x04:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-m68k:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> -if [ $cpu != "mips" ] ; then >> - # FIXME: We could use the other endianness on a MIPS host. >> - echo >> ':mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-mips:' >> > /proc/sys/fs/binfmt_misc/register >> - echo >> ':mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-mipsel:' >> > /proc/sys/fs/binfmt_misc/register >> - echo >> ':mipsn32:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-mipsn32:' >> > /proc/sys/fs/binfmt_misc/register >> - echo >> ':mipsn32el:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-mipsn32el:' >> > /proc/sys/fs/binfmt_misc/register >> - echo >> ':mips64:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-mips64:' >> > /proc/sys/fs/binfmt_misc/register >> - echo >> ':mips64el:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-mips64el:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> -if [ $cpu != "sh" ] ; then >> - echo >> ':sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-sh4:' >> > /proc/sys/fs/binfmt_misc/register >> - echo >> ':sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-sh4eb:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> -if [ $cpu != "s390x" ] ; then >> - echo >> ':s390x:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x16:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-s390x:' >> > /proc/sys/fs/binfmt_misc/register >> -fi >> +qemu_target_list="i386 i486 alpha arm sparc32plus ppc ppc64 ppc64le m68k \ >> +mips mipsel mipsn32 mipsn32el mips64 mips64el \ >> +sh4 sh4eb s390x aarch64" >> + >> +i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00' >> +i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> +i386_family=i386 >> + >> +i486_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00' >> +i486_mask='\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> +i486_family=i386 >> + >> +alpha_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90' >> +alpha_mask='\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> +alpha_family=alpha >> + >> +arm_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00' >> +arm_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> +arm_family=arm >> + >> +armeb_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28' >> +armeb_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +armeb_family=arm >> + >> +sparc_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02' >> +sparc_mask='\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +sparc_family=sparc >> + >> +sparc32plus_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x12' >> +sparc32plus_mask='\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +sparc32plus_family=sparc >> + >> +ppc_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14' >> +ppc_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +ppc_family=ppc >> + >> +ppc64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15' >> +ppc64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +ppc64_family=ppc >> + >> +ppc64le_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15\x00' >> +ppc64le_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\x00' >> +ppc64le_family=ppcle >> + >> +m68k_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x04' >> +m68k_mask='\xff\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +m68k_family=m68k >> + >> +# FIXME: We could use the other endianness on a MIPS host. >> + >> +mips_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08' >> +mips_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +mips_family=mips >> + >> +mipsel_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00' >> +mipsel_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> +mipsel_family=mips >> + >> +mipsn32_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08' >> +mipsn32_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +mipsn32_family=mips >> + >> +mipsn32el_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00' >> +mipsn32el_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> +mipsn32el_family=mips >> + >> +mips64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08' >> +mips64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +mips64_family=mips >> + >> +mips64el_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00' >> +mips64el_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> +mips64el_family=mips >> + >> +sh4_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00' >> +sh4_mask='\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> +sh4_family=sh4 >> + >> +sh4eb_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a' >> +sh4eb_mask='\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +sh4eb_family=sh4 >> + >> +s390x_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x16' >> +s390x_mask='\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' >> +s390x_family=s390x >> + >> +aarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00' >> +aarch64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> +aarch64_family=arm >> + >> +qemu_get_family() { >> + cpu=${HOST_ARCH:-$(uname -m)} >> + case "$cpu" in >> + amd64|i386|i486|i586|i686|i86pc|BePC|x86_64) >> + echo "i386" >> + ;; >> + mips*) >> + echo "mips" >> + ;; >> + "Power Macintosh"|ppc64|powerpc|ppc) >> + echo "ppc" >> + ;; >> + ppc64el|ppc64le) >> + echo "ppcle" >> + ;; >> + arm|armel|armhf|arm64|armv[4-9]*) >> + echo "arm" >> + ;; >> + sparc*) >> + echo "sparc" >> + ;; >> + *) >> + echo "$cpu" >> + ;; >> + esac >> +} >> + >> +usage() { >> + cat <<EOF >> +Usage: qemu-binfmt-conf.sh [--qemu-path PATH][--debian][--systemd CPU] >> + [--help][--credential yes|no][--exportdir PATH] >> + >> + Configure binfmt_misc to use qemu interpreter >> + >> + --help: display this usage >> + --qemu-path: set path to qemu interpreter ($QEMU_PATH) >> + --debian: don't write into /proc, >> + instead generate update-binfmts templates >> + --systemd: don't write into /proc, >> + instead generate file for systemd-binfmt.service >> + for the given CPU >> + --exportdir: define where to write configuration files >> + (default: $SYSTEMDDIR or $DEBIANDIR) >> + --credential: if yes, credential and security tokens are >> + calculated according to the binary to interpret >> + >> + To import templates with update-binfmts, use : >> + >> + sudo update-binfmts --importdir ${EXPORTDIR:-$DEBIANDIR} --import >> qemu-CPU >> + >> + To remove interpreter, use : >> + >> + sudo update-binfmts --package qemu-CPU --remove qemu-CPU $QEMU_PATH >> + >> + With systemd, binfmt files are loaded by systemd-binfmt.service >> + >> + The environment variable HOST_ARCH allows to override 'uname' to >> generate >> + configuration files for a different architecture than the current one. >> + >> + where CPU is one of: >> + >> + $qemu_target_list >> + >> +EOF >> +} >> + >> +qemu_check_access() { >> + if [ ! -w "$1" ] ; then >> + echo "ERROR: cannot write to $1" 1>&2 >> + exit 1 >> + fi >> +} >> + >> +qemu_check_bintfmt_misc() { >> + # load the binfmt_misc module >> + if [ ! -d /proc/sys/fs/binfmt_misc ]; then >> + if ! /sbin/modprobe binfmt_misc ; then >> + exit 1 >> + fi >> + fi >> + if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then >> + if ! mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc ; then >> + exit 1 >> + fi >> + fi >> + >> + qemu_check_access /proc/sys/fs/binfmt_misc/register >> +} >> + >> +installed_dpkg() { >> + dpkg --status "$1" > /dev/null 2>&1 >> +} >> + >> +qemu_check_debian() { >> + if [ ! -e /etc/debian_version ] ; then >> + echo "WARNING: your system is not a Debian based distro" 1>&2 >> + elif ! installed_dpkg binfmt-support ; then >> + echo "WARNING: package binfmt-support is needed" 1>&2 >> + fi >> + qemu_check_access "$EXPORTDIR" >> +} >> + >> +qemu_check_systemd() { >> + if ! systemctl -q is-enabled systemd-binfmt.service ; then >> + echo "WARNING: systemd-binfmt.service is missing or disabled" 1>&2 >> + fi >> + qemu_check_access "$EXPORTDIR" >> +} >> + >> +qemu_generate_register() { >> + echo ":qemu-$cpu:M::$magic:$mask:$qemu:$FLAGS" >> +} >> + >> +qemu_register_interpreter() { >> + echo "Setting $qemu as binfmt interpreter for $cpu" >> + qemu_generate_register > /proc/sys/fs/binfmt_misc/register >> +} >> + >> +qemu_generate_systemd() { >> + echo "Setting $qemu as binfmt interpreter for $cpu for >> systemd-binfmt.service" >> + qemu_generate_register > "$EXPORTDIR/qemu-$cpu.conf" >> +} >> + >> +qemu_generate_debian() { >> + cat > "$EXPORTDIR/qemu-$cpu" <<EOF >> +package qemu-$cpu >> +interpreter $qemu >> +magic $magic >> +mask $mask >> +EOF >> + if [ "$FLAGS" = "OC" ] ; then >> + echo "credentials yes" >> "$EXPORTDIR/qemu-$cpu" >> + fi >> +} >> + >> +qemu_set_binfmts() { >> + # probe cpu type >> + host_family=$(qemu_get_family) >> + >> + # register the interpreter for each cpu except for the native one >> + >> + for cpu in ${qemu_target_list} ; do >> + magic=$(eval echo \$${cpu}_magic) >> + mask=$(eval echo \$${cpu}_mask) >> + family=$(eval echo \$${cpu}_family) >> + >> + if [ "$magic" = "" ] || [ "$mask" = "" ] || [ "$family" = "" ] ; >> then >> + echo "INTERNAL ERROR: unknown cpu $cpu" 1>&2 >> + continue >> + fi >> + >> + qemu="$QEMU_PATH/qemu-$cpu" >> + if [ "$cpu" = "i486" ] ; then >> + qemu="$QEMU_PATH/qemu-i386" >> + fi >> + >> + if [ "$host_family" != "$family" ] ; then >> + $BINFMT_SET >> + fi >> + done >> +} >> + >> +CHECK=qemu_check_bintfmt_misc >> +BINFMT_SET=qemu_register_interpreter >> + >> +SYSTEMDDIR="/etc/binfmt.d" >> +DEBIANDIR="/usr/share/binfmts" >> + >> +QEMU_PATH=/usr/local/bin >> +FLAGS="" >> + >> +options=$(getopt -o ds:Q:e:hc: -l >> debian,systemd:,qemu-path:,exportdir:,help,credential: -- "$@") >> +eval set -- "$options" >> + >> +while true ; do >> + case "$1" in >> + -d|--debian) >> + CHECK=qemu_check_debian >> + BINFMT_SET=qemu_generate_debian >> + EXPORTDIR=${EXPORTDIR:-$DEBIANDIR} >> + ;; >> + -s|--systemd) >> + CHECK=qemu_check_systemd >> + BINFMT_SET=qemu_generate_systemd >> + EXPORTDIR=${EXPORTDIR:-$SYSTEMDDIR} >> + shift >> + # check given cpu is in the supported CPU list >> + for cpu in ${qemu_target_list} ; do >> + if [ "$cpu" == "$1" ] ; then >> + break >> + fi >> + done >> + >> + if [ "$cpu" == "$1" ] ; then >> + qemu_target_list="$1" >> + else >> + echo "ERROR: unknown CPU \"$1\"" 1>&2 >> + usage >> + exit 1 >> + fi >> + ;; >> + -Q|--qemu-path) >> + shift >> + QEMU_PATH="$1" >> + ;; >> + -e|--exportdir) >> + shift >> + EXPORTDIR="$1" >> + ;; >> + -h|--help) >> + usage >> + exit 1 >> + ;; >> + -c|--credential) >> + shift >> + if [ "$1" = "yes" ] ; then >> + FLAGS="OC" >> + else >> + FLAGS="" >> + fi >> + ;; >> + *) >> + break >> + ;; >> + esac >> + shift >> +done >> + >> +$CHECK >> +qemu_set_binfmts >>
