skweez.net

Alles skweez?

1001111001011101011101000011001

Alles aus der Kategorie “Deutsche Beiträge”

04.02.2012

Strom sparen mit skweez

von mks.

Trafonetzteil, unbelastet: 7W

Mir ist gestern bei meinem Kabelmodem aufgefallen, dass dieses wie einige andere Netzwerkgeräte ein Netzteil mit 12V und 1A am Ausgang hat. Im Gegensatz zu den anderen Geräten wurde es mit einem Schaltnetzteil (SNT), statt so einem klobigen Trafonetzteil (TNT), geliefert. Die Stecker sind bei allen gleich.

Darum habe ich mal einen einfachen Test mit einem Strommessgerät gemacht, wobei ich nicht sagen kann, wie präzise das Gerät arbeitet. Aber wenn die Anzeige nur annähernd stimmt, dann lohnt sich die Anschaffung von neuen Netzteilen für die älteren Geräte, die ich in absehbarer Zeit nicht ablösen möchte. Eines der TNT verbraucht schon ohne angeschlossenes Gerät 7W, beim SNT zeigt das Messgerät 0 an. Mit angeschlossenem Modem verbraucht das andere TNT satte 16W, das SNT 7W.

Die ersten Fotos zeigen jeweils die unbelasteten Netzteile, die folgenden sind mit angeschlossenem Modem.

Wenn die beiden Trafonetzteile, die ich in meinem Haushalt gefunden habe, zusammen nur 10W mehr verbrauchen als zwei SNT, dann sind das bei mir im Jahr ca. 50kW/h. Das macht bei meinem aktuellen Stromtarif ca. 12€ p.a. Beim Inernetauktionär gibt es passende SNT für ca. 5€ je Stück.

Die Basisstation meines DECT-Telefons braucht auch ca. 7W. Ich teste gerade, ob es praktikabel ist, das Android-Handy mit einem SIP-Client als Festnetz-/WLAN-Telefon zu benutzen. Meine ersten Tests mit CSipSimple verliefen positiv. Das Handy verbraucht dadurch sicher etwas mehr Strom, aber bestimmt keine 7W.

Ich denke mal, die Geldbeträge erscheinen vielen lächerlich, aber mir geht’s auch eher um’s Prinzip und ich dachte ich teile die Erfahrungen mal, vielleicht bringt das jemandem was.

PS: Alte Netzteile gehören nicht in den Hausmüll, sondern auf den Wertstoffhof!

20.09.2011

Ergänzung: Grub 2 in GPT/BIOS-Systemen

von mks.

Dieser Artikel ist eine kurze Ergänzung zu meinem Artikel über GUID-Partitionstabellen auf BIOS-Systemen.

Ich habe festgestellt, dass die Unterstützung für extlinux unter Ubuntu (10.04 „Lucid“) eher … naja … mau ist. Wenn man auf einem so installierten System stattdessen Grub benutzen will, benötigt man eine kleine Partition, z.B. von einem MB Größe, mit dem Partitionstyp EF02 („BIOS-Boot-Partition“).

Hintergrund: Da Grub zu groß ist, um komplett in den Boot-Sektor zu passen, ist er in einen Stage 1 und einen Stage 2-Loader aufgeteilt. Der Stage 2-Loader wird normalerweise in einen kleinen freien Bereich zwischen Master Boot Record und erster Partition geschrieben. Da es diesen Bereich aber auf einem GPT-System nicht gibt, quittiert Grub den Versuch einer Installation mit der Warnmeldung:

Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged.

Hat man die o.g. extra Partition angelegt, kann man Grub wie gewohnt mit grub-install installieren.

07.07.2011

BIOS wiederherstellen mit Arduino

von mks.

Vor einiger Zeit habe ich mein nur wenige Monate altes Mainboard gebrickt, indem ich versehentlich eine falsche BIOS-Version eingespielt habe. Leider kam die Erleuchtung zu spät: Never change a running system! Gut, dass ich noch ein Notebook habe und dass ich eh schon immer mal etwas mit einem Arduino machen wollte. Jetzt schien mir die richtige Gelegenheit dafür.

Warnung: Der Artikel ist etwas lang. Für Individuen der Twitter-Generation mit einer auf 140 Zeichen verkürzten Aufmerksamkeitsspanne hier die Kurzform:

Hab es geschafft: #bios #flashen mit #Arduino https://github.com/michaelkanis/arduino_bios_flash

Vorbereitung

