=====Fedberry Linux Betriebsystem mit dem Raspberry PI 2 für einen Ubiquiti Network Controller=====
**November 2017**
Aufgabe:
Ubiquiti Network Controller für die Wlan Infrastruktur von Haus und Büro auf einem Raspberry PI 2 aufsetzen, zusätzlich sollen auf dem System noch weitere Monitorring Script auf Python 3 Basis laufen.
Da auch [[raspberry:redsleeve_quick_install|redsleeve]] nicht mehr so frisch ausschaut, für das nächste Projekt auf http://fedberry.org/#about gesetzt.
Warum Raspberry PI 2? Ist noch übrig .-). Warum überhaupt selber bauen?
Im Prinzip kaufmänisch völlig uninteressant, Ubiquiti UniFi Cloud Key [Controller, 1x Gbit LAN, 1GB RAM] kostet um die 80€ und ist dann auch auto update fähig.
Die Bastel Lösung unter einem RedHat Derivat kann das hier nicht bieten, da die Package Funktionalität von Debian von der Unifi Software für das AutoUpdate verwendet wird.
Ablauf Installation Basis-System:
* Download Image von https://github.com/fedberry/fedberry/releases ( aktuelle 25.1, fedberry-xfce-25.1.raw.xz)
* Check des MD5 Hash (Wert "67eadcd298796292af4bec2383c01587" ) das auch alles korrekt ist
* Auspacken des Images mit [[http://www.7-zip.org/|7-zip]]
* Schreiben des Images auf eine Micro SD Card mit [[https://sourceforge.net/projects/win32diskimager/win32diskimager|]] (starten als Admin!)
* SD Karte in den Raspberry
* Anschluss Raspberry Strom und Netz
* System konfigurieren
* Statische IP Adresse vergeben
* Java 8 installieren
Ablauf Ubiquiti UniFi Controller
* Software im RPM und im Debian Format organisieren
* Software im RPM Format installieren
* Scripte und Libs aus dem Debian Package ausleihen
* Versuch den Autostart mit dem Java Demon Runner hinzubekommen (erstmal gescheitert ...)
==== Basis System konfigurieren ====
Wird die Version XFCE & LXQt release images gewählt, wird doch noch eine Tastatur und Monitor benötigt.
Siehe auch erst hier => https://github.com/fedberry/fedberry
Alternativ bei einer Minimal Version:
Nach dem Einschalten wird eine dynamische IP Adresse vergeben, diese aus der IP Umgebung ermitteln z.b. über den DHCP Server oder über einen Netzwerkscan, hier sind die Tools von [[https://mobaxterm.mobatek.net/|MobaXterm]] sehr praktisch, SSH session auf die gefundene IP Adresse mit z.b. MobaXterm aufbauen, root , PWD=fedberry
===XFCE & LXQt release===
Über die graphische Oberfläche:
* Zeitzone einstellen
* Netzwerk und Hostname
* Root Password setzen
* Admin User anlegen, hier den Hacken "Administrator" setzen, damit der User auch das Sudo Recht hat!
* Am System anmelden
Nach der Grundkonfiguration kann nun wieder entspannt weiter über die Console gearbeitet werden, ssh Session auf den den Server als Admin user starten, evtl. nächstes mal die Version ohne graphische Oberfläche wählen, braucht dann wohl auch weniger Platz.
===Updates einspielen===
sudo yum update
===X beim boot ausschalten===
su -
rm /etc/systemd/system/default.target
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
To switch back:
rm /etc/systemd/system/default.target
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
===IPV6 disablen===
Bei mir wollte dann immer der Unfi auf der IP V6 Adresse laufen, daher IPV6 ausgeschaltet, allerdings ist mir das auf dieser Distribution so nicht so recht gelungen, nach dem Start des Java Programms hat dieses doch wieder auf IPV6 Sockets gehorcht. hmm…
vi /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
sysctl -w net.ipv6.conf.all.disable_ipv6=1
systemctl restart network
#Fedora??
vi /etc/modprobe.d/ipv6.conf
install ipv6 /bin/true
options ipv6 disable=1
# Hosts uncomment localhost entry
vi /etc/hosts
# ::1 localhost6.localdomain6 localhost6
#
vi /etc/sysconfig/network-scripts/ifcfg-eth0
IPV6_AUTOCONF=no
IPV6INIT=no
# nun sollte es auch nach einem Boot klappen
reboot
=== Java 8 einrichten===
Download from http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
File dk-8u151-linux-arm32-vfp-hflt.tar.gz
cp jdk-8u151-linux-arm32-vfp-hflt.tar.gz /srv
tar xvfz jdk-8u151-linux-arm32-vfp-hflt.tar.gz
cd /usr/lib/jvm
mv /srv/jdk1.8.0_151/ .
cd /usr/lib/jvm/jdk1.8.0_151/bin
./java -version
/usr/sbin/alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_151/bin/java 18151
# Versionen anzeigen
/usr/sbin/alternatives --display java
# Version einstellen
/usr/sbin/alternatives --config java
# Version auswählen
# testen
java -version
java version "1.8.0_151"
===nmon - Htop für das Performance Monitoring===
Siehe auch http://hisham.hm/htop/
yum install htop
siehe auch http://nmon.sourceforge.net/pmwiki.php?n=Site.Download
nmon16b_arm.tar.gz
wget http://sourceforge.net/projects/nmon/files/nmon16b_arm.tar.gz
tar xvfz nmon16b_arm.tar.gz
chmod 777 nmon16b_arm_raspian
cp nmon16b_arm_raspian /sbin/nmon
----
==== Unifi Software installieren ====
===Unfi User ===
groupadd -g 1100 unifi
useradd -u 1101 -g unifi unifi
mkdir /var/lib/unifi
mkdir /var/log/unifi
mkdir /var/run/unifi
chown -R unifi:unifi UniFi/
chown -R unifi /var/lib/unifi /var/log/unifi /var/run/unifi
=== Mongo DB Server===
yum install mongodb-server
# Verzeichnisse anlegen
mkdir /srv/mongodb
mkdir /var/log/mongodb
# config Datei anlegen
vi /etc/mongodb.conf
# See http://www.mongodb.org/display/DOCS/File+Based+Configuration for format details
# Run mongod --help to see a list of options
bind_ip = 127.0.0.1
quiet = true
dbpath = /srv/mongodb
logpath = /var/log/mongodb/mongod.log
logappend = true
# Vorerst manuell starten mit
/usr/bin/mongod --config /etc/mongodb.conf
# Autostart muss dann noch eingerichtet werden!
=== Unifi Software===
Für Fedberry bzw. Redhat Linux Derivate steht keinen direkteren Download zur Verfügung.
Aber in einem inoffiziellen Repostitory gibt es eine Variante für Linux auf X86
# Ein dnf install http://dl.marmotte.net/rpms/redhat/el7/x86_64/unifi-controller-5.6.22-1.el7/unifi-controller-5.6.22-1.el7.src.rpm
# klappt wegen falscher Architektur nicht
# RPM direkt verwendet
wget http://dl.marmotte.net/rpms/redhat/el7/x86_64/unifi-controller-5.6.22-1.el7/unifi-controller-5.6.22-1.el7.src.rpm
rpm -ivh --ignorearch unifi-controller-5.6.22-1.el7.x86_64.rpm
#Rechte vergeben
chown -R unifi:unifi /opt/UniFi
cd /opt/UniFi
cat Readme.txt
# hmm, mal sehen ob das dann auch sauber so läuft ...
===Unifi Software starten ===
cd /opt/UniFi
#Port und IP Adresse einstellen
# Sonst horcht die Anwendung nicht auf der IP4 Adresse!
vi /opt/UniFi/data/system.properties
portal.http.port=8880
portal.https.port=8843
system_ip=192.168.1.210
unifi.http.port=8080
unifi.https.port=8443
#Starten mit :
java -jar lib/ace.jar start
# in einer zweiten Session prüfen ob das auch geklappt hat:
netstat -tlpn
#Firewall erstmal ausschalten
systemctl list-unit-files --state=enabled | grep firewall
systemctl stop firewalld.service
# Besser die richtigen Regeln eintragen!
systemctl disable firewalld.service
Nun kann im Browser die Unifi Oberfläche aufgerufen werden http:\\:8080.
Wizard durcharbeiten bzw. hier bereits das Backup einspielen.
=== Einstellungen vom alten Controler (Softwareversion) retten ===
Im nächsten Schritt will ich dann versuchen das Backup von meinem "Software" Kontroller auf dem neuen "Hardware" Kontroller zu aktivieren.
Über Settings/Maintaince ein Backup herunterladen und im neuen Kontroller wieder einspielen.
----
----
==== Feintuning ====
Bei der inoffiziellen Variante fehlen z.B. die Autostart Skripte, die Debian Variante lässt sich zwar nicht nach RPM umwandeln aber auspacken, d.h. wir können das auch manuell zusammensetzen und damit evtl. sogar eine Auto Update fähige Variante erhalten. Hierzu mit Alien das DB Package ausgepackt.
!Achtung, ab jetzt wird es ein gebastel und etwas wirr .....!
=== Alien verwenden um das Debian Package zu analysieren==
yum install alien
cd /srv
wget http://dl.ubnt.com/unifi/5.6.22/unifi_sysvinit_all.deb
# alles auspacken in das RPM Format
alien --to-rpm unifi_sysvinit_all.deb --scripts -v --generate
# Wieder ein RPM Bauen
rpmbuild --buildroot=/srv/unifi-5.6.22 -bb unifi-5.6.22-10206.spec
#das läßt sich dann leider nicht so einfach einspielen da die Pfade komplett anders lauten
Nun haben wir aber alle Scripte aus dem Debian Package + den Code der Applikation und können das auch so installieren, bzw. die Start Skripte entsprechend umbauen.
Scripte übernehmen:
cd /srv/unifi-5.6.22_arm/usr/lib/unifi/bin
cp ubnt-apttool unifi.init /opt/UniFi/bin/
#anpassen
vi /opt/UniFi/bin/unifi.init
set_java_home () {
# hack add your acutal Java 8 Home directly
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.fc25.arm
return
...
BASEDIR="/opt/UniFi"
....
# nach
cd /srv/unifi-5.6.22_arm/lib/systemd/system
#Datei unifi.service anpassen
vi unifi.service
[Unit]
Description=unifi
After=local-fs.target remote-fs.target network-online.target
Wants=network-online.target
Conflicts=shutdown.target
[Service]
Type=forking
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
RemainAfterExit=yes
ExecStart=/opt/UniFi/bin/unifi.init start
ExecStop=/opt/UniFi/bin/unifi.init stop
ExecReload=/opt/UniFi/bin/unifi.init reload
[Install]
WantedBy=multi-user.target
# Datei nach /usr/lib/systemd/system/ kopieren
#save copy
mv /usr/lib/systemd/system/unifi.service /tmp
cp unifi.service /usr/lib/systemd/system/
systemctl enable unifi
Created symlink /etc/systemd/system/multi-user.target.wants/unifi.service → /usr/lib/systemd/system/unifi.service.
# /lib/lsb/init-functions nach installieren
yum install redhat-lsb-core
# jsvc - Java start as service
yum install apache-commons-daemon-jsvc
mkdir /var/lib/unifi
mkdir /var/log/unifi
mkdir /var/run/unifi
#https://serverfault.com/questions/643006/what-is-status-of-proc-and-how-do-i-call-it
# add to /lib/lsb/init-functions
vi /lib/lsb/init-functions
status_of_proc ()
{
local pidfile daemon name status OPTIND;
pidfile=;
OPTIND=1;
while getopts p: opt; do
case "$opt" in
p)
pidfile="$OPTARG"
;;
esac;
done;
shift $(($OPTIND - 1));
if [ -n "$pidfile" ]; then
pidfile="-p $pidfile";
fi;
daemon="$1";
name="$2";
status="0";
pidofproc $pidfile $daemon > /dev/null || status="$?";
if [ "$status" = 0 ]; then
log_success_msg "$name is running";
return 0;
else
if [ "$status" = 4 ]; then
log_failure_msg "could not access PID file for $name";
return $status;
else
log_failure_msg "$name is not running";
return $status;
fi;
fi
}
log_daemon_msg () {
# Dummy function to be replaced by LSB library.
echo $@
}
log_end_msg () {
# Dummy function to be replaced by LSB library.
if test "$1" != "0"; then
echo "Error with $DESCRIPTION: $NAME"
fi
return $1
}
#jetzt fehlt noch die Commons Demon jar .-(
# https://commons.apache.org/proper/commons-daemon/download_daemon.cgi
cd /srv/
wget http://mirrors.ae-online.de/apache//commons/daemon/binaries/commons-daemon-1.1.0-bin.tar.gz
tar xvfz commons-daemon-1.1.0-bin.tar.gz
cd /srv/commons-daemon-1.1.0
ln -s /srv/commons-daemon-1.1.0/commons-daemon-1.1.0.jar /usr/share/java/commons-daemon.jar
Leider start der Controller nicht sauber, keine echten Fehlermeldungen .. tippe auf ein Problem mit Pfaden bzw. Klassenpfaden.
Hmm, mal sehen ob sich die Mühe lohnt oder doch lieber kaufen...
Demnächst mehr (vieleicht ...)
----
==== Quellen ====
* http://www.lowefamily.com.au/2016/06/02/installing-ubiquiti-unifi-controller-5-on-raspberry-pi/2/