Epic Fail – Bumblebee

Wer ein Notebook mit “NVIDIA® Optimus™ Technologie” besitzt und z.B. Ubuntu installiert hat sollte sich einmal “Bumblebee” anschauen … “Owners of optimus laptops. Install bumblebee, use the nvidia card while gaming, use intel chipset for everything else. Now with autoshutdown for the nvidia card.” – Quelle

Mit dem Update auf Version 1.4.32 wurde ein Fehler behoben, welcher bei Ubuntu-Usern “/usr” löscht. daraufhin wurden in den letzten Tagen etliche lustige Kommentare & Bilder zu dem Thema auf github.com gepostet. Hier einige Beispiele …

bumblebee-fun1
bumblebee-fun1
bumblebee-fun2
bumblebee-fun2
bumblebee-fun3
bumblebee-fun3
bumblebee-fun4
bumblebee-fun4
bumblebee-fun5
bumblebee-fun5
bumblebee-fun6
bumblebee-fun6
bumblebee-fun7
bumblebee-fun7

Optimierungen von Android unter Linux nutzen

Vor einiger Zeit habe ich ein kleines Shell-Script (SSSwitch – auto-switch settings) geschrieben, welches mein Android Handy beim Start optimiert und die Kernel-Einstellungen anpasst, wenn der Bildschirm an bzw. aus ist. Einige der Einstellungen kann man auch unter Linux verwenden. Als Beispiel beschreibe ich hier kurz, wie man die I/O Leistung verbessern kann und wer allgemein etwas zum optimieren von Linux / Ubuntu lesen möchte, dem hilft ggf. folgender Blog-Post weiter -> SpeedUp-Ubuntu ;)

 

Ein Ausschnitt aus dem besagtem Skript …

# =========
# One-time tweaks to apply on every boot;
# =========
STL=`ls -d /sys/block/stl*`;
BML=`ls -d /sys/block/bml*`;
MMC=`ls -d /sys/block/mmc*`;

… hier wurde der externe / interne Speicher von Android angegeben unter meinem Linux-System würde ich hier also z.B. folgendes angeben.

SDA=`ls -d /sys/block/sda/*`;

# =========
# Remount all partitions
# =========
for k in $(busybox mount | cut -d " " -f3);
do
	sync;
	busybox mount -o remount,noatime,nodiratime $k;
done;

“atime – Update inode access time for each access. See also the strictatime mount option.” – man mount Hier schalten wir die Funktion aus, welche aufzeichnet wann ein Datei oder Verzeichnis zuletzt angesehen wurde, da wir diese Funktionalität unter Android selten benötigen werden. ;) Ggf. kann man diesen Abschnitt komplett so unter Linux / Ubuntu verwenden z.B.:

mount
/dev/sda5 on / type ext4 (rw,errors=remount-ro,commit=0)
[...]
/dev/sda3 on /boot type ext2 (rw)
/dev/sda6 on /home type ext4 (rw,commit=0)
[...]
for k in $(busybox mount | cut -d " " -f3); do sync; mount -o remount,noatime,nodiratime $k; done;
mount
/dev/sda5 on / type ext4 (rw,noatime,nodiratime,errors=remount-ro)
[...]
/dev/sda3 on /boot type ext2 (rw,noatime,nodiratime)
/dev/sda6 on /home type ext4 (rw,noatime,nodiratime)
[...]

… wie man sieht sind die neuen Mount-Optionen nun aktiv. Wer mehr dazu erfahren möchte findet in dem bereits erwähnten “SpeedUp Ubuntu“-Beitrag unter dem Punkt “3.1) Filesystem” mehr Infos.

# =========
# check enabled/disabled status for IO settings
# =========
if [ "$IO_SETTINGS_ENABLED" -eq "1" ];
then
	# =========
	# Optimize non-rotating storage
	# =========
	for i in $STL $BML $MMC;
	do
		/system/xbin/echo "1" > $i/queue/iosched/rq_affinity;
		/system/xbin/echo "1" > $i/queue/iosched/low_latency;
		/system/xbin/echo "64" > $i/queue/max_sectors_kb;
		/system/xbin/echo "$READ_AHEAD_ALL" > $i/queue/read_ahead_kb;
	done;

Hier legen wir unter anderem die Puffergröße von unseren Speichermedien ein. Als Beispiel zeige ich kurz wie sich der Buffer auf die Lesegeschwindigkeit auswirkt, wenn eine Datei z.B. erneut geöffnet wird. ;) Dazu benötigen wir zuerst einen Compiler (gcc)

sudo apt-get install gcc

Nun den folgenden Quelltext kopieren …

#include 
#include <stdio.h>
#include <unistd.h>
#include <sys/times.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define MAX_PUFFER_GROESSE 1<<14
// Ausgabe
static void zeit_ausgabe(long int puff_groesse, clock_t realzeit, struct tms *start_zeit, struct tms *ende_zeit, long int schleiflaeufe);

int main(void) {
    char puffer[MAX_PUFFER_GROESSE];
    ssize_t n;
    long int i, j=0, puffer_groesse, opt_puffer;
    struct tms start_zeit, ende_zeit;
    static long ticks=0;
    clock_t uhr_start, uhr_ende, system_cpu=0.0;

    // Ausgabe
    fprintf(stderr, "+--------------+-------------+--------------+--------------+--------------+\n");
    fprintf(stderr, "| %-10s | %-10s | %-10s | %-10s | %-10s |\n",
                    "Puffer-", "UserCPU", "SystemCPU", "Gebrauchte", "Schleifen-");
    fprintf(stderr, "| %10s | %10s | %10s | %10s | %10s |\n",
                    " groesse", " (Sek)", " (Sek)", " Uhrzeit", " laeufe");
    fprintf(stderr, "+--------------+-------------+--------------+--------------+--------------+\n");

    while (j <= 14) {
        i=0;
        puffer_groesse=1<<j;
        if (lseek(STDIN_FILENO, 0L, SEEK_SET) == -1) {
            fprintf(stderr, "Error: lseek");
            exit(1);
        }
        if (lseek(STDOUT_FILENO, 0L, SEEK_SET) == -1) {
            fprintf(stderr, "Errir: lseek");
            exit(1);
        }
        if ( (uhr_start = times(&start_zeit)) == -1) {
            fprintf(stderr, "Error: times");
            exit(2);
        }
        while ( (n=read(STDIN_FILENO, puffer, puffer_groesse)) > 0) {
            if (write(STDOUT_FILENO, puffer, n) != n) {
                fprintf(stderr, "Error: write");
                exit(3);
            }
            i++;
        }
        if (n < 0) {
            fprintf(stderr, "Error: read");
            exit(4);
        }
        if ( (uhr_ende = times(&ende_zeit)) == -1) {
            fprintf(stderr, "Error: times");
            exit(5);
        }

        if (ticks == 0) {
            if ( (ticks = sysconf(_SC_CLK_TCK)) < 0) {
                fprintf(stderr, "Error: sysconf");
                exit(6);
            }
        }
        // Ausgabe
        zeit_ausgabe(puffer_groesse, uhr_ende-uhr_start, &start_zeit, &ende_zeit, i);
        j++;
    }
    exit(0);
}

// Ausgabe
static void zeit_ausgabe(long int puff_groesse, clock_t realzeit, struct tms *start_zeit, struct tms *ende_zeit, long int schleiflaeufe) {
    static long ticks=0;
    if (ticks == 0) {
        if ( (ticks = sysconf(_SC_CLK_TCK)) < 0) {
            fprintf(stderr, "Error: sysconf");
            exit(6);
        }
    }
    fprintf(stderr, "| %10ld | %10.2f | %10.2f | %10.2f | %10ld |\n", puff_groesse, (ende_zeit->tms_utime - start_zeit->tms_utime) / (double)ticks, (ende_zeit->tms_stime - start_zeit->tms_stime) / (double)ticks, realzeit / (double)ticks, schleiflaeufe);
    return;
}

… und in eine leere Datei (io_speed_buffer.c) einfügen, nun compilieren wir noch schnell das Programm mit folgendem Befehl …

gcc io_speed_buffer.c -o io_speed_buffer

… als nächsten benötigen wir eine etwa 10 MB große Datei als Eingabe, diese erzeugen wir mittels “dd” im aktuellen Verzeichnis.

dd if=/dev/zero of=./test count=20000

Und schon können wir mittels folgenden Befehl die optimale Buffer-Größe herausfinden. Wobei man bei minimaler Verbesserung nicht den höheren Wert nutzen sollte.

z.B.:

