Archiv der Kategorie 'Praxis'

RBB-Videos abspeichern mit rtmpdump

Die Videos von rbb-online.de lassen sich unter Linux komfortabel per rtmpdump abspeichern: Auf der Seite, in der das Video eingebettet ist, Quelltext anzeigen, nach „mp4″ suchen, den Pfade wie z.B. „/klipp/klipp_20110830_wahl_m_16_9_512×288.mp4″ rauskopieren und damit rtmpdump aufrufen:

rtmpdump -r rtmp://stream5.rbb-online.de/rbb --playpath mp4:/klipp/klipp_20110830_wahl_m_16_9_512x288.mp4 -o output.flv

Die .flv-Dateien können z.B. per Mplayer oder VLC abgespielt werden.

Bluetooth Dial-up Networking in Debian

This post describes how to set up a GPRS/UMTS connection via Bluetooth Dial-up Networking in Debian Squeeze (and Wheezy).

Install bluetooth and ppp packages, if not installed yet:
sudo apt-get install bluetooth ppp

Add your user to usergroup dip to allow dialout (usage of pon/poff commands):
sudo adduser joseph dip

Activate bluetooth on your mobile and figure out its bdaddr:
hcitool scan

Look up channel of „Dial-up Networking“ – „RFCOMM“ (it seems that for most devices it’s channel 1):
sdptool browse 00:11:22:33:44:55

Edit /etc/bluetooth/rfcomm.conf (adjust bdaddr and channel):
rfcomm0 {
bind yes;
device 00:11:22:33:44:55;
channel 1;
}

Edit (create) /etc/ppp/peers/umts-bt (replace „internet.eplus.de“ with your provider’s APN):
debug
noauth
connect "/usr/sbin/chat -v -f /etc/chatscripts/gprs -T internet.eplus.de"
usepeerdns
/dev/rfcomm0 115200
defaultroute
crtscts
lcp-echo-failure 0

Reload bluetooth configuration:
sudo /etc/init.d/bluetooth restart

Set pincode for pairing (keep bluetooth-agent running in background/another window!):
bluetooth-agent 1234

Initiate ppp connection:
pon umts-bt

Now your mobile should show a prompt for the pincode. Enter it and pair. After some seconds the connection should be established and DNS servers and default routes have been configured to use the PPP connection (if no other connection like WiFi or Ethernet is active).

Disconnect:
poff

You can kill bluetooth-agent by pressing CTRL+C. In the future you won‘t need to start it again. pon umts-bt should be enough to establish a connection and poff to disconnect.
The device configuration is stored at /var/lib/bluetooth/BDADDR. You can delete this directory if you want to repeat the pairing/authorizing process.

Debugging

Check if /dev/rfcomm0 has been created (especially on error „… unrecognized option ‚/dev/rfcomm0′“ when doin pon umts-bt):
sudo rfcomm -a
(if this gives no output, check /etc/bluetooth/rfcomm.conf for syntax errors and do a sudo /etc/init.d/bluetooth restart)

Check if ppp0 exists and is connected (e.g. has some ip address assigned):
sudo ifconfig

Check the system log (in real-time):
sudo tail -f /var/log/syslog
If the connection was successful there should be a line with the assigned IP address. Alternatively you can use plog to check pppd’s output:
sudo plog -f

Check if the DNS servers have been set automatically:
cat /etc/resolv.conf


Note: As mobile I‘m using a N900. For this device the bluetooth-dun package must be installed on the mobile („Bluetooth Dial-Up Networking“ in App. Manager or apt-get install bluetooth-dun).
Note (2): Instead of naming the peer configuration file „umts-bt“, you can name it „provider“ (overwrite the original file) and you can connect with just pon instead ofpon umts-bt.

Verbrauch CRT-Monitor (Formac ProNitron 19/600 CPD-4403)