Zunächst war ich mal erleichtert, als ich gesehen habe, dass der Chip gesockelt und nicht gelötet ist. Das machte das Vorhaben um einiges einfacher. Den Aufkleber des Mainboard-Herstellers vom Chip entfernt, gibt dieser seine Typenbezeichnung preis. Wenn man ein bisschen nach den vielen Nummern googlet, findet man schnell raus, um welchen Chip es sich handelt. Meiner ist ein Macronix MX25L8006E. Eine Makroaufnahme mit einer einfachen Digicam hilft, die winzige Schrift lesbar zu machen.

Das Datenblatt des Herstellers erwies sich als sehr hilfreich. Erste Erkenntnis: der Chip wird per Serial Peripheral Interface (SPI) angesprochen. Der Arduino unterstützt dieses Protokoll ebenfalls von Haus aus. Würde er das nicht, könnte man es per Bit-Banging implementieren.

Mein größtes Problem war nun, dass der Arduino mit 5V-Pegeln arbeitet, der Macronix-Chip aber nur 3,3V-Pegel unterstützt. Das Risiko, den Chip durch eine zu hohe Spannung zu zerstören, wollte ich angesichts der schweren Beschaffbarkeit in Deutschland nicht eingehen. Allerdings bin ich Software-Entwickler und kenne mich im Prinzip überhaupt nicht mit Elektronik aus. Das nur als Anmerkung, falls jemand meine Lösungsversuche saudämlich findet. :-)

Meine grundlegende Vorgehensweise sollte so aussehen: Schaltung aufbauen. Software schreiben in drei Schritten: Chip auslesen, löschen, neu beschreiben. (EEPROM-Chips werden in zwei Schritten zunächst gelöscht und können dann erst neu beschrieben werden)

Erster Versuch: Spannungsteiler

Eine einfache Möglichkeit, aus einer höheren Spannung eine Niedrigere zu machen, ist ein Spannungsteiler. Weil ich mehrere Leitungen absenken musste, entschied ich mich, stattdessen den Ground-Level zu erhöhen. Da der erhöhte Ground-Level nun die LOW-Spannung auf ca. -1,7V abgesenkt hat, habe ich Dioden eingebaut, die daraus wieder 0V machen sollten. Nach einigem Basteln hatte ich nun eine scheinbar funktionstüchtige Schaltung. Natürlich habe ich den Chip erst eingesteckt, nachdem ich mit dem Multimeter sämtliche Spannungen an allen Pins (mehrmals) überprüft hatte.

Das Schreiben der Software zum Auslesen des Chips ging relativ flott, hier war ich wieder in “meinem Element”. Zunächst sah es auch so aus, als wäre ich am Ziel. Das Auslesen klappte. Meistens. Manchmal. Irgendwie nicht zuverlässig. Bits gingen verloren. Mist.

Die Lösung: Zufall

Durch Zufall fand ich heraus, dass mein Arduino auf den 5V-Leitungen nur 3,3V ausgibt, wenn man ihn mit einem Netzteil statt über USB mit Strom versorgt, obwohl das Netzteil auch 5V hat. Ob das ein Bug oder ein Feature ist, weiß ich nicht, für mich ist es ein Feature. Da ich die USB-Verbindung trotzdem brauchte, um die BIOS-Datei zum Arduino zu übertragen, kappte ich in einem USB-Kabel die 5V-Leitung. Dann entfernte ich den Spannungsteiler und schloss den Chip direkt an den Arduino an. Jetzt klappte das Auslesen reproduzierbar perfekt. Was ich jetzt noch brauchte, war ein Stück Software auf Laptop-Seite, dass dem Arduino das BIOS in kleinen Happen schickt und wartet, da der BIOS-Chip zum flashen eine gewisse Zeit braucht. Nach ca. 10 Minuten war der Chip neu geflasht und mein Rechner startete wieder. Die Performance wäre vielleicht noch ausbaufähig, aber ich war ja am Ziel. Deswegen ist die Software auch nicht sonderlich schön. Insbesondere fehlt jede Fehlerbehandlung. Ich stelle sie trotzdem auf Github, vielleicht kann sie ja mal noch jemand gebrauchen. Lizenz: Beerware. Tut damit, was Ihr wollt und flattrt mir ein Bier, wenn Ihr mögt. Oder auch nicht. Gewähr gibt es natürlich keine, wenn ihr damit mehr kaputt macht, seid ihr selbst Schuld. :-)

Falls jemand mit Ahnung von Elektronik das hier liest: Warum klappt es mit dem Spannungsteiler nicht? Ist da ein Bauteil zu langsam? Ich habe auch gelesen, dass man aus so einer Schaltung nicht viel Strom ziehen darf. Könnte es daran liegen?

Könnte man stattdessen in jeder Leitung drei Silizium-Dioden in Reihe vorschalten, um die Spannung um (3 * 0,6V) = 1,8V auf 3,2V zu verringern?

20.04.2011

Dokumente in Dropbox verschlüsseln

von mks.

Wie viele andere auch, verwende ich Dropbox, um Daten zwischen meinem Laptop und dem Desktop-Rechner abzugleichen. Außerdem bietet es eine einfache Möglichkeit, schnell mal jemandem eine Datei zur Verfügung zu stellen oder mit Freunden zusammen zu arbeiten.

Nun habt ihr in den letzten Tagen sicher mitbekommen, dass der Anbieter seine AGB geändert hat, die es nun erlauben, dass US-Behörden darauf Zugriff erlangen können.

Diese Gelegenheit möchte ich nutzen, um euch zu zeigen, wie ihr sehr schnell und einfach mit Ubuntu-Bordmitteln einzelne Ordner in eurer Dropbox verschlüsseln könnt. Nachdem euch ubuntuusers-Blogger benni schon gezeigt hat, wie es mit TrueCrypt geht, zeige ich euch den Weg mit EncFS. Ich nutze das konkret so: die Dropbox enthält einen Dokumente-Ordner, in dem die verschlüsselten Daten liegen. Ohne das zugehörige Passwort kann auf diese Daten niemand zugreifen. Das schützt natürlich nicht vor Entführung in einen Folterknast. Dieser Ordner ist in den normalen Dokumente-Ordner im Home eingehängt.

Und so gehts

Ihr braucht lediglich 5 Minuten Zeit und encfs aus dem Software Center (falls nicht ohnehin installiert).

