pacman "existiert auf Dateisystem" Fehler


38

Ich bin gelaufen sudo pacman -Syuund habe einige interessante Fehler gelesen:

Fehler: Transaktion konnte nicht festgeschrieben werden (in Konflikt stehende Dateien)

und eine lange Liste von Dateien, gefolgt von exists in filesystem. Die vollständige Ausgabe finden Sie hier: http://ix.io/lLw

Es scheint, dass viele dieser Dateien nicht mit einem Paket verknüpft sind, als ich sie überprüft habe pacman -Qo <path-to-file>, aber ich habe sie nicht alle überprüft. Ich hatte eine schwache Verbindung, als ich lief pacman -Syu, aber ich erhalte die gleichen Fehler, wenn ich später aktualisiere: http://ix.io/lLx

Was sollte ich tun? Soll ich alle Dateien überprüfen und diejenigen löschen, denen kein Paket zugeordnet ist? Sollte ich ein Update erzwingen (mit sudo pacman -S --force <package-name>?)

Aktualisieren

Ich habe versucht zu rennen sudo pacman -S --force <package-name>und habe folgendes herausgefunden:

[my-pc]/home/average-joe$ pacman -Qo /usr/lib/python3.5/site-packages/PyYAML-3.11-py3.5.egg-info
error: No package owns /usr/lib/python3.5/site-packages/PyYAML-3.11-py3.5.egg-info

Es sieht so aus, als würde pacman -S --force <packagees keine Verzeichnisse überschreiben, die Dateien enthalten. Vom mann:

Mit --force kann kein Verzeichnis mit einer Datei überschrieben oder Pakete mit in Konflikt stehenden Dateien und Verzeichnissen installiert werden.

Sollte ich nur die widersprüchlichen Verzeichnisse löschen? (Sie haben keine zugeordneten Pakete)


