Zeitzone auf Linux ändern
Die Zeit auf Linux/Unix Systemen läuft tyischer weise in UTC. Die lokale Zeit könnt Ihr einfach wie folgt einstellen:
dpkg-reconfigure tzdata
Die Ausgabe kann dann wie folgt aussehen.

Die Zeit auf Linux/Unix Systemen läuft tyischer weise in UTC. Die lokale Zeit könnt Ihr einfach wie folgt einstellen:
dpkg-reconfigure tzdata
Die Ausgabe kann dann wie folgt aussehen.
Im Zeitalter von SSDs ist man wieder mehr darauf bedacht, Speicherplatz zu sparen. Im Normalfall hat man seine VMs ja heutzutage auf eher kleineren SSD liegen, so dass man sicher stellen muss, dass diese Files von Zeit zu Zeit “ge-shrinked” werden.
Ein einfaches schrinken des Diskfiles unter VMWare führt in den meisten fällen nicht zu gewünschten Ergebnis.
So sind beispielsweise nur ~13GB im Gast belegt, das Diskfile ist jedoch ganze 100GB groß. Um für VMWare den freien Speicherplatz zu markieren, muss dieser mit NULL/Zero vollgeschrieben werden. Dies mach aber auch nur sinn, wenn vorher alle Daten an den Anfang des Files verschoben wurden. Somit besteht die Prozedur aus 1. dem Defragmentieren und 2. dem Wipen der Disk, wo sich keine Daten befinden.
# 1. Defragmentieren (no need to un/remount anything) sudo e4defrag / #Fehler können ignoriert werden. Symlinks & Devices können nicht defragmentiert werden. #2. Wipe the unused disk. dd if=/dev/zero of=wipefile bs=1M; sync; rm wipefile #3. Starte den VMWare Shrink Prozess sudo vmware-toolbox-cmd disk shrinkonly
Danach wurden knapp 87GB wieder freigegeben, da diese nicht benutzt wurden.
Wie kann man per tar direkt auf einen remote Server schreiben? Warum möchte man direkt per tar auf einen remote Server sichern? Diese Fragestellung tritt speziell dann auf, wenn man auf den zu sichernden Server nur wenig verbleibende Disk-Kapazität hat. Typischerweise sind das dann Datenbankserver, oder wie in meinem Fall Webserver, die eine OwnCloud Instanz hosten. Da auch im Web der Festplattenspeicher teuer ist, nutze ich mein NAS zu Hause zu die Daten zu sichern. Hier steht ja in gewissem Maße unbegrenzter Speicherplatz zur Verfügung.
Also gut, dann erzeugen wir ein Archiv und pipen die Ausgabe direkt per SSH auf den Remote Speicher um.
tar zcvf - /var/www/ | ssh -p 22 root@nas.tschoerner.eu "cat > /media/backup/WebServer.tar.gz"
Nun wird das erzeugte Archiv direkt auf den SSH Server umgeleitet.
Müsst Ihr nun ein Backup wieder herstellen, so könnt Ihr das auch, ohne das Archiv kopieren zu müssen:
cd / ssh -p 22 root@nas.tschoerner.eu "cat /media/backup/WebServer.tar.gz" | tar zxvf -
Kürzlich stand ich vor dem Problem, dass einer meiner VPS Server immer vom Hoster gestoppt wurde. Dieses Problem tritt häufig auf, wenn bei einem 1 vCPU Server der CPU-load länger als 10 Minuten über 1.00 liegt.
Zur Lösung des Problems habe ich das Tool CPULIMIT entdeckt. Es gibt es auf Ubuntu & Centos / bereits als pre-kompiliertes Paket un kann einfach via apt-get oder yum installiert werden.
yum install cpulimit gawk
Im Anschluss habe ich ein Skript zu start eines Daemon hier /usr/bin/cpulimit_daemon.sh angelegt, mit diesem Inhalt:
#!/bin/bash # ============================================================== # CPU limit daemon - set PID's max. percentage CPU consumptions # ============================================================== # Variables CPU_LIMIT=20 # Maximum percentage CPU consumption by each PID DAEMON_INTERVAL=3 # Daemon check interval in seconds BLACK_PROCESSES_LIST= # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited. WHITE_PROCESSES_LIST= # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited. # Check if one of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST is defined. if [[ -n "$BLACK_PROCESSES_LIST" && -n "$WHITE_PROCESSES_LIST" ]] ; then # If both variables are defined then error is produced. echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty." exit 1 elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT" elif [[ -n "$WHITE_PROCESSES_LIST" ]] ; then # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT" else NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT" fi # Search and limit violating PIDs while sleep $DAEMON_INTERVAL do NEW_PIDS=$(eval "$NEW_PIDS_COMMAND") # Violating PIDs LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}') # Already limited PIDs QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$') # PIDs in queue for i in $QUEUE_PIDS do cpulimit -p $i -l $CPU_LIMIT -z & # Limit new violating processes done done
Um das Skript ausführen zu können müssen noch die Berechtigungen geändert werden:
chmod 755 /usr/bin/cpulimit_daemon.sh
Um nun den Job zu starten einfach ein Skript wie folgt unter /etc/init.d/cpulimit anlegen:
#!/bin/sh # # Script to start CPU limit daemon # set -e case "$1" in start) if [ $(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l) -eq 0 ]; then nohup /usr/bin/cpulimit_daemon.sh >/dev/null 2>&1 & ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon started successfully"; else print " * cpulimit daemon can not be started" }' else echo " * cpulimit daemon can't be started, because it is already running" fi ;; stop) CPULIMIT_DAEMON=$(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | wc -l) CPULIMIT_INSTANCE=$(ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | wc -l) CPULIMIT_ALL=$((CPULIMIT_DAEMON + CPULIMIT_INSTANCE)) if [ $CPULIMIT_ALL -gt 0 ]; then if [ $CPULIMIT_DAEMON -gt 0 ]; then ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print $1}' | xargs kill -9 # kill cpulimit daemon fi if [ $CPULIMIT_INSTANCE -gt 0 ]; then ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | xargs kill -9 # release cpulimited process to normal priority fi ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon can not be stopped"; else print " * cpulimit daemon stopped successfully" }' else echo " * cpulimit daemon can't be stopped, because it is not running" fi ;; restart) $0 stop sleep 3 $0 start ;; status) ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh" {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon is running"; else print " * cpulimit daemon is not running" }' ;; esac exit 0
Nun noch die Berechtigungen ändern:
chown root:root /etc/init.d/cpulimit
Um das Skript auf CentOs zu starten habe ich es einfach am ende von /etc/rc.config eingefügt. somit wird es nach dem Booten automatisch gestartet und limitiert dann die CPU intensiven Jobs.
Heute habe ich mich gefragt, warum der Login auf einem durchaus schnellen i5 ssh Server mehrere Sekunden benötigt, bis die Passwort abfrage kommt.
Zuerst einmal habe ich versucht herauszufinden woran es hackt:
ssh -vvv username@hostname OpenSSH_5.8p1 Debian-1ubuntu3 ... ... ...
Im Anschluss habe ich geschaut woran es hackt und habe dann auf dem Server den Versuch der Namensauflösung gesehen.
Als ich die Namensauflösung abgeschaltet hatte war es dann auch wieder schnell.
Hierzu einfach in die sshd_config folgendes eintragen:
UseDNS no
Im Anschluss dann noch ein
service ssh restart
Ab sofort sollte der Login wieder schnell sein!
Wenn man viel auf der Konsole unterwegs ist, ist es schön, wenn verschiedene Files hervorgehoben sind. Das ist einfach zu bewerkstelligen innerhalb der bash.
nano ~/.bashrc
Hier nun folgendes einfügen:
alias ls='ls --color=auto'
Neu einloggen und schon ist die Konsole nicht mehr so trist.
Apache und LOW Memory vertragen sich ja nicht so wirklich, deshalb eines Vorweg, man sollte wenn man nich unbedingt Apache braucht, auf Alternative wie nginx oder Lighttpd setzen. Ich betreibe eigentlich nur auf allen meinen kleineren Systemen (<2GB Ram) nur nginx und (<256MB Ram) lighttpd. Hier haben ich auch einen Link zu einer Low Memory LLMP Konfiguration.
Nichts desto trotz benötigt man manchmal unbedingt einen Indianer, und so kann man ihn auch auf einem Low Mem Server betreiben.
Also wie gesagt ist das größte Problem der Speicher den der Apache braucht. In der Konfigurationsdatei
/etc/apache2/apache2.conf kann man die Einstellungen tunen.
nano /etc/apache2/apache2.conf
In der Konfigurationsdatei dann folgende Konfiguration vornehmen:
<IfModule mpm_prefork_module> StartServers 1 MinSpareServers 1 MaxSpareServers 3 MaxClients 10 MaxRequestsPerChild 3000 </IfModule> <IfModule mpm_worker_module> StartServers 1 MinSpareThreads 5 MaxSpareThreads 15 ThreadLimit 25 ThreadsPerChild 5 MaxClients 25 MaxRequestsPerChild 200 </IfModule>
Des weiteren empfiehlt sich das Timeout zu reduzieren. KeepAliveTimeout sollte nicht mehr als 15 (Sekunden) betragen.
Nach diesen Einstellungen ist Apache schon wesentlich genügsamen. Jetzt sollte man noch nicht benötigte Module deaktivieren. Mit diesem Befehl seht Ihr alle Apache Module.
apache2ctl -M
Um beispielsweise einen WordPress Blog zu hosten brauch man folgende Module (wie gesagt, WordPress läuft auch unter nginx & Lighttpd).
LoadModule dir_module modules/mod_dir.so LoadModule log_config_module modules/mod_log_config.so LoadModule mime_module modules/mod_mime.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule alias_module modules/mod_alias.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule rewrite_module modules/mod_rewrite.so
Um ein Modul zu deaktivieren kann man entweder die Konfigurationsdatei oder aber folgenden Befehl ausführen:
# Modul aktivieren a2enmod module_name #Modul deaktivieren a2dismod module_name
Anschließend noch den Apache neu starten und Spaß haben.
Jetzt noch ein schneller Tip für heute. Wie bekommt man den MySQL Dump wieder richtig eingespielt? Ich habe immer wieder
das Problem, dass dieses ä,ö und ü nicht korrekt wiederhergestellt werden.
Eigentlich ist es ganz einfach, wenn er Dump im utf8 Format erzeugt wurde, das einfach beim Import mit angeben.
mysql -u root -p --default-character-set=utf8 database < database.sql
Da man ja bekanntlich ;D zwischen den Jahren nicht viel zu tun hat, habe ich heute die Kernel Logs meines NAS auf Basis von OpenMediaVault geprüft. Mir fiel dabei auf, dass der aktuelle Kernel von Wheezy keine optimale Unterstützung für die von mir eingesetzte j1900 CPU (Intel ARK).
Nachdem ich mit einen “Custom” Kernel genaut habe, passen jetzt auch die non-free treiber zum j1900. Dieser unterstützt jetzt auch im Burst-mode 2.4 Ghz.
root@London:~# cpufreq-info cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009 Bitte melden Sie Fehler an cpufreq@vger.kernel.org. analysiere CPU 0: Treiber: intel_pstate Folgende CPUs laufen mit der gleichen Hardware-Taktfrequenz: 0 Die Taktfrequenz folgender CPUs werden per Software koordiniert: 0 Maximale Dauer eines Taktfrequenzwechsels: 0.97 ms. Hardwarebedingte Grenzen der Taktfrequenz: 1.33 GHz - 2.42 GHz mögliche Regler: performance, powersave momentane Taktik: die Frequenz soll innerhalb 1.33 GHz und 2.42 GHz. liegen. Der Regler "powersave" kann frei entscheiden, welche Taktfrequenz innerhalb dieser Grenze verwendet wird. momentane Taktfrequenz ist 1.33 GHz (verifiziert durch Nachfrage bei der Hardware). analysiere CPU 1: Treiber: intel_pstate Folgende CPUs laufen mit der gleichen Hardware-Taktfrequenz: 1 Die Taktfrequenz folgender CPUs werden per Software koordiniert: 1 Maximale Dauer eines Taktfrequenzwechsels: 0.97 ms. Hardwarebedingte Grenzen der Taktfrequenz: 1.33 GHz - 2.42 GHz mögliche Regler: performance, powersave momentane Taktik: die Frequenz soll innerhalb 1.33 GHz und 2.42 GHz. liegen. Der Regler "powersave" kann frei entscheiden, welche Taktfrequenz innerhalb dieser Grenze verwendet wird. momentane Taktfrequenz ist 1.33 GHz (verifiziert durch Nachfrage bei der Hardware). analysiere CPU 2: Treiber: intel_pstate Folgende CPUs laufen mit der gleichen Hardware-Taktfrequenz: 2 Die Taktfrequenz folgender CPUs werden per Software koordiniert: 2 Maximale Dauer eines Taktfrequenzwechsels: 0.97 ms. Hardwarebedingte Grenzen der Taktfrequenz: 1.33 GHz - 2.42 GHz mögliche Regler: performance, powersave momentane Taktik: die Frequenz soll innerhalb 1.33 GHz und 2.42 GHz. liegen. Der Regler "powersave" kann frei entscheiden, welche Taktfrequenz innerhalb dieser Grenze verwendet wird. momentane Taktfrequenz ist 1.34 GHz (verifiziert durch Nachfrage bei der Hardware). analysiere CPU 3: Treiber: intel_pstate Folgende CPUs laufen mit der gleichen Hardware-Taktfrequenz: 3 Die Taktfrequenz folgender CPUs werden per Software koordiniert: 3 Maximale Dauer eines Taktfrequenzwechsels: 0.97 ms. Hardwarebedingte Grenzen der Taktfrequenz: 1.33 GHz - 2.42 GHz mögliche Regler: performance, powersave momentane Taktik: die Frequenz soll innerhalb 1.33 GHz und 2.42 GHz. liegen. Der Regler "powersave" kann frei entscheiden, welche Taktfrequenz innerhalb dieser Grenze verwendet wird. momentane Taktfrequenz ist 1.35 GHz (verifiziert durch Nachfrage bei der Hardware). root@London:~#
Wenn jetzt also die Treiber besser passen, dachte ich mit, teste ich noch schnell mal den IO auf mein internes RAID5 (3x WD RED). Eine einfache Messung habe ich auf der Konsole mittels dd durchgeführt.
Test 1: 8k Länge & Anzahl 256k
Test 2: 8K Länge & Anzahl 512k
root@London:/media# dd if=/dev/zero of=/media/3e0a8081-0482-4a84-8e05-ae2106117e16/test/output.img bs=8k count=256k 262144+0 Datensätze ein 262144+0 Datensätze aus 2147483648 Bytes (2,1 GB) kopiert, 7,72799 s, 278 MB/s root@London:/media# dd if=/dev/zero of=/media/3e0a8081-0482-4a84-8e05-ae2106117e16/test/output.img bs=8k count=512k 524288+0 Datensätze ein 524288+0 Datensätze aus 4294967296 Bytes (4,3 GB) kopiert, 17,2436 s, 249 MB/s
In einem VirtualBox Windows Gast habe ich eine Messung mit Cristal Mark gemacht. Auch hier war ich mit der Leistung durchaus zufrieden.
Als Vergleich noch mein Laptop mit SSD & HDD:
SSD:
HDD:
Mit der Disk-Performance meines NAS Server kann ich wohl ganz zufrieden sein.
Heute stand ich spontan beim Aufräumen meiner Server vor dem Problem, wie man “App’s” auf einem ClearOS Small Business Server entfernt.
Nach 10 Minuten suchen ohne Rat fand ich heraus, dass es auf der Roadmap ist, oder war? … ein Deinstallation Feature zu installieren. Geholfen hat die Aussage nur in so fern, dass ich händisch aktiv werden muss. Für alle die ClearOS nicht kennen; es ist der einzige Server bei mir, der nicht auf Debian basiert. ClearOS ist ein Weiterentwicklung von CentOs was bekanntlich auf RedHat basiert.
Also kurz die rpm-Paketlisten gecheckt und herausgefunden, dass man die App auch wieder mit rpm weg bekommt.
Der Befehl lautet:
rpm -e app-antivirus
Wobei “antivirus” mit dem zu entfernenden App ersetzt werden muss. Den richtigen Namen des Apps kann man anhand der URL im Weg-Ui bestimmen.
Loggt man sich ein und wechselt auf das zu deinstallierende App, beispielsweise FTP, dann lautet die Url: https://ClearOS:81/app/ftp
Der Befehl würde dann also so lauten:
rpm -e app-ftp