Linux-Praxisbuch/ Dateitypen – die MIME-Datenbank in GNOME

Aus Wikibooks

Dateitypen[Bearbeiten]

Dateitypen sind die Basis für

  • die Darstellung von Dateien
  • die verknüpften Programme und Aktionen

Im Dateimanager Nautilus gibt es drei Darstellungsarten für den Dateityp:

  • als MIME-Typ in der Form Medientyp/Subtyp
  • als Typ, das ist ein (lokalisierter) Name für den MIME-Typen
  • als Symbol

Der MIME-Typ ist dabei die zentrale, grundlegende Angabe, von der sich die Typbezeichnung, das Symbol sowie verknüpfte Programme und Aktionen ableiten.


Woran lässt sich der Typ einer Datei erkennen?[Bearbeiten]

Verschiedene Methoden sind möglich, um den Typ einer Datei zu bestimmen:

  • anhand der Dateinamensendung
Der einfachste Weg: Dateien mit der Endung .txt sind Textdateien etc. Viele Dateien, zum Beispiel die meisten Programme, haben allerdings üblicherweise keine solche Endung.
  • aus den Dateiattributen im Dateisystem
Hier kann man vor allem Spezialdateien wie Verzeichnisse, Geräte, Verknüpfungen etc. erkennen.
Ext3 und einige andere Dateisysteme kennen erweiterte Attribute (EA Extended Attributes). Ein solches Attribut user.mime_type ist dafür reserviert, um den Typ einer Datei im Dateisystem abzulegen.
  • aus dem Dateiinhalt
Oft kann man anhand von Kennungen bzw. Signaturen in der Datei erkennen, um welchen Dateityp es sich handelt. Zum Beispiel beginnen Shellskripte meist mit #!/bin/bash oder #!/bin/sh, Programme im binären  ELF-Format haben als erste Bytes die Kennung 0x7F gefolgt von „ELF“. Diese Art der Dateitypenerkennung wird oft „magic“ genannt.

Der klassische Kommandozeilenbefehl file nutzt alle drei genannten Ansätze, um eine Vielzahl von Dateitypen zuverlässig zu erkennen. Mit der Option -i gibt file einen MIME-Typ aus. GNOME arbeitet ähnlich, file wird aber nicht verwendet.


MIME-Typen[Bearbeiten]

Die Bezeichnung  Multipurpose Internet Mail Extensions (MIME) weist auf den Ursprung als E-Mail-Standard hin, der später für andere Aufgaben adaptiert wurde. Eine MIME-Typangabe besteht aus zwei Teilen: Medientyp und Subtyp. Beide Angaben werden durch einen Schrägstrich voneinander getrennt (z. B. image/jpeg).

Die acht definierten Medientypen sind

  • text: für Text
  • image: für Grafiken
  • audio: für Audiodaten
  • video: für Videomaterial
  • application: für binäre Dateiformate, die oft einem bestimmten Programm zuzuordnen sind
  • multipart: mehrteilige Formate
  • message: für Nachrichten, beispielsweise E-Mails
  • model: für Daten, die mehrdimensionale Strukturen repräsentieren

Zu jedem Medientyp ist eine Reihe von Subtypen definiert. Die  Internet Assigned Numbers Authority (IANA) registriert MIME-Typen und veröffentlicht eine Liste. Daneben besteht die Möglichkeit, nicht standardisierte Medien- oder Subtypen zu verwenden, der Name des Typs beginnt dann mit „x-“ wie in application/x-awk oder x-special/symlink.


MIME-Datenbank[Bearbeiten]

Die MIME-Datenbank (MIME Database) ist ein Standard, der von  freedesktop.org (XDG) festgelegt ist ([1]). Im GNOME Desktop System Administration Guide wird beschrieben, wie die MIME-Datenbank in GNOME implementiert ist.

