Minulla on Fedora-järjestelmä (A), johon olen asentanut joitain paketteja ajan myötä. Haluan nyt asentaa Fedoran toiselle tietokoneelle (B) ja haluan asentaa samat paketit siihen.
Debianin termeillä haluan saavuttaa jotain tällaista:
$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b
Mutta rehellisesti sanottuna haluan todella paremman tavan valita samat paketit uudessa Fedora 19 -järjestelmässä (B): Haluan vain asentaa paketit järjestelmästä A, jotka mainittiin erikseen dnf install
(tai yum install
) komentorivillä – eikä niitä, jotka asennettiin riippuvuuksina!
Miksi? Koska ehkä riippuvuudet ovat muuttuneet – enkä halua asentaa vanhentuneita riippuvuuksia uuteen järjestelmään. Plus, kun poistan paketteja, haluan poistaa myös (mahdollisesti) silloin tarpeettomat automaattisesti asennetut riippuvuudet (eli orpot).
Olen löytänyt dnf list installed
– mutta se ei näy, jos paketti on nimenomaisesti valittu tai juuri asennettu riippuvuuden vuoksi.
Kuinka teen hae kyseiset tiedot Fedorasta?
Mikä on Fedora / dnf-tapa kopioida pakettivalintoja?
Vastaa
Fedora 26: n jälkeen Dnf repoquery
-alikomentotuki tarjoaa uuden vaihtoehdon kaikkien käyttäjän asentamien pakettien listalle:
$ dnf repoquery --qf "%{name}" --userinstalled \ | grep -v -- "-debuginfo$" \ | grep -v "^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$" > pkgs_a.lst
Toisin kuin muut menetelmät, siinä luetellaan myös kaikki debuginfopaketit. Yllä olevan esimerkin ylimääräinen grep suodattaa ne pois.
Luettelon asentaminen isäntään B:
$ < pkgs_a.lst xargs dnf -y install
Dnf API
Uusimmilla Dnf-versioilla (esim. Fedora> = 23) pakettitietokannasta voidaan kysyä käyttäjän asentamien pakettien nimiä Dnf Python -sovellusliittymän kautta:
$ 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
Oletusarvon mukaan dnf install
keskeyttää, jos yhtä tai useampaa pakettia ei ole enää saatavana. Vaihtoehtoisesti dnf voidaan pakottaa Asenna kaikki jäljellä olevat:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Laita yllä oleva koodi ja paljon muuta osioon user-installed.py
, joka tukee myös muita jakeluja.
käyttäjän asentama historia
Fedora 23: ssa ja uudemmissa Dnf tarjoaa
# dnf history userinstalled
-komennon, joka näyttää kaikki käyttäjän asentamat paketit. Vuodesta 2016-11 , sen hyödyllisyys on rajoitettua , koska ei ole mitään tapaa hallita tuotantoaan ja tulostaa paketit täysin päteviksi (ts. mukaan lukien versiotiedot).
käyttäjän asentamat rajoitukset
Huomaa, että pakettien merkinnällä käyttäjän asentamilla on joitain rajoituksia joissakin Fedora-versioissa, Fedora 23-ish-aikakauden järjestelmissä (noin vuodesta 2015) -11) seuraavat asiat ovat merkityksellisiä):
- GUI: n kautta asennetut paketit eivät sisälly
- paketteja, jotka on asennettu komento-ei-käsittelijän kautta, ei sisälly
- joitain oletusarvoisesti asennettuja paketteja (anacondan toimesta) ovat mukana
Repoquery
Vanhemmissa Fedora-järjestelmissä, joissa Dnf, Dnf API ja dnf history userinstalled
ei ole käytettävissä, sen sijaan voidaan käyttää uudelleenjulkaisua , esim .:
$ 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
Toista awk-ehtoa käytetään sulkemaan pois asennusohjelman asentamat paketit. Asentajan käyttäjätunnus oli ilmeisesti tallennettu nimellä 4294967295 – vaihtoehtoisesti voit kirjoittaa jotain esimerkiksi
.
Huomaa, että tämä komento toimii Fedoralla julkaisuun 21 saakka – mutta esim. ei julkaisussa 23, koska komento repoquery
korvattiin nimellä dnf repoquery
. Ja dnf repoquery
ei ymmärrä %{yumdb_info.reason}
-tunnistetta.
Kommentit
Vastaa
Helpoin tapa, ja se toimi pitkään aikaan:
yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump>
… joka toimii aivan kuten get / set selections dpkg -komento, AIUI.Huomaa myös, että jos toistat historiaa, voit käyttää:
yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info>
… sen sijaan, että sinun tarvitsisi jäsentää sitä itse.
Vastaus
Innoittamana slm ”s vastaus Olen keksinyt seuraavan yum history
-pohjaisen ratkaisun:
Hanki kaikki yksityiskohtaiset tiedot kaikista asennustapahtumista (ts. ei päivityksiä) , lukuun ottamatta niitä, jotka on suoritettu osana alkuperäisiä asennusohjelman toimintoja (järjestelmässä tapahtuvat tapahtumat 1 ja 2, määritetty käyttäjän ”Järjestelmälle”):
$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history
Suodata nimenomaisesti asennetut paketit ja leikkaa version etuliitteet.
$ < 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
Ruma säännöllinen lauseke tarvitaan siten, että kaikenlaiset versiotunnisteet sovitetaan yhteen.
Tulokset näyttää melko hyvältä järjestelmässäni.
Vertailu -julkaisuun ansatz (järjestelmässäni):
method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214
(Lähetin repo-kyselyn tuloksia eteenpäin ugh sort -u)
Miksi on eroja? Koska uudelleenpalautus sisältää kaikki tapahtumien 1 ja 2 paketit eli kaikki Fedora-asentajan asentamat paketit. Tämä selittää, miksi repoquery sisältää mainitut paketit xorg-x11- drv-mga ja ystävät.
Repoquery-2nd- ja yum-history-vertailu osoittaa, että repoquery-2nd on tarkempi – se ei sisällä joitain jo poistettuja paketteja. . Lisäksi näyttää siltä, että se sisältää muutaman (2 järjestelmässäni) paketteja ”yum update” -operaatioista.
Varoitus
Yllä oleva historiaan perustuva menetelmä listaa vain kaikki nimenomaisesti asennetut paketteja järjestelmän koko käyttöiän ajan. Se ei tasapainota niitä paketteja, jotka poistettiin myöhemmässä tapahtumassa. Siten tämä menetelmä vaatii tulosten manuaalista kuratointia ja sitä tulisi käyttää vain järjestelmissä, joissa repoquery
ei ole käytettävissä.
Kommentit
- Hieno tapa hyödyntää molemmat vastauksemme parhaat puolet! Annan sinulle ’ enemmän kuin +1, jos voisin mahdolliselle ratkaisulle + sen eri tapojen mukava vertailu.
vastaus
Minulla on vanhempi Fedoran versio (14), joten yum sisältää vähemmän monipuolisen version versiosta yum
, mutta kannattaa ehkä tarkastella yum history
-ominaisuutta. Uskon, että voit saada etsimäsi tiedot komennosta.
historialuettelo
$ 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 ...
Voit palata ensimmäinen tapahtuma välittämällä numeroluettelo 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
historiatiedot
Seuraava näyttää, mitä asennettiin osana ensimmäistä yum-tapahtumaa:
$ 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
Huomaa, kuinka yum ilmoittaa, onko paketti nimenomaisesti asennettu vai asennettu, koska se tarvitsi riippuvuus. Voit jäsentää nämä tiedot ja saada luettelon paketeista, jotka on asennettu nimenomaisesti.
Kommentit
- I ’ olet lisännyt vastauksen
yum history
-ideasi perusteella, se vertaa tuloksia myösrepoquery
-perusteiseen menetelmään . Sivuvaikutuksena olen ’ laajentanut vastaustani.
Vastaa
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
Kommentit
- Mitä huomaat vastauksessasi, kun tarkastelet muita viittä vastausta täällä? Ei ole mitään selitystä miksi tai miten vastauksesi on parempi erilainen. Olisi hyvä, jos voisit antaa kuvauksen vastauksestasi, joka kattaa nämä asiat.
- @StephenRauch, tätä komentoa ei ’ sisälly muihin vastauksiin, koska se ’ on viimeisin dnf-lisäys.
--userinstalled
-kytkin lisättiin juuri dnf: hen toukokuussa . Olen ’ testannut sen, ja se antaa tarkat tulokset. Moduloi ytimen / kernel-core / kernel-modules paketteja, joita ’ ei ole todella asennettu käyttäjälle. Se sisältää myös kaikki*-debuginfo
-paketit – mutta ne voidaan tarvittaessa suodattaa helposti. - @maxschlepzig, kiitos palautteesta, mutta tämä oli itse asiassa vähän retorista kysymystä, yrittäen kouluttaa / kehottaa vastaajaa selittämään sen vastauksessa.
- @StephenRauch, riittävän oikeudenmukainen, jotkut muokkaukset olisivat varmasti sopivia ja antaisivat minun merkitä sen hyväksytyksi vastaus.
vastaus
Jos haluat luetteloida asentamasi paketit , kokeile tätä yhden linjan :
alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g""
Tulos:
# 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: se ei näytä riippuvuuksia
PS2: se on lajiteltu aakkosjärjestyksessä
PS3: se ei näytä, jos olet poistanut paketin myöhemmin
Vastaa
Mitä tein (unohdin yksityiskohdat ja olen ”laiska pomo, joten …
Hanki kaikki asennetut paketit: rpm -qa > file
Käytä sed(1)
päästäksesi eroon versionumeroista ja muista (säilytä arkkitehtuuri tarvittaessa). Tämä vaati muutama iterointi sen saamiseksi oikein, haluat korvata viimeisen -[0-9.]-[0-9].fc23
-osan tai muun vastaavan osan millään tavalla, mutta on myös hauskoja versionumeroita.
Jälkeen asentamalla normaalisti, tee yum -y install $(< file)
(tai dnf
tarpeen mukaan).
Saat jonkin verran laskeumaa paketeista, joita ei ole olemassa ymore, muutettu nimi tai korvattu muilla.
Kommentit
- Ok, mutta tämä merkitsee kaikki aiemmin asennetut paketit käyttäjän sisäisiksi kohde-isäntä. Vaikka ne olisivat alun perin asennettu vain riippuvuuksina.
repoquery ...
: ” Virheellinen yumdb-kysely ’ syy ’ asennetulle paketille: HandBrake-cli-0.9.5-1.fc14.x86_64 ”yum localinstall ...
. Minulla oli kuitenkin melko paljon paketteja, jotka putosivat tuohon leiriin.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
palautti 90 pakettia.