Posts Tagged ‘Debian’

Montag, 23. Oktober 2017

Mit Debian Rescue eine CD mounten und auf einen USB-Stick kopieren

Unsere Wohnung ist (fast) eine DVD/CD-ROM-freie Zone. All unsere Endgeräte verfügen mittlerweile über kein optisches Laufwerk mehr.

Doch was nun, wenn man eine CD erhält, deren Daten man auf die Endgeräte laden möchte?

Man nimmt den herumliegenden Lenovo T400 zur Hilfe, welcher noch über ein CD-ROM-Laufwerk verfügt. Leider fehlt der guten Maschine die Festplatte, weil der auf AliExpress.com gekaufte Festplatten-Käfig sowie die Plasticschienen derzeit gerade aus China unterwegs in die Schweiz sind.

Damit man auf der Kiste also ein Linux zum Laufen kriegt, bootet man von einem USB-Stick, auf welchen die Netinst-Version von Debian 9.0 kopiert wurde. (tftp Netzwerk-Boot wäre noch ein Todo für die langen Winternächte).

Nach ein paar Kapriolen, um das Boot-Laufwerk auf USB umzubiegen, startet der Laptop mit der graphischen Installationsoberfläche. Dort wählt man unter Advanced Options den Rescue Modus ein (ohne graphische Benutzeroberfläche).

Nach viel zu vielen Dialogfenster hat man endlich eine Shell zur Hand. Sobald man die CD eingelegt hat, gibt man folgende Befehl ein:

# mkdir /mnt/cdrom
# mount /dev/cdrom /mnt/cdrom

Unter /mnt/cdrom sieht man mit ls -l den Inhalt der CD.

Hat man den zweiten USB-Stick, auf welchen die Daten der CD kopiert werden sollen, bereits bei der Anzeige des Debian-Menus eingestöpselt, könnte man dem Rescue-System in einem Dialog-Fenster sagen, diesen Stick ebenfalls bereits zu mounten.

Hat man dies nicht gemacht, sucht man sich zuerst einen weiteren freien USB-Port am Gerät und steckt den USB-Stick ein.

Anschliessend sucht man sich mit fdisk -l den Devicenamen sowie den Namen der Partition hervor. Gleichzeitig sieht man auch, ob der Stick mit FAT16/32 formatiert ist — ich konnte in meinem Versuch nur solche Sticks mounten.

In unserem Fall trägt die Partition des USB-Sticks den Pfad /dev/sdb1, deshalb mountet man den Stick so:

# mkdir /mnt/usb2
# mount /dev/sdb1 /mnt/usb2

Anschliessend wechselt man auf das CD-Laufwerk und verwendet — leider, da rsync in dieser Umgebung fehlt — folgenden Befehl, um die Daten auf den USB-Stick zu kopieren:

# cd /mnt/cdrom
# cp -R . /mnt/usb2

Doch OBACHT — nur weil der Kopierbefehl abgeschlossen ist, heisst das leider noch nicht, dass alle Daten bereits auf den USB-Stick geschrieben wurden:

USB write: delay between when Ubuntu says its done and it actually being done

Bevor man den USB-Stick ausstöpselt, muss man mit folgendem Befehl sicherstellen, dass auch wirklich restlos alle Daten auf den Stick geschrieben wurden:

# sync

Danach werkelt sync, was locker noch einmal ein oder zwei Minuten dauern kann.

Anschliessend kann man den Stick mit folgendem Befehl für die Entfernung bereitmachen:

# umount /mnt/usb2

Sobald dieser Befehl ausgeführt wurde, kann man den Stick aus dem USB-Port entfernen und auf einem Endgerät einstöpseln.

Tags: , , , , , , , , , , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 14. Oktober 2017

Wenn eth0 plötzlich enp1s0 oder ähnlich kryptisch heisst

Heute habe ich einen meiner Lenovo-„Server“ ausgetauscht: T400 raus, T420 rein. Dabei habe ich die SSD vom alten Server in den neuen Server eingebaut — bei Windows ein Ding der Unmöglichkeit, bei Linux: Läuft bei mir (fast).

Leider gab es ein gravierendes Problem, was die Downtime etwas verlängert und an meinem Ehrgeiz gekratzt hat: Die Netzwerk-Interfaces kamen nicht hoch, weshalb das Gerät ohne Intra- und Internet-Verbindung dastand.

Dank Laptop-Tastatur und -Bildschirm fiel immerhin das Debugging leicht.

Die Ausgabe von ifconfig zeigte, dass nur das Loopback-Interface vorhanden war. Was zum Teufel? Den Ethernet-Netzwerkanschluss sah ich mit meinen eigenen Augen vor mir, ein Kabel war eingesteckt und er blinkte auch fröhlich vor sich hin.

# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 184819  bytes 33744666 (32.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 184819  bytes 33744666 (32.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Mit dem Befehl ip a dann die Gewissheit, dass die erwarteten Schnittstellen auch tatsächlich da waren:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.10/24 brd 10.10.10.255 scope global enp1s0
       valid_lft forever preferred_lft forever
3: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff

Wie sich herausstellte, hiess auf dem T420 die Netzwerkschnittstelle nicht wie erwartet und üblich eth0, sondern enp1s0.

Der Grund (bitte nicht lachen): Predictable Network Interface Names. Verursacht durch die Datei /etc/udev/rules.d/70-persistent-net.rules, welche bei der Installation auf dem T400 erstellt worden war. Linux fand die darin definierten Interfaces auf dem T420 nicht mehr.

Die Lösung des Problems fand sich in einem Benutzerforum zum Thema How to rename network interface in 15.10?.

An der Originaldatei ...

...
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="11:11:11:11:11:11", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
...

... nahm ich folgende Anpassung vor:

...
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:00:00:00:00:00", NAME="eth0"
...

Wichtig: 11:11:11:11:11:11 ist die MAC-Adresse des Ethernet-Interfaces auf dem T400, 00:00:00:00:00:00 ist die MAC-Adresse des Ethernet-Interfaces auf dem T420. Als ich zuerst nur die MAC-Adresse geändert habe, kam die Netzwerkschnittstelle nicht hoch. Erst die Verschlankung des Eintrags auf die obige Form funktionierte: Nach dem nächsten Reboot war eth0 wieder vorhanden und alle Netzwerkdienste kamen hoch.

Tags: , , , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 14. Oktober 2017

Vergesst Intel NUCs und RPIs als Linux-Server zu Hause

Bei mir im Haushalt habe ich beides stehen:

Einen Raspberry Pi 3, der auf einem 22 Zoll-Bildschirm neben der Wohnungstüre hochkant ein Dashboard mit Zeitzonen, Abfahrten von Trams und Bussen, Temperaturen von Netatmo und Sense Peanut-Sensoren, Wetterprognosen, Twitter-Meldungen, Aktienkurse und Umrechnungskurse anzeigt (vor Jahren inspiriert durch einen Besuch bei Cyon in Basel).

Der Raspberry Pi ist (vermeintlich) günstig, benötigt aber ein Gehäuse und flinke SD-Karten. Immerhin läuft er mit dem Strom eines USB-Ports eines Bildschirms und hat mittlerweile Bluetooth und WLAN direkt eingebaut. Trotzdem ein Gefrickel, was die Installation und Konfiguration angeht. Mit nicht immer zeitnahem Software-Support. Wehe, wenn ein Software-Update fehlschlägt oder eine Fehlkonfiguration ausgerollt wird — viel Spass, die SD-Karte unter macOS zu mounten, die Konfigurationsdateien anzupassen, neu zu booten und das Spiel von vorne zu wiederholen, bis man den wirklich Schuldigen gefunden hat (der DAU an der Tastatur, meistens). Ausserdem ist die Hardware sehr schwachbrünstig (Chrome im Fullscreen lässt ihn fast austicken) und eignet sich nicht für jeden Einsatzzweck.

Andererseits einen Intel NUC, welcher primär Netzwerkaufgaben übernimmt: OpenVPN, DHCP, DNS und UniFi-Controller.

Performance-mässig nichts auszusetzen, aber auf Grund der Dimensionen nicht wartungsfreundlich. Und teuer, weshalb meistens Overkill für Standardaufgaben im heimischen Haushalt.

Mein Tipp: Wer die perfekte Hardware für einen Linux-Server sucht, halte nach älteren, gebrauchten Lenovo-Laptops Ausschau. Auf dem Gebrauchtmarkt kriegt man die Modelle X200, X201 und X220 (12 Zoll-Monitor) sowie T400 und T420 (14 Zoll-Monitor) zwischen 50 und 250 CHF.

Wieso ich auf diese Dinger schwöre?

  • x86 respektive x86_64 Prozessorarchitektur, auf welchem ein hundsnormales Linux ohne irgendwelche Handstände läuft
  • Ausgezeichneter Linux-Treibersupport — das neueste Debian ISO mit Etcher auf einen USB-Stick schreiben, Standardinstallation durschpielen, läuft (abgesehen von der leidigen Geschichte mit den WLAN-Treibern, aber solche Server betreibt man am Ethernet, nicht im WLAN).
  • Günstig
  • Man findet sie auf Ricardo, Tutti und Anibis wie Sand am Meer
  • Eingebaute Tastatur und Bildschirm — Debugging leichtgemacht (man wird nie einen Ersatzbildschirm und eine USB-Tastatur anschleppen müssen, wenn das Ding mal die Netzwerkverbindung verliert)
  • Stromsparend
  • Leise
  • Überhitzen nicht kaum
  • RAM und Festplatten lassen sich problemlos aufrüsten; entweder mit kleinen, flinken SATA SSDs oder aber mit fetten, aber etwas teureren Magnetplatten
  • Funktionieren zugeklappt und nehmen dann etwas mehr als die Fläche eines Papierstapels und die Höhe eines Buches (kein Tolstoi) ein
  • Haben die „USV“ (richtig geraten, die Laptop-Batterie) gleich eingebaut. Und wenn deren Kapazität wegen Memory-Effekten und dergleichen nachlässt: Günstig ersetzbar.
  • Docks findet man auf dem Gebrauchtmarkt auch viele (wobei ich immer noch nicht sicher bin, ob es besser ist, diese Dinger im oder ausserhalb des Docks zu betreiben)

Tags: , , , , , , , , , ,
Labels: IT, Shopping

Keine Kommentare | neuen Kommentar verfassen

Samstag, 1. Juli 2017

Debian von einem bootbaren USB-Stick installieren

Kürzlich ist Debian 9.0 Stretch erschienen. Zeit, meinen USB-Stick mit den neuesten Installationsdateien zu bestücken, um zukünftige Linux-PCs von diesem Stick aus aufsetzen zu können.

Hierzu habe ich mir das neueste Debian Netinst ISO (für „Netzwerk-Installation“) heruntergeladen, welches man hier findet:

Debian — Network install from a minimal CD

Anschliessend habe ich den USB-Stick an meinen Mac mini eingesteckt (muss zwingend vor dem Starten von unetbootin gemacht werden, da das Drop-Down der Zielvolumes sonst leer bleibt), das bereits installierte unetbootin gestartet, das ISO ausgewählt und danach auf den USB-Stick kopieren lassen. Fertig.

Mangels eines verfügbaren, leeren Geräts konnte ich den Stick noch nicht testen, dieses Prozedere hat aber mit Debian 8.3 (Jessie) bereits perfekt funktioniert.

Tags: , , , , , , , , , ,
Labels: IT, Linux

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 31. August 2016

MIBs unter Debian installieren

Da es sich dabei um teilweise Copyright-geschützte Werke handelt, stehen sie über die normalen Debian-Repositories nicht zur Verfügung. Nachfolgend ist erklärt, wie man diese trotzdem installiert.

/etc/apt/sources

Hier fügt man die non-free-Pakete hinzu:

...
deb 		http://debian.ethz.ch/debian/ testing main non-free
...
deb		http://debian.ethz.ch/debian/ stable main non-free
...

Danach aktualisiert man das Paketverzeichnis:

# apt-get update

Jetzt findet Debian das Paket snmp-mibs-downloader:

# apt-get install snmp-mibs-downloader

Sobald das Paket installiert ist, muss man das Bash-Script ausführen, welches unter /usr/bin/download-mibs liegt:

# download-mibs

Die (von mir nicht berührten) Konfigurationsdateien des Tools liegen unter /etc/snmp-mibs-downloader.

Das Script lädt allerlei MIBs herunter, deponiert diese zeitweile in /tmp und kopiert sie dann in das Verzeichnis /var/lib/mibs.

Interessanterweise finden sich gemäss einer E-Mail-Konversation auch unter /usr/share/snmp/mibs/ weitere MIBs. Ich denke aber, dass snmpwalk diese ignoriert.

/etc/snmp/snmp.conf