Auflösung [px] Frequenz [Hz] Helligkeitseinstellung Desktop [Farbe] Leistungsaufnahme [W]
1024×768 60 0 schwarz 76
1024×768 60 0 weiß 110
1024×768 85 0 schwarz 81
1024×768 85 0 weiß 116
1024×768 85 100 schwarz 88
1024×768 85 100 weiß 115
800×600 60 0 schwarz 75
800×600 60 0 weiß 108
800×600 85 0 schwarz 77
800×600 85 0 weiß 111
800×600 100 0 schwarz 80
800×600 100 0 weiß 113

Stromverbraucher im Haushalt

Ein paar grobe Messungen der Verbraucher im Haushalt (gemessen mit KD 302 von Reichelt):

Verbraucher Zustand Leistungsaufnahme [W]
(ggf. Schwankung)
Wasserkocher an 2140
Server: HP DL360 an 158,5 (+/- 21,5)
standby 21,5
Mixer: RG28s Stufe 1 bis 3 82,5 (+/- 7,5)
Kühlschrank kühlend 75
CRT-Monitor (19”, älteres Modell) an (weißer Text auf Schwarz) 73
standby 2,3
aus 0,1
Samsung P30 Netzteil laden 53
mit P30 an ohne Akku 24 (+/- 9)
mit P30 aus ohne Akku 1,6
ohne P30 0,7
VIA EPIA M1000 + 3,5” Platte an 37
MacBook 13″ an 28 (+/- 10)
standby 2,7
TFT: Samsung SyncMaster 901B an 23 (+/- 7)
standby 0,7
aus 0,6
Router WRT54G + Voip-Adapter Zyxel an 22
Drucker: HP LaserJet 4000N bereit 17
standby 17
RFT Amplifier SV 3900 an 10
USB-SATA/IDE-Adapter Netzteil mit Platte 6,6
ohne Platte 2
RFT Equalizer SM 3000 an 5,8
La Fonera an (ohne WiFi) 4,2
Netzteil alleine 1
Siemens M50 Ladegerät laden 3,3
aus 0,2
RFT Tuner ST 3900 an 2,3
aus 0,2
Nokia N900 Ladegerät laden 2 (+/- 0,1)

(nicht aufgeführte „aus“-Zustände: < 0,1 W)

Die Werte für die lade-Zustände vom Laptop und den Handies unterliegen vermutlich größeren Schwankungen während des gesamten Ladevorgangs.

Die rote Lampe einer Schaltsteckerleiste scheint < 0,1 W zu ziehen. :)

Der Energiesparmodus des LaserJets schien nur dem Marketing zu dienen.

Die Leistungsaufnahme von Netzteilen, wenn an ihnen keine Verbraucher angeschlossen sind, lässt sich tatsächlich grob an ihrer Wärmeentwicklung einschätzen: Beim Netzteil vom P30 (0,7 W ohne angeschlossenem P30) ist deutlich Wärme zu spüren, während das N900-Netzteil vollkommen kalt ist und < 0,1 W nimmt.

Genaue Aufschlüsselung des Verbrauchs des CRT-Monitors (Modell: Formac ProNitron 19/600 CPD-4403) in neuem Post.

Dual-Head: Desktoperweiterung mit xrandr

xrandr (von „Resize and Rotate Extension“) dient zum Konfigurieren der angeschlossenen Bildschirme. Mit xrandr lässt sich X auch so konfigurieren, wie was bisher mit Xinerama erreicht wurde (Desktoperweiterung durch mehrere nebeneinandergestellte Monitore).

Ein Aufruf ohne Argumente liefert die Outputs und wählbare Modi. Auf meinem MacBook mit angeschlossenem TFT sieht das etwa so aus:

$ xrandr
Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 2560 x 1024
VGA disconnected (normal left inverted right x axis y axis)
LVDS connected 1280x800+0+224 (normal left inverted right x axis y axis) 286mm x 179mm
   1280x800       59.9*+   60.0
   1280x768       60.0
[...]
TMDS-1 connected 1280x1024+1280+0 (normal left inverted right x axis y axis) 376mm x 301mm
   1280x800       60.0 +
   1280x1024      60.0*+   75.0     59.9     60.0*
TV disconnected (normal left inverted right x axis y axis)

