Ersetzen eines Symlinks durch ein Verzeichnis oder ein Verzeichnis durch eine Dazei beliebigen Typs
Aufgrund einer bekannten Einschränkung von RPM ist es nicht möglich, ein Verzeichnis durch eine beliebige Datei oder einen symbolischen Link zu ersetzen. Ebenso wenig ist es möglich, einen symbolischen Link zu einem Verzeichnis durch ein Verzeichnis zu ersetzen, ohne dass RPM beim Installationsversuch des Pakets Dateikonflikte ausgibt. Weitere Informationen zu den Problemen finden Sie unter Bug 447156 und Bug 646523.
Versuchen, das Problem von vornherein zu vermeiden
Es ist zwar nicht möglich, alle Fälle vorherzusehen, in denen dies erforderlich sein könnte, aber wenn der Bedarf vorhersehbar ist, wie beispielsweise bei gebündelten Bibliotheken, ist es besser, von Anfang an einen symbolischen Link zu verwenden, da sich das Ziel des symbolischen Links leichter ändern lässt. Wenn Sie beispielsweise eine gebündelte libfoo-Bibliothek innerhalb der Verzeichnisstruktur des Pakets haben, platzieren Sie diese beispielsweise in einem Verzeichnis libfoo.bundled und erstellen Sie einen symbolischen Link von libfoo zu diesem Verzeichnis. Wenn die Bündelung schließlich entfernt wird, müssen Sie lediglich das Verzeichnis löschen und den symbolischen Link so ändern, dass er auf das entsprechende Systembibliotheksverzeichnis verweist, ohne auf die unten beschriebenen Skripte zurückgreifen zu müssen.
Umgehung des Problems mit Scriptlets
Um dieses Problem zu umgehen, müssen Sie ein %pretrans-Scriptlet einfügen, das die Konvertierung manuell durchführt, bevor RPM versucht, das Paket zu installieren.
Beachten Sie, dass die '%pretrans'-Scriptlets in Lua geschrieben sein MÜSSEN und daher -p <lua> verwenden, um in der frühen Phase der Systeminstallation zu funktionieren, wenn noch keine Shell installiert ist.
Bitte verwenden Sie in Paketen, die diese Umstellung benötigen, den jeweils erforderlichen der beiden folgenden Code-Schnipsel und ersetzen Sie /Pfad/zum/Verzeichnis durch den Pfad zu dem Verzeichnis, das konvertiert werden soll.
Scriptlet zum Ersetzen eines Verzeichnisses
RPM cannot simply remove a directory when it is replaced by a file or symlink, since users may have added or modified files to the directory. To protect against accidental data loss, you MUST use the following scriptlet which renames the directory with a .rpmmoved suffix so that users can find the backed up directory if they need to after the package is upgraded. (It also will append an integer to the suffix in the rare event that directory also exists.)
%pretrans -p <lua>
-- Define the path to directory being replaced below.
-- DO NOT add a trailing slash at the end.
path = "/path/to/dir"
st = posix.stat(path)
if st and st.type == "directory" then
status = os.rename(path, path .. ".rpmmoved")
if not status then
suffix = 0
while not status do
suffix = suffix + 1
status = os.rename(path .. ".rpmmoved", path .. ".rpmmoved." .. suffix)
end
os.rename(path, path .. ".rpmmoved")
end
end
Additionally, you should define the /path/to/dir.rpmmoved directory as a %ghost entry in the %files list in the package’s spec file, so that the directory is not entirely orphaned and can be deleted if the package is ever uninstalled and the directory is empty.
Scriptlet to replace a symlink to a directory with a directory
Replacing a symlink to a directory with a regular directory is much simpler, since there’s no potential for accidentally removing files added externally. The following scriptlet checks for and removes the symlink. There is no need to create the directory here, as RPM will do so later in the transaction when the package is installed.
%pretrans -p <lua> -- Define the path to the symlink being replaced below. path = "/path/to/dir" st = posix.stat(path) if st and st.type == "link" then os.remove(path) end
Want to help? Learn how to contribute to Fedora Docs ›