Как установить CoreOS на Raspberry Pi 4

В заметке я описал процесс установки CoreOS на Raspberry Pi 4: от подготовки компонентов и конфигурации системы до записи образа на micro SD и запуска устройства.

Подготовка

Сначала я собрал необходимый набор компонентов для Raspberry Pi:

Флешку нужно отформатировать, чтобы Raspberry Pi её корректно распознавала. Это можно сделать с помощью Raspberry Pi Imager. Вместо выбора операционной системы нужно выбрать опцию «отформатировать карту». Если на флешке уже есть разделы, их следует удалить, а затем выполнить форматирование.

Для установки CoreOS на Raspberry Pi есть документация. Для выполнения инструкций нужна Fedora Linux, но у меня была только Windows. Однако проблему можно решить с помощью WSL и развёртывания образа Fedora.

wsl --install
wsl --install FedoraLinux-43
wsl -d FedoraLinux-43

В Fedora я установил необходимые пакеты:

dnf install -y butane coreos-installer ignition-validate jq cpio

Конфигурация

CoreOS позволяет предварительно сконфигурировать систему. Я собрал минимальный конфиг, так как ещё не был уверен, что мне понадобится и как всё работает. Стандартное расширение для конфига — bu, но для удобства редактирования его можно сохранить как example.yml.

variant: fcos
version: 1.6.0
passwd:
    groups:
        - name: admin
    users:
        - name: admin
          password_hash: ...
          groups:
            - admin
            - wheel
            - sudo
            - docker
        - name: workers
          groups: 
            - docker  
            - wheel
storage:
    files:
        - path: /etc/hostname
          mode: 0644
          overwrite: true
          contents:
            inline: homeserver
        - path: /etc/ssh/sshd_config.d/20-enable-passwords.conf
          mode: 0644
          contents:
              inline: |
                  # Fedora CoreOS disables SSH password login by default.
                  # Enable it.
                  # This file must sort before 40-disable-passwords.conf.
                  PasswordAuthentication yes
    links:
        - path: /etc/localtime
          target: ../usr/share/zoneinfo/Europe/Moscow        

Дальше конфиг нужно преобразовать в ignition формат. Формально, там будет почти тоже самое, только в json. На этом этапе с конфигурацией все, если нужно будет внести изменения, то трансформацию придется повторить.

butane --pretty --strict example.yml --output example.ign
ignition-validate example.ign && echo 'Success!'

Запись образа на micro SD

Сначала подготовим дополнительные файлы для загрузки CoreOS на Raspberry Pi.

mkdir -p /tmp/RPi4boot/boot/efi/
dnf download --resolve --releasever=43 --forcearch=aarch64 --destdir=/tmp/RPi4boot/ uboot-images-armv8 bcm283x-firmware bcm283x-overlays
for rpm in /tmp/RPi4boot/*rpm; do rpm2cpio $rpm | cpio -idv -D /tmp/RPi4boot/; done
mv /tmp/RPi4boot/usr/share/uboot/rpi_arm64/u-boot.bin /tmp/RPi4boot/boot/efi/rpi-u-boot.bin

Затем я столкнулся с проблемой: WSL не умеет пробрасывать USB-устройства. Эту проблему можно решить с помощью USBIPD-WIN. Утилита устанавливается на Windows-хост. Затем в хосте нужно открыть консоль, найти нужное устройство и подключить его в WSL.

usbipd list
usbipd bind --busid 7-1
usbipd attach --wsl --busid FedoraLinux-43

Возвращаемся в Fedora и загружаем CoreOS на micro SD. Первая команда выведет список дисков, среди которых будет и флешка.

fdisk -l
coreos-installer install -a aarch64 -s stable -i example.ign /dev/sde
FCOSEFIPARTITION=$(lsblk /dev/sde -J -oLABEL,PATH |
                   jq -r '.blockdevices[] | select(.label == "EFI-SYSTEM") | .path')
mkdir /tmp/FCOSEFIpart
sudo mount $FCOSEFIPARTITION /tmp/FCOSEFIpart
sudo rsync -avh --ignore-existing --chown 0:0 \
        /tmp/RPi4boot/boot/efi/ /tmp/FCOSEFIpart/
sudo umount $FCOSEFIPARTITION

Перед извлечением флешки я на всякий случай отключал её от WSL. Но даже после этого иногда возникали проблемы, и первая попытка установки могла оказаться неудачной.

usbipd detach --busid 7-1

Запуск

Теперь флешку можно вставить в Raspberry Pi и запустить. Если всё прошло успешно, CoreOS проинициализируется и предложит авторизоваться под пользователем. Процесс инициализации занимает некоторое время, я следил за ним, подключив Raspberry Pi к монитору. Сразу после запуска будет доступен SSH. Затем я подключился и смонтировал диск.

fdisk -l
fdisk /dev/sda
: n
: p
: 1
: enter
: enter
: w
mkfs -t ext4 /dev/sda1
mkdir /mnt/share
mount -t ext4 /dev/sda1 /mnt/share
vi  /etc/fstab
> /dev/sda1 /mnt/share ext4 defaults 0 0