Raspberry Pi, LibreELEC, Kodi i zdalne logi via rsyslog
Spis treści
Parę lat temu, gdy pojawił się u mnie w domu bezprzewodowy router WiFi, postanowiłem wgrać na niego
linux'a w postaci OpenWRT. Pierwszym kluczowym elementem konfiguracyjnym tego urządzenia było
przesłanie jego logów systemowych przez sieć do mojego laptopa, tak by wszystkie
zarejestrowane komunikaty zostały wyświetlone na konsoli mojego komputera z zainstalowanym Debianem.
W ten sposób nie musiałem się co chwila logować na router po SSH (czy też przez panel webowy), by
sprawdzić czy aby na pewno z tym urządzeniem jest wszystko w porządku. Teraz, po nabyciu Raspberry
Pi 4B i wgraniu na niego LibreELEC z preinstalowanym Kodi, mam dokładnie to samo zadanie do
zrealizowania. Trzeba zatem znaleźć sposób na przesłanie wszystkich logów generowanych przez system
LibreELEC do demona rsyslogd , który jest uruchomiony na zdalnej maszynie.
Instalowanie demona rsyslogd w LibreELEC
By można było w ogóle myśleć o przesyłaniu logów systemowych przez sieć, potrzebne jest stosowne
oprogramowanie zainstalowane na dwóch maszynach, między którymi te logi mają być przekazywane. W
LibreELEC nie da się standardowo nic zainstalować, bo tutaj nie ma żadnego menadżera pakietów
pokroju apt-get/aptitude czy dpkg . A poza tym, główny system plików LibreELEC i tak jest
tylko do odczytu, więc nic na niego nie udałby się nam wgrać. Niemniej jednak, w repozytorium
LibreELEC dla Kodi jest stosowny addon o nazwie Rsyslog, który (jak nazwa może sugerować)
dostarcza demona rsyslogd . By zainstalować ten dodatek, trzeba przejść kolejno do Dodatki =>
Zainstaluj z repozytorium => LibreELEC Add-ons => Usługi i wybrać pozycję Rsyslog :

Gdy już zainstalujemy dodatek Rsyslog , przechodzimy do jego konfiguracji.
W zasadzie to mamy do wyboru konfigurację demona rsyslogd z poziomu Kodi oraz ręczne dostosowanie
pliku rsyslog.conf przy pomocy SSH. Jeśli potrzebujemy korzystać z nieco bardziej zaawansowanych
rzeczy oferowanych przez rsyslogd , to musimy aktywować w konfiguracji dodatku opcję Configure rsyslog.conf manually . Nam jednak wystarczą opcje oferowane przez panel Kodi, bo bez problemu za
ich sprawą jesteśmy w stanie przesłać logi na zdalny serwer. Jedyne co musimy określić to adres IP
maszyny docelowej, jej port oraz protokół. Ja korzystam z protokołu TCP zamiast UDP. Zatem cała
konfiguracja dodatku Rsyslog wygląda u mnie mniej więcej tak:

Jako, że ja chciałem przesłać wszystkie logi mojego Raspberry Pi 4B do zdalnego serwera, toteż
zaznaczyłem opcję Log journal and kernel . Bez tej opcji, jedynie logi Kodi by było przesyłane,
przez co niekoniecznie w tych logach mogą być zawarte interesujące nas ewentualne komunikaty błędów.
Z opcją Log journal and kernel będziemy mieli dokładnie taki sam wgląd w logi LibreELEC, co w
przypadku zalogowania się na ten system po SSH.
Konfiguracja demona rsyslogd na Debianie
Jedną końcówkę połączenia mamy już skonfigurowaną. Trzeba teraz jeszcze skonfigurować drugą
końcówkę, na której jest zainstalowany Debian. W przypadku tej maszyny, pakiet rsyslog jest
zainstalowany i raczej powinien być on domyślnie instalowany na Debianie. Jeśli jednak nie
posiadamy tego pakietu, to trzeba go będzie doinstalować ręcznie. Konfiguracja demona rsyslogd na
Debianie jest przechowywana w pliku /etc/rsyslog.conf i ten plik trzeba będzie poddać edycji.
Na początek odszukujemy ten poniższy blok kodu i usuwamy z jego dwóch ostatnich linijek znak # :
#################
#### MODULES ####
#################
module(load="imtcp")
input(type="imtcp" port="514")
W ten sposób włączymy w rsyslogd możliwość otrzymywania pakietów sieciowych z wykorzystaniem
protokołu TCP na port 514 .
Następnie dodajemy reguły, które przekierują komunikaty otrzymane od Raspberry Pi 4B do osobnego pliku na dysku oraz do urządzenia FIFO:
###############
#### RULES ####
###############
if $fromhost-ip startswith "192.168.1.239" then -/dev/log-rpi
if $fromhost-ip startswith "192.168.1.239" then -/var/log/rpi.log
& stop
Pierwsza reguła ma za zadanie dopasować źródło komunikatów z określonego adresu IP (ten adres
192.168.1.239 jest przypisany Raspberry Pi 4B) i przesłać logi do urządzenia /dev/log-rpi .
Druga reguła jest bardzo podobna, z tą różnicą, że te logi powędrują do pliku /var/log/rpi.log .
W ostatniej linijce mamy zaś & stop , który to zakończy dalsze przetwarzanie komunikatów z
Raspberry Pi 4B.
Ja mam u siebie konsolę na pulpicie, do której mamy podpiętych szereg urządzeń FIFO, dlatego też i w tym przypadku to urządzenie jest wykorzystane. Jeśli nie mamy u siebie takich egzotycznych konfiguracji, to tę pierwszą regułę możemy zwyczajnie skasować i zostawić jedynie logowanie komunikatów otrzymanych od Raspberry Pi 4B do pliku. Jeśli jednak chcielibyśmy przesyłać logi do urządzenia FIFO, to trzeba to urządzenie pierw stworzyć w poniższy sposób:
# mkfifo /dev/log-rpi
# chown root:systemd-journal /dev/log-rpi
# ls -al /dev/log-rpi
prw-r--r-- 1 root systemd-journal 0 2020-08-25 19:35:26 /dev/log-rpi|
By to urządzenie FIFO było tworzone automatycznie przy starcie Debiana, to do pliku
/etc/tmpfiles.d/rsyslog.conf (jeśli nie mamy tego pliku, to naturalnie trzeba go utworzyć)
dodajemy poniższą linijkę:
# Type | Path | Mode | UID | GID | Age | Argument
p /dev/log-rpi 0640 root systemd-journal - -
Po skonfigurowaniu demona rsyslogd , trzeba zrestartować jeszcze usługę rsyslog.service :
# systemctl restart rsyslog.service
W tej chwili demon rsyslogd powinien zacząć nasłuchiwać połączeń sieciowych, co możemy sprawdzić
przy pomocy netstat :
# netstat -napletu | grep rsyslogd
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 0 19920925 1810230/rsyslogd
tcp6 0 0 :::514 :::* LISTEN 0 19920926 1810230/rsyslogd
Jak widać demon rsyslogd nasłuchuje połączeń na porcie 514 protokołu TCP na każdym lokalnym
adresie zarówno IP jak i IPv6.
Test przesyłania logów między LibreELEC a Debianem
Pozostało nam już w zasadzie przetestować czy obie końcówki połączenia działają. Odpalamy zatem
Raspberry Pi 4B i patrzymy czy demon rsyslogd z LibreELEC jest w stanie się połączyć z demonem
rsyslogd w Debianie:
# netstat -napletu | grep rsyslogd
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 0 19920925 1810230/rsyslogd
tcp 0 0 192.168.1.150:514 192.168.1.239:38308 ESTABLISHED 0 21887301 1810230/rsyslogd
tcp6 0 0 :::514 :::* LISTEN 0 19920926 1810230/rsyslogd
W netstat pojawił się dodatkowy wpis, którego stan wskazuje na ESTABLISHED . Zatem połączenie
sieciowe między LibreELEC a Debianem zostało poprawnie nawiązane.
Sprawdźmy jeszcze czy plik /var/log/rpi.log się rozrasta:
# ls -alh /var/log/rpi.log
-rw-r----- 1 root adm 74K 2020-08-25 19:52:30 /var/log/rpi.log
Wartość 74K wskazuje na aktualny rozmiar tego pliku. Wiemy więc, że komunikaty są logowane do
pliku /var/log/rpi.log .
Jeśli dodatkowo stworzyliśmy sobie urządzenie FIFO, to w czasie rzeczywistym możemy podglądać te komunikaty na konsoli, tak jak to widać na poniższym zrzucie ekranu:
