একটি ফেডোরা উদাহরণ থেকে অন্যটিতে ইনস্টল করা প্যাকেজ নির্বাচনটি কীভাবে প্রতিলিপি করা যায়?


16

আমার একটি ফেডোরা সিস্টেম (এ) রয়েছে যেখানে আমি সময়ের সাথে সাথে কিছু প্যাকেজ ইনস্টল করেছি। এখন আমি ফেডোরা অন্য কম্পিউটারে ইনস্টল করতে চাই (বি) এবং আমি এটিতে একই প্যাকেজগুলি ইনস্টল করতে চাই।

ডেবিয়ান পদে আমি এরকম কিছু অর্জন করতে চাই:

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

তবে সত্য কথা বলতে গেলে, নতুন ফেডোরা ১৯ সিস্টেমে (বি) একই প্যাকেজগুলি নির্বাচন করার জন্য আমি আরও ভাল পদ্ধতি চাই: আমি কেবল সিস্টেম এ থেকে প্যাকেজগুলি ইনস্টল করতে চাই যা একটি dnf install(বা yum install) কমান্ড লাইনে সুস্পষ্টভাবে উল্লেখ করা হয়েছিল - এবং না যারা নির্ভরতা হিসাবে ইনস্টল করা হয়েছিল!

কেন? কারণ সম্ভবত নির্ভরতা পরিবর্তিত হয়েছে - এবং আমি নতুন সিস্টেমে পুরানো নির্ভরতা ইনস্টল করতে চাই না। এছাড়াও, আমি যখন প্যাকেজগুলি সরিয়ে ফেলি তখন আমি (সম্ভবত) অপ্রয়োজনীয় স্বয়ংক্রিয়ভাবে ইনস্টল করা নির্ভরতা (যেমন অনাথ) মুছে ফেলতে চাই।

আমি খুঁজে পেয়েছি dnf list installed- তবে কোনও নির্ভরতার কারণে কোনও প্যাকেজ সুস্পষ্টভাবে নির্বাচিত বা সবেমাত্র ইনস্টল করা থাকলে এটি প্রদর্শিত হয় না।

ফেডোরায় আমি কীভাবে সেই তথ্য পাব?

প্যাকেজ নির্বাচনগুলি প্রতিলিপি করার জন্য ফেডোরা / ডিএনএফ উপায় কী?

উত্তর:


12

ফেডোরা ২ 26 থেকে, ডিএনএফ সাবকম্যান্ড repoquery সমর্থিত সমস্ত ব্যবহারকারীর দ্বারা ইনস্টল করা প্যাকেজ তালিকাভুক্ত করার জন্য একটি নতুন বিকল্প রয়েছে:

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

অন্যান্য পদ্ধতির বিপরীতে, এটি সমস্ত ডিবাগিনফো প্যাকেজ তালিকাভুক্ত করে। উপরের উদাহরণে অতিরিক্ত গ্রেপ তাদের ফিল্টার আউট করে।

হোস্ট বি তে তালিকাটি ইনস্টল করতে:

$ < pkgs_a.lst xargs dnf -y install

Dnf API

সাম্প্রতিক ডিএনএফ সংস্করণগুলি (যেমন ফেডোরা> = 23) এর সাহায্যে প্যাকেজ ডাটাবেসটি ডিএনএফ পাইথন এপিআইয়ের মাধ্যমে ব্যবহারকারী ইনস্টল হওয়া প্যাকেজ নামগুলির জন্য অনুসন্ধান করা যেতে পারে:

$ 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

PS: উপরের কোড এবং আরও কিছু এতে রাখুন যা user-installed.pyঅন্যান্য বিতরণকে সমর্থন করে।

ইতিহাস ব্যবহারকারী ইনস্টল

ফেডোরা 23 এবং তারপরে, ডিএনএফ সরবরাহ করে

# dnf history userinstalled

