Kleiner Home-Server mit Ubuntu 6.06 LTS

fish

New Member
HOWTO: Kleiner Home-Server mit Ubuntu 6.06 LTS

Ganz am Anfang, eine Anmerkung: Linux ist mir mittlerweile relativ vertraut, aber Linux auf dem Server ist eine andere Geschichte und für mich noch Neuland. Daher gebe ich keine Garantie für diese "Anleitung" - vielmehr ist sie als Orientierungshilfe für Server-Noobs gedacht, die sich zu Hause einen kleinen PC einrichten wollen, der verschiedene Dienste im Netzwerk anbietet. Es mag sein, dass man vieles in diesem How-To eleganter lösen kann, aber für mich funktioniert es so oder ich kenne die bessere Lösung schlicht nicht. Ich bitte darum um konstruktive Kritik und Verbesserungsvorschläge, um Fehler auszumerzen und die Anleitung noch weiter zu verbessern - vielen Dank!

---

Home-Server auf Ubuntu Linux 6.06 LTS

Dieser Beitrag beschreibt meine Erfahrungen bei der Einrichtung eines kleinen Ubntu-Servers für zu Hause. Dabei handelt es sich nicht um eine Schritt-Für-Schritt Anleitung, sondern mehr um eine Orientierungshilfe für Linux Benutzer, die sich auch sowas einrichten wollen. Der Text ersetzt also nicht das Lesen von Manpages und die Erlangung von Unix-Grundlagenwissen, sollte aber als Grundlage für Neulinge durchaus nützlich sein.

Wieso überhaupt einen Server für zu Hause?

Lange hatte ich nur einen Laptop und mich auch immer gefragt, wieso man sich für den Heimgebrauch überhaupt einen solchen Server einrichten soll. Als ich mir dann aber einen zweiten PC zugelegt hatte, wurde mir nach und nach klar, was so eine Maschine für Vorteile hat - sie kann nämlich als Backup-System, Fileserver, Webserver, zum Datenaustausch und noch viel mehr gebraucht werden. All diese Dienste lassen sich über das Netzwerk zu Hause auf allen angeschlossenen Systemen oder auch von extern nutzen, ohne dass sie mehrmals installiert werden müssen.

Welche Mindestanforderungen hat ein solcher Heimserver?

Diese Frage kann man so generell nicht beantworten - es kommt drauf an, welche Dienste man damit verrichten will und wie rechenintensiv diese sind. Eigentlich sollten aber auch etwas betagtere Systeme mit den in diesem Text behandelten Aufgaben wenige Mühe haben.

Als Orientierung hier mal meine Konfiguration:

- PIII 500 MhZ
- ASUS P3B-F Board
- Netzwerkkarte
- CD-Rom
- Diskettenlaufwerk
- Terratec Aureon 5.1 (Soundkarte)
- 4x256MB PC-133 Kingston SDRAM
- Promise Ultra 133 TX2 ATA 100/133 IDE Controller
- 300GB Samsung 7200rpm HD
- Netgear WG311T Wireless PCI-Adapter 802.11g mit 108MBit/s
- PyroGate USB 2.0 6-Port Controller

Ergänzend verwende ich noch folgendes:

- Externe 80 GB HD von Lacie (für Backups, USB 2.0)
- Externe 60 GB 2.5" HD (in Alu HDD-Gehäuse, USB 2.0)
- HP Omnibook XE4100 Celeron 1200 MhZ (mein Laptop)
- Trendnet TEW-611BRP MIMO (WLAN Router)
- Palm TX (für die Fernsteuerung meiner Musik übers WLAN)
- Netgear WG511T Wireless PC-Card 802.11g mit 108MBit/s (WLAN Karte für den Laptop)

Je nach dem, was ihr genau realisieren wollt, braucht ihr das eine oder andere davon nicht.

Was soll der Server alles für Aufgaben erledigen?

- Gewisse Daten auf dem Server sollen auf meinem Laptop zugänglich sein (NFS)
- Automatische Sicherung wichtiger Dateien auf eine externe Harddisk (Cron, RSnapshot)
- Fernadministration soll möglich sein (SSH, der Server läuft ohne Bildschirm)
- Meine Musik will ich überall hören über einen Webbrowser (Apache, Jinzora)
- Fernsteuerung meiner Musik (OGG, MP3, FLAC) über einen Palm TX (Giant Disc)
- Hoch- und Runterladen von Dateien (FTP-Sever)
- Ständige Erreichbarkeit von aussen über gratis Domain-Name (DynDNS, DDClient)
- Filesharing in einer Client/Server Architektur (Bit Torrent, Soulseek)
- Starten von Programmen auf dem Server und Ausgabe auf dem Laptop (X-Forwarding)
- Übermittlung von gespielten Songs an Last.fm (mpdscribble)
- Alarmfunktion (am Morgen will ich automatisch mit meiner Musik geweckt werden)

Themen wie Mailserver, Routing, DHCP, IPTables, Print-Server etc. werde ich nicht behandeln.

Wieso Ubuntu 6.06 und nicht die aktuellste Version?

Die am 1. Juni 2006 veröffentlichte Version Ubuntu 6.06 LTS (Long Term Support) erfährt für die normale Version drei und für die Server-Version fünf Jahre Unterstützung. Sie wird damit als Server-Installation bis am 1. Juni 2011 mit Sicherheitsupdates versorgt. Für einen Server braucht man nicht zwingend immer die neuesten Versionen, viel wichtiger sind Stabilität und Zuverlässigkeit, diese bietet Ubuntu LTS. Zudem habe ich mit Ubuntu als Desktop System schon ein wenig Erfahrung, was die ganze Sache etwas erleichtert. Natürlich kann man auch andere Distris für Serverinstallationen empfehlen, aber ich habe mich für Ubuntu entschieden und werde darum auch nur darauf eingehen.

Okay, dann beginnen wir mal mit der Einrichtung, folgende Kapitel werden behandelt:

01. Vorbereitung
02. Installation Ubuntu 6.06 Server LTS
03. SSH-Zugang mit Keys
04. Erstes Update des Servers und Einrichtung der APT-Quellen
05. NFS-Shares und die /etc/exports
06. Unser Backup-Konzept
07. Alarm-/Weckfunktion
08. Last.FM für MPD
09. Erläuterung der /etc/fstab
10. Externe USB-Festplatten, EXT3 und NTFS
11. Giantdisc - Musik fernsteuern über ein WLAN mit einem Palm


Weitere Kapitel werden wohl folgen! ;)
 
Last edited by a moderator:
01. Vorbereitung

Bevor man loslegt, sollte man folgende Dinge erledigen:

- Backup aller wichtigen Daten, die eventuell schon auf dem Server sind (Musik, Fotos, Dokumente, etc.)
- Runterladen und Brennen des Ubuntu 6.06 Server ISO
- Einrichtung eventueller Hardware (ich musste z.B. meinen neuen WLAN-Router erstmal installieren)
- Server so weit fertig montieren (PCI-Karten, Gehäuse, Verkabelung, etc.)
- Sich überlegen, wie man seine Harddisk(s) verwenden bzw. partitionieren will (Konzept)

Beim Backup sollte man nicht vergessen, auch seine Mails, Lesezeichen und Messenger Kontakte aufzuheben. Ist das erledgt, ist es an der Zeit, die Ubuntu Server ISO runterzuladen und auch gleich zu brennen:

Ubuntu 6.06.1 LTS (Dapper Drake) - Server install CD - PC (Intel x86) server install CD

(je nach System gibt es auch Versionen für AMD-64-Bit, Mac (PowerPC) und SPARC Server)

Wir laden wie folgt runter:

Code:
fish@fishbook:~/Desktop$ wget http://ftp.cw.net/pub/linux/ftp.ubuntu.com/releases/6.06/ubuntu-6.06.1-server-i386.iso
--23:24:15--  http://ftp.cw.net/pub/linux/ftp.ubuntu.com/releases/6.06/ubuntu-6.06.1-server-i386.iso
           => `ubuntu-6.06.1-server-i386.iso'
Resolving ftp.cw.net... 195.27.236.210, 2001:5000:0:300::15
Connecting to ftp.cw.net|195.27.236.210|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 453,132,288 (432M) [text/plain]

100%[=======================================================>] 453,132,288  415.13K/s    ETA 00:00

23:41:35 (425.60 KB/s) - `ubuntu-6.06.1-server-i386.iso' saved [453132288/453132288]

Nun wird anhand einer Checksumme überprüft, ob die Datei auch ohne Fehler richtig bei uns angekommen ist.

Für unsere Version ubuntu-6.06.1-server-i386.iso sollten wir gemäss Ubuntu-Homepage folgenden Hashwert erhalten:

Code:
5ad76d8b380ab5be713e5daa9ea84475

Das überprüfen wir mit dem Befehl:

Code:
fish@fishbook:~/Desktop$ md5sum ubuntu-6.06.1-server-i386.iso
5ad76d8b380ab5be713e5daa9ea84475  ubuntu-6.06.1-server-i386.iso

Dies ist also erfüllt und unser Image ist 1:1 identisch mit dem angebotenen Image auf dem Server. Konkret bedeutet dies, dass der Download reibungslos lief und keine Daten verloren gingen oder falsch auf die Harddisk geschrieben wurden. Trotzdem wollen wir auf Nummer sicher gehen und prüfen noch mit einem zweiten Verfahren:

Code:
fish@fishbook:~/Desktop$ wget http://ftp.cw.net/pub/linux/ftp.ubuntu.com/releases/6.06/MD5SUMS
--23:45:07--  http://ftp.cw.net/pub/linux/ftp.ubuntu.com/releases/6.06/MD5SUMS
           => `MD5SUMS'
Resolving ftp.cw.net... 195.27.236.210, 2001:5000:0:300::15
Connecting to ftp.cw.net|195.27.236.210|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 665 [text/plain]

100%[=======================================================>] 665  --.--K/s

23:45:07 (18.12 MB/s) - `MD5SUMS' saved [665/665]

Die runtergeladene Datei MD5SUMS enthält Checkwerte für alle möglichen Ubuntu ISOs - sie muss in das gleiche Verzeichnis wie unser heruntergeladenes Image platziert werden. Nun prüfen wir den Hashwert ein zweites Mal, wie folgt:

fish@fishbook:~/Desktop$ md5sum -c MD5SUMS
md5sum: ubuntu-6.06.1-alternate-amd64.iso: No such file or directory
ubuntu-6.06.1-alternate-amd64.iso: FAILED open or read
md5sum: ubuntu-6.06.1-alternate-i386.iso: No such file or directory
ubuntu-6.06.1-alternate-i386.iso: FAILED open or read
md5sum: ubuntu-6.06.1-alternate-powerpc.iso: No such file or directory
ubuntu-6.06.1-alternate-powerpc.iso: FAILED open or read
md5sum: ubuntu-6.06.1-desktop-amd64.iso: No such file or directory
ubuntu-6.06.1-desktop-amd64.iso: FAILED open or read
md5sum: ubuntu-6.06.1-desktop-i386.iso: No such file or directory
ubuntu-6.06.1-desktop-i386.iso: FAILED open or read
md5sum: ubuntu-6.06.1-desktop-powerpc.iso: No such file or directory
ubuntu-6.06.1-desktop-powerpc.iso: FAILED open or read
md5sum: ubuntu-6.06.1-server-amd64.iso: No such file or directory
ubuntu-6.06.1-server-amd64.iso: FAILED open or read
ubuntu-6.06.1-server-i386.iso: OK
md5sum: ubuntu-6.06.1-server-powerpc.iso: No such file or directory
ubuntu-6.06.1-server-powerpc.iso: FAILED open or read
md5sum: ubuntu-6.06.1-server-sparc.iso: No such file or directory
ubuntu-6.06.1-server-sparc.iso: FAILED open or read
md5sum: WARNING: 9 of 10 listed files could not be read

Da die Datei MD5SUMS Checkwerte aller möglichen Ubuntu ISOs enthält und wir ja nicht alle heruntergeladen haben, bekommen wir ein paar Fehlermeldungen (No such file or directory, FAILED) - diese können wir getrost ignorieren.

Wichtig hingegen ist folgende Zeile:

Code:
ubuntu-6.06.1-server-i386.iso: OK

Spätestens jetzt können wir 100% sicher sein, dass wir ein funktionierendes Image auf der Platte haben!

Weitere Checksummen für andere Ubuntu Versionen finden sich übrigens hier:

https://help.ubuntu.com/community/UbuntuHashes

Diese Image-Datei gilt es nun zu brennen, dazu beginnen wir mit folgendem Befehl:

Code:
fish@fishbook:~$ sudo cdrecord -scanbus dev=ATA
Password:
Cdrecord-Clone 2.01.01a03 (i686-pc-linux-gnu) Copyright (C) 1995-2005 Joerg Schilling
NOTE: this version of cdrecord is an inofficial (modified) release of cdrecord
      and thus may have bugs that are not present in the original version.
      Please send bug reports and support requests to <cdrtools@packages.debian.org>.
      The original author should not be bothered with problems of this version.
cdrecord: Warning: Running on Linux-2.6.17-10-generic
cdrecord: There are unsettled issues with Linux-2.5 and newer.
cdrecord: If you have unexpected problems, please try Linux-2.4 or Solaris.
scsidev: 'ATA'
devname: 'ATA'
scsibus: -2 target: -2 lun: -2
Warning: Using badly designed ATAPI via /dev/hd* interface.
Linux sg driver version: 3.5.27
Using libscg version 'debian-0.8debian2'.
cdrecord: Warning: using inofficial version of libscg (debian-0.8debian2 '@(#)scsitransp.c      1.91 04/06/17 Copyright 1988,1995,2000-2004 J. Schilling').
scsibus1:
        1,0,0   100) 'QSI     ' 'DVD/CDRW SBW-081' 'NH02' Removable CD-ROM
        1,1,0   101) *
        1,2,0   102) *
        1,3,0   103) *
        1,4,0   104) *
        1,5,0   105) *
        1,6,0   106) *
        1,7,0   107) *

Eventuelle Fehlermeldungen/Warnungen (wie oben) kann man ignorieren - was uns interessiert, ist folgende Zeile:

Code:
1,0,0   100) 'QSI     ' 'DVD/CDRW SBW-081' 'NH02' Removable CD-ROM

Unseren Brenner müssen wir also mit dev=1,0,0 ansprechen!

Nun brennen wir auch gleich das ISO:

Code:
cdrecord -v speed=x dev=x,x,x /pfad/zum/iso/name.iso

-v speed=x gibt an, wie schnell man seine CD brennen will.
Natürlich sollte man die Möglichkeiten der Hardware nicht übersteigen!

dev=x,x,x gibt die Schnittstelle an, die wir mit -scanbus abgefragt haben.

/pfad/zum/iso/name.iso ist hier der Pfad zur Datei inklusiv Dateiname.

Setzt man obige Werte dem System entsprechend in den Befehl ein, kann man so sein Image brennen. Und jetzt, wo die wichtigsten Vorarbeiten erledigt sind, können wir endlich mit der eigentlichen Installation des Servers beginnen!
 
02. Installation Ubuntu 6.06 Server LTS

Da es sich in diesem Thread ja um einen einfachen Home-Server handelt, der im Netzwerk gewisse Dienste erfüllen soll, kann ich davon ausgehen, dass wir physikalischen Zugriff auf die Maschine haben. Zur Installation von Ubuntu 6.06 Server LTS braucht man in der beschriebenen Variante lediglich Bildschirm, CD-ROM und Tastatur, eine Maus ist nicht nötig. Auf Screenshots werde ich verzichten, aber hier trotzdem ein paar Anmerkungen zur Installation.

Wir legen also die CD in das Laufwerk und booten den PC. Jetzt ist es wichtig, dass er auch vom CD-ROM und nicht von der Festplatte aufstartet. Passiert dies nicht automatisch, lässt es sich normalerweise im Bios (Bootreihenfolge!) festlegen. Nun begrüsst uns ein Willkommensscreen, wir wählen die Option "Install a LAMP Server" - wer später keine Webseite bzw. kein Streaming-Interface für seine Musik einrichten will, sollte eher zur ersten Option "Install to the hard disk" greifen. Mit F2 könnte man die Sprache noch auf Deutsch umstellen, ich bevorzuge aber Englisch. Von nun an erläutere ich also die englische LAMP Installation, die Unterschiede zur einer deutschen Normalinstallation sind sowieso nur minim.

Wer ganz auf Nummer sicher gehen will, kann seine CD erst noch auf Fehler testen lassen, ich überspringe diesen Schritt. Ach ja, ich empfehle, den Computer schon während bzw. vor der Installation an das Internet anzuschliessen.

Die Installation ist eigentlich selbsterklärend und läuft in folgenden Schritten ab:

01. Sprachauswahl (für mich Englisch, natürlich geht auch Deutsch)
02. Auswahl des Ortes (Deutschland, Schweiz, Österreich, whatever)
03. Konfiguration des Keyboards (German, Swiss German, etc.)
04. Automatische Hardware Erkennung, Module werden geladen
05. Auswahl des Netzwerk-Interface (ich empfehle eine normale Netzwerkkarte, also eth0)
06. Automatische Konfiguration des Netzes mit DHCP
07. Auswahl des Hostnames (eindeutig erkennbarer Name des PCs im Netzwerk, ich wähle fishbox)
08. Partitionierung der HDs

Achtung: Schritt 8 ist zentral und bei falscher Ausführung können hier Daten verloren gehen. Denkt also an Backups!

Ich wähle hier jeweils "manuelles Editieren der Partitionen" und konfiguriere diese selbst. Wie man einen Server partitionieren soll, muss jeder selbst rausfinden - zwingend nötig sind nur / (root) und SWAP. Einige bevorzugen es, auch /home (persönliche Daten) und /boot (für das Aufstarten des PCs) oder gar /var auf seperate Partition auszulagern, das ist aber optional. Ich persönlich binde meine Datenpartitionen in /media ein, wobei man auch hier frei ist. Auch lasse ich ein paar GB auf einer eigenen Partition frei für ein allfälliges zweites (Rettungs-) System.

Ist man fertig, richtet Ubuntu die Partition wie gewünscht ein und schreibt die Änderungen auf die Platten.

09. Systemzeit einstellen (ich wähle UTC)
10. Benutzer und Passwörter

Achtung: Passwörter sollten ausreichend sicher (lang, mit Zahlen und Buchstaben, Gross- und Kleinschreibung, keine normalen Wörter, etc.) sein! Man wird nach einem Real- und Benutzernamen plus Passwort für den allerersten User auf dem System gefragt, der auf Ubuntu gemäss dem sudo-Konzept auch gleich Root sein wird.

11. Automatische Installation des Systems

Nun entfernt man die CD, bootet neu und loggt sich auch gleich mit Benutzername und Passwort ein - fertig!
 
03. SSH-Zugang mit Keys

Bevor wir loslegen, kurz was zur Terminologie:

Von nun an ist fishbook mein Notebook bzw. der Client, fishbox mein normaler PC bzw. der Server!

Die erste Aktion, die wir nun vornehmen, ist die Einrichtung eines SSH Zugangs. Dies wird uns nämlich erlauben, den PC bequem über einen Laptop zu administrieren - Bildschirm und Tastatur am Server selbst sind so nicht mehr nötig.

Was ist SSH? Secure Shell - Wikipedia

Es handelt sich also um das so genannte Secure Shell Verfahren. SSH erlaubt den Zugriff auf einem System mit verschlüsselter Netzwerkübertragung - und das ist genau das, was wir brauchen! Ziel ist es also, dass wir uns von einem anderen PC auf dem Server einloggen können, um ihn so zu administrieren.

Dazu installieren wir den SSH Server OpenSSH:

Code:
sudo apt-get update
sudo apt-get install openssh-server

Was ist apt-get? Advanced Packaging Tool - Wikipedia

Die automatische Abhängigkeitsprüfung wird nach einer Bestätigung der Installation fragen, wir bejahen.

Wichtige Konfigurationsdatein liegen in Linux in Normalfall im /etc Verzeichnis, so auch hier; der OpenSSH Server wird über die /etc/ssh/sshd_config. Diese kann man mit einem x-beliebigen Editor bearbeiten. Ich persönlich benutze dazu der sehr benutzerfreundliche und leicht zu bedienende Nano. Eine sudo apt-get install nano verrät uns, dass der Editor sogar schon standardmässig installiert ist, wir können also gleich loslegen.

Code:
sudo nano /etc/ssh/sshd_config