5
Warum haben Sie überhaupt in Konflikt stehende Dateien? Wenn Sie einen Paketmanager verwenden, versuchen Sie, nicht auf die Zehen zu tippen (z. B. indem Sie Software an Stellen installieren, von denen der Paketmanager zu Recht /usr/local//usr/
annimmt,

1
@ umläute Ich bin mir nicht sicher, woher die widersprüchlichen Dateien stammen, aber ich vermute, dass sie mit meiner Installation von docker-compose zusammenhängen, die ich sudo pip install -U docker-compose==1.5.0rc3 auf dieser Seite installiert habe . Vielleicht sudo pip installKonflikte mit Pacman?
Modulitos

2
@ umläute Wenn Sie falsche -SUpdates ( Teilinstallationen usw.) erhalten, können Sie dieses Szenario ausführen . Bei mir --forcehat alles mal geklappt.
erm3nda

Antworten:


28

Okay, es sieht so aus sudo pacman -S --force <package-name>, als würde es funktionieren, aber es löst keine Konflikte zwischen Verzeichnissen. In solchen Fällen wird sudo rm -rfauf den in Konflikt stehenden Verzeichnissen ausgeführt, gefolgt von sudo pacman -S --force <package-name>Works.

Jetzt pacman -Syulöst sich mein gut auf.


6
--force ist veraltet; Verwenden Sie stattdessen --overwrite.
Ankit Balyan

6
--force arbeitet für mich, aber --overwrite ist nicht
Infernion

2
sudo pacman -Syu --forcearbeitete für mich, aber Überschreiben wurde nicht erkannt.
Spydon

21

tl; dr: Deinstallieren Sie die in Konflikt stehende Anwendung, bevor Sie sie ausführen pacman.

pacman(und andere Paketmanager) führen einen Index der von ihnen verwalteten Pakete und Dateien ( pacman --query --list). Einige Dateien, z. B. die Konfiguration, werden als änderbar markiert und während des Upgrades nicht überschrieben (außer in besonderen Fällen, in denen der Paketmanager normalerweise die alte Datei entfernt, bevor er die neue erstellt). Andere Dateien werden als nicht änderbar markiert. Wenn eine andere Anwendung diese Dateien auf irgendeine Weise ändert, ohne den Index entsprechend zu aktualisieren, kann der Paketmanager während eines Upgrades nicht wissen, was mit diesen Dateien zu tun ist.

Viele Anwendungen, die mit dem Standardmuster installiert wurden, ./configure && make && sudo make installkönnen mit deinstalliert werden sudo make uninstall. Wenn Sie die Anwendung auf eine andere Weise installiert haben, müssen Sie möglicherweise etwas anderes deinstallieren. Im Allgemeinen kann es eine gute Idee, um eine Kopie der Installationsdateien zu halten irgendwo (zum Beispiel ~/install) in der Lage deinstallieren sie zuverlässig in solchen Fällen zu sein. Wenn Sie nur die in Konflikt stehenden Dateien entfernen, bleiben wahrscheinlich noch andere Dateien übrig, die möglicherweise andere Probleme verursachen könnten.

Bei der Installation von Software mit anderen Paketmanagern gibt es Möglichkeiten, diese von den Systemdateien zu isolieren. Dies ist eine bewährte Methode, zum Beispiel während der Softwareentwicklung, bei der Sie Versionen konsistent halten und Konflikte mit anderer Software vermeiden möchten. Beispiele beinhalten:


2
Siehe meinen Kommentar zu @umlaute oben. Ich denke, der Konflikt war von einem sudo pip installBefehl. Vielleicht sollte ich Pip mit Sudo vermeiden?
Modulitos

3

Ich habe Pakete installiert, die ich normalerweise mit pip via pacman installiere. Aber einige Pakete sind nicht in Pacman Repos zu finden. Ich denke, wir sollten es vermeiden, pip mit sudo-Berechtigungen und istead zu installieren:

pip install pillow --user

--user flag legt fest, dass Pip-Installationspakete stattdessen in Ihrem Ausgangsverzeichnis gespeichert werden, für das keine besonderen Berechtigungen erforderlich sind. https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install-user


2

TLDR;

  1. Rufen Sie eine Liste der fehlerhaften Dateien ab (kopieren Sie die Pacman-Ausgabe und fügen Sie sie in eine Datei ein).
  2. Verwenden Sie awk , um alles außer den Dateipfaden in eine neue Liste zu kopieren.
  3. Verwenden Sie while , um die fehlerhaften Dateien basierend auf der Liste aus dem Weg zu räumen.
  4. Führen Sie sudo pacman -Syuerneut aus.

    bearbeitet, um TLDR hinzuzufügen und Tippfehler zu beheben

Obwohl ich mir ziemlich sicher bin, dass ich nichts Dummes getan habe, hatte ich dieses Problem vielleicht jedes Mal, wenn ich versucht habe, ein Update durchzuführen, seit ich Manjaro verwendet habe. drei oder vier mal innerhalb von zwei Monaten. Punkt zu sein, das behebt es.

Holen Sie sich eine Liste Ihrer Dateien.

Wenn das Update in Ihrem Terminalfenster fehlschlägt, erhalten Sie Folgendes:

error: failed to commit transaction (conflicting files)
evilfile: /usr/bin/evilfile exists in filesystem
libx000: /usr/lib/libx000.so.f.u.loser exists in filesystem
accountsservice: /usr/share/locale/ru/LC_MESSAGES/accounts-service.mo.yu.dnt.evn.spk.russian exists in filesystem

... und vieles mehr.

  • Kopieren Sie die Ausgabe vom Terminal und speichern Sie sie in einer Datei. Ich habe nano verwendet und meine "files" genannt, wie in ~ / work / files .

  • Streifenfremde Infos:

    cat files | awk '{print $2}' >> ~/work/files2

    Dies nimmt das zweite "Wort" aus jeder Zeile und druckt es in files2.

Beschäftige dich mit den Akten

  • Sie können sie löschen, verschieben oder umbenennen.

  • Wenn etwas kaputt geht, ist es am einfachsten, es zu reparieren, indem wir es verschieben, anstatt es zu löschen oder umzubenennen:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • Wenn Sie sie wirklich löschen möchten, gibt es keinen Grund, dies zu tun ( GEFAHR GEFAHR ): while read -r file; do sudo rm - "$ file"; fertig <files2

Aktualisierung

  • Damit --overwrite funktioniert, was wir tun müssen, damit pacman erkennt, dass das Paket nicht kaputt ist, benötigen Sie die folgende Syntax:

    sudo pacman -S package_name --overwrite /location/of/thing

    • In meinem Fall: sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • Dem Beispiel folgen: sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • Ich hatte ein nettes Problem, bei dem, wenn ich den Symlink libidn2.so.0 löschte, nichts funktionierte und wenn ich ihn zurücksetzte, der Fehler "Existiert im Dateisystem" auftrat. Das Obige mit --overwrite war alles, was für mich funktioniert hat.

  • Endlich:

    sudo pacman -Syu


0

Wenn Sie wie ich viele Dateien haben,

sudo pacman --force -Syyu  

löst alle Probleme.


Option --force ist veraltet. benutze stattdessen --overwrite
Mahmoud Khaled

--overwrite muss anscheinend angeben, was überschrieben werden soll. Derzeit verwenden - Force alles ist in Ordnung
Xsilen T

0

Nachdem Pacman die --forceOption endgültig verworfen hat und die Ersatzoption --overwritewie erwartet funktioniert, sollte das folgende Verwendungsmuster beachtet werden.

Ein äquivalenter Befehl zum Reproduzieren der --forceOption, mit der alles, was in Konflikt steht, blind überschrieben wird, lautet:

sudo pacman -S --overwrite \*

Oder

sudo pacman -S --overwrite "*"

Der knifflige Teil besteht darin, dem Glob zu entkommen, um zu vermeiden, dass die Shell ihn zuerst erweitert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.