З 2014 року я використовував розумний телевізор LGE webOS. Він працює цілком справно. Крім деяких набридливих дрібниць, як то нездатність програвання Classic FM. Спокусливим вибором приставки до телевізора здається Raspberry Pi 4 з 8 ГБ оперативної пам’яті. Але є одна біда: апаратне декодування відео працює тільки у 32-розрядній операційній системі, як може обслуговувати не більше, ніж 4 ГБ пам’яті. Йдеться не просто про компроміс між пам’яттю і процесорним часом, відео не програються плавно без апаратного декодування взагалі.

Raspberry Pi 4 Model B

То ось як я все налаштував майже без компромісів:

  • Встановив aarch64 Manjaro як основну операційну систему для використання всієї оперативної пам’яті
  • Встановив 32-розрядний Raspberry Pi OS контейнер, щоб запускати з повною апаратною підтримкою декодування VLC, Kodi, а також інші гостинці Raspberry Pi, такі як Wolfram Mathematica
  • Створив кілька сценаріїв оболонки, щоб спростити запускання програм із контейнера.

Хоч завантажити і запустити образ Manjaro дуже просто, потрібно детальніше описати, як запускати raspios. Спершу потрібно завантажити образ і скопіювати кореневу файлову систему у /var/lib/machines/raspios. Таблиця розділів не підтримується losetup. Тож доведеться дещо порахувати самостійно з допомогою таких команд:

fdisk -l
mount -v -o loop,offset=$((512*start2)) -t ext4 raspios.img /mnt
mount -v -o loop,offset=$((512*start1)),sizelimit=$((512*size1)) -t vfat raspios.img /mnt/boot

Тоді файли можна просто скопіювати у потрібне місце:

sudo rsync -raP /mnt/* /var/lib/machines/raspios/

Потрібно створити такі конфігураційні файли для systemd-nspawn, як це записано в репозиторії sakhnik/chbox:

./etc/polkit-1/rules.d/49-nopasswd_limited.rules
./etc/systemd/nspawn/raspios.nspawn
./etc/systemd/system/systemd-nspawn@raspios.service.d/override.conf

Після цього можна запустити машину командою machinectl start raspios. Запуск може зайняти трохи часу через повільну службу dhcpcd. Пізніше можна буде такі проблеми виявити з допомогою systemd-analyze blame і виправити. Можна сконфігурувати, щоб машина запускалася автоматично: systemctl enable systemd-nspawn@raspios. Справжня магія відбувається у сценарії запуску програм з контейнера. Тут можна визначити все, що потрібно у середовищі, щоб надати доступ до графіки і звуку основної системи:

pserver=/tmp/pulse-host/$USER

if ! (machinectl -q shell $USER@raspios /bin/mount | grep -q $pserver); then
    # Allow Arch accessing pulseaudio
    machinectl -q shell $USER@raspios /bin/mkdir -p $pserver
    machinectl bind --read-only raspios /run/user/$UID/pulse $pserver
fi

# Allow local connections from the container to the host X11 server
xhost +local: || true

machinectl -q shell \
    --setenv=DISPLAY=$DISPLAY \
    --setenv=PULSE_SERVER=unix:$pserver/native \
    $USER@raspios "$@"

Із визначеним раніше правилом polkit, ми можемо запускати деякі команди machinectl без підвищення прав. Таким чином, певні користувачі можуть отримувати доступ до оболонки контейнера і запускати графічні програми. Наприклад, щоб запустити VLC, який вміє виконувати апаратне декодування, ми можемо створити такий сценарій у /usr/local/bin/vlc:

#!/bin/bash -x

# Перетворити параметри в один текстовий рядок для інтерпретації.
input=
for i in "${@}"; do
    input="${input} ${i@Q}"
done

$HOME/bin/raspios.sh /bin/bash -xc "cd '$(pwd)'; vlc ${input}"

Ще один крок, можна скопіювати файл vlc.desktop з контейнера у основну систему і змінити рядки Exec= і TryExec=, щоб вели до /usr/local/bin/vlc.

VLC MMAL

Нарешті, можна створити сценарій оболонки, щоб слідкував за буфером обміну. Коли помічено посилання YouTube (або якоїсь іншої служби, підтримуваної youtube-dl), можна відразу його почати відтворювати. Таким чином з’явився скрипт yt-watch.sh. Тепер можна переглядати список відтворення і просто підсвітити бажане посилання або скопіювати його у буфер обміну, щоб за кілька секунд воно запустилося програватися.