Hier noch ein kleiner Tipp am Rande: Natürlich ist es nicht nötig, immer die ganzen Pfade von Hand einzutippen. Linux kennt nämlich ein Feature namens "Tab Completion" - es reicht, /et[TAB]/ssh/ssh[TAB] einzugeben. Sobald es nur noch eine Option gibt, wird der Pfad automatisch vervollständigt. Gibt es noch mehrere Varianten, lassen sich diese bequem mit einem weiteren Druck auf die [TAB] Taste auflisten.

Anyway, nun sind wir in Nano und sehen den Inhalt der /etc/ssh/sshd_config. Hier editieren wir vorerst mal die Zeile PermitRootLogin auf no und verunmöglichen so aus Sicherheitsgründen ein direktes einloggen als Root. Wir speichern die Änderung mit Ctrl+O und verlassen Nano mit Ctrl+X.

Nun starten wir den SSH-Server neu:

Code:
fish@fishbox:~$ sudo /etc/init.d/ssh restart
 * Restarting OpenBSD Secure Shell server...                             [ ok ]

Damit der Server im auch eindeutig ansprechbar ist, sollte man ihm eine feste interne Netzwerk-IP zuteilen. Ich persönlich mache das über den Router, gebunden an die MAC-Adresse. Alternativ kann man es aber auch über die /etc/network/interfaces definieren, wie es z.B. [wiki=IP-Adresse_wechseln?highlight=%28IP%29]hier[/wiki] beschrieben wird. Wir versuchen nun gleich mal, uns von einem Laptop im gleichen Netzwerk auf dem Server einzuloggen. Dabei testen wir zuerst, ob sich der Server überhaupt anpingen lässt:

Code:
fish@fishbook:~$ ping 192.168.0.175
PING 192.168.0.175 (192.168.0.175) 56(84) bytes of data.
64 bytes from 192.168.0.175: icmp_seq=1 ttl=64 time=0.537 ms
64 bytes from 192.168.0.175: icmp_seq=2 ttl=64 time=0.206 ms
64 bytes from 192.168.0.175: icmp_seq=3 ttl=64 time=0.209 ms
64 bytes from 192.168.0.175: icmp_seq=4 ttl=64 time=0.193 ms
64 bytes from 192.168.0.175: icmp_seq=5 ttl=64 time=0.193 ms

--- 192.168.0.175 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.193/0.267/0.537/0.136 ms

(Abbruch mit Ctrl+C)

Was ist ein Ping? Fehler

Der Server ist also erreichbar, wir loggen uns ein:

(auf dem Client muss dafür natürlich ssh installiert sein!)

Code:
fish@fishbook:~$ ssh 192.168.0.175
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
cf:43:78:9d:7e:8b:60:f5:f4:50:2d:a9:76:90:a8:ad.
Please contact your system administrator.
Add correct host key in /home/fish/.ssh/known_hosts to get rid of this message.
Offending key in /home/fish/.ssh/known_hosts:1
RSA host key for 192.168.0.175 has changed and you have requested strict checking.
Host key verification failed.

Diese Meldung erscheint bei euch wohl nicht - gut so. Bei mir kommt sie, weil ich schonmal mit diesem Laptop auf den Server (mit gleicher IP) zugegriffen habe, der Schlüssel sich aber nach der Neuinstallation natürlich geändert hat. Dem wirken wir entgegen mit folgendem Befehl:

Code:
fish@fishbook:~$ ssh-keygen -R hostname
/home/fish/.ssh/known_hosts updated.
Original contents retained as /home/fish/.ssh/known_hosts.old

Der alte Schlüssel ist nun aus der ~/.ssh/known_hosts entfernt und dem einloggen auf dem Server steht nichts mehr im Wege. Falls es immer noch nicht geht, kann man z.B. einfach den Inhalt der ~/.ssh/known_hosts komplett löschen oder ensprechend editieren, dann sollte ein einloggen klappen!

Code:
fish@fishbook:~$ ssh 192.168.0.175
The authenticity of host '192.168.0.175 (192.168.0.175)' can't be established.
RSA key fingerprint is cf:43:78:9d:7e:8b:60:f5:f4:50:2d:a9:76:90:a8:ad.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.175' (RSA) to the list of known hosts.
fish@192.168.0.175's password:
Linux fishbox 2.6.15-26-server #1 SMP Thu Aug 3 04:09:15 UTC 2006 i686 GNU/Linux

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
Last login: Mon Apr  2 15:07:27 2007
fish@fishbox:~$

Ich bin drin! :)

Von nun an kann man am Server also Bildschirm und Tastatur entfernen und ihn "ruhen lassen" und die Administration und Konfiguration per SSH erledigen. Achtung: Gewisse PCs verlangen beim Neustart zwingend eine Tastatur und booten sonst nicht. Falls das bei euch passieren sollte, lässt sich dies aber normalerweise im Bios ausschalten!

Der SSH-Zugang funktioniert zwar nun, ist aber noch nicht optimal eingerichtet. Besser ist es nämlich (aus Sicherheitsgründen!) sich ausschließlich über das noch sicherere Public-Key-Verfahren anzumelden und die Passwort Authentifikation auszuschalten. Wer nun keinen Key hat, kann gar nicht erst auf das System zugreifen.

Auf dem Client (nicht Server!) führen wir nun folgenden Befehl aus:

Code:
fish@fishbook:~$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/fish/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/fish/.ssh/id_dsa.
Your public key has been saved in /home/fish/.ssh/id_dsa.pub.
The key fingerprint is:
2e:b4:21:98:00:07:59:66:d9:19:0c:28:4a:c1:72:f6 fish@fishbook

Was haben wir genau gemacht? Wir liessen mit dem Befehl ssh-keygen auf dem Client System ein Schlüsselpaar erzeugen. Den voreingestellten Dateinamen (id_dsa) kann man mit Enter bestätigen, dann muss man einen beliebigen (sicheren!) Passphrase eingeben. Von der Benutzung einer leeren Passphrase ist jedoch abzuraten, weil sonst jeder, der evtl. in den Besitz dieser Datei kommt, sofortigen Zugriff auf alle zugehörigen Systeme erhält!

Diesen Key kopieren wir nun auf den Server:

Code:
fish@fishbook:~$ ssh-copy-id -i /home/fish/.ssh/id_dsa.pub 192.168.0.175
26
fish@192.168.0.175's password:
Now try logging into the machine, with "ssh '192.168.0.175'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Funzt!

Wir loggen uns wieder auf dem Server ein und öffnen nochmals die /etc/ssh/sshd_config in Nano:

Code:
fish@fishbook:~$ ssh 192.168.0.175
Enter passphrase for key '/home/fish/.ssh/id_dsa':
Linux fishbox 2.6.15-26-server #1 SMP Thu Aug 3 04:09:15 UTC 2006 i686 GNU/Linux

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
Last login: Mon Apr  2 16:39:49 2007 from 192.168.0.174
fish@fishbox:~$ sudo nano /etc/ssh/sshd_config

Dort setzen wir den Wert PasswordAuthentication auf no:

Code:
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

Achtung: Diese Zeile ist standardmässig auskommentiert, das # vor PasswordAuthentication muss also entfernt werden!

Nun starten wir den SSH-Server neu:

Code:
fish@fishbox:~$ sudo /etc/init.d/ssh restart
 * Restarting OpenBSD Secure Shell server...                             [ ok ]

Das einloggen sieht nun wie folgt aus:

Code:
fish@fishbox:~$ exit
logout
Connection to 192.168.0.175 closed.
fish@fishbook:~$ ssh 192.168.0.175

Enter passphrase for key '/home/fish/.ssh/id_dsa':
Linux fishbox 2.6.15-26-server #1 SMP Thu Aug 3 04:09:15 UTC 2006 i686 GNU/Linux

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
Last login: Mon Apr  2 16:50:40 2007 from 192.168.0.174

Die Authentifizierung über Public-Keys funktioniert also,

Ach ja, auf dem Server sollten wir auch noch in der /etc/ssh/sshd_config PAM auf no setzen:

Code:
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

UsePAM no

(ganz am Ende der Config Datei)

Somit ist die normale Identifikation per Passwort nach Restart des SSH Servers (sudo /etc/init.d/ssh restart) nun endlich nicht mehr möglich und ohne einen Public-Key geht gar nix! So weit, so gut - das ganze hat aber noch einen kleinen Schönheitsfehler. Schön wäre es natürlich, wenn wir uns sogar ohne den Passphrase einloggen könnten.

Hier kommt der SSH-Agent ins Spiel. Im SSH-Agenten kann man seine(n) privaten Schlüssel ablegen, so dass sich der Agent von nun an um die Authentifizierung kümmert. Man muss also nur einmal seine Passphrase angeben, und der Agent behält dann den Schlüssel bis zu seiner Beendigung (normalerweise beim Logout) im Speicher. Der SSH-Agent wird bei einer Ubuntu-Desktop-Sitzung automatisch im Hintergrund gestartet. Zur Interaktion mit dem SSH-Agenten dient das Programm ssh-add, wobei die Option -l die augenblicklich gespeicherten Schlüssel auflistet.

Quelle: [wiki]SSH[/wiki]

Wir führen also folgende Befehle aus, und zwar auf dem Client:

Code:
fish@fishbook:~$ ssh-add -l
The agent has no identities.
fish@fishbook:~$ ssh-add
Enter passphrase for /home/fish/.ssh/id_dsa:
Identity added: /home/fish/.ssh/id_dsa (/home/fish/.ssh/id_dsa)
fish@fishbook:~$ ssh-add -l
1024 2e:b4:21:98:00:07:59:66:d9:19:0c:28:4a:c1:72:f6 /home/fish/.ssh/id_dsa (DSA)
fish@fishbook:~$ ssh 192.168.0.175
Linux fishbox 2.6.15-26-server #1 SMP Thu Aug 3 04:09:15 UTC 2006 i686 GNU/Linux

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
Last login: Mon Apr  2 16:53:11 2007 from 192.168.0.174

Ein bequemes (aber trotzdem sicheres!) einloggen ohne Passphrase ist nun möglich...
...die SSH Konfiguration ist damit abgeschlossen - wir gönnen uns Pralinen und ein Glas Champagner! ;)
 
04. Erstes Update des Servers und Einrichtung der APT-Quellen

APT ist das zentrale Paketmanagement-System von Debian und kommt daher natürlich auch in Ubuntu zum Einsatz. Ich werde in diesem Abschnitt einige Worte über die Softwarequellen von Ubuntu verlieren, kurz die /etc/apt/sources.list bearbeiten und den Server auf den neusten Stand bringen.

Mehr zu APT findet ihr hier: Advanced Packaging Tool - Wikipedia

Oder natürlich auch in der manpage:

Code:
man apt

Die Quellen von APT werden in der /etc/apt/sources.list konfiguriert, wir gucken sie uns gleich mal an:

Code:
fish@fishbox:/$ sudo nano /etc/apt/sources.list

Es sollte in etwa wie folgt aussehen:

Code:
#
# deb cdrom:[Ubuntu-Server 6.06.1 _Dapper Drake_ - Release i386 (20060807.1)]/ dapper main restricted

deb cdrom:[Ubuntu-Server 6.06.1 _Dapper Drake_ - Release i386 (20060807.1)]/ dapper main restricted

deb http://ch.archive.ubuntu.com/ubuntu/ dapper main restricted
deb-src http://ch.archive.ubuntu.com/ubuntu/ dapper main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://ch.archive.ubuntu.com/ubuntu/ dapper-updates main restricted
deb-src http://ch.archive.ubuntu.com/ubuntu/ dapper-updates main restricted

## Uncomment the following two lines to add software from the 'universe'
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## universe WILL NOT receive any review or updates from the Ubuntu security
## team.
# deb http://ch.archive.ubuntu.com/ubuntu/ dapper universe
# deb-src http://ch.archive.ubuntu.com/ubuntu/ dapper universe

## Uncomment the following two lines to add software from the 'backports'
## repository.
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://ch.archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse
# deb-src http://ch.archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse


deb http://security.ubuntu.com/ubuntu dapper-security main restricted
deb-src http://security.ubuntu.com/ubuntu dapper-security main restricted
# deb http://security.ubuntu.com/ubuntu dapper-security universe
# deb-src http://security.ubuntu.com/ubuntu dapper-security universe

Dabei ist mir als erstes folgender Eintrag aufgefallen:

Code:
deb cdrom:[Ubuntu-Server 6.06.1 _Dapper Drake_ - Release i386 (20060807.1)]/ dapper main restricted

Er führt dazu. dass APT bei vielen Installation auf das CD Laufwerk zurückgreift. Wenn man will, kann man das so lassen - nur müsste man dann eigentlich immer die Ubuntu ISO im CD-Laufwerk auf dem Server haben, was ich weniger sinnvoll finde. Die Zeile kann aber durchaus Sinn machen, vor allem dann, wenn man über eine langsame Internetleitung verfügt. Die entsprechenden Dateien werden so nämlich direkt von der CD aus installiert.

Das sieht dann z.B. so aus:

Code:
fish@fishbox:~$ sudo apt-get build-dep rsnapshot
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
  autotools-dev binutils build-essential cpp cpp-4.0 debconf-utils debhelper dpkg-dev g++ g++-4.0 gcc gcc-4.0 gettext html2text
  intltool-debian libc6-dev libstdc++6-4.0-dev linux-kernel-headers make patch po-debconf
0 upgraded, 21 newly installed, 0 to remove and 0 not upgraded.
Need to get 2985kB/14.1MB of archives.
After unpacking 55.1MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://ch.archive.ubuntu.com dapper-updates/main libc6-dev 2.3.6-0ubuntu20.4 [2822kB]
Media change: please insert the disc labeled
 'Ubuntu-Server 6.06.1 _Dapper Drake_ - Release i386 (20060807.1)'
in the drive '/cdrom/' and press enter

Da ich nicht immer die Ubuntu CD im CD-Rom haben will, kommentiere ich die entsprechende Zeile in der /etc/apt/sources.list einfach aus:

Code:
# deb cdrom:[Ubuntu-Server 6.06.1 _Dapper Drake_ - Release i386 (20060807.1)]/ dapper main restricted

Das # am Anfang verhindert den Rückgriff auf die CD - stattdessen läd APT die Pakete nun einfach aus dem Netz!

Den Rest lassen wir so und führen nun gleich ein erstes Update des Servers durch:

(Achtung, laaange Ausgabe!)

Code:
fish@fishbox:~$ sudo apt-get update
Password:
Get:1 http://ch.archive.ubuntu.com dapper Release.gpg [189B]
Get:2 http://ch.archive.ubuntu.com dapper-updates Release.gpg [191B]
Get:3 http://security.ubuntu.com dapper-security Release.gpg [191B]
Hit http://ch.archive.ubuntu.com dapper Release
Hit http://security.ubuntu.com dapper-security Release
Hit http://ch.archive.ubuntu.com dapper-updates Release
Hit http://ch.archive.ubuntu.com dapper/main Packages
Hit http://ch.archive.ubuntu.com dapper/restricted Packages
Hit http://ch.archive.ubuntu.com dapper/main Sources
Hit http://ch.archive.ubuntu.com dapper/restricted Sources
Hit http://security.ubuntu.com dapper-security/main Packages
Hit http://ch.archive.ubuntu.com dapper-updates/main Packages
Hit http://ch.archive.ubuntu.com dapper-updates/restricted Packages
Hit http://ch.archive.ubuntu.com dapper-updates/main Sources
Hit http://ch.archive.ubuntu.com dapper-updates/restricted Sources
Hit http://security.ubuntu.com dapper-security/restricted Packages
Hit http://security.ubuntu.com dapper-security/main Sources
Hit http://security.ubuntu.com dapper-security/restricted Sources
Fetched 3B in 0s (6B/s)
Reading package lists... Done
fish@fishbox:~$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  linux-image-2.6.15-28-server
The following packages will be upgraded:
  bind9-host cpio dnsutils dpkg dselect file gnupg gzip info
  libapache2-mod-php5 libbind9-0 libc6 libc6-i686 libdns21 libgnutls12
  libisc11 libisccc0 libisccfg1 libkrb53 liblwres9 libmagic1
  libmysqlclient15off libssl0.9.8 linux-image-2.6.15-26-server
  linux-image-server linux-server locales lvm2 mysql-client-5.0 mysql-common
  mysql-server mysql-server-5.0 openssl php5-common php5-mysql php5-mysqli
  python2.4 python2.4-minimal tar tcpdump w3m
41 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 102MB of archives.
After unpacking 67.7MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://ch.archive.ubuntu.com dapper-updates/main dpkg 1.13.11ubuntu7 [1866kB]
Get:2 http://security.ubuntu.com dapper-security/main gzip 1.3.5-12ubuntu0.1 [71.2kB]
Get:3 http://security.ubuntu.com dapper-security/main tar 1.15.1-2ubuntu2.1 [519kB]
Get:4 http://security.ubuntu.com dapper-security/main libssl0.9.8 0.9.8a-7ubuntu 0.3 [2594kB]
Get:5 http://ch.archive.ubuntu.com dapper-updates/main locales 2.3.18.2 [3285kB]
Get:6 http://security.ubuntu.com dapper-security/main python2.4 2.4.3-0ubuntu6 [2737kB]
Get:7 http://ch.archive.ubuntu.com dapper-updates/main libc6 2.3.6-0ubuntu20.4 [4587kB]
Get:8 http://security.ubuntu.com dapper-security/main python2.4-minimal 2.4.3-0ubuntu6 [702kB]
Get:9 http://security.ubuntu.com dapper-security/main gnupg 1.4.2.2-1ubuntu2.5 [982kB]
Get:10 http://ch.archive.ubuntu.com dapper-updates/main libc6-i686 2.3.6-0ubuntu20.4 [1079kB]
Get:11 http://security.ubuntu.com dapper-security/main libgnutls12 1.2.9-2ubuntu1.1 [373kB]
Get:12 http://security.ubuntu.com dapper-security/main libisc11 1:9.3.2-2ubuntu1.2 [172kB]
Get:13 http://security.ubuntu.com dapper-security/main libdns21 1:9.3.2-2ubuntu1.2 [478kB]
Get:14 http://ch.archive.ubuntu.com dapper-updates/main lvm2 2.02.02-1ubuntu1.5 [279kB]
Get:15 http://ch.archive.ubuntu.com dapper-updates/main cpio 2.6-10ubuntu0.2 [94.0kB]
Get:16 http://ch.archive.ubuntu.com dapper-updates/main dselect 1.13.11ubuntu7 [117kB]
Get:17 http://security.ubuntu.com dapper-security/main libisccc0 1:9.3.2-2ubuntu1.2 [90.6kB]
Get:18 http://security.ubuntu.com dapper-security/main libisccfg1 1:9.3.2-2ubuntu1.2 [102kB]
Get:19 http://security.ubuntu.com dapper-security/main libbind9-0 1:9.3.2-2ubuntu1.2 [91.1kB]
Get:20 http://security.ubuntu.com dapper-security/main liblwres9 1:9.3.2-2ubuntu1.2 [107kB]
Get:21 http://security.ubuntu.com dapper-security/main bind9-host 1:9.3.2-2ubuntu1.2 [109kB]
Get:22 http://security.ubuntu.com dapper-security/main dnsutils 1:9.3.2-2ubuntu1.2 [175kB]
Get:23 http://security.ubuntu.com dapper-security/main file 4.16-0ubuntu3.1 [30.7kB]
Get:24 http://security.ubuntu.com dapper-security/main libmagic1 4.16-0ubuntu3.1 [263kB]
Get:25 http://security.ubuntu.com dapper-security/main info 4.8-4ubuntu0.1 [214kB]
Get:26 http://security.ubuntu.com dapper-security/main libkrb53 1.4.3-5ubuntu0.2 [381kB]
Get:27 http://security.ubuntu.com dapper-security/main tcpdump 3.9.4-2ubuntu0.1 [290kB]
Get:28 http://security.ubuntu.com dapper-security/main w3m 0.5.1-4ubuntu2.6.06 [1061kB]
Get:29 http://security.ubuntu.com dapper-security/main mysql-common 5.0.22-0ubuntu6.06.3 [39.5kB]
Get:30 http://security.ubuntu.com dapper-security/main libmysqlclient15off 5.0.22-0ubuntu6.06.3 [1382kB]
Get:31 http://security.ubuntu.com dapper-security/main php5-mysql 5.1.2-1ubuntu3.6 [22.0kB]
Get:32 http://security.ubuntu.com dapper-security/main php5-mysqli 5.1.2-1ubuntu3.6 [37.4kB]
Get:33 http://security.ubuntu.com dapper-security/main libapache2-mod-php5 5.1.2-1ubuntu3.6 [2260kB]
Get:34 http://security.ubuntu.com dapper-security/main php5-common 5.1.2-1ubuntu3.6 [134kB]
Get:35 http://security.ubuntu.com dapper-security/main linux-image-2.6.15-26-server 2.6.15-26.47 [23.1MB]
Get:36 http://security.ubuntu.com dapper-security/main linux-image-2.6.15-28-server 2.6.15-28.51 [23.2MB]
Get:37 http://security.ubuntu.com dapper-security/main linux-image-server 2.6.15.26 [23.4kB]
Get:38 http://security.ubuntu.com dapper-security/restricted linux-server 2.6.15.26 [23.4kB]
Get:39 http://security.ubuntu.com dapper-security/main mysql-client-5.0 5.0.22-0ubuntu6.06.3 [6278kB]
Get:40 http://security.ubuntu.com dapper-security/main mysql-server 5.0.22-0ubuntu6.06.3 [37.0kB]
Get:41 http://security.ubuntu.com dapper-security/main mysql-server-5.0 5.0.22-0ubuntu6.06.3 [21.3MB]
Get:42 http://security.ubuntu.com dapper-security/main openssl 0.9.8a-7ubuntu0.3 [976kB]
Fetched 102MB in 2m40s (634kB/s)
Extracting templates from packages: 100%
Preconfiguring packages ...
(Reading database ... 15948 files and directories currently installed.)
Preparing to replace dpkg 1.13.11ubuntu6 (using .../dpkg_1.13.11ubuntu7_i386.deb) ...
Unpacking replacement dpkg ...
Setting up dpkg (1.13.11ubuntu7) ...

