Miért
Ahogy az a címből minden bizonnyal kiderült, jelen írás témája egy Raspberry Pi felhasználása otthoni serverként.
Nem szeretném túlzottan hosszúra nyújtani a bevezetőt, így nem mennék bele abba hogy mi is az a Raspberry, aki nem ismerné az itt a Logouton is találhat remek cikkeket erről a hasznos kis eszközről.
Bevezetés jelleggel inkább arról ejtenék pár szót hogy miért is döntöttem egy Raspberry beüzemelése mellett.
A "kiinduló állapot" a következőképpen néz ki:
- adott egy MacBook és egy Linuxos notebook
- egy TV a hálószobában (WiFin csatlakozik a routerhez)
- a TV-re kötve egy WD TV Live HD médialejátszó (kábelen keresztül van a routerre kötve)
- a WD lejátszóra kötve 2 db külső HDD
A WD-n custom firmware fut, amin próbálkoztam torrent klienst futtatni de az eredmény nem volt igazán stabil, így a pl. Big Buck Bunnyt a MacBookon töltöttem le, majd innen FTP-n keresztül a lejátszóra kötött HDD-re, ahonnan aztán végül megnéztük.
Ez több szempontból is problémás megoldás. Egyrészt macerás folyton azt figyelgetni a notebook torrent kliensén hogy visszaosztottam-e már annyit hogy szégyenérzet nélkül törölhessem, másrészt a külső HDD-k hangosak és a rajtuk levő LED-ek brutálisan világosak voltak (ez utóbbin végül professzionális módszerrel enyhítettem, lásd még: "szigszalag").
Ráadásul ha már ott a multimédiás képességekkel felvértezett TV, akkor miért ne használnám azt, így nem kellene a WD lejátszó és a TV távirányítójával zsonglőrködnöm.
Ez volt tehát a kiindulási helyzet amit informatikailag szofisztikáltabbra szerettem volna alakítani.
És ha már nekiállok, akkor felmerültek egyéb igények is, mint például backup.
Megjegyzés: a screenshotok a Google képkeresőjéből származnak
Első lépések
Egy kis utánajárás és tesztelés után úgy döntöttem az én igényeimnek egy Raspberry Pi is megfelel, nincs szükség a szintén letesztelt nagyobb teljesítményű BeagleBoardra. Az első időkben egy régebbi Raspberry modellt használtam, amit később egy B+ változatra cseréltem egyrészt a több USB csatlakozó, másrészt a duplaméretű memória miatt, és a kicsit optimalizált fogyasztás sem jön rosszul.
Hogy megszabaduljunk az éjjel fülünkbe zúgó vinyóktól, a Raspberry Pi (hadd ne írjam ki a továbbiakban hogy "Raspberry Pi", hívjuk csak parasztosan málnának, jó?) és minden rácsatlakoztatni kívánt ketyere (konkrétan 3 db külső HDD) beköltözött a másik szobába. Amúgy is itt van a kábelmodem, így közvetlenül összeköthetem őket egy hálókábellel.
A málnára elég sok oprendszer elérhető, én személyes ízlés és a régi jó tapasztalatok okán az Arch Linuxot választottam, de szinte biztos hogy a használt szoftverek mindegyike az elterjedt Raspbian rendszeren is elérhető vagy legalábbis kis erőfeszítéssel felrakható. Felkerült tehát rá egy "szűz" Arch, ezzel végre életre kelt és megjelent a kis házi hálózatomon a málna.
Mivel a rendszerről alapesetben hiányzik néhány általam megszokott és kedvelt tool, ezeket felraktam (pl. Vim, screen, mc), de a továbbiakhoz nem szükségesek.
Megosztások
A kényelmes filetransfer érdekében beállítottam egy FTP servert is:
pacman -S vsftpd
systemctl enable vsftpd
A /etc/vsftpd.conf file-ban a következő sorok elejéről kitöröltem a # karaktert, igy a málnán létrehozott felhasználókkal be lehet lépni rá FTP-n keresztül:
local_enable=YES
write_enable=YES
local_umask=022
Az FTP server indítása:
systemctl start vsftpd
A rádugott HDD-ket látni is kell valahol, ehhez kell egy könyvtár, ahova aztán mountolva lesz (létrehozható például egy szimpla mkdir /mnt/store paranccsal). Hogy ez újraindítás után is automatikusan megtörténjen, be kell írni a /etc/fstab file-ba. Biztos ami az alapon UUID alapján, így az sem fog bezavarni ha valami miatt mashova dugdossuk a vinyókat:
UUID=23abb9ad-148b-4ca8-a80c-60cd8913b504 /mnt/store auto defaults 0 0
A ls -l /dev/disk/by-uuid/ parancs kilistázza a csatlakoztatott vinyókat (plusz a rendszert tartalmazó SD kártyát is) és a hozzájuk tartozó UUID-ket.
A HDD-n érdemes valamilyen standard Linuxos filerendszert használni (nálam ext3 és ext4 is van).
Hogy mindenféle eszköz (Linuxos notebook, médialejátszó, etc) kényelmesen lássa a HDD-k tartalmát, ezért Samba megosztást is beállítottam:
pacman -S samba avahi
Az első szerkesztendő config file a /etc/avahi/services/samba.service:
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">Malna</name>
<service>
<type>_smb._tcp</type>
<port>445</port>
</service>
</service-group>
A másik pedig a /etc/samba/smb.conf:
[global]
workgroup = WORKGROUP
netbios name = MALNA
server string = MALNA
log file = /var/log/samba/log.%m
max log size = 50
map to guest = bad user
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
wins support = yes
local master = yes
dns proxy = no
[public]
path = /mnt/store
public = yes
only guest = yes
writable = yes
Végül elindítjuk:
systemctl enable avahi-daemon
systemctl enable smbd
systemctl start avahi-daemon
systemctl start smbd
Ezek után már csak neki kellett állni szépen sorban minden tervezett funkcionalitás fokozatos megvalósításának.
Torrent, multimédia
Feladat: a hálóban levő TV-n nézni a másik szobában a málna által letorrentezett filmet
Választott megoldás: Transmission torrent kliens, minidlna DLNA-server
Hogyan működik
1) letöltöm az első oldalon már linkelt torrent file-t tetszőleges gépen
2) megnyitom a málnán futó Transmission oldalát egy böngészőben
3) a letöltött torrent file-t feltöltöm a böngészőn keresztül (alternatív megoldásként le sem töltöm a torrent file-t, hanem ugyanitt közvetlenül a linket adom meg rá)
4) a TV-n kiválasztom forrásként a málnán futó DLNA servert, majd azon a filmet, elindítom, nézem, örülök. A film csak akkor jelenik meg a listában ha a letöltés befejeződött, tehát nem kell attól tartani hogy a közepénél leáll a nem teljesen letöltött film.
5) ha megnéztem a filmet és a letöltött adatmennyiség többszörösét visszaosztottam, akkor:
5a) ha annyira tetszett a kövér nyúl hogy meg akarom tartani helyileg is a filmet, hogy bármikor megnézhessem, akkor a Transmission felületén eltávolítom a torrentet, majd bejelentkezek ssh-n, és a filmet átmozgatom a "megtartott filmek" könyvtárába
5b) a Transmission webes felületén törlöm a torrentet
Megvalósítás
Csomagok felrakása és a daemonok engedélyezése:
pacman -S transmission-cli minidlna
systemctl enable transmission
systemctl enable minidlna
A Transmissiont elindítva létrehozza a config file-ját, amit aztán módosítani kell az igényeknek megfelelően, ehhez viszont előtte le is kell állítani különben felülírja a változtatásokat (illetve menet közben is rá lehet venni a config újraolvasására, de ne bonyolítsuk...)
systemctl start transmission
systemctl stop transmission
A /var/lib/transmission/.config/transmission-daemon/settings.json file kell nekünk, itt a legegyszerűbb megoldás egy házi hálózatnál minden ip-címet engedélyezni az "rpc-whitelist" sor módosításával:
"rpc-whitelist": "*.*.*.*",
Ezzel bármelyik, ugyanazon a hálózaton levő gépről elérjük a torrent klienst.
Be kell állítani a letöltési könyvtárat is, amit persze már létrehoztunk kézzel a HDD-n:
"download-dir": "/mnt/store/Download",
Ahhoz hogy a letöltött Big Buck Bunnyt meg is lehessen nézni a TV-n vagy bármilyen, DLNA-t kezelni képes lejátszón (például wc-n üldögélve telefonon :D) be kell állítani a DLNA servert is, mégpedig a /etc/minidlna.conf szerkesztésével. A legfontosabb megmondani neki hogy hol találja a letöltött file-okat:
media_dir=/mnt/store/Download
Ha alapból nem úgy van, mindenképp javasolt a user= kezdetű sort is kikommentelni (egy # karaktert biggyesztve a sor elé), ellenkező esetben jogosultsági problémákat tapasztaltam az inotify-nál, így pedig nem fogja észrevenni ha befejeződik egy letöltés.
Érdemes lehet még a notify_intervalt rövidebbre venni és a friendly_name-et átírni ízlés szerint.
A végére azért indítsuk is el őket:
systemctl start transmission
systemctl start minidlna
Fejlesztési lehetőségek
1) Hasznos lenne ha a TV-n külön DLNA serverként látnám a frissen letöltött, és a "későbbre eltett" filmeket is.
2) Feliratos filmnél ha a letöltött csomagban nincs benne, jelenleg megkeresem számítógépről a megfelelő feliratfile-t, majd azt vagy letöltöm a málnán ssh-n belépve, vagy a számítógépen letöltve ftp-n felmásolom. Ez elég kényelmetlen, elképzelhető hogy csinálok erre is valami könnyen kezelhető megoldást.
A Raspberry korlátai miatt "fullra kihajtva" megjelenhetnek problémák, ez konkrétan annyit jelent hogy 1080p film DLNA-n keresztül lejátszva már szaggat HA ezzel egyidőben erős hálózati/HDD tevékenységet is végez a szerkezet. A 720p még így is problémamentes, illetve normális terhelés mellett az 1080p is tökéletesen működik.
Backup, avagy az Időgép
Feladat: Automatikus backup a MacBookról Time Machine-en keresztül
Választott megoldás: netatalk, afp
Hogyan működik
Egyszer kell a Time Machine menüben kiválasztani a málnát, onnantól teljesen automatikusan működik minden
Megvalósítás
Csomagok felrakása és a daemon engedélyezése:
pacman -S netatalk
systemctl enable netatalk
Létrehozunk egy könyvtárat a Time Machine mentéseknek, aztán jöhet a lényeg, a /etc/afp.conf file szerkesztése:
[Global]
mimic model = TimeCapsule6,106
log level = default:warn
log file = /var/log/afpd.log
hosts allow = 196.168.1.0/24
[TimeMachine]
path = /mnt/store/tmachine
valid users = felhasznalonev
time machine = yes
[Shared Media]
path = /mnt/store
valid users = felhasznalonev
A felhasznalonev usert létre kell hozni a useradd felhasznalonev paranccsal, és adjunk neki egy jelszót a passwd felhasznalonev parancsot kiadva.
A netatalk elindítása után (systemctl start netatalk) a Mac már elvileg képes használni a frissen almásított málnát. Ha nem látja, akkor egy kis erőszak segíthet: a Findert elindítva a Go->Connect To Server... ablakba írjuk be az afp://malnaipcime címet, és a frissen létrehozott felhasználónevet használva létre is jön a kapcsolat. Innentől már csak ki kell választani a Time Machine menüben hogy ezt az eszközt használja a mentésre.
Hogy egy esetleges vinyóhalál ne pusztítsa el a mentéseimet beállítottam egy közönséges cronjobot, ami minden hétfő hajnalban átmásolja a teljes Time Machine mentést egy másik HDD-re:
00 4 * * 1 cp -r /mnt/share/backup/tmachine /mnt/share/store
Fejlesztési lehetőségek
Ha eluralkodik rajtam a paranoia, esetleg lehetne cloudos tárhelyre szinkronizálni a mentést (ehhez persze kell keresni olyat, ahol 100GB nagyságrendű adatot tárolhatok)
Házikönyvtár
Feladat: A megvásárolt e-bookjaimat biztonságban tudni, bármelyik eszközömről kényelmesen elérni
Választott megoldás: Calibre server
Hogyan működik
A málnán futó Calibre server felületét böngészőből elérem, ott tudok a könyvek között keresni, bármelyiket letölteni.
Mivel az adatbázist tartalmazó könyvtárat a Time Machine-nál beállított hálózati megosztáson keresztül is elérem, a MacBookon futó Calibre közvetlenül képes kezelni így új könyvek hozzáadása is egyszerű.
Ha az e-book olvasómról (ez konkrétan egy Kobo Aura HD) nézek rá a beépített böngészőjén keresztül, automatikusan a mobilos felület jön be, innen könnyedén letölthető a kiválasztott könyv, amit utána azonnal olvashatok is a készüléken.
Megvalósítás
pacman -S calibre
Mivel a calibre csomag nem hoz magával systemd configot ahhoz hogy rendszerszolgáltatásként lehessen használni, ezt kézzel kell létrehozni: készítsük el a /usr/lib/systemd/system/calibre.service file-t a következő tartalommal:
[Unit]
Description=Calibre server
[Service]
ExecStart=/usr/bin/python2 /usr/bin/calibre-server --with-library=/mnt/store/library
[Install]
WantedBy=multi-user.target
Ahogy látszik, a Calibre a már kész adatbázist a megadott helyen (itt /mnt/store/library) várja. Ezt létrehozhatjuk akár a hálózati megosztáson keresztül, akár a számítógépen létrehozott kész könyvtárat ide másolva.
Ezután már csak a Calibre server engedélyezése és elindítása van hátra:
systemctl enable calibre
systemctl start calibre
És a málna 8080-as portján már látható is a Calibre.
Zene
Feladat: Zenehallgatás a böngészőn keresztül irányítva
Választott megoldás: mpd, ympd
Hogyan működik az ympd webes felületén keresztül kényelmesen lehet kezelni a lejátszó listáját, indítani/leállítani a zenét, mint bármilyen lejátszónál.
Megvalósítás
Zenehallgatásra a pehelysúlyú mpd-t választottam ami könnyen felrakható a csomagkezelőből. Problémásabb azonban a böngészőből elérhető felület, azzal egy picit dolgozni kell, vagyis a forráskódot le kell fordítanunk. Szerencsére ehhez az Arch minden segítséget megad, így nem lesz túl nagy feladat.
pacman -S mpd cower base-devel cmake git
systemctl enable mpd
cower -d ympd
cd ympd
Az ympd könyvtárában a PKGBUILD file-t kicsit módosítani kell hogy engedje az ARM procira történő fordítást, ehhez az arch= sort a következőre kell változtatni:
arch=('i686' 'x86_64', 'armv6h')
Ezután már jöhet a tényleges fordítás és telepítés:
makepkg --asroot
pacman -U ympd*.tar.xz
Az mpd-nek meg kell mutatni hogy hol vannak a zenefile-ok, ehhez a /etc/mpd.conf-ba kell beszúrni a következő sort:
music_directory "/mnt/share/elements/music"
Nálam az mpd-nek volt egy kis jogosultsági problémája, így biztos ami az alapon hozzuk létre az adatbázisát tartalmazó könyvtárat "engedékeny" jogokkal:
mkdir -p /var/lib/mpd
chmod 777 /var/lib/mpd
Az ympd-nek pedig egy portot kell választani, mivel az alapértelmezett 8080-ason már ott üldögél a Calibre. Az /usr/lib/systemd/system/ympd.service file-ban a WEB_PORT utáni 8080-at írjuk át például 8081-re. Végül az ypmd engedélyezése és elindítása után készen is vagyunk.
systemctl enable ympd
systemctl start ympd
Webserver
Ugyan nem nélkülözhetetlen, de hasznos ha nem kell megjegyezni vagy minden böngészőben bookmarkolni a málnán futó különböző szolgáltatások portjait. Ehhez csináltam egy nagyon egyszerű kis "frontpage"-et ahol egy-egy gombra kattintva a megfelelő szolgáltatás oldala nyílik meg ha a málna ip-címét beírom egy böngészőbe. Ehhez egy nagyon-nagyon egyszerű, de a célra tökéletesen elegendő mini-webservert, az nwebet választottam (először egy még ennél is sokkal primitívebb megoldásként a netcat-et használtam, de az kicsit macerásabb volt kliens oldalról)
Na ez a screenshot kivételesen az én gépemen készült
cower -d nweb
pacman -S lynx
cd nweb
A PKGBUILD file-ban ismét módosítani kell az arch sort az mpd-nél látott módon. Aztán fordítás és telepítés:
makepkg --asroot
pacman -U nweb*.tar.xz
Az nweb a Calibrehoz hasonlóan nem hoz magával systemd config file-t, így ezt is kézzel kell létrehoznunk, vagyis egy /usr/lib/systemd/system/nweb.service file-t a következő tartalommal:
[Unit]
Description=nweb http server
[Service]
Type=forking
ExecStart=/usr/bin/nweb 80 /mnt/store/www
[Install]
WantedBy=multi-user.target
A /mnt/store/www könyvtárba kelleni fog egy index.html, nálam ez így néz ki:
<html>
<head>
<script type="text/javascript">
var ip = location.host;
function changePort(port)
{
window.location = "http://" + ip + ":" + port;
}
</script>
</head>
<body bgcolor=#aaaaaa>
<h1 align=center>Welcome to Rusty!</h1>
<div align=center>
<button onclick="changePort(8081)">YMPD Music player</button>
<button onclick="changePort(8080)">Calibre library</button>
<button onclick="changePort(9091)">Torrent client</button>
</div>
</body>
</html>
A szokásos engedélyezés és indítás:
systemctl enable nweb
systemctl start nweb
Apróságok
A fentieken túl még néhány apróságot elvégez a kis málna.
SVN
Minden éjjel frissíti a VPS-emen futó SVN serverről a forrásokat, hogy tutira legyen egy helyi változat is. Ez egy teljesen alap cronjob:
30 3 * * * svn up /mnt/share/backup/svn
hd-idle
A time machine backupra használt külső HDD, egy 1TB-s WD MyBook hajlamos nagyon gyorsan leállni ha nem nyúl hozzá valaki sűrűn. Ez a gyakorlatban úgy néz ki hogy a kb. óránként végzett Time Machine mentések miatt minden alkalommal felpörög, megcsinálja a mentést majd elalszik, ami nem túl egészséges a motorjára nézve. Ezért felraktam a hd-idle nevű kis toolt, ami a beállított tétlenségi idő előtt nem engedi elaludni.
pacman -S hd-idle
systemctl enable hd-idle
A /etc/conf.d/hd-idle file-ban meg kell adni a beállításokat, nálam:
START_HD_IDLE=true
HD_IDLE_OPTS="-i 0 -a sdc -i 7200 -l /var/log/hd-idle.log"
Így csak kétórányi tétlenség után áll le, ez bőven több mint két Time Machine mentés közti idő, de ha nem vagyok otthon vagy éppen alszom, akkor nem pörög feleslegesen.
ssh átjáró
Mivel jó lenne néha az otthonomon kívülről is elérni a kis málnát, de a szolgáltató csak LAN-os ip címet ad, ezért azt a megoldást választottam hogy egy reverse ssh tunnelt nyitok a VPS-em felé, és azon keresztül már bárhonnan elérhető.
Ehhez a málnán egy screen-en belül a következő parancsot használom:
ssh user@server.hu -R 2222:localhost:22 /home/user/keepalive.sh
A serveren levő keepalive.sh semmi mást nem csinál mint félpercenként kiír egy pontot. Enélkül (még a -N kapcsoló használatával is) idővel egyszerűen "elhalt" a kapcsolat.
UPDATE:
Google Drive
Az "abszolút biztonság", és a notebookon történő helyspórolás érdekében felraktam a málnára a grive nevű kis programot, ami közönséges Google Drive szinkronizációt végez. Mivel nem daemonként fut, ez is crontabból került végrehajtásra minden éjjel (az svn backuppal egyidőben).
Így a megosztáson keresztül elérhető könyvtárban mindig ott látható minden ami a Drive-ra fel lett töltve, sőt az oda rakott file-okat a málna automatikusan fel is tölti (az én esetemben csak a letöltést engedélyeztem, tekintve hogy a grive hivatalosan még beta állapotú, nem szeretnék a saját bőrömön megtapasztalni egy csúnya bugot sem).
Távlati tervek
Jelenleg itt tartok a kis málnával. Vannak még terveim amiket a kellő szabadidő és elszántság megérkezése esetén meg is szeretnék csinálni. Ilyen például a családi fotók/videók automatikus szinkronizálása valamilyen felhős tárhelyre. Az apró csavar az, hogy mivel elég sok helyet foglalnak, így egyetlen ingyenes tárhelyre sem tudom egyszerűen csak felmásolni, így valami okos átméretezésre szükség lesz. Amúgy is csak sokadik védvonalnak kell az egyébként használt backupok mögé, tehát nagyon kicsi az esély arra hogy minden más, nagyfelbontású anyag egyszerre elvesszen, de azért csak jó ha van ilyen is. Éljen a paranoia!
Ha valakinek van még ötlete hogy mit lenne érdemes megcsinálni a kényelmem növelése érdekében, vagy egyszerűen csak a geek-faktort növelendő, nyugodtan írjátok le kommentben, akárcsak a felmerülő kérdéseket.