Kurulu paket seçimini bir Fedora örneğinden diğerine nasıl çoğaltırım?


16

Zamanla bazı paketleri kurduğum bir Fedora sistemi (A) var. Şimdi Fedora'yı başka bir bilgisayara (B) yüklemek istiyorum ve aynı paketleri üzerine kurmak istiyorum.

Debian açısından ben böyle bir şey başarmak istiyorum:

$ dpkg --get-selections > pkg_sel_host_a  # on host_a
$ dpkg --set-selections < pkg_sel_host_a  # on host_b

Ama dürüst olmak gerekirse, yeni Fedora 19 sisteminde (B) aynı paketleri seçmek için gerçekten daha iyi bir yöntem istiyorum: Sadece paketleri A dnf install(veya yum install) komut satırında açıkça belirtilmiş olan A sisteminden yüklemek istiyorum - değil bağımlılık olarak kurulanlar!

Neden? Belki de bağımlılıklar değişti - ve yeni sisteme eski bağımlılıkları yüklemek istemiyorum. Ayrıca, paketleri kaldırdığımda (muhtemelen) daha sonra gereksiz otomatik olarak yüklenen bağımlılıkları (yani yetimler) de kaldırmak istiyorum.

Buldum dnf list installed- ama bir paket açıkça bir bağımlılık nedeniyle seçildi veya sadece yüklü olup olmadığını göstermez.

Fedora ile ilgili bu bilgileri nasıl edinebilirim?

Paket seçimlerini çoğaltmanın Fedora / dnf yolu nedir?

Yanıtlar:


12

Fedora 26'dan bu yana, Dnf altkomut repoquery desteği , kullanıcı tarafından kurulan tüm paketleri listelemek için yeni bir seçeneğe sahiptir:

$ dnf repoquery --qf '%{name}' --userinstalled \
 | grep -v -- '-debuginfo$' \
 | grep -v '^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$' > pkgs_a.lst

Diğer yöntemlerin aksine, tüm hata ayıklama paketlerini de listeler. Yukarıdaki örnekteki ek grep onları filtreliyor.

Listeyi ana makineye B yüklemek için:

$ < pkgs_a.lst xargs dnf -y install

Dnf API'sı

En son Dnf sürümleriyle (örneğin Fedora> = 23), paket veritabanı, Dnf Python API'sı aracılığıyla kullanıcı tarafından yüklenen paket adları için sorgulanabilir:

$ 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

Varsayılan olarak, dnf installbir veya daha fazla paket artık kullanılamıyorsa iptal edilir. Alternatif olarak, dnf geri kalanları yüklemeye zorlanabilir :

# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b

Not: Yukarıdaki kodu ve daha fazlasını user-installed.pydiğer dağıtımları da destekleyen kodlara yerleştirin .

Tarih geçmişi

Fedora 23 ve sonrasında Dnf,

# dnf history userinstalled

kullanıcının kurduğu tüm paketleri listeleyen komut. 2016-11 itibariyle, çıktısını kontrol etmenin bir yolu olmadığından ve paketleri tamamen nitelikli (yani sürüm bilgileri dahil) yazdırdığı için kullanışlılığı sınırlıdır .

userinstalled Sınırlamalar

Paketlerin kullanıcı tarafından yüklenen olarak işaretlenmesinin bazı Fedora sürümlerinde bazı sınırlamalar olduğunu, Fedora 23-ish dönemi sistemleri (2015-11 arası) için aşağıdaki sorunların geçerli olduğunu unutmayın:

Repoquery

Dnf, Dnf API'sinin ve dnf history userinstalledkullanılamadığı eski Fedora sistemlerinde, bunun yerine repoquery kullanılabilir, örneğin:

$ 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

İkinci awk koşulu, yükleyici tarafından yüklenen paketleri hariç tutmak için kullanılır. Yükleyicinin kullanıcı kimliği görünüşte 4294967295 olarak saklandı - alternatif olarak benzer bir şey yazabilirsiniz ($3 == 0 || $3 == your-user-id).

