Mam system Fedora (A), w którym przez pewien czas instalowałem kilka pakietów. Teraz chcę zainstalować Fedorę na innym komputerze (B) i chcę zainstalować na nim te same pakiety.
W kategoriach Debiana chcę osiągnąć coś takiego:
$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b
Ale szczerze mówiąc, naprawdę chcę lepszej metody wybierania tych samych pakietów w nowym systemie Fedora 19 (B): chcę tylko zainstalować pakiety z systemu A, które zostały wyraźnie wymienione z wiersza poleceń dnf install
(lub yum install
) – a nie tych, które zostały zainstalowane jako zależności!
Dlaczego? Ponieważ być może zależności się zmieniły – i nie chcę instalować przestarzałych zależności w nowym systemie. Dodatkowo, kiedy usuwam pakiety, chcę usunąć (prawdopodobnie) niepotrzebne automatycznie zainstalowane zależności (np. Sieroty).
Znalazłem dnf list installed
– ale nie wyświetla się, jeśli pakiet został jawnie wybrany lub właśnie został zainstalowany z powodu zależności.
Jak mogę pobrać te informacje z Fedory?
W jaki sposób Fedora / dnf replikuje wybory pakietów?
Odpowiedź
Od Fedory 26, podkomenda Dnf repoquery
obsługuje , ma nową opcję wyświetlania listy wszystkich pakietów zainstalowanych przez użytkowników:
$ dnf repoquery --qf "%{name}" --userinstalled \ | grep -v -- "-debuginfo$" \ | grep -v "^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$" > pkgs_a.lst
W przeciwieństwie do innych metod, wyświetla także wszystkie pakiety informacji o debugowaniu. Dodatkowy grep w powyższym przykładzie odfiltrowuje je.
Aby zainstalować listę na hoście B:
$ < pkgs_a.lst xargs dnf -y install
Dnf API
W przypadku ostatnich wersji Dnf (np. Fedora> = 23), można przeszukiwać bazę danych pakietów o nazwy pakietów zainstalowanych przez użytkownika za pośrednictwem interfejsu API Dnf Python:
$ python3 -c "import dnf; b = dnf.Base(); b.fill_sack(); \ l = sorted(set(x.name for x in b.iter_userinstalled() \ if not x.name.endswith("-debuginfo") \ and x.name not in \ ["kernel-modules", "kernel", "kernel-core", "kernel-devel"] )); \ print("\n".join(l)) " > pkgs_a.lst # dnf install $(cat pkgs_a.lst) # on host_b
Domyślnie dnf install
przerywa działanie, jeśli co najmniej jeden pakiet nie jest już dostępny. Alternatywnie można wymusić dnf aby zainstalować wszystkie pozostałe:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Umieść powyższy kod i nie tylko w user-installed.py
, który obsługuje również inne dystrybucje.
historia zainstalowana przez użytkownika
W Fedorze 23 i nowszych Dnf udostępnia polecenie
# dnf history userinstalled
, które wyświetla listę wszystkich pakietów zainstalowanych przez użytkowników. Od 2016-11 , jego użyteczność jest ograniczona , ponieważ nie ma możliwości kontroluje swoje wyjście i drukuje pakiety w pełni kwalifikowane (tj. w tym informacje o wersji).
Ograniczenia instalowane przez użytkownika
Zwróć uwagę, że oznaczanie pakietów jako zainstalowanych przez użytkownika ma pewne ograniczenia w niektórych wersjach Fedory dla systemów Fedory z ery 23-ej (od około 2015 -11) następujące kwestie są istotne):
- pakiety zainstalowane przez GUI nie są uwzględniane
- pakiety zainstalowane za pomocą programu obsługi nie znaleziono polecenia nie są uwzględniane
- niektóre pakiety instalowane domyślnie (przez anacondę) są uwzględnione
Repoquery
W starszych systemach Fedora, w których Dnf, Dnf API i dnf history userinstalled
nie są dostępne, zamiast tego można użyć repoquery , np .:
$ repoquery --installed \ --qf "%{n} | %{yumdb_info.reason} | %{yumdb_info.installed_by}" --all \ | awk -F"|" " $2 ~ /user/ && ($3 != 4294967295) { print $1 }" \ | sort -u > pkgs_a.lst
Drugi warunek awk służy do wykluczania pakietów, które zostały zainstalowane przez instalatora. Identyfikator użytkownika instalatora został najwyraźniej zapisany jako 4294967295 – alternatywnie możesz napisać coś takiego jak
.
Zauważ, że to polecenie działa w Fedorze do wydania 21 – ale np. nie w wersji 23, ponieważ polecenie repoquery
zostało zastąpione przez dnf repoquery
. dnf repoquery
nie rozumie tagu %{yumdb_info.reason}
.
Komentarze
Odpowiedź
Najłatwiejszy sposób, który działał przez długi czas, to:
yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump>
…, które działa podobnie do polecenia get / set selections dpkg, AIUI.Zauważ również, że jeśli odtwarzasz historię ponownie, możesz użyć:
yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info>
… zamiast analizować ją samodzielnie.
Odpowiedź
Zainspirowany slm „s answer Mam następujące rozwiązanie oparte na yum history
:
Uzyskaj całą szczegółową historię wszystkich transakcji yum install (tj. bez uaktualnień) , z wyłączeniem tych wykonanych jako część początkowych działań instalatora (transakcje 1 i 2 w moim systemie, przypisane do użytkownika „System”):
$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history
Filtruj jawnie zainstalowane pakiety i odciąć prefiksy wersji.
$ < yum_history grep "[^-]\<Install\>" | \ awk "{ print $2 }" \ | sed "s/\(-[0-9]\+:\|-[0-9]\+\.[0-9]\|-[0-9]\+-\|-[0-9]\+git\).\+\(\.fc1[1-7]\.\|\.noarch\).*$//" \ | sort > hist_pkg_list
Brzydkie wyrażenie regularne jest potrzebne, aby dopasować wszystkie rodzaje sufiksów wersji.
Wyniki wygląda całkiem dobrze w moim systemie.
Porównanie z repoquery ansatz (w moim systemie):
method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214
(Przesłałem wyniki repo ugh sort -u)
Dlaczego są różnice? Ponieważ repoquery zawiera wszystkie pakiety z transakcji 1 i 2, tj. Wszystkie pakiety, które zostały zainstalowane przez instalator Fedory. To wyjaśnia, dlaczego repoquery zawiera wspomniane pakiety xorg-x11- drv-mga i friends.
Porównanie repoquery-2nd i yum-history pokazuje, że repoquery-2nd jest dokładniejsze – nie obejmuje niektórych już usuniętych pakietów . Dodatkowo zawiera kilka (2 w moim systemie) pakietów z operacji „yum update”, jak się wydaje.
Ostrzeżenie
Powyższa metoda oparta na historii wymienia tylko wszystkie jawnie zainstalowane pakiety przez cały okres użytkowania systemu. Nie równoważy tych pakietów, które zostały usunięte w późniejszej transakcji. Dlatego ta metoda wymaga ręcznej selekcji wyników i powinna być używana tylko w systemach, w których repoquery
jest niedostępna.
Komentarze
- Niezły sposób, aby wykorzystać najlepsze z obu naszych odpowiedzi! ' dałbym ci więcej niż +1, gdybym mógł za ewentualne rozwiązanie + ładne porównanie różnych sposobów.
Odpowiedź
Mam starszą wersję Fedory (14), więc mój program yum zawiera mniej bogatą w funkcje wersję yum
, ale warto przyjrzeć się funkcji yum history
. Wierzę, że możesz uzyskać informacje, których szukasz, z tego polecenia.
lista historii
$ sudo yum history list Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 862 | System <unset> | 2013-07-12 18:00 | Install | 1 861 | System <unset> | 2013-07-09 03:11 | Install | 1 860 | System <unset> | 2013-07-01 13:40 | Install | 1 859 | System <unset> | 2013-06-29 22:07 | Install | 1 858 | System <unset> | 2013-06-25 22:33 | Install | 1 P< 857 | System <unset> | 2013-06-23 22:28 | Update | 1 >E 856 | System <unset> | 2013-06-23 21:33 | Install | 1 ...
Możesz wrócić do pierwsza transakcja poprzez przekazanie listy numerów do yum history list
:
$ sudo yum history list `seq 1 10` Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 10 | Sam M. (local) <saml> | 2010-12-18 23:23 | Install | 2 9 | Sam M. (local) <saml> | 2010-12-18 23:15 | Install | 38 8 | Sam M. (local) <saml> | 2010-12-18 23:12 | Install | 1 7 | Sam M. (local) <saml> | 2010-12-18 23:09 | Install | 1 < 6 | Sam M. (local) <saml> | 2010-12-18 22:37 | Install | 1 > 5 | Sam M. (local) <saml> | 2010-12-18 21:57 | Install | 1 4 | System <unset> | 2010-12-18 21:21 | Install | 5 3 | System <unset> | 2010-12-18 21:18 | Install | 4 2 | System <unset> | 2010-12-18 21:10 | Install | 3 1 | System <unset> | 2010-12-18 19:14 | Install | 1189
informacje o historii
Poniżej pokażemy, co zostało zainstalowane jako część pierwszej transakcji yum:
$ sudo yum history info 1 | less Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list Transaction ID : 1 Begin time : Sat Dec 18 19:14:05 2010 Begin rpmdb : 0:da39a3ee5e6b4b0d3255bfef95601890afd80709 End time : 19:42:43 2010 (1718 seconds) End rpmdb : 1189:8c21e9e377c3ebdee936916208f74232d5d6235f User : System <unset> Return-Code : Success Transaction performed with: Packages Altered: Dep-Install ConsoleKit-0.4.2-3.fc14.x86_64 Dep-Install ConsoleKit-libs-0.4.2-3.fc14.x86_64 Dep-Install ConsoleKit-x11-0.4.2-3.fc14.x86_64 Dep-Install GConf2-2.31.91-1.fc14.x86_64 Dep-Install GConf2-gtk-2.31.91-1.fc14.x86_64 Dep-Install ModemManager-0.4-4.git20100720.fc14.x86_64 Install NetworkManager-1:0.8.1-10.git20100831.fc14.x86_64 Dep-Install NetworkManager-glib-1:0.8.1-10.git20100831.fc14.x86_64 Install NetworkManager-gnome-1:0.8.1-10.git20100831.fc14.x86_64 Install NetworkManager-openconnect-0.8.1-1.fc14.x86_64
Zwróć uwagę, jak yum zgłasza, czy pakiet został jawnie zainstalowany, czy zainstalowany, ponieważ został była potrzebna przez zależność. Możesz przeanalizować te informacje i pobrać listę pakietów, które zostały jawnie zainstalowane.
Komentarze
- I dodałeś odpowiedź na podstawie Twojego pomysłu
yum history
, wyniki są również porównywane z metodą opartą narepoquery
. Jako efekt uboczny ' rozszerzyłem moją odpowiedź dotyczącą ponownego zapytania.
Odpowiedź
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
Komentarze
- Spoglądając na pozostałe 5 odpowiedzi tutaj, zauważysz różnicę w swojej odpowiedzi? Nie ma absolutnie żadnego wyjaśnienia, dlaczego lub dlaczego Twoja odpowiedź jest lepsza lub inna. Byłoby dobrze, gdybyś mógł podać jakiś opis odpowiedzi, który obejmuje te kwestie.
- @StephenRauch, to polecenie nie jest ' zawarte w innych odpowiedziach, ponieważ ' jest niedawnym dodatkiem dnf. Przełącznik
--userinstalled
został właśnie dodany do dnf w maju . ' Przetestowałem go i daje dokładne wyniki. Modulo pakiety jądra / jądra-jądra / modułów jądra, które nie są ' naprawdę zainstalowane przez użytkownika. Zawiera również wszystkie pakiety*-debuginfo
– ale w razie potrzeby można je łatwo odfiltrować. - @maxschlepzig, dziękuję za opinię, ale w rzeczywistości była to trochę retorycznego pytania, próbując nauczyć / zachęcić osobę odpowiadającą do wyjaśnienia tego w odpowiedzi.
- @StephenRauch, w porządku, pewna edycja z pewnością byłaby odpowiednia i pozwoliłaby mi oznaczyć ją jako zaakceptowaną odpowiedź.
Odpowiedź
Aby wyświetlić listę pakietów zainstalowanych , spróbuj tego jedna linijka :
alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g""
Wynik:
# yum-userinstall yum install bind-utils yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install lsof yum install nano yum install nfs-utils libnfsidmap yum install nmap-ncat yum install openscap-scanner yum install open-vm-tools
PS1: nie pokazuje zależności
PS2: jest sortowane alfabetycznie
PS3: nie pokazuje, jeśli później usunąłeś pakiet
Odpowiedz
Co zrobiłem (zapomniałem szczegółów i jestem leniwy bum, więc …
Pobierz wszystkie zainstalowane pakiety: rpm -qa > file
Użyj sed(1)
, aby pozbyć się numerów wersji i tym podobnych (jeśli to konieczne, zachowaj architekturę). Wymagało to kilka iteracji, aby zrobić to dobrze, chcesz zastąpić ostatni odcinek -[0-9.]-[0-9].fc23
lub podobnego niczym, ale są też zabawne „liczby” w wersji.
Po normalnie instalując, wykonaj yum -y install $(< file)
(lub dnf
, w zależności od potrzeb).
Będziesz miał trochę opadu pakietów, które nie istnieją ymore, zmieniła nazwę lub zostały zastąpione innymi.
Komentarze
- OK, ale spowoduje to oznaczenie wszystkich wcześniej zainstalowanych pakietów jako zainstalowanych przez użytkownika hosta docelowego. Nawet jeśli pierwotnie były instalowane tylko jako zależność.
repoquery ...
: ” Nieprawidłowy wynik yumdb ' powód ' dla zainstalowanego pakietu: HandBrake-cli-0.9.5-1.fc14.x86_64 ”yum localinstall ...
. Miałem jednak sporo pakietów, które trafiły do tego obozu.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
zwróciłem 90 pakietów.