./io_speed_buffer <test >test2
+--------------+-------------+--------------+--------------+--------------+
| Puffer-    | UserCPU    | SystemCPU  | Gebrauchte | Schleifen- |
|    groesse |      (Sek) |      (Sek) |    Uhrzeit |     laeufe |
+--------------+-------------+--------------+--------------+--------------+
|          1 |       0.48 |      10.41 |      10.90 |   10240000 |
|          2 |       0.26 |       3.40 |       3.66 |    5120000 |
|          4 |       0.19 |       1.64 |       1.83 |    2560000 |
|          8 |       0.12 |       0.80 |       0.92 |    1280000 |
|         16 |       0.01 |       0.46 |       0.47 |     640000 |
|         32 |       0.03 |       0.20 |       0.23 |     320000 |
|         64 |       0.00 |       0.12 |       0.12 |     160000 |
|        128 |       0.00 |       0.07 |       0.07 |      80000 |
|        256 |       0.00 |       0.04 |       0.04 |      40000 |
|        512 |       0.00 |       0.02 |       0.02 |      20000 |
|       1024 |       0.00 |       0.02 |       0.02 |      10000 |
|       2048 |       0.00 |       0.01 |       0.01 |       5000 |
|       4096 |       0.00 |       0.00 |       0.00 |       2500 |
|       8192 |       0.00 |       0.01 |       0.01 |       1250 |
|      16384 |       0.00 |       0.01 |       0.01 |        625 |

Standardmäßig ist der Wert “128” gesetzt …

cat /sys/block/sda/queue/read_ahead_kb
128

… welchen wir jedoch leicht ändern können! ;)

sudo echo "256" > /sys/block/sda/queue/read_ahead_kb
cat /sys/block/sda/queue/read_ahead_kb
256

Ggf. kann man diese Einstellungen auch unter Linux direkt beim start ausführen lassen z.B. könnte man den zuvor gezeigten “echo”-Befehl in der “rc.local”-Datei einfügen. (/etc/rc.local)

	# =========
	# Optimize io scheduler
	# =========
	for i in $STL $BML $MMC;
	do
		/system/xbin/echo "$IO_SCHEDULER" > $i/queue/scheduler;

Welcher I/O Scheduler der beste für das Speichermedium ist kann man am betesten selber testen, indem man z.B. wieder den “dd”-Befehl verwendet. -> [Discussion] SSSwitch – auto-switch settings PS: Für mein Android-System nutze ich momentan “bfq” wobei “noop” gerade für SSD-Speichermedien schneller sein soll …

		case $IO_SCHEDULER in
		"cfq")
    		        /system/xbin/echo "0" > $i/queue/rotational;
      		        /system/xbin/echo "1" > $i/queue/iosched/back_seek_penalty;
      		        /system/xbin/echo "1" > $i/queue/iosched/low_latency;
     		        /system/xbin/echo "3" > $i/queue/iosched/slice_idle;
      		        /system/xbin/echo "16" > $i/queue/iosched/quantum;
      		        /system/xbin/echo "2048" > $i/queue/nr_requests;
			/system/xbin/echo "1000000000" > $i/queue/iosched/back_seek_max;;
		"bfq")
			/system/xbin/echo "0" > $i/queue/rotational;
			/system/xbin/echo "1" > $i/queue/iosched/back_seek_penalty;
			/system/xbin/echo "1" > $i/queue/iosched/low_latency;
			/system/xbin/echo "3" > $i/queue/iosched/slice_idle;
			/system/xbin/echo "16" > $i/queue/iosched/quantum;
			/system/xbin/echo "2048" > $i/queue/nr_requests;
			/system/xbin/echo "1000000000" > $i/queue/iosched/back_seek_max;;
		"noop")
			/system/xbin/echo "4" > $i/queue/iosched/quantum;
			/system/xbin/echo "16" > $i/queue/iosched/fifo_batch;
			/system/xbin/echo "248" > $i/queue/nr_requests;;
		"deadline")
			/system/xbin/echo "1" > $i/queue/iosched/front_merges;
      		        /system/xbin/echo "16" > $i/queue/iosched/fifo_batch;;
		"sio")
      		        /system/xbin/echo "1" > $i/queue/iosched/front_merges;
			/system/xbin/echo "4" > $i/queue/iosched/quantum;
			/system/xbin/echo "16" > $i/queue/iosched/fifo_batch;
			/system/xbin/echo "256" > $i/queue/nr_requests;;
		esac;
[...]
	done;
[...]
fi;

Hier noch ein-wenig Feintuning für die entsprechenden I/O Scheduler ;) ggf. müssen diese Werte auf anderen Systemen (Hardware) angepasst werden, dies habe ich bisher nur auf meinem Android System getestet. Falls euch / jemanden dieser Blog-Beitrag gefallen hat, werde ich weitere Einstellungen von dem Skript erklären … :)

Screenshots von Android via shell

Wenn man auf seinem Android beispielsweise einen Kernel mit 24bpp Unterstützung installiert, kann man auch wenn man root-Rechte hat, keine Screenshot via App machen. Um dies zu umgehen kann man die “Android Debug Bridge (adb)” verwenden.

sudo apt-get install ffmpeg
/opt/android-sdk-linux_x86/platform-tools/adb pull /dev/graphics/fb0 fb0
ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 320x480 -i fb0 -f image2 -vcodec png image.png

 

Das gleich Verfahren kann man auch unter Windows anwenden und wer lieber mit einer GUI arbeitet, sollte sich einmal QtADB anschauen. ;)

Ubuntu 11.04 Tweak-Skript

In diesem Blog-Post stelle ich kurz mein kleines Shell-Skript vor, mit dem man sein Ubuntu 11.04 einrichten bzw. optimieren kann. Wenn jemandem noch ein Feature fehlt, kann dies angepasst werden. Zudem habe ich im Quelltext an den meisten Stellen Kommentare hinterlassen, sodass man gleich noch etwas über die shell lernen kann … :-)

[stextbox id=”info”]Über konstruktive Kritik und / oder Verbesserungen würde ich mich freuen.[/stextbox]

Download

 

wget http://suckup.de/ubuntu-11.04-tweak.txt
mv ubuntu-11.04-tweak.txt ubuntu-11.04-tweak
chmod +x ubuntu-11.04-tweak
sudo ./ubuntu-11.04-tweak

 

Funktionen:

– neue Repositories (Quellen) eintragen /  Programme installieren (Java, Flash, Chromium, …)

– Ubuntu / Gnome / Unity anpassen

SSH-Server auf deinem Android (CyanogenMod)

In dem “CyanogenMod” (CM) ist bereits ein SSH-Server eingebaut (Dropbear), dieser ist jedoch standardmäßig abgeschaltet. Hier zeige ich kurz wie du diesen unter Linux / Windows nutzen kannst und dich somit ohne Kabel mit deinem Android (funktioniert nach meinen Tests, nur im lokalen W-Lan) verbinden kannst …  ;-)

 

1.) Android: Vorbereitungen

adb shell

(adb shell)

mkdir /data/dropbear
cd /data/dropbear
dropbearkey -t dss -f dropbear_dss_host_key
dropbearkey -t rsa -f dropbear_rsa_host_key

 

2.1) Linux: Vorbereitungen (Debian / Ubuntu)

2.1.1) Installiere den SSH-Client

sudo aptitude install ssh-client

2.1.2) SSH-Schlüssel generieren

ssh-keygen -t rsa

2.1.3) Übertrage den SSH-Schlüssel (öffentlich / public) zu Android

adb push ~/.ssh/id_rsa.pub /data/dropbear/.ssh/authorized_keys

 

2.2) Windows: Vorbereitungen
PuTTY Download Page

2.2.1) Download “PuTTYgen”

2.2.2) SSH-Schlüssel generieren

Klick auf “Generate” und füge die Zeichenkette, welche du nun im Fenster von puttygen siehst (Beispiel: “ssh-rsa AAAAB3…hclQ==rsa-key-20100227”) in eine Text-Datei auf deinem Desktop ein -> “id_rsa.pub” und speichere (beschütze) deinen “private key”!!!

2.2.3) Übertrage den SSH-Schlüssel (öffentlich / public) zu Android

adb push  C:\Users\[USER]\Desktop\id_rsa.pub /data/dropbear/.ssh/authorized_keys

 

3.) Android: SSH-Server aktivieren

adb shell

(adb shell)

chmod 600 /data/dropbear/.ssh/authorized_keys
echo "/system/xbin/busybox sh" > /data/dropbear/.profile
chmod 755 /data/dropbear /data/dropbear/.ssh
chmod 644 /data/dropbear/dropbear*host_key
chown root.root /data/dropbear/.ssh/authorized_keys
killall dropbear
dropbear -v -s -g

 

4.1) Linux: Verbindung herstellen

-> SSH mit public-key Authentifizierung

 

4.2) Windows: Verbindung herstellen

PuTTY Download Page

