Raspberry Pi

From Gentoo Wiki
Jump to: navigation, search

The Raspberry Pi is an ARM device (BCM2835, ARMv6) with 512 MB RAM (earlier models had 256 MB RAM) and uses an SD(HC) card for storage. This document describes how to install Gentoo on the Raspberry Pi.

A Raspberry Pi running Gentoo

Preparing the SD card


Check that the SD card is compatible: [1]

Create at least two partitions on the card. One FAT32 for the boot partition, and one (with the preferred filesystem) for the root partition:

Example partitioning

Disk /dev/sdb: 16.6 GB, 16574840832 bytes
255 heads, 63 sectors/track, 2015 cylinders, total 32372736 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x1db42224

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *        2048      835379      416666    c  W95 FAT32 (LBA)
/dev/sdb2          835380    31889024    15526822+  83  Linux
/dev/sdb3        31889025    32372735      241855+   5  Extended
/dev/sdb5        31889088    32372735      241824   82  Linux swap / Solaris

For optimal compatibility, it is recommended to use 255H/63S geometry: [2]

SD cards are very different from rotational devices. So it is non-trivial to achieve best I/O-performance, see for example [3] to start understanding the difficulties. Also be aware that there are a lot of contradicting advice regarding partitioning and suitable filesystems for SD cards.

Boot partition

The /boot partition needs the following proprietary firmware files, provided by the Raspberry Pi foundation:

  • bootcode.bin
  • fixup.dat
  • start.elf

If there is a requirement to boot the Raspberry Pi with the setting gpu_mem=16 in config.txt, The following files will be needed:

  • fixup_cd.dat
  • start_cd.elf

Create a file called cmdline.txt containing the necessary kernel parameters. Example:

FILE /mnt/raspberrypiroot/boot/cmdline.txt
root=/dev/mmcblk0p2 rootdelay=2

These are available as:

root #emerge sys-boot/raspberrypi-firmware

Stage 3

Download the appropriate Stage 3:

Extract to the root filesystem on the SD card:

root #tar xpjf stage3-armv6j_hardfp-YYYYMMDD.tar.bz2 -C /mnt/raspberrypiroot/
FILE /mnt/raspberrypiroot/etc/portage/make.conf
CFLAGS="-O2 -march=armv6j -mfpu=vfp -mfloat-abi=hard"

Do not forget to adjust fstab (the SD card is recognized as /dev/mmcblk0) and add to /etc/shadow the root password hash generated by:

root #openssl passwd -1

Stage 4

There is also an option of a self-booting Gentoo tarball (Stage 4), it can be downloaded from here. Please note this image is outdated and unmaintained however

NOOBS image. The NOOBS image will be created on a daily basis. I'd be pleased to get feedback...

NOOBS images can be downloaded from here: https://github.com/raspberrypi/noobs, then untar the NOOBS image from above in the OS folder (/os/Gentoo).

Portage tree

Download the latest portage tree:

Ensure there are enough inode blocks free on the root partition. Portage takes up approximately 154K.

root #df -ih | egrep 'Mounted|mmc'

Untar portage on the SD card:

root #tar xjvpf portage-latest.tar.bz2 -C /mnt/raspberrypiroot/usr

Compiling the kernel


Install sys-devel/crossdev:

root #emerge --ask sys-devel/crossdev

Create a cross toolchain for ARM: (drop -S if it's planned to run an unstable system) (make sure PORTDIR_OVERLAY is defined in the make.conf first):

root #crossdev -S -v -t armv6j-hardfloat-linux-gnueabi

If there are any errors or portage warnings here, please fix them. It takes a while until the cross toolchain is successfully set up, so go grab a coffee. :-)

Kernel and modules

Download kernel sources for Raspberry Pi from GitHub [4]

root #emerge sys-kernel/raspberrypi-sources


root #git clone --depth 1 git://github.com/raspberrypi/linux.git

Manual compilation

Configure and install kernel manually:

For Raspberry Pi A, A+, B, B+:

root #make ARCH=arm bcmrpi_defconfig

For Raspberry Pi 2:

root #make ARCH=arm bcm2709_defconfig

For both:

root #make ARCH=arm CROSS_COMPILE=/usr/bin/armv6j-hardfloat-linux-gnueabi- oldconfig
root #make ARCH=arm CROSS_COMPILE=/usr/bin/armv6j-hardfloat-linux-gnueabi- -j2
root #make ARCH=arm CROSS_COMPILE=/usr/bin/armv6j-hardfloat-linux-gnueabi- modules_install INSTALL_MOD_PATH=/mnt/raspberrypiroot/

Using genkernel

Genkernel can be used to crosscompile kernel for Raspberry Pi. With genkernel all the preferences can be saved in genkernel.conf file for later use. The values of these variables need to be changed in genkernel.conf:

FILE genkernel-rpi.conf
# install kernel manually

