Schlagwort-Archive: openSUSE

USB mit VirtualBox

VirtualBox ist ein PC-Emulator der Firma Oracle. Wer in einer virtuellen Maschine die USB-Geräte des Wirtssystems benutzen wollte, mußte dazu früher eine kostenpflichtige Lizenz erwerben. Seit VirtualBox 4 ist das nicht mehr nötig. Einfach VirtualBox installieren und mit USB loslegen klappt trotzdem nicht.

Um USB mit VirtualBox 4.0.12 unter Linux (openSUSE 11.4) als Wirtssystem ans Laufen zu kriegen, mußte ich folgendes tun:

Extension herunterladen und installieren

Für die USB-Unterstützung braucht man neben der normalen VirtualBox-Installation ein Erweiterungspaket, das man von http://www.virtualbox.org/wiki/Downloads herunterlädt. Achtung, es gibt unterschiedliche Pakete für VirtualBox 4.1 und 4.0.12. Für mich ist letzteres interessant, und ich erhalte die Datei Oracle_VM_VirtualBox_Extension_Pack-4.0.12-72916.vbox-extpack. Was man an der Dateiendung nicht erkennen kann: Es handelt sich um eine gzipkomprimierte Tar-Datei.

Die Installation erfolgt mit Hilfe des VirtualBox-Managers:

  1. Anwendung VirtualBox starten.
  2. Im File-Menü Preferences… wählen. Das Fenster Settings erscheint.
  3. Im linken Bereich auf Extensions klicken.
  4. Rechts auf das Symbol klicken, das für Add package steht.
  5. Heruntergeladene Datei mit dem Erweiterungspaket auswählen und auf Open klicken.
  6. Die Installation beginnt. Da Systemdateien installiert werden, muß man das Root-Kennwort in ein Dialogfenster eingeben.

Siehe auch Kapitel »Installing VirtualBox and extension packs« im Benutzerhandbuch.

USB für virtuelle Maschine aktivieren

Um USB für eine bestimmte virtuelle Maschine zu aktivieren, macht man im VirtualBox-Manager folgendes:

  1. Gewünschte virtuelle Maschine auswählen.
  2. Auf Settings klicken. Dialogfenster öffnet sich.
  3. Im linken Bereich auf USB klicken.
  4. Häkchen bei Enable USB 2.0 (EHCI) Controller setzen.
  5. Filter hinzufügen. Hier sollte man für die Geräte, die man in der virtuellen Maschine nutzen will – und nur für diese –, einen Filter definieren. Das läßt alle Geräte außen vor, die das Wirtssystem selbst benötigt. Wie das mit dem Filter genau geht, kann man im Kapitel »USB Support« des Benutzerhandbuchs nachlesen.

Man denke aber nicht, nun könne man endlich mit USB loslegen. Denn zuvor gilt es, eine wichtige Frage zu klären:

Wer darf USB benutzen?

Das Wirtsystem (hier: Linux) und das Gastsystem in der virtuellen Maschine dürfen nicht gleichzeitig auf dasselbe USB-Gerät zugreifen. Wenn das Gastsystem beginnt, ein USB-Gerät zu nutzen, sperrt VirtualBox daher den Zugriff des Wirtssystems auf dieses Gerät. Dennoch kann dabei etwas schiefgehen: Greift das Gastsystem beispielsweise auf eine USB-Festplatte zu, die im Wirtssystem noch angemeldet ist, wirkt das im Wirtssystem so, als wenn der USB-Stecker gezogen worden wäre. Es kann zu Datenverlusten kommen.

Man muß also sehr genau wissen, was man tut und zum Beispiel daran denken, USB-Festplatten im Wirtssystem freizugeben, bevor man sie im Gastsystem verwendet. Daher darf nicht jeder beliebige Benutzer einer virtuellen Maschine USB nutzen, sondern muß vom Systemverwalter dazu berechtigt worden sein. Der macht das, indem er Nutzer in die Gruppe vboxusers einträgt.

Berechtigung aktivieren

