How to install Gentoo on Raspberry Pi 5

From Gentoo Wiki
Jump to:navigation Jump to:search

Partition SD card and format partitions

Partition SD card

Normally 3 partitions are needed here: boot, swap and root. If you decide to use swap as a file, then 2 partitions are needed. In this example, we use swap as a partition.

1. Start partitioning SD card

root #fdisk /dev/sda
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

2. Create a DOS label

Command (m for help): o
Created a new DOS disklabel with disk identifier 0x4fe0c75b.

3. Create boot partition

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-124735487, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-124735487, default 124735487): +256M

Created a new partition 1 of type 'Linux' and of size 256 MiB.

4. Create swap partition

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 
First sector (526336-124735487, default 526336): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (526336-124735487, default 124735487): +8G

Created a new partition 2 of type 'Linux' and of size 8 GiB.

5. Create root partition

Command (m for help): n
Partition type
   p   primary (2 primary, 0 extended, 2 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (3,4, default 3): 
First sector (17303552-124735487, default 17303552): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (17303552-124735487, default 124735487): 

Created a new partition 3 of type 'Linux' and of size 51.2 GiB.

6. Set the file system for boot partition. To boot raspberry pi, boot partition has to be FAT.

Command (m for help): t
Partition number (1-3, default 3): 1
Hex code or alias (type L to list all): 0b

Changed type of partition 'Linux' to 'W95 FAT32'.

7. Set the file system for swap partition.

Command (m for help): t
Partition number (1-3, default 3): 2
Hex code or alias (type L to list all): 82

Changed type of partition 'Linux' to 'Linux swap / Solaris'.

8. Set the file system for root partition.

Command (m for help): t
Partition number (1-3, default 3): 
Hex code or alias (type L to list all): 83

Changed type of partition 'Linux' to 'Linux'.

9. Final check of the partitions

Command (m for help): p
Disk /dev/sda: 59.48 GiB, 63864569856 bytes, 124735488 sectors
Disk model: Storage Device  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4fe0c75b

Device     Boot    Start       End   Sectors  Size Id Type
/dev/sda1           2048    526335    524288  256M  b W95 FAT32
/dev/sda2         526336  17303551  16777216    8G 82 Linux swap / Solaris
/dev/sda3       17303552 124735487 107431936 51.2G 83 Linux

10. Write changes to SD card.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Format partitions

1. boot partition

root #mkfs -t vfat /dev/sda1
mkfs.fat 4.2 (2021-01-31)

2. swap partition

root #mkswap --pagesize 16384 /dev/sda2
mkswap: Using user-specified page size 16384, instead of the system value 4096
Setting up swapspace version 1, size = 8 GiB (8589918208 bytes)
no label, UUID=1c5c3570-8437-431f-b737-7d1e24d8d1b7

3. root partition

root #mkfs -t ext4 /dev/sda3
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 13428992 4k blocks and 3358720 inodes
Filesystem UUID: b9aefb9c-0c70-49df-b236-95783f17d190
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done

Install base system and portage snapshot

Mount root partition

root #mount /dev/sda3 /mnt/gentoo
root #cd /mnt/gentoo

Install stage3

1. Download latest stage 3 tar file

2. Untar stage file

root #tar xpf /path/to/stage3-arm64-openrc-20240107T211819Z.tar.xz --xattrs-include='*.*' --numeric-owner

Install portage snapshot

1. Download latest portage snapshot

2. Untar stage file

root #mkdir -p /mnt/gentoo/var/db/repos/gentoo
root #tar xpf /home/davxi/Downloads/portage-latest.tar.bz2 --strip-components=1 -C /mnt/gentoo/var/db/repos/gentoo

Install kernel, modules and firmware

Install kernel

There are 2 ways to install the kernel for Raspberry Pi 5, use the pre-built kernel and compile from source code. In this example, we will use the pre-built kernel.

1. Clone raspberry-firmware repository.

2. To boot raspberry pi, a few files from boot folder are needed. Make sure you have copied the following files from firware/boot to /mnt/gentoo/boot

root #mount /dev/sda1 /mnt/gentoo/boot
root #cp /path/to/raspberrypi/firmware/boot/bcm2712-rpi-5-b.dtb .
root #cp /path/to/raspberrypi/firmware/boot/fixup_cd.dat .
root #cp /path/to/raspberrypi/firmware/boot/fixup.dat .
root #cp /path/to/raspberrypi/firmware/boot/start_cd.elf .
root #cp /path/to/raspberrypi/firmware/boot/start.elf .
root #cp /path/to/raspberrypi/firmware/boot/bootcode.bin .
root #cp /path/to/raspberrypi/firmware/boot/kernel8.img .
root #cp -r /path/to/raspberrypi/firmware/boot/overlays .

3. Config boot loader

Unlike grub or other boot loader, raspberry pi looks for cmdline.txt from /boot to boot the operating system. Put below content into /mnt/gentoo/boot/cmdline.txt

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p3 rootfstype=ext4 rootwait

4. Config.txt

config.txt is needed configure raspberry pi to use correct drivers. Put below content into /mnt/gentoo/boot/config.txt

# have a properly sized image
disable_overscan=1

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

Install modules

https://github.com/raspberrypi/firmware comes with all the modules we need, just copy modules into /mnt/gentoo/lib/

root #cp -r /home/darthjoker/raspberrypi/firmware/modules /mnt/gentoo/lib/

Firmware

To use WIFI and bluetooth, we need to copy the firmware to /mnt/gentoo/lib/firmware folder.

WIFI

1. Clone wifi firmware repository

2. Create /mnt/gentoo/lib/firmware/brcm if it doesn't exist

root #mkdir -p /mnt/gentoo/lib/firmware/brcm

3. The wifi mode for raspberry pi 5 is brcmfmc43455, so we only need to copy files for brcmfmc43455.

root #cp /path/to/raspberrypi/firmware-nonfree/debian/config/brcm80211/cypress/cyfmac43455-sdio-standard.bin /mnt/gentoo/lib/firmware/brcm/brcmfmac43455-sdio.bin
root #cp /path/to/raspberrypi/firmware-nonfree/debian/config/brcm80211/cypress/cyfmac43455-sdio.clm_blob /mnt/gentoo/lib/firmware/brcm/brcmfmac43455-sdio.clm_blob
root #cp /path/to/raspberrypi/firmware-nonfree/debian/config/brcm80211/brcm/brcmfmac43455-sdio.txt /mnt/gentoo/lib/firmware/brcm/

4. When raspberry pi 5 boots, it looks for firmware names with model name, like raspberry,5-model-b, so we need to create symbolinks for the firmware files, make sure you have following symbolinks.

root #ls -l /mnt/gentoo/lib/firmware/brcm/
-rw-r--r-- 1 root root 643651 Jan 21 12:20 brcmfmac43455-sdio.bin
-rw-r--r-- 1 root root   2676 Jan 21 12:18 brcmfmac43455-sdio.clm_blob
lrwxrwxrwx 1 root root     22 Jan 21 12:23 brcmfmac43455-sdio.raspberrypi,5-model-b.bin -> brcmfmac43455-sdio.bin
lrwxrwxrwx 1 root root     27 Jan 21 12:23 brcmfmac43455-sdio.raspberrypi,5-model-b.clm_blob -> brcmfmac43455-sdio.clm_blob
lrwxrwxrwx 1 root root     22 Jan 21 12:24 brcmfmac43455-sdio.raspberrypi,5-model-b.txt -> brcmfmac43455-sdio.txt
-rw-r--r-- 1 root root   2074 Jan 21 12:19 brcmfmac43455-sdio.txt

Bluetooth

1. Clone bluetooth firmware repository

2. Create /mnt/gentoo/lib/firmware/brcm if it doesn't exist

root #mkdir -p /mnt/gentoo/lib/firmware/brcm

3. For bluetooth, only BCM4345C0.hcd is needed.

root #cp /home/darthjoker/raspberrypi/bluez-firmware/debian/firmware/broadcom/BCM4345C0.hcd /mnt/gentoo/lib/firmware/brcm/

4. Similarly, we need to create a symbolink for raspberry pi 5.

root #ln -s /mnt/gentoo/lib/firmware/brcm/BCM4345C0.hcd /mnt/gentoo/lib/firmware/brcm/BCM4345C0.raspberrypi,5-model-b.hcd

Setting up wifi

To use wifi, a network tool is needed. I've tried to use wpa_supplicant, however, I got no luck make it work with the firmware. So I switched to NetworkManager.

To install NetworkManager, there are 2 ways:

  • If you have an ethernet cable, you can finish this tutorial and use emerge on raspberry pi.
  • If you don't have ethernet, you can download all the necessary files to /var/cache/distfiles and emerge NetworkManager on raspberry pi.

Command to install NetworkManager

root #USE="-modemmanager -ppp -gtk-doc -introspection -concheck" emerge networkmanager

Command to download cache files for NetworkManager

root #USE="-modemmanager -ppp -gtk-doc -introspection -concheck" emerge -pf networkmanager

Ready to use

Before we boot Gentoo on raspberry pi, there are a few things we need to set up.

fstab

Make sure you have below content on /mnt/gentoo/etc/fstab

/dev/mmcblk0p1          /boot           vfat            noatime,noauto,nodev,nosuid,noexec	1 2
/dev/mmcblk0p2          swap            swap            defaults                                0 0
/dev/mmcblk0p3          /               ext4            noatime                                 0 0

shadow file

Before we can log into raspberry pi, we need to change the password of root user. Below is the password raspberry, replace this with the first line of /mnt/gentoo/etc/shadow file, make sure you only have one line for root user.

root:$6$xxPVR/Td5iP$/7Asdgq0ux2sgNkklnndcG4g3493kUYfrrdenBXjxBxEsoLneJpDAwOyX/kkpFB4pU5dlhHEyN0SK4eh/WpmO0::0:99999:7:::

inittab

/mnt/gentoo/etc/inittab needs to updated, the following line should be commented.

f0:12345:respawn:/sbin/agetty 9600 ttyAMA0 vt100

Unmount all partitions

root #umount /mnt/gentoo/boot
root #umount /mnt/gentoo

Enjoy Gentoo

Plug the SD card into raspberry pi and enjoy!