# Set arch to arm

# No need to mount BOOTDIR and make symlink as the kernel is
# installed manually

# Adjust this as needed for the machine.

# For RaspberryPi B, B+, A, A+

# For RaspberryPi2

# Change this to the path of raspberrypi linux kernel sources.
# It is possible to make this a symlink pointing to the
# /usr/src/linux-rpi like it's done with a normal kernel.
# For example: ln -s /usr/src/linux-3.6.11-raspberrypi /usr/src/linux-rpi

# Point this variable to the directory where the SD card is mounted.
# Note that the location needs to be mounted manually before running genkernel.

After saving the configuration file (for example to /etc/genkernel-rpi.conf), mount the RaspberryPi SD card to the INSTALL_MOD_PATH configured above. Assuming the Raspberry Pi root partition device is /dev/sdd3, run:

root #mount /dev/sdd3 /mnt/raspberrypiroot

Now execute genkernel. For Raspberry Pi A, A+, B, B+:

root #ARCH=arm genkernel --config=/etc/genkernel-rpi.conf --kernel-config=/usr/src/linux-rpi/arch/arm/configs/bcmrpi_defconfig kernel

For Raspberry Pi 2:

root #ARCH=arm genkernel --config=/etc/genkernel-rpi2.conf --kernel-config=/usr/src/linux-rpi/arch/arm/configs/bcm2709_defconfig kernel

Save the above command to the custom script:

FILE /usr/local/bin/genkernel-rpi.sh
ARCH=arm genkernel --config=/etc/genkernel-rpi2.conf --kernel-config=/usr/src/linux-rpi/arch/arm/configs/bcm2709_defconfig kernel
root #chmod +x /usr/local/bin/genkernel-rpi.sh

Now simply create kernel for the Raspberry Pi by executing:

root #genkernel-rpi.sh

Installing kernel image

For Raspberry Pi A, B, B+ (Not 2 B) create a kernel.img file by:

root #emerge sys-boot/raspberrypi-mkimage
root #imagetool-uncompressed.py arch/arm/boot/Image /mnt/raspberrypiroot/boot/kernel.img

or using the Raspberry Pi mkimage tool from GitHub:

root #chmod a+x imagetool-uncompressed.py
root #./imagetool-uncompressed.py arch/arm/boot/Image
root #cp kernel.img /mnt/raspberrypiroot/boot/

Raspberry Pi 2 B just copy arch/arm/boot/zImage to /boot/kernel7.img

root #cp arch/arm/boot/zImage /mnt/raspberrypiroot/boot/kernel7.img

It may be necessary to copy updated dtb files into the boot partition, too:

root #cp arch/arm/boot/dts/*.dtb /mnt/raspberrypiroot/boot/
root #cp arch/arm/boot/dts/overlays/*.dtb* /mnt/raspberrypiroot/boot/overlays/
root #cp arch/arm/boot/dts/overlays/README /mnt/raspberrypiroot/boot/overlays/
Copying the dtb files was necessary for me to get the official Raspberry Pi 7" touchscreen (input device) working.

That's it!

Tips and tricks

  • Storage is rather slow, even with the couple of compatible SDHC class 10 cards. If emerge will be running on the Raspberry Pi, putting /usr/portage on squashfs will speed up things dramatically.
  • There is no hardware RTC on the Raspberry Pi. Use the ntp-client init script to set correct system time on boot. A fallback incremental clock can be archived by swclock (replaces hwclock).
  • If more RAM is required for Linux, set the option gpu_mem in config.txt. The smallest amount that can be set is 16 MB, default is 64 MB [5]
  • More recent, unofficial kernel releases for the Raspberry Pi might be found at Chris Boot's repository: [6]
  • Be sure to test the performance - if the numbers don't match up (for instance in the LINPACK benchmark), something is very wrong.
  • For instructions on how to build binary packages for the Raspberry Pi on an Android phone see this blog post: [7]
  • If it is not possible to create a working ARM cross-toolchain, a precompiled kernel image is available from the firmware repository. The boot/kernel.img needs to be places in the boot partition and the contents of the modules directory copied to /lib/modules/ on the SD card.
  • Put the root-fs on a NFS-share and put only the kernel image on SD card (PXE boot client).


  • Problem: dmesg is full of smsc95xx 1-1.1:1.0: eth0: kevent 2 may have been dropped and/or page allocation failure messages
    • Solution: Try to update all firmware files in /boot, especially fixup.dat.
    • Solution if the former fails: Add smsc95xx.turbo_mode=N to kernel parameters, or vm.min_free_kbytes = 4096 to /etc/sysctl.conf
  • Problem: the follwing error shows up when running the command
    root #crossdev -S -v -t armv6j-hardfloat-linux-gnueabi
    (...) configure: error: cannot compute suffix of object files: cannot compile (...)

See also

External resources