एक फेडोरा उदाहरण से दूसरे में स्थापित पैकेज चयन को कैसे दोहराया जाए?


16

मेरे पास एक फेडोरा सिस्टम (ए) है जहां मैंने समय के साथ कुछ पैकेज स्थापित किए हैं। अब मैं फेडोरा को दूसरे कंप्यूटर (बी) पर स्थापित करना चाहता हूं और मैं इस पर उसी पैकेज को स्थापित करना चाहता हूं।

डेबियन के संदर्भ में मैं कुछ इस तरह से पूरा करना चाहता हूं:

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

लेकिन ईमानदार होने के लिए, मैं वास्तव में नए फेडोरा 19 सिस्टम (बी) पर समान पैकेजों का चयन करने के लिए एक बेहतर तरीका चाहता हूं: मैं सिस्टम ए से पैकेज स्थापित करना चाहता हूं जो स्पष्ट रूप से एक dnf install(या yum install) कमांड लाइन पर उल्लिखित हैं - और नहीं जो निर्भरता के रूप में स्थापित किए गए थे!

क्यों? क्योंकि शायद निर्भरता बदल गई है - और मैं नई प्रणाली पर पुरानी निर्भरताएं स्थापित नहीं करना चाहता। साथ ही, जब मैं उन पैकेजों को हटाता हूं जिन्हें मैं (संभवतः) हटाना चाहता हूं तो अनावश्यक रूप से स्थापित निर्भरताएं (यानी अनाथ) भी।

मैंने पाया है dnf list installed- लेकिन यह प्रदर्शित नहीं करता है कि पैकेज स्पष्ट रूप से चुना गया था या सिर्फ एक निर्भरता के कारण स्थापित किया गया था।

फेडोरा पर मुझे वह जानकारी कैसे मिलेगी?

पैकेज चयनों को दोहराने के लिए फेडोरा / dnf तरीका क्या है?

जवाबों:


12

फेडोरा 26 के बाद से, Dnf repoquery उपकमांड समर्थन सभी उपयोगकर्ता-स्थापित पैकेजों को सूचीबद्ध करने के लिए एक नया विकल्प है:

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

अन्य तरीकों के विपरीत, यह सभी डिबगिनफो पैकेजों को भी सूचीबद्ध करता है। उपरोक्त उदाहरण में अतिरिक्त grep उन्हें फ़िल्टर करता है।

होस्ट B पर सूची स्थापित करने के लिए:

$ < pkgs_a.lst xargs dnf -y install

Dnf एपीआई

हाल के Dnf संस्करणों (उदाहरण के लिए फेडोरा> = 23) के साथ, पैकेज डेटाबेस को Dnf Python API के माध्यम से उपयोगकर्ता के संस्थापित पैकेज नामों के लिए क्वियर किया जा सकता है:

$ 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

डिफ़ॉल्ट रूप से, dnf installगर्भपात यदि एक या अधिक पैकेज अब उपलब्ध नहीं हैं। वैकल्पिक रूप से, dnf को शेष सभी को स्थापित करने के लिए मजबूर किया जा सकता है:

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

पुनश्च: उपरोक्त कोड और user-installed.pyउस में भी डाल अन्य वितरण का समर्थन करता है।

इतिहास उपयोगकर्ता की स्थापना की गई

Fedora 23 और बाद में, Dnf प्रदान करता है

# dnf history userinstalled

कमांड जो सभी उपयोगकर्ता स्थापित संकुल को सूचीबद्ध करता है। 2016-11 तक, इसकी उपयोगिता सीमित है क्योंकि इसके उत्पादन को नियंत्रित करने का कोई तरीका नहीं है और यह पूरी तरह से योग्य (यानी संस्करण जानकारी सहित) प्रिंट करता है।

उपयोगकर्ता सीमित सीमाएँ

ध्यान दें कि उपयोगकर्ता-स्थापित के रूप में संकुल के अंकन में कुछ फेडोरा संस्करणों पर कुछ सीमाएँ हैं, फेडोरा 23-ईश युग प्रणालियों (2015-11 के आसपास से) के लिए निम्नलिखित मुद्दे प्रासंगिक हैं:

Repoquery

बड़े फेडोरा सिस्टम, जहां DNF, DNF एपीआई और पर dnf history userinstalledउपलब्ध नहीं हैं, एक का उपयोग कर सकते हैं repoquery बजाय, जैसे:

$ 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

इंस्टॉलर द्वारा स्थापित किए गए पैकेजों को बाहर करने के लिए दूसरी अजीब स्थिति का उपयोग किया जाता है। इंस्टॉलर का यूजर-आईडी जाहिरा तौर पर 4294967295 के रूप में संग्रहीत किया गया था - वैकल्पिक रूप से आप कुछ ऐसा लिख ​​सकते हैं ($3 == 0 || $3 == your-user-id)