USB-Geräte funktionieren im Gastsystem immer noch nicht? Das kann daran liegen, daß VirtualBox die nötigen Berechtigungen im Wirtssystem fehlen. Es hängt von der jeweiligen Linux-Distribution ab, wie genau das Problem zu lösen ist. Im Benutzerhandbuch gibt es dazu das Kapitel »USB not working«.

Unter openSUSE 11.4 ist folgendes zu tun:

  1. Datei /etc/udev/rules.d/60-vboxdrv.rules bearbeiten. Hier gibt es zwei Zeilen, die der Gruppe vboxusers den Zugriff auf USB-Geräte gestatten. Allerdings sind diese Zeilen auskommentiert, so daß sie gar nichts bewirken! Man entfernt die Kommentarzeichen, so daß die beiden Zeilen so aussehen:
    SUBSYSTEM=="usb_device", ATTR{devnum}=="?*", ATTR{busnum}=="?*",NAME="vboxusb/$attr{busnum}/$attr{devnum}", GROUP="vboxusers"
    SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{devnum}=="?*", ATTR{busnum}=="?*",NAME="vboxusb/$attr{busnum}/$attr{devnum}", GROUP="vboxusers"
  2. Obwohl dies ein Linux-System ist, ist nun ein Neustart erforderlich. Danach geht’s.

Diese Lösung habe ich auf der VirtualBox-Seite im englischsprachigen openSUSE-Wiki gefunden.

Werbeanzeigen

Zusammenhängende XML-Dateien syntaxgesteuert editieren

Das syntaxgesteuerte Editieren von XML-Dateien ist eine feine Sache. Der Editor weiß, welche Elemente mit welchen Attributen an welchen Stellen erlaubt sind, und er haut dem Anwender auf die Finger, wenn der etwas versucht, was die Document Type Definition (DTD) oder das XML-Schema verbieten.

Editieren mit Emacs/PSGML

Seit rund 20 Jahren verwende ich dazu den Editor Emacs zusammen mit dem sogenannten Major mode PSGML. Unter openSUSE-Linux gehört beides bequemerweise zum Lieferumfang – auch wenn den openSUSE-Leuten die Integration nicht so ganz gelungen ist und man einen weiteren, nicht so mächtigen SGML-Modus per Hand löschen muß. Auch für alternative Betriebssysteme wie Microsoft Windows sind Emacs und PSGML verfügbar.

Ja, klar, gelegentlich habe ich immer wieder mal nach einer moderneren Alternative geguckt, besonders, seit es XML-Schema gibt, mit dem PSGML nichts anzufangen weiß. Bis jetzt habe ich aber nichts gefunden, das erstens frei verfügbar ist und zweitens ähnlich mächtig und flexibel wie Emacs/PSGML daherkommt.)

Ein Beispieldokument

Der folgende XML-Quelltext zeigt ein einfaches Beispieldokument in der Datei A.xml. Welche Regeln darin gelten, legt die DOCTYPE-Deklaration fest (siehe Hervorhebung). Im vorliegenden Fall verrät sie, daß es sich um ein DocBook-Dokument handelt. Ein syntaxgesteuerter Editor wie Emacs/PSGML liest die DocBook-DTD und sorgt beispielsweise dafür, daß innerhalb eines section-Elements title und para in der richtigen Reihenfolge stehen.

version="1.0" encoding="UTF-8"?>
article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "docbookx.dtd">

<article>

 <section>
  <title>Erstes Kapitel</title>
  <para>Dies ist der Text des ersten Kapitels.</para>
 </section>

 <section>
  <title>Zweites Kapitel</title>
  <para>Dies ist der Text des zweiten Kapitels.</para>
 </section>

</article>

Zusammenhängende Dokumente

Ist ein Dokument länger als unser Minibeispiel, möchte man es womöglich auf mehrere Dateien aufteilen. XML ermöglicht das mit Hilfe von Entities. Eine Entity hat einen Namen und einen Wert. Beispielsweise können wir eine Entity namens anhang definieren, die als Wert den Text eines Anhangs unseres Dokuments enthalten soll.

Das Einfügen des Anhangs in das Dokument ist sehr einfach und übersichtlich, weil wir nur die entsprechende Entity-Referenz &anhang; hinzuschreiben brauchen. Das Ende der Datei sieht so aus:

 ...
 </section>

 &anhang;