4.2.1) Download “putty”

4.2.2) Verbindung zu Android aufbauen

Connection: > “SSH” > “Auth” > wähle deinen gespeicherten “private key” aus …

Session: > gib die IP-Adresse von deinem Android ein und drücke auf Enter

 

 

weitere Infos findest du hier:
Howto: Connect to Device with SSH – CyanogenMod Wiki

Tweak-Skript für Android / Spica

Ich habe hier ein kleines HowTo zum beschleunigen von Android / Spica geschrieben und wollte euch das Tweak-Skript für “bfs-Kernel” / “cfs-Kernel” / “Dateisystem” (ext2) / “3G/Edge Speed” … zur Verfügung stellen. -> Forum-LinkDownload

Optimized Android-Apps mit Linux erstellen

Ich habe meine apps mit dem folgenden Bash-Skript optimiert, welches die Bild- & Sound-Dateien komprimiert, so dass die Apps kleiner werden und weniger Speicher verbrauchen… :-)

Habe die optimierten Apps zu meinem Update-Pack für Spica hinzugefügt -> cyanogenmod + x

 

1.) Bash-Skript in einer Textdatei unter Linux speichern (Tweak_app.sh) & Ausführrechte setzen (chmod +x Tweak_app.sh)

2.) “optipng”, “pngcrush”, “sox” installieren (z.B. für Debian: apt-get install optipng pngcrush sox)

3.) android-sdk herunterladen & sudo cp …..android-sdk/android-sdk/zipalign /usr/bin/

4.) Folgendes Verzeichnis anlegen und zu optimierende Apps darin speichern (./place-apk-here-to-batch-optimize/)

5.) Tweak-Skript ausführen (./Tweak_app.sh) -> Fertig


#!/bin/bash

LOG_FILE="apk.log"

if [ \! -f `whereis optipng | cut -f 2 -d ' '` ] ; then
	echo "ERROR: install optipng (apt-get install optipng)"
	exit 1;
fi;
if [ \! -f `whereis pngcrush | cut -f 2 -d ' '` ] ; then
	echo "ERROR: install pngcrush (apt-get install pngcrush)"
	exit 1;
fi;
if [ \! -f `whereis sox | cut -f 2 -d ' '` ] ; then
	echo "ERROR: install sox (apt-get install sox)"
	exit 1;
fi;
if [ \! -f `whereis zipalign | cut -f 2 -d ' '` ] ; then
	echo "ERROR: install zipalign (sudo cp ...android-sdk/android-sdk/zipalign /usr/bin/)"
	exit 1;
fi;	

rm -rf ./place-apk-here-to-batch-optimize/original/*
if [ -e $LOG_FILE ]; then
	rm $LOG_FILE;
fi;
touch $LOG_FILE
mkdir -p ./place-apk-here-to-batch-optimize/original
find ./place-apk-here-to-batch-optimize -iname "*.apk" | while read APK_FILE ;
do
	echo "Optimizing $APK_FILE"
	7za x -o"./place-apk-here-to-batch-optimize/original" $APK_FILE
	find ./place-apk-here-to-batch-optimize/original -iname "*.png" | while read PNG_FILE ;
		do
		if [ `echo "$PNG_FILE" | grep -c "\.9\.png$"` -eq 0 ] ; then
			optipng -o99 "$PNG_FILE"
			pngcrush -rem alla -reduce -brute "$PNG_FILE" tmp_img_file.png;
			mv -f tmp_img_file.png $PNG_FILE;
		fi
	done;
	find ./place-apk-here-to-batch-optimize/original -iname "*.ogg" | while read OGG_FILE ;
		do
        	sox "$OGG_FILE" -C 0 tmp_audio_file.ogg
        	mv -f tmp_audio_file.ogg $OGG_FILE
    	done;
	7za a -tzip "./place-apk-here-to-batch-optimize/temp.zip" ./place-apk-here-to-batch-optimize/original/* -mx9
	FILE=`basename "$APK_FILE"`
	DIR=`dirname "$APK_FILE"`
	mv -f ./place-apk-here-to-batch-optimize/temp.zip "$DIR/optimized-$FILE"
	zipalign -v -c 4 "$DIR/optimized-$FILE";
	ZIPCHECK=$?;
	if [ $ZIPCHECK -eq 1 ]; then
		echo "ERROR $FILE" >> $LOG_FILE;
		#rm "$DIR/optimized-$FILE"
	elif [ $ZIPCHECK -eq 0 ]; then
		echo "OK $FILE" >> $LOG_FILE;
	else
		echo "ERROR $FILE" >> $LOG_FILE;
		#rm "$DIR/optimized-$FILE"
	fi;
	rm -rf ./place-apk-here-to-batch-optimize/original/*
done;

C-Programm – check_mem für Nagios

Habe gerade ein kleines C-Programm geschrieben, welches mithilfe von Nagios / Icinga die Speicherauslastung (Arbeitsspeicher + Swap) eines Linux-Servers überprüfen kann. Wenn ein Server seine aktuell laufenden Programm auf der Festplatte auslagern muss, da zu wenig Arbeitsspeicher zur Verfügung steht, sollte man darüber ggf. informiert werden… :-)

/*****************************************************************************
* 
* Nagios check_mem plugin
* 
* License: GPL
* Copyright (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net)
* Copyright (c) 2000-2007 Nagios Plugins Development Team
* Copyright (c) 2011 Lars Moelleken (voku@voku-online.de)
* 
* Description:
* 
* This file contains the check_mem plugin
* 
* 
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
* 
* 
*****************************************************************************/

const char *progname = "check_mem";
const char *NP_VERSION = "0.1";
const char *copyright = "2011";
const char *email = "voku@voku-online.de";

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sysinfo.h>

void print_usage (void);
void print_help (void);


int main (int argc, char *argv[]) {
    long total = 0, free_total = 0, used_total = 0;
    long total_mem = 0, free_mem = 0, used_mem = 0;
    long total_swap = 0, free_swap = 0, used_swap = 0;
    struct sysinfo meminfo;

    char *warn_percent = NULL;
    char *crit_percent = NULL;

    int STATE_OK = 0;
    int STATE_WARNING = 1;
    int STATE_CRITICAL = 2;
    int STATE_UNKNOWN = 3;
    int result = 0;

     if (argc < 2) {
        print_help();
        printf("Hilfe anzeigen lassen: %s -h\n", argv[0]);
        exit(STATE_UNKNOWN);
    }

    char option;
    while((option = getopt(argc, argv, "hwc:")) != EOF) {
        switch(option) {
            case 'h':
                print_help();
                break;
            case 'w':
                warn_percent = argv[2];
                break;
            case 'c':
                crit_percent = argv[4];
                break;
            case ':':
                printf("option needs a value\n");
                break;
            case '?':
                printf("unknown option: %c\n", optopt);
                break;
        }
    }

    if(sysinfo(&meminfo) !=0) {
        perror("Fehler ...");
    }

    total_mem = meminfo.totalram;
    free_mem = meminfo.freeram;
    used_mem = meminfo.totalram - meminfo.freeram;

    total_swap = meminfo.totalswap;
    free_swap = meminfo.freeswap;
    used_swap = meminfo.totalswap - meminfo.freeswap;

    total = total_mem + total_swap;
    free_total = free_mem + free_swap;
    used_total = used_mem + used_swap;

    if (free_swap < total_swap/2 || free_total < total / 100 * atoi(crit_percent)) {
        printf("CRITICAL > ");
        result = STATE_CRITICAL;
    } else if (free_total < total / 100 * atoi(warn_percent)) {
        printf("WARNING > ");
        result = STATE_WARNING;
    } else {
        result = STATE_OK;
        printf("OK > ");
    }
    printf("Free Mem+Swap: %ld - Free Mem: %ld - Free Swap: %ld", free_total/1024/1024, free_mem/1024/1024, free_swap/1024/1024); // test-Ausgabe
    return result;
}


void print_help (void) {
    printf ("%s\n", "Check memory on local machine.");

  printf ("\n");

    print_usage ();

  printf (" %s\n", "-w PERCENT%%");
  printf ("    %s\n", "Exit with WARNING status if less than PERCENT of mem/swap space is free");
  printf (" %s\n", "-c PERCENT%%");
  printf ("    %s\n", "Exit with CRITCAL status if less than PERCENT of mem/swap space is free");
    printf ("\n");
}


void print_usage (void) {
  printf ("%s -w <percent_free>%% -c <percent_free>%%\n",progname);
}

Erste Schritte in der Shell

Ich habe schon einige kleine Blog-Beiträge zum Thema “Shell / Bash” geschrieben und werde versuchen diese Blog-Beiträge zu einer hoffentlich umfassenden Einführung in das Thema Shell zusammenfassen…  :-)

