User Mode Qemu chroot Guide

From Funtoo
Revision as of 04:02, February 19, 2019 by Bcowan (talk | contribs) (Created page with "=''Funtoo binfmt_misc Qemu chroot Guide: aka (Frankenroot)''= ==''Setting Up Your Filesystem''== ===''Exporting Your Remote Mounts with NFS''=== {{file|name=/etc/exports|desc...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Funtoo binfmt_misc Qemu chroot Guide: aka (Frankenroot)

Setting Up Your Filesystem

Exporting Your Remote Mounts with NFS

   /etc/exports - NFS file systems being exported
# /etc/exports: NFS file systems being exported.  See exports(5).

Mounting Your NFS Exports Locally and Binding Pseudo Filesystems

root # mount foo.local:/ /mnt/piroot
root # mount -t proc /proc /mnt/piroot/proc
root # mount --rbind /sys /mnt/piroot/{sys,dev} 
root # mount --make-rslave /mnt/piroot/{sys,dev} 
root # mount -t devpts none /mnt/piroot/dev/pts

(For Better Performance!) mount a tmpfs on top of /mnt/piroot/var/tmp/portage

Local Configuration

Editing Make.conf

   /etc/portage/make.conf - Portage make.conf file
# /etc/portage/make.conf:

QEMU_USER_TARGETS="aarch64 arm"
FEATURES="-sandbox -ipc-sandbox -usersandbox candy"

You WILL need to have updated to Funtoo-1.3-release and emerged the latest dev-libs/glibebuild as it has fixed the static library creation needed to compile and run Qemu.

root # emerge -a qemu

Building the Wrapper Binary

   qemu-arm-wrapper.c (C source code) - qemu arm wrapper
     * Call QEMU binary with additional "-cpu cortex-a7" argument.
     * Copyright (c) 2018 sakaki <>
     * License: GPL v3.0+
     * Based on code from the Gentoo Embedded Handbook
     * ("General/Compiling_with_qemu_user_chroot")

    #include <string.h>
    #include <unistd.h>

    int main(int argc, char **argv, char **envp) {
        char *newargv[argc + 3];

        newargv[0] = argv[0];
        newargv[1] = "-cpu";
        newargv[2] = "cortex-a7";

        memcpy(&newargv[3], &argv[1], sizeof(*argv) * (argc -1));
        newargv[argc + 2] = NULL;
        return execve("/usr/local/bin/qemu-arm", newargv, envp);

Setting up binfmt_misc

root # echo ":arm:M::\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/local/bin/qemu-arm-wrapper:" > /proc/sys/fs/binfmt_misc/register (python source code) - masky
import sys
import struct
import string
import codecs

printable_chars = set(string.printable)
printable_chars = set()
def print_out_hexstring(hexstring):
    to_process = hexstring
    while len(to_process):
        ascii_value = chr(int(to_process[:2], 16))
        to_process = to_process[2:]
        if ascii_value in printable_chars:
            sys.stdout.write("\\x" + "{0:02x}".format(ord(ascii_value)))

chunk_as_hexstring = ""
with open(sys.argv[1], 'rb') as f:
    for x in range(0,19):
       chunk_as_hexstring +=
mask_as_hexstring = "fffffffffffffffcfffffffffffffffffeffff"
mask = int(mask_as_hexstring, 16)
chunk = int(chunk_as_hexstring, 16)
out_as_hexstring = hex(chunk & mask)[2:]