คุณติดตามแพคเกจที่ติดตั้งบน Ubuntu (Linux) อย่างไร


38

(คำถามนี้คล้ายกับ1,0458มากแนะนำว่า Fedora และ Ubuntu / Debian นั้นแตกต่างกันพอที่จะรับประกันคำตอบที่ต่างกัน)

ในขณะที่ฉันใช้การตั้งค่า Ubuntu ฉันจะค่อยๆติดตั้งแพคเกจจำนวนมากขึ้นเรื่อย ๆ จากการติดตั้งพื้นฐาน ถ้าฉันติดตั้งใหม่หรือถ้าฉันต้องการติดตั้งเครื่องใหม่ฉันมักจะต้องการติดตั้งแพคเกจเฉพาะเหล่านั้นอีกครั้งและฉันต้องการทำมันอย่างรวดเร็วเพื่อกลับไปใช้งานได้โดยไม่ยุ่งยาก เท่าที่ผมเคยเห็นของผู้จัดการแพคเกจ ( apt-get, aptitudeและsynaptic) สามารถบอกได้ว่าแพคเกจที่มีการติดตั้งและพวกเขาทั้งหมดมีบันทึก (แม้ว่าคนที่แตกต่างกันสำหรับแต่ละเครื่องมือซึ่งเป็นความยุ่งยาก) แต่ไม่มีใครสามารถบอกได้ว่าฉันบรรจุภัณฑ์อะไรติดตั้งเมื่อเทียบกับการอ้างอิงหรือการปรับปรุงระบบของพวกเขา แม้แต่ท่อนซุงก็มีเลศนัยที่ฉันไม่แน่ใจว่าสิ่งที่ฉันควรจะแยกออกจากพวกเขาหรือวิธีการรวมพวกเขา (ในกรณีของเครื่องมือที่เหมาะกับครอบครัวต่างๆ) ซึ่งหมายความว่าทุกครั้งที่ฉันติดตั้งใหม่หรือแม้กระทั่งสำรองข้อมูลฉันไม่แน่ใจว่าจะสร้างรายการนั้นใหม่ได้อย่างไร

ฉันไม่จำเป็นต้องคาดหวังว่าเครื่องมือใด ๆ ที่จะทำเพื่อฉัน แต่ถ้าพวกเขาไม่ฉันกำลังมองหาวิธีแก้ปัญหา แม้แต่รูปแบบการ grep สำหรับกฎง่ายๆหรือความคิดที่ชัดเจนของสิ่งที่ถูกบันทึกไว้จะเป็นประโยชน์ อาจไม่มี "คำตอบที่ดีที่สุด" ที่นี่ แต่คำตอบที่ดีจะมีประโยชน์มาก


คำตอบส่วนใหญ่ด้านล่างให้การประมาณของสิ่งที่ฉันกำลังมองหาและมีประโยชน์ในระดับหนึ่ง ตัวเลือกที่เลือกนั้นเป็นวิธีที่ใกล้เคียงกับวิธีการติดตั้งเครื่องมือของฉันบนระบบใหม่โดยอัตโนมัติอย่างสมเหตุสมผลแม้จะมีข้อแม้ทั้งหมด


คุณไม่น่าจะได้รับคำตอบที่แบ่งปันง่ายๆสำหรับ Linux distros ทั้งหมด การจัดการแพ็คเกจเป็นส่วนสำคัญที่ทำให้ Linux distros แตกต่างกัน
Telemachus

Telemachus - จริง และมันก็สมเหตุสมผลที่จะแยกคำถามนี้ออกเป็นสองคำถาม แต่ดูเหมือนคำถามที่ค่อนข้างพิเศษและฉันใช้ทั้งสองระบบดังนั้นฉันจึงไม่ต้องการ จำกัด ให้แคบเกินไปล่วงหน้า ดูเหมือนว่าคำตอบส่วนใหญ่ที่นี่มีไว้สำหรับ dpkg / apt ดังนั้นคำถามที่แยกต่างหากสำหรับ rpm / yum อาจสมเหตุสมผล
quark

เปลี่ยนเป็น NixOS :) (แค่หมุนรอบ)
Alexey

คำตอบ:


31

บนเครื่องที่ใช้ Debian นี่เป็นวิธีทั่วไปหนึ่งในการทำซ้ำชุดแพคเกจ บนเครื่องเก่า:

dpkg --get-selections "*" > my_favorite_packages

คัดลอกไฟล์my_favorite_packagesไปยังเครื่องใหม่ (thumb drive เป็นตัวเลือกที่ดี แต่ใช้scpงานได้ดี) จากนั้นเรียกใช้ลำดับนี้ (ด้วยสิทธิ์ root):

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

สิ่งนี้ไม่ได้ให้เฉพาะแพ็คเกจที่คุณติดตั้ง นอกจากนี้ยังได้รับการอ้างอิงของพวกเขา ฯลฯ นอกจากนี้หากที่เก็บข้อมูลระหว่างเครื่องสองเครื่องนั้นแตกต่างกันการเดิมพันทั้งหมดจะปิด

เท่าที่บันทึกapt-getให้เก็บบันทึกที่/var/log/apt/history.log(ขอบคุณ Tshepang สำหรับการปรับปรุงนี้ในความคิดเห็น); dpkgทำ (ที่/var/log/dpkg.log) แต่มันยากที่จะแยกวิเคราะห์ชื่อเสียงและสามารถอ่านได้โดยใช้สิทธิ์ของรูทเท่านั้น aptitudeมีหนึ่งที่/var/log/aptitudeและคุณสามารถเลื่อนดูหน้านั้นด้วยสิทธิ์ผู้ใช้ปกติ

เท่าที่ฉันสามารถบอกได้คุณมีสิทธิ์ที่ไม่มีบันทึกเหล่านี้ติดตามสิ่งที่คุณติดตั้งโดยเฉพาะเมื่อเทียบกับการพึ่งพาที่ติดตั้งโดยอัตโนมัติ อย่างไรก็ตามคุณสามารถรับข้อมูลนั้นได้จากการaptitudeค้นหา ค้นหาแพ็คเกจที่ติดตั้งทั้งหมดที่ติดตั้งโดยอัตโนมัติ:

aptitude search '~i ~M'

หากคุณต้องการเฉพาะสิ่งที่คุณติดตั้ง (ไม่ใช่การพึ่งพาอัตโนมัติ) ปฏิเสธ~M:

aptitude search '~i !~M'

หากคุณต้องการฟอร์แมตนั้นเพื่อให้คุณมีเพียงชื่อของแพ็คเกจและคำว่า "ติดตั้ง" aptitudeก็สามารถทำได้เช่นกัน สิ่งนี้ทำให้คุณมีรายการพร้อมที่จะฟีดไปที่dpkg --get-selections:

aptitude search '~i !~M' -F "%p install"

(ฉันไม่มีอะไรในระบบที่ใช้ RedHat หรือ RedHat ขออภัยไม่มีคำตอบเดียวสำหรับ Linux ต่อ seเนื่องจากการจัดการแพ็คเกจเป็นส่วนใหญ่ของสิ่งที่ทำให้ distros แตกต่างกัน )


ดูเหมือนว่าการรวมกันของคำแนะนำของคุณและลุดวิกอาจทำเคล็ดลับ: ความถนัดสามารถสร้างสคริปต์เพื่อป้อนไปยัง dpkg ดังนั้นมันจึงเป็นไปโดยอัตโนมัติซึ่งเป็นชัยชนะที่ร้ายแรง และถ้ามีใครทำมันบนเครื่องวานิลลาความแตกต่างในรายการต่าง ๆ ใกล้เคียงกับสิ่งที่ฉันขอให้มีประโยชน์ในทางปฏิบัติ
quark

3
ทราบว่าขณะนี้ APT เก็บบันทึกใน "/var/log/apt/history.log" และจะถูกใช้โดยapt-get, synapticและaptitude(เพื่อให้ไกลที่สุดเท่าที่ผมเคยเห็น) นี่คือตั้งแต่ต้นปี 2010
tshepang

dpkg.logงบดูเหมือนจะไม่เป็นจริงใน Ubuntu 14.04 เป็นผู้ใช้ใด ๆ ที่ฉันจะได้รับการเลือกของฉันได้อย่างง่ายดายไม่น่ารำคาญ แต่ไม่ยากเกินไป awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Steve Buzonas