Die MIME-Datenbank besteht aus einer Reihe von XML-Dateien, die einen Satz von Regeln enthalten, um den Typ einer Datei zu bestimmen. Es gibt zwei Arten von Regeln:

  • Dateinamen, zum Beispiel: Dateien, die dem Muster *.html entsprechen, sind vom MIME-Typ text/html („globbing“)
  • Dateiinhalte, zum Beispiel: Dateien, die in den ersten 64 Bytes den Text „<HTML“ enthalten, sind vom MIME-Typ text/html („magic“, diesen Regeln wird eine Priorität von 1 (niedrigste) bis 100 (höchste) zugewiesen)

Regeln zu Dateiattributen im Dateisystem können demnach nicht in der MIME-Datenbank festgelegt werden.

Zusätzlich enthält die MIME-Datenbank Namen für die Dateitypen in verschiedenen Sprachen.

Weiterhin kann über „sub-class-of“-Angaben eine Hierarchie der Dateitypen definiert werden, zum Beispiel: Jede image/svg-Datei ist ebenfalls text/xml, text/plain und application/octet-stream. Implizit ist festgelegt, dass jeder MIME-Typ des Medientyps text auch text/plain ist, und dass jede Datei auch application/octet-stream ist, ausgenommen Spezialdateien.

Die Datenbank ist so angelegt, dass Benutzereinstellungen die systemweiten Regeln überschreiben können. Die entsprechenden Dateien befinden sich in den Verzeichnissen

  • ~/.local/share/mime/ für Benutzereinstellungen
  • /usr/local/share/mime/ für lokale Einstellungen, die von den Installations- und Konfigurationswerkzeugen der Distribution normalerweise nicht angefasst werden
  • /usr/share/mime/ für die Grundeinstellungen

Die Verzeichnisse können über die Umgebungsvariablen XDG_DATA_HOME und XDG_DATA_DIRS abweichend festgelegt werden.

Der Standard empfiehlt folgende Auswertungsreihenfolge:

  • der MIME-Typ wird explizit angegeben (zum Beispiel erweitertes Attribut user.mime_type)
  • Magic-Regeln mit einer Priorität von 80 oder höher
  • Globbing-Regeln
  • verbleibende Magic-Regeln
  • text/plain, wenn die ersten 32 Bytes der Daten keine ASCII-Kontrollzeichen enthalten (d. h. 0, 127 und die meisten Zeichenwerte unter 32)
  • application/octet-stream


Die Implementation in GNOME[Bearbeiten]

In GNOME ist für die Ermittlung von Dateitypen eine GNOME-Komponente, das GNOME Virtual File System (GNOME-VFS) zuständig. GNOME-VFS ist kein Dateisystem des Kernels wie ext3, ISO 9660 usw., sondern eine Abstraktionsebene, über die Programme sowohl auf lokale (gemountete) Dateisysteme als auch auf andere Quellen wie Digitalkameras oder  WebDAV zugreifen können.

GNOME verwendet mindestens zwei verschiedene Algorithmen der Dateitypermittlung. Der Kommandozeilenbefehl

gnomevfs-info <Dateiname> – schneller Algorithmus ohne „Magic“ bzw.
gnomevfs-info -s <Dateiname> – langsamer Algorithmus mit „Magic“