Was ist eine Shell?

Die Shell ist die Eingabe-Schnittstelle zwischen Computer und Benutzer, welche bei normaler Systemkonfiguration nach dem erfolgreichem Login eines Benutzers gestartet wird, so dass man auf dieser Kommandozeile die Möglichkeit hat weitere Programme zu starten. Die Shell könnte man somit aus Arbeitsumgebung bezeichnen, von wo aus der PC gesteuert werden kann bzw. Dateien bearbeitet werden können. Es gibt unterschiedliche Arten von Shell’s, wer ein modernes Linux-Betriebssystem (Debian, Ubuntu…) installiert, landet meistens in der sogenannten “bash“, darauf gehe ich jedoch gleich genauer ein. Die eingegebenen Texteingaben werden von der Shell interpretiert und ausgeführt, daher spricht man bei der Shell auch von einem Kommandozeileninterpreter (command-line interpreter, CLI).

 

Begrifflichkeiten!?

In Verbindung mit dem Begriff Shell hört man auch immer wieder folgendes …

 

  • Konsole: In ihrem ursprünglicher Definition war die Konsole ein Terminal, mit dem der Systemoperator die Systemfunktionen steuern konnte… heute wird der Begriff jedoch ebenfalls für “Terminalemulation” verwendet, zudem heißt die grafischen Terminalemulationen unter KDE “Konsole“.
  • Virtuelle Konsole: Die meisten Linux-Systeme kommen standardmäßig mit einigen virtuellen Konsolen daher, welche man über <Strg> + <Alt> + <F1> bis <F6> erreichen kann. Mittels <Strg> + <Alt> + <F7> wird der Desktop und somit die graphischen Oberfläche wieder angezeigt.
  • Terminal: Ein Terminal ist ein Computer, der den Zugriff auf einen entfernten Rechner erhält und die meisten Rechenoperationen somit nicht selber durchführt. (Terminal-PCs) Der Begriff “Terminal” wird heute jedoch auch als Abkürzung für “Terminalemulation” verwendet.
  • Terminalemulation: Mit einer Terminalemulation wird eine textorientierte Ein- und Ausgabeschnittstelle, ein Terminal emuliert, so dass man mehrer Instanzen eines Terminals auf dem Desktop zur Verfügung hat.
shell <---> Terminalemulation <---> grafische Oberfläche
bash  <--->       xterm       <--->         X11

 

Wie komme ich in die Shell?

Wie bereits erwähnt kann man zum einen die virtuelle Konsolen, die mit tty bezeichnet werden per Tastenkombination erreichen. Die Abkürzung tty stammt von dem englischen Wort Teletype und wurde historisch bedingt von Unix übernommen. Mittels …

<Strg> + <Alt> + <F1>

… gelangt man in die erste der tty-Konsolen, in diesem Fall tty1.

Hinweis: Hat man eine  grafische Oberfläche (Desktop) installiert, so befindet sich dieser standardmäßig auf tty7. Dieser Wert ist jedoch Variabel und kann umverlegt werden. Wer die Maus in einer solchen virtuellen Konsole verwenden will, sollte sich das Programm “gpm” anschauen / installieren.

 

Hat man sich einmal an die Desktop-Oberfläche gewöhnt, erscheinen einem diese virtuelle Konsolen meist wenig komfortabel, daher gibt es einige Programme (Terminalemulation) welche den Funktionsumfang erheblich erweitern.

KDE – Konsole

KDE-Nutzern steht das bereits erwähnte Programm “Konsole” zur Verfügung, wobei sich der Kreis der Begrifflichkeiten hier schließt und die Verwirrung bei so manchen gerade erst einsetzt. ;-) Lässt man dies außer Acht ist dieses Terminal(emulation) sehr gut. Das Programm unterstützt Tabs, Transparenz, verschiedenste Farbschema, unterschiedliche Schriften und man kann Profile anlegen.

konsole
konsole

Gnome – Terminal

Gnome-Nutzer verfügen von Haus aus über ein Programm mit dem Namen “Gnome-Terminal”. Ich persönlich bevorzuge dieses Programm, wobei dies wahrscheinlich eine Übungssache ist…

TASTENKÜRZEL BEDEUTUNG
<Strg> + <Umschalttaste> + t öffnet einen neuen Tab
<Strg> + d schließt einen Tab
<Strg> + Bild rauf öffnet nächsten Tab (rechts) bzw. den ersten
<Strg> + Bild runter öffnet vorherigen Tab (links) bzw. den letzen
<Strg> + <Umschalttaste> + Bild rauf verschiebt einen Tab nach rechts
<Strg> + <Umschalttaste> + Bild unter verschiebt einen Tab nach links
Hinweis: Wer das Terminal immer Griffbereit haben möchte, sollte sich einmal “guake” anschauen … ;-)

 

gnome_terminal
gnome_terminal

 

Xterm

Xterm ist Bestandteil des X.org Projekts und war lange Zeit das Standardterminal für Linuxsysteme mit grafischer Oberfläche.

CLI Companion

Wer die Linux-Befehle noch lernen möchte oder sich einige komplizierte Behle öfter benötigt, kann sich auch dieses Terminal anschauen. -> cli-companion-die-gui-in-der-konsole

CLICompanion
CLICompanion

Terminator

“Terminator ist ein in Python geschriebener Terminal-Emulator für die Desktop-Umgebung GNOME, der es ermöglicht mehrere Terminals innerhalb eines Fensters bzw. einzelner Tabs zu benutzen und mittels Tastatur-Kürzeln zwischen diesen zu wechseln. So kann man ohne Tabs und ohne weitere Terminalfenster mehrere Shells zur selben Zeit offen haben.” – http://wiki.ubuntuusers.de/Terminator

 

terminator_split_example
terminator_split_example

 

Wenn man seine Standard-Terminal ändern möchte, kann man dies mit dem Alternativen-System bewerkstelligen…

sudo update-alternatives --config x-terminal-emulator

 

Was für Shells gibt es?

Wenn man sich ein wenig näher mit dem Thema beschäftigt, stellt man schnell fest, dass es eine Menge Alternative Shells gibt. Ich beschränke mich einfach mal auf die (heutige) Standard-Shell die bash und einer Alternative der zsh (Z-Shell)

 

Bourne Again Shell (bash)

Die Bourne Again Shell ist die Standard-Shell der meisten Linux-Distributionen. Die Shell beherrscht die Features der Borune- Korn- und C-Shell. Redet jemand von einer Shell, spricht man meistens von Bash. Um das volle Potenzial der Bash zu nutzen sollte man sich “.bashrc“-Datei anschauen und an seine Bedürfnisse anpassen, für den Anfang sollte meine Datei als Vorlage genügen. -> bashrc

 

Z-Shell (zsh)

Die Zsh kann man als eine Zusammenstellung aller Verbesserungen und Features aus der bash, der csh und der tcsh betrachten.

Zu einigen ihrer Features zählen:

  • eine frei programmierbare Wortvervollständigung (TAB-Completion)
  • die Möglichkeit, die History aus anderen – gleichzeitig laufenden – Shells zu nutzen
  • Rechtschreibüberprüfung
  • nahezu vollständige Kompatibilität zur bash, ksh und tcsh

-> Quelle: http://de.wikipedia.org/wiki/Unix-Shell#Die_Z-Shell

Bei der Z-Shell kann hat man noch viel mehr Einstellungsmöglichkeiten, welche einem Anfangs ggf. überfordern können, daher auch hier meine “.zshrc“-Datei als Vorlage. -> zshrc

 

Z-Shell installieren:

sudo aptitude install zsh

Z-Shell ausprobieren:

zsh

Standardmäßig die Z-Shell verwenden:

sudo chsh -s /usr/bin/zsh `whoami`

 

Probieren geht über studieren…

… was ist damit sagen will, wer einmal die Vorteile der Shell erkannt hat und einige Befehle kennt, wird die Shell lieben lernen!

 

Linux-Dateipfade einigermaßen kennen

Auch wenn in der Shell meist angezeigt wird in welchem Verzeichnis man sich gerade befindet, kann es seht hilfreich sein, wenn man ungefähr weiß wo sich was bei Linux befindet! -> http://wiki.ubuntuusers.de/Verzeichnisstruktur

Verzeichnis Bedeutung ~ Windows
/
Wurzelverzeichnis
C:\
/boot
Bootloader
C:\
/etc
Systemkonfiguration registry,

