Bagaimana Anda melacak paket mana yang diinstal pada Ubuntu (Linux)?

38

(Pertanyaan ini sangat mirip dengan 10458. Disarankan bahwa Fedora dan Ubuntu / Debian cukup berbeda untuk menjamin jawaban yang berbeda.)

Karena saya menggunakan pengaturan Ubuntu saya secara bertahap menginstal sejumlah paket di atas dan di atas instalasi dasar. Jika saya menginstal ulang, atau jika saya perlu menginstal mesin baru, saya biasanya ingin menginstal ulang paket - paket spesifik tersebut , dan saya ingin melakukannya dengan cepat untuk kembali bekerja dengan kerumitan minimum. Sejauh yang saya lihat, semua manajer paket ( apt-get, aptitudedan synaptic) dapat memberi tahu saya paket mana yang diinstal, dan mereka semua memiliki log (walaupun yang berbeda untuk setiap alat, yang merepotkan). Tapi tidak satu pun dari mereka yang bisa memberi tahu saya paket mana yang saya milikidiinstal, tidak seperti dependensi atau pembaruan sistem mereka. Bahkan log itu rumit karena saya tidak sepenuhnya yakin apa yang harus saya ekstrak dari mereka, atau bagaimana mengintegrasikannya (dalam hal berbagai alat keluarga yang tepat). Ini berarti bahwa setiap kali saya menginstal ulang, atau bahkan hanya membuat cadangan, saya tidak yakin bagaimana cara membuat kembali daftar itu.

Saya tidak perlu mengharapkan alat apa pun untuk melakukan ini untuk saya, tetapi jika tidak, saya sedang mencari solusi. Bahkan pola yang harus dipahami, aturan praktis yang baik, atau gagasan yang jelas tentang apa yang sebenarnya dicatat, akan bermanfaat. Mungkin tidak ada "jawaban terbaik" di sini tetapi jawaban yang bagus akan sangat membantu.


Sebagian besar jawaban di bawah ini memberikan perkiraan tentang apa yang saya cari, dan berguna sampai batas tertentu. Yang dipilih adalah yang paling dekat dengan cara otomatis menginstal ulang alat saya pada sistem baru, bahkan dengan semua peringatannya.

quark
sumber
Anda tidak akan mendapatkan satu jawaban yang mudah dibagikan untuk semua distro Linux. Manajemen paket adalah bagian besar dari apa yang membedakan distro Linux yang berbeda.
Telemachus
Telemakus - Benar. Dan mungkin masuk akal untuk membagi ini menjadi dua pertanyaan. Tapi itu sepertinya pertanyaan yang cukup khusus, dan saya menggunakan kedua sistem, jadi saya tidak ingin mempersempitnya terlalu awal. Sepertinya sebagian besar jawaban di sini adalah untuk dpkg / apt, jadi pertanyaan terpisah untuk rpm / yum mungkin masuk akal.
quark
Beralih ke NixOS :) (hanya trolling).
Alexey

Jawaban:

31

Pada mesin apa pun berbasis Debian, ini adalah salah satu cara umum untuk menduplikasi satu set paket. Di mesin lama:

dpkg --get-selections "*" > my_favorite_packages

Salin file my_favorite_packageske mesin baru (thumb drive adalah pilihan yang baik, tetapi scpjuga berfungsi dengan baik). Kemudian jalankan urutan ini (dengan hak akses root):

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

Ini tidak membuat Anda hanya paket yang Anda instal. Itu juga mendapatkan dependensi mereka, dll. Juga, jika repositori antara dua mesin berbeda, semua taruhan dimatikan.

Sejauh log, buat apt-getlog di /var/log/apt/history.log(terima kasih kepada Tshepang untuk memperbarui ini dalam komentar); dpkgmemang (at /var/log/dpkg.log), tetapi sulit diurai dan hanya bisa dibaca dengan hak akses root; aptitudememiliki satu di /var/log/aptitudedan Anda dapat halaman melalui itu dengan hak pengguna biasa.

