Difference between revisions of "Frankenchroot"

From Funtoo
Jump to navigation Jump to search
Line 1: Line 1:
{{Subpages|Required Packages,Binary Format Setup,Simple Frankenchroot,Live NFS Frankenchroot, Manual Binary Format Setup}}
{{Subpages|Required Packages,Binary Format Setup,Simple Frankenchroot,Live NFS Frankenchroot, Manual Binary Format Setup}}
==''Setting Up Your Filesystem''==
===''Building and Installing the Wrapper Binary''===
{{file|name=qemu-arm-wrapper.c|lang=C|desc=qemu arm wrapper|body=
    /*
    * Call QEMU binary with additional "-cpu cortex-a7" argument.
    *
    * Copyright (c) 2018 sakaki <sakaki@deciban.com>
    * 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);
    }
}}
{{console|body=
###i## gcc -static -O3 -s -o qemu-arm-wrapper qemu-arm-wrapper.c
}}
{{console|body=
###i## cp -av /usr/bin/qemu-arm /mnt/piroot/usr/local/bin/qemu-arm
###i## cp -av qemu-arm-wrapper /mnt/piroot/usr/local/bin/qemu-arm-wrapper
}}
===''Setting up binfmt_misc and Starting the Service''===
{{console|body=
###i## 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
}}
{{console|body=
###i## rc-service binfmt restart
}}
{{console|body=
###i## rc-service binfmt status
}}
{{warning| The preceding wrapper and binfmt_misc register string were for arm 32bit. They *MUST* be edited for aarch64.}}
{{tip|
The following code will create the binfmt_misc register string for the arch you are emulating in usermode Qemu. This is only needed for targets other than the arm target already packaged for you above. Usage is as followed:
{{console|body=
###i## chmod +x masky
###i## masky /path/to/foreign/binary
}}
* Paste the output to /proc/sys/fs/binfmt_misc/register
* Change "arm" in the following code to whatever you want the name of the binfmt_misc name to be when it is registered
* Change /usr/local/bin/qemu-arm-wrapper to the name of your wrapper
{{file|name=masky|lang=python|desc=masky|body=
#!/usr/bin/python3
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(ascii_value)
        else:
            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 += f.read(1).hex()
mask_as_hexstring = "fffffffffffffffcfffffffffffffffffeffff"
mask = int(mask_as_hexstring, 16)
chunk = int(chunk_as_hexstring, 16)
out_as_hexstring = hex(chunk & mask)[2:]
sys.stdout.write(":arm:M::")
print_out_hexstring(out_as_hexstring)
sys.stdout.write(":")
print_out_hexstring(mask_as_hexstring)
sys.stdout.write(":/usr/local/bin/qemu-arm-wrapper:\n")
}}
}}
==''Chrooting and Letting the Magic Happen''==
==''Chrooting and Letting the Magic Happen''==



Revision as of 21:52, February 24, 2019

Chrooting and Letting the Magic Happen

Entering Franken Chroot

root # mv -v /mnt/piroot/etc/resolv.conf{,.orig}
root # cp -v -L /etc/resolv.conf /mnt/piroot/etc/
root # env -i HOME=/root TERM=$TERM /bin/chroot /mnt/piroot /bin/bash -l
root # export PS1="(Franken_Chroot) $PS1"

Exiting Franken Chroot and Final Thoughts

root # rm /etc/resolv.conf
root # mv -v /etc/resolv.conf{.orig,}
root # exit
root # umount -v /mnt/piroot/var/tmp/portage
root # umount -lR /mnt/piroot
root # sync