Damit snmpwalk diese MIBs nun auch wirklich interpretiert, muss noch die Konfigurationsdatei angepasst, das heisst konkret die Zeile mibs : auskommentiert werden:

# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
#mibs :

Quelle: SNMP Clients — Command line client applications

Um zu sehen, ob man richtig liegt, führt man am Besten den folgenden Testbefehl aus (vorausgesetzt, auf dem Server lauscht auch ein snmpd):

$ snmpwalk -c s1kr1t -v 1 localhost hrStorageTable
HOST-RESOURCES-MIB::hrStorageIndex.1 = INTEGER: 1
...

Auf einem System, welche diese MIBs nicht installiert hat, erhält man stattdessen folgende Fehlermeldung:

$ $ snmpwalk -c s1kr1t -v 1 localhost hrStorageTable
hrStorageTable: Unknown Object Identifier (Sub-id not found: (top) -> hrStorageTable)

Probiert man es mit der OID, klappt es — logischerweise:

$ snmpwalk -c s1kr1t -v 1 localhost .1.3.6.1.2.1.25.2.3
iso.3.6.1.2.1.25.2.3.1.1.1 = INTEGER: 1
...

Tags: , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 27. August 2016

Dem Raspberry Pi 3 chinesische Schriftzeichen beibringen

Seit einigen Woche betreibe ich mein heimisches Dashboard auf einem Raspberry Pi 3 und bin von der Performance begeistert! Sogar Chrome kriegt man nun als Installationspaket mitgeliefert.

Leider zeigte Chrome nach der Standardinstallation chinesische Schriftzeichen (bei den Währungsinfos) nicht an. Folgende Pakete rüsten chinesische Schriftzeichen nach:

# apt-get install fonts-arphic-bkai00mp fonts-arphic-bsmi00lp fonts-arphic-gbsn00lp

Quelle: Chinese Debian Mini Howto — 2. Installing Chinese Fonts

Tags: , , , , , , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 27. August 2016

SNMPd schreibt standardmässig kein PID-Datei mehr

Ein kürzlich erfolgtes Update des SNMPd-Pakets auf meinem Debian-Server hatte zur Folge, dass meine monit-Installation den Service fälschlicherweise als offline meldete.

Dies, weil monit nach der PID-Datei des SNMP-Daemons Ausschau hält, um dessen Prozess-ID auszulesen und auf Existenz zu prüfen. Bei Debian liegt diese Datei unter /var/run/snmpd.pid.

Folgendermassen re-aktivierte ich die PID-Datei:

/etc/systemd/system/multi-user.target.wants/snmpd.service

Vor der Anpassung …

...
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -f
...

… und nach der Anpassung:

...
ExecStart=/usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf -f -p /var/run/snmpd.pid
...

Anschliessend folgte noch ein Neustart des Daemons:

# systemctl stop snmpd
Warning: snmpd.service changed on disk. Run 'systemctl daemon-reload' to reload units.
# systemctl daemon-reload
# systemctl stop snmpd
# systemctl start snmpd

Und prompt meldete mir monit, dass der Service wieder online sei.

Tags: , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Montag, 16. Mai 2016

Wo befinden sich unter Debian die systemd Service-Dateien?

Unzählige dieser Service-Files finden sich in diesem Ordner:

/lib/systemd/system

Quelle: Making your package work with systemd sowie Getting Started With systemd on Debian Jessie

Das Service-File für MySQL habe ich hingegen hier gefunden:

/etc/systemd/system/mysql.service

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 27. März 2016

Sismics Docs installieren

Als Projekt für das Oster-Wochenende habe ich mir die Installation eines Dokumentenmanagementsystems (DMS) vorgenommen. Ziel ist es, die von mir seit Jahren gescannten Einkaufsbelege sauber in einem Archiv abzulegen und die Belege anschliessend mit meiner selbstprogrammierten Buchhaltungs-Applikation (PHP/MySQL) zu verknüpfen.

Nach einem wenig erfolgsversprechenden Umweg über Alfresco (zu gross, zu komplex, beansprucht zu viele Ressourcen) landete ich schlussendlich bei Sismics Docs, auch wenn dieses in einer Übersicht quelloffener DMS aus dem Jahr 2010 nicht erwähnt wird. Die Screenshots haben mich überzeugt, die Software zu installieren und herunterzuladen.