(Reading database ... 15948 files and directories currently installed.)
Preparing to replace gzip 1.3.5-12 (using .../gzip_1.3.5-12ubuntu0.1_i386.deb) ...
Unpacking replacement gzip ...
Setting up gzip (1.3.5-12ubuntu0.1) ...

(Reading database ... 15948 files and directories currently installed.)
Preparing to replace tar 1.15.1-2ubuntu2 (using .../tar_1.15.1-2ubuntu2.1_i386.deb) ...
Unpacking replacement tar ...
Setting up tar (1.15.1-2ubuntu2.1) ...

(Reading database ... 15948 files and directories currently installed.)
Preparing to replace locales 2.3.18 (using .../locales_2.3.18.2_all.deb) ...
Unpacking replacement locales ...
Preparing to replace libc6 2.3.6-0ubuntu20 (using .../libc6_2.3.6-0ubuntu20.4_i386.deb) ...
Unpacking replacement libc6 ...
Setting up locales (2.3.18.2) ...
Generating locales...
  en_US.UTF-8... up-to-date
Generation complete.
Current default timezone: 'Europe/Zurich'.
Local time is now:      Mon Apr  2 17:54:20 CEST 2007.
Universal Time is now:  Mon Apr  2 15:54:20 UTC 2007.
Run 'tzconfig' if you wish to change it.

Setting up libc6 (2.3.6-0ubuntu20.4) ...

(Reading database ... 15978 files and directories currently installed.)
Preparing to replace libc6-i686 2.3.6-0ubuntu20 (using .../libc6-i686_2.3.6-0ubuntu20.4_i386.deb) ...
Unpacking replacement libc6-i686 ...
Preparing to replace lvm2 2.02.02-1ubuntu1 (using .../lvm2_2.02.02-1ubuntu1.5_i386.deb) ...
Unpacking replacement lvm2 ...
Preparing to replace libssl0.9.8 0.9.8a-7build1 (using .../libssl0.9.8_0.9.8a-7ubuntu0.3_i386.deb) ...
Unpacking replacement libssl0.9.8 ...
Preparing to replace python2.4 2.4.3-0ubuntu4 (using .../python2.4_2.4.3-0ubuntu6_i386.deb) ...
Unpacking replacement python2.4 ...
Preparing to replace python2.4-minimal 2.4.3-0ubuntu4 (using .../python2.4-minimal_2.4.3-0ubuntu6_i386.deb) ...
Unpacking replacement python2.4-minimal ...
Setting up python2.4-minimal (2.4.3-0ubuntu6) ...
Compiling python modules in /usr/lib/python2.4 ...
Compiling optimized python modules in /usr/lib/python2.4 ...

(Reading database ... 15978 files and directories currently installed.)
Preparing to replace cpio 2.6-10 (using .../cpio_2.6-10ubuntu0.2_i386.deb) ...
Unpacking replacement cpio ...
Preparing to replace gnupg 1.4.2.2-1ubuntu2.2 (using .../gnupg_1.4.2.2-1ubuntu2.5_i386.deb) ...
Unpacking replacement gnupg ...
Preparing to replace libgnutls12 1.2.9-2ubuntu1 (using .../libgnutls12_1.2.9-2ubuntu1.1_i386.deb) ...
Unpacking replacement libgnutls12 ...
Preparing to replace libisc11 1:9.3.2-2ubuntu1 (using .../libisc11_1%3a9.3.2-2ubuntu1.2_i386.deb) ...
Unpacking replacement libisc11 ...
Preparing to replace libdns21 1:9.3.2-2ubuntu1 (using .../libdns21_1%3a9.3.2-2ubuntu1.2_i386.deb) ...
Unpacking replacement libdns21 ...
Preparing to replace libisccc0 1:9.3.2-2ubuntu1 (using .../libisccc0_1%3a9.3.2-2ubuntu1.2_i386.deb) ...
Unpacking replacement libisccc0 ...
Preparing to replace libisccfg1 1:9.3.2-2ubuntu1 (using .../libisccfg1_1%3a9.3.2-2ubuntu1.2_i386.deb) ...
Unpacking replacement libisccfg1 ...
Preparing to replace libbind9-0 1:9.3.2-2ubuntu1 (using .../libbind9-0_1%3a9.3.2-2ubuntu1.2_i386.deb) ...
Unpacking replacement libbind9-0 ...
Preparing to replace liblwres9 1:9.3.2-2ubuntu1 (using .../liblwres9_1%3a9.3.2-2ubuntu1.2_i386.deb) ...
Unpacking replacement liblwres9 ...
Preparing to replace bind9-host 1:9.3.2-2ubuntu1 (using .../bind9-host_1%3a9.3.2-2ubuntu1.2_i386.deb) ...
Unpacking replacement bind9-host ...
Preparing to replace dnsutils 1:9.3.2-2ubuntu1 (using .../dnsutils_1%3a9.3.2-2ubuntu1.2_i386.deb) ...
Unpacking replacement dnsutils ...
Preparing to replace dselect 1.13.11ubuntu6 (using .../dselect_1.13.11ubuntu7_i386.deb) ...
Unpacking replacement dselect ...
Preparing to replace file 4.16-0ubuntu3 (using .../file_4.16-0ubuntu3.1_i386.deb) ...
Unpacking replacement file ...
Preparing to replace libmagic1 4.16-0ubuntu3 (using .../libmagic1_4.16-0ubuntu3.1_i386.deb) ...
Unpacking replacement libmagic1 ...
Preparing to replace info 4.8-4 (using .../info_4.8-4ubuntu0.1_i386.deb) ...
Unpacking replacement info ...
Preparing to replace libkrb53 1.4.3-5 (using .../libkrb53_1.4.3-5ubuntu0.2_i386.deb) ...
Unpacking replacement libkrb53 ...
Preparing to replace tcpdump 3.9.4-2 (using .../tcpdump_3.9.4-2ubuntu0.1_i386.deb) ...
Unpacking replacement tcpdump ...
Preparing to replace w3m 0.5.1-4ubuntu2 (using .../w3m_0.5.1-4ubuntu2.6.06_i386.deb) ...
Unpacking replacement w3m ...
Preparing to replace mysql-common 5.0.22-0ubuntu6.06 (using .../mysql-common_5.0.22-0ubuntu6.06.3_all.deb) ...
Unpacking replacement mysql-common ...
Preparing to replace libmysqlclient15off 5.0.22-0ubuntu6.06 (using .../libmysqlclient15off_5.0.22-0ubuntu6.06.3_i386.deb) ...
Unpacking replacement libmysqlclient15off ...
Preparing to replace php5-mysql 5.1.2-1ubuntu3.1 (using .../php5-mysql_5.1.2-1ubuntu3.6_i386.deb) ...
Unpacking replacement php5-mysql ...
Preparing to replace php5-mysqli 5.1.2-1ubuntu3.1 (using .../php5-mysqli_5.1.2-1ubuntu3.6_i386.deb) ...
Unpacking replacement php5-mysqli ...
Preparing to replace libapache2-mod-php5 5.1.2-1ubuntu3.1 (using .../libapache2-mod-php5_5.1.2-1ubuntu3.6_i386.deb) ...
Unpacking replacement libapache2-mod-php5 ...
Preparing to replace php5-common 5.1.2-1ubuntu3.1 (using .../php5-common_5.1.2-1ubuntu3.6_i386.deb) ...
Unpacking replacement php5-common ...
Preparing to replace linux-image-2.6.15-26-server 2.6.15-26.46 (using .../linux-image-2.6.15-26-server_2.6.15-26.47_i386.deb) ...
The directory /lib/modules/2.6.15-26-server still exists. Continuing as directed.
Unpacking replacement linux-image-2.6.15-26-server ...
Searching for GRUB installation directory ... found: /boot/grub
Testing for an existing GRUB menu.list file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.15-26-server
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done

Selecting previously deselected package linux-image-2.6.15-28-server.
Unpacking linux-image-2.6.15-28-server (from .../linux-image-2.6.15-28-server_2.6.15-28.51_i386.deb) ...
Preparing to replace linux-image-server 2.6.15.24 (using .../linux-image-server_2.6.15.26_i386.deb) ...
Unpacking replacement linux-image-server ...
Preparing to replace linux-server 2.6.15.24 (using .../linux-server_2.6.15.26_i386.deb) ...
Unpacking replacement linux-server ...
Preparing to replace mysql-client-5.0 5.0.22-0ubuntu6.06 (using .../mysql-client-5.0_5.0.22-0ubuntu6.06.3_i386.deb) ...
Unpacking replacement mysql-client-5.0 ...
Preparing to replace mysql-server 5.0.22-0ubuntu6.06 (using .../mysql-server_5.0.22-0ubuntu6.06.3_all.deb) ...
Unpacking replacement mysql-server ...
Preparing to replace mysql-server-5.0 5.0.22-0ubuntu6.06 (using .../mysql-server-5.0_5.0.22-0ubuntu6.06.3_i386.deb) ...
Stopping MySQL database server: mysqld.
Stopping MySQL database server: mysqld.
Unpacking replacement mysql-server-5.0 ...
Preparing to replace openssl 0.9.8a-7build1 (using .../openssl_0.9.8a-7ubuntu0.3_i386.deb) ...
Unpacking replacement openssl ...
Setting up libc6-i686 (2.3.6-0ubuntu20.4) ...

Setting up lvm2 (2.02.02-1ubuntu1.5) ...
Backing up any LVM2 metadata that may exist...done.

Setting up libssl0.9.8 (0.9.8a-7ubuntu0.3) ...

Setting up python2.4 (2.4.3-0ubuntu6) ...
Compiling python modules in /usr/lib/python2.4 ...
Compiling optimized python modules in /usr/lib/python2.4 ...

Setting up cpio (2.6-10ubuntu0.2) ...

Setting up gnupg (1.4.2.2-1ubuntu2.5) ...
Setting up libgnutls12 (1.2.9-2ubuntu1.1) ...

Setting up libisc11 (9.3.2-2ubuntu1.2) ...

Setting up libdns21 (9.3.2-2ubuntu1.2) ...

Setting up libisccc0 (9.3.2-2ubuntu1.2) ...

Setting up libisccfg1 (9.3.2-2ubuntu1.2) ...

Setting up libbind9-0 (9.3.2-2ubuntu1.2) ...

Setting up liblwres9 (9.3.2-2ubuntu1.2) ...

Setting up bind9-host (9.3.2-2ubuntu1.2) ...
Setting up dnsutils (9.3.2-2ubuntu1.2) ...

Setting up dselect (1.13.11ubuntu7) ...
Setting up libmagic1 (4.16-0ubuntu3.1) ...

Setting up file (4.16-0ubuntu3.1) ...
Setting up info (4.8-4ubuntu0.1) ...

Setting up libkrb53 (1.4.3-5ubuntu0.2) ...

Setting up tcpdump (3.9.4-2ubuntu0.1) ...
Setting up w3m (0.5.1-4ubuntu2.6.06) ...

Setting up mysql-common (5.0.22-0ubuntu6.06.3) ...
Setting up libmysqlclient15off (5.0.22-0ubuntu6.06.3) ...

Setting up php5-common (5.1.2-1ubuntu3.6) ...
Setting up libapache2-mod-php5 (5.1.2-1ubuntu3.6) ...
 * Forcing reload of apache 2.0 web server...                                                                                                 apache2: Could not determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
apache2: Could not determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
                                                                                                                                       [ ok ]

Setting up linux-image-2.6.15-26-server (2.6.15-26.47) ...
Not touching initrd symlinks since we are being reinstalled (2.6.15-26.46)
Not updating image symbolic links since we are being updated (2.6.15-26.46)
Searching for GRUB installation directory ... found: /boot/grub
Testing for an existing GRUB menu.list file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.15-28-server
Found kernel: /boot/vmlinuz-2.6.15-26-server
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done


Setting up linux-image-2.6.15-28-server (2.6.15-28.51) ...
Searching for GRUB installation directory ... found: /boot/grub
Testing for an existing GRUB menu.list file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.15-28-server
Found kernel: /boot/vmlinuz-2.6.15-26-server
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done


Setting up linux-image-server (2.6.15.26) ...
Setting up linux-server (2.6.15.26) ...
Setting up mysql-client-5.0 (5.0.22-0ubuntu6.06.3) ...
Setting up mysql-server-5.0 (5.0.22-0ubuntu6.06.3) ...
Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld.

Setting up mysql-server (5.0.22-0ubuntu6.06.3) ...
Setting up openssl (0.9.8a-7ubuntu0.3) ...

Setting up php5-mysql (5.1.2-1ubuntu3.6) ...

Setting up php5-mysqli (5.1.2-1ubuntu3.6) ...

fish@fishbox:~$

Eine lange Ausgabe, aber was ist genau passiert? Zuerst haben wir unsere lokale Paketdatenbank mit sudo apt-get update auf den neuesten Stand gebracht. Dieser Befehl ruft in den konfigurierten "repositories" (Softwarequellen) in der /etc/apt/sources.list die neuesten Paketlisten ab und "synchronisiert" diese mit unserer lokalen. Das System weiss also nun, welche Pakete neu vorhanden sind und was man updaten müsste. Das anschliessende sudo apt-get dist-upgrade führt genau dieses Upgrade durch. In meinem Fall mussten 102 MB an Daten runtergeladen werden und es waren wichtige Sicherheitsupdates dabei, unter anderem für den Kernel und den Apache Webserver.

Dies ist bei einer Neuinstallation normal. Es ist aber wichtig, dass dieser Schritt ausgeführt wird, da dadurch mögliche Sicherheitslücken auf dem Server behoben werden. Damit ist es aber nicht gemacht; das System sollte von nun an kontinuierlich gewartet und auf dem neuesten Stand gehalten werden. Ubuntu bietet - wie oben schon erwähnt - für die LTS 6.06 Server Edition bis am 1. Juli 2011 Sicherheitsupdates an, und diese sollte man auch regelmässig einspielen.

Achtung: Dieser Support bezieht sich nur auf die Quellen, die in der /etc/apt/sources.list standardmässig an sind, sprich: dapper main restricted (und src), dapper-updates main restricted (und src) und dapper-security main restricted (und src) - er bezieht sich ausdrücklich nicht auf die Universe und Multiverse Repositories, ebenso nicht auf Fremdquellen! Es ist also ratsam, auf dem Server wenn immer möglich auf Software aus den Standardquellen zurückzugreifen, da diese noch lange mit Sicherheitsupdates versorgt werden und es so leicht fällt, sein System auf dem neuesten Stand zu halten.

Nun können wir den Server mal neu booten:

(ich weiss, es wäre nicht nötig, aber schaden tuts auch nicht)

Code:
fish@fishbox:~$ sudo reboot
Password:

Broadcast message from root@fishbox (pts/0) (Mon Apr  2 18:29:26 2007):

The system is going down for reboot NOW!
fish@fishbox:~$ Connection to 192.168.0.175 closed by remote host.
Connection to 192.168.0.175 closed.

Natürlich verliert man so auch den Kontakt zum Server und muss sich dann neu einloggen.

Wie man sieht, sind wir nun auf folgendem, aktualisierten Kernel unterwegs:

Code:
fish@fishbox:~$ uname -srvmpio
Linux 2.6.15-28-server #1 SMP Thu Feb 1 16:58:14 UTC 2007 i686 unknown unknown GNU/Linux

Versucht man nun, den Server erneut zu upgraden, bekommt man folgende Ausgabe:

Code:
fish@fishbox:~$ sudo apt-get update
Password:
Get:1 http://ch.archive.ubuntu.com dapper Release.gpg [189B]
Get:2 http://ch.archive.ubuntu.com dapper-updates Release.gpg [191B]
Hit http://ch.archive.ubuntu.com dapper Release
Get:3 http://security.ubuntu.com dapper-security Release.gpg [191B]
Hit http://ch.archive.ubuntu.com dapper-updates Release
Hit http://security.ubuntu.com dapper-security Release
Hit http://ch.archive.ubuntu.com dapper/main Packages
Hit http://ch.archive.ubuntu.com dapper/restricted Packages
Hit http://ch.archive.ubuntu.com dapper/main Sources
Hit http://ch.archive.ubuntu.com dapper/restricted Sources
Hit http://ch.archive.ubuntu.com dapper-updates/main Packages
Hit http://ch.archive.ubuntu.com dapper-updates/restricted Packages
Hit http://ch.archive.ubuntu.com dapper-updates/main Sources
Hit http://ch.archive.ubuntu.com dapper-updates/restricted Sources
Hit http://security.ubuntu.com dapper-security/main Packages
Hit http://security.ubuntu.com dapper-security/restricted Packages
Hit http://security.ubuntu.com dapper-security/main Sources
Hit http://security.ubuntu.com dapper-security/restricted Sources
Fetched 3B in 0s (5B/s)
Reading package lists... Done
fish@fishbox:~$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Das System ist also auf dem neusten Stand und wir können uns der nächsten Aufgabe widmen!
 
05. NFS-Shares und die /etc/exports

Nun würde ich gerne einen Teil der Daten auf dem Server auch auf dem Laptop zugänglich machen. Da ich keine Windows Computer in meinem Netzwerk habe, greife ich dafür nicht auf Samba, sondern auf NFS zurück.

Was ist NFS? Network File System - Wikipedia

Dazu müssen wir erst mal die notwendigen Pakete installieren:

Code:
fish@fishbox:~$ sudo apt-get install nfs-kernel-server
Password:
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
  libevent1 libnfsidmap1 nfs-common portmap
The following NEW packages will be installed:
  libevent1 libnfsidmap1 nfs-common nfs-kernel-server portmap
0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
Need to get 270kB of archives.
After unpacking 950kB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://ch.archive.ubuntu.com dapper/main libevent1 1.1a-1 [18.0kB]
Get:2 http://ch.archive.ubuntu.com dapper/main libnfsidmap1 0.8-1 [14.8kB]
Get:3 http://ch.archive.ubuntu.com dapper/main portmap 5-16ubuntu2 [30.0kB]
Get:4 http://ch.archive.ubuntu.com dapper/main nfs-common 1:1.0.7-3ubuntu2 [94.8kB]
Get:5 http://ch.archive.ubuntu.com dapper/main nfs-kernel-server 1:1.0.7-3ubuntu2 [113kB]
Fetched 270kB in 0s (430kB/s)
Preconfiguring packages ...
Selecting previously deselected package libevent1.
(Reading database ... 18177 files and directories currently installed.)
Unpacking libevent1 (from .../libevent1_1.1a-1_i386.deb) ...
Selecting previously deselected package libnfsidmap1.
Unpacking libnfsidmap1 (from .../libnfsidmap1_0.8-1_i386.deb) ...
Selecting previously deselected package portmap.
Unpacking portmap (from .../portmap_5-16ubuntu2_i386.deb) ...
Selecting previously deselected package nfs-common.
Unpacking nfs-common (from .../nfs-common_1%3a1.0.7-3ubuntu2_i386.deb) ...
Selecting previously deselected package nfs-kernel-server.
Unpacking nfs-kernel-server (from .../nfs-kernel-server_1%3a1.0.7-3ubuntu2_i386.deb) ...
Setting up libevent1 (1.1a-1) ...

