I wanted to self-host a server to sync my contacts across devices. One that uses
an open protocol (CardDAV) and easy to self-host.
Radicale was very easy to set up on Arch, but
davx5 client (Android) couldn't sync the changes.
Xandikos works flawlessly in combination with nginx. The
package is in Arch repos but required some assembly:
# (as root)
mkdir /var/lib/xandikos /etc/xandikos
chown xandikos:xandikos /var/lib/xandikos
useradd -U -s /usr/bin/nologin xandikos
htpasswd -c /etc/xandikos/htpasswd usr
/etc/systemd/system/xandikos.service
, ugly hack here because Xandikos can't
use an existing socket:
[Unit]
Description=Xandikos CalDAV/CardDAV server
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
RuntimeDirectory=xandikos
RuntimeDirectoryMode=0770
User=xandikos
Group=http
ExecStart=/usr/bin/xandikos \
-d /var/lib/xandikos \
--current-user-principal=/usr \
-l /run/xandikos/socket
ExecStartPost=/usr/bin/sh -c 'sleep 2; chmod g+w /run/xandikos/socket'
Restart=on-failure
KillSignal=SIGQUIT
Type=simple
/etc/nginx/sites-available/xandikos
:
upstream xandikos {
server unix:/run/xandikos/socket; # nginx will need write permissions here
}
server {
server_name home-dav;
# Service discovery, see RFC 6764
location = /.well-known/caldav {
return 307 $scheme://$host/user/calendars;
}
location = /.well-known/carddav {
return 307 $scheme://$host/user/contacts;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://xandikos;
auth_basic "Login required";
auth_basic_user_file /etc/xandikos/htpasswd;
}
listen 192.168.2.1:8099;
}
Add this line to nftables ruleset
to allow sync on LAN only:
tcp dport 8099 ip saddr { 192.168.2.0/24 } ip daddr 192.168.2.1 accept comment "Accept connections to xandikos behind nginx"
To sync to local directories I use
vdirsyncer, on Android - davx5 (in
F-Droid repos).
If U-boot problems with RockPro64 are fixed then most of this cumbersome setup
will become unnecessary and this article will get 5 times shorter. Right now it
might be easier to use this fork, author
claims SATA support (I didn't try it). I chose upstream U-boot to send bugs to
developers.
Currently the master
branch of U-boot has 2 problems with RockPro64 - SATA
doesn't start and the board is not booting since commit 3ae64582,
hangs after loading the kernel. Wrote to developers about the
second issue, there seems to be some interest. If it's fixed I'll report SATA
issue next. There is a
patch with PCIe code from OpenBSD,
but the description is not encouraging.
So right now booting upstream U-boot is rather tricky:
- U-boot is on SD card
- There is a small flash drive in USB2 port with ext4 filesystem to store
/extlinux/extlinux.conf
, kernel and initrd
- Other partitions (
/
, swap
, /home
etc) are on SATA devices
Commands below are for Arch or Parabola on amd64. There are cross-compilation
packages in Arch repos - let's install them:
# pacman -S arm-none-eabi-gcc aarch64-linux-gnu-gcc dtc
Download latest ATF release (currently arm_cca_v0.3
), remove binary files and
build:
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 ..
Now we can build U-boot 2020.07, to boot from SD we need 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
A convenient distro to get started is Armbian. Download Bullseye from
here, write it to SD card
(/dev/sde
here, needs to be 4Gb or larger):
unxz -dc Armbian_21.08.1_Rockpro64_bullseye_current_5.10.60.img.xz > /dev/sde
Boot RockPro64 with it, download ArchLinux ARM "Generic" root tarball from
here. Create a 20Gb
partition on SATA device, mount it to /mnt
, unpack Arch there:
tar -xzf ArchLinuxARM-aarch64-latest.tar.gz -C /mnt
I wrote the following steps from memory, please contact me if something doesn't
work, I'll try to fix it. Mount the filesystem on USB flash drive to /mnt_usb
,
move boot files from SATA to USB so that U-boot can see them:
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, see below
Add entries to /etc/fstab
: 1) to mount the filesystem on USB and 2) to bind
the boot_arch
directory on USB filesystem to /boot
so that pacman
uses it
during kernel upgrades:
UUID=<UUID_USB> /bootUSB ext4 defaults,noatime 0 1
/bootUSB/boot_arch /boot none bind 0 0
Add Arch boot entry to extlinux/extlinux.conf
on USB filesystem using PARTUUID
of SATA partition (get it with 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
Write U-boot to SD card, if you have a spare one (any size) - use it so you will
still have a working one with Armbian. In this example SD card is /dev/sde
,
check it on your PC with 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
Insert it into RockPro64, power on - if all went well you'll see U-boot 2020.07
and Arch will boot from SSD. Add pacman
Arch ARM keys as described here.
Download linux-libre-firmware
from Parabola repo, install
it instead of 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
I added -mtune=cortex-a72.cortex-a53
to CFLAGS
in /etc/makepkg.conf
so
GCC optimizes makepkg
-built packages for this CPU architecture.
What works:
- Bluetooth (headphones)
- 1080p video playback
- WiFi 802.11n Access Point
- Sharing Internet connection via 1 Gbit/s cable (crossover)
- Battle for Wesnoth: it's a big project and it's
not in Arch ARM repos, so I decided to build it, see if it'll work on aarch64.
Works like a charm:
asp export wesnoth ; cd wesnoth ; sed -i
's/^arch=.*/arch=(aarch64)/' PKGBUILD ; makepkg
, profit. Thanks to Wesnoth
developers for portable code. Made a thread about it on Arch ARM, if I have
time will make a github PR to add Wesnoth to Community repo, it looks simple
enough
- All the usual software I use on a home PC
Next on the list -
linux-libre. I'll have to
either build it for Arch/aarch64 or switch to a distro where it's already
packaged. This will take some time.
Если проблемы 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, либо переходить на дистрибутив где уже упаковано.
I've been using a libreboot-ed ThinkPad T500, but USB
system started to show its age - only one port works, and it's a random one on
each boot.
Started to look for a replacement with these requirements:
- Supported by Libre/Free Software - linux-libre, upstream U-boot without
vendor blobs
- Ability to install OS to SATA/NVMe drive. SD/eMMC/USB are too
slow/unreliable
- Sharing Internet connection via twisted pair and WiFi
- Working Bluetooth
- Upstream software: linux-libre, U-boot. I don't want to install forks of
outdated versions.
Main candidates:
- Blackbird, POWER9
CPU. Has a BMC, all firmware sources are available. Firmware for built-in
NIC is in development, described here. Drawbacks are price and the fact
that you can't order it (logistical problems due to covid, according to
Talospace)
- MNT Reform. ARM64 laptop, no vendor blobs except
16KiB one to initialize RAM. Shipping next year
- RockPro64 - RK3399 SBC, 4G RAM,
good-enough CPU (2xA72 + 4xA53), PCIe x4, 4xUSB, 1xRJ-45 (1 Gbit/s). Gentoo
approves
- Gigabyte GA-G41M-ES2L for
libreboot treatment
- HoneyComb LX2
aarch64, 16 A72 cores, a full-fledged motherboard. More expensive than
RockPro64 (it has much more functionality). I couldn't find if it requires
vendor blobs, and it's not in U-boot repo (by name)
I chose RockPro64. Pine64 sells a SATA card for it but it uses an ASM chip.
Judging by forum threads and my experience ASM chips are not reliable - my
mPCIe card on ASM1061 works with HDD but not SSD for some reason. Found this
card - 4 ports, Marvell
88SE9215
chip, supported by Linux. Bluetooth and WiFi adapters that do not require
vendor blobs were found on H-node (an excellent
resource).
Resulting BOM:
- SATA controller PCE4SAT-M02 (PCIe)
- Bluetooth controller Asus BT400 (USB)
- WiFi D-Link DWA-126 (USB) - Access Point mode
- Ethernet D-Link Dub-E100 100Mbit/s (USB) - for ISP connection
- 2 USB hubs
- Chipset cooler Zalman ZM-NB32J - fits, here is an old review
- Aluminum box 155x85x120 mm
- Regular PC PSU (I already had one)
DIY power connector Molex -> DC barrel:

