=====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/