ที่จริงแล้วฉันรู้ว่ามันไม่ง่ายอย่างที่ฉันคิดไว้ในตอนแรกข้อบกพร่องในสคริปต์ awk ก่อนหน้าไม่ให้ความสนใจกับแพ็คเกจที่ถูกถอนการติดตั้ง ต่อไปนี้จะawk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -uไม่
Steve Buzonas

7

ใช้dpkg -l '*' > jaunty.originalเพื่อจำแพ็กเกจที่ติดตั้งใหม่ทั้งหมดบนระบบที่ติดตั้งใหม่

หลังจากคุณติดตั้งแพ็คเกจเพิ่มเติมทั้งหมดdpkg -l '*' > mysystem.2009017แล้ว

แพ็คเกจเพิ่มเติมเป็นเพียงความแตกต่าง: diff jaunty.original mysystem.2009017


3
แนวคิดพื้นฐานแข็งแกร่ง: ใช้บรรทัดคำสั่งเพื่อดัมพ์รายการแอปพลิเคชันที่ติดตั้งในปัจจุบันแล้วใช้บรรทัดคำสั่งเพื่อติดตั้งแพ็กเกจเหล่านั้นบนเครื่องใหม่ คุณสามารถสร้างสรรค์และมีความเฉพาะเจาะจงได้ด้วยวิธีการ
pcapademic

1
ฉันชอบ dpkg - get-selections
CesarB

แม้ว่านี่จะไม่ได้ติดตามแพ็คเกจที่ฉันเพิ่มแตกต่างจากการพึ่งพามัน แต่ก็สร้างรายการที่มีประโยชน์อย่างแน่นอน
quark

3

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

มีแพ็คเกจจำนวนหนึ่งที่ประกอบไปด้วยการติดตั้ง Ubuntu, ubuntu-minimal, ubuntu-desktop, ubuntu-server และอื่น ๆ ถ้าคุณบอกความถนัดเพื่อทำเครื่องหมายสิ่งเหล่านั้นว่าถูกติดตั้งด้วยตนเองและลบทุกอย่างออกไปคุณก็จะได้แพ็คเกจที่น้อยที่สุด

ฉันอธิบายวิธีทำทั้งหมดในสองโพสต์ที่บล็อกของฉัน: การทำความสะอาด Debian GNU / Linuxและการทำความสะอาด Debian GNU / Linux (หรือ Ubuntu) ให้ทำซ้ำ กล่าวโดยย่อคำตอบที่คุณต้องการคือ:

aptitude search ~i | grep -v "i A"

ครั้งสุดท้ายที่ฉันทำงานกับสิ่งนั้นถ้าคุณใช้ apt-get มันก็ไม่ได้ผล นั่นเป็นเหตุผลที่ฉันมักจะแนะนำความถนัดและเท่าที่ฉันรู้ Debian กำลังคัดค้าน apt-get เพื่อความถนัด

ฉันไม่รู้ว่าจะทำยังไงกับ Fedora และคุณน่าจะแยกจากคำถามอื่น Fedora และ Ubuntu เป็นระบบปฏิบัติการที่แตกต่างกันและควรได้รับการปฏิบัติเช่นนี้ (แม้ว่าพวกเขาแบ่งปันเคอร์เนลและสิ่งอื่น ๆ )


2
ผมคิดว่าคุณจะได้รับข้อมูลที่ไม่จำเป็นต้องgrep: aptitude search '~i !~M'ควรทำเคล็ดลับ
Telemachus

1
นอกจากนี้ยังapt-getไม่ได้คัดค้าน Debian แนะนำaptitudeสำหรับการจัดการแพคเกจในบรรทัดคำสั่ง apt-getแต่นั่นเป็นหนทางไกลจากหึ
Telemachus

มีบางสิ่งที่ลึกซึ้งที่นี่ ค้นหา "A" ในคอลัมน์ที่สามดูเหมือนจะทำเครื่องหมายแพ็คเกจที่ฉันรู้ว่ามีการติดตั้งเป็นการอ้างอิง แต่เห็นได้ชัดว่าไม่ได้ดึงดูดพวกเขาทั้งหมดรายการส่วนใหญ่ไม่ได้รับการติดตั้งโดยคำขอของฉันอย่างชัดเจน
quark

