วิธีการทำซ้ำการเลือกแพ็คเกจที่ติดตั้งจากอินสแตนซ์ Fedora หนึ่งไปยังอีกอินสแตนซ์?


16

ฉันมีระบบ Fedora (A) ที่ฉันได้ติดตั้งแพคเกจบางอย่างในช่วงเวลา ตอนนี้ฉันต้องการติดตั้ง Fedora บนคอมพิวเตอร์เครื่องอื่น (B) และฉันต้องการติดตั้งแพ็คเกจเดียวกันบนมัน

ในแง่ของเดเบียนฉันต้องการทำสิ่งนี้:

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

แต่ตามจริงแล้วฉันต้องการวิธีที่ดีกว่าในการเลือกแพ็คเกจเดียวกันบนระบบ Fedora 19 ใหม่ (B): ฉันแค่ต้องการติดตั้งแพ็คเกจจากระบบ A ที่ถูกกล่าวถึงอย่างชัดเจนใน บรรทัดคำสั่งdnf install(หรือyum install) - และไม่ใช่ ผู้ที่ติดตั้งเป็นการอ้างอิง!

ทำไม? เพราะบางทีการพึ่งพามีการเปลี่ยนแปลง - และฉันไม่ต้องการติดตั้งการพึ่งพาที่ล้าสมัยในระบบใหม่ นอกจากนี้เมื่อฉันลบแพ็คเกจที่ฉันต้องการลบ (อาจ) จากนั้นไม่จำเป็นต้องพึ่งพาการติดตั้งโดยอัตโนมัติ (เช่นเด็กกำพร้า) เช่นกัน

ฉันได้พบdnf list installed- แต่มันไม่ปรากฏขึ้นหากมีการเลือกแพคเกจอย่างชัดเจนหรือติดตั้งเพียงเพราะการพึ่งพา

ฉันจะรับข้อมูลเกี่ยวกับ Fedora ได้อย่างไร

Fedora / dnf มีวิธีการอย่างไรในการเลือกแพคเกจซ้ำ?

คำตอบ:


12

ตั้งแต่ Fedora 26 คำrepoquery สั่งย่อย Dnf สนับสนุนมีตัวเลือกใหม่สำหรับการแสดงรายการแพ็คเกจที่ผู้ใช้ติดตั้งทั้งหมด:

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

ตรงกันข้ามกับวิธีอื่นมันยังแสดงรายการแพ็คเกจ debuginfo ทั้งหมด grep เพิ่มเติมในตัวอย่างด้านบนจะกรองออก

ในการติดตั้งรายการบนโฮสต์ B:

$ < pkgs_a.lst xargs dnf -y install

Dnf API

ด้วยรุ่น Dnf ล่าสุด (เช่น Fedora> = 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

PS:ใส่รหัสข้างต้นและอื่น ๆ ลงในuser-installed.pyนั้นยังสนับสนุนการแจกแจงอื่น ๆ

ประวัติผู้ใช้ที่ติดตั้ง

ใน Fedora 23 และใหม่กว่านั้น Dnf ให้บริการ

# dnf history userinstalled

คำสั่งที่แสดงรายการแพ็คเกจที่ผู้ใช้ติดตั้งทั้งหมด ตั้งแต่วันที่ 2016-11 มีประโยชน์มี จำกัดเนื่องจากไม่มีวิธีการควบคุมผลลัพธ์และพิมพ์แพ็คเกจที่มีคุณสมบัติครบถ้วน (เช่นรวมถึงข้อมูลรุ่น)

ข้อ จำกัด ที่ผู้ใช้ติดตั้ง

โปรดทราบว่าการทำเครื่องหมายแพ็คเกจที่ติดตั้งโดยผู้ใช้นั้นมีข้อ จำกัด บางอย่างเกี่ยวกับ Fedora บางรุ่นสำหรับระบบยุค Fedora 23-ish (จากประมาณ 2015-11-11) ปัญหาต่อไปนี้มีความเกี่ยวข้อง):

Repoquery

สำหรับระบบ Fedora รุ่นเก่าที่ซึ่ง Dnf, Dnf API และ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

เงื่อนไข awk ที่สองใช้เพื่อแยกแพคเกจที่ติดตั้งโดยตัวติดตั้ง รหัสผู้ใช้งานติดตั้งเห็นได้ชัดว่าถูกเก็บไว้เป็น 4294967295 - ($3 == 0 || $3 == your-user-id)อีกทางเลือกหนึ่งที่คุณสามารถเขียนสิ่งที่ต้องการ

โปรดทราบว่าคำสั่งนี้ทำงานบน Fedora ถึงปล่อย 21 - แต่เช่นไม่ได้อยู่ในการเปิดตัว 23 เพราะคำสั่งถูกแทนที่ด้วยrepoquery dnf repoqueryและdnf repoqueryไม่เข้าใจ%{yumdb_info.reason}แท็ก


ฉันไม่แน่ใจว่าวิธีการนี้จะได้รับทุกอย่างหรือไม่ฉันสังเกตเห็นสิ่งเหล่านี้ในระบบของฉันเมื่อฉันวิ่งrepoquery ...: "yumdb querytag 'เหตุผล' สำหรับการติดตั้ง pkg ที่ไม่ถูกต้อง: HandBrake-cli-0.9.5-1.fc14.x86_64"
slm

@slm, hm จากที่เก็บแบบใดที่ติดตั้งเบรกมือ? บางทีการตั้งค่าที่เก็บมีอะไรเกี่ยวข้องหรือไม่?
maxschlepzig

ฉันคิดว่ามันอาจจะเป็น RPM yum localinstall ...สแตนด์อโลนที่ผมติดตั้งโดยใช้ ฉันมีแพ็คเกจจำนวนหนึ่งที่ตกลงไปในค่ายนั้น
slm

repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -lกลับ 90 แพคเกจ
slm

6

วิธีที่ง่ายที่สุดและใช้งานได้นาน:

yum-debug-dump => gives file.

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

... ซึ่งทำงานเหมือนกับคำสั่ง get / set selections dpkg AIUI โปรดทราบว่าหากคุณกำลังเล่นซ้ำประวัติคุณสามารถใช้:

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

... แทนที่จะต้องแยกวิเคราะห์เอง


3

ได้รับแรงบันดาลใจจากคำตอบของslmฉันได้คิดวิธีแก้ปัญหาพื้นฐานดังนี้:yum history

รับประวัติโดยละเอียดทั้งหมดเกี่ยวกับธุรกรรมการติดตั้ง yum ทั้งหมด (เช่นไม่มีการอัปเกรด) ไม่รวมรายการที่ดำเนินการเป็นส่วนหนึ่งของการดำเนินการของตัวติดตั้งเริ่มต้น (รายการที่ 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 (ในระบบของฉัน):

แพ็คเกจ # method
-------------------------
repoquery 569
repoquery-2nd 216
ประวัติยำ 214

(ฉันไพพ์ผลลัพธ์ repoquery ผ่าน sort -u)

ทำไมถึงมีความแตกต่าง เนื่องจาก repoquery มีแพ็คเกจทั้งหมดจากทรานแซคชัน 1 และ 2 นั่นคือแพ็คเกจทั้งหมดที่ติดตั้งโดย Fedora installer สิ่งนี้อธิบายว่าทำไม repoquery จึงมีแพ็คเกจดังกล่าว xorg-x11- drv-mga และผองเพื่อน

การเปรียบเทียบ repoquery-2nd และ yum-history แสดงให้เห็นว่า repoquery-2nd นั้นมีความแม่นยำมากกว่า - มันไม่ได้รวมแพ็คเกจที่ลบออกไปแล้วบางส่วน นอกจากนี้ยังมีแพ็คเกจ (2 ระบบ) ของฉันจากการดำเนินการ 'yum update' - ดูเหมือนว่า

คำเตือน

วิธีการตามประวัติข้างต้นจะแสดงรายการแพ็คเกจทั้งหมดที่ติดตั้งอย่างชัดเจนตลอดอายุการใช้งานที่สมบูรณ์ของระบบ มันไม่ได้สร้างความสมดุลให้กับแพ็คเกจเหล่านั้นที่ถูกลบออกในการทำธุรกรรมในภายหลัง ดังนั้นวิธีนี้ต้องการผลการดัดด้วยตนเองบางอย่างและไม่ควรใช้กับระบบrepoqueryเท่านั้น


เป็นวิธีที่ดีที่จะตอบคำถามของเราให้ดีที่สุด! ฉันจะให้ +1 มากกว่านี้ถ้าฉันสามารถหาวิธีแก้ปัญหาในที่สุด + การเปรียบเทียบวิธีต่างๆที่น่าสนใจ
slm

2

ฉันมี Fedora เวอร์ชั่นเก่ากว่า (14) ดังนั้น yum ของฉันจึงมีฟีเจอร์ที่หลากหลายน้อยกว่า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

ข้อมูลประวัติ

ต่อไปนี้จะแสดงสิ่งที่ติดตั้งเป็นส่วนหนึ่งของธุรกรรม yum ที่ 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 รายงานว่าแพคเกจนั้นได้รับการติดตั้งหรือติดตั้งอย่างชัดเจนหรือไม่ คุณสามารถวิเคราะห์ข้อมูลนี้และรับรายการแพ็คเกจที่ติดตั้งไว้อย่างชัดเจน


ฉันได้เพิ่มคำตอบตามyum historyความคิดของคุณแล้วมันยังเปรียบเทียบผลลัพธ์กับrepoqueryวิธีที่อิง ในฐานะที่เป็นผลข้างเคียงฉันได้ขยายคำตอบเกี่ยวกับการค้นหาของฉันอีกครั้ง
maxschlepzig

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

1
เมื่อคุณดูคำตอบอีก 5 ข้อที่นี่คุณสังเกตเห็นอะไรที่แตกต่างเกี่ยวกับคำตอบของคุณ อย่างมีคำอธิบายไม่ได้ว่าทำไมหรือว่าคำตอบของคุณจะดีกว่าที่แตกต่างกัน มันจะดีถ้าคุณสามารถให้รายละเอียดของคำตอบที่ครอบคลุมสิ่งเหล่านี้
Stephen Rauch

@StephenRauch คำสั่งนี้ไม่รวมอยู่ในคำตอบอื่น ๆ เนื่องจากเป็นส่วนเสริม dnf ล่าสุด --userinstalledสวิทช์เป็นเพียงการเพิ่มใน DNF พฤษภาคม ฉันทดสอบแล้วและให้ผลลัพธ์ที่แม่นยำ Modulo แพคเกจ kernel / kernel-core / kernel-modules ซึ่งไม่ได้ติดตั้งโดยผู้ใช้จริงๆ นอกจากนี้ยังมี*-debuginfoแพ็คเกจทั้งหมด- แต่สามารถกรองได้ง่ายหากจำเป็น
maxschlepzig

@ maxschlepzig ขอบคุณสำหรับคำติชม แต่นี่เป็นคำถามเชิงโวหารเล็กน้อยพยายามที่จะให้ความรู้ / พร้อมรับคำตอบเพื่ออธิบายว่าในคำตอบ
Stephen Rauch

@StephenRauch ยุติธรรมพอการแก้ไขบางอย่างจะเหมาะสมและจะอนุญาตให้ฉันทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับได้
maxschlepzig

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.