C:\WINDOWS\*.ini
/bin
Systemprogramme für Benutzer
C:\WINDOWS\,C:\WINDOWS\COMMAND\
/sbin
Systemprogramme und -dienste für Admins
/lib
Systembibliotheken und Treiber
C:\WINDOWS\SYSTEM32\
/tmp
Temporäre Dateien
C:\WINDOWS\TEMP\
/usr
(“Unix System Resources”)
/usr/bin
Programme für Benutzer
C:\Programme\*\
/usr/sbin
Programme und Dienste für Admins
/usr/lib
Bibliotheken
/home
Heimatverzeichnisse
C:\Dokumente und Einstellungen\
/home/user
Heimatverzeichnis des Benutzers user
/root
Heimatverzeichnis des Benutzers root
/var
Daten von Diensten
/var/log
Systemprotokolle
/media
Wechseldatenträger, z.B. USB-Stick
/media/cdrom
CD-ROM
A:\, D:\, E:\,...

 

Beim Login in die Shell, landet man meistens in seinem eigenen home-Verzeichnis (z.B.: /home/lars/). Im “Prompt” (dem Text vor der Eingabeaufforderung, in der Shell) könnte nun so etwas angezeigt werden “lars@ubuntu:~$“.

lars ist hier der User-Name, ubuntu der Name des PCs und das ~ (Tilde-Zeichen) steht als Abkürzung und Synonym für das Homeverzeichnis, in welchem wir uns gerade befinden, dies kannst du gleich durch die Eingabe des Befehl “pwd” (print working directory) überprüfen. ;-)

 

Groß- und Kleinschreibung beachten

Anders als bei Windows unterscheidet Linux Groß- und Kleinschreibung, hier einige Beispiele zur Verdeutlichung …

mkdir lall

(mkdir – make directories)

mkdir Lall
touch lall

(touch – erstellt eine leere Datei)

touch Lall

 

Nun können wir uns mittels “ls” (ls – list directory contents) bzw. …

ls -latrF --color=auto

… anzeigen lassen, welche Dateien / Verzeichnisse im aktuellen Verzeichnis erstellt wurden. Mittels “rm” bzw. “rmdir” kannst du diese Dateien wieder löschen. Falls du versehentlich z.B.: “touch ./–help” ausführst und somit eine leere Datei mit dem Namen-“–help” erstellt hast, kannst du diese mittels “rm ./–help” wieder entfernen.

 

Der Befehl “man” (z.B.: man mkdir) zeigt eine ausführliche Hilfe zum angegebenen Befehl an und “apropos” (z.B.: apropos mkdir) zeigt dessen Funktion schnell an… zudem kann man hinter den Befehlen auch “–help” (mkdir –help) schreiben

 

Achtung
Achtung: Vorsicht der Befehl “rm -r” löscht rekursiv, am Anfang sollte man diesen Parameter ggf. mit -i kombinieren, so dass vor dem löschen einer Datei noch einmal nachgefragt wird, ob diese wirklich gelöscht werden soll. (z.B.: rm -ri lall/) -> safe-rm can save your life

 

Die Navigation

Ebenfalls ein sehr großes Themenfeld ist die Navigation in der Shell, angefangen von der Navigation durch die Verzeichnisse / Dateien … über die Verwendung der History (bereits eingegebene Befehle in der Shell) … bis hin zur Navigation innerhalb der Shell.

Navigation in Verzeichnissen

Befehl BEDEUTUNG
cd ..
wechselt ein Verzeichnis nach oben
cd ../..
wechselt zwei Verzeichnise nach oben
cd ~
wechselt in dein home-Verzeichnis
TAB
durch das drücken der Tabulator-Taste, wird deine Eingabe vervollständigt -> ggf. 2x hintereinander TAB drücken !!!
».«
jedes Verzeichnis enthält eine Referenz auf sich selbst, diesen Punkt benötigt man vor allem,wenn man eine ausführbare Datei starten möchte… (z.b: cd /bin/; ./bash;)
pwd
zeigt an wo du dich befindest

 

Durch das drücken der TAB-Taste kann man sich viel Tipparbeit ersparen… :-)

Navigation in der Shell

BEFEHL / Tastenkürzel BEDEUTUNG
<Strg> + d
Logout aus der Shell (logout bzw. exit)
<Strg> + c
laufender Prozesse (im Vordergrund) wird beendet
<Strg> + l
räumt die Ausgabe auf (clear)
fc -l
zeigt die letzten Befehle in einer Liste an
Pfeiltasten (noch oben / unten)
letzte Befehle durchblättern
Pfeiltasten (noch rechts / links)
Cursor auf der Konsole (rechts / links) bewegen
<Strg> + r
sucht einen Befehl in der Bash-History (mehrmaliges drücken von Strg+r geht weiter in der History zurück)
Alt + .
schreibt den letzten Parameter des letzen Befehls auf die Konsole
!$
schreibt den letzten Parameter des letzen Befehls auf die Konsole (Alt + .)
!!
führt den letzten Befehl noch einmal aus
!string
startet den letzten Befehl, der mit sting anfängt
!?string
startet den letzten Befehl, der string enthält
^sting1^string2
wiederholt den letzten Befehl, wobei sting1 doch string2 ersetzt wird
<Strg> + a
Cursor am Anfang der Zeile
<Strg> + e
Cursor am Ende der Zeile
<Strg> + w
schneidet das letzte Wort aus
<Strg> + u
scheidet alles vor dem Cursor aus
<Strg> + k
scheidet alles hinter dem Cursor aus
<Strg> + y
fügt die zuletzt ausgeschnittenen Daten ein

 

PS: wie bereits erwähnt entfaltet die Shell ihr volles Potenzial erst, wenn man diese ein wenig an seine Wünsche anpasst, daher hier noch einmal der Verweiß auf die .bashrc und .zshrc

 

Kommandos hintereinander ausführen

Wie bereits kurz zuvor gezeigt, kann man Befehle auch hintereinander ausführen… z.B.:

cd /bin/; ./bash;

Hier werden die Befehle “cd /bin/” und “./bash” einfach nacheinander ausgeführt. Wenn man den zweiten Befehl jedoch nur ausführen möchte, wenn der erste Befehl ohne Probleme funktioniert hat, kann man && zwischen den beiden Befehlen verwenden… z.B.:

cd /bin_lall/ && ./bash;

Und wenn man den zweiten Befehl nur ausführen möchte, wenn der erste Befehl nicht funktioniert hat, nimmt man “||“… z.B.:

cd /bin_lall/ || echo "ggf. existiert /bin_lall nicht";

PS: Natürlich muss man nicht jedesmal in das Verzeichnis /bin wechseln, wenn man ein Programm aus diesem Verzeichnis öffnen möchte, dazu wird in der Shell die Variable “$PATH” verwendet. z.B.:

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11

 

Mehrzeilige Kommandos

Wenn man ein Kommando / Befehl über mehrere Zeilen aufteilen möchte, kann man dies mithilfe von “\” machen… z.B.:

find /etc/ \
-iname "pass*"
Hier gibt es weitere Infos zum “find”-Befehl und hier noch eine Befehlsübersicht für alle die gerade Ihre ersten Schritte auf der Shell wagen…

 

Syntax Name Beschreibung ~ Windows
pwd
present working directory Anzeige des aktuellen Arbeitsverz.
cd Zielverzeichnis
change directory Verzeichniswechsel
CD
ls Verzeichnis
list Verzeichnisinhalt anzeigen
DIR
file Datei
% Dateiformat oder -typ
echo Zeichenkette
% Zeichenkette ausgeben
cat Datei
concatenate Dateiinhalt ausgeben
TYPE
more Datei
% dito, seitenweise
MORE
less Datei
% dito, blättern und suchen
touch Datei
% Leere Datei anlegen
cp Quelle Ziel
copy kopieren
COPY
mv Quelle Ziel
move verschieben, umbenennen
MOVE, REN
rm Datei
remove löscht eine Datei
DEL, ERASE
mkdir Verzeichnis
make directory neues Verzeichnis anlegen
MD
rmdir Verzeichnis
remove directory (leeres) Verzeichnis löschen
RD

-> linux-kommandos-als-hintergrundbild ;-)

 

Dateien bearbeiten

Wer direkt in der Shell Dateien verändern möchte, sollte sich den “vim”-Editor anschauen, wie die Shell ist dieser Editor gewöhnungsbedürftig aber man gewinnt Ihn mit der Zeit lieb… ;-) In diesem HowTo habe ich versucht die wichtigsten Funktionen von vim zusammenzufassen. Und hier noch eine Schnellübersicht:

 

BEFEHL / TASTENKÜRZEL BEDEUTUNG
i Text einfügen, vor dem Cursor
R Text ab Cursor-Position überschreiben
<Strg> + v Bereich markieren
<ESC> Bearbeitungsmodus beenden
y kopieren
p einfügen
:q vi/vim beenden
:w Datei speichern

 

 

vi-vim-cheat-sheet_de_layout
vi-vim-cheat-sheet_de_layout

 