gibt neben anderen Angaben den ermittelten MIME-Typ an. Der langsame Algorithmus ist der Interessante:

  • Erkennung von Spezialdateien – die entsprechenden Regeln sind in GNOME-VFS fest eingebaut.
  • Die Globbing-Regeln und unabhängig davon die Magic-Regeln der MIME-Datenbank werden angewandt.
  • Wenn die Magic-Regeln einen der MIME-Typen application/x-ole-storage, text/xml, application/x-bzip, application/x-gzip oder application/zip ergeben, und die Globbing-Regeln ergeben etwas anderes als application/octet-stream, gilt das Ergebnis des Globbings.
  • Ebenso gilt das Ergebnis des Globbings, wenn es in der Sub-class-of-Hierarchie dem Magic-Ergebnis untergeordnet ist.
  • Falls die Magic-Regeln nichts ergeben (application/octet-stream), wird geprüft bzw. geraten, ob es sich um eine Textdatei handelt – nach einem Algorithmus, der weiter unten beschrieben wird.
  • Handelt es sich danach um eine Textdatei, und die Globbing-Regeln haben einen untergeordneten Typ ergeben, gilt das Ergebnis des Globbings.
  • Sonstige Textdateien sind text/plain.
  • Binärdateien werden noch auf MP3 untersucht, MP3-Dateien sind audio/mpeg.
  • Für sonstige Binärdateien gilt das Ergebnis des Globbings.
  • Hat der Algorithmus gar kein Ergebnis erbracht, gilt application/octet-stream.

Der Algorithmus sieht keine Möglichkeit vor, den MIME-Typ einer Datei explizit, zum Beispiel als Extended Attribute, anzugeben.

Für die Unterscheidung zwischen Text- und Binärdateien gilt folgender Algorithmus, der die ersten 256 Bytes der Datei untersucht:

  • Eine leere Datei gilt als Text.
  • Enthält der Dateianfang mindestens ein Nullbyte, ist die Datei binär.[1] (Die von locale bzw. von der GNU C library unterstützten Multibyte-Zeichenkodierungen erzeugen keine Nullwerte außer beim Zeichen NUL selbst.  UTF-32/ UCS-4 und  UTF-16/ UCS-2 sind damit allerdings außen vor.)
  • Ist der Dateianfang gültiges UTF-8, das heißt die Bytefolge lässt sich dekodieren und das Ergebnis sind mögliche Unicode-Codepoints, ist die Datei eine Textdatei (die letzten ein bis drei Byte können ein unvollständiges Zeichen sein, auch das wird geprüft).
  • Ist der Dateianfang gültig nach der Zeichenkodierung, die sich aus dem locale (LC_CTYPE) ergibt, ist die Datei eine Textdatei (unvollständige Zeichen werden hier ebenso berücksichtigt).


Dateitypen ändern[Bearbeiten]

Solange das Dateisystem-Attribut user.mime_type von GNOME-VFS nicht unterstützt wird, gibt es keine Möglichkeit, den Typ einer einzelnen Datei festzulegen. Änderungen an der Dateityperkennung sind nur über die MIME-Datenbank möglich.


Nautilus[Bearbeiten]

Vorausgesetzt,

  • Sie wollen einem neuen Dateityp eine Anwendung zuordnen,
  • die Dateinamen haben eine eindeutige Dateiendung und
  • die Dateien werden als application/octet-stream (unbekannt) angezeigt,

dann gibt es (bis einschließlich Version gnome 2) die Möglichkeit, den Dateimanager Nautilus einen neuen Dateitypen erzeugen zu lassen:

  • Markieren Sie eine solche Datei in Nautilus.
  • Wählen Sie Datei, Mit anderer Anwendung öffnen ...
  • Prüfen Sie, für welchen Dateityp die jetzt folgende Auswahl gelten soll. Wenn hier steht „bar.foo und andere Dateien vom Typ »foo-Dokument« öffnen mit:“, dann wird Nautilus diesen Dateityp „foo-Dokument“ neu anlegen.
  • Wählen Sie eine Anwendung oder einen benutzerdefinierten Befehl.
  • Die Datei wird mit der gewählten Anwendung geöffnet.
  • Nebenbei hat Nautilus den Dateityp application/x-extension-foo mit Bezeichnung foo-Dokument angelegt und wird diesen Dateityp zukünftig erkennen.

von Hand[Bearbeiten]

Wie oben beschrieben, liegen die Dateien der MIME-Datenbank normalerweise in den Verzeichnissen ~/.local/share/mime/, /usr/local/share/mime/ und /usr/share/mime/. Alle darin liegenden Dateien und Unterverzeichnisse sind vom Programm update-mime-database automatisch erzeugt und sollten nicht manuell bearbeitet werden.

