LibreELEC Raspberry Pi-n - SD kártya nélkül

ÚJ bejegyzés

Évek óta vagyok LibreELEC / Kodi felhasználó, szerintem az egyik legkényelmesebb és felhasználóbarátabb módja az otthoni filmnézésnek. Egyetlen probléma árnyékolta folyamatosan be az élményt: az SD kártya. A Raspberry Pi alapvetően egy microSD kártyáról bootol, ott tartja mindenét, viszont sajnos az SD kártyákat nem erre találták ki. Hiába vettem már a drágább Endurance kártyákat, akkor is legkésőbb 1-2 év után olyan hibák, jellemzően fagyások jelentek meg, amiket az SD kártya cseréje tudott csak megoldani. Ezt szerettem volna orvosolni.

A Pi4 szerencsére már tud hálózatról bootolni, otthon meg egyébként is fut egy PXE szerver, így kézenfekvő volt, hogy ez lesz a megoldás. Végül ez nagyon sokkal macerásabb volt, mint azt először gondoltam. Elsősorban mert egyetlen használható leírást sem sikerült fellelnem a neten és mert a temérdek félig használható leírást összegyúrva is olyan hülye hibák jöttek elő, amikre egyébként álmomban sem gondoltam volna, de végül sikerült.

Lássuk hogyan!

0. Mi kell az egészhez?
- Némi Linuxos, illetve hálózati ismeret mindenképp, enélkül nehezebb dolgod lesz
- PXE szerver - nem, az amúgy nem kell
- TFTP szerver
- NFS szerver
- egy SD kártya - de csak egy kicsit

PXE szerver azért nem kell, amiért SD kártya meg igen: a Pi-nek annyi egyedi hülyeség van a PXE kezelésében, hogy egyszerűen nem tudtam úgy paraméterezni a Mikrotik routeremben a DHCP szervert, hogy minden DHCP opció úgy legyen és olyan legyen, ami tetszik a Raspberry-nek. Elég sok leírás van erről, pl itt vagy a hivatalos kézikönyvben, de rengeteg szerencsétlenkedés és elpocsékolt idő után ráhagytam.
Cserébe az rPi EEPROM-jába is beégethetjük, hogy milyen IP-n keresse az indítófájlokat, ekkor egyáltalán nem érdekli, hogy a DHCP szerver mit ajánl neki, így végül ez lett a megoldás. Ez azért is jó, mert így nem kellett a meglévő és jól működő PXE szerveren semmit átállítani.

1. A Pi előkészítése
Tegyünk bele egy SD kártyát és telepítsük rá a LibreELEC-et, kész kedvenc kompatibilis op.rendszerünket, a Raspbiant. A parancssoros minimál változata bőven elég, mindössze néhány parancs erejéig lesz rá szükségünk.
sudo rpi-eeprom-update
sudo rpi-eeprom-config -e
Az első frissíti az EEPROM-ot, a másik megnyit egy szerkesztőt. Itt az [all] rész végére szúrjuk be a következő sort:
TFTP_IP=192.168.1.1
Ahol 192.168.1.1 a szerverünk IP címe. Elmented, kilépsz, újraindítod a Pi-t.
Ha ez megvolt, akkor még sudo raspi-config, a megnyíló kis programban Advanced Options -> Boot Order -> Network Boot (előbb a hálózat, aztán az SD kártya). Ment, kilép, esetleg újra is indíthatsz a vicc kedvéért, mindegy. Ha leállítottad a Pi-t, akkor kiveheted az SD kártyát, nincs rá szükség a továbbiakban. Legkésőbb ez a pont környékén érdemes a Pi-nek egy fix IP címet beállítani a routerünkben.

2. Szerver előkészületek
Kell két mappa, az egyik, amiben a op.rendszer lakik, itt vannak a bootoláshoz szükséges fájlok is, ezt nevezzük mondjuk sys-nek, illetve egy másik, amiben a felhasználói adatok lesznek, ez a storage.
A storage-al egyelőre nincs teendő, létezzen és legyen írható, ide mindent a LibreELEC telepítője fog létrehozni az első elinduláskor.
A sys-t viszont nekünk kell benépesíteni. Ehhez töltsük le a megfelelő - esetünkben a négyes Pihez való - img fájlt, amit normál esetben az SD kártyára írnánk. Kicsomagoljuk a gz-ből, mountoljuk és a tartalmát kimásoljuk a sys mappába

wget https://releases.libreelec.tv/LibreELEC-RPi4.aarch64-12.2.1.img.gz
gunzip LibreELEC-RPi4.aarch64-12.2.1.img.gz
sudo losetup -P /dev/loop101 LibreELEC-RPi4.aarch64-12.2.1.img

A megjelenő partíciók közül a LIBREELEC-et csatoljuk valahová és a tartalmát másoljuk a sys mappába.

Szükségünk lesz egy TFTP szerverre is, ami kiszolgálja a bootoláskor a Pi-t. Ezt mindenki ízlése szerint oldhatja meg, a lényeg, hogy a sys mappa a TFTP szerver gyökerében legyen szigorúan tftpboot néven.
Én ezt egy egyszerű Docker containerrel oldottam meg, alább a compose fájlja:
services:
  tftpd:
    image: alpine:latest
    restart: unless-stopped
    command: >      sh -c "apk add --no-cache tftp-hpa &&
      in.tftpd --foreground --listen --address 0.0.0.0:69 --secure /tftpboot -v -v --blocksize 1468"
   volumes:      - /mnt/docker/rpi_boot/sys:/tftpboot:ro
   ports:
     69:69
