Nicht zugeordnete Verzeichnisse
Der Begriff „nicht zugeordnetes Verzeichnis“ (oder „verwaistes Verzeichnis“) bezieht sich auf einen Paketierungsfehler, bei dem folgende drei Dinge passieren:
-
ein Paket enthält Dateien in einem Verzeichnis, das von dem Paket angelegt wird, aber nicht das Verzeichnis selbst
-
keine der Abhängigkeiten des Pakets stellt das Verzeichnis bereit
-
das Verzeichnis gehört zu Ihrem Paket und nicht zu einem Kernpaket oder Basisdateisystempaket, das für ein Fedora-System als essenziell/fundamental gilt.
Probleme
Nicht zugeordnete Verzeichnisse können die folgenden Probleme verursachen.
Nicht zugreifbare Verzeichnisse
Eine restriktive Superuser-Umask während der Paketinstallation kann zu unzugreifbaren Verzeichnissen führen, wenn die Installation mit einem RPM-Paketverwalter älter als 4.4.2.3 durchgeführt wird. Fedora 9 und RHEL 5.3 verwenden als erste RPM 4.4.2.3, welches die Umask immer auf 0022 setzt. Auf Plattformen mit älteren RPM-Versionen kann es zu folgenden Problemen kommen, wenn der Superuser Folgendes tut:
+ umask 077+ + + yum update+ + + ` + ` rpm -ivh PAKET+
Nicht zugeordnete Verzeichnisse innerhalb der aktualisierten oder installierten Pakete sind nur für den Benutzer „root“ lesbar und ausführbar. Dies verhindert, dass andere Benutzer die Dateien in diesen Verzeichnissen verwenden.
Dies führt zu Laufzeitproblemen für Benutzer. Beispielsweise können nicht lesbare Unterverzeichnisse unterhalb von %_libdir Plugins deaktivieren. Nicht lesbare Unterverzeichnisse unterhalb von %_datadir verhindern den Zugriff auf Anwendungsdaten, Hilfetexte und Grafiken.
Manche Benutzer beheben solche Berechtigungsprobleme mit „chmod“, anstatt sie als Fehler zu melden. Es herrscht die weitverbreitete Annahme, dass solche Fehler so offensichtlich sind, dass sie vom Paketbetreuer gefunden oder von anderen Benutzern gemeldet werden.
Verzeichnisse werden nicht entfernt
Bei der Deinstallation des Pakets (oder bei der Aktualisierung auf eine andere Version) wird das alte Verzeichnis nicht aus dem Dateisystem entfernt, da es nicht zum Paket in der RPM-Datenbank gehört.
Insbesondere dann, wenn Verzeichnisse eine Versionsnummer enthalten, führen sie bei jeder Aktualisierung, bei der alte Verzeichnisse nicht entfernt werden, zu einer unnötigen Verdichtung des Dateisystems.
Verzeichnisse können nicht verifiziert werden
Nicht zugeordnete/verwaiste Verzeichnisse können weder mit „rpm -V“ noch mit „rpm -qf“ überprüft werden.
./configure-Skripte können fehlschlagen
Die Konfiguration des Upstream-Quellcode-Tarballs kann fehlschlagen, weil sie das Vorhandensein alter, aber leerer versionierter Header-Verzeichnisse erkennt oder weil sie versucht, mehrere versionierte Verzeichnisse anstelle des neuesten gültigen zu verwenden.
Hilfswerkzeuge
Mit rpmls aus rpmdevtools oder rpm -qlv lassen sich nicht zugeordnete Verzeichnisse leicht finden. Dabei ist etwas Vorsicht geboten, um wichtige Dateisystemverzeichnisse wie %_bindir, %_libdir (und andere, z.B. aus dem Paket „filesystem“) nicht einzuschließen, die nicht zu Ihrem Paket gehören.
Häufige Fehler
Hier sind einige Beispiele für häufige Fehler in %files-Listen in Spec-Dateien, die Sie vermeiden sollten.
Platzhalter für Dateien in einem angelegten Verzeichnis
Unversioniert
%{_datadir}/foo/*
Dies umfasst alles in "foo", aber nicht „foo“ selbst. „rpm -qlv Paketname“ zeigt einen fehlenden drwxr-xr-x-Eintrag für „foo“ an. Korrekt wäre es so:
%{_datadir}/foo/
Dadurch wird das Verzeichnis und der darin enthaltene Dateibaum einbezogen.
Versioniert
%{_docdir}/%{name}-%{version}/*
%{_includedir}/%{name}-%{version}/*.h
Dies entspricht dem unversionierten Szenario, mit dem Unterschied, dass bei jeder Aktualisierung des Pakets auf eine neue Version das alte Verzeichnis im Dateisystem erhalten bleibt. Korrekt wäre:
%{_docdir}/%{name}-%{version}/
%dir %{_includedir}/%{name}-%{version}
%{_includedir}/%{name}-%{version}/*.h
Ein Verzeichnis der obersten Ebene wurde nicht einbezogen
%dir %{_libdir}/foo-2/fu
%dir %{_libdir}/foo-2/bar
%{_libdir}/foo-2/fu/*.so
%{_libdir}/foo-2/bar/config*
Hier wird versucht, die Verzeichnisse explizit mit dem Makro %dir einzubinden. Während „bar“ zwar eingeschlossen wird, fehlt jedoch „foo-2“. Typischerweise tritt dieser Fehler bei Paketerstellern auf, wenn alle installierten Dateien ausschließlich in Unterverzeichnissen des übergeordneten Verzeichnisses „foo-2“ gespeichert sind. Korrekt wäre:
%dir %{_libdir}/foo-2
%dir %{_libdir}/foo-2/fu
%dir %{_libdir}/foo-2/bar
%{_libdir}/foo-2/fu/*.so
%{_libdir}/foo-2/bar/config*
Nur Dateien werden einbezogen
%{_datadir}/%{name}/db/raw/*.db
%{_datadir}/%{name}/pixmaps/*.png
Hier werden nur bestimmte Datendateien einbezogen, und alle vier Verzeichnisse unterhalb von %_datadir sind nicht zugeordnet. Korrekt wäre:
%dir %{_datadir}/%{name}
%dir %{_datadir}/%{name}/db
%dir %{_datadir}/%{name}/db/raw
%dir %{_datadir}/%{name}/pixmaps
%{_datadir}/%{name}/db/raw/*.db
%{_datadir}/%{name}/pixmaps/*.png
Want to help? Learn how to contribute to Fedora Docs ›