Sejauh yang saya tahu, Anda benar bahwa tidak ada satu pun dari log ini yang melacak secara khusus apa yang Anda instal sebagai lawan dari dependensi yang diinstal secara otomatis. Anda dapat memperoleh informasi itu, dari aptitudepencarian. Cari semua paket yang diinstal yang juga diinstal secara otomatis:

aptitude search '~i ~M'

Jika Anda hanya menginginkan yang Anda instal (bukan dependensi otomatis), negasikan ~M:

aptitude search '~i !~M'

Jika Anda ingin yang diformat sehingga Anda hanya memiliki nama paket dan kata "instal", aptitudedapat melakukannya juga. Ini memberi Anda daftar yang siap diumpankan ke dpkg --get-selections:

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

(Aku punya apa-apa di RedHat atau sistem berbasis RedHat. Maaf. Tidak benar-benar ada satu jawaban untuk Linux per se karena manajemen paket adalah bagian besar dari apa yang membuat distro yang berbeda berbeda .)

Telemakus
sumber
Sepertinya kombinasi dari saran Anda dan Ludwig mungkin melakukan trik: aptitude dapat menghasilkan skrip untuk diumpankan ke dpkg sehingga itu kompatibel dengan otomatis yang merupakan kemenangan serius. Dan jika seseorang melakukannya di mesin vanilla, perbedaan dalam daftar cukup dekat dengan apa yang saya minta agar praktis berguna.
quark
3
Perhatikan bahwa APT sekarang menyimpan log di "/var/log/apt/history.log", dan digunakan oleh apt-get, synapticdan aptitude(sejauh yang saya telah melihat). Ini sejak awal 2010.
tshepang
The dpkg.logpernyataan tidak muncul untuk menjadi kenyataan di Ubuntu 14.04 sebagai pengguna saya bisa mendapatkan pilihan saya dengan mudah, tidak sepele, tapi tidak terlalu sulit. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Steve Buzonas
Sebenarnya, saya menyadari itu tidak semudah yang saya pikir, cacat pada skrip awk sebelumnya tidak memperhatikan paket yang dihapus. Berikut ini 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 -utidak.
Steve Buzonas
7

Gunakan dpkg -l '*' > jaunty.originaluntuk mengingat semua paket yang diinstal pada sistem yang baru diinstal.

Setelah Anda menginstal semua paket tambahan Anda lakukan dpkg -l '*' > mysystem.2009017.

Paket tambahan hanyalah perbedaan: diff jaunty.original mysystem.2009017

Ludwig Weinzierl
sumber
3
Ide dasarnya kuat: gunakan baris perintah untuk membuang daftar aplikasi yang saat ini diinstal, dan kemudian gunakan baris perintah untuk menginstal paket-paket itu pada mesin baru. Anda bisa menjadi sangat kreatif dan spesifik dengan pendekatan tersebut.
pcapademic
1
Saya lebih suka dpkg - dapatkan-pilihan
CesarB
Meskipun ini tidak melacak paket yang saya tambahkan berbeda dari dependensinya, itu pasti menghasilkan daftar yang berguna.
quark
3

Bakat sebenarnya cukup bagus dalam hal ini. Aptitude memang tahu kapan sesuatu dipasang dengan tangan atau dengan ketergantungan dan Anda dapat mengatakannya untuk menghapus hal-hal yang tidak lagi diperlukan dan hanya dipasang karena sesuatu yang bergantung padanya selalu menjaga sistem Anda sekecil mungkin.

Ada beberapa paket yang membuat instalasi Ubuntu, ubuntu-minimal, ubuntu-desktop, ubuntu-server dan sebagainya. Jika Anda memberi tahu Aptitude untuk menandai mereka sebagai yang diinstal secara manual dan menghapus yang lainnya, maka Anda akan mendapatkan jumlah paket minimum yang mungkin.

Saya menjelaskan bagaimana melakukan semua itu dalam dua posting di blog saya: Membersihkan sebuah Debian GNU / Linux dan Membersihkan sebuah Debian GNU / Linux (atau Ubuntu), reprise . Singkatnya, jawaban yang Anda cari adalah:

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