Bu komutun 21 sürümüne kadar Fedora üzerinde çalıştığını, ancak komutun repoqueryyerini aldığı için 23 sürümünde çalışmadığını unutmayın dnf repoquery. Ve etiketi dnf repoqueryanlamıyor %{yumdb_info.reason}.


Bu yaklaşım her şeyi alacak mı emin değilim, repoquery ...koştuğumda bunları sistemimde fark ettim : "Kurulu pkg için geçersiz yumdb querytag 'nedeni': HandBrake-cli-0.9.5-1.fc14.x86_64"
slm

@slm, hm, el freni hangi depodan kuruldu? Belki de depo kurulumunun bununla bir ilgisi var mı?
maxschlepzig

Sanırım kullanarak yüklediğim bağımsız bir RPM olabilir yum localinstall .... Yine de o kampa düşen çok sayıda paketim vardı.
slm

repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l90 paket iade etti.
slm

6

En kolay yol ve uzun süre çalıştı:

yum-debug-dump => gives file.

yum-debug-restore <file-from-debug-dump>

... get / set selection dpkg komutu AIUI gibi çalışır. Ayrıca geçmişi tekrarlıyorsanız şunları kullanabileceğinizi unutmayın:

yum history addon-info last saved_tx => gives file
yum load-tx <file-from-addon-info>

... kendiniz ayrıştırmak yerine.


3

Esinlenerek slm 'ın cevabı aşağıdaki ile gelip ettik yum historytabanlı bir çözüm:

İlk yükleyici eylemlerinin bir parçası olarak (sistemimdeki 1 ve 2 işlemleri, kullanıcı 'Sistemine atfedilen işlemler) yürütülen işlemler hariç tüm yum yükleme işlemleriyle ilgili tüm geçmiş geçmişini alın (yani yükseltme yok):

$ yum history list all | awk -F'|' \
                            '$4 ~ /Install/ && $2 !~ /System/ {print $1}' \
    | xargs yum history info > yum_history

Açıkça yüklenmiş paketleri filtreleyin ve sürüm öneklerini kesin.

$ < 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

Çirkin düzenli ifade, her türlü sürüm sonekinin eşleşeceği şekilde gereklidir.

Sistemimde sonuçlar gayet iyi görünüyor.

Karşı bir karşılaştırma repoquery (sistemimde) Ansatz:

yöntem # paketleri
-------------------------
repoquery 569
repoquery-2. 216
yum geçmişi 214

(Repoquery sonuçlarını sort -u aracılığıyla kullandım)

Neden farklılıklar var? Çünkü repoquery 1 ve 2 işlemlerindeki tüm paketleri, yani Fedora yükleyicisi tarafından kurulan tüm paketleri içerir. Bu, repoquery'nin neden xorg-x11- drv-mga ve arkadaş paketlerini içerdiğini açıklar.

Repoquery-2 ve yum-history karşılaştırması, repoquery-2'nin daha doğru olduğunu gösterir - daha önce kaldırılmış bazı paketleri içermez. Buna ek olarak, 'yum güncelleme' işlemlerinden birkaç (sistemimde 2) paket içeriyor gibi görünüyor.

Uyarı

Yukarıdaki geçmişe dayalı yöntem, yalnızca sistemin tüm kullanım ömrü boyunca açıkça yüklenmiş tüm paketleri listeler. Daha sonraki bir işlemde kaldırılan paketleri dengelemez. Bu nedenle, bu yöntemin bazı manuel küratörlüklere ihtiyacı vardır ve sadece sistemlerde kullanılmaması gerektiğinde repoquerymevcut değildir.


Hem cevaplarımızdan en iyi şekilde yararlanmanın güzel bir yolu! Eğer nihai çözüm + bunu yapmanın çeşitli yollarının güzel karşılaştırması için yapabilseydim size bir +1'den fazla verirdim.
slm

2

Fedora'nın (14) daha eski bir sürümü var, bu yüzden yum'umun daha az zengin özellikli bir sürümü var yum, ancak yum historyözelliğe bir göz atmak isteyebilirsiniz . Aradığınız bilgiyi bu komuttan alabileceğinize inanıyorum.

tarih listesi

$ 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   
   ...

İlk sayıya aşağıdaki numaraların bir listesini ileterek geri dönebilirsiniz 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

tarih bilgisi

Aşağıda 1. yum işleminin bir parçası olarak nelerin yüklendiğini göstereceksiniz:

$ 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

Yum'un bir paketin bağımlılık gerektirdiğinden açıkça yüklendiğini veya yüklendiğini nasıl bildirdiğine dikkat edin. Bu bilgileri ayrıştırabilir ve açıkça yüklenen paketlerin listesini alabilirsiniz.


Fikrinize göre bir cevap ekledim yum history, aynı zamanda sonuçları repoquerytemel yöntemle karşılaştırır. Bir yan etki olarak repoquery cevabımı uzattım.
maxschlepzig

1
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt

1
Buradaki diğer 5 yanıtı incelerken, cevabınızla ilgili farklı olan ne fark ediyorsunuz? Cevabınızın neden farklı olduğu veya nasıl daha iyi olduğu konusunda kesinlikle bir açıklama yoktur . Bunları kapsayan cevabınızın bir tanımını vermeniz iyi olur.
Stephen Rauch

@StephenRauch, bu komut diğer yanıtlara dahil değildir, çünkü son zamanlarda yapılan bir dnf ekidir. --userinstalledAnahtar yalnızca edildi Mayıs ayında DNF eklendi . Test ettim ve doğru sonuçlar veriyor. Gerçekten kullanıcı tarafından yüklenmeyen çekirdek / çekirdek çekirdeği / çekirdek modülleri paketlerini modüle edin. Ayrıca tüm *-debuginfopaketleri içerir - ancak gerekirse kolayca filtrelenebilir.
maxschlepzig

@maxschlepzig, geri bildiriminiz için teşekkürler, ancak bu aslında cevaplayıcıyı cevapta açıklamak için eğitmeye / sormaya çalışarak biraz retorik bir soruydu.
Stephen Rauch

@StephenRauch, yeterince adil, bazı düzenlemeler kesinlikle uygun olur ve kabul edilen cevap olarak işaretlememe izin verir.
maxschlepzig

0

Liste paketleri için size yüklemiş, bu deneyin tek astar :

alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e 's/command_line = (.*)/yum \1/g'"

Sonuç:

# 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: bağımlılıkları göstermiyor

PS2: alfabetik olarak sıralanmıştır

PS3: paketi daha sonra kaldırıp kaldırmamanızı göstermez


-1

Ne yaptım (detayları unuttum ve tembel bir serseriyim, bu yüzden ...

Yüklü tüm paketleri alın: rpm -qa > file

sed(1)Sürüm numaralarından ve benzerlerinden kurtulmak için kullanın (gerekirse mimariyi saklayın). Bu, doğru olması için birkaç iterasyon gerektiriyordu, son streçini -[0-9.]-[0-9].fc23veya benzerini hiçbir şeyle değiştirmek istemiyorsunuz , ancak komik sürüm "numaraları" da var.

Normal şekilde kurduktan sonra, yum -y install $(< file)(veya dnfgerekirse) yapın.

Artık var olmayan ya da adı değiştirilen ya da başkaları tarafından değiştirilen bazı paket serpintileri alırsınız.


Tamam, ancak bu önceden yüklenmiş tüm paketleri hedef ana bilgisayarda kullanıcı tarafından yüklenen olarak işaretler. Başlangıçta sadece bir bağımlılık olarak kurulmuş olsalar bile.
maxschlepzig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.