Es gibt unter Linux noch etliche Programme, welche einem beim bearbeiten von Dateien hilfreich sein können z.B.: sed

sed -i 's/Ubuntu/Windows/g' test.txt

Dieser Befehl ersetzt das Wort “Ubuntu” durch “Windows” in der ganzen Datei “test.txt” im aktuellen Verzeichnis. Weitere Infos zu sed findest du hier -> streameditor-sed und hier noch ein alter Beitrag zum Thema -> Dateien-in-der-shell-bearbeiten

 

Programme im Hintergrund verschieben

Man kann Programme und Befehle auch im Hintergrund ausführen bzw. diese in den Hintergrund verschieben…

lars@ubuntu ~$ kommando1 & 
[1] 5520
lars@ubuntu ~$ kommando2 & 
[2] 5521
lars@ubuntu ~$ fg %2 
kommando2

 

kommando1 und kommando2 wurden beide im Hintergrund ausgeführt, dann wurde kommando2 mittels dem Befehl “fg” wieder in den Vordergrund geholt. Wenn man kommando2 wieder in den Hintergrund verschieben möchte drücken wir: <Strg> + z

[2]+  Stopped kommando2
lars@ubuntu ~$ bg 
[2]+ kommando2 &

Mit Hilfe des Befehls ”

bg"

wird eine angehaltener Job der Shell in den Hintergrund verschoben und wieder gestartet:

Hier gibt es diesbezüglich weitere Infos: Prozess-anhalten

 

StdIn & StdOut

Sehr hilfreich sind folgende kleine Helfer in der Shell -> Pipezeichen (|) Größer-als-Zeichen (>) und Kleiner-als-Zeichen (<)

mithilfe dieser Zeichen kann man Programm bzw. dessen Ausgaben umleiten. z.B.:

ls -l /usr/bin > /tmp/Alle_Benutzerprogramme.txt

-> schreibt die Ausgabe von “ls” des Verzeichnisses /usr/bin/ in die Textdatei /tmp/Alle_Benutzerprogramme.txt

grep http /etc/services | wc -l

-> zählt alle Zeilen in der Textdatei /etc/services, die die Zeichenkette http enthalten

 

Der Befehl “grep” kann Verzeichnisse, Dateien oder Ausgaben durchsuchen bzw. filtern, daher solle man sich diesen Befehl noch mal genauer ansehen!!!

 

Zum Schluss verlinke ich noch einige alte Blog-Post welche weitere Informationen zur Shell beinhalten, viel Spaß beim testen… :D

– Dateien verschieben in der Shell -> http://suckup.de/blog/2010/01/31/mv-linux/

reguläre Ausdrücke (wildcards) in der Shell -> http://suckup.de/blog/2010/02/09/wildcards-in-der-shell/

– Shell-Programmierung: Schleifen -> http://suckup.de/blog/2010/02/09/nice-try/http://suckup.de/blog/2010/01/31/bash-programmierung-schleifen/

– Bedingungen in der Shell -> http://suckup.de/blog/2010/01/31/bedingungen-in-der-shell-linux/

– crontab -> http://suckup.de/blog/2010/02/08/crontab/

– ps – prozessstatus -> http://suckup.de/blog/2010/09/14/shell-ps-prozessstatus/

– Rechnen in der Shell -> http://suckup.de/blog/2010/01/31/rechnen-in-der-shell/

– HTML-Umlaute in der Shell korrigieren -> http://suckup.de/blog/2010/02/13/html-umlaute-korrigieren/

– cdrecord – ISO erstellen und CD brennen -> http://suckup.de/blog/2010/01/31/cdrecord-iso-erstellen-und-brennen/

– aptitude & dpkg -> http://suckup.de/blog/2010/02/13/aptitude-dpkg/

Unix-Dateiattribute (Zugriffsrechte) verändern -> http://suckup.de/blog/2010/01/31/chmod-howto/

– su & sudo & Setuid-Bit -> http://suckup.de/blog/2010/02/08/su-sudo-setuid-bit/

– Systeminfos anzeigen -> http://suckup.de/blog/2010/02/08/systeminfos-anzeigen-lassen/

– Speicherverbrauch anzeigen -> http://suckup.de/blog/2010/02/08/speicherverbrauch-anzeigen-lassen/

– mount über SSH -> http://suckup.de/blog/2010/02/07/mount-ueber-ssh/

– Ports via ssh weiterleiten –http://suckup.de/blog/2010/03/29/ports-via-ssh-weiterleiten/

– SSH – Hostnamen vervollständigen -> http://suckup.de/blog/2010/09/14/ssh-hostnamen-vervollstaendigen/

– Desktop Firewall – iptables -> http://suckup.de/blog/2010/01/31/desktop-firewall-iptables/

– deine öffentliche IP-Adresse in der Shell -> http://suckup.de/blog/2010/01/31/deine-oeffentliche-ip-adresse/

– offene Ports analysieren -> http://suckup.de/blog/2010/03/28/offene-ports-analysieren/

– TCPdump – HowTo -> http://suckup.de/blog/2010/08/02/tcpdump-howto/

– netstat + ss + lsof -> http://suckup.de/blog/2010/01/31/netstat-ss-lsof/

– nethogs und iftop – Traffic analysieren -> http://suckup.de/blog/2010/01/31/nethogs-und-iftop-traffic-analysieren/

– lsof – list open files -> http://suckup.de/blog/2010/02/22/lsof-list-open-files/

Android 2.2.3 Froyo (Mod+X => SpicagenMod RC1) – Samsung GALAXY SPICA I5700

I will publish my work (files) here because different forums all over the world use it and I have to update all the posts so that everybody find out that there is a new version of “Mod + X” (SpicagenMod) | here you can get more infos & help from the “Samdroid.Net”-Commuity -> [Dev] SpicagenMod BETA3 & HELPDESK + FAQs + HOW-TO GUIDES

 

Current version: Mod+X => SpicagenMod RC1

 

[stextbox id=”alert” caption=”Warning”]Even if this update should have worked for me without problems, I can not guarantee that this will work for you, so you maybe create a backup of your files before the installation![/stextbox]

 

 

INSTALLATION
If you are updating from any other Android-Version than Froyo (2.2) do wipe data/cache BEFORE installing SGM.
1. Push it to your SDcard, go to recovery and apply pushed file.
2. After complete boot make reboot one more time!

This update won’t wipe your data!

 

—————————————–

 

Download:

->SpicagenMod RC1 (~ 85M, md5: ec0ad09b51595b974020d882f8323a4f)

 

Kitchen:
->kitchen.voku-online.de (offline for the moment) 

 

Sources:

->github.com/voku

 

—————————————–

 

HowTo

If you have already installed Android 2.2 Froyo -> appy the “Mod + X” via Recovery :) otherwise or if you will have a “clean install” …

1.) Odin + spica_jc3“I570EXXJH6.tar” 

Windows: 
1.1) install driver 
1.2) start Odin, select new files + “spica_jc3.ops” 

1.3) do not connect Spica with you pc -> press “quieter+camera+hang” to boot in the download-mode 


1.4) connect Spica with your pc -> start odin-update

2.) Odin + spica_jc3“i5700_LK2-08_PDA.tar” 

3.) press “quieter+call+hang” -> “Wipe” -> “Wipe data/cache”

4.) Recovery: apply zip-file

 

PS: here you can find a detailed HowTo but it is only in German language > Android 2.2 Froyo (CyanogenMod) – Samsung GALAXY SPICA I5700

 

—————————————–

 

Changelog: SpicagenMod

SpicagenMod Froyo, based on CyanogenMod 6.1.1 & Android 2.2.3
========

RC1
* added "VOKU"-kernel v3.4 (24bpp) as default
* edit sound -> louder [need testing] (asound.conf)
* updated DalvikVM (github.com/voku/android_dalvik)
* updated Bionic-lib (github.com/voku/android_bionic)
* updated WebKit (github.com/voku/android_external_webkit)
* updated png-lib v1.2.47 (github.com/AOKP/external_libpng)
* updated some Apps (Contacts, LatinIME, Browser, ES File Explore, Nemus Launcher,
* .... MediaProvider [gingerbread], Google Maps, YouTube, GoogleVoice,
* .... GooglePlayStore [Market], Music)
* removed some Apps (DSPManager, VpnServices, OpenVPN, QQPlayer)
* fixed SQLite problems - revert last changes (github.com/voku/android_external_sqlite)
* fixed Contakt problem - revert to SM-version (github.com/voku/android_packages_apps_Contacts)
* updated framework -> added "app.keeping for services" (github.com/voku/sm_android_frameworks_base)
* updated framework -> revert "User-to-User signaling Info" (github.com/voku/sm_android_frameworks_base)
* revert orientation-backport from CM9 (github.com/voku/sm_android_frameworks_base)
* added some framework-fixes from CyanogenMod [isc] (github.com/voku/sm_android_frameworks_base)
* added ICS theme (madoreq)
* added new instal-scripts (mpjoe2000)
* default build flags (github.com/voku/sm_android_build)
* updated "SpicaTweak Lite" v1.7.5 (github.com/voku/Android-Tweak) (thx @kiryl)
  - added "fix_permissions"
  - 3G/Edge Tweaks
  - SQLite Tweaks
  - added zipalign-Tweaks

BETA6
* added "VOKU"-kernel v3.2 (24bpp) as default
* updated some Apps (ES File Explore, k-9 Mail, Gallery3D, DSPManager, Terminal Emulator, Music,
* .... Barcode Scanner v4, QQPlayer, Google Maps, Browser, Phone, DownloadProvider,
* .... UserDictionaryProvider, ApplicationsProvider)
* updated Bionic-lib (github.com/voku/android_bionic)
* updated Busybox (github.com/voku/android_external_busybox)
* updated "Skia Graphics Engine" (github.com/voku/android_external_skia)
* updated WebKit (github.com/voku/android_external_webkit)
* updated "libFLAC" (github.com/voku/android_external_flac)
* updated zoneinfo - 2012b
* updated SQLite (github.com/voku/android_external_sqlite)
* updated DalvikVM (github.com/voku/android_dalvik)
* fixed "su"-problem
* fixed "GPS"-problem
* fixed longgg... boot time
* added new default settings (keep apps [Launcher, MMS, ... ] in memory by default)
* revert framework -> tweak SQLite-settings [need testing] (github.com/voku/sm_android_frameworks_base)
* added framework-features from milaq [froyo] (github.com/milaq/android_frameworks_base)
  - keep apps in memory (e.g.: echo "sys.keep_app_2=com.whatsapp" >> /system/build.prop;)
  - don't start gmaps network location service, if gmaps main isn't running
* added some framework-fixes from CyanogenMod [isc] (github.com/voku/sm_android_frameworks_base)
  - improved widget scrolling speed
