Bagaimana cara menginstal paket Ubuntu tertentu, dengan versi yang tepat?


225

Saya ingin mengatur mesin virtual baru dengan beberapa paket tertentu (nama dan versi), yang disediakan.

Misalnya apache2 dalam versi 2.2.20-1ubuntu1dengan semua dependensi. Bahkan jika ada versi baru dari paket ini di server yang satu ini harus diinstal.

Solusinya harus bekerja / skala dengan beberapa (n) "pengaturan". Mesin virtual lain mungkin membutuhkan versi apache2 yang lebih lama.

Saat ini saya tahu beberapa kemungkinan yang menginstal paket yang tepat, tetapi jangan skala yang baik:

  1. Salin semua yang diperlukan *.debuntuk setiap mesin virtual secara manual dan masukkan: dpkg -i... -> Bisa bekerja, tetapi sangat rentan kesalahan. (Skrip manual dll.)
  2. Buat dan gunakan repositori Ubuntu baru untuk setiap pengaturan. -> Tidak berfungsi karena saya akan membutuhkan n repositori.
  3. Atur mesin sekali dan salin VM / buat snapshot. -> Tidak berfungsi karena saya perlu menyimpan n VMs.

Masalah saya bisa dilabeli sebagai manajemen tambalan, tetapi saya tidak ingin memperbarui paket saya ke versi saat ini. Tujuan saya adalah menginstal paket lama.

Jawaban:


228

Anda dapat menggunakan apt-getuntuk menginstal versi tertentu dari paket selama itu dalam arsip yang tepat untuk diketahui. Dari halaman apt-getmanual:

Versi spesifik dari suatu paket dapat dipilih untuk instalasi dengan mengikuti nama paket dengan yang sederajat dan versi paket yang akan dipilih. Ini akan menyebabkan versi tersebut ditempatkan dan dipilih untuk diinstal. Atau distribusi tertentu dapat dipilih dengan mengikuti nama paket dengan garis miring dan versi distribusi atau nama Arsip (stabil, beku, tidak stabil).

Misalnya, Anda bisa melakukan:

sudo apt-get install apache2=2.2.20-1ubuntu1

Perhatikan bahwa Anda mungkin perlu melakukan beberapa resolusi dependensi sendiri dalam kasus ini, tetapi jika ada masalah apt-get akan memberi tahu Anda apa yang menyebabkannya. Pada sistem 11.10 saya, saya perlu melakukan yang berikut ini agar ini berfungsi:

sudo apt-get install apache2=2.2.20-1ubuntu1 \
                     apache2.2-common=2.2.20-1ubuntu1 \
                     apache2.2-bin=2.2.20-1ubuntu1 \
                     apache2-mpm-worker=2.2.20-1ubuntu1

46
bagaimana cara mengetahui versi mana yang tersedia?
Rodrigo Gurgel

12
@Rodrigo Gurgel, "aptitude
apps

3
@ user169015 "versi ada"! = "versi dipaket untuk Ubuntu dan tersedia dengan apt"
Kyle Strand

Hai Kyle, saya tidak mendapatkan komentar Anda, meskipun Ya, paket dapat diinstal menggunakan apt juga. Saya hanya bertahan dengan bakat karena saya telah menggunakannya untuk waktu yang lama ... :)
user169015

6
@ user169015 Saya pikir Anda kehilangan titik komentar Kyle ,. Lihatlah jawaban psusi di bawah ini. Rupanya repositori APT Ubuntu tidak terus meng-host paket versi lama! Jadi tidak seperti manajer paket runtime (pip, gem, maven, dll.), Anda tidak dapat mengandalkan repositori APT Ubuntu jika Anda ingin menyusun kembali konfigurasi lama yang dikenal dengan baik. Saya terkejut dan kecewa menyadari hal ini sendiri. Mungkin Arch menangani ini dengan lebih baik? ( askubuntu.com/questions/728439/… )
algal

66

Untuk memeriksa versi mana yang tersedia, Anda dapat memeriksa melalui:

sudo apt-cache madison ^apache2

Jika tidak berfungsi, pertimbangkan untuk menjalankan sudo apt-get updatesebelum memperbarui daftar paket.

Kemudian salin versi atau gunakan sintaks berikut:

sudo apt-get install apache2=2.2\*

Untuk memeriksa versi mana yang telah Anda instal, jalankan:

dpkg -l 'apache2*' | grep ^i

5
Terima kasih banyak untuk menunjukkan =2.2\*opsi sebagai cara untuk menggunakan wildcard untuk memilih subversi yang tersedia. Itulah yang ingin saya ketahui tetapi tidak tahu bagaimana bertanya :)
aexl

3
Saat mencantumkan versi menggunakan dpkg -l <packageName>, nomor versi terkadang terpotong. Untuk menghindarinya, gunakanCOLUMNS=100 dpkg -l <packageName>
CJBS

Di Yakkety, perintah pertama hanya memberi saya:N: Unable to locate package ^apache2
Jesse Glick

@JesseGlick Jalankan sudo apt-get updatedulu. Pastikan Anda telah mengonfigurasi sumber Apt yang tepat.
kenorb