Ausnahme ist jeweils das Unterverzeichnis packages, in dem die XML-Dateien mit der Definition der MIME-Typen gespeichert werden. In /usr/share/mime/packages liegt die Datei freedesktop.org.xml, die von freedesktop.org stammt und eine große Basis an MIME-Typen definiert. Dazu können Definitionsdateien von einzelnen Anwendungen kommen – es sollte je Anwendung eine Datei sein.

Eigene Dateitypen können in der Datei Override.xml in einem der packages-Verzeichnisse definiert werden. Diese Datei hat eine höhere Priorität als die anderen Dateien. Wenn Sie bereits Dateitypen wie oben beschrieben über den Dateimanager Nautilus erstellt haben, sollte ~/.local/share/mime/packages/Override.xml etwa wie folgt aussehen (Einrückungen ergänzt):

<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
  <mime-type type="application/x-extension-foo">
    <comment>foo-Dokument</comment>
    <glob pattern="*.foo"/>
  </mime-type>
</mime-info>

Dies können Sie als Vorlage für eine eigene bzw. ergänzte Override.xml verwenden. Innerhalb des <mime-info>-Blocks können beliebig viele <mime-type>-Blöcke stehen. Falls zutreffend, sollten Sie einen sub-class-of-Eintrag einfügen (oder mehrere). Dies gilt ganz besonders für Textdateien, weil Nautilus sonst ein „Sicherheitsrisiko“ postulieren und verknüpfte Anwendungen nicht starten wird.

  <mime-type type="application/x-extension-foo">
    <sub-class-of type="text/plain"/>
    <comment>foo-Dokument</comment>
    <glob pattern="*.foo"/>
  </mime-type>
  <mime-type ... usw.
  </mime-type>

Wenn Sie nur einzelne Angaben zu einem Dateityp ändern wollen, schreiben Sie nur diese Angaben – die anderen Angaben aus freedesktop.org.xml oder anderen untergeordneten Paketen werden dann übernommen:

  <mime-type type="application/ogg">
    <comment xml:lang="de">musikalische Ostereier</comment>
  </mime-type>

Wenn Sie eigene „Magic“-Regeln erstellen wollen, schauen Sie sich die Beispiele in freedesktop.org.xml oder die Spezifikation bei freedesktop.org an.

Die Änderungen müssen Sie mit update-mime-database registrieren. Wenn Sie die Override.xml in ~/.local/share/mime/packages bearbeitet haben geben Sie auf der Kommandozeile den Befehl ein:

update-mime-database ~/.local/share/mime

Ab sofort sollten die Änderungen in Nautilus bzw. bei gnomevfs-info wirksam sein – teilweise ist dennoch ein Neustart von GNOME erforderlich. Bei einem neuen Dateityp sind die Programmverknüpfungen erst mal dieselben wie bei den übergeordneten MIME-Typen. Sie können jetzt aber neue Anwendungen hinzufügen, die nur für den neuen Dateitypen gelten.

Änderungen in ~/.local/share/mime/ gelten natürlich nur für den entsprechenden Benutzer. Änderungen in /usr/local/share/mime/ oder /usr/share/mime/ gelten systemweit, Sie benötigen dafür Superuserrechte und müssen die Datei unter Umständen neu anlegen.

--

  1. Die vorrangige Prüfung auf Nullbytes gilt erst ab GNOME 2.16. Ältere Versionen hatten folgenden Fehler: Eine Datei, die mit einer unvollständigen UTF-8-Bytefolge gefolgt von einem Nullbyte beginnt – zum Beispiel 0xeb 0x00 – oder wo solch eine Sequenz auf gültiges UTF-8 folgt, wurde nicht weiter untersucht und falsch als Textdatei erkannt.