ध्यान दें कि यह कमांड फेडोरा पर 21 रिलीज करने के लिए काम करता है - लेकिन उदाहरण के लिए रिलीज 23 पर नहीं, क्योंकि कमांड repoqueryको बदल दिया गया था dnf repoquery। और टैग dnf repoqueryको नहीं समझता है %{yumdb_info.reason}


मैं नहीं यकीन है कि अगर इस दृष्टिकोण सब कुछ मिल जाएगा, मैं अपने सिस्टम पर इन जब मैं भागा देखा कर रहा हूँ repoquery ..."अवैध yumdb querytag 'कारण' भी इंस्टॉल किया pkg के लिए: HandBrake-CLI-0.9.5-1.fc14.x86_64"
SLM

@ एसएलएम, एचएम, किस रिपॉजिटरी से हैंडब्रेक स्थापित किया गया था? शायद रिपॉजिटरी सेटअप का इससे कोई लेना-देना है?
मैक्सक्लेपज़िग

मुझे लगता है कि यह एक स्टैंडअलोन आरपीएम हो सकता है जिसे मैंने प्रयोग करके स्थापित किया है yum localinstall ...। मेरे पास उचित मात्रा में पैकेज थे जो उस शिविर में गिरे थे।
स्लम

repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l90 पैकेज लौटाए।
स्लम

6

सबसे आसान तरीका है, और यह लंबे समय तक काम करता है:

yum-debug-dump => gives file.

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

... जो बहुत कुछ मिलता है / सेट चयन dpkg कमांड, AIUI की तरह काम करता है। यह भी ध्यान दें कि यदि आप इतिहास को दोहरा रहे हैं तो आप उपयोग कर सकते हैं:

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

... इसके बजाय खुद को पार्स करने के लिए।


3

स्लम के उत्तर से प्रेरित होकर मैं निम्नलिखित yum historyआधारित समाधान के साथ आया हूँ :

सभी यम इंस्टॉल लेनदेन (यानी कोई अपग्रेड) पर सभी विस्तृत इतिहास प्राप्त करें, आरंभिक इंस्टॉलर क्रिया (मेरे सिस्टम पर लेनदेन 1 और 2, उपयोगकर्ता 'सिस्टम' के लिए जिम्मेदार के रूप में निष्पादित किए गए) को छोड़कर:

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

स्पष्ट रूप से स्थापित पैकेजों को फ़िल्टर करें और संस्करण उपसर्गों को काट दें।

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

बदसूरत नियमित अभिव्यक्ति की आवश्यकता है जैसे कि सभी प्रकार के संस्करण प्रत्यय मेल खाते हैं।

मेरे सिस्टम पर परिणाम काफी ठीक लग रहे हैं।

के खिलाफ एक तुलना repoquery Ansatz (अपने सिस्टम पर):

विधि # पैकेज
-------------------------
५६ ९ रीपोकरी
रेपोक्वायरी -2 -2 216
यम इतिहास २१४

(मैंने सॉर्ट-यू के माध्यम से रिपॉक्वेरी परिणाम को पाइप किया)

मतभेद क्यों हैं? क्योंकि रेपोवेरी में लेनदेन 1 और 2 से सभी पैकेज शामिल हैं, अर्थात सभी पैकेज जो फेडोरा इंस्टॉलर द्वारा स्थापित किए गए थे। यह बताता है कि रेपोक्वेरी में उल्लेखित पैकेज xorg-x11- drv-mga और दोस्तों को क्यों शामिल किया गया है।

रेपोक्वेरी -2 और यम-इतिहास की तुलना से पता चलता है कि रेपोक्वेरी -2 अधिक सटीक है - इसमें कुछ हटाए गए पैकेज शामिल नहीं हैं। इसके अलावा इसमें 'यम अपडेट'-ऑपरेशंस के कुछ (मेरे सिस्टम पर 2) पैकेज शामिल हैं, ऐसा लगता है।

चेतावनी

उपरोक्त इतिहास-आधारित पद्धति केवल सिस्टम के संपूर्ण जीवनकाल में सभी स्पष्ट रूप से स्थापित पैकेजों को सूचीबद्ध करती है। यह उन पैकेजों को संतुलित नहीं करता है जिन्हें बाद के लेनदेन में हटा दिया गया था। इस प्रकार, इस पद्धति को परिणामों के कुछ मैनुअल क्यूरेटिंग की आवश्यकता होती है और केवल उन प्रणालियों पर उपयोग किया जाना चाहिए जो repoqueryउपलब्ध नहीं थे ।


हमारे दोनों उत्तर का सबसे अच्छा तरीका है! मैं आपको +1 से अधिक देता अगर मैं अंतिम समाधान के लिए कर सकता था + इसे करने के विभिन्न तरीकों की अच्छी तुलना।
स्लम

2

