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):

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

  • Nie ' Nie jestem pewien, czy to podejście da wszystko. Zauważyłem je w moim systemie, gdy Uruchomiłem repoquery ...: ” Nieprawidłowy wynik yumdb ' powód ' dla zainstalowanego pakietu: HandBrake-cli-0.9.5-1.fc14.x86_64 ”
  • @slm, hm, z jakiego repozytorium hamulec ręczny zainstalowany? Być może konfiguracja repozytorium ma z tym coś wspólnego?
  • Myślę, że mógł to być samodzielny RPM, który zainstalowałem za pomocą 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.

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ą na repoquery . 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ść.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *