Flatcar Setup on Raspberry Pi

Last Edit: 2024.04.11

Overview

Setup Flatcar Container Linux on a Raspberry Pi.

Flatcar is best suited for the Raspberry Pi 4. Be sure to read the firmware developers initial notice.

Firmware is still in active development for the Raspberry Pi 5, refer to the status tables on GitHub. The installation process for the Raspberry Pi 5 is still documented here for those interested.

Flatcar will boot-loop on the Raspberry Pi 3. This is likely an issue with the bootloader, and is noted in a closed issue on GitHub. The installation process for the Raspberry Pi 3 is still documented here for those interested, maybe you can solve the issue.

It is recommended to install Flatcar on a USB drive instead of an SD card; this requires enabling USB boot mode for the Pi.

Download Flatcar Installer

Download the Flatcar installer from the Flatcar System Initialization GitHub Repository to your local system.

wget https://raw.githubusercontent.com/flatcar/init/flatcar-master/bin/flatcar-install --directory-prefix=/tmp/

Modify the Flatcar installer permissions so it is executable by the user only.

chmod 700 /tmp/flatcar-install

Generate SSH Key

Generate a new RSA 4096 or Ed25519 SSH key pair using ssh-keygen.

RSA 4096:

ssh-keygen -t rsa -b 4096 -C "[email protected]"

Ed25519:

ssh-keygen -t ed25519 -C "[email protected]"

When prompted, specify a filename and enter a secure password to encrypt the private key with. The key will be generated and two files will be created with your chosen filename (id_rsa by default).

  • id_rsa - Private key used for authentication. Store in a secure location and do not share it.
  • id_rsa.pub - Public key. Placed on the server to verify the private key when opening a connection.

Verify the private key can only be accessed by the user.

chmod go= id_rsa

Create Ignition Configuration

Create an Ignition file to configure the system on boot.

nano /tmp/config.json

Use the following configuration from the Flatcar documentation1. Replace <Insert_your_SSH_Keys_here> with the SSH public key generated in the previous step (the contents of id_rsa.pub). Note the username core for connecting later.

Example key definition, include quotes: "ssh-ed25519 GENERATED-KEY-HERE [email protected]".

{
  "ignition": {
    "config": {},
    "security": {
      "tls": {}
    },
    "timeouts": {},
    "version": "2.3.0"
  },
  "networkd": {},
  "passwd": {
    "users": [
      {
        "name": "core",
        "sshAuthorizedKeys": [
          <Insert_your_SSH_Keys_here>
        ]
      }
    ]
  },
  "storage": {
    "files": [
      {
        "filesystem": "OEM",
        "path": "/grub.cfg",
        "append": true,
        "contents": {
          "source": "data:,set%20linux_console%3D%22console%3DttyAMA0%2C115200n8%20console%3Dtty1%22%0Aset%20linux_append%3D%22flatcar.autologin%20usbcore.autosuspend%3D-1%22%0A",
          "verification": {}
        },
        "mode": 420
      }
    ],
    "filesystems": [
      {
        "mount": {
          "device": "/dev/disk/by-label/OEM",
          "format": "btrfs"
        },
        "name": "OEM"
      }
    ]
  },
  "systemd": {}
}

Configure Static IP

In the above configuration, the Flatcar system will be assigned an IP address by the local DHCP server. If you wish to assign a static IP address within the Ignition configuration, replace the "networkd": {}, definition with the following. Modify the IP address values as required by the local network.

ContentsExample ValueDescription
Interfaceenabcm6e4ei0This is the default interface name for the Raspberry Pi 4. Only modify if different on your device.
Address192.168.1.199/24Replace with the IP address, and network subnet, to assign the Flatcar system. If you are unsure about subnet, it is probably /24.
Gateway192.168.1.1Replace with the local network router IP address.
DNS9.9.9.9 149.112.112.112Replace with DNS servers of choice, these two address belong to Quad9. Use the router IP address to inherit network defaults.
  "networkd": {
    "units": [
      {
        "name": "00-enabcm6e4ei0.network",
        "contents": "[Match]\nName=enabcm6e4ei0\n[Network]\nAddress=192.168.1.199/24\nGateway=192.168.1.1\nDNS=9.9.9.9 149.112.112.112"
      }
    ]
  },

Install Flatcar

Verify the device you want to install Flatcar on, either USB or SD, is connected to your computer. Determine the device identifier using lsblk.

lsblk

The output will list all connected storage devices. For this example, device sdb is the one to install Flatcar on.

NAME           MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sdb              8:1    1  42.0G  0 disk  
└─sdb1           8:2    1  42.0G  0 part  

Install Flatcar to the drive with the following command. Replace /dev/sdb with the correct device identifier, and verify the config.json path is correct.

sudo /tmp/flatcar-install -d /dev/sdb -C stable -B arm64-usr -o '' -i /tmp/config.json

The installation process will start and it will notify you when completed.

Installing Ignition config config.json...
Success! Flatcar Container Linux stable 3815.2.1 is installed on /dev/sdb

Install Raspberry Pi Firmware

Community firmware is required to boot Flatcar using UEFI. The firmware will be installed to the EFI partition of the device that Flatcar was just insatalled on.

Mount EFI Partition

Create a new directory to mount the EFI partition to.

mkdir /tmp/efipartition

Mount the EFI partition from the Flatcar device. Replace /dev/sdb with the device identifier, used earlier to install Flatcar.

efipartition=$(lsblk /dev/sdb -oLABEL,PATH | awk '$1 == "EFI-SYSTEM" {print $2}') &&\
sudo mount ${efipartition} /tmp/efipartition

Install RPi 4 Firmware

If using a Raspberry Pi 4, download the latest firmware from the Raspberry Pi 4 UEFI Firmware GitHub page. At the time of writing this was version 1.36.

wget https://github.com/pftf/RPi4/releases/download/v1.36/RPi4_UEFI_Firmware_v1.36.zip --directory-prefix=/tmp/

Extract the downloaded Raspberry Pi Firmware to the mounted EFI partition.

sudo unzip /tmp/RPi4_UEFI_Firmware_v1.36.zip -d /tmp/efipartition

Review the firmware developer’s initial notice. The following is a quote from that section.

  • “A 3 GB RAM limit is enforced by default, even if you are using a Raspberry Pi 4 model that has 4 GB or 8 GB of RAM, on account that the OS must patch DMA access, to work around a hardware bug that is present in the Broadcom SoC. For Linux this usually translates to using a recent kernel (version 5.8 or later) and for Windows this requires the installation of a filter driver. If you are running an OS that has been adequately patched, you can disable the 3 GB limit by going to Device Manager > Raspberry Pi Configuration > Advanced Settings in the UEFI settings.”

Install RPi 5 Firmware

If using a Raspberry Pi 5, download the latest firmware from the Windows on R Raspberry Pi 5 UEFI GitHub page. At the time of writing this was version 0.3.

wget https://github.com/worproject/rpi5-uefi/releases/download/v0.3/RPi5_UEFI_Release_v0.3.zip --directory-prefix=/tmp/

Extract the downloaded Raspberry Pi Firmware to the mounted EFI partition.

sudo unzip /tmp/RPi5_UEFI_Release_v0.3.zip -d /tmp/efipartition

Install RPi 3 Firmware

If using a Raspberry Pi 3, download the latest firmware from the Raspberry Pi 3 UEFI Firmware GitHub page. At the time of writing this was version 1.39.

wget https://github.com/pftf/RPi3/releases/download/v1.39/RPi3_UEFI_Firmware_v1.39.zip --directory-prefix=/tmp/

Extract the downloaded Raspberry Pi Firmware to the mounted EFI partition.

sudo unzip /tmp/RPi4_UEFI_Firmware_v1.39.zip -d /tmp/efipartition

Unmount EFI Partition

Unmount the EFI partition and remove the device from the local system.

sudo umount /tmp/efipartition

Boot Raspberry Pi

Connect the created Flatcar drive to the Raspberry Pi. Verify an ethernet cable is connected. Power on, or connect the power cable, to boot the device.

If, optionally, a monitor is plugged into the device, you will be presented with the Flatcar login prompt after the initial boot process is completed. In the Ignition configuration, we only configured SSH keys, so will not be able to login at the prompt. Connect via SSH on your local system.

Connect To Flatcar

Connect to Flatcar using SSH. Define the SSH private key to use when connecting.

ssh [email protected] -p 22 -i /path/to/id_rsa

SSH Config

Optionally, add an SSH configuration for the Flatcar system.

nano $HOME/.ssh/config

Define the Flatcar Raspberry Pi values.

Host flatcar-pi
        HostName 192.168.1.199
        Port 22
        User core
        IdentityFile /path/to/id_rsa

Then connect via SSH using the defined host.

ssh flatcar-pi

References

1 2 3


  1. Flatcar Project Contributors. “Running Flatcar Container Linux on Raspberry Pi 4.” 2024. ↩︎ ↩︎

  2. Flatcar Project Contributors. “Flatcar Container Linux Documentation.” 2024. ↩︎

  3. Raspberry Pi Foundation. “Raspberry Pi Documentation.” 2024. ↩︎