Bagaimana mencegah pembaruan paket tertentu?

374

Karena bug # 693758 saya ingin mencegah apt-get upgradedan Memperbarui Manajer dari memperbarui paket "libgtk2.0-0".

Bagaimana ini bisa dicapai?

Ivan
sumber
@ hhlp: Tapi pertanyaan ini menanyakan tentang paket yang tidak pernah diinstal.
Nathan Osman
1
@ George Edison - Ada juga paket yang memungkinkan Anda untuk tidak memperbarui paket. jadi Memegang sebuah paket pada dasarnya berarti Anda memberi tahu pengelola paket untuk tetap menggunakan versi saat ini, apa pun yang terjadi. Ini berguna jika versi yang lebih baru dari program yang sedang berjalan rusak setelah pembaruan. (Anda tidak dapat memegang paket yang tidak pernah diinstal juga melihat pertanyaan saya adalah sama) .... saya diuji sekarang - lihat katanyadisable packages from the auto-update
hhlp

Jawaban:

554

Memegang

Ada empat cara untuk menahan paket: dengan dpkg, apt, aptitude atau dselect.

dpkg

Tunda paket:

echo "<package-name> hold" | sudo dpkg --set-selections

Hapus penangguhan:

echo "<package-name> install" | sudo dpkg --set-selections

Tampilkan status paket Anda:

dpkg --get-selections

Menampilkan status satu paket:

dpkg --get-selections | grep "<package-name>"

tepat

Pegang paket:

sudo apt-mark hold <package-name>

Hapus penangguhan:

sudo apt-mark unhold <package-name>

Tampilkan semua paket yang ditahan:

sudo apt-mark showhold

pilih

Dengan dselect, masuk ke layar pilihan [S], cari paket yang ingin Anda pegang dalam keadaan saat ini dan tekan =atau H. Perubahan akan segera berlaku setelah keluar dari layar pilihan [S].


Pendekatan berikut terbatas karena mengunci / menahan paket dalam aptitude atau sinaptik tidak memengaruhi apt-get / apt.

bakat

Pegang paket:

sudo aptitude hold <package-name>

Hapus penangguhan:

sudo aptitude unhold <package-name>

Mengunci dengan Manajer Paket Synaptic

Pergi ke Synaptic Package Manager (Sistem> Administrasi> Synaptic Package Manager).

Klik tombol pencarian dan ketikkan nama paket.

Ketika Anda menemukan paket, pilih dan pergi ke menu Paket dan pilih Versi Kunci .

Menu sinaptik

Paket itu sekarang tidak akan ditampilkan di manajer pembaruan dan tidak akan diperbarui.

hhlp
sumber
4
Ini juga berfungsi untuk mencegah paket tidak diinstal. Saat menginstal devscripts, banyak paket ditarik sebagai paket yang direkomendasikan. Karena saya tidak memerlukan mailserver (postfix), saya dapat menonaktifkan instalasi dengan menjalankan echo postfix hold | sudo dpkg --set-selectionssebelum menjalankan sudo apt-get install devscripts. Tindakan penahanan ini hanya berlangsung untuk instalasi ini, setelah instalasi pilihannya diatur ulang.
Lekensteyn
3
Juga patut ditunjukkan, paket tahan break break dan patch kadang-kadang dengan menciptakan situasi di mana tidak ada solusi hukum yang dapat dihitung untuk ketergantungan. Jika paket foo memiliki == <atau <= ketergantungan pada libbar, maka apt akan menolak untuk memutakhirkan libbar dan juga foo. Seiring waktu, dependensi cascading ini dapat tumbuh untuk memblokir sejumlah besar pembaruan, termasuk pembaruan keamanan penting. Anda harus menghapus penangguhan dan membiarkan pembaruan terjadi, atau membangun kembali paket yang Anda pegang terhadap versi yang lebih baru dari dependensinya jika ini terjadi.
Stephanie
2
Sekedar catatan: apt-marktidak mendukung holddalam versi 0.7.25 (Ubuntu Lucid)
Joril
1
Ini sangat berguna ketika mencoba menahan driver grafis. Untuk pengguna ATI apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev,.
earthmeLon
8
Saat ini paket hanya synaptic dan aptitude mengunci dalam program tersebut. "Apa pun yang melakukan peningkatan paket (baca: Update Manager, apt-get, aptitude, dll) mengabaikan ini." Dari pertanyaan ini .
holocronweaver
44