Setting up libnfsidmap1 (0.8-1) ...

Setting up portmap (5-16ubuntu2) ...
 * Starting portmap daemon...                                            [ ok ]

Setting up nfs-common (1.0.7-3ubuntu2) ...
 * Starting nfs statd...                                                 [ ok ]

Setting up nfs-kernel-server (1.0.7-3ubuntu2) ...
 * Not starting NFS kernel daemon: No exports.

Die Freigaben definiert man in der /etc/exports - wir öffnen sie:

Code:
sudo nano /etc/exports

Sie ist noch leer, das ist richtig so.

Ich würde gerne ca. 250 GB auf der Partition /media/stoked für meinen Laptop zugänglich machen. Er hat in meinem Netzwerk die feste IP 192.168.0.174, die ihm vom Router zugewiesen wird. Ich editiere die /etc/export/hosts also wie folgt:

Code:
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).

/media/stoked   192.168.0.174(rw,async)

Nun starte ich den NFS Server neu:

Code:
fish@fishbox:/media$ sudo /etc/init.d/nfs-kernel-server restart
 * Stopping rpc mountd...                                                [ ok ]
 * Stopping rpc nfsd...                                                  [ ok ]
 * Unexporting directories for NFS kernel daemon...                      [ ok ]
 * Exporting directories for NFS kernel daemon...                        [ ok ]
 * Starting rpc nfsd...                                                  [ ok ]
 * Starting rpc mountd...                                                [ ok ]

Die Dateien möchte ich auf dem Notebook gerne im Verzeichnis /media/stoked/Share sehen.

Dieses muss zuerst erstellt werden:

Code:
fish@fishbook:/$ cd /media/stoked/
fish@fishbook:/media/stoked$ mkdir Share
fish@fishbook:/media/stoked$ ls -l
total 4
drwxrwxrwx 1 root root 4096 2007-03-07 11:44 Palm TX
drwxrwxrwx 1 root root    0 2007-03-02 19:13 RECYCLER
drwxrwxrwx 1 root root    0 2007-03-20 12:08 Router Firmware
drwxrwxrwx 1 root root    0 2007-04-02 07:49 Screenshots
drwxrwxrwx 1 root root    0 2007-04-02 20:07 Share
drwxrwxrwx 1 root root    0 2007-03-03 00:50 System Volume Information
drwxrwxrwx 1 root root    0 2007-03-05 06:07 Uni

Nun "mounten" wir den Share:

Code:
fish@fishbook:/media/stoked$ sudo mount -t nfs 192.168.0.175:/media/stoked /media/stoked/Share/
Password:
fish@fishbook:/media/stoked$ cd Share/
fish@fishbook:/media/stoked/Share$ ls
complete  crap  lost+found  Possessedby

Wie man sieht, ist das Verzeichnis /media/stoked/Share nicht mehr leer, es halt also geklappt! Jetzt ist es problemlos möglich, mit z.B. dem Musikplayer Amarok auf dem Laptop Musik zu spielen, die im gemounteten Verzeichnis /media/stoked/Share und somit ja eigentlich auf dem Server liegt. Die Dateien lassen sich also nun ganz normal verwenden, als wären sie lokal auf dem Laptop vorhanden.

In der /etc/hosts.allow und der /etc/hosts.allow könnte man nun noch detailliertere Zugriffsrechte definieren, aber für ein Home-Netzwerk scheint mir das nicht nötig. Praktisch wäre es hingegen, wenn bei jedem Laptop Start automatisch dieses Verzeichnis eingebunden würde.

Dazu öffnen wir die Datei /etc/fstab:

Code:
sudo nano /etc/fstab

Momentan sieht sie hier so aus:

Code:
# /etc/fstab: static file system information.
#
#  -- This file has been automaticly generated by ntfs-config --
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>

proc /proc proc defaults 0 0
# Entry for /dev/hda2 :
UUID=927170a7-125e-4417-9be1-bf957feea772 / ext3 defaults,errors=remount-ro 0 1
# Entry for /dev/hda4 :
UUID=0D0122100384A716 /media/stoked ntfs-3g defaults,locale=en_US.UTF-8 0 1
# Entry for /dev/hda1 :
UUID=1600C51E00C505A9 /media/win ntfs-3g defaults,locale=en_US.UTF-8 0 1
# Entry for /dev/hda3 :
UUID=a6db1a6c-1bfd-42b3-8f5a-7318391b25a4 none swap sw 0 0
/dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0

Wir fügen folgende Zeile hinzu:

Code:
192.168.0.175:/media/stoked /media/stoked/Share nfs rw,rsize=8192,wsize=8192 0 0

Von nun an sollte das Verzeichnis nach dem booten immer sofort verfügbar sein - auch das wäre erledigt!
 
06. Unser Backup-Konzept

Auf dem Server befinden sich ein paar Daten, die mir besonders wichtig sind. Es handelt sich dabei vorallem um ein bestimmtes Verzeichnis. Dieses möchte ich gerne jeden Tag automatisch auf eine externe Festplatte sichern lassen. Das Backup soll jeweils nur die Dateien sichern, die neu sind oder sich verändert haben und trotzdem eine vollständige Wiederherstellung aller Daten im Verzeichnis erlauben.

Dazu verwenden wir das beliebte Backup Skript RSnapshot, welches diese Aufgabe sehr zuverlässig erledigt.

Zuerst loggen wir uns auf dem Server ein und verschaffen uns einen Überblick über die angeschlossenen Datenträger:

Code:
fish@fishbox:~$ sudo fdisk -l
Password:

Disk /dev/hdg: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hdg1               1        1300    10442218+  83  Linux
/dev/hdg2            1301        2610    10522575   83  Linux
/dev/hdg3            2611        3002     3148740   82  Linux swap / Solaris
/dev/hdg4            3003       36481   268920067+  83  Linux

Disk /dev/sda: 82.3 GB, 82348277760 bytes
255 heads, 63 sectors/track, 10011 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       10011    80413326    c  W95 FAT32 (LBA)

Wie wir sehen können, gibt es eine externe HD, die /dev/sda1 - diese werden wir als Backup-Platte verwenden.

Die /etc/fstab verrät, dass sie auch schon ins Dateisystem eingebunden wird:

Code:
sudo nano /etc/fstab

Code:
  GNU nano 1.3.10             File: /etc/fstab

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hdg1       /               ext3    defaults,errors=remount-ro 0       1
/dev/sda1       /media/backups  ext3    defaults        0       2
/dev/hdg2       /media/lab      ext3    defaults        0       2
/dev/hdg4       /media/stoked   ext3    defaults        0       2
/dev/hdg3       none            swap    sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

Warum wird sie schon eingebunden? Ganz einfach - weil ich sie bei der Server Installation schon angesteckt und dabei bei der Partitionierung auch gleich den Mountpoint /media/backups definiert hatte.

Ist auch genug Platz vorhanden?

Code:
fish@fishbox:/media$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hdg1             9.9G  730M  8.6G   8% /
varrun                506M   56K  506M   1% /var/run
varlock               506M  4.0K  506M   1% /var/lock
udev                  506M  108K  506M   1% /dev
devshm                506M     0  506M   0% /dev/shm
/dev/sda1              76G   26G   47G  35% /media/backups
/dev/hdg2             9.9G  129M  9.3G   2% /media/lab
/dev/hdg4             253G   91G  150G  38% /media/stoked

Ja, 47 GB sind noch frei. Bei den Daten, die ich in das besagte Verzeichnis schiebe, wird es ein Weilchen dauern, bis 76GB überschritten sind. Also kann ich vorerst mal bedenkenlos diese HD als Backup Medium verwenden.

Da die Original Daten sowieso noch im /media/stoked Verzeichnis sind, lösche ich die alten Backups und starte neu:

Code:
fish@fishbox:/media$ cd backups/
fish@fishbox:/media/backups$ ls
daily.0  daily.1  daily.2  daily.3  daily.4  lost+found
fish@fishbox:/media/backups$ sudo rm -R daily*
fish@fishbox:/media/backups$ ls
lost+found
fish@fishbox:/media/backups$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hdg1             9.9G  730M  8.6G   8% /
varrun                506M   56K  506M   1% /var/run
varlock               506M  4.0K  506M   1% /var/lock
udev                  506M  108K  506M   1% /dev
devshm                506M     0  506M   0% /dev/shm
/dev/sda1              76G  129M   72G   1% /media/backups
/dev/hdg2             9.9G  129M  9.3G   2% /media/lab
/dev/hdg4             253G   91G  150G  38% /media/stoked

Die Platte ist also nun fast leer, die Vorarbeiten erledigt.

Nun gucken wir, ob RSnapshot im Ubuntu Repository überhaupt angeboten wird:

Code:
fish@fishbox:/$ apt-cache policy rsnapshot
W: Unable to locate package rsnapshot

Nein - eventuell befindet es sich aber im Universe oder Multiverse Repository.

Wir fügen also die Quelle hinzu:

Code:
sudo nano /etc/apt/sources.list

Folgende vier Zeilen werden dazu auskommentiert:

Code:
deb http://ch.archive.ubuntu.com/ubuntu/ dapper universe
deb-src http://ch.archive.ubuntu.com/ubuntu/ dapper universe
deb http://ch.archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse
deb-src http://ch.archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse

Nun mit Ctrl+X Nano verlassen und die config abspeichern!

Wir aktualisieren zuerst unsere Paketliste, und checken dann, ob das Paket nun im Angebot ist:

Code:
fish@fishbox:/$ sudo apt-get update
Get:1 http://ch.archive.ubuntu.com dapper Release.gpg [189B]
Get:2 http://ch.archive.ubuntu.com dapper-updates Release.gpg [191B]
Get:3 http://ch.archive.ubuntu.com dapper-backports Release.gpg [191B]
Hit http://ch.archive.ubuntu.com dapper Release
Hit http://ch.archive.ubuntu.com dapper-updates Release
Get:4 http://security.ubuntu.com dapper-security Release.gpg [191B]
Hit http://ch.archive.ubuntu.com dapper-backports Release
Hit http://security.ubuntu.com dapper-security Release
Hit http://ch.archive.ubuntu.com dapper/main Packages
Hit http://ch.archive.ubuntu.com dapper/restricted Packages
Hit http://ch.archive.ubuntu.com dapper/main Sources
Hit http://ch.archive.ubuntu.com dapper/restricted Sources
Get:5 http://ch.archive.ubuntu.com dapper/universe Packages [2458kB]
Hit http://security.ubuntu.com dapper-security/main Packages
Hit http://security.ubuntu.com dapper-security/restricted Packages
Hit http://security.ubuntu.com dapper-security/main Sources
Hit http://security.ubuntu.com dapper-security/restricted Sources
Get:6 http://ch.archive.ubuntu.com dapper/universe Sources [975kB]
Hit http://ch.archive.ubuntu.com dapper-updates/main Packages
Hit http://ch.archive.ubuntu.com dapper-updates/restricted Packages
Hit http://ch.archive.ubuntu.com dapper-updates/main Sources
Hit http://ch.archive.ubuntu.com dapper-updates/restricted Sources
Hit http://ch.archive.ubuntu.com dapper-backports/main Packages
Hit http://ch.archive.ubuntu.com dapper-backports/restricted Packages
Hit http://ch.archive.ubuntu.com dapper-backports/universe Packages
Hit http://ch.archive.ubuntu.com dapper-backports/multiverse Packages
Hit http://ch.archive.ubuntu.com dapper-backports/main Sources
Hit http://ch.archive.ubuntu.com dapper-backports/restricted Sources
Hit http://ch.archive.ubuntu.com dapper-backports/universe Sources
Hit http://ch.archive.ubuntu.com dapper-backports/multiverse Sources
Fetched 3433kB in 13s (257kB/s)
Reading package lists... Done
fish@fishbox:/$ sudo apt-cache policy rsnapshot
rsnapshot:
  Installed: (none)
  Candidate: 1.2.1-1.1build1
  Version table:
     1.2.1-1.1build1 0
        500 http://ch.archive.ubuntu.com dapper/universe Packages

Bingo!

Angeboten wird also die Version 1.2.1. Da mir meine Daten wichtig sind, möchte ich RSnapshot gerne in der neuesten Version mit allen Bugfixes und Verbesserungen benutzen. Auf rsnapshot finden wir raus, dass zum jetzigen Zeitpunkt die 1.3.0 aktuell ist. Das Ubuntu Paket ist also nicht ganz up-to-date. Dies muss nicht heissen, dass es nicht funktionieren würde, ich bevorzuge es aber dennoch, für ein Backup-Tool die neueste, stabile Version zu verwenden.

Darum werde ich das Paket einfach selber aus den Quellen bauen. Die Bearbeitung der sources.list war aber trotzdem nicht umsonst - wir können nämlich nun mit einem einzigen Befehl alle Abhängigkeiten installieren, die für die Installation und den Betrieb des RSnapshot-Skriptes benötigt werden:

Code:
fish@fishbox:/$ sudo apt-get build-dep rsnapshot
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
  autotools-dev binutils build-essential cpp cpp-4.0 debconf-utils debhelper dpkg-dev g++ g++-4.0 gcc gcc-4.0 gettext html2text
  intltool-debian libc6-dev libstdc++6-4.0-dev linux-kernel-headers make patch po-debconf
0 upgraded, 21 newly installed, 0 to remove and 0 not upgraded.
Need to get 14.1MB of archives.
After unpacking 55.1MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
(Ausgabe gekürzt!)

Done!

Wir installieren nun auch noch checkinstall, dass wir gleich für die Erstellung eines Debian Paketes benötigen werden:

Code:
fish@fishbox:/$ sudo apt-get install checkinstall
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
  checkinstall
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 90.1kB of archives.
After unpacking 397kB of additional disk space will be used.
Get:1 http://ch.archive.ubuntu.com dapper-backports/universe checkinstall 1.6.0-2ubuntu1~dapper1 [90.1kB]
Fetched 90.1kB in 0s (293kB/s)
Selecting previously deselected package checkinstall.
(Reading database ... 20920 files and directories currently installed.)
Unpacking checkinstall (from .../checkinstall_1.6.0-2ubuntu1~dapper1_i386.deb) ...
Setting up checkinstall (1.6.0-2ubuntu1~dapper1) ...

Nun holen wie uns den Quellcode von RSnapshot vom Projekt-Server:

Code:
fish@fishbox:/$ cd /media/
fish@fishbox:/media$ ls
backups  cdrom  cdrom0  floppy  floppy0  lab  stoked
fish@fishbox:/media$ sudo mkdir sources
fish@fishbox:/media$ ls
backups  cdrom  cdrom0  floppy  floppy0  lab  sources  stoked
fish@fishbox:/media$ cd sources/
fish@fishbox:/media/sources$ sudo wget http://rsnapshot.org/downloads/rsnapshot-1.3.0.tar.gz
--21:42:15--  http://rsnapshot.org/downloads/rsnapshot-1.3.0.tar.gz
           => `rsnapshot-1.3.0.tar.gz'
Resolving rsnapshot.org... 80.68.91.47
Connecting to rsnapshot.org|80.68.91.47|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 195,862 (191K) [application/x-tar]

100%[================================================================>] 195,862      463.07K/s

21:42:15 (462.11 KB/s) - `rsnapshot-1.3.0.tar.gz' saved [195862/195862]

Das wird nun auch gleich entpackt:

Code:
fish@fishbox:/media/sources$ ls
rsnapshot-1.3.0.tar.gz
fish@fishbox:/media/sources$ sudo tar -xvzf rsnapshot-1.3.0.tar.gz
rsnapshot-1.3.0/
rsnapshot-1.3.0/rsnapshot-preamble.pl
rsnapshot-1.3.0/rsnapshot-program.pl
rsnapshot-1.3.0/rsnapshot-diff.pl
rsnapshot-1.3.0/rsnapshot.conf.default.in
rsnapshot-1.3.0/rsnapshot.1
rsnapshot-1.3.0/AUTHORS
rsnapshot-1.3.0/COPYING
rsnapshot-1.3.0/INSTALL
rsnapshot-1.3.0/README
rsnapshot-1.3.0/TODO
rsnapshot-1.3.0/NEWS
rsnapshot-1.3.0/ChangeLog
rsnapshot-1.3.0/docs/
rsnapshot-1.3.0/docs/HOWTOs/
rsnapshot-1.3.0/docs/HOWTOs/rsnapshot-HOWTO.en.html
rsnapshot-1.3.0/docs/Upgrading_from_1.1
rsnapshot-1.3.0/Makefile.am
rsnapshot-1.3.0/Makefile.in
rsnapshot-1.3.0/aclocal.m4
rsnapshot-1.3.0/configure
rsnapshot-1.3.0/configure.ac
rsnapshot-1.3.0/config.guess
rsnapshot-1.3.0/config.sub
rsnapshot-1.3.0/install-sh
rsnapshot-1.3.0/missing
rsnapshot-1.3.0/mkinstalldirs
rsnapshot-1.3.0/redhat/
rsnapshot-1.3.0/redhat/SOURCES/
rsnapshot-1.3.0/redhat/SOURCES/rsnapshot.patch
rsnapshot-1.3.0/redhat/SPECS/
rsnapshot-1.3.0/redhat/SPECS/rsnapshot.spec
rsnapshot-1.3.0/redhat/README
rsnapshot-1.3.0/utils/
rsnapshot-1.3.0/utils/rsnaptar
rsnapshot-1.3.0/utils/backup_dpkg.sh
rsnapshot-1.3.0/utils/backup_mysql.sh
rsnapshot-1.3.0/utils/backup_pgsql.sh
rsnapshot-1.3.0/utils/backup_rsnapshot_cvsroot.sh
rsnapshot-1.3.0/utils/backup_smb_share.sh
rsnapshot-1.3.0/utils/debug_moving_files.sh
rsnapshot-1.3.0/utils/make_cvs_snapshot.sh
rsnapshot-1.3.0/utils/mkmakefile.sh
rsnapshot-1.3.0/utils/random_file_verify.sh
rsnapshot-1.3.0/utils/rsnapshot_if_mounted.sh
rsnapshot-1.3.0/utils/sign_packages.sh
rsnapshot-1.3.0/utils/mysqlbackup.pl
rsnapshot-1.3.0/utils/rsnapreport.pl
rsnapshot-1.3.0/utils/README
rsnapshot-1.3.0/utils/rsnapshotdb/
rsnapshot-1.3.0/utils/rsnapshotdb/CHANGES.txt
rsnapshot-1.3.0/utils/rsnapshotdb/INSTALL.txt
rsnapshot-1.3.0/utils/rsnapshotdb/LICENSE.txt
rsnapshot-1.3.0/utils/rsnapshotdb/README.txt
rsnapshot-1.3.0/utils/rsnapshotdb/TODO.txt
rsnapshot-1.3.0/utils/rsnapshotdb/rsnapshotDB.conf.sample
rsnapshot-1.3.0/utils/rsnapshotdb/rsnapshotDB.pl
rsnapshot-1.3.0/utils/rsnapshotdb/rsnapshotDB.xsd
rsnapshot-1.3.0/t/
rsnapshot-1.3.0/t/support/
rsnapshot-1.3.0/t/support/etc/
rsnapshot-1.3.0/t/support/etc/configtest.conf.in
rsnapshot-1.3.0/t/support/etc/gnu_cp.conf.in
rsnapshot-1.3.0/t/support/etc/relative_delete_bugfix.conf.in
rsnapshot-1.3.0/t/support/etc/rsync.conf.in
rsnapshot-1.3.0/t/support/files/
rsnapshot-1.3.0/t/support/files/a/
rsnapshot-1.3.0/t/support/files/b/
rsnapshot-1.3.0/t/support/files/template/
rsnapshot-1.3.0/t/support/files/template/a/
rsnapshot-1.3.0/t/support/files/template/a/1
rsnapshot-1.3.0/t/support/files/template/a/2
rsnapshot-1.3.0/t/support/files/template/b/
rsnapshot-1.3.0/t/support/snapshots/
rsnapshot-1.3.0/t/configtest.t.in
rsnapshot-1.3.0/t/gnu_cp.t.in
rsnapshot-1.3.0/t/relative_delete_bugfix.t.in
rsnapshot-1.3.0/t/rsync.t.in
fish@fishbox:/media/sources$ ls
rsnapshot-1.3.0  rsnapshot-1.3.0.tar.gz