मेरे पास फेडोरा (14) का एक पुराना संस्करण है, इसलिए मेरी यम में एक कम सुविधा वाला समृद्ध संस्करण शामिल है yum, लेकिन आप इस yum historyसुविधा को देख सकते हैं। मेरा मानना ​​है कि आप उस जानकारी को प्राप्त कर सकते हैं जिसे आप उस कमांड से ढूंढ रहे हैं।

इतिहास सूची

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

आप संख्याओं की सूची पास करके पहले पहले लेनदेन में वापस जा सकते हैं 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

इतिहास की जानकारी

निम्नलिखित आपको दिखाएगा कि 1 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

ध्यान दें कि कैसे यम रिपोर्ट करता है कि क्या पैकेज स्पष्ट रूप से स्थापित या स्थापित किया गया था क्योंकि यह एक निर्भरता द्वारा आवश्यक था। आप इस जानकारी को पार्स कर सकते हैं और अपने पैकेज की सूची प्राप्त कर सकते हैं जो स्पष्ट रूप से स्थापित थे।


मैंने आपके yum historyविचार के आधार पर एक उत्तर जोड़ा है, यह repoqueryआधारित पद्धति के विरुद्ध परिणामों की तुलना भी करता है । एक साइड-इफ़ेक्ट के रूप में मैंने अपना रिपॉउरी उत्तर दिया है।
मैक्सक्लेपज़िग

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

1
जैसा कि आप अन्य 5 उत्तरों को यहाँ देखते हैं, आप क्या नोटिस करते हैं जो आपके उत्तर के बारे में अलग है? इस बात का कोई स्पष्टीकरण नहीं है कि आपका उत्तर अलग क्यों या कैसे बेहतर है। यह अच्छा होगा यदि आप आप में से कुछ विवरण प्रदान कर सकते हैं जो इन बातों को कवर करता है।
स्टीफन राउच

@StephenRauch, यह कमांड अन्य उत्तरों में शामिल नहीं है, क्योंकि यह हाल ही में dnf जोड़ है। --userinstalledस्विच बस गया था मई में DNF को जोड़ा गया । मैंने इसका परीक्षण किया है, और यह सटीक परिणाम देता है। मोडलू कर्नेल / कर्नेल-कोर / कर्नेल-मॉड्यूल पैकेज जो वास्तव में उपयोगकर्ता-स्थापित नहीं हैं। इसमें सभी *-debuginfoपैकेज भी शामिल हैं - लेकिन यदि आवश्यक हो, तो उन्हें आसानी से फ़िल्टर किया जा सकता है।
मैक्सक्लेपज़िग

@maxschlepzig, प्रतिक्रिया के लिए धन्यवाद, लेकिन यह वास्तव में एक बयानबाजी सवाल का थोड़ा सा था, जो उत्तर में व्याख्या करने में उत्तर देने के लिए शिक्षित / शीघ्र करने की कोशिश कर रहा था।
स्टीफन राउच

@StephenRauch, काफी उचित, कुछ संपादन निश्चित रूप से उचित होगा और मुझे इसे स्वीकृत उत्तर के रूप में चिह्नित करने की अनुमति देगा।
मैक्सक्लेपज़िग

0

आपके द्वारा स्थापित पैकेजों को सूचीबद्ध करने के लिए , इस एक-लाइनर को आज़माएँ :

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

परिणाम:

# 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: यह निर्भरता नहीं दिखाता है

PS2: यह वर्णानुक्रम में क्रमबद्ध है

PS3: यदि आपने पैकेज को बाद में हटा दिया है, तो यह प्रदर्शित नहीं होता है


-1

मैंने क्या किया (विवरण भूल गया, और मैं एक आलसी चूतड़ हूँ, इसलिए ...

सभी स्थापित पैकेज प्राप्त करें: rpm -qa > file

sed(1)संस्करण संख्याओं और ऐसे से छुटकारा पाने के लिए उपयोग करें (यदि आवश्यक हो, तो वास्तुकला रखें)। इसे ठीक करने के लिए कुछ पुनरावृत्तियों की आवश्यकता है, आप -[0-9.]-[0-9].fc23कुछ भी नहीं के समान या उसके पिछले खंड को बदलना चाहते हैं , लेकिन मजाकिया संस्करण "संख्या" भी हैं।

सामान्य रूप से स्थापित करने के बाद, एक yum -y install $(< file)(या dnf, आवश्यकतानुसार) करें।

आपको उन पैकेजों के कुछ नतीजे मिलेंगे जो अब मौजूद नहीं हैं, या परिवर्तित नाम, या दूसरों द्वारा प्रतिस्थापित किए गए हैं।


ठीक है, लेकिन यह पहले से इंस्टॉल किए गए सभी पैकेजों को चिह्नित करेगा, जैसे कि गंतव्य होस्ट पर उपयोगकर्ता-इरादा। भले ही वे मूल रूप से केवल एक निर्भरता के रूप में स्थापित थे।
maxschlepzig
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.