Building armv7h packages on a x86 system
How to build armv7h packages on a x86 system. This article focuses on configuration of package building tools on a x86_64 or i686 system.
1 Libretools
libretools added support for building armv7h packages on x86 systems. It will take care of most of the details that go into making and accessing the chroot for you. If you are going to be building a lot of packages for the Parabola project you are advised to use this method.
First, install binfmt-qemu-static, which is suggested by libretools as an optional dependency.
# pacman -S binfmt-qemu-static
If using Systemd, enable and start the service systemd-binfmt.service.
# systemctl enable --now systemd-binfmt.service
And in the case of OpenRC, do the same with binfmt. This is commonly already done.
# rc-update add binfmt boot && service binfmt start
Before we download armv7h packages some extra signing keys must be trusted. When possible, Parabola leverages free packages that originally came from Arch ARM.
First make sure the pacman keyring has been initialized:
# pacman-key --init
Import, local-sign and install the archlinuxarm keyring in steps. That will get trust bootstraped without ever disabling signature verification in pacman.conf:
# pacman -U https://www.parabola.nu/packages/core/any/archlinuxarm-keyring/download/ # pacman-key --lsign-key builder@archlinuxarm.org # pacman -U https://www.parabola.nu/packages/core/any/archlinuxarm-keyring/download/
# pacman -U https://repo.parabola.nu/core/os/armv7h/archlinuxarm-keyring-20140119-1-any.pkg.tar.xz # pacman-key --lsign-key builder@archlinuxarm.org # pacman -U https://repo.parabola.nu/core/os/armv7h/archlinuxarm-keyring-20140119-1-any.pkg.tar.xz
Then follow the package maintainer guide, passing -A armv7h at the librechroot make step to create an armv7h chroot. You are done!
1.1 Troubleshooting
If you encounter problems with the arm chroot, first reset it to a clean state.
2 QEMU and/or Proot
If you don't feel like setting up an environment for libretools, what follows are two similar methods for using QEMU directly to emulate an ARM machine running on an armv7h chroot directory. The first one uses the faster binfmt-qemu-static, like #libretools above; while the second one goes through proot to make use of the same binfmt-qemu trick that allows non-native binaries to be associated with an emulator depending on their format. In all cases, this is akin to how shebangs have traditionally been used to pass scripts to the appropriate interpreter without the user having to specify it. Either way, you must first have an armv7h chroot directory:
2.1 Create Parabola image
Follow ARM_Installation_Guide#Create_Parabola_installation_image
2.2 Static QEMU (option 1)
To be able to chroot into a target file system without proot, the qemu emulator for the target CPU needs to be accessible from inside the chroot jail.
Install binfmt-qemu-static as described at the beginning of the #Libretools section:
# pacman -S binfmt-qemu-static # systemctl enable --now systemd-binfmt.service
Next, copy the emulator for the target architecture to the path registered by binfmt-support. You need to do the following, substituting parabola-arm-workdir/mnt/ for whatever your armv7h image root folder happens to be called:
# cp -a /usr/bin/qemu-arm-static parabola-arm-workdir/mnt/usr/bin
Prepare and enter to the chroot:
# mount -o rbind /dev parabola-arm-workdir/mnt/dev # mount -o bind /sys parabola-arm-workdir/mnt/sys # mount -o bind /tmp parabola-arm-workdir/mnt/tmp # mount -t proc none parabola-arm-workdir/mnt/proc # rm parabola-arm-workdir/mnt/etc/resolv.conf # cp -a /etc/resolv.conf parabola-arm-workdir/mnt/etc # mkdir parabola-arm-workdir/mnt/rootfs # mount -o bind / parabola-arm-workdir/mnt/rootfs # chroot parabola-arm-workdir/mnt/ /bin/bash # mount -o bind /rootfs/${PATH TO parabola-arm-workdir/mnt} /
2.3 PRoot (option 2)
PRoot is a user-space implementation of chroot, mount --bind, and binfmt_misc. This means that users don't need any privileges or setup to do things like using an arbitrary directory as the new root filesystem, making files accessible somewhere else in the filesystem hierarchy, or executing programs built for another CPU architecture transparently through QEMU user-mode. Also, developers can use PRoot as a generic GNU/Linux process instrumentation engine thanks to its extension mechanism, see CARE for an example. Technically PRoot relies on ptrace, an unprivileged system-call available in every Linux kernel.
To install, you run:
# pacman -S proot
Install qemu-arch-extra:
# pacman -S qemu-arch-extra
Finally prepare and enter to the chroot, substituting parabola-arm-workdir/mnt/ for whatever your armv7h image root folder happens to be called:
# mount -o rbind /dev parabola-arm-workdir/mnt/dev # mount -o bind /sys parabola-arm-workdir/mnt/sys # mount -o bind /tmp parabola-arm-workdir/mnt/tmp # mount -t proc none parabola-arm-workdir/mnt/proc # rm parabola-arm-workdir/mnt/etc/resolv.conf # cp -a /etc/resolv.conf parabola-arm-workdir/mnt/etc # cd /mnt # proot -0 -q /usr/bin/qemu-arm -r parabola-arm-workdir/mnt/
2.4 Configuring chroot
2.4.1 Initialize keyring
# pacman-key --init # pacman-key --populate archlinux # pacman-key --populate archlinuxarm # pacman-key --populate parabola
2.4.2 Generating locales
Before a locale can be enabled on the system, it has to be generated. The current generated/available locales can be viewed with:
$ locale -a
The locales that can be generated are listed in the /etc/locale.gen file: their names are defined using the format [language][_TERRITORY][.CODESET][@modifier]. To generate a locale, first uncomment the corresponding line in the file (or comment to remove); when doing this, also consider localizations needed by other users on the system and specific variables. For example, for American-English uncomment en_US.UTF-8 UTF-8. When done, save the file and generate the uncommented locale(s) by executing:
# locale-gen
2.4.3 Add a user
Finally, add a normal user (eg. username)
# useradd -m username
2.5 Build package
2.5.1 Makepkg configuration
Refer to https://wiki.archlinux.org/index.php/Makepkg#Configuration.
2.5.2 Build package
Refer to https://wiki.archlinux.org/index.php/Makepkg#Usage.
2.6 Troubleshooting
2.6.1 Pacman and certificates
When trying to use pacman, if you see errors like:
error: failed retrieving file '$PACKAGE' from $MIRROR : error setting certificate verify locations: CAfile: /etc/ssl/certs/ca-certificates.crt CApath: none warning: failed to retrieve some files error: failed to commit transaction (download library error) Errors occurred, no packages were upgraded.
Try copying the needed certificates from your real machine:
# sudo cp -a /etc/ssl/certs/ca-certificates.crt /mnt/chroot-armv7h/etc/ssl/certs/ # sudo cp -a /etc/ca-certificates/extracted/tls-ca-bundle.pem /mnt/chroot-armv7h/etc/ca-certificates/extracted/
That or switch to an HTTP (not HTTPS) mirror in /etc/pacman.d/mirrorlist.
3 Cross-compiler
See cross compiler.