Da ich mich nicht mit Java-Applikationen auskenne, liefere ich hier eine Installationsanleitung. Sie richtet sich an Personen, welche ausreichend Linux-Erfahrung haben, anstelle aus der Java- aber aus der PHP/MySQL-Ecke kommen.

Repository auschecken

Als erstes legen wir uns eine lokale Kopie des Git-Repositories an:

# mkdir /usr/local/bin/sismics
cd /usr/local/bin/sismics
git clone https://github.com/sismics/docs.git .

To Dock or not to Dock

Unter den Dateien des Repositories finden sich Hinweise darauf, dass der Entwickler Docker zu verwenden scheint; u.a. existieren im Wurzelverzeichnis des Repositories die Dateien Dockerfile, build.sh und run-service.sh.

Ich konnte das Teil mit Docker aber nicht zum Laufen bringen. Dies aus mehreren Gründen:

i686

Der kräftigere meiner beiden Linux-Server, welcher im Elternhaus läuft, hat Debian i686 installiert, ein 32-bit Linux. Docker erfordert x86_64 (64-bit). Ein forciertes Upgrade tönt nach digitalem Selbstmord.

Die Bit-Architektur überprüfen kann man dies mit folgendem Befehl:

$ uname -m
x86_64

Docker installieren

Der Intel NUC, welcher in unserer Mietwohnung im Netzwerk hängt, hat ein x86_64 Linux am Laufen. Deshalb führte ich dort die Installation gemäss der offiziellen Anleitung aus.

Vorgängig musste ich noch herausfinden, welche Debian-Version ich installiert hatte:

# lsb_release -da
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 8.3 (jessie)
Release:	8.3
Codename:	jessie

Quelle: Check what Debian version you are running on your Linux system

Jessie! Anschliessend folgte ich der offiziellen Anleitung:

# apt-get install apt-transport-https ca-certificates
# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
# echo "deb https://apt.dockerproject.org/repo debian-jessie main" > /etc/apt/sources.list.d/docker.list
# apt-get update
# apt-get install docker-engine
# service docker start
# docker run hello-world

Bingo, Docker läuft.

Image nicht gefunden

Leider funktioniert die Generierung des Images für das Sismics Docs nicht:

# cd /usr/local/bin/sismics
# docker build -t sismics:0.1 .
Sending build context to Docker daemon 14.35 MB
Step 1 : FROM sismics/debian-java7-jetty9
Pulling repository docker.io/sismics/debian-java7-jetty9
Error: image sismics/debian-java7-jetty9 not found