</article>

Der Wert der Entity wird an der Stelle eingefügt, an der die Entity-Referenz steht.

Diesen Wert haben wir aber noch gar nicht definiert. Das machen wir in der DOCTYPE-Deklaration, die wir dazu »ein wenig« erweitern:

article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "docbookx.dtd" [
 <!--ENTITY anhang "
                   <title>Anhang</title>
                   <para>Dies ist der Text des Anhangs.</para>
                  </appendix>">
]>

Damit haben wir allerdings nichts gewonnen, denn der Text des Anhangs steht im Hauptdokument statt in einer separaten Datei, und von einer Vereinfachung kann angesichts der aufgeblähten und unübersichtlichen DOCTYPE-Deklaration keine Rede sein.

Aber eines sieht man doch, nämlich wie eine ENTITY-Anweisung den Namen und den Wert einer Entity festlegt. Der Wert ist eine durch doppelte Anführungszeichen begrenzte Zeichenfolge, die sich in unserem Fall über mehrere Zeilen erstreckt.

Statt den Wert der Entity hinzuschreiben, kann man aber auch angeben, daß sich er sich in einer Datei befindet. Das geht so:

article PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "docbookx.dtd" [
 <!--ENTITY anhang SYSTEM "B.xml">
]>

Das sieht schon besser aus. Mit dieser Definition wird ein XMP-Prozessor jedes Vorkommen von &anhang; in der Datei A.xml durch den Inhalt von B.xml ersetzen.

Eingebundene Dateien editieren

So weit, so gut. Weniger schön ist allerdings, daß wir B.xml nicht editieren können, jedenfalls nicht syntaxgesteuert. Das ist ja auch kein Wunder, denn B.xml enthält nur den reinen Text des Anhangs und keinerlei Hinweis auf eine DTD. Eine DOCTYPE-Deklaration, an der PSGML die zu verwendende DTD erkennen könnte, ist hier nicht erlaubt, weil sie ja mit in das Gesamtdokument integriert und dort zu einem Fehler führen würde. Außerdem lieferte eine DOCTYPE-Deklaration gar nicht genug Informationen. Ein syntaxgesteuerte XML-Editor muß nicht nur wissen, welche DTD gilt, sondern auch, an welcher Stelle die Entity in den übergeordneten XML-Baum eingefügt wird. In unserem Beispiel befinden wir uns im Element article hinter einem section-Element. Davon weiß B.xml aber nichts.

Glücklicherweise können wir diese Informationen in der XML-Datei unterbringen und zwar in einem Kommentar, aus dem sich PSGML eine ganze Reihe von Einstellungen holt. Ein Aufruf von SGML → File Options → Save File Options im Emacs erzeugt diesen Kommentar am Ende der Datei. Hier ein Beispiel:

<!-- Keep this comment at the end of the file
Local variables:
mode: xml
sgml-omittag:nil
sgml-shorttag:nil
sgml-namecase-general:nil
sgml-general-insert-case:lower
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->

Interessant ist die hervorgehobene Zeile; wir ersetzen sie durch diese hier:

sgml-parent-document:("A.xml" "article" "appendix")

Diese Anweisung verrät PSGML dreierlei:

  1. Das übergeordnete Dokument ist A.xml. Die dort geltende DTD gilt auch hier.
  2. Die aktuelle Datei, also B.xml, wird in ein article-Element eingefügt.
  3. Die aktuelle Datei muß ein einziges appendix-Element enthalten.

Voilá, und damit geht es! Wir können die Datei jetzt syntaxgesteuert editieren und den Schatz der DocBook-Elemente heben.

Wie man sieht, geht die sgml-parent-document-Anweisung davon aus, daß die aktuelle Datei in ein ganz bestimmtes übergeordnetes Dokument an einer ziemlich genau bestimmten Stelle eingebunden wird. In der Praxis wird das meistens auch so sein. Dennoch kann man die Datei mittels Entity-Referenzen durchaus an mehreren und unterschiedlichen Stellen in das Gesamtdokument einfügen, solange letzteres dadurch syntaktisch korrekt bleibt. Ein XML-Prozessor kümmert sich ja nicht um das, was in irgendeinem Kommentar steht.