Wir wechseln ins neu erstellte Verzeichnis und gucken uns mal das README-File an.

Code:
fish@fishbox:/media/sources$ cd rsnapshot-1.3.0/
fish@fishbox:/media/sources/rsnapshot-1.3.0$ ls
aclocal.m4  config.guess  configure.ac  INSTALL      Makefile.in    NEWS    rsnapshot.1                rsnapshot-preamble.pl  TODO
AUTHORS     config.sub    COPYING       install-sh   missing        README  rsnapshot.conf.default.in  rsnapshot-program.pl   utils
ChangeLog   configure     docs          Makefile.am  mkinstalldirs  redhat  rsnapshot-diff.pl          t
fish@fishbox:/media/sources/rsnapshot-1.3.0$ sudo nano README
fish@fishbox:/media/sources/rsnapshot-1.3.0$ sudo nano INSTALL

Auch ein Blick in die INSTALL Datei kann nicht schaden! ;)

Jetzt geht es los mit der Installation des Paketes:

Code:
fish@fishbox:/media/sources/rsnapshot-1.3.0$ sudo ./configure --sysconfdir=/etc
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make sets $(MAKE)... (cached) yes
checking for a BSD-compatible install... /usr/bin/install -c
checking for perl... /usr/bin/perl
checking for rsync... /usr/bin/rsync
checking for cp... /bin/cp
checking for rm... /bin/rm
checking for ssh... /usr/bin/ssh
checking for logger... /usr/bin/logger
checking for du... /usr/bin/du
configure: creating ./config.status
config.status: creating Makefile
config.status: creating rsnapshot
config.status: creating rsnapshot-diff
config.status: creating rsnapshot.conf.default
config.status: creating t/support/etc/configtest.conf
config.status: creating t/support/etc/rsync.conf
config.status: creating t/support/etc/gnu_cp.conf
config.status: creating t/support/etc/relative_delete_bugfix.conf
config.status: creating t/configtest.t
config.status: creating t/rsync.t
config.status: creating t/gnu_cp.t
config.status: creating t/relative_delete_bugfix.t

Now type  "make test"    to run the regression test suite.
Then type "make install" to install the program.

After rsnapshot is installed, don't forget to copy
/etc/rsnapshot.conf.default to /etc/rsnapshot.conf

fish@fishbox:/media/sources/rsnapshot-1.3.0$ sudo checkinstall

checkinstall 1.6.0, Copyright 2002 Felipe Eduardo Sanchez Diaz Duran
           This software is released under the GNU GPL.


The package documentation directory ./doc-pak does not exist.
Should I create a default set of package docs?  [y]: y

Preparing package documentation...OK

Please write a description for the package.
End your description with an empty line or EOF.
>> Rsnapshot.1.3.0-1.fish
>>

*****************************************
**** Debian package creation selected ***
*****************************************

This package will be built according to these values:

0 -  Maintainer: [ root@fishbox ]
1 -  Summary: [ Rsnapshot.1.3.0-1.fish ]
2 -  Name:    [ rsnapshot ]
3 -  Version: [ 1.3.0 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ i386 ]
8 -  Source location: [ rsnapshot-1.3.0 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]

Enter a number to change any of them or press ENTER to continue:

Installing with make install...

========================= Installation results ===========================
/usr/bin/pod2man -c '' -n 'rsnapshot' -r '' rsnapshot > rsnapshot.1
make[1]: Entering directory `/media/sources/rsnapshot-1.3.0'
test -z "/usr/local/bin" || mkdir -p -- "/usr/local/bin"
 /usr/bin/install -c 'rsnapshot' '/usr/local/bin/rsnapshot'
/usr/bin/install: setting permissions for `/usr/local/bin/rsnapshot': No such file or directory
 /usr/bin/install -c 'rsnapshot-diff' '/usr/local/bin/rsnapshot-diff'
/usr/bin/install: setting permissions for `/usr/local/bin/rsnapshot-diff': No such file or directory
test -z "/etc" || mkdir -p -- "/etc"
 /usr/bin/install -c -m 644 'rsnapshot.conf.default' '/etc/rsnapshot.conf.default'
/usr/bin/install: setting permissions for `/etc/rsnapshot.conf.default': No such file or directory
test -z "/usr/local/man/man1" || mkdir -p -- "/usr/local/man/man1"
 /usr/bin/install -c -m 644 './rsnapshot.1' '/usr/local/man/man1/rsnapshot.1'
/usr/bin/install: setting permissions for `/usr/local/man/man1/rsnapshot.1': No such file or directory
make[1]: Leaving directory `/media/sources/rsnapshot-1.3.0'

======================== Installation successful ==========================

Copying documentation directory...
./
./AUTHORS
./COPYING
./ChangeLog
./INSTALL
./NEWS
./README
./TODO
./docs/
./docs/HOWTOs/
./docs/HOWTOs/rsnapshot-HOWTO.en.html
./docs/Upgrading_from_1.1

Copying files to the temporary directory... FAILED!

Striping ELF binaries and libraries...OK

Compressing man pages...OK

Building file list...OK

Building Debian package...OK

Installing Debian package...OK

Erasing temporary files...OK

Writing backup package...OK

Deleting temp dir...OK


**********************************************************************

 Done. The new package has been installed and saved to

 /media/sources/rsnapshot-1.3.0/rsnapshot_1.3.0-1_i386.deb

 You can remove it from your system anytime using:

      dpkg -r rsnapshot

**********************************************************************

fish@fishbox:/media/sources/rsnapshot-1.3.0$ sudo dpkg -i rsnapshot_1.3.0-1_i386.deb
(Reading database ... 20963 files and directories currently installed.)
Preparing to replace rsnapshot 1.3.0-1 (using rsnapshot_1.3.0-1_i386.deb) ...
Unpacking replacement rsnapshot ...
Setting up rsnapshot (1.3.0-1) ...

Mit obigen drei Befehlen haben wir ein Debian Paket generiert und RSnapshot auch gleich instaliert.

Jetzt kopieren wir noch die Default-Config ans richtige Ort, wie im INSTALL-File beschrieben:

Code:
fish@fishbox:/media/sources/rsnapshot-1.3.0$ sudo cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

Das Programm wird also über die /etc/rsnapshot.conf eingerichtet, wir gucken sie mal an:

Code:
sudo nano /etc/rsnapshot.conf

Folgende Zeilen werden geändert:

Code:
snapshot_root   /media/backups/  # der / am Schluss nach backups muss (!) drin sein
no_create_root  1  # Zeile einfach auskommentieren
cmd_cp          /bin/cp  # Zeile einfach auskommentieren
cmd_du          /usr/bin/du  # Zeile einfach auskommentieren
#interval       hourly  6  # Zeile kommentieren mit # am Anfang
#interval       weekly  4  # Zeile kommentieren mit # am Anfang
backup  /media/stoked/Possessedby/      localhost/  #  Zeile bei den Backup-Points hinzufügen

Ctrl+X um Nano zu verlassen - abspeichern nicht vergessen!

Ob das Config File auch okay ist und die Syntax korrekt?

Code:
fish@fishbox:/media/sources/rsnapshot-1.3.0$ rsnapshot configtest
Syntax OK

Yep! :)

Und schon schmeissen wir unser erstes Backup an:

Code:
fish@fishbox:~$ sudo rsnapshot -V daily
Password:
Setting locale to POSIX "C"
echo 6049 > /var/run/rsnapshot.pid
mkdir -m 0755 -p /media/backups/daily.0/
/usr/bin/rsync -av --delete --numeric-ids --relative --delete-excluded \
    /home /media/backups/daily.0/localhost/
building file list ... done
created directory /media/backups/daily.0/localhost
/home/
/home/fish/
/home/fish/.bash_history
/home/fish/.bash_logout
/home/fish/.bash_profile
/home/fish/.bashrc
/home/fish/.lesshst
/home/fish/.sudo_as_admin_successful
/home/fish/.ssh/
/home/fish/.ssh/authorized_keys

sent 6276 bytes  received 192 bytes  12936.00 bytes/sec
total size is 5693  speedup is 0.88
/usr/bin/rsync -av --delete --numeric-ids --relative --delete-excluded /etc \
    /media/backups/daily.0/localhost/
building file list ... done
/etc/
/etc/.pwd.lock
/etc/adduser.conf
/etc/adjtime
/etc/aliases
/etc/at.deny
/etc/bash.bashrc
/etc/bash_completion
/etc/checkinstallrc
/etc/crontab
/etc/debconf.conf
/etc/debian_version
/etc/deluser.conf
/etc/environment

etc.

Hier habe ich den Auszug mal gekürzt, weil der ist bei ca. 25 GB Backup-Daten nun wirklich sehr lange...

Nach dem ersten Durchlauf werden jeweils nur noch Dateien gesichert, die neu hinzugekommen sind oder sich verändert haben. Nun fehlt nur noch der Feinschliff - da wir das ganze automatisieren wollen, braucht es noch einen kleinen Eintrag in die /etc/crontab. Hier ein hervorragender Artikel, der die Funktionsweise von cron (und at) verständlich macht:

LinuxUser - Das Magazin für die Praxis - LinuxUser 02/2006 - Zu Befehl

Code:
sudo nano /etc/crontab

Code:
  GNU nano 1.3.10                           File: /etc/crontab

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6    * * 7   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6    1 * *   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly
#

Wir fügen eine Zeile hinzu, die neue config sieht so aus:

Code:
  GNU nano 1.3.10                           File: /etc/crontab                                                  Modified

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6    * * 7   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6    1 * *   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly
0  3    * * *   root    rsnapshot daily
#

Der Server macht nun automatisch (einmal pro Tag, immer Nachts um 3) ein Backup der oben definierten Verzeichnisse. Dieses Backup wird sich bis zu 7 Tage zurückverfolgen lassen. Es wird also z.B. möglich sein, den exakten Stand der Verzeichnisse von vor 4 Tagen wieder einzuspielen.

Dennoch verbraucht RSnapshot keinen unnötigen Platz, da es mit Hardlinks arbeitet. Die Dateien werden zwar mehrmals in den gesicherten Verzeichnissen angezeigt, sind aber in Wirklichkeit nur einmal vorhanden. Trotzdem lassen sie sich aber sehr gezielt wiederherstellen - genial einfach, einfach genial!

Während unsere erste Sicherung noch läuft, nutzen wir die Zeit und stellen noch kurz unseren Standard Editor um. Dies hat zwar überhaupt nichts mit der ganzen Backup Geschichte zu tun, aber da wir uns mittlerweile wohl an Nano gewöhnt haben, machen wir das doch auch gleich:

Code:
fish@fishbox:~$ which nano
/usr/bin/nano
fish@fishbox:~$ export EDITOR=/usr/bin/nano

Zum Abschluss dieses "Kapitels" gucken wir kurz, ob unser erstes erstelltes Backup auch wirklich vorhanden ist:

Code:
fish@fishbox:/media/backups$ ls
daily.0
fish@fishbox:/media/backups$ cd daily.0/
fish@fishbox:/media/backups/daily.0$ ls
localhost
fish@fishbox:/media/backups/daily.0$ cd localhost/
fish@fishbox:/media/backups/daily.0/localhost$ ls
etc  home  media  usr
fish@fishbox:/media/backups/daily.0/localhost$

Yep, die Verzeichnisse sind auf der Backup-Festplatte alle 1:1 dupliziert worden.

Unsere erste Sicherung ist also gelungen. Und jetzt, wo wir diese "Prozedur" hnter uns gebracht haben, können wir uns zurücklehen - unsere Backups macht Ubuntu nun vollautomatisch und wir müssen uns um nix mehr kümmern!
 
07. Alarm-/Weckfunktion

Da ich am Server ja auch eine Soundkarte und Boxen dran habe, wäre es natürlich sinnvoll, diesen auch für die Musikwiedergabe zu nutzen. Speziell will ich hier eine Weckfunktion realisieren. Da wir jetzt schon mit Cron vertraut sind, setzen wir weiter auf die /etc/crontab - neu hinzu kommt MPD in Verbindung mit NCMPC; eine Library, die es erlaubt, die Musikwiedergabe auf dem Server fernzusteuern und den dazu passenden, komfortablen Konsolen-Player.

MPD: Music Player Daemon

Los gehts, MPD und NCMPC werden gleich mal installiert:

Code:
fish@fishbox:/$ sudo apt-get update && sudo apt-get install mpd ncmpc
Password:
Get:1 http://ch.archive.ubuntu.com dapper Release.gpg [189B]
Get:2 http://ch.archive.ubuntu.com dapper-updates Release.gpg [191B]
Get:3 http://security.ubuntu.com dapper-security Release.gpg [191B]
Get:4 http://ch.archive.ubuntu.com dapper-backports Release.gpg [191B]
Hit http://ch.archive.ubuntu.com dapper Release
Hit http://ch.archive.ubuntu.com dapper-updates Release
Hit http://security.ubuntu.com dapper-security Release
Hit http://ch.archive.ubuntu.com dapper-backports Release
Hit http://ch.archive.ubuntu.com dapper/main Packages
Hit http://ch.archive.ubuntu.com dapper/restricted Packages
Hit http://ch.archive.ubuntu.com dapper/main Sources
Hit http://ch.archive.ubuntu.com dapper/restricted Sources
Hit http://ch.archive.ubuntu.com dapper/universe Packages
Hit http://ch.archive.ubuntu.com dapper/universe Sources
Hit http://ch.archive.ubuntu.com dapper-updates/main Packages
Hit http://ch.archive.ubuntu.com dapper-updates/restricted Packages
Hit http://ch.archive.ubuntu.com dapper-updates/main Sources
Hit http://ch.archive.ubuntu.com dapper-updates/restricted Sources
Hit http://security.ubuntu.com dapper-security/main Packages
Hit http://security.ubuntu.com dapper-security/restricted Packages
Hit http://security.ubuntu.com dapper-security/main Sources
Hit http://ch.archive.ubuntu.com dapper-backports/main Packages
Hit http://security.ubuntu.com dapper-security/restricted Sources
Hit http://ch.archive.ubuntu.com dapper-backports/restricted Packages
Hit http://ch.archive.ubuntu.com dapper-backports/universe Packages
Hit http://ch.archive.ubuntu.com dapper-backports/multiverse Packages
Hit http://ch.archive.ubuntu.com dapper-backports/main Sources
Hit http://ch.archive.ubuntu.com dapper-backports/restricted Sources
Hit http://ch.archive.ubuntu.com dapper-backports/universe Sources
Hit http://ch.archive.ubuntu.com dapper-backports/multiverse Sources
Fetched 4B in 2s (2B/s)
Reading package lists... Done
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
  libao2 libaudiofile0 libflac7 libglib2.0-0 libid3tag0 libmad0 libmikmod2 libmpcdec3 libogg0 libshout3 libtheora0
  libvorbis0a libvorbisenc2 libvorbisfile3
Suggested packages:
  libartsc0 libaudio2 libesd0 libesd-alsa0 icecast2
Recommended packages:
  libglib2.0-data
The following NEW packages will be installed:
  libao2 libaudiofile0 libflac7 libglib2.0-0 libid3tag0 libmad0 libmikmod2 libmpcdec3 libogg0 libshout3 libtheora0
  libvorbis0a libvorbisenc2 libvorbisfile3 mpd ncmpc
0 upgraded, 16 newly installed, 0 to remove and 0 not upgraded.
Need to get 1477kB of archives.
After unpacking 5071kB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://ch.archive.ubuntu.com dapper/main libao2 0.8.6-1.1ubuntu2 [20.9kB]
Get:2 http://ch.archive.ubuntu.com dapper/main libaudiofile0 0.2.6-6ubuntu1 [72.5kB]
Get:3 http://ch.archive.ubuntu.com dapper/main libflac7 1.1.2-3ubuntu1 [107kB]
Get:4 http://ch.archive.ubuntu.com dapper-updates/main libglib2.0-0 2.10.3-0ubuntu1 [480kB]
Get:5 http://ch.archive.ubuntu.com dapper/main libid3tag0 0.15.1b-8 [34.9kB]
Get:6 http://ch.archive.ubuntu.com dapper/main libmad0 0.15.1b-2.1 [76.9kB]
Get:7 http://ch.archive.ubuntu.com dapper/main libmikmod2 3.1.11-a-6ubuntu2 [124kB]
Get:8 http://ch.archive.ubuntu.com dapper/main libmpcdec3 1.2.2-1 [25.3kB]
Get:9 http://ch.archive.ubuntu.com dapper/main libogg0 1.1.3-0ubuntu3 [11.8kB]
Get:10 http://ch.archive.ubuntu.com dapper-backports/main libtheora0 0.0.0.alpha7-1ubuntu1~dapper1 [94.5kB]
Get:11 http://ch.archive.ubuntu.com dapper/main libvorbis0a 1.1.2-0ubuntu2 [95.4kB]
Get:12 http://ch.archive.ubuntu.com dapper/main libshout3 2.1-5 [32.6kB]
Get:13 http://ch.archive.ubuntu.com dapper/main libvorbisenc2 1.1.2-0ubuntu2 [82.5kB]
Get:14 http://ch.archive.ubuntu.com dapper/main libvorbisfile3 1.1.2-0ubuntu2 [18.6kB]
Get:15 http://ch.archive.ubuntu.com dapper-backports/universe mpd 0.12.1-1ubuntu1~dapper1 [123kB]
Get:16 http://ch.archive.ubuntu.com dapper/universe ncmpc 0.11.1+svn-r3362-1 [77.4kB]
Fetched 1477kB in 2s (561kB/s)
Selecting previously deselected package libao2.
(Reading database ... 20963 files and directories currently installed.)
Unpacking libao2 (from .../libao2_0.8.6-1.1ubuntu2_i386.deb) ...
Selecting previously deselected package libaudiofile0.
Unpacking libaudiofile0 (from .../libaudiofile0_0.2.6-6ubuntu1_i386.deb) ...
Selecting previously deselected package libflac7.
Unpacking libflac7 (from .../libflac7_1.1.2-3ubuntu1_i386.deb) ...
Selecting previously deselected package libglib2.0-0.
Unpacking libglib2.0-0 (from .../libglib2.0-0_2.10.3-0ubuntu1_i386.deb) ...
Selecting previously deselected package libid3tag0.
Unpacking libid3tag0 (from .../libid3tag0_0.15.1b-8_i386.deb) ...
Selecting previously deselected package libmad0.
Unpacking libmad0 (from .../libmad0_0.15.1b-2.1_i386.deb) ...
Selecting previously deselected package libmikmod2.
Unpacking libmikmod2 (from .../libmikmod2_3.1.11-a-6ubuntu2_i386.deb) ...
Selecting previously deselected package libmpcdec3.
Unpacking libmpcdec3 (from .../libmpcdec3_1.2.2-1_i386.deb) ...
Selecting previously deselected package libogg0.
Unpacking libogg0 (from .../libogg0_1.1.3-0ubuntu3_i386.deb) ...
Selecting previously deselected package libtheora0.
Unpacking libtheora0 (from .../libtheora0_0.0.0.alpha7-1ubuntu1~dapper1_i386.deb) ...
Selecting previously deselected package libvorbis0a.
Unpacking libvorbis0a (from .../libvorbis0a_1.1.2-0ubuntu2_i386.deb) ...
Selecting previously deselected package libshout3.
Unpacking libshout3 (from .../libshout3_2.1-5_i386.deb) ...
Selecting previously deselected package libvorbisenc2.
Unpacking libvorbisenc2 (from .../libvorbisenc2_1.1.2-0ubuntu2_i386.deb) ...
Selecting previously deselected package libvorbisfile3.
Unpacking libvorbisfile3 (from .../libvorbisfile3_1.1.2-0ubuntu2_i386.deb) ...
Selecting previously deselected package mpd.
Unpacking mpd (from .../mpd_0.12.1-1ubuntu1~dapper1_i386.deb) ...
Selecting previously deselected package ncmpc.
Unpacking ncmpc (from .../ncmpc_0.11.1+svn-r3362-1_i386.deb) ...
Setting up libao2 (0.8.6-1.1ubuntu2) ...

Setting up libaudiofile0 (0.2.6-6ubuntu1) ...

Setting up libflac7 (1.1.2-3ubuntu1) ...
Setting up libglib2.0-0 (2.10.3-0ubuntu1) ...

Setting up libid3tag0 (0.15.1b-8) ...

Setting up libmad0 (0.15.1b-2.1) ...

Setting up libmikmod2 (3.1.11-a-6ubuntu2) ...

