Raspberry Pi/ARM64 in place installation

FEEL FREE TO EDIT! original: https://cmpct.info/~sam/gentoo/arm64/PiGentoo64.html At the end is a TODO list for wikifying

We will bootstrap the Gentoo install from a stage3 provided by gentoo.org, via RaspberryPi OS 64bit.

You do not need a Gentoo system already or to cross-compile.

Misc

 * #gentoo-arm on irc.libera.chat may be useful
 * I’m sam_ on libera.chat

Prerequisites

 * Raspberry Pi 4B or 400 (should work with 3B/B+ too)
 * An SD card with at least 32GB minimum is recommended. (Using a 16GB card may be possible when using e.g. rust-bin.)
 * The latest RaspberryPi OS 64bit (former Raspbian) flashed onto the card

Nice-to-haves

 * The biggest the SD card, the better; it’ll wear out slower;
 * A fan and heatsinks (to reduce heat when compiling, prevent throttling);
 * A high-quality power supply (prevent corruption, prevent throttling).
 * A Linux machine sitting around to make tweaks if needed.

Useful links

 * Raspberry_Pi_3_64_bit_Install
 * https://github.com/sakaki-/gentoo-on-rpi-64bit
 * For RPis with 4GB Ram or less: Knowledge_Base:Emerge_out_of_memory

Prepare

 * 1) Flash with latest Raspbian (September 2019 here)
 * 2) Easiest way to avoid filesystem mess is to modify cmdline.txt to change init=/usr/lib/raspi-config/init_resize.sh to init=/sbin/init.
 * 3) Edit config.txt and tell the bootloader to use the 64 bit kernel (kernel8.img).
 * 4) Place a file in /boot called ssh. This enables sshd on the next boot:
 * 5) Setup WiFi if appropriate.

Boot.
Verify that you’re running 64bit by looking for aarch64 in uname -a:

Update and reboot your system
To get the latest bootloader, kernel, etc.

Filesystem setup
Recommendd filesystems for the root partition are ext4, btrfs or f2fs. f2fs is used as an example:
 * 1) Install f2fs-tools for mkfs.f2fs and resize.f2fs;
 * 2) Create an f2fs partition. I had to create a partition inbetween the main ext4 one and my f2fs one to get the right size. Couldn’t figure out why at the time.
 * 3) Mount it at /mnt/gentoo and cd there..
 * 4) Unmount /boot from Raspbian (so we can mount it in the chroot):

Fetch the stage file
Fetch the stage3 (Please check for a newer one on the site linked above).

Preparations and chroot
Untar the stage file as usual: Start customising make.conf. Set MAKEOPTS="-jx" suitable for you system. More details can be found at MAKEOPTS: Note that you can set -march etc appropriately to use distcc, but still get the benefits.

copy DNS settings first, then mount, then chroot: Copy over some firmware for WiFi and Bluetooth from Raspbian

Enter chroot:

Prerequisites
Updating the system is likely needed to avoid e.g. bindist conflicts! You may be able to for now --exclude gcc though:

Fetch build requirements for the kernel:

Get the sources so e.g. emerge knows what kernel we're running:

Configure and build the kernel
Generate base configs for a Pi 4, Broadcom bcm2711:

Customise the kernel:

Modify arch/arm64/Makefile (optional, probably not very useful):

KBUILD_CFLAGS  += -march=native

Start compiling, the time will differ:

Mount /boot inside the chroot this time:

Take a backup of the old kernel. kernel8 is for ARM64:

Install modules and kernel:

Tasks before reboot
Update world

Create /etc/fstab:

Modify two parameters (root, rootfstype) in /boot/cmdline.txt:

Set up network and SSH
Needed for WiFi / network:


 * Create wpa_supplicant.conf as appropriate
 * https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md
 * Tell wpa_supplicant, sshd to start on boot:
 * Setup the network scripts: Wpa_supplicant

Create a user with sudo rights

 * Create a user, e.g. gentoo:
 * Set a password (optional):
 * Add in an SSH key (optional):
 * Put your public ssh key in ~/.ssh/authorized_keys
 * Install sudo

Utilize the built-in random number generator and additional tools
Install rng-tools and configure the system to start the RNG at boot:


 * Useful tools like equery, eix (optional):

Syncing time
Emerge openntpd: Start ntpd on boot: Set up swclock to save last clock on shutdown, restore on boot:

Reboot and hope for the best!

Force setting time
If your time is wrong, force a manual sync. Stop running ntpd: Manual sync: Wait a few seconds for it to sync, then CTRL-C (quit). Run to check time is now accurate. Start up ntpd again:

Set CPU_FLAGS_ARM
Install, use and remove a tool for setting the cpuflags:

Installing Raspberry Pi userland
Now it's installed, we need to make it accessible

Regenerate ld cache

Happily use vcgencmd and friends!

Update the firmware (Pi 4/Pi 400 only)
# For convenience, add a dir to PATH # Only run this part the first time you update mkdir ~/bin echo 'export PATH="$HOME/bin:${PATH}"' >> ~/.bashrc . ~/.bashrc

cd ~/git/build # Run `git clone ...` the first time # Run `git pull` in future to check for updates git clone https://github.com/raspberrypi/rpi-eeprom cd rpi-eeprom

# Copy the firmware files to where tool wants sudo mkdir /lib/firmware/raspberrypi/bootloader/ sudo cp -rv firmware/* /lib/firmware/raspberrypi/bootloader

# Copy vl805 to your bin cp firmware/vl805 ~/bin

sudo --preserve-env=PATH env ./rpi-eeprom-update
 * 1) Run the actual update

fsck.vfat is needed for the boot partition. Install :

TODO wikify

 * section should be extended for other wiki sites
 * The Guide is the main part of this site and starts with 6. (at the moment). Could that be nicer?