TMDS-1 ist das externe Display, LVDS das integrierte (auch zu erkennen an den Auflösungen).

Die Konfiguration läuft nun z.B. so ab:
xrandr --output LVDS --mode 1280x800 --output TMDS-1 --off
…was das interne Display einschaltet und das externe deaktiviert, bzw. umgekehrt:
xrandr --output TMDS-1 --mode 1280x1024 --output LVDS --off

Mit --output wird also gewählt, was konfiguriert werden soll. Sollen mehrere Displays gleichzeitig konfiguriert werden, kann --output mehrmals angegeben werden, gefolgt von den entsprechenden Einstellungen (Rest siehe Manpage).

Soll der Desktop über beide Displays gehen, müssen beide Outputs aktiviert und ein entsprechender Versatz definiert werden:
xrandr --output LVDS --mode 1280x800 --pos 0x224 --output TMDS-1 --mode 1280x1024 --pos 1280x0
…hier ist es so, dass das Notebook links neben dem externen TFT steht und an dessen Unterkante ausgerichtet ist.

Damit das funktioniert, muss in der /etc/X11/xorg.conf in der entsprechenden Display-SubSection die virtuelle Auflösung definiert werden:

Section "Screen"
[...]
  SubSection "Display"
    [...]
    Virtual 2560 1024
  EndSubSection
EndSection

Damit diese Änderung wirksam wird, muss X neugestartet werden (also z.B. Abmelden und dann Ctrl+Alt+Backspace). Die ganzen Auflösungen müssen natürlich entsprechend der Displays angepasst werden.

Etwas bekloppt bei so Displays mit verschiedenen Vertikal-Auflösungen (bzw. unterschiedlichen Seitenverhältnissen) ist, dass es bei mir z.B. links oben einen Streifen von 1280×224 Pixeln gibt, der nicht benutzbar ist.

Bei manchen Anwendungen (irgendwelche Spiele), die im Vollbildmodus laufen und/oder versuchen von sich aus die Auflösungen zu verstellen kann es zu Problemen kommen. Da ist es meistens am sinnvollsten z.B. nur auf den externen Monitor umzuschalten.

Datenrettungsgeschichte

Ausgangssstatus:

  • sehr neue 500 GB Platte (Western Digital WD5000AAKB)
  • 4 Partitionen: System (10 GB), Swap (2 GB), Daten1 (1 GB), Daten2 (450 GB); Swap, Daten1 und Daten3 als logische Laufwerke innerhalb einer erweiterten Partition; alle NTFS; Windows XP

Fehler:

  • Nach nur 2 Monaten machte das System Probleme: Es hakte insgesamt; einige Programme ließen sich nicht mehr starten (u.a. Fehler über defekte DLL-Dateien); Netzwerkfreigaben waren nicht mehr zugreifbar; es ließen sich keine neuen Benutzer anlegen.
  • Nach Neuinstallation von Windows traten ähnliche Symptome auf.
  • Beim nochmaligen Versuch Windows neu zu installieren wurden im Setup die Partitionen nicht mehr erkannt. Rechner fuhr nicht mehr hoch.

Behebungs-/Rettungsversuche:

  • Auch Knoppix (von CD gebootet) sah die Partitionen nun nicht mehr. Es traten während des Bootens üble Festplatten-Fehler auf (AddrMarkNotFound; DriveReady SeekComplete DataRequest Error; UncorrectableError…).
  • leere externe 500 GB Platte besorgt um defekte Platte dumpen zu können; ext3-Dateisystem darauf angelegt
  • dumpen mit dd war erfolglos, da es, sobald ein Fehler kommt, komplett abbricht
  • (ab hier grml als Live-Linux benutzt; hat etliche Rettungstools mit drauf)
  • mit ddrescue (das macht trotz Lesefehlern weiter) versucht zu dumpen, jedoch abgebrochen, weil am Anfangsbereich der Platte anscheinend besonders viel kaputt war und es deshalb _extrem_ langsam war – höchstwahrscheinlich ist der Bereich, wo die Partitionstabelle lag, mit betroffen und deshalb erkennen die Systeme die Partitionen auch nicht mehr
  • da die System- und Swap-Partitionen am Anfang lagen und keine wichtigen Daten enthielten ddrescue anders aufgerufen um ungefähr die ersten 10 GB zu überspringen
  • ddrescue -v /dev/hda /mnt/temp/dump.bin /mnt/temp/log -i 11436756992
  • hat mit ca. 2 MB/s gedumpt und war daher erst nach 3 Tagen fertig; 50 MB Fehler sind aufgetreten
  • externe Platte an anderen Rechner angeschlossen
  • verschiedene Recovery-Tools erfolglos auf den Dump ausprobiert (u.a. testdisk) – unklar warum, evt. haben die Teile nen Problem mit, dass es kein kompletter Dump oder der Anfang komisch war

