błąd „istnieje w systemie plików” pacmana

38

Pobiegłem sudo pacman -Syui dostałem kilka interesujących błędów odczytu:

błąd: nie udało się zatwierdzić transakcji (pliki powodujące konflikt)

i długą listę plików, po której następuje exists in filesystem. Pełne wyjście znajduje się tutaj: http://ix.io/lLw

Wygląda na to, że wiele z tych plików nie jest skojarzonych z pakietem, gdy je sprawdziłem pacman -Qo <path-to-file>, ale nie sprawdziłem ich wszystkich. Miałem słabe połączenie, gdy uruchomiłem pacman -Syu, ale otrzymuję te same błędy, kiedy zaktualizowałem później: http://ix.io/lLx

Co powinienem zrobić? Czy powinienem sprawdzić wszystkie pliki i usunąć te, które nie mają powiązanego pakietu? Czy powinienem wymusić aktualizację (z sudo pacman -S --force <package-name>?)

Aktualizacja

Próbowałem uruchomić sudo pacman -S --force <package-name>i otrzymałem to:

[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

Wygląda na to, pacman -S --force <packageże nie zastępuje katalogów zawierających pliki. Od mężczyzny:

Użycie opcji --force nie zezwoli na zastąpienie katalogu plikiem lub instalowanie pakietów zawierających sprzeczne pliki i katalogi.

Czy powinienem po prostu usunąć sprzeczne katalogi? (nie mają powiązanych pakietów)

modulitos
źródło
5
dlaczego w ogóle masz konfliktowe pliki? podczas korzystania z menedżera pakietów staraj się nie stukać palcami w palce (np. instalując oprogramowanie w miejscach, które menedżer pakietów słusznie uważa za swoje; jeśli musisz zainstalować rzeczy ręcznie, zainstaluj /usr/local/zamiast /usr/)
umläute,
1
@ umläute Nie jestem do końca pewien, skąd pochodzą sprzeczne pliki, ale podejrzewam, że są one związane z moją instalacją Docker-Compose, którą zainstalowałem sudo pip install -U docker-compose==1.5.0rc3 na tej stronie . Być może sudo pip installkoliduje z Pacmanem?
modulitos
2
@ umläute Niepoprawne -Saktualizacje (częściowe instalacje itp.) pozwolą ci na taki scenariusz. Sprawa mnie --forcedziałała cały czas.
erm3nda

Odpowiedzi:

28

Ok, wygląda na to, że sudo pacman -S --force <package-name>działa, ale nie rozwiązuje konfliktów katalogów. W takich przypadkach uruchamianie sudo rm -rfw katalogach będących w konflikcie, a następnie sudo pacman -S --force <package-name>prace.

Teraz moje pacman -Syupostanawia dobrze.

modulitos
źródło
6
- force jest przestarzałe; zamiast tego użyj --overwrite.
Ankit Balyan
6
--force działa dla mnie, ale - overwrite nie jest
Infernion
2
sudo pacman -Syu --forcepracował dla mnie, ale nadpisywanie nie zostało rozpoznane.
spydon
21

tl; dr: przed uruchomieniem odinstaluj aplikację powodującą konflikt pacman.

pacman(i inni menedżerowie pakietów) przechowują indeks pakietów i plików , którymi zarządzają ( pacman --query --list). Niektóre pliki, takie jak konfiguracja, zostaną oznaczone jako modyfikowalne i nie zostaną nadpisane podczas aktualizacji (z wyjątkiem szczególnych okoliczności, w których menedżer pakietów zazwyczaj usuwa stary plik przed utworzeniem nowego). Inne pliki zostaną oznaczone jako niemodyfikowalne. Jeśli inna aplikacja zmieni te pliki w jakikolwiek sposób bez odpowiedniej aktualizacji indeksu, menedżer pakietów nie będzie wiedział, co zrobić z tymi plikami podczas aktualizacji.

Wiele aplikacji zainstalowanych przy użyciu standardowego ./configure && make && sudo make installwzorca można odinstalować za pomocą sudo make uninstall. Jeśli aplikacja została zainstalowana w inny sposób, być może będziesz musiał ją odinstalować. Zasadniczo dobrym pomysłem może być przechowywanie kopii plików instalacyjnych gdzieś (na przykład ~/install), aby w takich przypadkach móc je niezawodnie odinstalować. Usunięcie konfliktu plików prawdopodobnie spowoduje pozostawienie innych plików, co może spowodować inne problemy.

Podczas instalowania oprogramowania za pomocą innych menedżerów pakietów istnieją sposoby odizolowania ich od plików systemowych. Jest to sprawdzona najlepsza praktyka, na przykład podczas tworzenia oprogramowania, w której naprawdę chcesz zachować spójność wersji i unikać konfliktów z innym oprogramowaniem. Przykłady obejmują:

l0b0
źródło
2
Zobacz mój komentarz do @umlaute powyżej. Myślę, że konflikt był z sudo pip installrozkazu. Być może powinienem unikać używania pip z sudo?
modulitos,
3

Z tego powodu instalowałem pakiety, które zwykle instaluję za pomocą pip za pomocą pacmana. Ale niektórych pakietów nie można znaleźć w repozytoriach Pacman. Myślę, że powinniśmy unikać instalowania pipa z uprawnieniami sudo i istead:

pip install pillow --user

Flaga --user powoduje, że zamiast tego instaluje się pakiety instalacyjne w katalogu domowym, co nie wymaga żadnych specjalnych uprawnień. https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install-user

lawa-lawa
źródło
2

TLDR;

  1. Pobierz listę szkodliwych plików (skopiuj i wklej dane wyjściowe pacmana do pliku).
  2. Użyj awk, aby usunąć wszystko oprócz ścieżek do nowej listy.
  3. Użyj while, aby usunąć szkodliwe pliki z drogi, na podstawie listy.
  4. Uruchom sudo pacman -Syuponownie.

    edytowane, aby dodać TLDR i naprawić literówki

Chociaż jestem całkiem pewien, że nie robiłem nic głupiego, miałem ten problem może za każdym razem, gdy próbowałem zaktualizować, odkąd korzystałem z Manjaro; trzy lub cztery razy w ciągu dwóch miesięcy. Chodzi o to, że to naprawia.

Uzyskaj listę swoich plików.

Gdy aktualizacja nie powiedzie się w oknie terminala, otrzymasz:

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

... i dużo więcej.

  • Skopiuj dane wyjściowe z terminala i umieść je w pliku. Użyłem nano i nazwałem moje „pliki” jak w ~ / work / files .

  • Usuń obce informacje:

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

    To pobiera drugie „słowo” z każdej linii i drukuje je do plików2.

Zajmij się plikami

  • Możesz je usunąć, przenieść lub zmienić ich nazwę.

  • Jeśli coś się psuje, najłatwiej to naprawić, jeśli zepsujemy go, przenosząc go zamiast usuwając lub zmieniając jego nazwę:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • Jeśli naprawdę chcesz je usunąć, czego nie ma powodu ( NIEBEZPIECZEŃSTWO NIEBEZPIECZEŃSTWO ): podczas odczytu pliku -r; do sudo rm - "$ file"; zrobione <pliki2

Aktualizacja

  • Aby - overwrite zadziałało, co musimy zrobić, aby Pacman zdał sobie sprawę, że pakiet nie jest uszkodzony, potrzebujesz następującej składni:

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

    • W moim przypadku: sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • Podążając za przykładem: sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • Miałem ładny problem, gdy po usunięciu dowiązania symbolicznego libidn2.so.0 nic nie działało, a kiedy go odłożyłem, pojawia się błąd „istnieje w systemie plików”. Powyższe, z opcją --overwrite, działało dla mnie.

  • Wreszcie:

    sudo pacman -Syu

Fin Hirschoff
źródło
1

Po tym, jak pacman w końcu wycofał --forceopcję i aby --overwriteopcja zastępcza działała zgodnie z oczekiwaniami, należy odnotować następujący wzór użycia.

Równoważne polecenie odtworzenia --forceopcji, która ślepo zastąpi wszystko, co powoduje konflikt, będzie:

sudo pacman -S --overwrite \*

Lub

sudo pacman -S --overwrite "*"

Najtrudniejszą częścią jest ucieczka przed globem, aby najpierw nie rozwinąć powłoki.

nic
źródło
0

Jeśli masz wiele plików takich jak ja,

sudo pacman --force -Syyu  

rozwiązuje wszystkie problemy.

Mohamed Hedi Kestouri
źródło
opcja - force jest przestarzała; zamiast tego użyj --overwrite
Mahmoud Khaled
- overwrite wydaje się określać, co należy zastąpić. obecnie używam --force wszystko jest w porządku
xsilen T