Grub 2 nach Windowsinstallation wiederherstellen

Ich nutze auf dem Computer zuhause schon seit längerem Untuntu und bin sehr zufrieden damit. Einige Dinge (GPS, Spiele) laufen unter Ubuntu aber nicht darum habe ich paralell noch ein Windows XP installiert. Mit dem Grub Bootloader ist das ja kein Problem. Neulich musste ich aber mein Windows neu installieren, was ja ansich auch kein Problem ist. Bei der Installation überschreibt Windows aber den Bootloader und so kann man Linux nicht mehr booten. Hier darum eine kleine Anleitung wie man den Grub wieder installiert, so dass man Linux und Windows booten kann. Dazu benötigt man einfach eine Ubuntu Installations CD. Ich habe das ganze mit Ubuntu 9.10 durchgespielt.

Als erstes legt man die Ubuntu CD ins Laufwerk und bootet davon im Live Modus. So hat man ein Linux zur Verfügung, ohne dass man etwas ander Festplatte verändert. Das Problem ist aber, dass die Live CD den Grub 1 verwendet, die Installation aber Grub 2, aber das ist ein lösbares Problem.
Darum schreibt man nun als erstes den (alten) Grub in den MBR (Master Boot Record) der Festplatte. Da zu muss man die UUID der Bootpartition sowie der Name der Festplatte wissen. Am besten hängt man die Boot Partition über das GUI ein und gibt danach in der Shell den Befehl mount ein. Dort sieht man, wie die Partition eingebunden ist und auch die UUID der Partition. Wir brauchen wie gesagt die UUID der Partition und der Name der Festplatte. Ist die Parition die /dev/sda6 ist die Platte die /dev/sda. Im Normalfall ist eine IDE Platte die /dev/hda und eine SATA/SCSI die /dev/sda. Den Bootloader schreiben wir nun mit dem folgenden Befehl ({UUID} durch die entsprechende UUID ersetzen.
sudo grub-install --root-directory=/media/{UUID} /dev/sda

Bevor wir den Computer nun neustarten, müssen wir noch wissen, welche Parition die Root Partition ist. Also die Partition, die schlussendlich als / genutz werden soll. Gleiches vorgehen wie vorhin. Schnell einhängen und mit mount die Partition auslesen.
Jetzt können wir den Computer neustarten und die CD aus dem Laufwerk auslesen.

Beim neustart kommt nun der Grub im Konsolen Modus. Also keine Auswahl sondern nur eine Aufforderung etwas einzugeben. Nun müssen wir das System ein erstes mal "von Hand" booten. Zum Glück gibt es eine Autovervollständigung, die das ganze etwas einfacher macht. Als erstes gibt man die folgende Zeile ein:
linux /vmlinuz-2.6.31-20-generic root=/dev/sda6 ro quiet splash

Am einfachsten ist es nur linux /vmlinuz einzutippen und sich dann mit dem Tabulator die verschiedenen Kernel anzeigen zu lassen, so erwischt man auch immer den aktuellsten. /dev/sda6/ ist hier die Root Partition, dessen Name wir vorhin ausgelesen haben. (Das Tastaturlayout ist Englisch. Die Bindestriche und Slashes nimmt man am besten vom Numlock, das Gleichzeichen ist gleich links vom Backspace)
boot linux /vmlinuz-2.6.31-20-generic root=/dev/sda6 ro quiet splash

Nun ist der Kernel geladen und wir müssen nur noch Booten. Das geht mit demselben Befehl, nur noch mit einem boot davor.
boot linux /vmlinuz-2.6.31-20-generic root=/dev/sda6 ro quiet splash

Jetzt sollte das System wieder booten wie vor der Windows installation. Damit man das aber nicht bei jedem Start machen muss, muss man nun noch die neuste Version vom Grub installieren. Das geht recht simpel mit dem folgenden Befehl:
sudo gub-install --root-directory=/ /dev/sda

Wenn man das Windows nachträglich installiert, oder bei der Neuinstallation die Windows Partition komplett gelöscht und neu erstellt hat, muss man das Configfile vom Grub anpassen, damit auch Windows wieder gebootet werden kann. Das geht mit dem folgenden Befehl schnell und vollautomatisch:
sudo grub-mkconfig -o /boot/grub/grub.cfg

Beim nächsten Neustart sollte man nun wieder den Grub 2 mit der Auswahl Linux und Windows haben.

Knistern unter Linux

Seit meinem WK hatte ich mit meinem Linux das Problem, dass der Ton nicht mehr funktionierte. Anstelle von Musik kam nur noch ein komisches Knistert. Im Ubuntu-Forum habe ich nun die Lösung gefunden. In der Shell das folgende eingeben und den Computer danach noch neustarten und schon gehts wieder.
sudo /etc/init.d/alsa-utils reset

bittorrent unter Linux

Ich benutze regelmässig Bittorrent um grössere Dateien herunter zu laden. Nur meist nervt es mich, wenn der Bittorrent-Client dann die ganze Bandbreite benutzt, wenn ich surfen will, oder auch wenn ich den Computer laufen lassen muss, nur damit eine Datei herunter geladen werden kann. Für etwas habe ich ja meine alte Linux-Box, die diese Aufgabe ganz gut übernehmen kann. Schliesslich gibt es einen guten Bittorrent-Client für die Shell, welcher im Zusammenspiel mit screen sehr simpel zu bedienen ist.
Als erstes muss man dazu screen und bittorrent auf der Linux-Box installieren:
apt-get install screen
apt-get install bittorrent

Aus Sicherheitsgründen habe ich extra einen Benutzer namens bittorrent erstellt, unter welchem dann der Prozess läuft:
useradd -g users -d /home/bittorrent -s /bin/bash bittorrent

screen

screen ist ein praktisches Tool mit welchem man Programme starten kann, ohne dass sie bei eine Disconnect (ssh, telnet usw.) sofort beendet werden. Das heisst man startet mit screen eine Terminal-Session, startet darin das Programm (in diesem Fall bittorrent) und kann dann die Verbindung wieder trennen, ohne das das Programm beendet wird.
Erstellen tut man eine solche Session mit dem Befehl screen. Nun kann man in dieser Session ein Programm starten und die Session danach mit Ctrl-A-D wieder beenden. Mit screen -r wird eine bestehende Session wieder aufgerufen.
Das bedeutet, dass man am Anfang mit screen eine neue Session erstellt, darin den Bittorrent-Client startet und danach mit Ctrl-A-D die Session wieder beendet. Wenn man nun nach dem Status sehen will, öffnet man die bestehende Session mit screen -r wieder.
Allerdings ist screen nicht sonderlich einfach zu verstehen, aber darauf wird man im man-File auch hingewiesen:
A weird imagination is most useful to gain full advantage of all the features.

bittorrent

Nun zum eigentlichen Bittorrent-Client:
Ich verwende btlaunchmanycurses damit ist es möglich mehrere Downloads gleichzeitig am laufen zu haben und diese werden auch noch "schön" dargestellt. btmanycurses erwartet als Parameter einen bestimmen Ordner und überwacht diesen. Sobald man in diesem Ordner ein torrent abspeichert, wird das erkannt und heruntergeladen. Die heruntergeladenen Daten werden auch in diesem Ordner abgelegt. Das heisst man kann die torrent-Datei in diesen Ordner speichern und muss dann nur noch warten bis der Download komplett ist. Ich habe mir ein kleines Script geschrieben welches den Client mit den nötigen Parametern startet. Aber das ist reine Bequemlichkeit.
#!/bin/bash
/usr/bin/btlaunchmanycurses /home/bittorrent/

Schlussendlich muss man sich nur mit dem Benutzer bittorrent einloggen, dort einmalig mit screen eine Terminal-Session erstellen und darin das Script starten. Wenn der Bittorrent-Client nun läuft kann man die Dateien in den angegebenen Ordner kopieren und sie werden automatisch heruntergeladen. Den Status sieht man mit screen -r. In verbindung mit einem Samba, FTP usw. Server ist das eine sehr bequeme und einfache Art um torrents herunter zu laden.

Und so sieht das dann aus:
http://images.t-error.ch/blog/1073/bittorrent.jpg


Wichtig ist auch noch, dass man die TCP Ports 6881-9 auf den entsprechenden Computer weiterleitet.

Zusammenfassung

Wenn nun die benötigte Software installiert, der Benutzer und das Script erstellt wurden kann man folgendermassen vorgehen
erstmaliges Starten des Clients
screen
./bittorrent.sh
Ctrl-A-D
Status überprüfen
screen -r
Ctrl-A-D

Apache und PHP Versions-Header entfernen

Apache und PHP sind unter Ubuntu standardmässig etwas gespächig einstellt und teilen dem Browser so immer die Apache und PHP Version mit. Auch die Serversignatur (bei Fehlermeldungen) zeigt die Versionsnummern an. Dies ist aufgrund der Sicherheit nicht empfehlenswert, denn was der Hacker nicht weiss, mach ihn nicht heiss. Die HTTP-Header sehen Standardmässig so aus:
HTTP/1.1 200 OK
Date: Mon, 04 May 2009 11:23:04 GMT
Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.5 with Suhosin-Patch
X-Powered-By: PHP/5.2.4-2ubuntu5.5

Content-Length: 4045
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html


In der Datei apache2.conf kann man mit den Optionen ServerTokens und ServerSignature die HTTP-Headers und die Signatur etwas kürzen:
ServerTokens Prod
ServerSignature Off

Die HTTP-Headers vom Apache sehen dann nur noch so aus:
HTTP/1.1 200 OK
Date: Mon, 04 May 2009 11:43:17 GMT
Server: Apache
X-Powered-By: PHP/5.2.4-2ubuntu5.5

Content-Length: 4045
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html


Nun muss nur noch das X-Powered-By von PHP weg und dann ist sind die Headers sauber. Dazu muss man in der Datei php5.ini die Option expose_php anpassen:
expose_php = Off
Und nun sind in den Headers keine Versionsnummern mehr drin.
HTTP/1.1 200 OK
Date: Mon, 04 May 2009 11:45:13 GMT
Server: Apache
Content-Length: 4045
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

Mails mit Attachment aus der Shell versenden

Mit einem kleinen Script und einem Cronjob mache ich im Geschäft täglich ein Backup meiner mySQL Datenbank und sende es per Mail an meine GMail-Adresse. Dort habe ich genug Platz und kann so auf ein tägliches Backup zurückgreiffen.
Wie man ein Backup einer Datenbank macht habe ich ja bereits beschrieben. Das Versenden der Datei erledigt bei mir Mutt schon seit einiger Zeit sehr zuverlässig:
echo "Text" | mutt -s "Betreff" -a filename.zip empfaenger@mail.ch

Lösung von CIFS VFS: server not responding

Seitdem ich bei meinem neuen Notebook unter Ubuntu 8.10 meine SMB-Shares wieder in der fstab eingetragen hatte, kam jedes mal beim herunterfahren die folgende Fehlermeldung, welche den Computer für etwa eine Minute blockierte.
CIFS VFS: server not responding
CIFS VFS: No response for cmd 50 mid 155


Nichts wirklich tragisches, aber doch nervig genug um der Sache nachzugehen. Glücklicherweise war ich nicht der einzige mit dem Problem. Das Problem ist, dass die SMB-Shares mit dem CIFS Daemon und nicht über den Kernel gemountet werden. Beim herunterfahren wird dann zuerst der Daemon gestoppt und danach sollen die Shares getrennt werden, was dann natürlich nicht mehr funktioniert. Die Lösung ist recht simpel, ein Script, welches die Shares trennt, bevor der Daemon gestoppt wird. Im Ubuntu-Forum findet man da eine gut funktionierende Lösung. Allerdings muss man sich kurz registrieren, damit man die Datei beziehen kann. Bei mir ist die Fehlermeldung nun verschwunden.

Dualscreen unter Ubuntu 8.10

Als ich vor etwa eineinhalb Jahren zum ersten mal auf dem Notebook Windows deinstallierte und Ubuntu installierte versuchte ich Ubuntu so zu konfigurieren, dass ich meine beiden Bildschirme benutzen konnte. Ich hatte damals Stunden im Internet gesucht, in der xorg.conf geschrieben, den Computer neugestartet usw. Alles ohne Erfolg.
Nun mit dem neuen 8.10: Ein Klick auf System -> Einstellungen -> Bildschirmauflösung, dort den Hacken bei "Bildschirme spiegeln" entfernen. Jetzt nur noch die Bildschirme richtig positionieren, die gewünschte Auflösung einstellen und schnell ab- und wieder anmelden. Und es funktioniert perfekt.
http://images.t-error.ch/blog/916/aufloesung.jpg

Webcam als Überwachungskamera mit Motion

Da mein neues Notebook nun eine integrierte Webcam hat, ich die ab nicht wirklich zum Chatten usw. brauche habe ich mich mich im Internet mal nach alternativen Nutzungsmöglichkeiten ungesehen.
Eine Möglichkeit ist das verwenden der Webcam als Überwachungskamera/Bewegungsmelder. Das Programm Motion kann so konfiguriert werden, dass es sobald sich etwas bewegt einen Film und/oder Bilder macht und diese auf der Festplatte ablegt. Mit einer integrierten Webcam macht das leider wenig Sinn, aber mit einer externen kann man sicher noch "interessante" Dinge anstellen.
Motion ist beim Ubuntu 8.10 schon im Repository dabei und kann so über apt installiert werden.
sudo apt-get install motion

Standardmässig nutzt Motion die Konfigurationsdate motion.conf im Ordner /etc/motion. Diese Datei ist für den Anfang schon recht gut und muss nicht mal gross abgeändert werden. Ich wollte zum Testen, dass Motion bei Bewegungen Fotos macht und diese auf der Festplatte ablegt, einen Film benötige ich nicht.

Darum habe ich in der motion.conf die folgenden Parameter angepasst:

Die Breite und Höhe der Webcam angeben:
width 480
height 320

Damit kein Foto geschossen wird, wenn das Licht ein- oder ausgeschaltet wird.
lightswitch 50

Videoaufnahme deaktivieren
ffmpeg_cap_new off

Den Pfad anpassen
target_dir /home/david/Motion


Gestartet wird nun mit dem Befehl motion in der Shell. Sobald das Programm läuft und man sich vor der Kamera bewegt, werden schon Bilder gespeichert:
[1] File of type 1 saved to: /home/david/Motion/01-20090119210732-00.jpg


Eine weitere praktische Sache ist, dass Motion standardmässig einen HTTP Server auf dem Port 8081 startet, auf dem man die Wercam beobachten kann. Aus Sicherheitsgründen kann man standardmässig aber nur vom Localhost darauf zugreifen.

CD-Image unter Linux mounten

Wenn man unter Linux ein CD-Image (.iso/.cue) usw. hat und darauf zugreifen will, muss man nicht unbedingt eine CD Brennen. Man kann das CD-Image ganz einfach mit dem zusätzlichen Parameter -o loop mounten und hat so den Inhalt in einem Ordner. Das sieht dann zum Beispiel so aus:
mount -o loop image.iso mount/

Linux mit Samba als Windows Domänenmitglied

Im Geschäft hatten wir eine USB-Festplatte, auf welcher wir sehr viele Bilder für die Katalogproduktion hatten. Das funktionierte recht gut, nur war es recht umständlich, da man die Festplatte immer wieder von einem Computer an den anderen anschliessen mussten. Die ideale Lösung ist also, wenn man die Bilder auf einem Server platziert, damit alle Leute darauf zugriff haben. Eine Bedingung ist, dass alle Leute die Bilder ansehen, aber nur bestimmte Mitarbeiter darauf zugreifen können.
Ich habe das ganze mit einem Linux-Server mit Samba gelöst, welcher an die Windows-Domain angeschlossen wurde. Hier nun eine kleine Anleitung, wie das bei mit funktioniert hat.

Ausgangslage

Domain: MUSTER.LOCAL
DNS-Server: 192.168.1.10

Domaincontroller
OS: Windows 2003 SP 2
Hostname: SERV01
IP: 192.168.1.10

Linux Server
OS: Ubuntu Linux 8.04 Server (2.6.24-16-server)
Hostname: SERV02
IP: 192.168.1.11

Software

Installiert werden muss Samba, Winbind und Heimdal. Bei mir in den folgenden Version (direkt über apt)
  • Samba 3.0.28a
  • Winbind 3.0.28a-1ubuntu4
  • heimdal-clients 0.7.1-1ubuntu3

Installation

Kerberos


Kerberos wird zur Authentifizierung am Windows-Server verwendet. Will sich also ein Benutzer am SERV02 anmelden, so sendet dieser die Anfrage an den SERV01 (PDC) weiter und erhält von dem die Nachricht, ob Benutzername und Passwort korrekt sind. So kann man direkt die Benutzer und Gruppen aus der Active-Directory verwenden, was die Benutzerverwaltung sehr vereinfacht. Kerberos ist im Packet Heimdal enthalten.
Konfigurieren muss man die Datei /etc/krb5.conf. Dazu muss man zuerst eine Realm (einen Bereich) konfigurieren und dort ein KDC (Kerberos Distribution Center) angeben und dann der Domain den Berich zuweisen. Wichtig ist hier, dass auf die Gross- und Kleinschreibung geachtet wird. Meine Konfigurationsdatei sieht so aus:
[libdefaults]
        default_realm = MUSTER.LOCAL
        clockskew = 300

[realms]
        MUSTER.LOCAL = {
                kdc = SERV01.MUSTER.LOCAL
        }

[domain_realm]
        .muster.local = MUSTER.LOCAL

[logging]
#       default = SYSLOG:NOTICE:DAEMON
        default = FILE:/var/log/krb/krb5libs.log
        kdc = FILE:/var/log/krb/kdc.log
        kadmind = FILE:/var/log/krb/kadmind.log

[appdefaults]
        pam = {
                ticket_lifetime = 1d
                renew_lifetime = 1d
                forwardable = true
                proxiable = false
                retain_after_close = false
                minimum_uid = 0
                debug = false
        }

Nun kann man mit dem Befehl kinit den Kerberos Client (Linux) am Server (Windows) authenifizieren. Dies funktioniert mit dem folgenden Befehl:
kinit Administrator@MUSTER.LOCAL

Wichtig ist wieder, dass auf die Gross- und Kleinschreibung geachtet wird und dass die Namensauflösung funktioniert. Ein ping auf serv01 sollte hier im Beispiel 192.168.1.10 zurückgeben.

Samba


Jetzt kann Samba über die Datei /etc/samba/smb.conf konfiguriert werden. Wichtig sind die Rot markierten Zeilen.
[global]
   workgroup = MUSTER
   server string =
   netbios name = serv02
   realm = MUSTER.LOCAL
   idmap uid = 10000 - 15000
   idmap gid = 10000 - 15000
   winbind separator = /
   winbind use default domain = yes
   password server = serv01.muster.local
   security = ADS
   client use spnego = yes
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d
   encrypt passwords = yes
   passdb backend = tdbsam
   obey pam restrictions = yes
   invalid users = root
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n *password\supdated\ssuccessfully* .
   socket options = TCP_NODELAY

  • workgroup: Die Arbeitsgruppe. Sollte gleich dem Domänennamen sein
  • netbios name: Der Netbios Hostname des Servers
  • realm: Der Bereich. Gleich dem Bereich in der Kerberos Konfiguration
  • idmap uid: Bereich der genutzt wird um die Domänenbenutzer auf die Linux Benutzer zu mappen
  • idmap gid: Bereich der genutzt wird um die Domänengruppen auf die Linux Gruppen zu mappen
  • winbind seperator: Das Trennzeichen zwischen der Domäne und dem Benutzer
  • winbind use default domain: Definiert, ob Winbind auch mit dem Benutzernamen arbeitet, wenn keine Domäne angegeben wurde.
  • password server: Der Server, welcher die Passwörter validiert.
  • security: Definiert, dass Samba als ADS Mitglied arbeiten soll
  • client use spnego: Aktiviert SMB Singing

Nun muss man den Samba Server noch in die Domäne aufnehmen. Das macht man seit Samba 3.* nicht mehr mit smbpasswd sondern mit dem net Befehl:
net join -S serv01 -UAdministrator%password


Wenn alles geklappt hat muss man Linux noch mitteilen, dass Benutzeranfragen an winbind weitergeleitet werden sollen. Dies macht man in der Datei /etc/nsswitch.conf. Dort muss man die Zeilen passwd und group anpassen. Sie sollten schlussendlich so aussehen:
passwd:         files winbind
group:          files winbind


Nach einem Neustart von Samba und Winbind kann man prüfen, ob die Konfigurationsarbeit erfolgreich war. Die folgenden Befehle sollten alle Benutzer, bzw Gruppen der Windows Domäne anzeigen.
wbinfo -u
wbinfo -g

Shares einrichten

Sollte bisher alles funktioniert haben, kann man jetzt die Shares im Samba einrichten. Ich habe einen Share names Bilder gemacht, auf welchen alle Zugriff haben, aber nur eine bestimmte Gruppe schreiben kann.
[bilder]
   comment = Bilder
   path = /home/bilder
   public = yes
   read only = no
   guest ok = no
   browseable = yes
   valid users = @muster/alle
   admin users = @muster/abteilung, muster/user


Hier noch die Unterschiede zwischen Lokalen-/Domänenbenutzen-/Gruppen.
# lokaler user
valid users = user

# domain user
valid users = muster/user

# lokale gruppe
valid users = @group

# domain gruppe
valid users = @muster/group

Quellen


Im Internet gibt es schon einige Anleitungen dazu. Hier möchte ich diejenigen Auflisten, die mich am meisten weitergebracht haben:
  • http://www.pro-linux.de/work/server/samba3-domaene.html
  • http://www.administrator.de/Samba_in_Windows_Dom%C3%A4ne.html