Note

The Funtoo Linux project has transitioned to "Hobby Mode" and this wiki is now read-only.

Frankenchroot

From Funtoo
Revision as of 22:14, February 24, 2019 by Drobbins (talk | contribs)
Jump to navigation Jump to search

Introduction

A frankenchroot is the act of chrooting into a directory on a host system (typically x86-64bit) which contains a foreign architecture (such as arm-32bit or arm-64bit) and having it all magically work thanks to the power of QEMU. While this may seem like it should not work at all (thus the name "frankenchroot", like the Frankenstein monster,) it actually happens to work -- and work well -- and it is a very useful trick. This page will guide you through the process of setting up a frankenchroot on your own system.

Benefits of Frankenchroot

There are several benefits to setting up a frankenchroot. The primary benefit is that it is a compelling alternative to the two other options one has available for building stuff on lower-powered (in terms of CPU performance as well as power utilization) embedded CPUs. Until now, the only options available have been compiling the software on the embedded CPU itself, or setting up a cross-compile environment, which can be complex and problematic.

Building on the embedded CPU can be fine, but for many embedded systems and packages can be slow, and it's common to run into limitations related to available CPU power and RAM, as well as IO speed on embedded storage. By using a frankenchroot, these limitations can be completely eliminated.

Types of Frankenchroot

Simple Frankenchroot

A "simple" frankenchroot is very similar to doing a regular chroot. One scenario would look like this. Let's say you wanted to test and arm-32bit stage3 tarball on your fast x86 workstation. You would create a directory, extract the stage3 into this directory, perform some setup to enable frankenchroot, and then you could chroot into this arm-32bit environment and it would work just like you chrooted into a native x86 stage3. You could then perform some test emerge commands which would take advantage of all your x86 CPU cores, memory and IO.

Live Frankenchroot

There is another cool thing you can do with a frankenchroot, and that is to set up a live frankenchoot. In this configuration, you would use something like a Raspberry Pi 3 and export its filesystems using NFS. These filesystems would then get mounted on a host x86 system via NFS. The host x86 system would then frankenchroot into this NFS-based filesystem -- even though the Raspberry Pi 3 is booted and running! In fact, it is quite possible -- and safe -- to run an emerge command on your x86 live frankenchroot while your Raspberry Pi does other things.

The benefit here is that you can use your x86 system to emerge lots of packages, and it doesn't even require shutting down your Raspberry Pi and removing the MicroSD card, which can be inconvenient and requires the Raspberry Pi to be turned off.

Frankenchroot Setup

The process of setting up a simple frankenchroot is as follows:

  1. First, install the required binaries -- QEMU with arm and aarch64 support. This is documented under /Required Packages.
  2. Next, follow the steps under /Binary Format Setup to ensure that your kernel is configured to use QEMU upon chrooting.
  3. Now, simply extract the foreign chroot environment to a location on your disk and follow /Simple Frankenchroot steps to chroot.

Live frankenchroot steps are similar:

  1. First, install the required binaries -- QEMU with arm and aarch64 support. This is documented under /Required Packages.
  2. Next, follow the steps under /Binary Format Setup to ensure that your kernel is configured to use QEMU upon chrooting.
  3. Now, follow the steps under /Live Frankenchroot to export and remotely mount your ARM system's root filesystem via NFS, and chroot into it.