Bolted a small aluminum plate to SATA card to hold the cables:


More photos:






Next up: installing U-boot and Arch Linux ARM.
Довольно давно использовал дома ThinkPad T500 прошитый свободным libreboot-ом, но у него начала барахлить USB система - работает
только 1 порт, причём при каждой загрузке разный.
Начал искать замену с такими требованиями:
- Максимальная поддержка свободным софтом - ядро linux-libre, U-boot апстрим без
вендорских блобов
- Установка ОС на SATA/NVMe диск. Запускать с SD/eMMC/USB слишком
медленно/проблематично
- Возможность раздавать интернет через витую пару и WiFi
- Рабочий Bluetooth
- Софт из апстрима: linux-libre, U-boot. Не хочу ставить форки старых версий.
Основные кандидаты:
- Blackbird, CPU на
архитектуре POWER9. Есть BMC, все исходники доступны. Только прошивку
встроенной сетевой карты делают энтузиасты, ситуация описана тут. Недостатки - цена, недоступность
для заказа (пишут проблемы с логистикой из-за covid)
- MNT Reform. Ноутбук на ARM64 , не требует
бинарных блобов кроме 16KiB для инициализации RAM. Производство ещё не
поставили на поток
- RockPro64 - SBC на RK3399, 4G RAM,
нормальный CPU (2xA72 + 4xA53), PCIe x4, 4xUSB, 1xRJ-45 (1 Gbit/s). Gentoo
одобряет
- Gigabyte GA-G41M-ES2L под
прошивку libreboot-ом
- HoneyComb LX2
aarch64, 16 A72 ядер, полноценная материнка. Дороже RockPro64 (другой класс),
не нашёл нужны ли вендорские блобы, в U-boot репозитории её нет
Остановился на RockPro64. Pine64 продаёт к нему SATA карту, но она на ASM чипе.
Судя по отзывам и опыту они ненадёжные - у меня mPCIe карта на ASM1061
работает с HDD, но не с SSD. Нашёл вот эту на 4 порта, на чипе Marvell
88SE9215
, линуксом поддерживается. Адаптеры Bluetooth и WiFi, не требующие блобов,
подобрал на H-node (отличный ресурс).
В результате получился такой набор:
- SATA controller PCE4SAT-M02 (PCIe)
- Bluetooth controller Asus BT400 (USB)
- WiFi D-Link DWA-126 (USB) - есть режим Access Point
- Ethernet D-Link Dub-E100 100Mbit/s (USB) - для провайдерского шнурка
- 2 USB хаба
- Радиатор чипсетный Zalman ZM-NB32J - подошёл по размеру, старый обзор
- Алюминиевый корпус 155x85x120 мм
- Обычный компьютерный блок питания (уже был)
DIY питание от Molex разъёма к бочонку:

К SATA карте привинтил алюминиевую пластину как держатель кабелей:


Ещё фото:






В следующем посте - установка U-boot и Arch Linux ARM.