* added framework-fixes from codeaurora.org [froyo]
  (https://www.codeaurora.org/gitweb/quic/la/?p=platform/frameworks/base.git;a=shortlog;h=refs/heads/froyo)
* added framework-fixes from peteralfonso [gingerbread] (github.com/peteralfonso/platform_frameworks_base)
* updated "SpicaTweak Lite" v1.7.1 (voku1987)
  - removed SQLite-Settings
  - edit TCP read/write
  - cleaned up the script
  - more I/O-Tweaks
  - removed zipalign-Tweaks
  - removed extra CPU-settings for Apps
  - Firewall-Tweaks [need testing]

BETA5
* added "VOKU"-kernel v1.7C [with Qbanin's touch driver] (24bpp) as default
* increased default audio-volume [/system/etc/asound_default.conf]
* updated install-script from SpicagenMod
* updated Android 2.2.2 -> Android 2.2.3 (voku1987)
* updated APN-config [apns-conf.xml] (voku1987)
* updated "block advertising" [hosts] (voku1987)
* updated "SpicaTweak Lite" v1.4.1 (voku1987)
* updated DalvikVM (github.com/voku/android_dalvik)
* updated "Skia Graphics Engine" (github.com/voku/android_external_skia)
* updated Bionic-lib (github.com/voku/android_bionic)
* updated SQLite v3.7.9 (with sync off) (github.com/voku/android_external_sqlite)
* updated su-binary [v3.0.3]
* updated some Apps (Google Maps 6.0.3, Market 3.4.4, k-9 Mail 4.103, Camera, Settings, SMParts,
* .... Phone, LatinIME, RealCalc, Browser, Gallery3D, Superuser 3.0.7, QQPlayer, Google Voice,
* .... ES File Explorer, YouTube, MediaProvider)
* added all default Apps (OpenVPN, "LiveWallpapers"-Apps, DSPManager, ...)
* added "QuickSearchBox"-App => removed "Google QuickSearch"-App
* removed "ApplicationsProvider"-App (mpjoe2000)
* removed Roboto-Font -> added CyanogenMod-Font (voku1987)
* removed auto "zipalign"-script (voku1987)
* updated "Music"-App (github.com/voku/android_packages_apps_Music)
* updated "Gallery3D"-App (github.com/voku/android_packages_apps_Gallery3D)
* fixed safe factory reset [need testing] (mpjoe2000)
* fixed force close -> menu-settings (voku1987)
* fixed DeskClock-App (voku1987)
* updated framework -> tweak SQLite-settings [need testing] (github.com/voku/sm_android_frameworks_base)
* added framework-fixes from CyanogenMod [gingerbread] (github.com/voku/sm_android_frameworks_base)
* added framework-fixes from Android [master] (github.com/voku/sm_android_frameworks_base)
  - but again no theme-compatibility to SGM BETA2.1 !!

BETA4
* added "FrozenLake v3 with default touch driver" as default (darth_llamah)
* added modified Transpa-Theme (eksajlee & voku1987)
* added Roboto-Font from Android 4.0 (voku1987)
* updated APN-config [apns-conf.xml] (voku1987)
* added boot-sound [off by default] (voku1987)
* added new SGM boot_logo/boot_animation (samdroid.net community)
* added optimized "Gallery3D"-App => removed "QuickPic"-App
* added "Music"-App => removed "MIUI-Music"-App
* added keyboard with multi-language => removed default keyboard (github.com/voku/android_packages_inputmethods_LatinIME)
* added "k-9 Mail"-app v3.800 => removed "Email"-App (code.google.com/p/k9mail/downloads/)
* updated some Apps (Browser, DownloadProvider, Gallery3D, RealCalc, Google Maps, Superuser, ES File Explorer, ...)
* removed some Apps (Facebook, DSPManager, VPN) | if you need it, you can add it by yourself
* updated su-binary [v3]
* updated DalvikVM (github.com/voku/android_dalvik)
* updated Bionic-lib (github.com/voku/android_bionic)
* updated jpeg-lib optimized (github.com/voku/android_external_jpeg)
* updated WebKit (github.com/voku/android_external_webkit)
* update Opencore [optimized mp3] (github.com/voku/sm_android_external_opencore)
* fixed Gallery3D [zoom by pictures from camera] (voku/android_packages_apps_Gallery3D)
* fixed Bluetooth-CarKit-problem
* fixed wifi-dns (LordManta)
* code fixes (voku1987)
  - fixed GPS-Bug
  - fixed YouTube-Bug
  - theme-compatibility to SGM BETA2.1
* added "SpicaTweak Lite" v1.1 -> removed "SSSwitch" (voku1987)
  - some default tweaks without config via ssscfg
* added & updated translations (voku1987)
* added gingerbread backport native power manager service module
* added many framework-fixes via "Fork Queue" from froyo (github.com/voku/sm_android_frameworks_base)
* added framework-fixes from kernelzilla [froyo] (github.com/kernelzilla/android_frameworks_base)
* added framework-fixes from CyanogenMod [gingerbread] (github.com/voku/sm_android_frameworks_base)
* added framework-fixes from LiquidSmoothROMs (gingerbread) (github.com/LiquidSmoothROMs/android_frameworks_base)

BETA3
* added "VOKU"-kernel v1.7A [with Qbanin's touch driver] (24bpp) as default
* converting to ALL2EXT2 only if it's at EXT2 (luismaf, voku1987)
* updated GPS-config / NTP-config  [gps.conf] (voku1987)
* updated APN-config [apns-conf.xml] (voku1987)
* SGM boot_logo/boot_animation [without yellow color ;)] (samdroid.net community)
* updated / added install-script (voku1987)
* code fixes & clean-up (voku1987)
* optimized build flags (voku1987)
* added Intercept 3D drivers
* added 640x480 Camera with 30FPS to MP4 (maciek4323)
* added "RealCalc"-App => removed "Calculator"-App
* added "LauncherPro"-App => removed "ADWLauncher"-App
* added "MIUI-Music"-App => removed default "Music"-App (jankomuz)
* added "Email"-App with policies fix for Exchange => removed default "Email"-App
* added "QQPlayer"-App => removed "RockPlayer"-App
* added "ES File Explorer"-App => removed default FileManager
* added "QuickPic"-App => removed "Gallery3D"-App
* added default keyboard (android.git.kernel.org/?p=platform/packages/inputmethods/LatinIME.git)
* removed "Genkiller"-App
* updated some Apps (Google Maps, Superuser, Mms, Phone, Contacts, SM-Settings, Settings, Terminal Emulator, Browser...)
* updated "block advertising" (voku1987)
* updated png-lib v1.2.46 (github.com/CyanogenMod/android_external_libpng)
* updated jpeg-lib optimized for armv6 (github.com/mansr/android_external_jpeg)
* updated zlib v1.2.5 (github.com/CyanogenMod/android_external_zlib)
* updated SQLite v3.7+ (with sync off) (voku1987)
* updated libcamera (without sources?!)
* updated dropbear [ssh-daemon] (github.com/tpruvot/android_external_dropbear)
* updated Memory-Cache for webkit (github.com/voku/android_external_webkit)
* updated Sound-Control / Sound-Mixer (github.com/voku/android_hardware_alsa_sound)
* updated default theme-images & animation (voku1987)
* fixed Bluetooth-bug (criminal)
* fixed Market-install-bug (voku1987)
  - download cache will be stored now on your SD-card (/sdcard/.cache/)
* fixed earphone without mic bug
  - hear your caller through the headphones and talking via Mobile
* added faster boot-animation (surV)
* added configurable Bluetooth timeout (voku1987)
* added Norwegian translation (AreEdw)
* added "About ROM" in "Settings"-App (github.com/DroidConcepts/android_packages_apps_DroidConceptsSettings)
* added quieter camera-click-sound (voku1987)
* added "vim" (github.com/CyanogenMod/android_external_vim)
* added "SSSwitch" v1.3.4 (voku1987)
  - I/O Scheduler = BFQ
  - optimized net-settings
  - optimized I/O-settings
  - "low-memory task killer" settings configurable via "ssscfg" in the "Terminal Emulator"-App
  - CPU-settings are disabled by default
  - "keep App in memory"-settings are disabled by default
* added framework-fixes from peteralfonso [gingerbread] (github.com/peteralfonso/platform_frameworks_base)
* added framework-fixes from CyanogenMod [gingerbread] (github.com/CyanogenMod/android_frameworks_base)
* added framework-fixes from android [gingerbread] (github.com/android/platform_frameworks_base)
* added framework-fixes from pcfighter [froyo] (github.com/pcfighter/platform_frameworks_base)

BETA2
* Android 2.2.2 (AOSP)
* big code clean-up (darth-llamah)
* Bluetooth discoverability configurable (CyanogenMod, nebkat)
* clock text color fixes (nebkat)
* CM FileManager enabled (cadavre)
* DownloadManager and Browser from Gingerbread (nebkat)
* Email policies fix for Exchange (cadavre)
* extended SMS/MMS writing area to 6 lines in portrait (cadavre)
* framework cleanups (nebkat)
* locking in memory fix for Phone, Contacts and Superuser (cadavre)
* modified build flags and scripts (CyanogenMod, LeshaK, guybrusht)
* power button disabled in lockscreen (cadavre)
* PowerWidget - more long-press options (cadavre)
* rotary answer for calls (nebkat)
> RTL for framework and webkit (Y6b, cadavre) [available as additional package]
* SGM logo/anim (samdroid.net community)
* SMParts cleanup (nebkat)
* SMS send to wrong recipient fix (cadavre)
* some build fixes (Piskor)
* status bar PowerWidget new options (nebkat)
* sync off for sqlite databases improves in speed (XDA, cadavre)
* xml importing from CM and SGM fixed (cadavre)
* lockscreen improvements: (CyanogenMod, nebkat)
  - rotary lockscreen unlock drag down
  - music addons
  - battery % info
  - tab vibration on/off
  - mms/phone tab custom apps
* Android fixes: (submitted by Piskor)
  - DNS fix for wifi
  - Change default DNS server for Tethering
  - Introduce a list of all the audio files
  - Telephony: Fix radio state printing
  - Telephony: Process MT SMS with MTI set to 3
  - Fixing counting the number of days in call log screen
  - Change in media scanner to set correct date
  - frameworks/base/telephony: Release wakelock on RIL request send error
  - Changing connect and response timeout
  - Bluetooth OBEX timeout problem
  - Avoid leaking sockets
  - Launcher is missing anti-aliasing
  - java.lang.RuntimeException:Unable to pause activity (com.android.settings.applications.StorageUse)

BETA1
* new kernel WLAN module to avoid SoDs (Lukiqq)
* final DPad music controls (cadavre)
* final framework theme text colors (cadavre)
* possibility of locking Phone and Contacts in memory so phone can be more like phone (cadavre)
* integrated Intercept3D drivers (cadavre)
* smooth YouTube HQ playing (cadavre thanks to Intercept)
* you can use CM and SM .xml theme files now (cadavre)
* Finnish localization (FI translation team) [fi-rFI]
* GB green clock text color (Freedom)
* Parrot autopairing fix (cadavre)
* latest ADWLauncher (nebkat)
* looping ringtone (criminal)
* avoid immediate turning on/off wifi freeze (cadavre)
* lockscreen overlap fix (cadavre)
* Live Wallpapers enabled (cadavre)
* using OpenVPN-android-settings app (cadavre)
* minor changes (nebkat, piskor, cadavre)

pre-beta-2 (alpha_b2)
* [source] vendor & device trees cleaning and fixing (LeshaK)
* DPad music controls fixes (cadavre)
* SMParts bug fixes (cadavre)
* YouTube hq play fix (cadavre)
* new gapps 20110301 (piskor)
* new Superuser and su lib (cadavre/criminal)
* fix for default statusbar text colors (cadavre)
* OpenVPN fixes (cadavre)
* HU translation (HU translation team)
* SMParts translations (Samdroid.net community)
* "Launcher settings" bug fix (cadavre)
* 3 secs long-press BACK to kill (cadavre)
* minor changes (SM team)

pre-beta-1 (alpha_b1)
* initial build of SM (cadavre)
* added SM-froyo specific prop settings (guybrusht)
* included official Gingerbread theme (cadavre)
* hi-res png for GB theme (Kyojin)
* Ubuntu fonts (cadavre)
* Statusbar music controls (cadavre)
* settings for HOLD button (cadavre)
* keep SU in memory to avoid non-granting su access (cadavre)
* volume button orientation mapping (cadavre)
* orientation listener changes (cadavre)
* wake screen on new notification (f.e. sms, reminder, usb...) (cadavre)
* new CMParts adapted from Gingerbread (cadavre)
* created SMParts based on new CMParts (nebkat)
* framework removals: (cadavre)
- Bluetooth HID
- mouse pointer

 

—————————————–

 

Battery Calibration

1.1) Battery Calibration? -> “Calibration needs to be done after flashing a new ROM, but you can calibrate any time you think your battery is miscalibrated. This program does it by removing the batterystats.bin system file. The OS generates a new clean batterystats file soon, thus any fake information from the previous ROM is removed.
It’s suggested, but not necessary, to let the phone fully discharge after calibration, then charged to 100% without break.” 

1.2) Battery Calibration! -> “If anyone has a battery drain after an update/kernel change, wipe batterystats via recovery. At first, charge your phone to 100% when it’s on. turn it off and connect the charger again. Wait till the battery on the screen says “battery fully charged”. Disconnect the charger & reboot directly into the recovery and wipe the batterystats.” 

PS: maybe you can also try this App for calibrate your battery -> Easiest way i found to calibrate my battery

2.) More Battery Life Out of Your Android
What do you do when your battery is about to die …??

2.1) Use the Power Widget to Easily Toggle GPS, Bluetooth, Wireless, and Screen Brightness

2.2) 3G – requires a lot of power, so you can choose “2G Only” 

2.3) Backlight – adjust the backlight to be less bright (Settings –> Display –> Brightness)

2.4) Wi-Fi – disable Wi-Fi when you don’t need it

2.5) Bluetooth – disable Bluetooth when you don’t need it

2.6) GPS – disable GPS when you don’t need it

2.7) Disable Apps that Sync Constantly

For example you can use the “k-9”-Email App instead of the built-in Email application and activate the Push technology from “k-9” to get you mails. 

2.8) Background-Apps

Try the OS Monitor-App to see how much resources your running Apps consume!!!

But also other background-apps like twitter, facebook etc. can reduce the battery-time, so you can change the Update-Interval (Settings –> Background Updates) or try e.g. “MinFreeManager”-app or “SSSwitch” and configure the kernel settings to kill background-apps without installing a app for killing apps BUT this will reducing the multitasking features from your phone! 

2.9) More general Information

-> Complete Guide to Maximizing Your Android Phone’s Battery Life – How-To Geek

3) Battery Manager Apps

Maybe you can also try a Battery Manager App, but I don’t need/use it and if you try the above tips I think you will also not need it 
– “SuperPower
– “JuiceDefender

 

—————————————–

 

You can download more Apps for Spica here -> APKitchen  Files for Spica  (sugarsync.com is free (5 GB)) & here you can find some -> Wallpapers for Android