@Telemachus คำสั่งและรายการที่มีรูปแบบของคุณไม่ได้ทำสิ่งเดียวกัน: รายการทั้งสองมีเนื้อหาที่แตกต่างกัน ฉันไม่รู้พอเกี่ยวกับความถนัดที่จะบอกคุณว่าทำไม
quark

@Pablo: ลิงก์ไปยังบันทึกของคุณดูเหมือนจะขาด หากคุณสามารถแก้ไขได้ฉันต้องการอ่านอย่างแน่นอน
quark

2

บน debian apt-show-versionsแสดงเวอร์ชันของแพ็คเกจที่ติดตั้ง


ข้อสังเกต. ดูเหมือนว่าจะไม่ได้รับการติดตั้ง (โดยค่าเริ่มต้น) บน Ubuntu
quark

1

บนระบบที่ใช้ apt ดูที่ /var/log/apt/term.log สำหรับฉันมีเส้นที่ชัดเจนในการวาดเมื่อการติดตั้งสิ้นสุดลงและเริ่มการติดตั้งของฉันที่ไหน


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

สำหรับใครก็ตามที่ลองสิ่งนี้โปรดทราบว่าการลุยผ่านบันทึกของ apt ดูเหมือนจะทำงานได้มากกว่าตัวเลือกอื่น ๆ ที่กล่าวถึงที่นี่ แน่นอนว่ามันไม่อัตโนมัติในการแยกรายการแพ็กเกจออกจากบันทึก
quark

1

จากman aptitude-create-state-bundle:

aptitude-create-state-bundle สร้างไฟล์เก็บถาวรที่บีบอัดซึ่งจัดเก็บไฟล์ที่จำเป็นในการเรพลิเคทสถานะไฟล์เก็บถาวรแพ็กเกจปัจจุบัน

สิ่งนี้จะเก็บข้อมูลเดิมที่aptitudeติดตั้งไว้ในแพ็คเกจด้วยตนเอง

มันมีความหมายที่จะใช้กับaptitude-run-state-bundle:

aptitude-run-state-bundle unpacks กลุ่ม aptitude state ที่กำหนดที่สร้างโดย aptitude-create-state-bundle (1) ไปยังไดเร็กทอรีชั่วคราวเรียกใช้มันด้วยค่าที่ให้มาและลบไดเร็กทอรีชั่วคราวหลังจากนั้น


1

เมื่อใช้เพียงแค่dpkgคุณไม่ทราบว่าแพ็คเกจถูกติดตั้งโดยผู้ใช้หรือโดยอัตโนมัติ (เป็นการอ้างอิงหรือระหว่างการติดตั้งระบบปฏิบัติการเริ่มต้น) หากคุณต้องการเก็บรักษาข้อมูลนั้นคุณจะต้องได้รับรายชื่อของแพ็คเกจที่ติดตั้งด้วยตนเองเท่านั้น

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

การใช้apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

การใช้aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

แพคเกจน้อยมากยังคงตกอยู่ในรอยแตกแม้ว่าฉันจะสงสัยว่ามีการติดตั้งโดยผู้ใช้จริง ๆ ไม่ว่าหลังจากติดตั้งผ่านการตั้งค่าการแปลภาษาหรือเช่นผ่านตัวติดตั้งตัวแปลงสัญญาณ Totem นอกจากนี้เวอร์ชันส่วนหัวของลินุกซ์ก็ดูเหมือนจะสะสมแม้ว่าฉันจะติดตั้ง metapackage ที่ไม่ใช่รุ่นเฉพาะเท่านั้น ตัวอย่าง:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

มันทำงานยังไง

  1. รับรายการแพ็คเกจที่ติดตั้งด้วยตนเอง สำหรับความถนัดsedแถบเพิ่มเติมจะเหลือพื้นที่ว่างที่ท้ายบรรทัด
  2. รับรายการแพ็คเกจที่ติดตั้งทันทีหลังจากติดตั้งใหม่
  3. เปรียบเทียบไฟล์เพียงส่งออกบรรทัดในไฟล์ 1 ที่ไม่อยู่ในไฟล์ 2

