User:Wacek/brudnopis pacman
Menedżer pakietów pacman jest jedną z głównych cech wyróżniających Arch Linux. Łączy prosty format pakietu binarnego z łatwym w użyciu systemem budowania. Celem pacman jest umożliwienie łatwego zarządzania pakietami, niezależnie od tego, czy pochodzą one z oficjalnych repozytoriów, czy z własnych kompilacji użytkownika.
Pacman zapewnia aktualność systemu poprzez synchronizację list pakietów z serwerem głównym. Ten model serwer/klient umożliwia również użytkownikowi pobieranie/instalowanie pakietów za pomocą prostego polecenia, wraz ze wszystkimi wymaganymi zależnościami.
Pacman jest napisany w języku programowania C i do pakowania używa formatu bsdtar(1) tar.
pacman -Ql pacman pacman-contrib | grep -E 'bin/.+'
to see the full list.Stosowanie
Poniżej znajduje się tylko niewielka próbka operacji, które może wykonać pacman. Aby przeczytać więcej przykładów, zobacz pacman(8).
Instalowanie pakietu
A package is an archive containing:
- wszystkie (skompilowane) pliki aplikacji
- metadane dotyczące aplikacji, takie jak nazwa aplikacji, wersja, zależności itp.
- pliki instalacyjne i dyrektywy dla pacman.
- (opcjonalnie) dodatkowe pliki ułatwiające życie, takie jak skrypt start/stop
Menedżer pakietów Archa pacman może instalować, aktualizować i usuwać te pakiety. Korzystanie z pakietów zamiast samodzielnego kompilowania i instalowania programów ma wiele zalet:
- łatwo aktualizowalny: pacman zaktualizuje istniejące pakiety, gdy tylko będą dostępne aktualizacje
- sprawdzanie zależności: pacman obsługuje zależności za Ciebie, wystarczy określić program, a pacman zainstaluje go razem z każdym innym potrzebnym programem
- czyste usuwanie: pacman ma listę wszystkich plików w pakiecie; w ten sposób żadne pliki nie zostaną przypadkowo pozostawione, gdy zdecydujesz się usunąć pakiet.
- Pakiety często mają opcjonalne zależności, które są pakietami, które zapewniają dodatkową funkcjonalność aplikacji, ale nie są ściśle wymagane do jej uruchomienia. Podczas instalacji pakietu, pacman wyświetli listę opcjonalnych zależności pakietu, ale nie zostaną one znalezione w
pacman.log
. Użyj polecenia #Querying package databases[broken link: invalid section], aby wyświetlić opcjonalne zależności pakietu. - Podczas instalowania pakietu, który jest wymagany tylko jako (opcjonalna) zależność od innego pakietu (tzn. nie jest wymagany przez Ciebie wprost), zaleca się użycie opcji
--asdeps
. Aby uzyskać szczegółowe informacje, zobacz sekcję Powód instalacji[broken link: invalid section].
pacman -Sy package_name
instead of pacman -Syu package_name
, as this could lead to dependency issues. See System maintenance#Partial upgrades are unsupported and BBS#89328.Instalowanie określonych pakietów
Aby zainstalować pojedynczy pakiet lub listę pakietów, w tym zależności, wydaj następujące polecenie:
# pacman -S package_name1 package_name2 ...
Aby zainstalować listę pakietów z wyrażeniem regularnym (zobacz ten wątek na forum):
# pacman -S $(pacman -Ssq package_regex)
Czasami istnieje wiele wersji pakietu w różnych repozytoriach (np. extra i testing). Aby zainstalować wersję z extra repozytorium w tym przykładzie, repozytorium musi być zdefiniowane przed nazwą pakietu:
# pacman -S extra/package_name
Aby zainstalować kilka pakietów o podobnych wzorach w nazwach, można użyć rozwinięcia nawiasów klamrowych. Na przykład:
# pacman -S plasma-{desktop,mediacenter,nm}
Można to rozszerzyć na dowolną liczbę potrzebnych poziomów:
# pacman -S plasma-{workspace{,-wallpapers},pa}
Pakiety wirtualne
Pakiet wirtualny to specjalny pakiet, który sam nie istnieje, ale jest dostarczany przez jeden lub więcej innych pakietów. Pakiety wirtualne pozwalają innym pakietom nie nazywać określonego pakietu jako zależności, w przypadku kilku kandydatów. Pakiety wirtualne nie mogą być instalowane według ich nazwy, zamiast tego są instalowane w twoim systemie, gdy zainstalowałeś pakiet dostarczający pakiet wirtualny.
Instalowanie grup pakietów
Niektóre pakiety należą do grupy pakietów, z których wszystkie mogą być instalowane jednocześnie. Na przykład wydając polecenie:
# pacman -S gnome
poprosi Cię o wybranie pakietów z gnome gnome, które chcesz zainstalować.
Czasami grupa pakietów będzie zawierać dużą liczbę pakietów, a może być tylko kilka, które chcesz lub nie chcesz instalować. Zamiast wprowadzać wszystkie liczby oprócz tych, których nie chcesz, czasami wygodniej jest wybrać lub wykluczyć pakiety lub zakresy pakietów o następującej składni:
Enter a selection (default=all): 1-10 15
który wybierze pakiety od 1 do 10 i 15 do instalacji lub:
Enter a selection (default=all): ^5-8 ^2
który wybierze wszystkie pakiety z wyjątkiem 5 do 8 i 2 do instalacji.
Aby zobaczyć, jakie pakiety należą do grupy gnome, uruchom:
# pacman -Sg gnome
Odwiedź także https://archlinux.org/groups/, aby zobaczyć, jakie grupy pakietów są dostępne.
--needed
.Usuwanie pakietów
Aby usunąć pojedynczy pakiet, pozostawiając zainstalowane wszystkie jego zależności:
# pacman -R package_name
Aby usunąć pakiet i jego zależności, które nie są wymagane przez żaden inny zainstalowany pakiet:
# pacman -Rs package_name
Powyższe może czasami odmówić uruchomienia podczas usuwania grupy zawierającej w inny sposób potrzebne pakiety. W takim przypadku spróbuj:
# pacman -Rsu package_name
Aby usunąć pakiet, jego zależności i wszystkie pakiety zależne od pakietu docelowego:
# pacman -Rsc package_name
Aby usunąć pakiet, który jest wymagany przez inny pakiet, bez usuwania pakietu zależnego:
# pacman -Rdd package_name
Pacman zapisuje ważne pliki konfiguracyjne podczas usuwania niektórych aplikacji i nazywa je rozszerzeniem: .pacsave. Aby zapobiec tworzeniu tych plików kopii zapasowej, użyj opcji -n
:
# pacman -Rn package_name
Aktualizacja pakietów
- Oczekuje się, że użytkownicy będą postępować zgodnie ze wskazówkami w sekcji System maintenance#Upgrading the system, aby regularnie aktualizować swoje systemy i nie uruchamiać na ślepo następującego polecenia.
- Arch obsługuje tylko pełne aktualizacje systemu. Zobacz Konserwacja systemu Częściowe aktualizacje są nieobsługiwane i Instalowanie pakietów[broken link: invalid section], aby uzyskać szczegółowe informacje.
Pacman może zaktualizować wszystkie pakiety w systemie za pomocą tylko jednej komendy. Może to zająć trochę czasu, w zależności od aktualnego stanu systemu. Poniższe polecenie synchronizuje bazy danych repozytoriów i aktualizuje pakiety systemu, z wyłączeniem pakietów „lokalnych”, których nie ma w skonfigurowanych repozytoriach:
# pacman -Syu
Odpytywanie baz danych pakietów
Pacman wysyła zapytanie do lokalnej bazy danych pakietów z flagą -Q
, bazy danych synchronizacji z flagą -S
i bazy danych plików z flagą -F
. Zobacz pacman -Q --help
, pacman -S --help
i pacman -F --help
dla odpowiednich podopcji każdej flagi.
Pacman może wyszukiwać pakiety w bazie danych, przeszukując zarówno ich nazwy jak i opisy:
$ pacman -Ss string1 string2 ...
Czasami wbudowane ERE (Rozszerzone Wyrażenia Regularne) -s
może powodować wiele niepożądanych wyników, więc musi być ograniczone tylko do nazwy pakietu; nie opis ani żadne inne pole:
$ pacman -Ss '^vim-'
Aby wyszukać już zainstalowane pakiety:
$ pacman -Qs string1 string2 ...
Aby wyszukać nazwy plików pakietów w pakietach zdalnych:
$ pacman -F string1 string2 ...
Aby wyświetlić obszerne informacje o danym pakiecie:
$ pacman -Si package_name
W przypadku pakietów instalowanych lokalnie:
$ pacman -Qi package_name
Przekazanie dwóch flag -i
spowoduje również wyświetlenie listy plików kopii zapasowych i stanów ich modyfikacji:
$ pacman -Qii package_name
Aby pobrać listę plików zainstalowanych przez pakiet:
$ pacman -Ql package_name
Aby pobrać listę plików zainstalowanych przez pakiet zdalny:
$ pacman -Fl package_name
Aby zweryfikować obecność plików zainstalowanych przez pakiet:
$ pacman -Qk package_name
Dwukrotne przekazanie k
spowoduje dokładniejsze sprawdzenie.
Aby móc sprawdzić bazę danych, aby dowiedzieć się, czy należy dany plik w systemie plików:
$ pacman -Qo /path/to/file_name
Aby wysłać zapytanie do bazy danych, aby dowiedzieć się, do którego zdalnego pakietu należy plik:
$ pacman -F /path/to/file_name
Aby wyświetlić wszystkie pakiety, które nie są już wymagane jako zależności (sieroty):
$ pacman -Qdt
Exec
in your hook: /usr/bin/bash -c "/usr/bin/pacman -Qtd || /usr/bin/echo '=> None found.'"
Aby wyświetlić listę wszystkich pakietów zainstalowanych jawnie i niewymaganych jako zależności:
$ pacman -Qet
Zobacz Pacman/Tips and tricks, aby uzyskać więcej przykładów.
Pactree
Aby wyświetlić drzewo zależności pakietu:
$ pactree package_name
Aby wyświetlić zależne drzewo pakietu, należy przekazać flagę reverse -r
do pactree lub użyć whoneeds z pkgtoolsAUR
Struktura bazy danych
Bazy danych pacmana zwykle znajdują się w /var/lib/pacman/sync
. Dla każdego repozytorium określonego w /etc/pacman.conf
znajdzie się tam odpowiedni plik bazy danych. Pliki bazy danych to spakowane archiwa tar gzip zawierające jeden katalog na każdy pakiet, na przykład dla pakietu, which:
$ tree which-2.21-5
which-2.21-5 |-- desc
Plik desc
zawiera metadane, takie jak opis pakietu, zależności, rozmiar pliku i skrót MD5.
Czyszczenie pamięci podręcznej pakietów
Pacman przechowuje pobrane pakiety w /var/cache/pacman/pkg/
i nie usuwa automatycznie starych lub odinstalowanych wersji. Ma to pewne zalety:
- Pozwala na obniżenie wersji pakietu bez konieczności odzyskiwania poprzedniej wersji za pomocą innych środków, takich jak Arch Linux Archive.
- Odinstalowany pakiet można łatwo ponownie zainstalować bezpośrednio z katalogu pamięci podręcznej, bez konieczności ponownego pobierania z repozytorium.
Jednak konieczne jest okresowe czyszczenie pamięci podręcznej, aby zapobiec nieskończonemu wzrostowi rozmiaru katalogu.
Skrypt paccache(8), dostarczony w pakiecie pacman-contrib, domyślnie usuwa wszystkie buforowane wersje zainstalowanych i odinstalowanych pakietów, z wyjątkiem ostatnich trzech:
# paccache -r
Enable and start paccache.timer
to discard unused packages weekly.
Możesz także określić, ile ostatnich wersji chcesz zachować. Aby zachować tylko jedną poprzednią wersję, użyj:
# paccache -rk1
Dodaj przełącznik -u
/--uninstalled
, aby ograniczyć działanie paccache do odinstalowanych pakietów. Na przykład, aby usunąć wszystkie buforowane wersje odinstalowanych pakietów, użyj następującego:
# paccache -ruk0
Zobacz paccache -h
, aby uzyskać więcej opcji.
Pacman ma również kilka wbudowanych opcji czyszczenia pamięci podręcznej i pozostałych plików bazy danych z repozytoriów, które nie są już wymienione w pliku konfiguracyjnym /etc/pacman.conf
. Jednak pacman nie oferuje możliwości zachowania kilku poprzednich wersji i dlatego jest bardziej agresywny niż domyślne opcje paccache.
Aby usunąć wszystkie pakiety z pamięci podręcznej, które nie są obecnie zainstalowane, oraz nieużywaną bazę danych synchronizacji, wykonaj:
# pacman -Sc
Aby usunąć wszystkie pliki z pamięci podręcznej, użyj dwukrotnie czystego przełącznika, jest to najbardziej agresywne podejście i nie pozostawi nic w katalogu pamięci podręcznej:
# pacman -Scc
pkgcachecleanAUR and pacleanerAUR are two further alternatives to clean the cache.
Dodatkowe polecenia
Pobierz pakiet bez instalowania:
# pacman -Sw package_name
Zainstaluj pakiet „lokalny”, który nie pochodzi ze zdalnego repozytorium (np. pakiet pochodzi z AUR):
# pacman -U /path/to/package/package_name-version.pkg.tar.zst
Aby zachować kopię lokalnego pakietu w pamięci podręcznej pacman, użyj:
# pacman -U file:///path/to/package/package_name-version.pkg.tar.zst
Zainstaluj pakiet „zdalny” (nie z repozytorium określonego w plikach konfiguracyjnych „pacmana”):
# pacman -U http://www.example.com/repo/example.pkg.tar.zst
To inhibit the -S
, -U
and -R
actions, -p
can be used.
Pacman zawsze wyświetla listę pakietów do zainstalowania lub usunięcia i prosi o pozwolenie przed podjęciem działań.
Powód instalacji
Baza danych pacman dzieli zainstalowane pakiety na dwie grupy, w zależności od powodu instalacji:
- zainstalowane-jawnie: pakiety, które zostały dosłownie przekazane do ogólnego polecenia pacman
-S
lub-U
; - zależności: pakiety, które pomimo tego, że nigdy (ogólnie) nie zostały przekazane do polecenia instalacji pacmana, zostały zainstalowane niejawnie, ponieważ były wymagane przez pakiety zainstalowane jawnie.
Podczas instalacji pakietu można wymusić „zależność” jego powodu instalacji z:
# pacman -S --asdeps package_name
Polecenie jest zwykle używane, ponieważ pakiety zainstalowane jawnie mogą oferować pakiety opcjonalne, zwykle dla nieistotnych funkcji, co do których użytkownik może według własnego uznania.
--asdeps
will ensure that, if you remove orphans, pacman will also remove optional packages set this way.Jednak podczas ponownej instalacji pakietu domyślnie zachowywany jest bieżący powód instalacji.
The list of explicitly-installed packages can be shown with pacman -Qe
, while the complementary list of dependencies can be shown with pacman -Qd
.
Aby zmienić powód instalacji już zainstalowanego pakietu, wykonaj:
# pacman -D --asdeps package_name
Użyj --asexplicit
, aby wykonać odwrotną operację.
--asdeps
i --asexplicit
podczas aktualizacji, takich jak pacman pacman -Syu package_name --asdeps
jest odradzane. Zmieniłoby to przyczynę instalacji nie tylko instalowanego pakietu, ale także aktualizowanych pakietów.Wyszukaj pakiet zawierający określony plik
Zsynchronizuj bazę danych plików:
# pacman -Fy
Wyszukaj pakiet zawierający plik, np.:
$ pacman -F pacman
core/pacman 5.2.1-1 (base base-devel) [installed] usr/bin/pacman usr/share/bash-completion/completions/pacman extra/xscreensaver 5.43-1 usr/lib/xscreensaver/pacman
Aby uzyskać zaawansowane funkcje, zainstaluj pakiet pkgfile, który korzysta z oddzielnej bazy danych ze wszystkimi plikami i powiązanymi z nimi pakietami.
Co się dzieje podczas instalacji/aktualizacji/usuwania pakietu?
Po pomyślnym przebiegu transakcji przepływ pracy obejmuje pięć etapów wysokiego poziomu oraz punkty zaczepienia przed/po transakcji:
- Zainicjuj transakcję, jeśli nie ma blokady bazy danych
- Wybierz, które pakiety zostaną dodane lub usunięte w transakcji
- Przygotuj transakcję w oparciu o flagi, wykonując testy poprawności w bazach danych synchronizacji, pakietach i ich zależnościach
- Zatwierdź transakcję:
- W stosownych przypadkach pobierz pakiety (
_alpm_sync_load
) - Jeśli mają zastosowanie istniejące wcześniej hooki pacman
PreTransaction
, są one wykonywane. - Usuwane są pakiety, które mają zostać zastąpione, są w konflikcie lub są wyraźnie przeznaczone do usunięcia
- Jeśli są pakiety do dodania, każdy pakiet jest zatwierdzony
- If the package has an install script, its
pre_install
function is executed (orpre_upgrade
orpre_remove
in the case of an upgraded or removed package). - Pacman deletes all the files from a pre-existing version of the package (in the case of an upgraded or removed package). However, files that were marked as configuration files in the package are kept (see /Pacnew and Pacsave).
- Pacman rozpakowuje pakiet i zrzuca swoje pliki do systemu plików (w przypadku zainstalowanego lub zaktualizowanego pakietu). Pliki, które zastąpiłyby zachowane i ręcznie zmodyfikowane pliki konfiguracyjne (patrz poprzedni krok), są przechowywane pod nową nazwą (.pacnew).
- If the package has an install script, its
post_install
function is executed (orpost_upgrade
orpost_remove
in the case of an upgraded or removed package).
- If the package has an install script, its
- If pacman
PostTransaction
hooks that exist at the end of the transaction apply, they are executed.
- W stosownych przypadkach pobierz pakiety (
- Release the transaction and transaction resource (i.e. database lock)
Konfiguracja
Ustawienia Pacmana znajdują się w /etc/pacman.conf
: jest to miejsce, w którym użytkownik konfiguruje program, aby działał w żądany sposób. Szczegółowe informacje o pliku konfiguracyjnym można znaleźć w pacman.conf(5).
Opcje ogólne
Opcje ogólne znajdują się w sekcji [options]
. Przeczytaj pacman.conf(5) lub zajrzyj do domyślnego pliku pacman.conf
, aby dowiedzieć się, co można tutaj zrobić.
Porównanie wersji przed aktualizacją
Aby zobaczyć stare i nowe wersje dostępnych pakietów, odkomentuj wiersz "VerbosePkgLists" w /etc/pacman.conf
Wyjście pacman -Syu
będzie wyglądać tak:
Package (6) Old Version New Version Net Change Download Size extra/libmariadbclient 10.1.9-4 10.1.10-1 0.03 MiB 4.35 MiB extra/libpng 1.6.19-1 1.6.20-1 0.00 MiB 0.23 MiB extra/mariadb 10.1.9-4 10.1.10-1 0.26 MiB 13.80 MiB
Włączanie równoległego pobierania
Pacman 6.0 wprowadził opcję równoległego pobierania pakietów. ParallelDownloads
w [options]
musi być ustawiony na dodatnią liczbę całkowitą w /etc/pacman.conf
, aby użyć tej funkcji 5
). W przeciwnym razie pakiety będą pobierane sekwencyjnie, jeśli ta opcja nie jest ustawiona.
Pomiń pakiet od aktualizacji
Aby konkretny pakiet został pominięty podczas upgrading[broken link: invalid section] systemu, dodaj tę linię w sekcji [options]
:
IgnorePkg=linux
For multiple packages use a space-separated list, or use additional IgnorePkg
lines. Also, glob patterns can be used. If you want to skip packages just once, you can also use the --ignore
option on the command-line - this time with a comma-separated list.
It will still be possible to upgrade the ignored packages using pacman -S
: in this case pacman will remind you that the packages have been included in an IgnorePkg
statement.
Pomiń grupę pakietów przed aktualizacją
Podobnie jak w przypadku pakietów, możliwe jest również pominięcie całej grupy pakietów:
IgnoreGroup=gnome
Pomiń aktualizację pliku
Wszystkie pliki wymienione z dyrektywą NoUpgrade
nigdy nie zostaną dotknięte podczas instalacji/uaktualnienia pakietu, a nowe pliki zostaną zainstalowane z rozszerzeniem .pacnew.
NoUpgrade=path/to/file
Wiele plików można określić w następujący sposób:
NoUpgrade=path/to/file1 path/to/file2
Pomiń instalację plików w systemie
Aby zawsze pomijać instalację określonych katalogów, wymień je w NoExtract
. Na przykład, aby uniknąć instalacji jednostek systemd, użyj tego:
NoExtract=usr/lib/systemd/system/*
Późniejsze reguły zastępują poprzednie i możesz je zanegować, dołączając !
.
CheckSpace
w pacman.conf
blokuje takie ostrzeżenia, ale należy wziąć pod uwagę, że funkcja sprawdzania miejsca będzie wyłączona dla wszystkich pakietów.Zachowaj kilka plików konfiguracyjnych
Jeśli masz kilka plików konfiguracyjnych (np. konfigurację główną i konfigurację z włączonym repozytorium testing) i musisz dzielić opcje pomiędzy konfiguracjami, możesz użyć opcji Include
zadeklarowanej w plikach konfiguracyjnych, np.:
Include = /path/to/common/settings
gdzie /path/to/common/settings
ustawień zawiera te same opcje dla obu konfiguracji.
Hooks
Pacman może uruchamiać hooki przed i po transakcji z katalogu /usr/share/libalpm/hooks/
; więcej katalogów można określić za pomocą opcji HookDir
w pacman.conf
, która domyślnie to /etc/pacman.d/hooks
. Nazwy plików przechwytujących muszą mieć przyrostek .hook. Haki Pacmana nie są interaktywne.
Haki Pacman są używane na przykład w połączeniu z systemd-sysusers
i systemd-tmpfiles
do automatycznego tworzenia użytkowników systemu i plików podczas instalacji pakietów. Na przykład tomcat8 określa, że chce użytkownika systemowego o nazwie tomcat8
i określonych katalogów należących do tego użytkownika. Pacman przechwytuje systemd-sysusers.hook
i systemd-tmpfiles.hook
wywołuje systemd-sysusers
i systemd-tmpfiles
, gdy pacman stwierdzi, że tomcat8 zawiera pliki określające użytkowników i pliki tmp.
Więcej informacji o hakach alpm znajdziesz w alpm-hooks(5).
Repozytoria i mirrory
Oprócz specjalnej sekcji [options[broken link: invalid section]], każda inna [section]
w pacman.conf
definiuje repozytorium pakietów, które ma być używane. Repozytorium to logiczny zbiór pakietów, które są fizycznie przechowywane na jednym lub kilku serwerach: z tego powodu każdy serwer jest nazywany mirrorem repozytorium.
Repozytoria rozróżnia się na oficjalne i nieoficjalne. Kolejność repozytoriów w pliku konfiguracyjnym ma znaczenie; repozytoria wymienione jako pierwsze będą miały pierwszeństwo przed tymi wymienionymi później w pliku, gdy pakiety w dwóch repozytoriach mają identyczne nazwy, niezależnie od numeru wersji. Aby korzystać z repozytorium po jego dodaniu, musisz najpierw upgrade[broken link: invalid section] cały system.
Każda sekcja repozytorium umożliwia zdefiniowanie listy swoich serwerów lustrzanych bezpośrednio lub w dedykowanym pliku zewnętrznym poprzez dyrektywę Include
; na przykład serwery lustrzane oficjalnych repozytoriów znajdują się w /etc/pacman.d/mirrorlist
. Zobacz artykuł Mirrors, aby dowiedzieć się jak skonfigurować mirror.
Katalog cache pakietów
Pacman przechowuje pobrane pliki pakietów w pamięci podręcznej, w katalogu oznaczonym CacheDir
w sekcji [options[broken link: invalid section]] pliku pacman.conf
(domyślnie/var/cache/pacman/pkg/
, jeśli nie jest ustawiony).
Katalog Cachej może z czasem się rozrastać, nawet przy zachowaniu tylko najświeższych wersji zainstalowanych pakietów.
Jeśli chcesz przenieść ten katalog w bardziej dogodne miejsce, wykonaj jedną z następujących czynności:
- Ustaw opcję
CacheDir
wpacman.conf
na nowy katalog. Pamiętaj o zachowaniu końcowego ukośnika. To jest zalecane rozwiązanie. - Zamontuj dedykowaną partycję lub np. Btrfs subvolume w
/var/cache/pacman/pkg/
. - Zamontuj wybrany katalog w
/var/cache/pacman/pkg/
.
/var/cache/pacman/pkg/
do innej lokalizacji. Spowoduje to, że pacman będzie się źle zachowywał, zwłaszcza gdy pacman spróbuje się zaktualizować.Package security
Pacman obsługuje podpisy pakietów, które dodają dodatkową warstwę bezpieczeństwa do pakietów. Domyślna konfiguracja, SigLevel = Required DatabaseOptional
, umożliwia weryfikację podpisu dla wszystkich pakietów na poziomie globalnym. Można to zastąpić wierszami SigLevel
dla poszczególnych repozytorium. Aby uzyskać więcej informacji na temat podpisywania pakietów i weryfikacji podpisów, spójrz na pacman-key
Rozwiązywanie problemów
"Failed to commit transaction (conflicting files)" error
Jeśli zobaczysz następujący błąd: [1]
error: could not prepare transaction error: failed to commit transaction (conflicting files) package: /path/to/file exists in filesystem Errors occurred, no packages were upgraded.
Dzieje się tak, ponieważ pacman wykrył konflikt plików i zgodnie z projektem nie nadpisze plików. Jest to zgodne z projektem, a nie wada.
The problem is usually trivial to solve. A safe way is to first check if another package owns the file (pacman -Qo /path/to/file
). If the file is owned by another package, file a bug report. If the file is not owned by another package, rename the file which 'exists in filesystem' and re-issue the update command. If all goes well, the file may then be removed.
If you had installed a program manually without using pacman, for example through make install
, you have to remove/uninstall this program with all of its files. See also Pacman tips#Identify files not owned by any package.
Every installed package provides a /var/lib/pacman/local/package-version/files
file that contains metadata about this package. If this file gets corrupted, is empty or goes missing, it results in file exists in filesystem
errors when trying to update the package. Such an error usually concerns only one package. Instead of manually renaming and later removing all the files that belong to the package in question, you may explicitly run pacman -S --overwrite glob package
to force pacman to overwrite files that match glob
.
--overwrite
switch. See System maintenance#Avoid certain pacman commands."Failed to commit transaction (invalid or corrupted package)" error
Poszukaj plików .part (częściowo pobranych pakietów) w /var/cache/pacman/pkg/
i usuń je (często spowodowane użyciem niestandardowego XferCommand
w pacman.conf
).
# find /var/cache/pacman/pkg/ -iname "*.part" -delete
Ten sam błąd może się również pojawić, jeśli archlinux-keyring jest nieaktualny, co uniemożliwia pacmanowi weryfikację podpisów. Zobacz Pacman/Package signing#Upgrade system regularly, aby poznać poprawkę i sposoby jej uniknięcia w przyszłości.
"Failed to init transaction (unable to lock database)" error
Kiedy pacman zamierza zmienić bazę danych pakietów, na przykład zainstalować pakiet, tworzy plik blokady w /var/lib/pacman/db.lck
. Zapobiega to jednoczesnej próbie zmiany bazy danych pakietów przez inną instancję pacmana.
Jeśli pacman zostanie przerwany podczas zmiany bazy danych, ten przestarzały plik blokady może pozostać. Jeśli masz pewność, że żadne instancje pacmana nie są uruchomione, usuń plik blokady:
# rm /var/lib/pacman/db.lck
fuser /var/lib/pacman/db.lck
jako root, aby sprawdzić, czy jakiś proces nadal go używa.Packages cannot be retrieved on installation
Ten błąd objawia się jako Not found in sync db
, Target not found
lub Failed retrieving file
.
Po pierwsze, upewnij się, że pakiet rzeczywiście istnieje. Jeśli masz pewność, że pakiet istnieje, Twoja lista pakietów może być nieaktualna. Spróbuj uruchomić pacman -Syu
, aby wymusić odświeżenie wszystkich list pakietów i aktualizację. Upewnij się również, że wybrane serwery lustrzane są aktualne, a repozytoria[broken link: invalid section] są poprawnie skonfigurowane.
Może się również zdarzyć, że repozytorium zawierające pakiet nie jest włączone w twoim systemie, np. pakiet może znajdować się w repozytorium multilib, ale multilib nie jest włączony w twoim pacman.conf
.
Zobacz też FAQ#Why is there only a single version of each shared library in the official repositories?.
Pacman ulega awarii podczas aktualizacji
W przypadku awarii pacmana z błędem „zapisu do bazy danych” podczas usuwania pakietów, a ponowna instalacja lub aktualizacja pakietów nie powiedzie się, wykonaj następujące czynności:
- Uruchom komputer za pomocą nośnika instalacyjnego Arch. Najlepiej używać najnowszego nośnika, aby wersja pacmana była zgodna/była nowsza niż system.
- Zamontuj główny system plików systemu, np.
mount /dev/sdaX /mnt
jako root i sprawdź, czy w mount jest wystarczająca ilość miejsca za pomocądf -h
- Zamontuj również systemy plików proc, sys i dev:
mount -t proc proc /mnt/proc; mount --rbind /sys /mnt/sys; mount --rbind /dev /mnt/dev
- Jeśli system używa domyślnych lokalizacji baz danych i katalogów, możesz teraz zaktualizować systemową bazę danych pacman i zaktualizować ją przez
pacman --sysroot /mnt -Syu
jako root.- Alternatywnie, jeśli nie możesz zaktualizować/uaktualnić, zapoznaj się z Pacman/Tips and tricks#Reinstalling all packages.
- Po aktualizacji, jeden ze sposobów, aby dokładnie sprawdzić, czy pakiety nie są uaktualnione, ale nadal są uszkodzone:
find /mnt/usr/lib -size 0
- Po czym następuje ponowna instalacja wciąż uszkodzonego pakietu przez
pacman --sysroot /mnt -S package
.
pacman: command not found
Jeśli /var/cache/pacman/pkg
jest dowiązaniem symbolicznym, pacman spróbuje zamiast tego utworzyć katalog, a tym samym usunie to dowiązanie symboliczne podczas samodzielnej aktualizacji. Spowoduje to niepowodzenie aktualizacji. W rezultacie brakuje /usr/bin/pacman
i innej zawartości pakietu pacman.
Nigdy nie dowiązuj symbolicznie /var/cache/pacman/pkg
, ponieważ jest kontrolowany przez pacmana. Zamiast tego użyj opcji CacheDir
lub montowania powiązania; zobacz #Package cache directory[broken link: invalid section].
Jeśli już napotkałeś ten problem i zepsułeś system, możesz ręcznie wyodrębnić zawartość /usr
z pakietu, aby przywrócić pacman, a następnie zainstalować go ponownie; zobacz FS#73306 i powiązany wątek na forum, aby uzyskać szczegółowe informacje.
Ręczna ponowna instalacja pacman
Korzystanie z pacman-static
pacman-staticAUR jest statycznie skompilowaną wersją pacmana, więc będzie mógł działać nawet wtedy, gdy biblioteki w systemie nie działają. Może się to również przydać, gdy przeprowadzono częściową aktualizację i pacman nie może już działać.
Przypięty komentarz i PKGBUILD umożliwiają bezpośrednie pobranie pliku binarnego, którego można użyć do ponownej instalacji pacmana lub aktualizacji całego systemu w przypadku aktualizacji częściowych.
Korzystanie z zewnętrznego pacmana
Jeśli nawet pacman-static
nie działa, możliwe jest odzyskanie za pomocą zewnętrznego pacmana. Jedną z najłatwiejszych metod jest użycie archiso i po prostu użycie --sysroot
lub --root
do określenia punktu montowania. Zobacz Chroot#Using chroot, aby dowiedzieć się, jak zamontować niezbędne systemy plików wymagane przez --sysroot
.
Poprzez ręczne wyodrębnianie
Nawet jeśli pacman jest strasznie zepsuty, możesz go naprawić ręcznie, pobierając najnowsze pakiety i rozpakowując je we właściwych lokalizacjach. Wstępne kroki do wykonania to:
- Określ zależności pacman do zainstalowania
- Pobierz każdy pakiet z wybranego mirrora
- Wypakuj każdy pakiet do roota
- Zainstaluj ponownie te pakiety za pomocą pacman
pacman -S --overwrite
, aby odpowiednio zaktualizować bazę danych pakietów - Wykonaj pełną aktualizację systemu
Jeśli masz pod ręką zdrowy system Arch, możesz zobaczyć pełną listę zależności z:
$ pacman -Q $(pactree -u pacman)
Ale w zależności od problemu może być konieczne zaktualizowanie tylko kilku z nich. Przykładem wyodrębniania pakietu jest
# tar -xvpwf package.tar.zst -C / --exclude .PKGINFO --exclude .INSTALL --exclude .MTREE --exclude .BUILDINFO
Zwróć uwagę na użycie flagi w
dla trybu interaktywnego. Uruchamianie w trybie nieinteraktywnym jest bardzo ryzykowne, ponieważ możesz nadpisać ważny plik. Zadbaj również o wyodrębnienie pakietów we właściwej kolejności (tj. najpierw zależności). Ten post na forum zawiera przykład tego procesu, w którym uszkodzonych jest tylko kilka zależności od pacmana.
"Unable to find root device" error after rebooting
Najprawdopodobniej initramfs został uszkodzony podczas aktualizacji jądra (przyczyną może być niewłaściwe użycie opcji --overwrite
w pacman). Istnieją dwie opcje; najpierw wypróbuj wpis Fallback.
Tab
key when the boot loader menu shows up (for Syslinux) or e
(for GRUB or systemd-boot), rename it initramfs-linux-fallback.img
and press Enter
or b
(depending on your boot loader) to boot with the new parameters.Po uruchomieniu systemu uruchom to polecenie (dla podstawowego jądra linux) z konsoli lub terminala, aby odbudować obraz initramfs:
# mkinitcpio -p linux
Jeśli to nie zadziała, z bieżącego wydania Arch (CD/DVD lub pamieci USB), zamontuj partycje root i boot odpowiednio do /mnt
i /mnt/boot
. Następnie wykonaj chroot za pomocą arch-chroot:
# arch-chroot /mnt # pacman -Syu mkinitcpio systemd linux
- If you do not have a current release or if you only have some other "live" Linux distribution laying around, you can chroot using the old fashioned way. Obviously, there will be more typing than simply running the
arch-chroot
script. - If pacman fails with
Could not resolve host
, please check your internet connection. - If you cannot enter the arch-chroot or chroot environment but need to re-install packages you can use the command
pacman --sysroot /mnt -Syu foo bar
to use pacman on your root partition.
Ponowna instalacja jądra (pakietu linux) spowoduje automatyczne ponowne wygenerowanie obrazu initramfs za pomocą polecenia mkinitcpio -p linux
. Nie ma potrzeby robienia tego osobno.
Następnie zalecane jest uruchomienie exit
, umount /mnt/{boot,}
i reboot
.
"Warning: current locale is invalid; using default "C" locale" error
Jak mówi komunikat o błędzie, Twoje ustawienia regionalne nie są poprawnie skonfigurowane. Zobacz Locale.
Pacman nie uwzględnia ustawień proxy
Make sure that the relevant environment variables ($http_proxy
, $ftp_proxy
etc.) are set up. If you use pacman with sudo, you need to configure sudo to pass these environment variables to pacman. Also, ensure the configuration of dirmngr has honor-http-proxy
in /etc/pacman.d/gnupg/dirmngr.conf
to honor the proxy when refreshing the keys.
Jak ponownie zainstalować wszystkie pakiety, zachowując informacje o tym, czy coś zostało zainstalowane jawnie, czy jako zależność?
Aby ponownie zainstalować wszystkie pakiety natywne: pacman -Qnq | pacman -S -
lub pacman -S $(pacman -Qnq)
(opcja -S
domyślnie zachowuje przyczynę instalacji).
Będziesz musiał ponownie zainstalować wszystkie obce pakiety, które można wyświetlić za pomocą pacman -Qmq
Wygląda na to, że poprzednia transakcja pacman została usunięta lub uszkodzone biblioteki współdzielone potrzebne do samego pacmana.
Aby wyjść z tej sytuacji, musisz ręcznie rozpakować wymagane biblioteki do systemu plików. Najpierw znajdź pakiet zawierający pominiętą bibliotekę, a następnie zlokalizuj go w pamięci podręcznej pacmana (/var/cache/pacman/pkg/
). Rozpakuj wymaganą bibliotekę współdzieloną do systemu plików. Umożliwi to uruchomienie pacmana.
Teraz musisz ponownie zainstalować[broken link: invalid section] uszkodzony pakiet. Zauważ, że musisz użyć flagi --overwrite
, ponieważ właśnie rozpakowujesz pliki systemowe, a pacman o tym nie wie. Pacman poprawnie zastąpi nasz plik biblioteki współdzielonej jednym z pakietu.
To wszystko. Zaktualizuj resztę systemu.
Freeze of package downloads
Zgłoszono pewne problemy dotyczące problemów z siecią, które uniemożliwiają pacmanowi aktualizację/synchronizację repozytoriów. [2] [3] Podczas instalacji Arch Linux natywnie problemy te zostały rozwiązane przez zastąpienie domyślnego programu do pobierania plików pacman alternatywą (zobacz Improve pacman performance, aby uzyskać więcej informacji). Podczas instalowania Arch Linux jako systemu gościa w VirtualBox problem ten został również rozwiązany poprzez użycie interfejsu hosta zamiast NAT we właściwościach komputera.
Failed retrieving file 'core.db' from mirror
Jeśli otrzymasz ten komunikat o błędzie z poprawnymi serwerami lustrzanymi, spróbuj ustawić inny serwer nazw.
error: 'local-package.pkg.tar': permission denied
Jeśli chcesz zainstalować pakiet sshfs mount za pomocą pacman -U
i pojawi się ten błąd, przenieś pakiet do katalogu lokalnego i spróbuj ponownie zainstalować.
error: could not determine cachedir mount point /var/cache/pacman/pkg
Podczas wykonywania np. pacman -Syu
w środowisku chroot pojawia się błąd:
error: could not determine cachedir mount point /var/cache/pacman/pkg error: failed to commit transaction (not enough free disk space)
Jest to często spowodowane tym, że katalog chroot nie jest punktem montowania w momencie wejścia do chroota. Zobacz notatkę w sekcji Zainstaluj Arch Linux z istniejącego systemu Install Arch Linux from existing Linux#Downloading basic tools dla rozwiązania i arch-chroot(8), aby uzyskać wyjaśnienie i przykład użycia montowania z wiązaniem, aby katalog chroot stał się punktem montowania. :
error: GPGME error: No data
Jeśli nie możesz zaktualizować pakietów i otrzymasz ten błąd, spróbuj rm -r /var/lib/pacman/sync/
przed próbą aktualizacji.