Mit dem Switch -t definiert man das Paket und den Tag (vgl. Docker — build.

*seufz* Okey, dann halt kein Docker.

Manuelle Installation

Nun gut, da wir den Docker-Weg nicht beschreiten können, verlassen wir den Intel NUC und wenden uns wieder dem kräftigeren Server zu.

Pakete

Damit man schon nur die Testumgebung des DMS hockriegt, benötigt man folgende Pakete:

# apt-get install maven tesseract-ocr openjdk-7-jdk

Testinstallation bauen

Sobald die Pakete auf dem Rechner liegen, bauen wir uns die Testinstallation:

# cd /usr/local/bin/sismics/docs-parent
# mvn clean -DskipTests install
...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Docs Parent ........................................ SUCCESS [  7.114 s]
[INFO] Docs Core .......................................... SUCCESS [01:37 min]
[INFO] Docs Web Commons ................................... SUCCESS [ 47.086 s]
[INFO] Docs Web ........................................... SUCCESS [ 30.833 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:02 min
[INFO] Finished at: 2016-03-27T09:52:29+00:00
[INFO] Final Memory: 34M/94M
[INFO] ------------------------------------------------------------------------

Testinstallation starten

Nun starten wir die Testinstallation, um zu sehen, ob alles wie gewünscht funktioniert:

# cd /usr/local/bin/sismics/docs-web
mvn jetty:run
...
[INFO] Started ServerConnector@b40c2f{HTTP/1.1}{0.0.0.0:8080}
[INFO] Started @23372ms
[INFO] Started Jetty Server

Sobald diese Anzeige erscheint, können wir mit einem Web-Browser auf den Applikationsserver zugreifen:

10.1.2.3:8080/docs-web/src/

Das Standardpasswort des Administrator-Kontos lautet admin, wie eine Suche durch den Quellcode offenbart:

$ ack passw
...
docs-core/src/main/java/com/sismics/docs/core/constant/Constants.java
19:     * Administrator's default password ("admin").
...

Java Advanced Imaging

Die Web-Oberfläche funktioniert, man kann Dateien hochladen — doch ausgerechnet das erste PDF produzierte folgende Fehlermeldung im Log der Applikation:

Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed

Diese Tools installiert man sich folgendermassen:

$ cd /tmp
$ wget "https://install-java-jai-imageio.googlecode.com/files/install-java-jai-imageio"
# bash /tmp/install-java-jai-imageio

Quelle: Install Java Advanced Imaging ImageIO Tools on a Linux Machine

ACHTUNG: Bitte den Inhalt aller aus dem Netz heruntergeladenen Bash-Scripts gründlich prüfen, bevor man sie unter dem root-Account ausführt.

Weitere Pakete installieren

Rückblickendes Ziel meines Sonntagsprojekts war es, die Applikation unter dem Java-Applikationsserver Jetty persistent zum Laufen zu bringen. Hierzu bauen wir uns ein sog. war-File. Damit das auch sauber funktioniert, benötigen wir folgende Pakete:

# apt-get install nodejs npm
# ln -s /usr/bin/nodejs /usr/bin/node
# npm install -g grunt-cli

Wir sehen, ob alle nötigen Komponenten da sind, wenn folgende Befehle einen Wert zurückgeben:

$ which node
/usr/bin/node
$ which grunt
/usr/local/bin/grunt

Insbesondere das node-Binary ist zwingend nötig — bei den ersten Kompilationsversuchen erschien folgende Fehlermeldung …

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Docs Web 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ docs-web ---
[INFO] Deleting /usr/local/bin/sismics/docs-web/target
[INFO] 
[INFO] --- maven-antrun-plugin:1.8:run (default) @ docs-web ---
[INFO] Executing tasks

building:
     [exec] /usr/bin/env: ‘node’: No such file or directory
     [exec] Result: 127
[INFO] Executed tasks
[INFO] 
[INFO] --- maven-resources-plugin:2.7:resources (default-resources) @ docs-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 1 resource
[INFO] Copying 1 resource
...

… und ich endete mit einem nur halbwegs funktionsfähigen .war, weil bestimmte nodejs-Komponenten fehlten:

building:
     [exec] /usr/bin/env: ‘node’: No such file or directory
     [exec] Result: 127

Der oben angelegte Symlink löst dieses Problem:

...
building:
     [exec] Running "clean:dist" (clean) task
     [exec] 
     [exec] Running "ngmin:dist" (ngmin) task
     [exec] ngminifying src/app/docs/app.js, src/app/docs/controller/Login.js, src/app/docs/controller/Main.js, src/app/docs/controller/Navigation.js, src/app/docs/controller/document/Document.js, src/app/docs/controller/document/DocumentDefault.js, src/app/docs/controller/document/DocumentEdit.js, src/app/docs/controller/document/DocumentModalPdf.js, src/app/docs/controller/document/DocumentModalShare.js, src/app/docs/controller/document/DocumentView.js, src/app/docs/controller/document/DocumentViewActivity.js, src/app/docs/controller/document/DocumentViewContent.js, src/app/docs/controller/document/DocumentViewPermissions.js, src/app/docs/controller/document/FileModalView.js, src/app/docs/controller/document/FileView.js, src/app/docs/controller/settings/Settings.js, src/app/docs/controller/settings/SettingsAccount.js, src/app/docs/controller/settings/SettingsDefault.js, src/app/docs/controller/settings/SettingsGroup.js, src/app/docs/controller/settings/SettingsGroupEdit.js, src/app/docs/controller/settings/SettingsLog.js, src/app/docs/controller/settings/SettingsSecurity.js, src/app/docs/controller/settings/SettingsSecurityModalDisableTotp.js, src/app/docs/controller/settings/SettingsSession.js, src/app/docs/controller/settings/SettingsUser.js, src/app/docs/controller/settings/SettingsUserEdit.js, src/app/docs/controller/settings/SettingsVocabulary.js, src/app/docs/controller/tag/Tag.js, src/app/docs/controller/usergroup/GroupProfile.js, src/app/docs/controller/usergroup/UserGroup.js, src/app/docs/controller/usergroup/UserProfile.js, src/app/docs/directive/Acl.js, src/app/docs/directive/AuditLog.js, src/app/docs/directive/File.js, src/app/docs/directive/ImgError.js, src/app/docs/directive/InlineEdit.js, src/app/docs/directive/SelectRelation.js, src/app/docs/directive/SelectTag.js, src/app/docs/filter/Filesize.js, src/app/docs/filter/Newline.js, src/app/docs/filter/Shorten.js, src/app/docs/service/Tag.js, src/app/docs/service/User.js, src/app/share/app.js, src/app/share/controller/FileModalView.js, src/app/share/controller/FileView.js, src/app/share/controller/Main.js, src/app/share/controller/Share.js, src/app/share/controller/ShareModalPdf.js, src/app/share/filter/Filesize.js, src/app/share/filter/Newline.js
     [exec] 
     [exec] Running "concat:docs" (concat) task
     [exec] File "dist/docs.js" created.
     [exec] 
     [exec] Running "concat:share" (concat) task
     [exec] File "dist/share.js" created.
     [exec] 
     [exec] Running "less:dist" (less) task
     [exec] File dist/less.css created.
     [exec] 
     [exec] Running "concat:css" (concat) task
     [exec] File "dist/style.css" created.
     [exec] 
     [exec] Running "cssmin:dist" (cssmin) task
     [exec] File 'dist/style/style.min.css' written.
     [exec] Uncompressed size: 165398 bytes.
     [exec] Compressed size: 31032 bytes gzipped (139383 bytes minified).
     [exec] 
     [exec] Running "uglify:docs" (uglify) task
     [exec] File dist/docs.min.js created.
     [exec] 
     [exec] Running "uglify:share" (uglify) task
     [exec] File dist/share.min.js created.
     [exec] 
     [exec] Running "copy:dist" (copy) task
     [exec] Created 23 directories, copied 53 files
     [exec] 
     [exec] Running "remove:dist" (remove) task
     [exec] 
     [exec] Running "cleanempty:src" (cleanempty) task
     [exec] Cleaning dist/locale...OK
     [exec] Cleaning dist/lib...OK
     [exec] 
     [exec] Running "htmlrefs:index" (htmlrefs) task
     [exec] 
     [exec] Running "htmlrefs:share" (htmlrefs) task
     [exec] 
     [exec] Running "replace:dist" (replace) task
     [exec] 
     [exec] Done, without errors.
...

Quelle: run npm command gives error „/usr/bin/env: node: No such file or directory“

.war kompilieren

Nun ist alles da, um das .war zu kompilieren:

# cd /usr/local/bin/sismics/docs-web
# mvn -Pprod -DskipTests clean install
...
[INFO] Installing /usr/local/bin/sismics/docs-web/target/docs-web-1.0-SNAPSHOT.war to /root/.m2/repository/com/sismics/docs/docs-web/1.0-SNAPSHOT/docs-web-1.0-SNAPSHOT.war
[INFO] Installing /usr/local/bin/sismics/docs-web/pom.xml to /root/.m2/repository/com/sismics/docs/docs-web/1.0-SNAPSHOT/docs-web-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.935 s
[INFO] Finished at: 2016-03-27T10:37:55+00:00
[INFO] Final Memory: 28M/68M
[INFO] ------------------------------------------------------------------------

Jetty installieren und das .war bekanntmachen

Als nächstes installiert man Jetty:

# apt-get install jetty9

Sobald Jetty existiert, kopiert man das vorhin kompilierte .war in folgendes Verzeichnis:

# cp /root/.m2/repository/com/sismics/docs/docs-web/1.0-SNAPSHOT/docs-web-1.0-SNAPSHOT.war /usr/share/jetty9/webapps/dms.war

ACHTUNG: Es gibt auch ein Verzeichnis /usr/share/jetty/webapps/; Jetty ignoriert dieses aber (meiner Meinung nach). Das .war gehört nicht hierhin.

Datenverzeichnis anlegen

# mkdir /var/docs
# chmod 777 /var/docs

Jetty neu starten

# service jetty9 start

Sismics Docs aufrufen

Sobald Jetty läuft, öffnet man den Browser wieder:

10.1.2.3:8080/dms/

Man loggt sich ein, ändert das Admin-Passwort, erstellt weitere User, lädt ein Testdokument hoch, loggt sich wieder aus — und dann stoppt man Jetty testhalber wieder um sicherzugehen, dass die Daten und Konfiguration auch einen Stop des Applikationsservers überlegen:

# service jetty9 stop
# service jetty9 start

Nun sollte man sich mit dem soeben gesetzten Admin-Passwort einloggen können und das vorher hochgeladene Dokument sehen.

Fertig! Nun kann der Spass beginnen.

Die API-Dokumentation habe ich leider noch nicht gefunden …

Tags: , , , , , , , , ,
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Freitag, 5. Februar 2016

UniFi Controller unter Debian installieren

Dank den .deb-Paketen, welche der Hersteller zur Verfügung stellt, eine Sache von wenigen Minuten.

/etc/apt/sources.list

Hier fügt man folgende Zeile ein:

...
deb http://www.ubnt.com/downloads/unifi/debian unifi5 ubiquiti

Quelle: Updated UniFi Repo info/APT howto

Aktualisierung: stable mit unifi5 ersetzt (Juni 2016; Dank an Joachim, siehe Kommentar unten)

apt-get

Als erstes liest man die Paketlisten neu ein:

# apt-get update

Sollte es zu Probleme mit dem GPG-Schlüssel kommen, könnten folgende Befehle helfen:

# apt-key adv --keyserver keyserver.ubuntu.com --recv C0A52C50
# apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10

Anschliessend installiert man das Paket:

# apt-get install unifi
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
 binutils ca-certificates-java default-jre-headless java-common jsvc libasyncns0 libboost-filesystem1.55.0 libboost-program-options1.55.0
 libboost-system1.55.0 libboost-thread1.55.0 libcommons-daemon-java libflac8 libgoogle-perftools4 libice6 libnspr4 libnss3 libogg0
 libpcrecpp0 libpcsclite1 libpulse0 libsctp1 libsm6 libsnappy1 libsndfile1 libtcmalloc-minimal4 libunwind8 libv8-3.14.5 libvorbis0a
 libvorbisenc2 libx11-xcb1 libxtst6 lksctp-tools mongodb-clients mongodb-server openjdk-7-jre-headless tzdata-java x11-common
Suggested packages:
 binutils-doc default-jre equivs java-virtual-machine pcscd pulseaudio icedtea-7-jre-jamvm libnss-mdns sun-java6-fonts fonts-dejavu-extra
 fonts-ipafont-gothic fonts-ipafont-mincho ttf-wqy-microhei ttf-wqy-zenhei fonts-indic
The following NEW packages will be installed:
 binutils ca-certificates-java default-jre-headless java-common jsvc libasyncns0 libboost-filesystem1.55.0 libboost-program-options1.55.0
 libboost-system1.55.0 libboost-thread1.55.0 libcommons-daemon-java libflac8 libgoogle-perftools4 libice6 libnspr4 libnss3 libogg0
 libpcrecpp0 libpcsclite1 libpulse0 libsctp1 libsm6 libsnappy1 libsndfile1 libtcmalloc-minimal4 libunwind8 libv8-3.14.5 libvorbis0a
 libvorbisenc2 libx11-xcb1 libxtst6 lksctp-tools mongodb-clients mongodb-server openjdk-7-jre-headless tzdata-java unifi x11-common
0 upgraded, 38 newly installed, 0 to remove and 5 not upgraded.
Need to get 305 MB of archives.
After this operation, 467 MB of additional disk space will be used.
Do you want to continue? [Y/n]

Fertig!

UniFi Controller

Den Controller öffnet man nun, indem man folgende URL aufruft:

  • localhost:8443 (auf dem Server selber, aber wer von euch betreibt einen Linux-Server schon mit einem GUI?)
  • 192.168.44.44:8443 (oder welche IP der UniFi-Controller auch immer im heimischen LAN erhalten hat)

Nachtrag

Die PDF-Anleitung „Install and configure a Debian based UniFi controller“ findet sich bei einer Google-Suche zuoberst, sie ist aber veraltet. Insbesondere der Hinweis auf folgende Paketquelle funktionierte bei mir nicht mehr:

deb http://www.ubnt.com/downloads/unifi/distros/deb/debian debian ubiquiti

Die Fehlermeldung lautete:

W: Failed to fetch http://dl.ubnt.com/unifi/distros/deb/debian/dists/debian/ubiquiti/binary-amd64/Packages 404 Not Found

E: Some index files failed to download. They have been ignored, or old ones used instead.

Tags: , ,
Labels: Linux

6 Kommentare | neuen Kommentar verfassen