Building CentOS Linux 7 for ARMv8

Tuesday, 10, March 2015 Jim Perrin arm, builds 4 Comments

As I'd mentioned previously, the fine folks of Applied Micro were kind enough to give us an X-C1 development box to see if it was feasible to build and run CentOS Linux 7. My first attempt through, I realized I hadn't been taking decent notes, so I scrapped most of the package work and started over. This time I took a few more notes, and hopefully I've documented some things that will help everyone. If you're interested in discussing or joining the ARMv8 process, feel free to join our ARM development mailing list, or find me on Freenode's irc network in #centos-devel (nick: Evolution ).

 

Initial Steps

The official Linux architecture name for ARMv8 is aarch64. However both terms seem to be in circulation and we use them to imply the same thing.

My plan for the X-C1 box was to install Fedora, and use mock to get a decent buildroot in order. Because the X-C1 box came with a uboot based image by default, I had to replace it with uefi first. The directions for doing that can be found on Fedora's aarch64 wiki page. Once uboot was successfully replaced with UEFI, I installed Fedora 21 and mock. I chose F21 largely because there I couldn't find a Fedora 19 image to work from, but there are Fedora 19 packages available to help bootstrap a C7 mock chroot, which is really what I was after. I copied this repository to a local system both to not hammer the remote machine, and to reduce the latency.

 

Host Modifications

While I worked on getting the roughly 150 packages needed for a basic mock buildroot built, I kept running into a recurring problem with failed tests for elfutils. Part of the elfutils test suite tests coredumps and it seems that the buildhost's systemd-coredump utility was stealing them. After some time digging around with this, I ended up with the following commands:

# echo "kernel.core_pattern=core" > /etc/sysctl.d/50-coredump.conf
# sysctl --system

Once that was done, the elfutils build tests passed without issue.

 

Package Builds

Initially I attempted to work out a build order that would allow me to build from the ground up, but I quickly realized this was foolish. When starting from the bottom like this, everything has a build dependency on something else. Instead I chose to work toward a clean mock init first, and then work up from that point. Since I only have one board to build against, I'm currently abusing bash and cycling things through mock directly. The idea of using koji or plague seemed a bit overkill with just one build host doing the work. Once everything has been built (or thrown out of the build) against the F19 repository, it will be time to do the build again against itself to ensure that everything is properly linked and self-hosting.

 

It's worth noting that some of the packages in the F19 repository are actually tagged as F20 and are newer than what exists in CentOS Linux 7. I found it necessary to exclude these newer versions, and often to exclude other packages as the build has progressed. While not an exhaustive list, examples are:

 

Exclusions:

I mentioned that a few packages have been ejected from the build outright. Some of these are because the build dependencies either aren't, or can't be met. The prime example of this is ADA support, which requires the same cross-compiled (or otherwise bootstrapped) ADA version to build (yay for circular dependencies). Since nothing appears to explicitly depend on the ADA packages like libgnat, for now I've removed them. Down the road, if I'm able to properly add support I will certainly revisit this decision.

 

Substitutions:

There are a few packages from CentOS Linux 7 that I just won't be able to use. The primary issue is the kernel. The 3.10 kernel just doesn't have the support for aarch64 that's needed, so my current plan is to target 3.19 as the kernel to ship for aarch64. This is still speculation, as I've been procrastinating on actually building it. I imagine that will happen for the next blog post update 🙂

The other problematic package is anaconda. I'm unsure if I can patch the version in 7 to support aarch64, or if I'll need to 'forward-port' and use a more recent version from fedora to handle the installation. If anyone from the community has insights or suggestions for this, please speak up.

I'll continue posting updates as the build progresses, or as I find interesting things worth mentioning.

 

4 thoughts on "Building CentOS Linux 7 for ARMv8"

  1. Thorsten Leemhuis says:

    "The official Linux architecture name for ARMv8 is aarch64. However both terms seem to be in circulation and we use them to imply the same thing." Something afaics went wrong in that area:
    * ARM calls the architecture ARMv8
    * the ARMv8 architecture understands the Aarch64 instruction set (but it also has a AArch32 mode)
    * in the Linux kernel it's called ARM64

    1. kbsingh says:

      hi Thorsten,

      At this point, it looks as if Aarch64 is the build target for almost all of ARMv8 support. Hence the inter-replaceable ( even though it might be best to perhaps stick with just Aarch64 for the sake of clarity and uniformity ).

      - KB

  2. Thanks for the update and your continued efforts on porting CentOS 7 to ARM.

  3. Phu Hien says:

    “The official Linux architecture name for ARMv8 is aarch64. However both terms seem to be in circulation and we use them to imply the same thing.” Something afaics went wrong in that area:
    * ARM calls the architecture ARMv8
    * the ARMv8 architecture understands the Aarch64 instruction set (but it also has a AArch32 mode)
    * in the Linux kernel it’s called ARM64

Leave a Reply

Your email address will not be published. Required fields are marked *