Terakhir kali saya bekerja dengan itu, jika Anda menggunakan apt-get, maka itu tidak berhasil. Itu sebabnya saya selalu merekomendasikan aptitude dan sejauh yang saya tahu, Debian sudah usang apt-get dalam mendukung aptitude.

Saya tidak tahu bagaimana melakukannya di Fedora dan Anda mungkin harus memisahkan daripada menjadi pertanyaan yang berbeda. Fedora dan Ubuntu adalah sistem operasi yang berbeda dan harus diperlakukan seperti itu (bahkan jika mereka berbagi kernel dan beberapa hal lainnya).

pupeno
sumber
2
Saya pikir Anda bisa mendapatkan informasi itu tanpa perlu grep: aptitude search '~i !~M'harus melakukan trik.
Telemachus
1
Juga, apt-gettidak usang. Debian merekomendasikan aptitudeuntuk manajemen paket pada baris perintah, tapi itu jauh dari usang apt-get.
Telemachus
Ada sesuatu yang halus di sini. Mencari "A" di kolom ketiga tampaknya menandai paket yang saya tahu diinstal sebagai dependensi. Tapi itu jelas tidak menangkap mereka semua: sebagian besar daftar jelas tidak diinstal oleh permintaan eksplisit saya.
quark
@Telemakus. Perintah Anda dan satu dengan pola tidak melakukan hal yang persis sama: kedua daftar memiliki konten yang berbeda. Saya tidak cukup tahu tentang bakat untuk memberi tahu Anda mengapa.
quark
@Pablo: Tautan ke log Anda tampaknya rusak. Jika Anda dapat memperbaikinya saya pasti ingin membacanya.
quark
2

Pada debian apt-show-versi menunjukkan versi paket yang diinstal.

seb
sumber
Dicatat. Ini tampaknya tidak diinstal (secara default) di Ubuntu.
quark
1

Pada sistem berbasis apt, lihat /var/log/apt/term.log. Bagi saya, ada garis yang cukup jelas untuk menggambarkan di mana instalasi berakhir dan di mana instalasi saya dimulai.

Menyeberang
sumber
Kurang berguna bagi saya, karena ada campuran instalasi manual dan pembaruan sistem. Juga tergantung pada istilah setup Anda. Log akhirnya akan menjadi usang dan dihapus, sehingga tidak akan kembali sejauh yang saya butuhkan.
quark
Bagi siapa pun yang mencoba ini, perhatikan bahwa mengarungi log apt tampaknya lebih banyak pekerjaan daripada opsi lain yang dibahas di sini. Tentu saja tidak otomatis untuk mengekstrak daftar paket dari log.
quark
1

Dari man aptitude-create-state-bundle:

aptitude-create-state-bundle menghasilkan arsip terkompresi yang menyimpan file yang diperlukan untuk mereplikasi keadaan arsip paket saat ini.

Ini akan menyimpan informasi yang sama dengan yang aptitudeada pada paket mana yang diinstal secara manual.

Ini dimaksudkan untuk digunakan dengan aptitude-run-state-bundle:

bundel aptitude-run-state-bundle membongkar bundel state aptitude yang diberikan yang dibuat oleh aptitude-create-state-bundle (1) ke direktori sementara, memanggilnya dengan yang disediakan, dan menghapus direktori sementara sesudahnya.

intuisi
sumber
1

Ketika hanya menggunakan dpkgAnda tidak tahu apakah paket itu diinstal secara manual oleh pengguna atau secara otomatis (sebagai ketergantungan atau selama instalasi OS awal). Jika Anda ingin menyimpan informasi itu, Anda harus mendapatkan daftar hanya paket yang benar-benar diinstal secara manual.

Untuk itu, Anda dapat menggunakan salah satu dari dua one-liner ini. Keduanya menghasilkan output yang sama persis pada mesin saya dan lebih tepat daripada semua solusi yang diajukan sampai sekarang dalam pertanyaan ini. Mereka adalah kombinasi dari dua jawaban (1) dan (2) . Perhatikan bahwa saya awalnya mengirim jawaban ini di sini .