Untuk menunda paket "foo":

echo "foo hold" | dpkg --set-selections

Dalam kasus Anda, kami akan menahan anggur:

sudo -i
echo "wine hold" | dpkg --set-selections

Untuk menghapus penangguhan:

sudo -i
echo "wine install" | dpkg --set-selections
Harimau kumbang
sumber
Perhatikan juga bahwa ketika sebuah paket ditahan, Anda dapat menginstal versi tertentu melalui apt-get install wine=1.2.3. Sedang ditahan mencegahnya apt-get (dist-)upgrademengubahnya.
rcoup
@ Arcoup Jika Anda memiliki versi lama yang ditahan, dan kemudian Anda memperbarui secara manual ke versi baru tanpa menghapus penangguhan seperti yang Anda jelaskan, akankah versi lama disimpan dalam cache sehingga Anda dapat kembali ke sana?
cxrodgers
1
@cxrodgers cache lokal (biasanya /var/cache/apt/archives) tidak tergantung pada penangguhan & pemutakhiran & hal-hal lain, sehingga semua versi yang Anda unduh akan ada di sana sampai Anda menjalankanapt-get [auto]clean
rcoup
35

Saya mencari hal yang sama dan setelah banyak penelitian saya menemukan bahwa menggunakan sintaks berikut Anda dapat melarang satu versi tertentu tetapi mengizinkan pembaruan berikutnya:

Paket: compiz-plugins-main
Pin: versi 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
Prioritas Pin: -1

Ini masuk ke file / etc / apt / preferences.

soger
sumber
9
Ini adalah cara yang jauh lebih baik daripada mencegah pembaruan tanpa batas
Eero Aaltonen
Dengan metode ini, saya pikir, peluang lebih besar untuk mencegah ubuntu 'adware' seperti ubuntu satu atau ikon amazon diinstal ulang dengan peningkatan rilis berikutnya ...
Daniel Alder
19

Instal synapticmenggunakan sudo apt-get install synaptic.

Jalankan menggunakan gksudo synapticdan pada kotak pencarian temukan paket yang ingin Anda kunci, yaitu:gedit

masukkan deskripsi gambar di sini

Dari menu paket pilih Versi kunci :

masukkan deskripsi gambar di sini

Dan itu saja, versi yang saat ini diinstal pada saat kunci akan tetap diinstal bahkan selama upgrade.