Erfolgreiches Wiederfinden der Partitionen:

  • Im Dump nach Markierungen für den Anfang von NTFS-Dateisystemen gesucht (".R.NTFS", wobei "." nichtdarstellbare Zeichen sind):
  • grep -a -b -o $‘\xeb\x52\x90\x4e\x54\x46\x53′ /media/disk/dump.bin | cut -d":" -f1 > grep_results.txt
  • grep brach irgendwann mit "Cannot allocate memory" ab; war jedoch nicht schlimm, da die wichtigen Partitionsgrenzen (Anfang von Daten1 und Daten2) schon gefunden wurden (bei einem Rechner mit 4 GB RAM)
  • alle Offsets aus grep_results.txt durchprobiert: jeweils ein readonly-loopback-Device mit entsprechendem Offset angelegt und versucht zu mounten – z.B.:
  • losetup /dev/loop0 /media/disk/dump.bin -r -o 1444063744
  • mount /dev/loop0 /mnt/temp2

Überlegungen/Anmerkungen:

  • Bei mir waren die Fundstellen 1444030976, 1444063744, 2521542656 und 2521575424. Da diese Paare (z.B. 1444030976 und 1444063744) zu dicht nebeneinander liegen (32 KB), als dass sich dazwischen eine Partition befinden könnte ist es naheliegend, dass 1444063744 und 2521575424 die echten Offsets sind. Evt. waren das Kopien des Boot/Superblocks der jeweils vorhergehenden Partition. Das soll wohl bei NTFS am Partitionsende gespeichert sein.
  • Vermutlich sind die fehlerhaften 50 MB nun noch irgendwo im Dump verteilt und einzelne Dateien zerstört.
  • Wenn im Dateisystem vorher Images von NTFS-Dateisystemen lagen könnte dies den Suchvorgang natürlich durch viele fehlerhafte Fundstellen verkomplizieren.
  • Ich hab keine Ahnung, wie sich das mit dem Partitionsende beim Loopback-Device verhält (es wird ja nur das Offset und keine Länge angegeben). Hängt vielleicht auch vom Dateisystem ab, ob es da zu Problemen kommen kann. Zumindest sollte man nicht drauf rumschreiben, daher bei losetup die Option -r für readonly.

Authentifizierung mit SSL Client-Zertifikaten

Eine ganz minimalistische Beispielkonfiguration:


<virtualhost domainname:443>
ServerName domainname
DocumentRoot /var/www/domainname

SSLEngine On
SSLCertificateFile ssl/apache.crt
SSLCertificateKeyFile ssl/apache.key
SSLCACertificateFile ssl/ca.crt
SSLVerifyClient require
SSLOptions +StdEnvVars
</virtualhost>

StdEnvVars verursacht, dass als Umgebungsvariablen bei CGI-Scripten auch die SSL-Daten gesetzt werden, um z.B. den CN des Client-Zertifikats auszulesen.

ssl/ca.crt heißt übrigens, dass die Datei dort liegt: /etc/apache2/ssl/ca.crt, weil das ServerRoot entsprechend auf /etc/apache2 gestellt ist.

Zeilenenden ins „Unix-Format“ umwandeln

\r’s (CR, 0×0D) aus einer Textdatei entfernen, um Zeilenumbrüche auf ein einfaches \n (LF, 0×0A) zu ändern:
tr -d '\015' < windowsformat.txt > unixformat.txt

Selbstsigniertes SSL-Zertifikat erstellen

Weil ich die genauen Parameter jedes Mal vergesse und openssl zu viele hat statt schnell nachschlagen zu können… Creating a self-signed SSL-certificate.

openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.crt -keyout /etc/apache2/ssl/apache.key

Die Direktiven um sie in Apache festzulegen sind SSLCertificateFile (für apache.crt) und SSLCertificateKeyFile (für apache.key).

PHP, SuExec und mod_fcgid (FastCGI) unter Debian

Um in einer Shared Hosting Umgebung sicherzustellen, dass die unterschiedlichen Benutzer nicht gegenseitig auf ihre Dateien zugreifen können muss beachtet werden, dass PHP- bzw. generell CGI-Scripte im Kontext des Benutzers ausgeführt werden, und nicht alle unter der ID des Webservers (www-data) laufen. Eine Möglichkeit dafür stellt SuExec bereit, was in der apache2-Standardinstallation von Debian bereits enthalten ist.
Die folgende Schrittfolge habe ich auf einem frischen absolut minimalistischen Debian Etch getestet (ca. 390 MB nach der Installation der hier beschriebenen Pakete) .

Nötiges Zeugs installieren und SuExec-Modul aktivieren

aptitude install php5-cgi apache2 libapache2-mod-fcgid
a2enmod suexec

(nicht libapache2-mod-fastcgi, das ginge wohl auch, wird aber etwas anders konfiguriert)

User anlegen:

useradd --create-home --home-dir /var/www/user1 user1
passwd user1

Apache VirtualHost-Config für user1 einrichten:

vi /etc/apache2/sites-available/testvhost

Inhalt:

<virtualhost *>
        ServerName testvhost
        DocumentRoot /var/www/user1/htdocs/testvhost
        SuexecUserGroup user1 user1
        <directory /var/www/user1/htdocs/testvhost>
                Options +ExecCGI
                AddHandler fcgid-script .php
                FCGIWrapper /var/www/user1/php5-cgi .php
        </directory>
</virtualhost>

Site aktivieren:

a2ensite testvhost

Wrapper-Script erstellen:

echo '#!/bin/sh' > /var/www/user1/php5-cgi
echo 'exec /usr/bin/php5-cgi "$@"' >> /var/www/user1/php5-cgi
chown user1:user1 /var/www/user1/php5-cgi
chmod 0700 /var/www/user1/php5-cgi

Apache neustarten:

/etc/init.d/apache2 restart

als user1 einloggen

mkdir -p ~/htdocs/testvhost
echo "< ? passthru('id'); phpinfo(); ?>“ > ~/htdocs/testvhost/index.php

im Browser Testen – http://testvhost/

Statt testvhost muss natürlich überall der entsprechende Domainname eingetragen werden, oder testvhost mit der entsprechenden IP des Servers in die /etc/hosts.

Hinweise:

  • Das Document Root des Users ist nicht ohne grund in /var/www. – SuExec ist standardmäßig so kompiliert, dass nur Scripte ausgeführt werden können, die sich dort befinden.
  • Es darf kein mod_php mehr aktiv sein.
  • Da das Wrapper-Script dem User gehört (gehören muss), ist es ihm möglich darüber beliebige Programme als CGI-Script zu starten.
  • Um gegenseitiges Lesen von Dateien zu verhindern müssen noch andere Maßnahmen vorgenommen werden. Beispielsweise sollten die Dateien der User maximal die Berechtigungen 0770 haben (dafür wäre eine Umstellung der umask auf 027 oder so ähnlich sinnvoll). Damit Apache dann noch die Dateien lesen kann, sollte der www-data Benutzer in der Gruppe des Users sein.
  • Andere Parameter zum optimieren von mod_fcgid sind hier dokumentiert: http://fastcgi.coremail.cn/doc.htm