Menggunakan apt-mark:

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

Menggunakan 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)

Sangat sedikit paket masih jatuh melalui celah-celah, walaupun aku curiga ini yang benar-benar dipasang oleh pengguna, baik tepat setelah instalasi melalui bahasa lokalisasi setup atau misalnya melalui Totem codec installer. Juga, versi linux-header juga tampaknya menumpuk, meskipun saya hanya menginstal metapackage non-spesifik. Contoh:

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

bagaimana cara kerjanya

  1. Dapatkan daftar paket yang diinstal secara manual. Untuk aptitude, sedstrip tambahan mengeluarkan spasi kosong di akhir baris.
  2. Dapatkan daftar paket yang diinstal tepat setelah instalasi baru.
  3. Bandingkan file, hanya output baris dalam file 1 yang tidak ada dalam file 2.

Kemungkinan lain tidak berfungsi juga:

  • Menggunakan ubuntu-14.04-desktop-amd64.manifestfile (di sini untuk Ubuntu 14.04) alih-alih /var/log/installer/initial-status.gz. Lebih banyak paket ditampilkan sebagai diinstal secara manual meskipun tidak.
  • Menggunakan apt-mark showautobukan /var/log/installer/initial-status.gz. apt-markmisalnya tidak menyertakan paket xserver-xorg, sedangkan file lain tidak.

Keduanya mendaftar lebih banyak paket daripada solusi di atas.

jmiserez
sumber
0

Saya bias, dan solusi yang saya sajikan tidak selalu mungkin, tetapi saya bosan dengan situasi ini. Hasilnya adalah saya tidak menginstal apa pun lagi dengan alat manajer pembaruan / paket.

Saya mengambil rute yang cukup sulit (saya memiliki persyaratan ketat untuk versi). Saya membuat makefile besar yang mengunduh, mengkompilasi dan menginstal di direktori home saya setiap paket (program, perpustakaan, apa pun) yang saya butuhkan. Saya mengembangkannya bertahap, sepotong demi sepotong. Makefile mengunduh dan mengkompilasi semuanya, bahkan kompiler.

Ketika saya pindah ke sistem baru, atau menginstal ulang, saya hanya menyalin makefile (ditambah beberapa hal pendukung), jalankan make world dan kembali keesokan harinya.

Untuk beberapa program yang saya kembangkan (jadi saya memiliki kendali), saya menggunakan alat yang saya program, manajer paket berangan . Semacam folder .app suka di MacOSX. Semuanya ada dalam paket, jadi saya tahu apa yang diinstal kapan saja, dan saya tahu itu mandiri dan mandiri (kecuali untuk lib sistem)

Stefano Borini
sumber
Anda bisa menempatkan perintah instalasi manajer paket dalam skrip dan memiliki efek yang sama; dengan asumsi bahwa kode yang Anda butuhkan dikemas. Pendekatan Anda terlihat sangat mirip dengan pendekatan gentoo.
wcoenen
Senang tahu tentang. Sepertinya banyak pekerjaan tambahan di luar sistem Ubuntu / Debian default. Saya dapat melihat secara manual mengelola beberapa paket, tetapi mempertahankan semuanya dengan cara ini lebih banyak pekerjaan daripada yang ingin saya lakukan.
quark
Ya, tetapi dengan masalah tambahan bahwa hal-hal ubuntu / fink / darwinports tidak berfungsi lintas platform di mana-mana (saya pernah menggunakan digital dan IBM sp4). Saya tidak mengklaim ini cara yang baik untuk dilakukan. Saya hanya mengatakan bahwa itu melakukan pekerjaan, meskipun dengan cara yang jelek dan bau, dan saya tetap memegang kendali penuh atas apa yang terjadi pada sistem saya.
Stefano Borini
Tentu saja, saya dapat memutuskan suatu hari untuk benar-benar melihat serius untuk muncul dan mengolah semuanya dengan itu.
Stefano Borini
Jalur ini lebih umum hari ini ketika Anda mempertimbangkan alat-alat seperti koki dan boneka.
Steve Buzonas