1
N: Tidak dapat menemukan paket ^ apache2 setelah $ sudo apt-get pembaruan tetapi sudo apt-get install apache2 = 2.2 * berfungsi untuk saya
Braian Mellor

17

Saya akan memperluas jawaban sebelumnya dengan perintah versi berguna lainnya dalam aptkeluarga. Untuk melihat versi mana yang tersedia, jalankan apt-cache policy:

# apt-cache policy apache2
apache2:
  Installed: (none)
  Candidate: 2.4.7-1ubuntu4.5
  Version table:
     2.4.10-1ubuntu1.1~ubuntu14.04.1 0
        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages
     2.4.7-1ubuntu4.5 0
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
     2.4.7-1ubuntu4 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Kemudian, seperti yang disebutkan di tempat lain, instal versi tertentu dengan apt-get:

# apt-get install apache2=2.4.7-1ubuntu4.5
...

Anda sekarang dapat melihat versi mana yang telah Anda instal dengan menjalankan apt-cache policylagi:

# apt-cache policy apache2
apache2:
  Installed: 2.4.7-1ubuntu4.5
  Candidate: 2.4.7-1ubuntu4.5
  Version table:
     2.4.10-1ubuntu1.1~ubuntu14.04.1 0
        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages
 *** 2.4.7-1ubuntu4.5 0
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.4.7-1ubuntu4 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Jika Anda tidak ingin versi yang lebih baru diinstal pada pembaruan, sematkan paket dengan apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Katakanlah versi apache2 baru ditambahkan ke indeks paket dan mesin Anda disinkronkan dengan apt-get update. Anda akan melihat ini ketika Anda menjalankan berikutnya apt-get upgrade:

# apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  apache2
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

6

Secara praktis, ini tidak mungkin karena versi lama tidak disimpan dalam arsip, jadi kecuali Anda memiliki salinan versi lama yang diletakkan di suatu tempat, Anda tidak dapat menginstalnya. Anda harus bertanya pada diri sendiri mengapa Anda ingin menginstal versi yang lebih lama. Pada rilis yang stabil, alasan utama untuk merilis versi baru adalah untuk memperbaiki kerentanan keamanan, dan Anda tidak ingin menjalankan server yang rentan bukan?


25
Saya membutuhkan ini untuk mereproduksi salinan persis dari lingkungan lama untuk tujuan pengembangan. Apakah mungkin untuk mensetup mirror yang tidak menghapus versi paket lama untuk mengakses paket yang diperlukan atau apakah saya perlu mengatur beberapa repositori yang hanya menyimpan diffs?
ayckoster

19
@psusi: Bukan tanggapan yang adil, mungkin ada banyak alasan. Dalam kasus saya, versi yang lebih baru mungkin benar-benar memiliki bug, dan untuk mengecek itu diperlukan versi yang lebih lama. Contoh saja.
Cookie

2
@nomen, tidak, itu adalah distro tunggal yang tidak menggunakan model rilis bergulir. Perhatian besar diambil untuk memastikan bahwa ketika bug kritis dan kerentanan keamanan diperbaiki dalam rilis stabil, bahwa mereka tidak menyebabkan regresi, tetapi jika itu terjadi, maka ajukan laporan bug yang ditandai dengan rilis-regresi dan akan diperbaiki atau digulung kembali.
psusi

5
@nomen, jika Anda ingin membuat makna sendiri untuk kata-kata, Anda akan kesulitan berkomunikasi dengan orang lain. Untuk semua orang di dunia, bukan itu yang dimaksud rolling release, dan rolling release adalah kebalikannya, dan karenanya, saling eksklusif dengan rilis stabil. Dan sekarang saya berpikir tentang hal itu, versi asli yang dikirimkan bersama rilis sebenarnya disimpan di saku -release, dan pembaruan pergi ke saku -perbarui atau keamanan, jadi saat Anda tidak bisa kembali ke pembaruan sebelumnya, Anda dapat kembali ke versi aslinya dirilis.
psusi

5
@psusi: Ini satu lagi untuk Anda. Serentak dituntut untuk selalu menjadi versi yang sama di semua mesin. Namun pada 13.10 ini adalah versi yang berbeda dari pada 12,04 LTS. Jadi sekarang bagaimana? Ketika datang ke pertanyaan seperti ini, menerima jawaban seperti mengapa Anda ingin melakukan ini benar-benar sangat tidak membantu dan membuang-buang waktu untuk semua orang.
Kue

2

Seperti yang dijelaskan psusi, versi lama tidak disimpan di repositori ubuntu, tetapi tampaknya Anda masih dapat menemukannya di launchpad. Jadi, Anda buka (ganti trusty dan amd64 dengan versi dan arsitektur ubuntu Anda):

https://launchpad.net/ubuntu/trusty/amd64/apache2

dan pilih versi yang Anda inginkan. Kemudian Anda mengunduh deb sebagai file dan menginstal dengan:

dpkg -i apache2_2.4.7-1ubuntu4.20_amd64.deb

Sekali lagi, ganti nama file ke file Anda. Ini membosankan jika Anda harus menurunkan banyak paket, tetapi lebih baik daripada tidak sama sekali jika Anda putus asa.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.