ความเป็นไปได้อื่น ๆ ก็ไม่ได้ผลเช่นกัน:

  • การใช้ubuntu-14.04-desktop-amd64.manifestไฟล์ ( ที่นี่สำหรับ Ubuntu 14.04) /var/log/installer/initial-status.gzแทน แพ็คเกจเพิ่มเติมจะแสดงตามที่ติดตั้งด้วยตนเองแม้ว่าจะไม่ใช่
  • ใช้แทนapt-mark showauto ตัวอย่างเช่นไม่มีแพ็คเกจ xserver-xorg ในขณะที่ไฟล์อื่นทำ/var/log/installer/initial-status.gzapt-mark

ทั้งสองรายการมีแพ็คเกจมากกว่าโซลูชันด้านบน


0

ฉันลำเอียงและวิธีแก้ปัญหาที่ฉันนำเสนอไม่สามารถทำได้เสมอไป แต่ฉันก็เบื่อกับสถานการณ์นี้ ผลลัพธ์คือฉันไม่ได้ติดตั้งอะไรอีกต่อไปด้วยเครื่องมือตัวจัดการอัพเดต / แพ็คเกจ

ฉันใช้เส้นทางที่ค่อนข้างยาก (ฉันมีข้อกำหนดที่เข้มงวดสำหรับรุ่น) ฉันสร้าง makefile ขนาดใหญ่ที่ดาวน์โหลดรวบรวมและติดตั้งในโฮมไดเร็กตอรี่ของฉันทุกแพ็คเกจ (โปรแกรม, ไลบรารี, อะไรก็ตาม) ที่ฉันต้องการ ฉันพัฒนามันทีละขั้นทีละชิ้น makefile ดาวน์โหลดและรวบรวมทุกอย่างแม้แต่คอมไพเลอร์

เมื่อฉันย้ายไปยังระบบใหม่หรือติดตั้งใหม่ฉันเพียงแค่คัดลอก makefile (รวมถึงสิ่งที่สนับสนุน) เรียกใช้สร้างโลกและกลับมาในวันถัดไป

สำหรับโปรแกรมบางอย่างที่ฉันพัฒนา (ดังนั้นผมจึงมีการควบคุมใน) ผมใช้เครื่องมือที่ฉันโปรแกรมแพคเกจผู้จัดการเกาลัด จัดเรียงโฟลเดอร์ like. app ใน MacOSX ทุกอย่างอยู่ในแพ็คเกจดังนั้นฉันรู้ว่ามีอะไรติดตั้งได้ตลอดเวลาและฉันรู้ว่ามันมีอยู่ในตัวเองและเพียงพอสำหรับตัวเอง (ยกเว้น libs ระบบ)


คุณสามารถใส่คำสั่งติดตั้งตัวจัดการแพคเกจในสคริปต์และมีผลเหมือนกัน; สมมติว่าคุณต้องการบรรจุรหัส วิธีการของคุณดูคล้ายกับของ gentoo มาก
wcoenen

ยินดีที่ได้รู้เกี่ยวกับ ดูเหมือนว่าจะมีงานพิเศษมากมายนอกเหนือจากระบบเริ่มต้นของ Ubuntu / Debian ฉันเห็นการบำรุงรักษาแพ็กเกจด้วยตนเอง แต่การรักษาทั้งหมดด้วยวิธีนี้ทำงานได้มากกว่าที่ฉันต้องการ
quark

ใช่ แต่ด้วยปัญหาเพิ่มเติมที่สิ่งที่ ubuntu / fink / darwinports ไม่ทำงานข้ามแพลตฟอร์มทุกที่ (ฉันอยู่ในดิจิตอลและ IBM sp4 ครั้งเดียว) ฉันไม่ได้อ้างว่านี่เป็นวิธีที่ดีที่จะไป ฉันแค่บอกว่ามันทำงานได้แม้ว่าจะน่าเกลียดและเหม็นและฉันก็ควบคุมอย่างเต็มที่ว่าอะไรจะเกิดขึ้นกับระบบของฉัน
Stefano Borini

แน่นอนฉันสามารถตัดสินใจได้ว่าสักวันหนึ่งพวกเขาจะมองอย่างจริงจังที่จะโผล่ออกมา
Stefano Borini

เส้นทางนี้เป็นเรื่องธรรมดามากในทุกวันนี้เมื่อคุณพิจารณาเครื่องมือเช่นพ่อครัวและหุ่นเชิด
Steve Buzonas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.