কমান্ড যা ব্যবহারকারীর দ্বারা ইনস্টল করা সমস্ত প্যাকেজ তালিকাভুক্ত করে। ২০১-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 ...। আমার কাছে প্রচুর পরিমাণে প্যাকেজ ছিল যা সেই শিবিরে পড়ে into
slm

repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l90 প্যাকেজ ফেরত।
slm

6

সবচেয়ে সহজ উপায় এবং এটি দীর্ঘ সময়ের জন্য কাজ করা হ'ল:

yum-debug-dump => gives file.

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

... যা গেট / সেট নির্বাচন dpkg কমান্ড, এআইআইআই এর মতো কাজ করে। এছাড়াও মনে রাখবেন যে আপনি যদি ইতিহাসটি পুনরায় খেলছেন তবে আপনি এটি ব্যবহার করতে পারেন:

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

... নিজেই পার্স করার পরিবর্তে।


3

দ্বারা অনুপ্রাণিত SLM এর উত্তর আমি নিম্নলিখিত সঙ্গে আসা পর্যন্ত করেছি 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

কুরুচিপূর্ণ নিয়মিত অভিব্যক্তিটির এমন দরকার যে সমস্ত ধরণের সংস্করণ প্রত্যয় মিলে যায়।

ফলাফলগুলি আমার সিস্টেমে বেশ সূক্ষ্ম দেখাচ্ছে।

বিরুদ্ধে একটি তুলনা রেপোক্রি আনাস্তজ (আমার সিস্টেমে) এর সাথে :

পদ্ধতি # প্যাকেজ
-------------------------
রেপ্লোয়ারি 569
রেপ্লোয়ারী-২ য় 216
yum ইতিহাস 214

(আমি সাজানোর-পুনর্বিবেচনার ফলাফলগুলি পাইপ করেছি)

কেন পার্থক্য আছে? কারণ পুনরায় জিজ্ঞাসাবাদে লেনদেন 1 এবং 2 থেকে সমস্ত প্যাকেজ অন্তর্ভুক্ত থাকে, অর্থাত ফেডোরা ইনস্টলার দ্বারা ইনস্টল করা সমস্ত প্যাকেজ। এটি ব্যাখ্যা করে যে রেপোকোরিতে কেন উল্লিখিত প্যাকেজগুলি xorg-x11- drv-mga এবং বন্ধুরা অন্তর্ভুক্ত রয়েছে।

রেপোয়ারি -২ য় এবং ইয়াম-ইতিহাসের সাথে তুলনা করলে দেখা যায় যে রেপোয়ারি -২ য় আরও সঠিক - এটি ইতিমধ্যে সরানো কিছু প্যাকেজ অন্তর্ভুক্ত করে না। এছাড়াও এটিতে 'yum আপডেট'-অপারেশনগুলির কয়েকটি (আমার সিস্টেমে 2) প্যাকেজ অন্তর্ভুক্ত রয়েছে বলে মনে হয়।

সতর্কতা

উপরের ইতিহাস-ভিত্তিক পদ্ধতিটি কেবলমাত্র সিস্টেমের সম্পূর্ণ জীবনকালে সমস্ত স্পষ্টভাবে ইনস্টল করা প্যাকেজগুলি তালিকাভুক্ত করে। এটি পরবর্তী লেনদেনে মুছে ফেলা প্যাকেজগুলিকে ভারসাম্য দেয় না। সুতরাং, এই পদ্ধতির ফলাফলগুলির কিছু ম্যানুয়াল কুরটিং প্রয়োজন এবং কেবলমাত্র সিস্টেমে ব্যবহার করা উচিত ছিল repoqueryনা।


আমাদের উত্তরগুলির সেরাটি গ্রহণের দুর্দান্ত উপায়! আমি যদি শেষের সমাধানটি করতে পারতাম তবে +1 এর চেয়েও বেশি দিতে পারতাম + এটি করার বিভিন্ন উপায়ের সাথে তুলনা করার।
slm

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 ম ইয়াম লেনদেনের অংশ হিসাবে কী ইনস্টল করা হয়েছিল তা দেখিয়ে দেবে:

$ 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 টি উত্তর সন্ধান করার সময়, আপনার উত্তরটি থেকে পৃথক কী কী লক্ষ্য করবেন? একেবারে কোন ব্যাখ্যা কেন বা কিভাবে আপনার উত্তর আলাদা উত্তম। আপনি যদি এই বিষয়গুলিকে অন্তর্ভুক্ত করে এমন কিছু উত্তর দেওয়ার উত্তরটি দিতে পারেন তবে তা ভাল হবে।
স্টিফেন রাউচ

@ স্টেফেনরউচ, এই আদেশটি অন্যান্য জবাবগুলিতে অন্তর্ভুক্ত নয়, কারণ এটি একটি সাম্প্রতিক ডিএনএফ সংযোজন। --userinstalledসুইচ শুধু ছিল মে মাসে dnf যোগ করা । আমি এটি পরীক্ষা করেছি এবং এটি সঠিক ফলাফল দেয়। কার্নেল / কার্নেল-কোর / কার্নেল-মডিউলগুলির প্যাকেজগুলি সত্যই ব্যবহারকারীর দ্বারা ইনস্টল করা হয়নি এমন মডুলো। এটিতে সমস্ত *-debuginfoপ্যাকেজও রয়েছে - তবে প্রয়োজনে এগুলি সহজেই ফিল্টার করা যায়।
ম্যাক্সচলেপজিগ

@ ম্যাক্সচলেপজিগ, প্রতিক্রিয়াটির জন্য ধন্যবাদ, তবে এটি আসলে একটি বাজে প্রশ্ন ছিল, উত্তরের উত্তরটি ব্যাখ্যা করার জন্য উত্তর-শিক্ষাকে শিক্ষিত / প্রম্পট করার চেষ্টা করছিল।
স্টিফেন রাউচ

@ স্টেফেনরউচ, যথেষ্ট ন্যায্য, কিছু সম্পাদনা অবশ্যই যথাযথ হবে এবং আমাকে এটি গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করতে দেবে।
ম্যাক্সচলেপজিগ

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

পিএস 1: এটি নির্ভরতা দেখায় না

পিএস 2: এটি বর্ণমালা অনুসারে বাছাই করা হয়

PS3: আপনি পরে প্যাকেজটি সরিয়েছেন কিনা তা এটি দেখায় না


-1

আমি কী করেছি (বিশদটি ভুলে গেছি, এবং আমি একটি অলস বাম, তাই ...

সমস্ত ইনস্টল করা প্যাকেজ পান: rpm -qa > file

sed(1)সংস্করণ নম্বরগুলি এবং এগুলি থেকে মুক্তি পেতে ব্যবহার করুন (প্রয়োজন হলে আর্কিটেকচারটি রাখুন)। এটি সঠিক হয়ে উঠতে এর জন্য কয়েকটি পুনরাবৃত্তি প্রয়োজন, আপনি শেষ প্রসারটি প্রতিস্থাপন করতে চান -[0-9.]-[0-9].fc23বা কিছুই দ্বারা মিল নেই, তবে মজার সংস্করণ "সংখ্যা "ও রয়েছে।

স্বাভাবিক হিসাবে ইনস্টল করার পরে, একটি yum -y install $(< file)(বা dnf, প্রয়োজন হিসাবে) করুন।

আপনি এমন কিছু প্যাকেজ পেয়ে যাবেন যা অস্তিত্বহীন, বা নাম পরিবর্তন হয়েছে, বা অন্যদের দ্বারা প্রতিস্থাপিত হয়েছে।


ঠিক আছে, তবে এটি পূর্বের সমস্ত ইনস্টল করা প্যাকেজগুলি গন্তব্য হোস্টে ব্যবহারকারী অন্তর্নিহিত হিসাবে চিহ্নিত করবে। এমনকি যদি তারা প্রাথমিকভাবে কেবল নির্ভরতা হিসাবে ইনস্টল করা হয়।
ম্যাক্সচলেপজিগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.