Eclipse

Eclipse-Nutzer können übrigens ebenfalls einen leistungsfähigen XML-Editor einsetzen, sofern sie das WTP-Paket installiert haben. Dieser XML-Editor kann nicht nur anhand einer DTD, sondern auch gemäß eines XML-Schemas editieren. Er kommt sogar mit XML-Katalogen klar – ein Thema, das ich aus diesem Beitrag übrigens bewußt herauslasse. Das Bearbeiten von verknüpften Fragmentdateien hat der Eclipse-XML-Editor allerdings nicht drauf. Sehr schade! Ich habe dazu eine Fehlermeldung geschrieben. Wer mag, kann für eine Erweiterung votieren. Bis auf weiteres werde ich aber wohl bei der bewährten Kombination Emacs/PSGML bleiben müssen.

Weblinks

BIOS-Aktualisierung unter Linux

Wer das BIOS seines Linux-Computers aktualisieren will oder muß, steht vor einem Problem: Die Hersteller bieten BIOS-Updates in der Regel als DOS- oder Windows-Anwendungen an, die unter Linux nicht laufen.

So ging es mir auch mit meinem Dell-Notebook Latitude E6500, bei dem ich das BIOS von Version A12 auf A19 aktualisieren wollte. Glücklicherweise ist die BIOS-Aktualisierung mit einem kleinen Trick auch unter Linux möglich. Dazu braucht man zunächst das neue BIOS als DOS-Anwendung. Dell bietet sie für das E6500 hier zum Herunterladen an, in meinem Fall die Datei E6500A19.exe.

Für die weiteren Schritte braucht man auf seinem Rechner zwei Software-Pakete:

  • Mit wine kann man Windows-Anwendungen unter Linux ausführen. Es ist ein Standardpaket, das zu jeder gängigen Installation gehört. Gegebenenfalls muß man es vom Installationsmedium oder über das Netz nachinstallieren.
  • Das Paket firmware-addon-dell kümmert sich um die BIOS-Aktualisierung von Dell-Computern, das der Hersteller für verschiedene Linux-Distributionen zur Installation anbietet. Ich verwende openSUSE 11.2 und habe mittels YaST das Repository http://linux.dell.com/repo/community/repositories/home:/michael_e_brown/openSUSE_Factory/ zu meiner Konfiguration hinzugefügt. Entsprechende Repositories gibt es bei Dell auch für Fedora 11, RHEL4 und SLES9. Nun kann man firmware-addon-dell installieren. Dieser Vorgang verlangt weitere Pakete wie die nicht dellspezifischen firmware-tools und smbios-utils. Dell bietet diese Pakete aber ebenfalls in seinem Repository an, so daß man nicht lange suchen muß.

Als nächstes gewinnt man mittels wine aus der Datei E6500A19.exe eine sogenannte HDR-Datei:

wine E6500A19.exe -writehdrfile -nopause

Dieser Schritt erzeugt die Datei E6500A19.hdr, die wir für die BIOS-Aktualisierung benötigen. Die folgenden Kommandos bereiten diese vor:

modprobe dell_rbu
dellBiosUpdate -u -f E6500A19.hdr

Nun ist das neue BIOS zur Aktualisierung vorgemerkt. Die Aktualisierung selbst erfolgt aber erst beim Neustart der Maschine. Dazu sind zwei Dinge zu beachten:

  • Während des Aktualisierungsvorgangs darf die Maschine auf keinen Fall stromlos werden. Also unbedingt den Rechner sowohl ans Stromnetz anschließen als auch einen vollen Akku drinhaben!
  • Man muß einen Warmstart durchführen. Das heißt, der Rechner darf vor dem Neustart nicht ausgeschaltet werden. Das kann man zum Beispiel durch das Kommando <tt>reboot</tt> erreichen oder unter KDE durch die Funktion Verlassen→Neustart im KDE-Menü.

Beim Neustart bemerkt die Maschine das neue BIOS und installiert es. Das dauert eine Weile. Anschließend bootet die Maschine mit dem neuen BIOS. Fertig.