old PDF version - Home Page of Johann Mitloehner

Transcription

old PDF version - Home Page of Johann Mitloehner
Linux, Shell and Tools
Johann Mitlöhner
12. März 2012
1
History (roughly)
• 1969: Ken Thompson wants an efficient bare-bones system to run his favourite Multics game Space
Travel on a PDP-7 (4k of 18 bit words)
–
–
–
–
writes first version of Unics (pun on Multics) in four weeks: kernel, shell, editor, assembler
soon joined by others at AT&T’s Bell Labs
Thompson develops interpretive language B
Dennis Ritchie develops C (based on B)
• 1972: Unix rewritten in C
– source code made available to universities as anti-trust law prohibits product sale by AT&T
– base for commercial Unix versions
• 1978: Berkeley Software Distribution (BSD)
• 1983: GNU Project announced by Richard Stallman at MIT
– free software: not in price, but in being unrestricted by other distributors to modify the program
as necessary
– mass collaboration project
– develop a sufficient body of free software ... to get along without any software that is not free
– full access to all source code
– requirement of then posting any changes made publicly for other users to benefit from as well
– lots of software, but no stable kernel
•
•
•
•
•
•
•
•
•
26 Aug 1991: Linus Torvalds posts to comp.os.minix: “I’m doing a (free) operating system”
Sep 1991: Linux version 0.01 released to FTP server ftp.funet.fi of the Helsinki University of Technology
Dec 1991: Linux 0.11 - self-hosted (compile Linux on Linux)
Aug 1993: Debian
Nov 1994: Red Hat
1996: S.u.S.E Linux 4.2
2000: Knoppix Live CD
2003: Fedora (free Red Hat)
2004: Ubuntu 4.10 The Warty Warthog Release
Linux Operating System = Linux Kernel (6%) + GNU software (15%) + *lots* of other free software
2
Einige Grundkonzepte
Distributionen : Debian, Ubuntu, Suse, Red Hat, Fedora, ... – Sammlungen von Softwarepaketen zur
einfachen Verteilung und Installation. Jede Distribution hat ihren package manager, der es ermöglicht,
1
recht einfach weitere Pakete zu installieren, und dabei zum gewünschten Paket automatisch auch
abhängige Pakete dazu installiert.
updates : Neue security patches und andere updates zu den einzelnen Paketen können bei den meisten
Distributionen recht einfach halb- oder vollautomatisch mit Hilfe des package managers (und einer
Internetverbindung) realisiert werden.
release : Ubuntu bringt alle 6 Monate eine neue Version mit Nummerierung Jahr.Monat und eigenem
Namen heraus. Manche davon sind LTS (long time support) mit updates bis 3 Jahre, ansonsten endet
der update Dienst nach 18 Monaten, dann muß auf eine neue (major) release gewechselt werden.
Während laufende updates normalerweise keine Probleme bereiten, ist der Releasewechsel oft nicht
ganz reibungslos.
kernel : zentrales Modul des Betriebssystems, immer im Speicher geladen, erledigt die wichtigsten laufenden
Aufgaben.
swap space : Auslagerungsdatei, wird zur (virtuellen) Erweiterung des Speichers verwendet. Gerade nicht
benötigte Daten werden auf die Festplatte geschrieben und erst bei Bedarf wieder eingelesen. Zwei
Möglichkeiten:
• swap partition: ein Teil der Festplatte (eine Partition) wird nur zu diesem Zweck verwendet
• swap file: eine Datei wird zu diesem Zweck angelegt, und zwar aus physisch zusammenhängenden
d.h. hintereinander auf der Platte angeordneten Blöcken, sodaß der Zugriff schnell genug ist
(nützliche Befehle in diesem Zusammenhand: dd, mkswap).
Für desktop Rechner ist normalerweise ein swap file mit ca. gleicher Größe wie RAM ausreichend.
Wenn der Hauptspeicher ausgeht und der Rechner zu swappen beginnt, wird alles deutlich langsamer,
aber immerhin noch funktionsfähig.
Es geht auch ohne swap space, aber wenn dann der Hauptspeicher ausgeht, beginnt das System von
sich aus Prozesse zu beenden, was meist eher nicht wünschenswert ist.
boot manager : kleines Programm, das beim Starten des Rechners eine Auswahlliste präsentiert, zur Wahl
des Betriebssystems in der folgenden Sitzung.
dual-boot : zwei Betriebssysteme (auf unterschiedlichen Partionen der Festplatte) installiert. Vor der
Sitzung wird eines davon ausgewählt, das dann gestartet wird.
virtual box : Emulator für andere Betriebssysteme innerhalb der Linux-Sitzung (oder mit anderem host
operating system). Stellt z.B. eine virtuelle Partion zum Installieren und Laufen von Windows zur
Verfügung. Innerhalb der virtual box sollten theoretisch alle Programme genauso funktionieren, wie in
einer Sitzung mit normal installiertem Betriebssystem; tatsächlich gibt es besonders bei 3D Funktionen
oft Probleme. Außerdem schlechtere Performance. Das zu emulierende Betriebssystem muß zuerst
installiert werden (Lizenz, Aktivierung, ...). Ähnliche Lösung, besser, aber kommerziell: vmware.
wine : wine is not an emulator – Die Windows-Bibliotheksfunktionen wurden in Linux nachprogrammiert,
sodaß Windows-Programme direkt ausgeführt werden können, ohne Emulation, und ohne vorherige
Windows-Installation. Beste Performance, weil keine Zwischenschicht für die Emulation, aber auch
hier oft (bzw meist) Probleme mit 3D Funktionen.
desktop : grafische Oberfläche mit window manager, Hintergrund, Icons für Laufwerke, task panel usw.
Viele Varianten, am bekanntesten: Gnome (default in Ubuntu), KDE. Die Wahl des desktop beeinflußt
zwar das Erscheinungsbild, aber die grundlegenden Funktionen sind bei allen Desktops und window
managern sehr ähnlich; außerdem können z.B. für KDE entwickelte Programme problemlos auch unter
Gnome verwendet werden.
2
X window system : die Implementierung der Client-Server-Architekur für GUI-basierte Programme (graphical
user interface). Der X server läuft auf dem lokalen Rechner, die X clients (Programme, die ein GUI
verwenden) können auch auf anderen Rechnern laufen. Gnome und KDE verwenden die X windows
Funktionen und machen Sie auch für Endbenutzer leicht verfügbar, damit die gewohnten Elemente wie
Menues, Papierkorb usw. vorhanden sind.
Live CD : mit der Ubuntu Live CD kann eine Sitzung mit dem Betriebssystem gestartet werden, ohne die
lokale Festplatte zu verändern. Auch über USB Stick kann eine solche Sitzung gestartet werden. Weil
der Zugriff auf CD und USB Stick deutlich langsamer ist als auf die interne Festplatte, dauert das
Starten von Programmen während der Live CD Sitzung recht lange.
ram disk : während der Sitzung mit der Live CD wird im Hauptspeicher (RAM) ein Bereich angelegt, der
wie eine Festplatte funktioniert: dort können auch weitere Softwarepakete installiert werden; natürlich
nur für die Dauer der Sitzung mit der Live CD.
root user : eine besondere Benutzerkennung mit allen Rechten. Normalerweise arbeitet der Linux user mit
einer persönlichen Kennung, die Zugriff auf die eigenen Dateien erlaubt, aber z.B. nicht die Installation
von Softwarepaketen. Dazu sind root Rechte (admin, super user) nötig. Während der Sitzung mit der
Live CD hat der temporäre user auch alle root Rechte.
Installation : mit Hilfe der Ubuntu Live CD kann Linux installiert werden, d.h. permanent auf der Festplatte
des Rechners als Betriebsssytem zur Verfügung stehen, entweder allein, oder mit dual-boot zusammen
mit anderen Betriebssystemen und wahlweise bei Starten des Rechners. Dazu wird zumindest eine
Partition benötigt, mit ca. 10 GB Speicherplatz (Minimum, besser ein vielfaches davon).
apt : Ubuntu und Debian package manager. Kann über GUI verwendet werden, oder in der shell (apt-get,
apt-search, apt-update).
apt-get dist-upgrade : alle installierten Pakete werden auf den neuesten Stand gebracht (über Internet
oder lokalen mirror).
repositories : die Ubuntu Distribution ist in mehrere repositories geteilt. Unterschiede bestehen z.B. in den
Lizenzen und in den Quellen (Ubuntu Produzent Canonical, Open Source community, closed source
commercial).
main : freie Software, von Canonical unterstützt
restriced : proprietär d.h. nicht frei, aber von Canonical unterstützt, z.B. Treiber für Geräte wie
Grafikkarten, vom jeweiligen Hersteller entwickelt
universe : frei und von der Open Source community gepflegt
multiverse : verschiedene (für die meisten Benutzer irrelevante) Beschränkungen durch Lizenz
Normalerweise spricht nichts dagegen, alle repositories zu aktivieren (System/Administration/Software
Sources). Das ist seit Ubuntu 9.04 auch per default der Fall.
apt-mirror : wer zuhause eine langsame oder gar keine Internetverbindung hat und eine USB Platte mit
min. 35 GB freiem Platz besitzt, kann mit Hilfe von apt-mirror eine Kopie der gesamten Ubuntu
repositories machen (ohne source code), die dann zuhause zur Installation und zum Update von Paketen
verwendet werden kann. Natürlich kann auch ein Verzeichnis auf der Laptop-Festplatte als mirror
dienen.
3
Dateisysteme
Dateisysteme verwalten den physischen Speicher von Datenträgern, sodaß Applikationen nicht auf technische
Unterschiede von Medien Rücksicht nehmen müssen. Dateisysteme unterscheiden sich u.a. in
3
•
•
•
•
der Nutzung der Kapazität des Datenträgers
der Performance
der Unterstützung von sehr großen Dateien
den möglichen Zeichen in Dateinamen
Für größtmögliche Kompatibilität empfiehlt es sich, in Dateinamen nur Zeichen aus a-z, A-Z, 0-9, sowie
Punkt (.), Underscore ( ) und Bindestrich (—) zu verwenden. Auf keinen Fall Backslash, Forward Slash,
Doppelpunkt.
• FAT32
–
–
–
–
–
–
Älteres Windows-Dateisystem,
daher beste Unterstützung in anderen Betriebssystemen wie Linux und Mac OS,
daher empfehlenswert für mobile Datensträger wie USB Sticks
Unter Linux vfat genannt
Maximale Dateigröße 4 GB
Für den Transfer Linux – Windows wichtig: kennt Keine permissions und owner.
• NTFS
Neueres Dateisystem für Windows, auch in Linux seit einigen Jahren unterstützt.
• ext3
– Standard für Linux
– Unterstützung in Windows nur durch 3rd party Treiber, die aber frei verfügbar sind
4
Shell
Beim Einloggen in das Linuxsystem am eigenen PC bekommt der Benutzer typischerweise eine grafische
Schnittstelle, z.B den Gnome Desktop. Daneben gibt es aber auch die Shell, eine Text-basierte Schnittstelle,
die auf Eingaben über die Tastatur reagiert. Diese Schnittstelle hat gegenüber der grafischen eine Reihe von
Vorteilen, insbesondere dann, wenn immer wieder gleiche Aufgaben zu erledigen sind, oder nicht alltägliche,
sodaß in den Desktopmenüs nichts brauchbares vorgesehen ist. Es lohnt sich daher, diese Shell kennenzulernen.
Mit einem Terminal (in Gnome unter Applications/Accessories) starten Sie eine Shell. Dort blinkt nun ein
Cursor, links daneben sehen Sie ein Prompt. Typischerweise zeigt es das aktuelle Verzeichnis, kann aber
auch anders konfiguriert werden. Die Shell wartet auf Kommandos von Ihnen, die Sie über die Tastatur
eingeben und mit der Return Taste (Neue Zeile) abschließen. Die Maus hat hier keine Funktionen außer
Copy/Paste. Die wichtigsten Kommandos sind:
ls
ls -la
mkdir tmp
cd x
cd
pwd
cp x y
mv x y
rm x
rm -rf x
list
long list
make new directory “tmp”
change working directory to “x”
change to home directory
print working directory
copy file x to y
move (rename) file “x” to “y”
remove file x
remove directory x and all its contents
Mit dem Editor pico können Sie Textdateien erstellen, indem Sie den Namen der neuen Datei angeben:
4
pico newfile.txt
Schreiben Sie einige Zeilen Text und speichern Sie mit Strg-O gefolgt von Return, verlassen Sie mit Strg-X.
Wenn Sie nun wieder “ls” eingeben, sehen Sie die neue Datei in der Liste.
Unter Linux verwenden wir die Shell bash, eine neuere Version der traditionellen Unix Shell sh. Die bash
bietet viele Features, von denen wohl die history und die file name completion die wichtigsten sind.
• Mit der Pfeil-Aufwärts-Taste bekommen Sie die letzten Befehle, die Sie eingegeben haben, und können
diese nochmal ausführen, indem Sie wieder auf Return drücken; Sie können den alten Befehl vorher
auch ändern, was viel Schreibarbeit sparen kann.
• Oft möchte man einen der letzten Befehle aus der history wiederholen, der mit den Anfangsbuchstaben
einfacher bezeichnet werden kann als mit einigen Pfeil-Aufwärts, z.B. “pico MyClass.java”. Das geht
mit dem Rufzeichen:
!pi
• Datei- und Programmnamen können mit der Tabulatortaste vervollständigt werden, sobald sie eindeutig
sind. Wenn Sie z.B. die Datei file1.txt mit ls -l auflisten wollen, können Sie nach “ls -l f” den Tabulator
drücken. Falls Sie keine andere Datei im aktuellen Verzeichnis haben, die mit “f” beginnt, wird der
restliche Dateiname vervollständigt. Falls es mehrere Dateien gibt, dann können Sie nochmals auf
Tabulator drücken und sehen eine Liste der in Frage kommenden Dateien. Dann können Sie noch
weitere Buchstaben eingeben, bis der Name eindeutig ist und mit Tabulator vervollständigt werden
kann. Auch damit kann man viel Schreibarbeit sparen.
Eine Liste Ihrer früheren Kommandos sehen Sie mit dem Befehl
history
5
Permissions
Geben Sie zum Vergleich
ls -la
ein, um alle Dateien und Verzeichnisse zu sehen (auch versteckte), sowie die Permissions:
-rw-r--r-Das erste Zeichen gibt den Typ an, hier “-” für Datei, z.B. “d” für Verzeichnis, “l” für Link. Danach folgen in
drei Bereichen zu je drei Zeichen die Berechtigungen für Sie selbst, Ihre Gruppe (jeder Unixbenutzer gehört
einer oder mehreren Gruppen an), und für alle anderen. Dabei steht in jedem Bereich das erste Zeichen für
Lesen, das zweite für Schreiben, und das dritte für Ausführen.
Die Datei newfile.txt können Sie selbst lesen und schreiben, andere können sie nur lesen, ausführen kann sie
niemand. Bei Verzeichnissen bedeutet Ausführen soviel wie Wechseln in das Verzeichnis.
Beachten Sie den Eintrag “.” in dem Ergebnis von “ls -la”. Der Ausdruck “.” steht für das aktuelle Verzeichnis,
in diesem Fall Ihr home directory, das normalerweise die permissions “drwxr-xr-x hat, d.h. andere dürfen in
Ihrem Verzeichnis zwar lesen, aber nichts ändern.
Zum Ändern der permissions gibt es das Kommando “chmod”:
5
chmod go-r newfile.txt
Nun darf niemand außer Ihnen die Datei newfile.txt lesen oder schreiben. Dabei beinhaltet Schreiben auch
Ändern und Löschen.
chmod go+r *.txt
Das Zeichen “*” steht für “alle”. Alle Dateien im aktuellen Verzeichnis können nun von allen Benutzern (“g”
für group, also alle aus Ihrer Gruppe, “o” für others, also alle anderen) gelesen werden. Benutzer bezieht
sich dabei nicht nur auf Personen, die mit dem Rechner arbeiten, sondern auch auf Programm, die auf dem
Rechner laufen, denn jedes Programm läuft unter Unix unter einem Benutzer und daher auch mit bestimmten
Berechtigungen. Interessant ist das z.B. für Webseiten, die für alle lesbar sein müssen, denn der Webserver
läuft typischerweise unter dem Benutzer “apache” und kann daher Ihre Webseiten nur lesen, wenn sie die
richtigen permissions haben, und in einem für alle lesbaren Verzeichnis stehen; ein Verzeichnis ist aber nur
lesbar, wenn auch die übergeordneten Verzeichnisse lesbar sind. Sowohl Ihr “www” Verzeichnis (oft auch
“public html” genannt) als auch Ihr home directory müssen daher die permissions drwxr-xr-x haben.
6
Man
Alle installierten Programme sollten im Online Manuel dokumentiert sein. Dieses steht Ihnen jederzeit mit
dem Befehl “man” zur Verfügung:
man chmod
man ls
man cp
In der Beschreibung können Sie mit den Bildaufwärts/abwärts Tasten blättern und mit “q” verlassen.
7
Environment variables
In der Shell haben Sie eine Reihe von Werten als environment variables, die verschiedene Programme
verwenden, um Einstellungen abzufragen. Mit
env
sehen Sie eine Liste der Variablennamen mit den Werten. Interessant ist z.B. die Java-Version, die Sie
verwenden:
echo $JAVA_HOME
Ist eine Variable nicht gesetzt, kommt eine Leerzeile zurück. Soll eine Variable gesetzt werden, und zwar so,
daß sie auch innerhalb von anderen shell scripts (nicht nur innerhalb Ihrer Shell) zur Verfügung steht, dann
verwenden Sie den Befehl “export”:
export JAVA_HOME=$HOME/jdk1.6.0
Die Variable HOME enthählt natürlich den Pfad auf Ihr home directory. Wenn Sie nun nochmals
6
echo $JAVA_HOME
eingeben, sehen Sie den gesamten Pfad. Environment variables werden typischerweise in .bashrc gesetzt,
eine Datei, die beim Start jeder Shell ausgeführt wird. Sie können sich diese Datei mit dem Editor ansehen;
ändern sollten Sie zunächst besser nichts, bevor Sie sich nicht mit shell scripts auskennen.
8
Shell scripts
Wenn der Inhalt von Variablen abgefragt werden soll, dann muß das Zeichen $ verwendet werden. Das ist
oft umständlich, funktioniert aber auch innerhalb von Texten:
echo "Im Verzeichnis $HOME sind meine Dateien."
Der Befehl “echo” wertet den Ausdruck aus und gibt das Ergebnis zurück. Damit sind wir auch schon mitten
im Shell-Programmieren, das nicht anders ist als das interaktive Arbeiten. Legen Sie mit dem Pico-Editor
eine Datei “doit” an und schreiben Sie folgendes hinein:
#!/bin/sh
rm -rf tmp.dir
mkdir tmp.dir
cd tmp.dir
date > file1.txt
pwd >> file1.txt
1. Zeile: dieses Skript wird mit /bin/sh als Shell ausgeführt. Auch andere Programme können Textdateien
als Code auffassen und ausführen, z.B. Perl, Python.
2. Zeile: bleibt per Konvention leer. Hier könnten Sie Ihren Namen und Datum hinterlassen, falls es sich um
etwas größeres handelt.
3. Wir löschen das Verzeichnis “tmp.dir” (und hoffentlich hatten Sie dort nichts wichtiges gespeichert).
4. Wir legen ein Verzeichnis mit gleichem Namen neu an, das jetzt auf jeden Fall existiert und leer ist.
5. Wir wechseln in das neue Verzeichnis. Da dieses Skript mit einer eigenen Shell ausgeführt wird, hat sich
damit unser aktuelles Verzeichnis in der interaktiven Shell nicht geändert.
6. Der Befehl “date” gibt Datum, Uhrzeit und Zeitzone aus. Das Ergebnis leiten wir in eine neue Datei mit
dem Namen “file1.txt” um.
7. Den Namen des aktuellen Verzeichnisses hängen wir an das Ende der Dateil file1.txt an.
Speichern Sie, verlassen Sie den Editor und setzen Sie die permissions auf Ausführen:
chmod +x doit
Nur Sie selbst sollen dieses Script ausführen, daher diesmal kein “go”. Geben Sie “doit” ein und danach “ls”.
Nun haben Sie ein Verzeichnis “tmp.dir”.
Falls Sie eine Fehlermeldung “not found” bekommen, dann ist das aktuelle Verzeichnis nicht in Ihrem Pfad:
echo $PATH
7
Der Pfad ist eine Liste von Verzeichnissen, in denen ausführbare Dateien gesucht werden. Es gibt es zwei
Möglichkeiten, Ihr Shell script dennoch auszuführen: mit
./doit
stellen Sie klar, daß die Datei “doit” im aktuellen Verzeichnis gemeint ist; oder Sie fügen das aktuelle
Verzeichnis zum Pfad hinzu:
export PATH=$PATH:.
Eine weitere, bessere Variante ist, sich ein eigenes bin Verzeichnis anzulegen (cd; mkdir bin) und dort alle
Shell scripts zu speichern. Dann können Sie mit
export PATH=$PATH:$HOME/bin
dieses Verzeichnis zum Suchpfad hinzufügen, vermeiden einige Sicherheitsprobleme, haben einen guten Überblick
über Ihre Shell scripts, und können Sie in jedem anderen Verzeichnis verwenden!
Werfen Sie nun einen Blick ins Verzeichnis tmp.dir und kontrollieren Sie den Inhalt von file1.txt mit
cat file1.txt
Wir müssen also nicht jedesmal einen Editor starten; den Inhalt einer kurzen Textdatei können wir uns mit
“cat” auch im Terminal ausgeben lassen.
bash: Verschiedenes
Tools wie find liefern den gesamten Dateinamen inklusive Pfad; oft möchte man aber nur den letzten Teil
davon haben:
base=$(basename $fullfile)
extension=${base##*.}
name=${base%.*}
Anwendung (interaktiv, in einer Zeile eingeben):
for file in /media/SD4/DCIM/100NCD40/*; do echo $file;
convert -resize 50% -quality 50% $file pics/$(basename $file); done
9
Pipe
Oft haben wir die Situation, daß wir das Ergebnis des einen Programms als Eingabe für das nächste
verwenden wollen. Natürlich könnten wir eine temporäre Datei verwenden, die wir nachher wieder löschen,
eleganter ist aber eine pipe:
ls *.txt | wc
8
Das Ergebnis von ls ist eine Liste, die an das Programm wc (für word count) weitergegeben wird. Ein kurzer
Blick ins online manual (man wc) sagt uns, daß der erste Wert die Anzahl der Zeilen ist, daher wissen wir
nun, wieviele Dateien mit der Endung “.txt” wir im aktuellen Verzeichnis haben.
Ein Unixsystem besteht aus einer großen Zahl von scheinbar unzusammenhängenden Programmen wie wc,
die verschiedenste Aufgaben erfüllen. Einige dieser Werkzeuge sollte man kennen, und eines der wichtigsten
ist wohl grep.
10
Grep
Mit dem Programm grep können wir Zeilen aus Dateien ausgeben, die bestimmte Texte enthalten:
grep section *.tex
Alle Zeilen mit “section”, “section” usw. in allen Dateien mit der Endung “.tex” werden ausgegeben.
grep printf *.java | wc -l
Wieviele Printf-Befehle haben wir in allen unseren Java-Programmen?
grep -l Wurlitzer *.java | sort -u
Nicht die Zeilen, sondern die Namen der Dateien werden ausgegeben, uns zwar dank “sort -u” (für unique)
nur einmal: nun wissen wir, wo unsere Klasse Wurlitzer verwendet wird.
11
Find
Oft stehen wir vor Aufgaben, die sich nur lösen lassen, wenn mehrere Verzeichnisse durchsucht oder sonstwie
abgearbeitet werden. Mit dem Programm “find” ist das einfach:
find . -name ’*.java’ -exec grep -l Wurlitzer {} \; | sort -u
Im aktuellen Verzeichnis und allen Unterverzeichnissen werden alle Java-Dateien nach dem Text “Wurlitzer”
durchsucht. Wie vorher wird nur der Name der Datei ausgegeben, und das Ergebnis wird mit “sort -u”
sortiert, sodaß mehrfache Vorkommen entfernt werden.
find . -name ’*.zip’ -size +1000k
Alle ZIP-Dateien, die größer als 1 MB sind.
find . -name ’*.zip’ -size +1000k -exec ls -s {} \;
Die Größe in KB dazu.
find . -name ’*.zip’ -size +1000k -exec ls -l {} \; | sort -n
Das Ergebnis sortiert, und zwar numerisch.
9
Wie man sieht, ist find vor allem zusammen mit anderen Werkzeugen wir grep und sort sehr nützlich. Es
lohnt sich daher, die man pages und die dortigen Beispiele zu studieren!
Oft enthalten Dateinamen auch Leerzeichen, dann ist die Option -print0 nützlich: damit wird das NullZeichen zur Trennung zwischen Dateinamen ausgegeben, und andere Programme (wie z.B. xargs mit der -0
Option können damit weiterarbeiten.
12
Xargs
Oft möchte man ein bestimmtes Kommando auf eine Liste von Dateien anwenden, die als Resultat eines
vorherigen Kommandos in einer Pipe zur Verfügung stehen; dazu kann xargs verwendet werden:
find . -exec grep -l println {} \; | xargs wc -l
Der Befehl wc wird nun auf jede einzelne Datei angewendet, die aus dem find kommt, also den Text “println”
enthält.
Würden wir xargs aus der obigen Zeile weglassen, dann würden wir die Anzahl der Zeilen zählen, die find
ausgegeben hat.
Entsprechend der Option -print0 bei find gibt es hier die Option -0 zur Trennung von Dateinamen mittels
Null-Zeichen statt Leerzeichen, also z.B.
find /some/where -size +10M -print0 | xargs -0 ls -lrts
für eine Liste von Dateien (mit Leerzeichen im Namen) die größer als 10 MB sind, sortiert nach Datum,
neueste zuletzt.
Welche Scripts machen etwas mit der Datei file42? Wenn grep file42 * zu aufwendig ist:
find . -type f -perm -u+x | xargs grep file42
13
Stdin, stdout, stderr
Unix-Programme haben eine Standard-Eingabe, das ist ein Strom von Bytes, die numerisch mit 0 und
alphabetisch mit “stdin” bezeichnet werden. Entprechend gibt es auch den “stdout” mit der Nummer 1,
sowie den “stderr” mit der Nummer 2. Die Standard-Eingabe kann eine Datei sein, aber auch die Tastatur:
wc
Nun passiert zunächst nichts; geben Sie einige kurze Zeilen Text ein und danach Strg-D, das bedeutet Ende
der Eingabe. Nun arbeitet das Programm wc (word count) mit Ihrem Text und zählt Zeilen, Wörter und
Bytes.
Wenn auf der Kommandozeile nichts angegeben wird, dann wird als stdin von der Tastatur gelesen und als
stdout am Terminal ausgegeben; die beiden können aber auch in Dateien umgeleitet werden:
wc < file1.txt > cnt.txt
Dabei sind die spitzen Klammern wie Pfeile zu verstehen, d.h. der Inhalt der Dateil file1.txt “fließt” hinein
ins word count, und das Ergebnis fließt in die Datei cnt.txt.
10
Manchmal produzieren Programme eine große Zahl von Fehlermeldungen, die ebenfalls am Terminal ausgegeben
werden. Diese kann man in eine Datei umleiten, um später (z.B. mit grep) nach bestimmten Fehlern zu suchen:
bigStatistics < largeInput.dat > largeOutput.dat 2>error.log
Wenn die Fehlermeldungen ignoriert werden können, müssen sie nicht gespeichert werden. Unix stellt dafür
das null device zur Verfügung:
prog <input >output 2>/dev/null
Damit werden alle Ausgaben nach stderr auf das null device umgeleitet d.h. weggeworfen.
14
.bashrc
Da wir nun einige shell script Grundlagen kennen, werfen wir einen Blick auf die Datei .bashrc in Ihrem
home directory. Dort werden einige Einstellungen gemacht, die sich auf Ihre Arbeit auswirken. Sie können
diese verändern und z.B. weitere Umgebungsvariablen setzen, wie die schon bekannte Java-Version, indem
Sie am Ende der Datei folgenden Befehl hinzufügen:
export JAVA_HOME=$HOME/jdk1.6.0
Natürlich hat das nur Sinn, wenn sich in diesem Verzeichnis auch wirklich eine Java-Installation befindet.
Sonst suchen Sie lieber die systemweite Version, z.B. mit
find / -type d -name ’*/bin/javac’
oder (schneller)
locate javac
Die Datei .bashrc wird jedesmal ausgeführt, wenn eine neue Shell gestartet wird, also z.B. auch, wenn Sie ein
weiteres Terminalfenster öffnen. Wenn Sie die .bashrc geändert haben und die Änderungen in Ihrer aktuellen
Shell merken wollen, müssen Sie
source ~/.bashrc
eingeben, wobei die Tilde “~” für Ihr home directory steht. Stattdessen können Sie natürlich auch
source $HOME/.bashrc
verwenden. Damit ist das shell script .bashrc neuerlich ausgeführt worden.
Im .bashrc können Sie auch Ihren Pfad ändern, wenn Sie z.B. ein bin/ Verzeichnis in Ihrem home directory
anlegen und alle shell scripts dort speichern. Dann lassen Sie den Suchpfad mit diesem Verzeichnis beginnen,
damit bei Namensgleichheit Ihre Version verwendet wird:
export PATH=$HOME/bin:$PATH
11
15
Alias
Viele Aufgaben sind so einfach, daß nicht jedesmal ein shell script geschrieben werden muß. So könnte es
z.B. ein Program geben, das Sie immer mit bestimmten Optionen verwenden. Dann könnten Sie natürlich
ein shell script gleichen Namens schreiben:
#!/bin/bash
someprog -b $*
Nun bekommt Ihr someprog immer die Option -b sowie eventuelle restliche Parameter mit dem Ausdruck
$*. Einfacher ist dieser Effekt aber mit einem alias zu erreichen. Schreiben Sie in Ihr .bashrc folgendes:
alias someprog=’/usr/bin/someprog -b’
Dazu müssen Sie zunächst feststellen, in welchem Verzeichnis sich Ihr someprog befindet:
which someprog
Der Befehl which gibt Ihnen den kompletten Pfad, den Sie im alias verwenden. Mit
alias
bekommen Sie eine Liste der gesetzten alias Einträge.
Noch ein Beispiel: df (disk free) zeigt den freien Speicher in verschiedenen Bereichen, mit der –h Option in
der netteren human readable form:
df -h
Dabei sind aber einige Bereiche, die mich nicht interessieren; ausserdem möchte ich nicht jedesmal die –h
Option tippen müssen; daher finde ich interaktive heraus, wie ich die Ausgabe in eine für mich bessere Form
bringen kann:
/bin/df -h|egrep ’^F|^/dev’
Mit egrep werden auch die extended regular expressions unterstützt, damit kann ich mit a|b entweder das
Muster a oder b selektieren; hier sind das die erste Zeile (beginnt mit Filesystem) sowie die /dev Zeilen (ŝteht
für Beginn der Zeile). Nun setze ich im .bashrc den alias:
alias df="/bin/df -h|egrep ’^F|^/dev’"
16
Top
Einen Überblick über die laufenden Prozesse auf Ihren Rechner erhalten Sie mit
top
Dort werden alle Prozesse aufgelistet und nach definierbaren Kriterien sortiert. Alle fünf Sekunden wird die
Liste erneuert. Es gibt Parameter wie z.B.
12
top -d 1
um jede Sekunde eine neue Liste zu erhalten, aber auch top versteht auch einige interaktive Kommandos,
z.B. “1” zum Einblenden der Auslastung der einzelnen Prozessoren (falls es mehrere gibt), sowie “k” (für kill)
zum Beenden von Prozessen; danach werden Sie zur Eingabe der prozess id und des Interrupts aufgefordert,
dabei ist 9 der sicherste kill.
Manchmal brauchen einzelne Prozesse sehr viel Rechenzeit, was den interaktiven Betrieb mühsam macht.
Dann können Sie versuchen, durch geringere Priorität die Situation zu retten, ohne den Prozess zu killen,
indem Sie ihn renicen, d.h. Sie geben “R” gefolgt vom PID und priority ein. Die normale Priorität ist 10,
höhrere Werte bedeuten weniger Rechenzeit und damit weniger Belastung das Systems.
Die meisten Prozesse sind die meiste Zeit im Modus S für sleep, d.h. sie verbrauchen fast keine Resourcen. In
der top Anzeige sind die Prozesse nach der verbrauchten CPU Zeit gereiht, und der oberste kann im Zustand
R für running sein. Gelegentlich sieht man auch D für dead und sogar Z für Zombie. Solche Prozesse sind
meist die Folge von Programmabstürzen und können gekillt werden.
Im Unterschied zu anderen Betriebssystemen wird Unix nicht durch einzelne Prozesse zum Stillstand gebracht.
Die Prozesse sind hier sauber voneinander und vom Betriebssystemkern getrennt. Auch vieles, was als
Betriebssystemaufgabe verstanden wird läuft über Prozesse. Typischerweise bringen nur schwere Hardwareprobleme
das ganze System zum Stillstand, wenn z.B. nicht mehr auf die Festplatte zugegriffen werden kann. Es ist
nicht ungewöhnlich, daß Unixrechner wochenlang oder monatelang ohne Unterbrechung und ohne Probleme
laufen, und zwar nicht nur Server ohne direkte Benutzer, sondern auch solche, mit denen als PC interaktiv
am Desktop gearbeitet wird.
Sie können die Liste der Prozesse auch auf den stdout leiten, indem Sie das Kommando
ps -ef
verwenden. Nun können Sie die Liste in Ruhe studieren, oder auch als inputs in ihren Shell scripts verwenden.
17
bg, fg, nohup
Wenn Sie Programme verwenden, die sehr lange laufen, weil z.B. Simulationen gerechnet werden oder
aufwendige Auswertungen vorgenommen werden, dann können Sie mit
bigjob -some -options < input.txt > output.txt &
ein solches Programm in den “Hintergrund” schicken und in der Shell weiterarbeiten. Mit
jobs
erhalten Sie eine Liste der aktuell im Hintergrund arbeitenden Prozesse. Falls ein Prozess doch wieder in
den Vordergrung soll, dann geben Sie ein:
fg
oder, falls es mehrere gibt:
fg %1
13
für den ersten Job in der Liste.
Hintergrundprozesse laufen weiter, solange Sie eingeloggt sind; wenn Sie allerdings ausloggen, werden alle
jobs gekillt, ausser jene, die Sie mit nohup gestartet haben:
nohup bigjob > output.txt &
Nun können Sie nach Hause gehen und morgen wieder einloggen, und der Job läuft immer noch, außer
der Rechner wurde zwischendurch neugestartet, oder einer der Sysadmins hat Ihren job gekillt, weil er
zuviel Systemresourcen verbraucht hat. Wie sehr Ihr Job das System belastet, können Sie selbst ja mit top
feststellen.
18
Rsync
Zur Synchronisierung von Dateien, oft genutzt für backup, weil es nur kopiert soweit nötig:
#!/bin/sh
# removable media
dest=/media/usbdisk/bak/
# rsync options
OPTS="-av --max-size=1m"
# check media is plugged in
if [ ! -x $dest ]; then
echo "Backup media not mounted"
exit 1
fi
# local host
cd
rsync $OPTS vw publ projects "$dest/pc"
# remote host
rsync $OPTS balrog:www/le
"$dest/balrog/www"
Hier wird auf eine mobile USB disk gesichert, daher prüfen wir zunächst, ob diese Platte auch wirklich
angeschlossen ist.
Mit rsync können wir nun Verzeichnisse auf dem lokalen Rechner sichern, und auch Verzeichnisse von anderen
Rechnern (remote hosts), wenn wir dort mit ssh ohne Passwortangabe einloggen können.1
19
Übersicht Editoren
pico — einfach und problemlos, aber auch nicht sehr mächtig.
1 D.h. wenn unser id dsa.pub aus dem .ssh Verzeichnis im authorized keys file am remote host enthalten ist, und wir uns
lokal mit ssh-add authentisiert haben.
14
jed — Syntax Highlighting und Indentation.
emacs — fast schon ein eigenes Betriebssystem
gedit — Gnome Text Editor mit GUI
vi — für Unix-Gurus
20
IDE Integrated Development Environments
eclipse — sehr viele Möglichkeiten, aber nicht ganz problemlos
netbeans — etwas einfacher
21
make
In einem makefile können Abhängigkeiten zwischen Dateien formuliert werden, und damit ausgelöste Befehle:
JAVAC=/usr/lib/jvm/java-6-sun-1.6.0.03/bin/javac
JAVA=/usr/lib/jvm/java-6-sun-1.6.0.03/bin/java
Hello.class: Hello.java
$(JAVAC) Hello.java
$(JAVA) Hello
hello: hello.c
cc -o hello hello.c
./hello
Urpsprünglich für umfangreiche (und damals noch sehr langwierige) Kompilieraufgaben, heute auch für viele
andere Aufgaben verwendbar. Kann auch shell scripts ersetzen.
22
Vergleich einiger Programmiersprachen unter Linux
• bash: kurze Scripts mit einfachen Operationen auf Strings. Performance extrem schlecht.
• perl: viel genutzt für verschiedenste Aufgaben in Unix, aber nicht numerische. Performance mäßig.
• python: immer beliebter wegen einfacher und übersichtlicher Syntax – executable pseudo code. Performance
gut.
• C: für sehr rechenaufwendige Aufgaben, klassische Unix Programmiersprache. ISO Standard! Performance
maximal.
• C++, Java: durch Objektorientierung für Kooperation in Programmierteams besonders gut geeignet.
Performance maximal, bei Java ev. Einschränkung durch startup der runtime.
Zur Messung der Performance:
time myprog someargs
15
Bash, Perl, Sed, und Awk sind auf praktisch allen Unix-System verfügbar.
Einen C-Compiler gibt es meist auch, außer es wurden bei der Installation die Development-Komponenten
ausgelassen.
Python ist ebenfalls fast immer installiert, nicht unbedingt aber alle libraries.
Java ist meist installiert, jedoch gibt es unterschiedliche JREs (Java Runtime Environment) mit unterschiedlichen
Eigenschaften, insb. bezüglich Performance.
Oft ist auch nur die Runtime Version installiert und der Compiler fehlt; dann muß der JDK (Java Development
Kit) installiert werden.
23
Bash
Die Bourne Again Shell ist der interaktive Kommandointerpreter in Linux, der im Terminal verwendet wird,
um die Benutzereingaben auszuführen.
• Shell scripts sind vor allem für wiederholte Arbeitsabläufe geeignet sowie für Installation von Software
und Unix, wo die Performance keine Rolle spielt.
• Die bash ist sehr ähnlich der sh, csh, tcsh, und einige andere.
• Für numerische Aufgaben ist die bash nicht gedacht.
• Details siehe frühere Einheit.
24
Sed
Streaming editor. Besonders interessant in Zusammenhang mit Editor-Makros.
sed ’1,$s//\&ouml;/g’ < infile
25
Awk
Benannt nach Autoren Aho, Weinberger, Kernighan.
Für kurze Einzeiler gut, durch BEGIN und END Block.
awk ’{ s += $2 } END { print s }’ < infile
26
Perl
Practical Extraction and Reporting Language.
• Für umfangreiche Aufgaben in der Systemadministration und auch als eigenständige allgemeine Entwicklungssprache
geeignet.
• Die Syntax ist durch die vielen $ Zeichen für Variablennamen etwas gewöhnungsbedürftig.
16
Hier ist der insertion sort (Sortieren durch Einfügen) in Perl:
#!/usr/bin/perl
sub insertion_sort {
my $a = shift;
for ($i = 1; $i < @$a; $i++) {
my $x = $$a[$i];
for ($j = $i; $j >= 0; $j--) {
if ($j == 0 || $x >= $$a[$j-1]) {
$$a[$j] = $x;
last;
} else {
$$a[$j] = $$a[$j-1];
}
}
}
}
sub check {
my $a = shift;
for ($i = 0; $i < @$a-1; $i++) {
if ($$a[$i] > $$a[$i+1]) {
print STDERR "NOT SORTED!\n";
return 0;
}
}
return 1;
}
$n = $ARGV[0] * 1;
$debug = $ARGV[1] * 1;
@a = ();
for ($i = 0; $i < $n; $i++) {
$a[$i] = int(rand($n + 10*$n));
}
if ($debug==1) { print "list:
", (join " ", @a), "\n"; }
insertion_sort \@a;
if ($debug==1) { print "sorted: ", (join " ", @a), "\n"; }
check \@a;
Mit dem Gnome2 Modul kann recht schnell eine GUI Applikation erstellt werden.
Der GTK Gnome Tool Kit verwendet wie Java Swing ein hierarchisches Konzept für die GUI-Elemente, die
wie mit einem Baukasten zusammengestellt und verschachtelt werden.
Interessant ist, daß die Ubuntu Live CD bereits alles enthält, um solche Applikationen zu erstellen.
Hier ist eine kleine GTK-Applikation in Perl:
#!/usr/bin/perl
use Glib qw/TRUE FALSE/;
use Gtk2 ’-init’;
17
sub callback {
my ($button, $data) = @_;
my $x = $entry->get_text;
print "x is now: $x\n";
}
sub delete_event {
print "Good Bye!\n";
Gtk2->main_quit;
return FALSE;
}
$window = Gtk2::Window->new(’toplevel’);
$window->set_title("Hello!");
$window->signal_connect(delete_event => \&delete_event);
$window->set_border_width(10);
$box1 = Gtk2::HBox->new(FALSE, 0);
$window->add($box1);
$label = Gtk2::Label->new($str="Enter value for x:");
$entry = Gtk2::Entry->new();
$box1->pack_start($label, TRUE, TRUE, 0);
$box1->pack_start($entry, TRUE, TRUE, 0);
$button = Gtk2::Button->new("OK");
$button->signal_connect(clicked => \&callback, ’button 1’);
$box1->pack_start($button, TRUE, TRUE, 0);
$button->show;
$label->show;
$entry->show;
$box1->show;
$window->show;
Gtk2->main;
0;
27
Python
• Die Sprace besticht durch klare Syntax, sie wird daher oft auch “executable pseudo-code” genannt.
• Ungewöhnlich: Blockstruktur wird durch Einrücken markiert. Eine geniale Lösung, die viel überflüssige
Syntax vermeidet, manchmal aber auch Probleme bereitet.
• Der Interpreter unterstützt die interaktive Entwicklung und das Testen von einzelnen Funktionen.
• Für die i386 32bit Architektur gibt es einen Compiler (psyco), der einen Faktor von 10 bis 20 in der
Performance bringt.
#!/usr/bin/python
import string
import sys
18
import random
import psyco
psyco.full()
def insertion_sort(a):
n = len(a)
for i in xrange(1,n):
x = a[i]
for j in xrange(i,-1,-1):
if (j == 0 or x >= a[j-1]):
a[j] = x
break
else:
a[j] = a[j-1]
def check(a):
n = len(a)
for i in xrange(0,n-1):
if (a[i] > a[i+1]):
print "NOT SORTED!"
def main():
n = string.atoi(sys.argv[1])
debug = string.atoi(sys.argv[2])
a = range(n)
for i in xrange(0,n):
a[i] = random.randint(n,10*n)
if (debug==1): print "random: ", a
insertion_sort(a)
if (debug==1): print "sorted: ", a
check(a)
if __name__ == ’__main__’: main()
28
C
• ISO Standard!
• Low-level, aber trotzdem maschinenunabhängig
• Beste Performance, Compiler seit Jahrzehnten ausgereift.
• Schneller geht es nur noch mit Assembler, aber nicht viel und nicht mehr portierbar, weil Rechnerund Architekturspezifisch.
• Einfache Sprache – schnell zu lernen, aber schwer zu beherrschen: Vorsicht mit Pointern und Speicherverwaltung,
schlampiges Programmieren kann böse Folgen haben.
• Der C-Compiler (cc, gcc, ..) erzeugt native code, der ohne Interpreter auf jedem Rechner mit passender
Architektur läuft.
• C-Code ist typischerweise deutlich länger als vergleichbare Programme in höheren Sprachen wie Python.
Auch die Entwicklungszeit ist länger. C unterstützt den Rechner, nicht den Programmierer.
19
• C ist die klassische Entwicklungssprache in Unix; viele Werkzeuge und praktisch alle Teile des Betriebssystems
im engeren Sinn sind in C oder C++ geschrieben.
• C++ ist die objektorientierte Erweiterung von C, in der ebenfalls viele Unix-Applikationen geschrieben
werden, sowie auch viele kommerzielle Produkte, vor allem wenn es auf höchste Performance ankommt,
z.B. Spiele.
Sortieren durch Einfügen in C:
#include <stdio.h>
#include <stdlib.h>
void insertion_sort(int* a, int n) {
int i,j,x;
for (i = 1;i < n; i++) {
x = a[i];
for (j = i; j >= 0; j--) {
if (j == 0 || x >= a[j-1]) {
a[j] = x;
break;
} else {
a[j] = a[j-1];
}
}
}
}
void print(char* s, int* a, int n) {
int i;
printf("%s",s);
for (i = 0; i < n; i++) {
printf("%d ",a[i]);
}
printf("\n");
}
int main(int argc, char* argv[]) {
int i,n,debug,*a;
n = atoi(argv[1]);
debug = atoi(argv[2]);
a = malloc(n*sizeof(int));
for (i = 0; i < n; i++) {
a[i] = rand() % (n + 10*n);
}
insertion_sort(a,n);
if (debug==1) print("ins: ", a, n);
}
20
29
Java
Java ist eine objektorientierte Sprache, die speziell auf Plattformunabhängigkeit entwickelt wurde - write
once, run anywhere. Trotzdem: unterschiedliche Versionen von JDK und JRE können Probleme bereiten.
Syntax und Konzepte ähnlich C und C++, daher für den Programmierer ähnlich mühsam – keine “höhere”
Programmiersprache.
Der Java Compiler javac erzeugt Byte Code, der in der Runtime interpretiert wird.
Die meisten heute verbreiteten Java Runtime Systeme haben neben dem javac auch einen JIT (Just In
Time) Compiler, sodaß Java heute nicht mehr unter den Performance-Problemen leidet wie noch vor einigen
Jahren.
Ist ein JIT Compiler in der Runtime vorhanden, dann werden häufig verwendete Codeteile in native Code
compiliert.
Mit JIT Compiler ist die Performance meist nur wenig schlechter als bei kompilierten Sprachen wie C
und C++; manchmal sogar besser, weil der Java JIT Compiler ja zur Laufzeit arbeitet und daher mehr
Informationen hat als der C-Compiler, was bessere Optimierung bedeuten kann.
Zum Laufen von Java Programmen ist nur die Runtime erforderlich, nicht der Development Kit.
Sortieren durch Einfügen in Java:
import java.util.*;
import java.text.*;
class InsertionSort {
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
int debug = Integer.parseInt(args[1]);
Random rand = new Random();
int a[] = new int[n];
for (int i = 0; i < n; i++) {
a[i] = rand.nextInt(n + 10*n);
}
insertionSort(a);
if (debug==1) print("ins: ", a);
}
static void insertionSort(int[] a) {
int n = a.length;
for (int i = 1; i < n; i++) {
int x = a[i];
for (int j = i; j >= 0; j--) {
if (j == 0 || x >= a[j-1]) {
a[j] = x;
break;
} else {
a[j] = a[j-1];
}
}
}
21
}
static void print(String s, int[] a) {
System.out.print(s);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println("");
}
}
30
Laufzeiten im Vergleich
Laufzeiten in Sekunden für den Insertion Sort mit n integer Elementen, auf drei verschiedenen Rechnern
(PC 2006, PC Schulungsraum 2009, Server Schulungsraum 2008):
n
C
5000
10000
20000
40000
80000
0.013
0.046
0.209
0.741
2.831
5000
10000
20000
40000
80000
0.009
0.030
0.118
0.476
1.857
5000
10000
20000
40000
80000
0.016
0.050
0.192
0.760
3.020
Java Python
aipc20
0.100
0.338
0.201
0.719
0.483
2.742
1.707
6.399
pc7101
0.096
0.220
0.094
0.414
0.194
1.559
0.444
1.545
xmdimrill
0.148
3.273
0.240
12.811
0.415
50.639
1.079
3.708
Perl
6.360
25.148
3.629
14.136
5.990
28.303
• Java: unterschiedliche VM beeinflussen Verhältnis C/Java deutlich.
• Python: Schulungsraumserver dimrill: 64-bit, daher kein Psyco.
• In C recht schön zu sehen: Insertion Sort Laufzeit wächst quadratisch mit Problemgröße.
31
LUKS Linux Unified Key Setup - cryptsetup
• Eine ganze Partition wird verschlüsselt, daher ohne pass phrase nicht nur
– keine Dateiinhalte, sondern auch
– keine Informationen über Dateisystem, Verzeichnisse, Dateigrößen und -namen
• Sehr empfehlenswert für Datenträger, die leicht verlorengehen können, wie USB Sticks
• auch internal hd möglich (home directories, swap space, ..)
22
• Alle Zugriffe erfolgen über dm crypt Kernel Modul, transparent für Applikationen.
• Kompatibel mit anderen Betriebssystemen über FreeOTFE
Beispiel Setup USB Stick mit einer Partition und FAT Dateisystem:
1. Eventuelle Daten am Stick sichern; gehen sonst alle verloren.
2. Admin Rechte notwendig (nur für die folgenden Schritte, nicht für spätere Verwendung des Sticks)
sudo bash
3. cryptsetup package installieren (falls notwendig)
apt-get install cryptsetup
Kontrolle:
lsmod | grep crypt
Keine Zeile mit dm crypt: Modul nicht geladen. insmod oder Neustart.
4. USB Stick anstecken und device file herausfinden:
$ df
Filesystem
1K-blocks
Used Available Use% Mounted on
...
/dev/sdc1
486000
0
486000
0% /media/DISK_IMG
5. umount - Verbindung device file / directory gelöst
$ umount /dev/sdc1
LUKS format mit pass phrase (RICHTIGES device file angeben...aufpassen...)
$ cryptsetup luksFormat /dev/sdc1
6. LUKS open erzeugt crypt mapping in /dev/mapper/
cryptsetup luksOpen /dev/sdc1 mystick
7. file system mit volume label
mkfs.vfat -F 32 -n mystick /dev/mapper/mystick
Fertig. Beim nächsten Anstecken wird pass phrase gefragt (außer wenn in keyring gespeichert und keyring
schon geöffnet in dieser session), dann unter /media/mystick gemountet.
32
PGP keys - seahorse
Public/Private key pair zum
• Signieren
• Verschlüsseln
Key enthält Name und Email Adresse
•
•
•
•
•
•
•
seahorse, auch unter Applications/Accessories/Passwords and Encryption Keys
File/New, PGP Key, Advanced options
RSA (sign only)
2048 oder 4096 bits
Personal Keys, Properties, Details, Subkeys, Add, RSA (encrypt only)
Remote, Sync and Publish Keys
Keyserver, zB hkp://pool.sks-keyservers.net
Problem: jeder kann Key erzeugen und publizieren, d.h. Information im Key (Name, Email Adresse) muß
nicht stimmen..
23
• Key Fingerprint auf homepage
• Key auf Keyserver publizieren
• Web of Trust: Key signieren = bestätigen, daß der Keyinhaber tatsächlich der ist, der er vorgibt zu
sein
33
LaTeX
Statt WYSIWYG (What you see is what you get) wird ähnlich HTML eine Beschreibungssprache eingesetzt,
die mit Macros aber sehr mächtig ist; basierend auf (plain) TeX von Donald Knuth, im wissenschaftlichen
Bereich quasi Standard. Am bestem mit einem Beispieldokument veranschaulicht:
\documentclass{article}
\usepackage{epsf}
\title{Sample Document}
\author{Johann Mitl\"ohner}
\begin{document}
\maketitle
\section{Introduction}
The area of a circle
is $ a = r^2 \pi $ and the circumference is
$ c = 2 r \pi $. Here is another famous formula:
\begin{equation}
E = m c^2
\label{eq:energy}
\end{equation}
Relationship \ref{eq:energy} and
figure \ref{fig:plot} can be cited in the same
sentence. Remember to run LaTeX twice to get
these references right.
\begin{figure}
\begin{center}
\epsffile{plot.eps}
\caption{This is an interesting plot.}
\label{fig:plot}
\end{center}
\end{figure}
\section{Conclusion}
Latex is really great, but it’s even better when
used with BibTeX.
\end{document}
24
Diesen Text speichern wir z.B. als muster.tex und übersetzen es mit dem Befehl pdflatex muster. Es wird die
Datei muster.pdf erzeugt. Die Referenzen stimmen erst nach einem zweiten Durchlauf, daher erstellen wir
am besten gleich ein makefile:
muster:
pdflatex muster
pdflatex muster
Nun können wir mit dem Befehl make schnell eine neue Version der PDF Datei erzeugen. Ansehen können
wir die PDF Datei z.B. mit dem Programm evince bzw. durch Doppelklick im Dateimanager (nautilus).
Die Grafik plot.eps wird mit dem Programm gnuplot erzeugt, das als Input folgende Datei plot.gp erhählt:
set output ’plot.eps’
set size 0.6, 0.4
set style data lines
set grid
set term postscript eps
plot ’plot.dat’ using 1:2 notitle
Wir geben das Kommando gnuplot plot.gp. Die Ausgabe erfolgt in die Datei plot.eps (EPS für encapsulated
postscript), die Daten zum Plotten stammen aus der Datei plot.dat:
10
20
25
30
40
50
500
600
740
340
450
280
Da alle in diesem Abschnitt genannten Programme mit Textdateien als Input arbeiten, können diese Textdateien
recht einfach mit Hilfe von selbstgeschriebenen Scripts erzeugt werden, um so automatisiert Dokumenten zu
erstellen. Wenn sich dann z.B. die Datei plot.dat ändert, kann das Dokument muster.pdf einfach durch das
Kommando make aktualisiert werden.
34
Literatur
Unix- und Linux-Bücher gibt es viele, aber der Klassiker zum Thema Unix ist immer noch The Unix
Programming Environment, Brian W. Kernighan, Rob Pike, Prentice Hall, 1984.
Kann ruhig eine ältere antiquarische Auflage sein, zeitlose Konzepte!
25
A reader from down under. Picture by Phil McCrea
26

Similar documents