Setting up libmpcdec3 (1.2.2-1) ...

Setting up libogg0 (1.1.3-0ubuntu3) ...

Setting up libtheora0 (0.0.0.alpha7-1ubuntu1~dapper1) ...

Setting up libvorbis0a (1.1.2-0ubuntu2) ...

Setting up libshout3 (2.1-5) ...

Setting up libvorbisenc2 (1.1.2-0ubuntu2) ...

Setting up libvorbisfile3 (1.1.2-0ubuntu2) ...

Setting up mpd (0.12.1-1ubuntu1~dapper1) ...
Stopping Music Player Daemon: not running or no pid_file set.
Starting Music Player Daemon: creating /var/lib/mpd/tag_cache... mpd.

Setting up ncmpc (0.11.1+svn-r3362-1)

Drauf!

Da ich gerade selbst nicht mehr sicher bin, wo ich MPD genau konfigurieren muss, ein Blick in die manpage:

Code:
fish@fishbox:/$ man mpd
Reformatting mpd(1), please wait...

Aha, wer hätte das gedacht? /etc/mpd.conf ;)

Okay, gucken wir uns doch gleich mal an:

Code:
sudo nano /etc/mpd.conf

Wie ihr merkt, sind config Files oft sehr gut dokumentiert - Angst vor ihnen ist meist nicht begründet. Oft ist man damit sogar schneller am Ziel als mit einer grafischen Benutzeroberfläche.

Anyway, off-topic Gelaber raus, folgende Änderung in das Config-File rein:

Code:
music_directory         "/media/stoked/Possessedby/Audio"  #  bzw. einfach euer Audio-Verzeichnis

Das wars auch schon!

Nun lesen wir unsere Musik in eine Datenbank ein. Auch hier habe ich den Befehl vergessen, also gucken wir nach:

Code:
fish@fishbox:/$ mpd --help
usage:
   mpd [options] <conf file>
   mpd [options]   (searches for ~/.mpdconf then /etc/mpd.conf)

options:
   --help             this usage statement
   --kill             kill the currently running mpd session
   --create-db        force (re)creation of database and exit
   --no-create-db     don't create database, even if it doesn't exist
   --no-daemon        don't detach from console
   --stdout           print messages to stdout and stderr
   --verbose          verbose logging
   --version          prints version information

Aha...

Code:
sudo mpd --create-db

Die Ausgabe schenk ich euch! Auf jeden Fall sollten nun eure Musikdateien im Schnellzugstempo auf der Konsole an euch vorbeirasen. Die Datenbank wird also eingelesen, das geht bei nur ca. 250 Alben auch angenehm schnell.

Bevor wir Musik hören können, müssen wir MPD neu starten:

Code:
fish@fishbox:/$ sudo /etc/init.d/mpd restart
Stopping Music Player Daemon: mpd.
Starting Music Player Daemon: mpd.

Jetzt öffnen wir mit dem Befehl ncmpc eines der vielen Frontends für MPD.

Die Steuerung ist wirklich einfach:

1 - Hilfe
2 - Playlist
3 - Dateibrowser
4 - Tagbrowser
5 - In DB suchen
6 - Uhr (für was auch immer die gut sein soll)

Hat man Probleme, guckt man einfach in der Hilfe mit [1] kurz nach, wie die restlichen Tastenbelegungen lauten.

Mit Space wählen wir ein Nirvana Album und schon dröhnt Cobain aus den Boxen! :D

Morgen soll er mich um 7 Uhr morgens aufwecken, und genau bis 8 Uhr soll Musik laufen.

Dazu brauchen wir noch mpc, ganz vergessen:

Code:
fish@fishbox:~$ sudo apt-get install mpc
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
  mpc
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 28.9kB of archives.
After unpacking 139kB of additional disk space will be used.
Get:1 http://ch.archive.ubuntu.com dapper/universe mpc 0.11.2-1 [28.9kB]
Fetched 28.9kB in 0s (135kB/s)
Selecting previously deselected package mpc.
(Reading database ... 21129 files and directories currently installed.)
Unpacking mpc (from .../archives/mpc_0.11.2-1_i386.deb) ...
Setting up mpc (0.11.2-1) ...

Jetzt setzen wir einfach 2 crontabs auf:

Code:
sudo nano /etc/crontab

Code:
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

#  m  h dom mon dow user        command
17 *    * * *          root    run-parts --report /etc/cron.hourly
25 6    * * *          root     test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6    * * 7          root     test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6    1 * *          root     test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly
0  3    * * *          root    rsnapshot daily
0  7    * * mon-fri    root    mpc play
0  8    * * mon-fri    root    mpc pause
#

Wie man sehen kann, führe ich den Befehl nur von Montag-Freitag aus, am Wochenende wird ausgeschlafen!

Alles, was wir also tun müssen, ist vor dem ins Bett gehen uns kurz auf dem Server einloggen, mit ncmpc ein paar Tracks der Playlist hinzufügen und Ubuntu macht dann den Rest. Wollen wir uns mal nicht oder später/früher wecken lassen, kommentieren wir die beiden Zeilen in der /etc/crontab einfach aus oder editieren sie entsprechend um.

Das ganze könnte man vielleicht eleganter lösen, aber so hat es für mich immer problemlos funktioniert... :)
 
08. Last.FM für MPD

Da ich in der Last.fm Community aktiv bin, würde ich auch gerne MPD zum scrobblen bringen!

Dazu brauche ich mpdscribble:

(auf scmpc - An Audioscrobbler client for MPD gäbe es eine Alternative)

Code:
fish@fishbox:~$ sudo apt-get install mpdscribble
Password:
Sorry, try again.
Password:
Reading package lists... Done
Building dependency tree... Done
The following extra packages will be installed:
  libgnutls11 libsoup2.2-8
Suggested packages:
  gnutls-bin
The following NEW packages will be installed:
  libgnutls11 libsoup2.2-8 mpdscribble
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 436kB of archives.
After unpacking 1126kB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://ch.archive.ubuntu.com dapper/universe libgnutls11 1.0.16-14ubuntu1 [287kB]
Get:2 http://security.ubuntu.com dapper-security/main libsoup2.2-8 2.2.93-0ubuntu1.1 [116kB]
Get:3 http://ch.archive.ubuntu.com dapper/universe mpdscribble 0.2.7-2 [32.3kB]
Fetched 436kB in 0s (495kB/s)
Preconfiguring packages ...
Selecting previously deselected package libgnutls11.
(Reading database ... 21142 files and directories currently installed.)
Unpacking libgnutls11 (from .../libgnutls11_1.0.16-14ubuntu1_i386.deb) ...
Selecting previously deselected package libsoup2.2-8.
Unpacking libsoup2.2-8 (from .../libsoup2.2-8_2.2.93-0ubuntu1.1_i386.deb) ...
Selecting previously deselected package mpdscribble.
Unpacking mpdscribble (from .../mpdscribble_0.2.7-2_i386.deb) ...
Setting up libgnutls11 (1.0.16-14ubuntu1) ...

Setting up libsoup2.2-8 (2.2.93-0ubuntu1.1) ...

Setting up mpdscribble (0.2.7-2) ...
adduser: Warning: that home directory does not belong to the user you are currently creating
Musicscribble system service not installed

Die Warnung kann man ignorieren.

Jetzt öffnen wir die config, wie immer ist sie in /etc:

Code:
sudo nano /etc/mpdscribble.conf

Code:
  GNU nano 1.3.10                      File: /etc/mpdscribble.conf

# please note that username and password are handled by debconf if you chosen to run mpdscribble systemwide
username = your_user_name
password = md5_of_your_password
log = /var/log/mpdscribble.log
cache = /var/cache/mpdscribble/cache

Wir brauchen also die MD5 Summe unseres Passworts:

Code:
fish@fishbox:/$ echo -n deinpasswort | md5sum
af9063199baf3a1cffc4a185dc18daae  -

Jetzt müssen wir nur noch die config ändern:

Code:
# please note that username and password are handled by debconf if you chosen to run mpdscribble systemwide
username = deinbenutzername
password = af9063199baf3a1cffc4a185dc18daae
log = /var/log/mpdscribble.log
cache = /var/cache/mpdscribble/cache

Nun noch mpdscribble anschmeissen:

Code:
fish@fishbox:/$ sudo mpdscribble &
[1] 6961

Fertig! :)
 
09. Erläuterung der /etc/fstab

In diesem Kapitel gehe ich grob auf die Konfigurationsdatei /etc/fstab ein. Sie enthält eine Liste aller Dateisysteme, die beim Systemstart eingebunden werden sollen. Ich versuche, sie im Zusammenhang mit der Ausgabe von fdisk ein wenig genauer zu erläutern. Am System selbst wird nichts verändert, das Kapitel dient rein dem Verständnis dieser Konfigurationsdatei. Sie ist für ein Unix/Linux System zentral und es ist sinnvoll, sie sich mal näher anzuschauen.

Zuerst zwei Begriffserklärungen - was heisst mounten?

Mounten oder Einhängen bezeichnet bei einem Computer den Vorgang, ein Dateisystem dem Betriebssystem an einer bestimmten Stelle (Mount point) verfügbar zu machen, so dass der Benutzer auf die Dateien zugreifen kann.

Quelle und mehr Infos: Mounten - Wikipedia

Und was genau ist die fstab?

Unter unixartigen Betriebssystemen existiert eine Datei /etc/fstab, die eine Liste aller zu mountenden Dateisysteme enthält. Die verwendbaren Optionen unterscheiden sich oft je nach Plattform, Dateisystem und Alter des Betriebssystems.

Quelle und mehr Infos: Fstab - Wikipedia

Die fstab unseres Testservers habe ich ja weiter oben schon mal gezeigt, hier ist sie nochmals:

Code:
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hdg1       /               ext3    defaults,errors=remount-ro 0       1
/dev/sda1       /media/backups  ext3    defaults        0       2
/dev/hdg2       /media/lab      ext3    defaults        0       2
/dev/hdg4       /media/stoked   ext3    defaults        0       2
/dev/hdg3       none            swap    sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

Um mein Vorhaben zu veranschaulichen, kommentiere ich /dev/sda1 aus:

Code:
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hdg1       /               ext3    defaults,errors=remount-ro 0       1
# /dev/sda1       /media/backups  ext3    defaults        0       2
/dev/hdg2       /media/lab      ext3    defaults        0       2
/dev/hdg4       /media/stoked   ext3    defaults        0       2
/dev/hdg3       none            swap    sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

Die angehängte USB-Platte lasse ich also nicht mehr automatisch einbinden.

Nun hänge ich eine zweite (ntfs formatierte) USB-Platte an, es sieht jetzt wie folgt aus:

Code:
fish@fishbox:/media$ sudo fdisk -l

Disk /dev/hdg: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hdg1               1        1300    10442218+  83  Linux
/dev/hdg2            1301        2610    10522575   83  Linux
/dev/hdg3            2611        3002     3148740   82  Linux swap / Solaris
/dev/hdg4            3003       36481   268920067+  83  Linux

Disk /dev/sda: 82.3 GB, 82348277760 bytes
255 heads, 63 sectors/track, 10011 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       10011    80413326    c  W95 FAT32 (LBA)

Disk /dev/sdc: 60.0 GB, 60060155904 bytes
255 heads, 63 sectors/track, 7301 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1        7301    58645251    7  HPFS/NTFS

Was bedeutet diese Ausgabe? Ich erläutere Schritt für Schritt:

Code:
Disk /dev/hdg: 300.0 GB, 300069052416 bytes
255 heads, 63 sectors/track, 36481 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hdg1               1        1300    10442218+  83  Linux
/dev/hdg2            1301        2610    10522575   83  Linux
/dev/hdg3            2611        3002     3148740   82  Linux swap / Solaris
/dev/hdg4            3003       36481   268920067+  83  Linux

Dies ist meine (interne) Hauptplatte mit 4 Partitionen und 300 GB Speicherplatz.

Die entsprechenden Einträge dazu aus der /etc/fstab sind:

Code:
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/hdg1       /               ext3    defaults,errors=remount-ro 0       1
/dev/hdg2       /media/lab      ext3    defaults        0       2
/dev/hdg4       /media/stoked   ext3    defaults        0       2
/dev/hdg3       none            swap    sw              0       0

Dateipartitionen sind also hdg1 (Root-Filesystem), hdg2 ("Notfallpartition") und hdg4 als Datenpartition für Musik, Fotos, etc. Sie sind alle ext3-formatiert. Die hdg3 ist eine SWAP Partition - das "none" verrät, dass sie nicht wie die anderen Partitionen ins Dateisystem gemountet werden muss.

Die erste Spalte der fstab enthält demzufolge den Datenträger, die zweite den Mountpoint, die dritte das Filesystem.

Was bedeutet der Rest, <options>, <dump>, <pass> und die komischen Zahlen am Ende?

In der <options> Zeile kann man, wie der Name verrät, Optionen zum mounten der Datenträger angeben.

Unter Linux verbreitet ist die Option defaults, die den Optionen rw,suid,dev,exec,auto,nouser,async entspricht.

Quelle: Fstab - Wikipedia

Mögliche Optionen und die Bedeutung der obigen Werte erläutert zum Beispiel das Gentoo-Wiki:

  • defaults - verwendet die Default-Optionen, welche sind: rw, suid, dev, exec, auto, nouser und async.
  • dev - Gerätedateien auf dem Dateisystem werden interpretiert
  • exec - das Ausführen von Dateien wird erlaubt
  • gid - group ids setzen, z.B. gid=users
  • noauto - der Datenträger wird nicht automatisch eingebunden
  • nodev - Gerätedateien auf dem Dateisystem werden nicht interpretiert
  • noexec - das Ausführen von Dateien wird verboten
  • nosuid - das SUID-Bit wird ignoriert
  • nouser - nur der root kann das Gerät mounten und unmounten.
  • ro - read only, erlaubt nur lesenden Zugriff
  • rw - read & write, erlaubt vollen Lese- und Schreibzugriff
  • sw - Swap
  • suid - suid und sgid bits werden interpretiert
  • sync - nach jedem Schreibvorgang wird geflusht, also der Bufferinhalt sofort auf den Datenträger geschrieben. Das ist z.B. bei USB Memory Sticks sehr hilfreich, weil man sie dann nicht unbedingt unmounten muß (bei Automountsystemen).
  • async - es wird nicht immer direkt auf die Platte geschrieben, sondern es kann auch erst verspätet geschrieben werden. Das ist effizienter wenn z.B. mehrere Dateien gleichzeitig geschrieben werden sollen, kann aber eben bei CD's oder USB Sticks zu Datenverlust führen wenn nicht unmounted wird.
  • umask - Standardrechte für neue Dateien setzen, z.B. umask=0002
  • user - jeder Benutzer darf das Gerät mounten (hilfreich bei Wechseldatenträgen wie CD, DVD, etc.). Unmounten darf dann nur der Benutzer, der das Gerät gemountet hat.
  • users - jeder Benutzer darf das Gerät mounten. Unmounten dürfen ebenfalls alle.
  • noatime - NO-Access-TIME, keine Zugriffszeiten in der Inodetabelle speichern. Wer keine Zugriffszeiten wissen möchte, kann mit dieser Option Festplattenaktivitäten reduzieren, da nicht jedesmal bei einen Dateizugriff die Inodetabelle aktualisiert werden muss.

Quelle: Fstab - Gentoo Linux Wiki

Der Ubuntuusers-Wiki verrät uns die Bedeutung von <dump> und <pass>:

Am Ende der fstab-Zeile stehen zwei Zahlen. Die zweite Zahl gibt an, ob und in welcher Reihenfolge das Dateisystem beim Systemstart in die regelmäßigen Fehlerüberprüfungen einbezogen werden soll. Meist ist hier für die Root-Partition (die Wurzel des Dateisystems, "/") 1 eingetragen, für alle anderen Partitionen 2 (danach prüfen) oder 0 (keine Überprüfung).

Quelle: Datenträger - ubuntuusers Wiki

Wikipedia dazu:

  • Dump: Falls das Backup-Programm dump dieses Dateisystem sichern soll, steht hier ein Wert ungleich 0.
  • Pass (Durchgang Nr.): Das Wurzeldateisystem hat hier eine 1, im Regelfall alle sonstigen auf Festplatten befindlichen Dateisysteme eine 2, alles andere (Pseudodateisysteme, Netzdateisysteme, nicht automatisch gemountete Dateisysteme) eine 0.

Quelle: Fstab - Wikipedia

Die Bedeutung der hdg Einträge in der fstab sollten also nun klar sein.

Fragt sich nur noch, für was die restlichen Zeilen gut sind:

Code:
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

Hier ist hdc ein CD-ROM, fd0 ein Diskettenlaufwerk. Beide werden mit der Option "noauto" eingebunden und deswegen beim Systemstart auch nicht automatisch gemountet, was so ja auch Sinn macht.

Aber für was der proc Eintrag? Bei proc handelt es sich um ein sogenanntes virtuelles Dateisystem:

Das open-read-Modell (zwei Systemaufrufe) lässt sich auch auf Geräte und Objekte anwenden, die normalerweise nicht über Dateisysteme angesprochen werden. Dadurch wird der Zugriff auf diese Objekte identisch mit dem Zugriff auf normale Dateien, was meist Vorteile bringt. Unter den derzeitigen Linux-Kernels (u. a. Version 2.6) lassen sich System- und Prozessinformation über das virtuelle proc-Dateisystem abfragen und ändern. Die virtuelle Datei /proc/cpuinfo liefert zum Beispiel Informationen über den Prozessor.

Solche Pseudo-Dateisysteme wie proc gibt es unter Linux einige: Dazu zählen sysfs, usbfs oder devpts; unter einigen BSDs gibt es ein kernfs. Nicht zuletzt devfs (zuweilen auch tmpfs) für Gerätedateien. All diese Dateisysteme enthalten nur rein virtuell vorhandene Dateien mit Informationen oder Geräten, die auf eine „Datei“ abgebildet werden. Der Kernel gaukelt hier quasi die Existenz einer Datei vor, wie sie auch auf einem Massenspeicher vorhanden sein könnte.

Quelle: Dateisystem - Wikipedia

Bleiben noch folgende zwei Zeilen der fdisk Ausgabe übrig:

Code:
Disk /dev/sda: 82.3 GB, 82348277760 bytes
255 heads, 63 sectors/track, 10011 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       10011    80413326    c  W95 FAT32 (LBA)

Disk /dev/sdc: 60.0 GB, 60060155904 bytes
255 heads, 63 sectors/track, 7301 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1        7301    58645251    7  HPFS/NTFS

Es handelt sich dabei, wie schon erwähnt, um zwei externe USB-Festplatten:

- sdc1, 60GB, ntfs-formatierte
- sda1, 80GB, ext3-formatiert

(wieso fdisk die 80GB Platte als FAT32 ausgibt, weiss ich auch nicht - sie ist ext3 formatiert...)

Sie sind momentan nicht in der fstab und werden darum auch nicht ins Dateisystem eingebunden.

Damit wäre die fstab erstmal grob erläutert und es sind dadurch hoffentlich einige Dinge etwas verständlicher geworden!
 
Last edited by a moderator:
10. Externe USB-Festplatten, EXT3 und NTFS

Bei USB-Festplatten kann es folgendes Problem geben: Wenn man sie automatisch mounten lässt, werden sie nicht immer am gleichen Ort eingebunden, da man ja nicht immer gleich viele USB-Devices angesteckt hat und diese auch nicht immer am gleichen USB-Eingang anschliesst. Wie man das umgeht und auch gleich noch NTFS Platten schreibbar macht, ist Gegenstand dieses Kapitels. Für das bessere Verständnis der Ausführungen ist es empfehlenswert, vorher Teil 9 dieser Anleitung zu lesen - auf die Bedeutung der fstab und die Ausgabe von fdisk wird nicht mehr näher eingegangen.

Für unsere beiden USB-Platten wollen wir also nun Einträge in die fstab machen, und zwar so, dass sie mit nur einem Befehl immer ans gleiche Ort gemountet werden. Dabei soll es egal sein, an welchem USB-Port wir sie genau anstecken und wieviele USB-Devices wir am Server dran haben - der Mountpoint soll immer derselbe bleiben!

Unsere Ausgangslage:

Code:
fish@fishbox:/media$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hdg1       /               ext3    defaults,errors=remount-ro 0       1
/dev/hdg2       /media/lab      ext3    defaults        0       2
/dev/hdg4       /media/stoked   ext3    defaults        0       2
/dev/hdg3       none            swap    sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

Code:
fish@fishbox:/media$ fdisk -l