# Dokumente sichern, wenn ihr schon einen solchen Ordner habt
mv Dokmente Dokumente.bak
# Hier landen die verschlüsselten Daten:
mkdir Dropbox/Dokumente
# Und hier könnt ihr ganz normal drauf zugreifen:
mkdir Dokumente
encfs Dropbox/Dokumente Dokumente
→ p für Paranoiamodus ;)
→ 2x Passwort eingeben
# Jetzt noch die alten Dokumente verschieben, Fertig!
mv Dokumente.bak/* Dokumente/
# Ggfs. Versteckte Dateien nicht vergessen!

Achtung, im Paranoiamodus funktionieren Hardlinks nicht!

Sieht aus wie Datenschrott: EncFS bei der Arbeit

EncFS vs. TrueCrypt

Bei Lösungen wie TrueCrypt legt man einen Container an, ein verschlüsseltes Festplatten-Image, wenn man so will. EncFS dagegen verschlüsselt transparent einzelne Dateien. Beides hat Vor- und Nachteile. Da der TrueCrypt-Container auf Dateisystemebene als eine Datei erscheint, muss auch immer der ganze Container synchronisiert werden, sobald sich ein Teil seines Inhalts ändert. In den Kommentaren haben mich zwei aufmerksame Leser darauf hingewiesen, dass Dropbox von einem TrueCrypt-Container auch nur die veränderten Teile abgleicht, allerdings erst, nachdem der Container ausgehängt wurde. Da EncFS die einzelnen Dateien verschlüsselt, können diese auch einzeln synchronisiert werden.

Und sonst …

EncFS gibt es dank MacFUSE auch für Mac OS X. Für Windows gibt es ein kommerzielles Produkt namens BoxCryptor, dass angeblich kompatibel zu EncFS ist. Vom Einsatz einer Closed-Source-Software für diesen Zweck würde ich aber aus nahe liegenden Gründen abraten.

Update: Ich möchte noch auf zwei verwandte Projekte hinweisen, auf die ich direkt oder indirekt dank der Kommentare gekommen bin. Das eine ist gnome-encfs, welches EncFS-Passwörter im Schlüsselbund speichert und die Dateisysteme beim Login automatisch mounten kann. Das andere ist eCryptfs, das EncFS nicht ganz unähnlich zu sein scheint, aber als Dateisystem im Kernel implementiert ist.

Danke für’s Lesen und bis zum nächsten Mal. Kommentare sind wie immer kostenlos und herzlichst willkommen. ;)

20.04.2011

Tonspuren vertauschen

von ritze.

Seit einiger Zeit habe ich ein Video auf meiner Festplatte herumliegen, dessen zwei Tonspuren vertauscht sind. Das heißt konkret, dass die erste Tonspur die Englische und die zweite die Deutsche ist. Nun möchte ich aber, dass die erste Tonspur die Deutsche ist und die zweite die Englische. Was also tun? Zuerst versuchte ich es mit dem Videobearbeitungswerkzeug Avidemux. Schnell musste ich jedoch feststellen, dass diese Funktion leider noch nicht im Programm implementiert ist und nur über Umwege erreichbar ist. Als weiteres mögliches Werkzeug ffmpeg ein. Der Vorteil, den man unter Linux zu schätzen gelernt hat: Es läuft alles komplett im Terminal ab.

Nach mehrmaligem Nachschlagen im Handbuch von ffmpeg und ein paar hoffnungslosen Versuchen hatte ich die benötigten Optionen zusammen:

ffmpeg -i input.avi -vcodec copy -acodec copy -map 0:0 -map 0:2 -map 0:1 output.avi -acodec copy -newaudio

Dabei wird nichts anderes gemacht, als dass der Videostream und die beiden Audiostreams kopiert werden und der zweite Audiosteam an der Stelle des Ersten verrückt wird (-map 0:2) und den ersten Audiostream dafür an zweiter Stelle (-map 0:1). -map 0:0 ist der Videosteam und -newaudio am Ende der Zeite ist nötig, damit das neue Video output.avi zwei Tonspuren besitzt.

Soweit, so gut. Die neue Videodatei hatte alle Kriterien erfüllt. Die Sache hatte jedoch einen Haken: Sowohl die Deutsche als auch die Englische Tonspur wurden mit dem VLC Media Player alles andere als normal wiedergegeben. Ich meine, in meinen Nachforschungen in den Tiefen des Internets auch irgendwo sogar gelesen zu haben, dass das ein Bug von ffmpeg sei. Leider habe ich die Seite nicht mehr parat.

Bekanntermaßen sind aller guten Dinge drei. Demzufolge weiter zum dritten Anlauf: Zuerst exportiere ich die erste Tonspur, danach die zweite und erst dann wird das neue Video mit den zwei exportierten Tonspuren erstellt. Fragt mich nicht warum. Aber dieser Weg ist im Gegensatz zum ersten Anlauf mit ffmpeg geglückt.

ffmpeg -i input.avi -vn -acodec copy audio1.mp3
ffmpeg -i Sinput.avi -vn -acodec copy -map 0:2 audio2.mp3
ffmpeg -i input.avi -vcodec copy -i audio2.mp3 -acodec copy -i audio1.mp3 output.avi -acodec copy -newaudio

08.04.2011

Backups mit Back In Time in Linux

von christoph.

Bildschirmfoto nach Backup

Irgendwann ist es bei jedem Computer so weit: Man braucht einen neuen. Nur meistens kündigt der Computer nicht davor an: “Kopiere die Daten auf eine externe Festplatte, nächste Woche gehe ich kaputt.” :)
Um zu vermeiden, dass auf einmal alle persönlichen Dateien verloren gehen, sollte man regelmäßig Backups der Festplatte anlegen. Doch bei regelmäßigen Sicherungen von Hand ist das Problem, dass man immer wieder alle Daten kopieren muss und die alten Backups, falls man nicht sehr viel Speicherplatz verbrauchen will, löschen muss.

Aus diesem Grund habe ich das Backup-Tool Back In Time (das auch u.a. in den Standardpaketquellen von Ubuntu als “backintime-gnome” und “backintime-kde” verfügbar ist) getestet und möchte hier kurz meine Erfahrungen schildern.

Gestartet habe ich das Programm mit root-Rechten, um auch andere Verzeichnisse als das home-Verzeichnis sichern zu können.

Achtung: Ein Programm mit root-Rechten zu starten bringt immer gewisse Risiken mit sich!

Beim Start wird außer dem Hauptfenster auch ein Einstellungsfenster geöffnet. In diesem Fenster muss folgendes geändert werden:

Konfiguration: Speicherort für Festplatte
Konfiguration: Zeitplan: ich habe mich für “Deaktiviert” entschieden, weil ich meine externe Festplatte nicht immer angeschlossen habe
Einbeziehen: hier habe ich mich für mein home-Verzeichnis, /opt und /etc entschieden.
Ausschließen: In meinem Fall ist das einzige, das nicht gesichert werden soll, die virtuelle Festplatte von Windows-XP, das ich mit VirtualBox benutze. Die würde bei jedem Backup immer wieder neu kopiert werden und das würde zu viel Speicherplatz verbrauchen. Diese Daten kann man ja immer noch direkt in XP sichern.
Automatisch entfernen: hier habe ich das Häkchen vor “Älter als:” entfernt.

Nachdem man auf “OK” und dann im Hauptfenster auf den Knopf links oben geklickt hat, wird das Backup erstellt. Nach einiger Zeit (~45min) war das Backup bei mir fertig. Bei einem Blick auf /media/<Festplatte>/backintime kann man sehen, dass die Dateien beim ersten Backup “einfach” kopiert werden und bei Bedarf so auch ohne installiertes Back In Time eingesehen werden können.

Fazit: Back In Time ist ein einfach zu bedienendes Backup-Programm. Es hat (anscheinend) keine Möglichkeit, das Verzeichnis auf der Festplatte zu verschlüsseln oder zu komprimieren. Und ohne (komprimierte) Archive kann man auch leichter ohne installiertes Back In Time in anderen Betriebssystemen auf das Backup zugreifen.
Die Wiederherstellungsfunktion habe ich noch nicht getestet, hoffentlich werde ich das auch nicht so bald tun müssen. :)

20.12.2010

GNOME Contacts (GUI-Entwurf)

von mks.

GNOME Contacts: Details
Dieser Artikel kommt etwas verspätet, weil ich in den letzten Tagen zu faul war. :-)

Vor ein paar Wochen habe ich mit einigen anderen Münchner GNOME-Interessierten ein Hackfest abgehalten. Eigentlich war es mehr ein “Designfest”, da wir kaum Code geschrieben haben. Das Ziel war, die Oberfläche für eine neue Adressbuchanwendung für GNOME zu entwickeln. Wir sind der Meinung, dass die derzeit existierenden Anwendungen hierfür einfach nicht sonderlich gut sind. Die meisten haben keine einfach zu bedienende Oberfläche (Evolution) und/oder es fehlt die Integration mit dem restlichen Desktop (Thunderbird).

Evolution-Data-Server existiert zwar als gemeinsamer Datenspeicher für diesen Zweck, scheint uns aber zu unflexibel. Darüberhinaus gibt es die libfolks, die aber noch kein Speichern erlaubt. Eventuell werden wir dieses Thema in einem zukünftigen Hackfest angehen.

Bei dem zurückliegenden Event ging es aber erstmal nur um die Oberfläche, denn auch hier hapert es bei den aktuell vorhandenen Anwendungen. Wer nicht weiß, was ich meine, muss nur mal das Evolution Adressbuch aufmachen. ;-)

Nach unzähligen Iterationen haben wir vier wesentliche Lösungsansätze für die Oberfläche identifiziert.

  • Die Übersicht in einer Art Liste oder einer Tabelle. Detailansicht auf einen Doppelklick hin in einem eigenen Dialog. Wir sind schnell zu der Überzeugung gelangt, dass ein extra Dialog die uneleganteste Lösung hierfür ist und haben diesen Ansatz erstmal verworfen.
  • Übersicht wie im ersten Ansatz, aber die Detailansicht im selben Fenster mit einem Zurück-Button, so wie im Bild oben.
  • Die Details direkt “inline” in der Tabelle anzeigen, wenn ein Kontakt ausgewählt ist.
  • Ein 3-Spalten-Ansatz für Gruppen, Kontakte und Details, ähnlich wie in der Contacts-Anwendung in NeXTStep und Mac OS X.

Die Entwürfe im Detail haben Salomon und Daniel zusammengefasst (auf Englisch). Die SVGs liegen auf Github.

Über konstruktive Kommentare (hier auf der Website gern auch ohne Anmeldung und anonym), was Ihr gut und schlecht findet, würde ich mich, wie immer, freuen.

19.12.2010

Heise News Feed Fix 0.4

von elm.

So, nach langer langer Zeit kommt mal wieder ein Update für mein Heise News Feed Fix Script. Das Script weißt jetzt jedem Artikel eine eindeutige ID zu und aktualisiert Artikel, die ein Update erhalten. Außerdem kann man mit dem Script jetzt mit dem Parameter url verschiedene Feeds der Heiseseite auswerten. Um z.B. den Feed von Heise Open mit Inhalt zu füllen, ruft man http://example.com/feed.php?url=http://www.heise.de/open/news/news-atom.xml auf. Gibt man keine URL an, wird der Hauptfeed von Heise benutzt.

Die Datumskorrektur habe ich wieder ausgebaut, da es nicht mehr so aussieht als ob Heise das Datum der Artikel ändert. Vielleicht liegt dass jetzt auch an der ID, dass das richtig erkannt wird.

Danke auch an Mark, der mich auf einen Bug hingewiesen hat.

<?php
// Heise Feed Version 0.4
header("Content-type: text/xml; charset=UTF-8");
define('CACHEFOLDER','feed');
define('FEEDINTERVAL',600);
define('MAXARTIKELS',100);
 
$feedUrl = urlencode('http://www.heise.de/newsticker/heise-atom.xml');
 
if( $_GET["url"] ) {
        $feedUrl = urlencode($_GET["url"]);
}
 
if( $_GET["do"]=="reload" ) $do_reload = true;
if( $_GET["do"]=="sync" ) $do_sync = true;
 
# Do not diplay xml errors
libxml_use_internal_errors(true);
 
function getID($url) {
        preg_match('/-([0-9]+)\.html/', $url, $id);
        return $id[1];
}
 
function getArtikel($url, $id, $date, $forceReload) {
        if(!$forceReload and file_exists(CACHEFOLDER."/".$date."-".$id.".txt")) {
                $artikelFertig = file_get_contents(CACHEFOLDER."/".$date."-".$id.".txt");
        } else {
                $doc = new DOMDocument();
                $artikel = mb_convert_encoding(file_get_contents($url), 'HTML-ENTITIES', "UTF-8");
                $doc->loadHTML($artikel);
                $divs = $doc->getElementsByTagName('div');
 
                $artikelFertig = 'Konnte Artikelinhalt nicht finden.';
 
                $newDoc = new DOMDocument();
 
                foreach ( $divs as $div ) {
                        if( $div->hasAttribute('class') && $div->getAttribute('class') == 'meldung_wrapper' ) {
                                $newDoc->appendChild($newDoc->importNode($div,true));
                        }
                }
                $artikelFertig = $newDoc->saveHTML();
                $artikelFertig = strip_tags($artikelFertig, '<span><a><pre><b><br><em><ul><li><hr><p><img><strong><table><tbod<><td><tr>');
                $artikelFertig = str_replace("\"/","\"http://www.heise.de/",$artikelFertig);
                $artikelFertig = htmlspecialchars($artikelFertig);
 
                if(!file_put_contents(CACHEFOLDER."/".$date."-".$id.".txt",$artikelFertig)) die();
        }
        $files = glob(CACHEFOLDER."/*.txt");
        while(count($files) > MAXARTIKELS) {
                unlink($files[2]);
                $files = glob(CACHEFOLDER."/*.txt");
        }
        return $artikelFertig;
}
 
$cacheFile = CACHEFOLDER."/".$feedUrl.".txt";
 
if($do_reload or $do_sync or !file_exists($cacheFile) or time() - filemtime($cacheFile) > FEEDINTERVAL) {
        $xml = DOMDocument::load(urldecode($feedUrl));
        $entrys = $xml->getElementsByTagName('entry');
 
        $xml->getElementsByTagName('link')->item(1)->attributes->item(1)->nodeValue="http://example.com/feed.php";
 
        for ($i=0; $i < $entrys->length; $i++) {
                $entry = $entrys->item($i);
                $url = str_replace('/from/atom10', '', $entry->getElementsByTagName('id')->item(0)->nodeValue);
                $id = getID($url);
                $date = $entry->getElementsByTagName('updated')->item(0)->nodeValue;
 
                # Set unique id.
                $entry->getElementsByTagName('id')->item(0)->nodeValue = 'http://www.heise.de/'.$id;
 
                # Create content element and fill it with content
                $content = $xml->createElement('content');
                $entry->appendChild($content);
 
                $entry->getElementsByTagName('content')->item(0)->setAttribute('type','html');
 
                $forceReload = false;
                if($do_reload or preg_match("/update/i",$entry->getElementsByTagName('title')->item(0)->nodeValue)) {
                        $forceReload = true;
                }
 
                $artikelInhalt = getArtikel($url, $id, $date, $forceReload);
                $entrys->item($i)->getElementsByTagName('content')->item(0)->nodeValue = $artikelInhalt;
        }
        $feed = $xml->saveXML();
        file_put_contents($cacheFile, $feed);
        echo $feed;
} else {
        echo file_get_contents($cacheFile);
}
 
# Clear xml errors
libxml_clear_errors();
?>

11.12.2010

Schöner Bootvorgang auf Ubuntu

von mks.

Ubuntu kommt seit 10.04 mit Plymouth daher, um den Bootvorgang zu verschönern. Leider hat das noch auf keinem von mir getesteten Rechner von Haus aus funktioniert. Ich bekam immer nur das Textmodus-Thema von Plymouth angezeigt, manchmal zumindest in der richtigen Auflösung. Ich weiß nicht, ob das andere auch betrifft, oder ob das standardmäßig eigentlich funktionieren sollte. Dieser Artikel ist für alle, denen es wir mir geht.

Wie immer gibt es keine Garantie, dass diese Anleitung bei Dir funktioniert! Sollte etwas schiefgehen, mit einer Live-CD booten und das vorher gemachte Backup wieder einspielen!

In die Datei /etc/initramfs-tools/modules sollte man folgende Zeilen aufnehmen, um möglichst früh die ideale Auflösung zu bekommen:

drm
nouveau

Anschließend das initramfs neu generieren:

update-initramfs -k `uname -r` -u

Das bewirkt, dass die beiden Module in das initramfs kopiert werden. Somit wird der Treiber gleich nach dem Kernel in den Speicher geladen und man bekommt so früh wie möglich die richtige Auflösung.

Bei mir hat dann noch ein Plymouth-Thema gefehlt. Dieses kann man einfach über Synaptic installieren. Im Wiki von ubuntuusers gibt es eine Übersicht.

In dem Rechner, an dem ich das gemacht habe, steckt eine NVIDIA GeForce FX. Intel und ATI/AMD-Karten sollten aber auch funktionieren. Statt nouveau muss man dann entsprechend i915 bzw. radeon in die o.g. Datei eintragen. Im allgemeinen funktioniert das aber nur mit den Open Source-Treibern, da die proprietären Grafiktreiber von AMD und NVIDIA KMS nicht unterstützen.

Kommentare über (Mis-)Erfolge auf verschiedener Hardware sind willkommen!

20.11.2010

System auf GUID Partition Table umstellen

von mks.

Note: An English version of this article is available.

Disclaimer: Dieser Artikel ist keine Schritt-für-Schritt-Anleitung für Anfänger! Ich habe alles auf Arch Linux durchgeführt, darum können die Pfadangaben auf Ubuntu leicht abweichen. Veränderungen an der Partitionstabelle und am Master Boot Record sind immer riskant! Mache Backups! Ich bin nicht verantwortlich für verlorene Daten!

Dieser Artikel beschreibt, wie man ein Linux-System von einer MSDOS-Partitionstabelle auf den neuen GUID Partition Table-Standard (GPT) umstellen kann. GPT ist Teil der EFI-Spezifikation und wird somit wahrscheinlich sehr bald in den meisten Desktops und Notebooks Einzug halten. Apple benutzt EFI und GPT bereits großflächig in seinen Systemen und auch IA64-basierte Server und Workstations setzen auf den neuen Standard. Aber auch wenn man noch ein BIOS-basiertes System sein Eigen nennt, kann man GPT nutzen.

MSDOS-Partitionstabellen werden im sog. Master Boot Record (MBR) gespeichert. Dieser ist der erste Sektor auf der Festplatte und somit 512 Byte groß. Der MBR enthält aber auch noch den Boot-Loader, der bereits 440 Byte in Anspruch nimmt. Die Partitionstabelle muss seit eh und je in 64 Byte passen. Das ist der Grund, warum man eigtl. höchstens vier Partitionen anlegen kann (dabei benötigt jeder Eintrag genau 16 Byte). Weil die Größe einer Partition in 32 Bit gespeichert wird, kann jede auch “nur” 2 Terabyte groß sein.

Wer von den Einschränkungen durch MBR-Partitionstabellen die Nase voll hat, insbesondere von der Begrenzung auf vier primäre Partitionen und den Hack mit erweiterten Partitionen, der kann sich GPT als Alternative anschauen. Mit GPT kann man 128 Partitionen anlegen, jede maximal 8192 Exabyte groß.

Was man braucht

Das fdisk-Tool kann nicht mit GPT umgehen. Man braucht daher gdisk, das aber nahezu gleich bedient wird. Außerdem benötigt man einen GPT-kompatiblen Boot-Loader. Der alte GRUB 0.97 benötigt dazu einen Patch, GRUB2 kann aber einwandfrei mit GPT umgehen. Ich benutze allerdings extlinux, das mit syslinux daherkommt, weil ich das Konfigurationssystem von GRUB2 nicht mag.

Wenn man das erste Mal auf GPT umstellt, muss man außerdem die erste Partition um 33 Sektoren verschieben (das ist die Größe, die die neue Tabelle braucht). Wenn man, wie ich, eine extra /boot-Partition hat, dann ist das kein Problem, ansonsten sollte man evtl. bis zur nächsten Neuinstallation warten. ;-)

Kombatibilität

Linux kann GPT-formatierte Platten mounten und auch davon booten. Man sollte aber vorher prüfen, ob der Kernel mit GPT-Unterstützung kompiliert wurde.

$ zgrep CONFIG_EFI_PARTITION /proc/config.gz

CONFIG_EFI_PARTITION=y # we're ready to go

Auch FreeBSD kann von GPT booten, was ich aber nicht getestet habe. Windows kann ohne Weiteres nicht auf BIOS-basierten Systemen von GPT-Platten booten! Wenn sich also Linux die Platte mit Windows teilt, sollte man noch darauf verzichten.

Let’s rock’n'roll

Zuerst habe ich syslinux und gdisk aus den Repositories installiert. Man braucht mindestens syslinux 4.0. Wenn man noch nicht Ubuntu 10.10 installiert hat, muss man es daher selbst kompilieren.

Dann habe ich extlinux in den MBR mit herkömmlicher Partitionstabelle installiert, um zu testen ob es überhaupt geht und eine funktionierende Konfiguration zu erstellen.
Nicht vergessen, /boot zu mounten; sda an das eigene System anpassen!

$ dd if=/usr/lib/syslinux/mbr.bin of=/dev/sda # Copy bootloader to MBR
$ mkdir /boot/extlinux
$ extlinux --install /boot/extlinux
$ cp /usr/lib/syslinux/menu.c32 /boot/extlinux

Nun muss man /boot/extlinux/extlinux.conf anlegen und entsprechend dem eigenen System anpassen. Das manual `man syslinux` hilft dabei. Meine sieht folgendermaßen aus. Deine muss sicherlich anders aussehen!

default menu.c32
prompt 0
menu title Arch Linux
timeout 30
 
label linux
 menu label Linux
 kernel ../vmlinuz26
 append initrd=../kernel26.img root=/dev/sda3 ro resume=/dev/sda2 quiet

Nachdem die extlinux-Konfiguration funktionierte, habe ich die System Rescue CD gebootet. Die folgenden Schritte kann man nicht auf dem laufenden System machen, da man die Partitionstabelle verändern und dann mit der neuen Tabelle den Boot-Loader installieren muss. Der Kernel liest die Tabelle aber erst beim Reboot neu ein, der aber nicht funktioniert, solange man den Loader noch nicht installiert hat.

Auf dem laufenden Live-CD-System habe ich meine Partitionen eingehängt und /boot gesichert.

$ mkdir /mnt/host
$ mount /dev/sda3 /mnt/host
$ mount /dev/sda1 /mnt/host/boot
$ cd /mnt/host
$ tar cf boot.tar boot/
$ umount boot/

Jetzt habe ich gdisk gestartet. Es bringt beim ersten Start die Meldung, dass man eine MBR-Tabelle hat, welche es konvertiert hat und dass man die erste Partition löschen oder verkleinern/verschieben muss. Also löscht man sie und legt sie weiter hinten neu an.

$ gdisk /dev/sda
Command (? for help): d
Partition number (1-4): 1
 
Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-312581774, default = 34) or {+-}size{KMGTP}: 
Last sector (34-112454, default = 112454) or {+-}size{KMGTP}: 
Current type is 'Linux/Windows data'
Hex code or GUID (L to show codes, Enter = 0700): 
Changed type of partition to 'Linux/Windows data'
 
Command (? for help): x
 
Expert command (? for help): a
Partition number (1-4): 1
Known attributes are:
0: system partition
1: hide from EFI
2: legacy BIOS bootable
60: read-only
62: hidden
63: do not automount
 
Toggle which attribute field (0-63, 64 or <Enter> to exit): 2
 
Attribute value is 0000000000000004. Set fields are:
2 (legacy BIOS bootable)
 
Command (? for help): w

Jetzt hat man die Partitionstabelle zu einer GPT konvertiert. Letzter Schritt: den Inhalt von /boot wiederherstellen und extlinux nochmal installieren, diesmal aber mit dem Loader-Code für GPTs (gptmbr.bin).

$ mkfs.ext2 /dev/sda1
$ mount /dev/sda1 /mnt/host/boot
$ cd /mnt/host
$ tar xf boot.tar
$ dd if=/mnt/host/usr/lib/syslinux/gptmbr.bin of=/dev/sda
$ extlinux --install /mnt/host/boot/extlinux

Wenn alles glatt gelaufen ist, hat man nun ein GPT-System. Viel Glück! :-)

$ reboot

Referenzen (Englisch)