RockPro64: загрузка ОС с SATA, ставим Arch ARM

Если проблемы U-boot с RockPro64 исправят, то возня описанная ниже станет не нужна и этот пост сократится раз в 5. Сейчас думаю проще воспользоваться этой форкой, там заявлена поддержка SATA (я не пробовал). Я выбрал повозиться с апстримом чтобы заслать баги разработчикам.

Сейчас в master ветке U-boot есть 2 проблемы с RockPro64 - не стартует SATA и не идёт загрузка после коммита 3ae64582, виснет сразу после загрузки ядра. Про загрузку написал разработчикам, вроде заинтересовались. Если починят, будет иметь смысл репортить SATA. Под это есть патч с кодом PCIe взятым из OpenBSD, но описание не внушает уверенности.

Поэтому пока схема использования апстримового U-boot довольно мудрёная:

  • U-boot записан на SD карту
  • В USB2 порт воткнута флешка с ext4 разделом для хранения /extlinux/extlinux.conf, ядра и initrd
  • Все остальные разделы (/, swap, /home и т.п.) - на SATA устройствах

Команды ниже - для Arch Linux или Parabola на amd64. В репозиториях арча есть пакеты для кросс-компилирования - ставим:

# pacman -S arm-none-eabi-gcc aarch64-linux-gnu-gcc dtc

Качаем последний релиз ATF (сейчас arm_cca_v0.3), удаляем бинарные файлы и собираем:

curl -O https://codeload.github.com/ARM-software/arm-trusted-firmware/tar.gz/refs/tags/arm_cca_v0.3
tar -xzf arm_cca_v0.3
cd arm-trusted-firmware-*
find . -name '*.bin' -exec rm -vf '{}' \;
make realclean
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=rk3399
cd ..

Теперь можно собрать U-boot 2020.07, для загрузки с SD нужен файл u-boot-rockchip.bin:

curl -O https://ftp.denx.de/pub/u-boot/u-boot-2020.07.tar.bz2
tar -xjf u-boot-2020.07.tar.bz2
cd u-boot-2020.07/
export BL31=../arm-trusted-firmware-*/build/rk3399/release/bl31/bl31.elf
export CROSS_COMPILE=aarch64-linux-gnu- CC=aarch64-linux-gnu-gcc
make mrproper
make rockpro64-rk3399_defconfig
make

Удобный для начала работы дистрибутив - Armbian. Скачиваем Bullseye вариант отсюда, записываем на SD карту (здесь /dev/sde, нужна минимум 4Gb):

unxz -dc Armbian_21.08.1_Rockpro64_bullseye_current_5.10.60.img.xz > /dev/sde

Загружаем с неё RockPro64, качаем ArchLinux ARM "Generic" root tarball отсюда. Делаем 20Gb раздел на SATA диске, монтируем в /mnt, распаковываем туда:

tar -xzf ArchLinuxARM-aarch64-latest.tar.gz -C /mnt

Дальше писал по памяти, если что-то не работает - пишите, поправлю. Монтируем раздел на USB флешке в /mnt_usb, переносим туда загрузочные файлы с раздела на SATA чтобы U-boot их увидел.

mkdir /mnt_usb/boot_arch
cp -r /mnt/boot/* /mnt_usb/boot_arch/
lsblk --fs -oMOUNTPOINTS,UUID|awk '/^\/mnt_usb\s/ {print $2}' # UUID_USB, см. ниже

Добавляем в /etc/fstab: 1) монтирование USB раздела и 2) bind директории boot_arch на флешке в /boot чтобы при обновлениях pacman записывал туда новые версии ядра+initrd:

UUID=<UUID_USB> /bootUSB ext4 defaults,noatime 0 1
/bootUSB/boot_arch /boot    none    bind 0 0

Добавляем загрузку Арча в extlinux/extlinux.conf на USB флешке, подставляя PARTUUID раздела на SATA из вывода lsblk -o+PARTUUID:

timeout 60
menu title Muh boot options
default Arch_Linux_SSD
label Arch_Linux_SSD
  kernel /boot_arch/Image
  append root=PARTUUID=111111-1111-111 nowatchdog console=ttyS0,115200n8 console=tty1 rootwait rw earlyprintk LANG=en_US.UTF-8
  fdtdir /boot_arch/dtbs
  initrd /boot_arch/initramfs-linux.img

Записываем U-boot на SD карту, если есть лучше взять вторую, оставив на всякий случай рабочую c Armbian. В этом примере SD карта - /dev/sde, проверьте у себя с помощью lsblk:

dd if=/dev/zero of=/dev/sde bs=4096 count=2600
dd if=/path/u-boot-git/u-boot-rockchip.bin of=/dev/sde seek=64
sync

Вставляем в RockPro64, загружаемся - должны увидеть версию U-boot 2020.07 и загрузку Арча с SSD. Добавляем pacman ключи Arch ARM как описано здесь.

Качаем пакет linux-libre-firmware из Parabola репозитория, ставим вместо linux-firmware:

RemoteFileSigLevel = Never # in /etc/pacman.conf
pacman -U https://www.parabola.nu/packages/libre/x86_64/parabola-keyring/download
RemoteFileSigLevel = Required DatabaseOptional # in /etc/pacman.conf
pacman -U linux-libre-firmware-1:1.4-1-any.pkg.tar.xz

Я добавил -mtune=cortex-a72.cortex-a53 в CFLAGS в /etc/makepkg.conf чтобы GCC оптимизировал пакеты собранные makepkg под эту архитектуру.

Что работает:

  • Bluetooth (наушники)
  • Видео 1080p
  • WiFi 802.11n в режиме Access Point
  • Раздача интернета по 1 Gbit/s кабелю обжатому кроссовером
  • Battle for Wesnoth: большой проект, отсутствует в репозиториях - решил собрать, посмотреть взлетит ли на aarch64. Взлетело сразу: asp export wesnoth ; cd wesnoth ; sed -i 's/^arch=.*/arch=(aarch64)/' PKGBUILD ; makepkg, профит. Спасибо разработчикам за портабельный код. Написал на форум Arch ARM, если руки дойдут сделаю PR на github на добавление Wesnoth в репозиторий Community, вроде несложно.
  • Весь софт который я обычно использую

Дальше - linux-libre. Либо собирать под Арч/aarch64, либо переходить на дистрибутив где уже упаковано.