Mivel alacsony számú portot akarunk használni, így ennek root jog is kell. Egyéb más okból én az egészet kiszerveztem egy macvlan bridgebe, akkor nem kell a root.

TFTP-n valójában csak a bootoláshoz szükséges néhány fájlt tölti be, a lényeget NFS-en húzza be, ezért ezt a mappát a storage-al együtt kiajánljuk ott is. A szerveremen egyébként is futott egy natívan telepített NFS, így itt nem szórakoztam a Dockerrel.
/etc/exports fájlba:
/mnt/docker/rpi_boot/sys raspi_IP_cime/32(ro,sync,no_subtree_check)
/mnt/docker/rpi_boot/storage raspi_ip_cime/32(rw,sync,no_root_squash,no_subtree_check)
aztán exportfs -arv paranccsal indíthatjuk a megosztást.

A sys mappában egyetlen fájllal lesz dolgunk: a cmdline.txt-vel.
Ez alapból ki van töltve, nyugodtan töröljünk belőle mindent és tegyük be helyette ezt:

boot=NFS=szerver_IP_cime:/mnt/docker/rpi_boot/sys disk=NFS=szerver_IP_cime:/mnt/docker/rpi_boot/storage,nolock ip=dhcp console=tty0 quiet

Ezzel beállítjuk, hogy a két rendszerpartíciót hol keresse és megmondjuk, hogy dhcp-n kérjen IP-t (amit ugye fentebb fixáltunk). Ha valamit debugolni kellene, akkor vegyük ki a végéről a quiet paramétert, ekkor a LibreELEC logón felül a systemd megszokott bootüzeneteit is láthatjuk.

3. Boot
Ezen a ponton készen vagyunk, elindul a LibreELEC, lehet beállítani, az SD kártya sose fog elromlani, ha a szervereden rendszeresen biztonsági másolatot készítesz a storage mappáról, akkor újratelepíteni sem kell soha. Ha maga a Pi pusztul el, akkor az újjal elég az 1. pontot újrajátszanod, visszaadod neki a régi Pi IP címét és már kész is vagy.

4. A hiba
Én ezen a ponton már egy estémet elpazaroltam a DHCP szerver megfelelő beállítására, de arra lett megoldásom. Cserébe jött a következő hiba: amint átkerült a grafikus vezérlés a Linux kernelhez, a monitor kikapcsolt: nincs jel, lement standby-ba. Ennek a megoldására további két napom ment el.
Valamit biztosan elírtam, vagy a hálózati üzemmód miatt valamit máshogy kell csinálni - gondoltam én.
Összesen három fájlba nyúlkáltam bele:
- a cmdline.txt-ba, ez tartalmazza a bootoláshoz szükséges paramétereket
- a config.txt-be, ez szintén az induláshoz kell, itt már a képhez, hanghoz szükséges paramétereket tekergeted
- és a distroconfig.txt-be, amiben pl a grafikus drivert választhatod ki.
Ezeknek minden létező releváns és irreleváns paraméterét állítgattam, de egyik sem hozott eredményt. Tökmindegy mit, hogyan állítottam, mindig pontosan ugyanaz volt a végkimenetel: a monitor standby-ba váltott.

Annyira rohadtul idegesített a probléma, hogy még a hétvégi nagyszülői látogatásra is elvittem magammal, a mama úgyis elvan az unokájával, én meg elbütykölgetem ezt. Nem volt kedvem elölről beállítani a hálózatot, meg nyilván a szerveremet se vittem magammal, ezért inkább a VPN-t lőttem össze úgy, hogy a Pi ugyanúgy elérje az otthoni szervert. Kicsit lassabb, de úgy voltam vele, hogy mindegy, ráérek.
Mivel sokkal lassabban történtek a dolgok, így volt időm megfigyelni a boot alatt kiírt üzeneteket, pl itt:

Beolvassa a config.txt-t meg a distroconfig.txt-t, mellettük olvasható a mérete, de vicces, hogy pont 333 bájt... Várjunk csak, az a fájl a szerveren csak 322 bájt. Jobban megnézve a másik is eltér.
Átírok bennük egy-két dolgot, akkor is 333.
Kezdett gyanússá válni a dolog...
Visszamásoltam a gyári cmdline.txt-t, ami ugye SD kártyára van kitalálva, UUID-k vannak benne, nem NFS szerver elérés. Újraindítom a Pi-t, ugyanúgy NFS-ről indul... Hogy? :Y
Becachelte a TFTP szerver? Végülis azt a Dockert nem indítottam újra, mióta létrehoztam, mert mi a fenének?
Újraindítottam, és elindult a LibreELEC! :W :W

Azóta is gyönyörűen fut, innentől megspórolom évi 1 SD kártya megvásárlását :)

Egy kis disclaimer a végére: A cikk minden betűjét én fogalmaztam meg és pötyögtem be, de a hibakeresésben igénybe vettem a Google Gemini 3.1 Pro-t, ami felbecsülhetetlen segítséget nyújtott egyre obskúrusabb megoldási kísérleteivel, míg végül a legalapvetőbb és legrégibb rendszergazdai megoldás vezetett célra: hogy kikapcsoltam és vissza.

Még van hozzászólás! Tovább