Disk /dev/sda: 82.3 GB, 82348277760 bytes
255 heads, 63 sectors/track, 10011 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       10011    80413326    c  W95 FAT32 (LBA)

Disk /dev/sdc: 60.0 GB, 60060155904 bytes
255 heads, 63 sectors/track, 7301 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1        7301    58645251    7  HPFS/NTFS

2 externe HDs, keine davon ist in der fstab eingetragen.

Die nachfolgenden Schritte stützen sich zum Grossteil auf folgende 4 Anleitungen ab:

- HOWTO: Labels im ubuntuusers.de Wiki
- HOWTO: Externe Laufwerke statisch einbinden im ubuntuusers.de Wiki
- HOWTO: NTFS with read and write support using ntfs-3g auf flomertens.free.fr
- HOWTO: NTFS with read/write support using the ntfs-3g (easy & safe method) auf ubuntuforums.org

Danke an obige How-To Ersteller, hier habt mir die Arbeit enorm erleichtert!

Falls das Paket bei euch noch nicht installiert ist, bitte jetzt nachholen:

Code:
sudo apt-get install libblkid1

Ich werde von nun an die Outputs der Paketinstallationen nicht mehr vollständig hier wiedergeben, ihr seht es ja auf der Konsole auch selbst. Bei Problemen mit apt empfiehlt sich ein Blick in die Manpage oder das Debian-Handbuch:

Code:
man apt
man apt-cache
man apt-get

Debian GNU/Linux Anwenderhandbuch: 5.10 APT und Verwandte

Erstmal beschäftigen wir uns mit der ext3-formatierten Platte, dann mit der ntfs Disk.

Die ext3 Platte ist in unserem Fall, wie man oben sehen kann, die /dev/sda1.

Am Anfang müssen wir herausfinden, ob für diese HD schon ein sogenanntes "Label" gesetzt ist.

Ein Label ist eine Name für eine Festplatte, womit sie eindeutig identifizierbar wird.

Code:
fish@fishbox:/media$ blkid
/dev/sda1: UUID="34656603-7cb5-49f7-b01f-e4680dc0da15" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdc1: TYPE="ntfs"

Da hier eine Ausgabe wie LABEL="XYZ" fehlt, besitzen beide Festplatten noch kein Label.

Der nächste Schritt benötigt das Paket "e2fsprogs" - es sollte schon installiert sein, falls nicht:

Code:
sudo apt-get install e2fsprogs

Jetzt setzen wir ein Label für die Ext3 Platte:

Code:
fish@fishbox:/media$ sudo e2label /dev/sda1 backups
fish@fishbox:/media$ blkid
/dev/sda1: LABEL="backups" UUID="34656603-7cb5-49f7-b01f-e4680dc0da15" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdc1: TYPE="ntfs"

Wie man sehen kann, ist für die Festplatte nun ein Label eingetragen.

Tipp: Wenn das Dateisystem eurer Platte nicht ext3 ist, findet ihr hier Hilfe!

Nun könnten wir die HD eigentlich wie folgt in der /etc/fstab eintragen:

Code:
LABEL=backups       /media/backups  ext3  rw,user,noauto    0       0

Der Einhängepunkt /media/backups muss dabei schon existieren - gegebenfalls erst mit dem Befehl mkdir erstellen!

Ubuntuusers.de merkt aber an:

Die Einbindung per UUID ist sicherer als mit bloßen Labels, da die ID meistens eindeutig ist. Bei Labels kann das nicht zwingend garantiert werden.

Quelle: Externe Laufwerke statisch einbinden - ubuntuusers Wiki

Wir prüfen also nochmals die UUID mit blkid:

Code:
fish@fishbox:/media$ blkid
/dev/sda1: LABEL="backups" UUID="34656603-7cb5-49f7-b01f-e4680dc0da15" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdc1: TYPE="ntfs"

Der Befehl mit Rootrechten verrät uns auch noch mehr über die anderen Partitionen:

Code:
fish@fishbox:/media$ sudo blkid
/dev/hdg1: UUID="791cdb70-d3eb-48b6-bcd3-9e9f7ee71bd4" SEC_TYPE="ext2" TYPE="ext3"
/dev/hdg2: UUID="5ea7e7a1-7a48-48e1-a9b0-8b751b359ea3" SEC_TYPE="ext2" TYPE="ext3"
/dev/hdg3: TYPE="swap"
/dev/hdg4: UUID="2595b3ab-88f7-4adf-9f30-121b1d3daf1b" SEC_TYPE="ext2" TYPE="ext3"
/dev/sda1: LABEL="backups" UUID="34656603-7cb5-49f7-b01f-e4680dc0da15" SEC_TYPE="ext2" TYPE="ext3"
/dev/evms/hdg1: UUID="791cdb70-d3eb-48b6-bcd3-9e9f7ee71bd4" SEC_TYPE="ext2" TYPE="ext3"
/dev/evms/hdg2: UUID="5ea7e7a1-7a48-48e1-a9b0-8b751b359ea3" SEC_TYPE="ext2" TYPE="ext3"
/dev/evms/hdg3: TYPE="swap"
/dev/evms/hdg4: UUID="2595b3ab-88f7-4adf-9f30-121b1d3daf1b" SEC_TYPE="ext2" TYPE="ext3"
/dev/evms/sda1: LABEL="backups" UUID="34656603-7cb5-49f7-b01f-e4680dc0da15" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdc1: TYPE="ntfs"

Nun machen wir für unsere ext3-Festplatte folgenden /etc/fstab Eintrag:

Code:
sudo nano /etc/fstab

Code:
UUID=34656603-7cb5-49f7-b01f-e4680dc0da15 /media/backups ext3 rw,user,noauto 0 0

Anmerkung - noch besser liesse sich das ganze mit udev-Regeln lösen. Da die obige Lösung aber für meine Bedürfnisse ausreicht, verweise ich hier ein weiteres Mal auf ubuntuusers.de:

HOWTO: Udev im ubuntuusers.de Wiki

Wir werden allerdings udev weiter unten für unsere ntfs-disk noch verwenden, da sie uns keine UUID anzeigt.

Was hat das ganze nun gebracht? Hier die Antwort:

Code:
fish@fishbox:~$ cd /media/backups/
fish@fishbox:/media/backups$ ls
fish@fishbox:/media/backups$ cd /
fish@fishbox:/$ sudo mount /media/backups/
fish@fishbox:/$ cd /media/backups/
fish@fishbox:/media/backups$ ls
daily.0

Wie man oben sehen kann, war das Verzeichnis /media/backups zuerst leer und die Festplatte also nicht gemountet. Sie lässt sich nun aber bequem mit dem Befehl sudo mount /media/backups einbinden - im zweiten Versuch spuckt ls den Inhalt unserer Backup-HD aus, sie wurde also korrekt nach /media/backups gemountet.

Die Sache mit der ext3-Platte wäre also erledigt, bleibt noch unsere ntfs-formierte HD.

NTFS war unter Linux lange ein Sorgenkind. Da es sich dabei um ein proprietäres Dateisystem von Microsoft handelt, war es auf Linux erst nur mit Leserechten wirklich nutzbar. Dies hat sich aber nun mit dem neuen ntfs-3g Treiber geändert. Er erschien vor kurzem in der Version 1.0 ist erlaubt sowohl das Lesen auch als Schreiben auf NTFS Partitionen:

Nach einem Release-Kandidaten hat der Autor der NTFS-Implementierung für Linux seinen Treiber in einer stabilen Version herausgegeben. Nach Angaben von Szakacsits Szabolcs wurde der Treiber exzessiv getestet und für stabil befunden. Kritische Fehler oder Unstimmigkeiten sind ihm nicht bekannt. Damit hat Szabolcs nicht wie ursprünglich angedacht innerhalb einen Jahres, sondern sieben Monate nach der ersten Beta-Version einen funktionsfähigen Treiber für das NTFS-Dateiformat erstellt.

Der Treiber baut auf dem Linux-NTFS-Projekt auf und verwendet FUSE zur Implementation des Dateisystems im Userspace. ntfs-3g unterstützt sowohl Schreib- als auch Lesezugriffe auf NTFS-Partitionen und unterstützt nach Angaben des Autors »die meisten POSIX-Dateisystem Operationen«. Lediglich das Setzen von Zugriffsrechten ist limitiert, was aber an NTFS und nicht am Treiber liegt.

Quelle: Pro-Linux News: ntfs-3g 1.0 freigegeben

Da ich mit dem ntfs-3g Treiber gute Erfahrungen gemacht habe, werde ich ihn hier einsetzen.

Aber wieso überhaupt NTFS? Der Hintergedanke ist natürlich die Möglichkeit, diese USB-Festplatte auch auf Windows schreib- und lesbar zu machen. Ein Datenaustausch zwischen Linux und Windows Systemen wird so problemlos möglich sein. Alternativ könnte man dabei auf FAT32 setzen, welches aber doch einige Limitierungen aufweist und heute nicht mehr als modernes und sicheres Dateisystem angesehen werden kann. Darum setzen wir hier auf NTFS.

Einige Linuxer bevorzugen es, EXT2/3 zu verwenden und auf Windows auf die freien EXT2/3 Treiber zurückzugreifen.

Die Wahl ist dabei euch überlassen, ich werde hier aber nur auf die NTFS-Variante eingehen.

Da in Ubuntu Dapper 6.06 LTS der ntfs-3g Treiber noch nicht enthalten war, helfen wir nach:

Code:
sudo nano /etc/apt/sources.list

Hier fügen wir folgende Fremdquellen für die ntfs Pakete ein:

Code:
deb http://flomertens.free.fr/ubuntu/ dapper main main-all
deb http://ntfs-3g.sitesweetsite.info/ubuntu/ dapper main main-all
deb http://flomertens.keo.in/ubuntu/ dapper main main-all

Nun fügen wir den key für die Authentifizierung dieser neuen Quellen hinzu:

Code:
fish@fishbox:~$ wget http://flomertens.keo.in/ubuntu/givre_key.asc -O- | sudo apt-key add -
--22:07:39--  http://flomertens.keo.in/ubuntu/givre_key.asc
           => `-'
Resolving flomertens.keo.in... 87.106.24.197
Connecting to flomertens.keo.in|87.106.24.197|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,690 (1.7K) [text/plain]

100%[=======================================>] 1,690         --.--K/s

22:07:39 (26.86 MB/s) - `-' saved [1690/1690]

OK

Jetzt aktualisieren wir unsere Paketliste...

Code:
sudo apt-get update

...und upgraden das System:

Code:
sudo apt-get upgrade

Das apt-get upgrade ist hier wichtig (!) sonst wird es beim nächsten Kommando Fehlermeldungen schneien! ;)

Die Ausgabe schenk ich euch.

Wir installieren den Treiber:

Code:
sudo apt-get install ntfs-3g

Abhängigkeitsprüfung bejahen!

Die HD wollen wir noch /media/ntfs mounten, das Verzeichnis müssen wir aber zuerst erstellen:

Code:
fish@fishbox:/$ cd /media/
fish@fishbox:/media$ sudo mkdir ntfs
fish@fishbox:/media$ ls
backups  cdrom  cdrom0  floppy  floppy0  lab  ntfs  sources  stoked

Bei der Gelegenheit ändern wir auch noch gleich den Besitzer von /media/backups und /media/ntfs:

Code:
fish@fishbox:/media$ sudo chown -R fish:fish ntfs/
fish@fishbox:/media$ sudo chown -R fish:fish backups/

Was ist chown?

Chown setzt oder verändert den Besitzer (oder Gruppenzugehörigkeit) von Dateien und Verzeichnissen. Wenn nur der Benutzername oder die UID angegeben wird, wird dieser Benutzer der Besitzer der gegeben Dateien. Wenn der Benutzername gefolgt von einem Punkt oder Doppelpunkt und einem Gruppennamen (oder GID) ohne Leerzeichen dazwischen eingegeben wird, wird auch die Gruppenzugehörigkeit der gegebenen Dateien geändert. Wenn nach dem Benutzernamen ein Doppelpunkt oder Punkt steht und kein Gruppenname angegeben wird, wird der Benutzer Besitzer der Dateien und die Gruppe der Dateien wird zu seiner Login-Gruppe gändert. Wird der Benutzername vor dem Punkt oder Doppelpunkt weggelassen, wird nur die Gruppe der Dateien geändert. Alternativ kann man auch chgrp verwenden.

Nur root oder der Benutzer selbst können die Dateirechte ändern.

Quelle: Das Programm chown

Zur Erinnerung, hier nochmals unsere NTFS Partition:

Code:
fish@fishbox:~$ sudo fdisk -l | grep NTFS
/dev/sda1               1        7301    58645251    7  HPFS/NTFS

Next, die fstab öffnen.

Zur Abwechslung machen wir das mal in MC, den wir in Kapitel 6 installiert haben:

Code:
sudo mc

Wie navigieren nach /etc/fstab und drücken F4 und fügen folgende Zeile an:

Code:
/dev/sda1       /media/ntfs     ntfs-3g  rw,user,noauto,locale=en_US.utf8   0    0

F10, abspeichern, nochmals F10, MC verlassen.

Komplizierter oder einfacher als Nano?

Ich bevorzuge Nano, ihr entscheidet selbst! ;)

Wir prüfen die veränderte fstab:

Code:
fish@fishbox:/media$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hdg1       /               ext3    defaults,errors=remount-ro 0       1
/dev/hdg2       /media/lab      ext3    defaults        0       2
/dev/hdg4       /media/stoked   ext3    defaults        0       2
/dev/hdg3       none            swap    sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0
UUID=34656603-7cb5-49f7-b01f-e4680dc0da15 /media/backups ext3 rw,user,noauto 0 0
/dev/sda1       /media/ntfs     ntfs-3g  rw,user,noauto,locale=en_US.utf8   0    0

So weit, so gut.

Wir können nun unsere ntfs-Platte ein erstes Mal mounten:

Code:
sudo mount /media/ntfs

Kommt folgende Warnung?

Code:
WARNING: Deficient FUSE kernel module detected. Some driver features are
         not available (swap file on NTFS, boot from NTFS by LILO), and
         unmount is not safe unless it's made sure the ntfs-3g process
         naturally terminates after calling 'umount'. The safe FUSE kernel
         driver is included in the official Linux kernels since version
         2.6.20-rc1, or in the FUSE 2.6.0 or later software packages,
         except the faulty FUSE version 2.6.2. For more help, please
         have a look at /usr/share/doc/ntfs-3g/README.Debian. Thanks

Nun, sie sollte eigentlich keinen Einfluss auf die Funktionstauglichkeit der Platte haben.

Wir ignorieren sie erstmal, vielleicht gehe ich später noch auf einen "fix" ein.

Ein Test mit MC bestätigt - sowohl das beschreiben als auch lesen der Festplatte klappt!

Die ganze Sache hat aber noch einen Haken. Unsere Platte wird natürlich nicht immer als /dev/sda1 eingebunden sein, warum habe ich oben ja schon beschrieben. Dem konnten wir bei unserer ext3 Platte mit der UUID (oder dem Label) entgegenwirken, nicht aber hier; unsere ntfs Disk zeigt uns beim "blkid" Befehl ja gar keine UUID an.

Darum greifen wir hier auf udev zurück.

Zuerst gucken wir mal genauer, was für Werte für unsere USB-Platten ausgegeben werden:

Code:
fish@fishbox:/$ sudo lsusb
Bus 004 Device 001: ID 0000:0000
Bus 005 Device 003: ID 059f:0351 LaCie, Ltd
Bus 005 Device 002: ID 058f:6390 Alcor Micro Corp.
Bus 005 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000

Relevant ist hier folgende Zeile für die NTFS-Platte:

Code:
Bus 005 Device 002: ID 058f:6390 Alcor Micro Corp.

Wir untersuchen es genauer:

Code:
sudo lsusb -v

(laaange Ausgabe!)

Jetzt scrollen wir mit shift+pageup nach oben und suchen den Eintrag für die NTFS-Disk:

Code:
Bus 005 Device 002: ID 058f:6390 Alcor Micro Corp.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x058f Alcor Micro Corp.
  idProduct          0x6390
  bcdDevice            1.00
  iManufacturer           1 Generic
  iProduct                2 USB TO IDE Bridge
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk (Zip)
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)

Wir öffnen Nano:

Code:
sudo nano

Folgendes kommt da rein:

Code:
# Externe USB NTFS Platte

BUS=="usb", KERNEL=="sd?1",SYSFS{idProduct}=="6390",SYMLINK+="ntfs"

SYMLINK ist dabei nicht etwa das Dateisystem, sondern der Name, den wir der Platte zuteilen.

Ich nenne sie trotzdem mal ntfs, um etwas Verwirrung zu stiften! ;)

Das ganze speichern wir unter /etc/udev/rules.d/01-usb-storage-custom.rules ab.

Wie öffnen nochmals die fstab und ändern den Eintrag für die Platte wie folgt ab:

Code:
/dev/ntfs       /media/ntfs     ntfs-3g  rw,user,noauto,locale=en_US.utf8   0    0

Das ntfs in /dev/ntfs ist natürlich wieder der oben zugewiesene Name, und nicht das Dateisystem.

Jetzt kommt der grosse Moment - wird es auch funktionieren?

Wir rebooten das System:

Code:
fish@fishbox:/etc/udev/rules.d$ sudo reboot

Broadcast message from root@fishbox (pts/1) (Thu Apr  5 00:33:39 2007):

The system is going down for reboot NOW!
fish@fishbox:/etc/udev/rules.d$ Connection to 192.168.0.175 closed by remote host.
Connection to 192.168.0.175 closed.

(unsere SSH Session wird so natürlich beendet)

Ist der Reboot vollendet, loggen wir uns wieder auf dem PC ein und prüfen mal das /media Verzeichnis:

Code:
fish@fishbox:~$ cd /media/
fish@fishbox:/media$ ls
backups  cdrom  cdrom0  floppy  floppy0  lab  ntfs  sources  stoked
fish@fishbox:/media$ cd backups/
fish@fishbox:/media/backups$ ls
fish@fishbox:/media/backups$ cd /media/ntfs/
fish@fishbox:/media/ntfs$ ls
fish@fishbox:/media/ntfs$

Logisch, beide Verzeichnisse sind leer, noch ist nichts gemountet.

Wir binden die ext3 Platte ein:

Code:
fish@fishbox:/media/ntfs$ sudo mount /media/backups/
Password:
fish@fishbox:/media/ntfs$ cd /media/backups/
fish@fishbox:/media/backups$ ls
daily.0

Klappt!

Aber geht es auch mit der ntfs Platte?

Code:
fish@fishbox:/media/backups$ sudo mount /media/ntfs/
fish@fishbox:/media/backups$ cd /media/ntfs/
fish@fishbox:/media/ntfs$ ls
Marketing - Seminararbeit.pdf  System Volume Information

Yep! :)

Wir haben es also geschafft - beide USB-Platten sind nun mit einem einfach Befehl mountbar. Dabei ist es egal, wie sie genau angeschlossen sind, an welchem USB-Eingang, neben wievielen anderen USB-Devices. Sie werden immer mit dem gleichen Befehl eingebunden und da auch immer ans gleiche Ort.

Zum Abschluss testen wir das noch:

Code:
fish@fishbox:/media/ntfs$ fdisk -l

Disk /dev/sda: 82.3 GB, 82348277760 bytes
255 heads, 63 sectors/track, 10011 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       10011    80413326    c  W95 FAT32 (LBA)

Disk /dev/sdb: 60.0 GB, 60060155904 bytes
255 heads, 63 sectors/track, 7301 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        7301    58645251    7  HPFS/NTFS

Okay, wir rebooten und schliessen die ext3 Platte ab!

Code:
sudo reboot

Nach dem Reboot sieht es wie folgt aus:

Code:
fish@fishbox:~$ fdisk -l

Disk /dev/sda: 60.0 GB, 60060155904 bytes
255 heads, 63 sectors/track, 7301 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1        7301    58645251    7  HPFS/NTFS

Wie man sehen kann, ist die Platte nun nicht mehr /dev/sdb1, sondern /dev/sda1.

Lässt sie sich immer noch mit dem gleichen Befehl mounten?

Code:
fish@fishbox:~$ sudo mount /media/ntfs/

Code:
fish@fishbox:~$ cd /media/ntfs/; ls
Marketing - Seminararbeit.pdf  System Volume Information

Ja!

Damit wäre unser Ziel erreicht, die Konfiguration ist abgeschlossen.