Bruno Pereira
sumber
7
Silakan lihat "Versi kunci tidak sepintar kedengarannya. Seharusnya melakukan apa yang tertulis di kaleng, mengunci versi ... Tapi itu hanya mengunci dalam Synaptic. Hal lain yang melakukan peningkatan paket (baca: Perbarui Manajer , apt-get, aptitude, dll) mengabaikan ini. Ini mungkin perilaku buggy jadi saya berharap ini diperbaiki tepat waktu. " dari askubuntu.com/questions/9607/what-does-lock-version-do . Bagaimana keadaan saat ini? Jika ada sesuatu yang terkunci di Synaptic, akankah manajer paket lain "menghormati" kunci?
2
vasa1: Sampai versi 0.75.13, masih belum ada :( Masalah yang sama dengan bakat.
syockit
16

Mencegah paket agar tidak diinstal disebut "paket holding" dan sangat mudah dilakukan:

echo package_name hold | dpkg --set-pilihan

... di mana * package_name * adalah nama paket yang ingin Anda hindari dari instalasi.

Catatan: perintah di atas mengasumsikan hak akses root. Dengan kata lain, Anda mungkin perlu mengetik sudo susebelum menjalankannya.

RobotHumans
sumber
Sempurna inilah jawabannya. Terima kasih.
asoundmove
s/sudo su/sudo -s/g(atau sudo -i). ( -iakan memberikan shell login, -stidak akan).
derobert
6

Karena beberapa waktu apt-getdiganti oleh apt, jadi misalnya saya ingin mencegah Firefox memperbarui ke versi di atas 56, karena banyak tambahan, seperti "Grup Tab" tidak berfungsi lagi dengan Firefox 57 yang baru (lihat "WebExtensions Memperbarui").

Dimungkinkan untuk menyimpan lebih dari satu paket dengan satu perintah dan menggunakan wildcard.

Mencegah Firefox memperbarui

sudo apt-mark hold firefox firefox-locale-*

Jika Anda memutuskan untuk tidak memegangnya nanti, itu akan menjadi perintah:

sudo apt-mark unhold firefox firefox-locale-*
rubo77
sumber
4

Saya synaptic Anda dapat membekukan versi paket tertentu. Saya tidak 100% yakin apakah ini akan mengubah apt-get tetapi pasti akan menghentikan pembaruan manajer.

Untuk membekukan suatu paket pilih dalam sinaptik kemudian buka menu paket dan pilih versi beku.

Semoga ini membantu

sunting: Pertanyaan ini 16668 berkaitan dengan situasi yang serupa

Allan
sumber
3

Lihat bug # 75332 , # 158981 dan # 72806 .

Ringkasannya adalah bahwa penahanan pada tingkat apt-get / aptitude tidak memicu status penahanan dalam dpkg (terutama lihat bug 72806) dan pembaruan-manajer membaca status dari dpkg.

solusi dijalankan sebagai root: echo "package hold" | dpkg --set-selections

jasper
sumber
2

Anda dapat menggunakan aptitude pada "penggantian spesifik", seperti ini:

aptitude reinstall ~i oracle-java8-jre:

Ini adalah penggunaan hanya sekali (tidak disimpan untuk menginstal ulang masa depan), tetap menimpa spesifik, untuk menginstal ulang semua paket di sistem Anda tetapi tidak oracle-java8-jre.

Jika Anda menggunakan keep override khusus, paket tersebut akan dalam keadaan sementara tidak akan mencoba menginstalnya.

Suatu hal yang sangat baik jika Anda berpikir sistem Anda dikompromikan.

cabonamigo
sumber
1

Jika Anda telah menginstal Synaptic, Anda dapat memilih paket dan menggunakan menu Package -> Lock Version untuk mencegahnya diperbarui.

Anda dapat menginstal Synaptic dengan sudo apt-get install synaptic. Saya pribadi merasa lebih berguna daripada Pusat Perangkat Lunak ... sekali lagi, saya sudah cukup tua. :)

dinchamion
sumber
0

Kadang-kadang orang mungkin ingin menahan semua paket yang diinstal saat ini. Begini caranya.

Pertama-tama simpan kondisi saat ini, sehingga Anda dapat membatalkan:

dpkg --get-selections > current_selections.txt

Kemudian, untuk menahan semua paket:

dpkg --get-selections | sed -r "s/\tinstall/hold/" |dpkg --set-selections

Akhirnya, ketika Anda ingin kembali ke keadaan sebelumnya:

dpkg --set-selections < current_selections.txt

Satu kasus penggunaan untuk ini mungkin ketika membuat snapshot VM atau Amazon AMI untuk bermigrasi dari QA ke lingkungan produksi.

JVW
sumber
0

Menambahkan rincian ke komentar @ soger relatif terhadap Ubuntu 16.04.

Ubuntu 16.04 tidak memiliki file / etc / apt / preferensi yang ada secara default. Jika Anda belum memilikinya, buat saja file baru dan isi dengan bait seperti yang dijelaskan oleh @soger di atas untuk mengecualikan paket yang diberikan dan ketergantungannya dari pembaruan.

Setelah itu, jalankan apt updatedan Anda GTG. : 0)

Sebagai contoh, saya memiliki server Ubuntu 16.04.5 LTS dengan kartu video Intel yang tertanam dan kartu NVidia. Kartu NVidia adalah satu-satunya yang digunakan. Server juga menggunakan driver CUDA. Saya punya masalah di mana aptterus bersikeras

v-driver-semua

(Driver Intel) memerlukan pembaruan, tetapi tidak dapat menentukan versi mana yang akan diinstal. Ini membuat saya gila, dan saya tidak membutuhkan driver Intel. Saya memasukkan teks ini ke file preferensi dan flushed apt, masalah terpecahkan.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
MrPotatoHead
sumber