Man könnte nun auch noch die ext3 Platte über udev einrichten und auch beide automatisch beim anstecken mounten lassen, aber darauf werde ich nicht mehr eingehen. Das set-up reicht so für mich aus, ich bin glücklich! :)
 
11. Giantdisc - Musik fernsteuern über ein WLAN mit einem Palm

Erstmal die Voraussetzungen für dieses Kapitel:

1. WLAN Router
2. WLAN-fähiger Palm (z.B. einen TX)
3. Eine Soundkarte und Boxen am Server
4. Genug Speicherplatz für Musik auf dem Server
5. Sämtliche Musikdateien sollten 100% richtig getaggt sein
6. Die Files müssen in MP3, OGG und/oder FLAC vorhanden sein

(GD funktioniert auch über rs232, bluetooth, gsm,
aber ich werde nur die WLAN Variante beschreiben!)

Was uns genau erwartet? Hier eine Vorschau der Palm Software!

MOD : Siehe Anhang 1

Folgendes Konzept steckt dahinter:

MOD : Siehe Anhang 2

Auf dem Server wird ein Set von Skripten laufen, um MP3/OGG/FLAC abzuspielen, vom Palm aus wird das ganze bedient. Ein PC zur Steuerung ist nicht mehr nötig, die Musik lässt sich bequem über das Palm Interface abspielen.

Giantdisc wurde von Rolf Brugger von der Uni Fribourg entwickelt - Qualitätsware aus der Schweiz also! :D

Die offizielle Homepage mit Forum findet sich hier: GiantDisc: Audio Jukebox

Also, los gehts!

Wir öffnen die /etc/apt/sources.list mit Nano und ändern folgende Zeile ab:

Code:
deb http://ch.archive.ubuntu.com/ubuntu/ dapper universe
deb-src http://ch.archive.ubuntu.com/ubuntu/ dapper universe

Daraus wird neu:

Code:
deb http://ch.archive.ubuntu.com/ubuntu/ dapper universe multiverse
deb-src http://ch.archive.ubuntu.com/ubuntu/ dapper universe multiverse

Speichern, dann ein sudo apt-get update um die Softwarequellen zu aktualisieren!

Nun installieren wir die noch fehlenden Pakete für GD:

Code:
sudo apt-get update

Code:
sudo apt-get install perl mysql-client mysql-server libcddb-get-perl cdtool netpbm mp3info madplay libid3-3.8.3-dev libid3tag0-dev lame

Code:
sudo apt-get install mp3info aumix id3 libdbd-mysql-perl mpg321 make cdparanoia pilot-link flac libtag1c2a libtag1-dev mplayer-nogui mpg123

(eventuelle Abhängigkeitsprüfungen bejahen!)

Ein paar der obigen DEBs sind allerdings optional, mehr dazu hier:

Manual: Single HTML Page

Entscheidet selbst, was ihr davon nutzen wollt und was nicht!

Nun gebären wir einen neuen Benutzer namens "music" mit entsprechendem Home-Verzeichnis:

Code:
fish@fishbox:~$ sudo adduser music
Adding user `music'...
Adding new group `music' (1001).
Adding new user `music' (1001) with group `music'.
The home directory `/home/music' already exists.  Not copying from `/etc/skel'
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for music
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [y/N] y

(Passwort nach Wahl, bei den Abfragen einfach ENTER drücken!)

Code:
fish@fishbox:/home$ cd /home/; ls
fish  music

Der neue Benutzer "music" wurde also korrekt erstellt, sehr schön.

Jetzt ändern wir die Rechte für einige "devices" und machen sie so world-readable:

Code:
fish@fishbox:/$ sudo chmod 777 /dev/dsp
fish@fishbox:/$ sudo chmod 777 /dev/ttyS*
fish@fishbox:/$ sudo chmod 777 /dev/rtc
fish@fishbox:/$ sudo chmod 777 /dev/mixer
fish@fishbox:/$ sudo chmod 777 /dev/null
fish@fishbox:/$ sudo chmod 777 /dev/hdc

Der letzte Wert ist unser CD-ROM - es könnte bei euch woanders gemountet sein.

Nachprüfen könnt ihr das, indem ihr die fstab ausliest:

Code:
fish@fishbox:/$ cat /etc/fstab | grep cdrom
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0

Jetzt öffnen wir die /etc/environment...

Code:
fish@fishbox:~$ sudo nano /etc/environment

...und ändern folgende Zeile:

Code:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games"

Sie soll neu wie folgt aussehen:

Code:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games:/home/music/bin"

Mehr zur bash und ihren Konfigurationsdateien gibts hier:

/bin/bash - Treffpunkt für Linux-Shelluser
https://wiki.ubuntu.com/environment_variables
4.15 Einige bash-Funktionen

Wir loggen uns mit "su music" als Benutzer "music" ein und holen uns die aktuelle GD:

Code:
music@fishbox:~$ wget http://www.giantdisc.org/download/basicpkg/beta/GiantDisc_1.41-5.tar.gz
--12:09:18--  http://www.giantdisc.org/download/basicpkg/beta/GiantDisc_1.41-5.tar.gz
           => `GiantDisc_1.41-5.tar.gz'
Resolving www.giantdisc.org... 217.26.52.30
Connecting to www.giantdisc.org|217.26.52.30|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 405,159 (396K) [application/x-tar]

100%[=====================================================================>] 405,159      582.55K/s

12:09:19 (580.69 KB/s) - `GiantDisc_1.41-5.tar.gz' saved [405159/405159]

(momentan ist das die 1.41-5 - prüft auf giantdisc.org, ob es eventuell eine neuere Version gibt!)

Wir entpacken das ganze und wechseln ins neu erstellte Verzeichnis:

Code:
music@fishbox:~$ tar zxvf GiantDisc_1.41-5.tar.gz
GiantDisc_1.41-5/
GiantDisc_1.41-5/bin/
GiantDisc_1.41-5/bin/gddb.pm
GiantDisc_1.41-5/bin/gdgentools.pm
GiantDisc_1.41-5/bin/gdio.pm
GiantDisc_1.41-5/bin/gdparams.pm
GiantDisc_1.41-5/bin/gdserv.pm
GiantDisc_1.41-5/bin/gdsoundcard.pm
GiantDisc_1.41-5/bin/gdupdate.pm
GiantDisc_1.41-5/bin/rememberprompt.pm
GiantDisc_1.41-5/bin/gdbooklet.pl
GiantDisc_1.41-5/bin/gdcompr.pl
GiantDisc_1.41-5/bin/gdd-listener.pl
GiantDisc_1.41-5/bin/gdd.pl
GiantDisc_1.41-5/bin/gdexportdb.pl
GiantDisc_1.41-5/bin/gdgetmdir.pl
GiantDisc_1.41-5/bin/gdimportcdi.pl
GiantDisc_1.41-5/bin/gdimportlyr.pl
GiantDisc_1.41-5/bin/gdimport.pl
GiantDisc_1.41-5/bin/gdimporttri.pl
GiantDisc_1.41-5/bin/gdinfo.pl
GiantDisc_1.41-5/bin/gd-maintenance.pl
GiantDisc_1.41-5/bin/gdmakelinks.pl
GiantDisc_1.41-5/bin/gdplaycd.pl
GiantDisc_1.41-5/bin/gdplayd2.pl
GiantDisc_1.41-5/bin/gdplayd.pl
GiantDisc_1.41-5/bin/gdplaytimefilter.pl
GiantDisc_1.41-5/bin/gdplaytmsim.pl
GiantDisc_1.41-5/bin/gdrefresh.pl
GiantDisc_1.41-5/bin/gdripcd.pl
GiantDisc_1.41-5/bin/gdsleep.pl
GiantDisc_1.41-5/bin/gdstream.pl
GiantDisc_1.41-5/bin/gdsync.pl
GiantDisc_1.41-5/bin/gdtranscode.pl
GiantDisc_1.41-5/bin/gdupdatedb.pl
GiantDisc_1.41-5/bin/gdupload2player.pl
GiantDisc_1.41-5/bin/jpgvsplit.pl
GiantDisc_1.41-5/bin/protodoc.pl
GiantDisc_1.41-5/bin/gdarchive.sh
GiantDisc_1.41-5/bin/gdburn.sh
GiantDisc_1.41-5/bin/gddstart.sh
GiantDisc_1.41-5/bin/gdd-wrapper.sh
GiantDisc_1.41-5/bin/gif2jpg.sh
GiantDisc_1.41-5/bin/gdplaytimefilter
GiantDisc_1.41-5/bin/gdmp3cutter
GiantDisc_1.41-5/bin/cronfile-1per-d
GiantDisc_1.41-5/bin/cronfile-1per-h
GiantDisc_1.41-5/bin/cronfile-1per-m
GiantDisc_1.41-5/bin/playtimefilter/
GiantDisc_1.41-5/bin/playtimefilter/tmp.txt
GiantDisc_1.41-5/bin/playtimefilter/gdplaytimefilter.c
GiantDisc_1.41-5/bin/playtimefilter/gdplaytimefilter.c.bak
GiantDisc_1.41-5/bin/playtimefilter/gdplaytimefilter
GiantDisc_1.41-5/bin/playtimefilter/gdplaytimefilter.o
GiantDisc_1.41-5/bin/playtimefilter/Makefile
GiantDisc_1.41-5/bin/mp3cutter/
GiantDisc_1.41-5/bin/mp3cutter/gdmp3cutter
GiantDisc_1.41-5/bin/mp3cutter/Makefile
GiantDisc_1.41-5/bin/mp3cutter/gdmp3cutter.c
GiantDisc_1.41-5/database/
GiantDisc_1.41-5/database/createdb.mysql
GiantDisc_1.41-5/database/createtables.mysql
GiantDisc_1.41-5/database/createtables-old.mysql
GiantDisc_1.41-5/database/readalbums.mysql
GiantDisc_1.41-5/database/readgenres.mysql
GiantDisc_1.41-5/database/readlanguages.mysql
GiantDisc_1.41-5/database/readmusictypes.mysql
GiantDisc_1.41-5/database/readsources.mysql
GiantDisc_1.41-5/database/readtracks.mysql
GiantDisc_1.41-5/database/make-db.sh
GiantDisc_1.41-5/database/make-tables-oldmysql.sh
GiantDisc_1.41-5/database/make-tables.sh
GiantDisc_1.41-5/PalmClient/
GiantDisc_1.41-5/PalmClient/gd-palmos3.prc
GiantDisc_1.41-5/PalmClient/gd.prc
GiantDisc_1.41-5/PalmClient/JpegLib.prc
GiantDisc_1.41-5/PalmClient/pnoJpegLib.prc
GiantDisc_1.41-5/public_html/
GiantDisc_1.41-5/public_html/webint/
GiantDisc_1.41-5/public_html/webint/img/
GiantDisc_1.41-5/README
GiantDisc_1.41-5/Install.sh
GiantDisc_1.41-5/.gdconfig

Das Installationsskript wird ausgeführt:

Code:
music@fishbox:~/GiantDisc_1.41-5$ ./Install.sh

GiantDisc installation/update script

user 'music' exists. OK
create directory /home/music/00
create directory /home/music/01
create directory /home/music/02
create directory /home/music/tmp
create directory /home/music/inbox
create directory /home/music/inbox/albums
create directory /home/music/outbox
create directory /home/music/browse
create directory /home/music/bin
copy its content ...
create directory /home/music/PalmClient
copy its content ...
create directory /home/music/database
copy its content ...
cp: cannot stat `database/genres.txt': No such file or directory
cp: cannot stat `database/languages.txt': No such file or directory
cp: cannot stat `database/musictypes.txt': No such file or directory
cp: cannot stat `database/sources.txt': No such file or directory
cp: omitting directory `bin'
cp: omitting directory `public_html'

Installation complete, all files are copied

Leider scheint die aktuellste GD einen kleinen Bug zu haben, wir holen uns also die Vorgängerversion:

Code:
music@fishbox:~$ wget wget http://www.giantdisc.org/download/basicpkg/beta/GiantDisc_1.41-4.tar.gz

Auch diese wird entpackt:

Code:
music@fishbox:~$ tar xvzf GiantDisc_1.41-4.tar.gz

Jetzt öffnen wir MC (Midnight Commander) und kopieren die Dateien genres.txt, languages.txt, musictypes.txt und sources.txt aus dem Verzeichnis /home/music/GiantDisc_1.41-4/database mit F5 nach /home/music/database!

Bevor wir unsere Musik einlesen, müssen wir mit den Skripts make-db und make-tables eine Datenbank erstellen.

Wir wechseln zurück zum User fish mit "su fish" und führen folgendes aus:

Code:
fish@fishbox:/home/music/database$ sudo sh make-db.sh
creating db
fish@fishbox:/home/music/database$ sudo sh make-tables.sh
creating tables
reading genres
reading languages
reading musictypes
reading sources

Jetzt ein "su music" und dann starten wir den GiantDisc Server:

Code:
music@fishbox:~/bin$ perl gdd.pl --commode2
GiantDisc Server version 1.41-5
Unknown option: commode2
### Init serial port /dev/ttyS1 at 19200 bps
Open database connection
DBI connect('GiantDisc:fishbox','music',...) failed: Can't connect to MySQL server on 'fishbox' (111) at /home/music/bin/gdserv.pm line 91
unable to connect to GiantDisc db at /home/music/bin/gdserv.pm line 91.
### close database connection
io modul finished

Obige Fehlermeldung wird wie folgt umgangen:

Code:
nano /home/music/.gdconfig

Dort kommentieren wir die Zeile "dbhost = localhost" aus.
Bei der Gelegenheit setzen wir den Wert "commmode" auch gleich noch auf 2!

Wir versuchen es nochmals:

Code:
music@fishbox:~/bin$ perl gdd.pl
GiantDisc Server version 1.41-5
Open socket on localhost at port 26468 as server (mode 2 - generic)
Open database connection

  Update to database structure version 1.41 required
  please run command 'gdupdatedb.pl'

### close database connection
io modul finished

Offensichtlich ist ein Update nötig:

Code:
music@fishbox:~/bin$ perl gdupdatedb.pl -h localhost
### open database connection to
Check update to version 1.11
Check update to version 1.12
Check update to version 1.14
Check update to version 1.31
Set table 'playerstate' to type HEAP
Check update to version 1.32
Check update to version 1.33
Check update to version 1.34
Check update to version 1.41
Update table playlist to version 1.41
add column modified
add column length
Change type of album.modified from DATE to DATETIME
Change type of tracks.modified from DATE to DATETIME
### close database connection

Nun gehen wir in die /home/music/.gdconfig und prüfen, ob folgende Werte richtig gesetzt sind:

Code:
dbhost = localhost
tcpiphost = 192.168.0.175
tcpipport = 26468

Jetzt wird der GD-Server nochmals gestartet:

Code:
music@fishbox:~/bin$ perl gdd.pl
GiantDisc Server version 1.41-5
Open socket on localhost at port 26468 as server (mode 2 - generic)
Open database connection
ID of this instance of gdd (playerid): 0
sh: gdrefresh.pl: command not found
Giant Disc Server started
connection open? ... no
Server accepting socket ...

Bingo! ;)

So weit, so gut - natürlich muss aber noch der Palm Client installiert werden, er findet sich hier:

Code:
fish@fishbox:/home/music$ cd PalmClient/
fish@fishbox:/home/music/PalmClient$ ls
gd-palmos3.prc  gd.prc  JpegLib.prc  pnoJpegLib.prc

Ich habe diese Dateien in den eingerichteten NFS-Share verfrachtet (siehe Kapitel 5) und dann mit Kubuntu Feisty auf meinen Palm installiert. Natürlich könnt ihr das auch auf Windows per Hotsync oder auf der Kommandozeile erledigen.

Das Palm Programm wird geöffnet, die Verbindung mit einem Klick auf "New" konfiguriert:

Name: fishbox (oder was anderes, egal)
ID: 0
Communication Mode: TCP/IP generic
Host: 192.168.0.175
Port: 26468

(gegebenfalls den Port in der Firewall für den Palm öffnen)

Bei "default connection" ein Häkchen setzen, dann ein Klick auf Save!

Wie wählen nun die Verbindung aus und versuchen uns mit "connect" einzuloggen.

Falls dies geklappt hat, sieht man auf der Konsole eine Bestätigung.

Jetzt haben wir es fast geschafft, aber unsere Files müssen noch importiert werden!

Das Palm Programm und der Server Prozess wird nochmals beendet.

In dem Verzeichnis mit unserer Musik führen wir nun folgenden Befehl aus:

Code:
music@fishbox:/media/stoked/Possessedby/Audio$ find . -type d -print -exec /home/music/bin/gdimport.pl -l {} \;

Dabei verwenden wir die Option -l, damit die Dateien in /home/music nur gelinkt, nicht aber dort hin kopiert werden.

Jetzt ist es vollbracht - wir starten den Server erneut, öffnen GD auf dem Palm und spielen den ersten Track ab! :)

Nun sollte man eigentlich alle eingelesenen Files direkt über den Palm abspielen können. Da GiantDisc noch viele weitere Features mit sich bringt (Last.fm, CDs rippen, Server runterfahren, Replaygain, etc.) lohnt sich auf jeden Fall auch ein Blick in die Dokumentation und auf giantdisc.org. Eventuell werde ich später noch auf einige dieser Möglichkeiten eingehen.

Zum Schluss möchte ich mich noch besonders bei Rolf, Teardrainer und Nonos bedanken für die super Hilfe im GiantDisc Forum - Jungs, ohne euch wäre dieses Kapitel nie zu Stande gekommen!

Très cordialement,
fish

:D
 

Attachments

  • gd1.gif
    gd1.gif
    69.5 KB · Views: 390
  • schema-concept.gif
    schema-concept.gif
    5 KB · Views: 255
Last edited by a moderator:
Thorsten, Danke für den Edit! :)

Hier noch 2 Erweiterungen zum GD-Kapitel:

Anhang 1 - GiantDisc und Last.fm

Auch GiantDisc würden wir gerne zum scrobblen bringen.

Zuerst müssen wir zwei Abhängigkeiten installieren:

Code:
fish@fishbox:~/sources$ sudo apt-get install libconfig-inifiles-perl libwww-perl

(Abhängigkeitsprüfung bejahen!)

Jetzt noch folgende Befehle ausführen:

Code:
fish@fishbox:~/sources$ wget http://cpan.calvin.edu/pub/CPAN/modules/by-module/Audio/Audio-Scrobbler-0.01.tar.gz

Code:
fish@fishbox:~/sources$ tar zxvf Audio-Scrobbler-0.01.tar.gz

Code:
fish@fishbox:/home/music/sources/Audio-Scrobbler-0.01$ sudo perl Makefile.PL

Code:
fish@fishbox:/home/music/sources/Audio-Scrobbler-0.01$ sudo make

Code:
fish@fishbox:/home/music/sources/Audio-Scrobbler-0.01$ sudo make test

Kommt folgende Meldung, haben wir Erfolg:

Code:
All tests successful.

Jetzt noch:

Code:
fish@fishbox:/home/music/sources/Audio-Scrobbler-0.01$ sudo checkinstall

(das Paket "checkinstall" muss dafür installiert sein!)

Code:
fish@fishbox:/home/music/sources/Audio-Scrobbler-0.01$ sudo dpkg -i audio-scrobbler_0.01-1_i386.deb

Die Einstellung dazu findet sich in der /home/music/.gdconfig, es sollte in etwa so aussehen:

Code:
######## AudioScrobbler Settings
#
# Support for AudioScrobber is enabled here.
# AudioScrobbler support requires the Perl Audio::Scrobbler mo$
# and an account with www.last.fm.
#
# Uncomment and correct the following settings to enable.
#
# Settings:
#
# To enable, comment the following line and uncomment out the $
#useaudioscrobbler = 0
useaudioscrobbler = 1
scrobbler_user = deinbenutzername
scrobbler_pass = deinpasswort

Abspeichern, Server neu starten, scrobblen!

Anhang 2 - GiantDisc automatisch beim booten starten lassen

Wer GD sofort "ready" haben will nach dem aufstarten des PCs, editiert folgende Datei:

Code:
fish@fishbox:~$ sudo nano /etc/rc.local

Code:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runleve$
# Make sure that the script will "exit 0" on success or any ot$
# value on error.
#
# In order to enable or disable this script just change the ex$
# bits.
#
# By default this script does nothing.

chmod 777 /dev/dsp
chmod 777 /dev/mixer
chmod 777 /dev/rtc
su --command="/home/music/bin/gdd-wrapper.sh" music&
exit 0

Abspeichern, fertig! :)
 
Back
Top