Mengapa versi paket Debian sebelumnya hilang di repositori paket? (sangat relevan untuk konfigurasi sistem yang dikontrol versi)

39

Skenario: Dalam konfigurasi sistem yang dikontrol versi yang didasarkan pada Puppet, Chef, dll., Diperlukan untuk mereproduksi status sistem tertentu. Ini dilakukan dengan menentukan versi paket sistem secara eksplisit.

Baru-baru ini kami mengalami masalah di mana versi paket tertentu tidak ada di repositori Debian. Satu contoh: Paket "patch" diperlukan dalam versi 2.7.5-1 + deb9u1, tetapi hanya 2.7.5-1 + deb9u2 yang tersedia. Contoh lain yang lebih parah: "linux-headers-4.9.0-9-common" diperlukan (karena kernel yang terkait sedang diinstal) dan hanya "linux-headers-4.9.0-11-common" yang tersedia.

Ini membuat tidak mungkin mereproduksi kondisi sistem tertentu.

Paket-paket di atas hanyalah contoh (yang sebenarnya saya temui). Saya tertarik untuk memahami dan memecahkan masalah umum.

Apa ide di balik pembaruan ini, paket 'lenyap' dan versi paket?

Di mana saya bisa mendapatkan versi sebelumnya (bukan versi lama, tetapi versi yang berumur beberapa minggu) dari paket Debian? Seharusnya dimungkinkan untuk mengotomatiskan proses instalasi secara umum.

Flo
sumber
1
Agak tergantung pada perangkat lunak yang digunakan untuk mengkonfigurasi repositori. Reprepro, iirc, hanya mengizinkan versi tunggal dari setiap paket
muru
2
stabletetap konsisten, setidaknya sampai rilis poin berikutnya. pembaruan stabil, pengujian, dan tidak stabil hanya berisi versi terbaru dari setiap paket yang diberikan. Untuk hal lain, Anda harus melihat di archive.debian.org (atau snapshot.debian.org sebagaimana disebutkan dalam jawaban SK)
cas
5
Apakah ada alasan Anda tidak menjalankan repo sendiri di mana Anda dapat mengontrol kebijakan penggantian dan versi pin (yang akan memiliki keuntungan membuat instalasi otomatis di masa mendatang menjadi lokal)?
Eric Towers
2
Nama linuxpkg baru adalah pengecualian: secara umum, paket stabil Debian menggunakan nama paket yang sama dan hanya mengubah nomor versi. linux-image-amd64tidak pernah berganti nama dan selalu tergantung pada yang terbaru linux-image-4.9.0-*. Nama linux-image-4.9.0-*pkg baru menandai perubahan ABI kernel yang tidak kompatibel yang diperlukan untuk mendukung beberapa perbaikan bug dan memungkinkan untuk berurusan dengan kompilasi yang diperlukan dari modul yang dibuat khusus (dkms, dll). Demikian pula untuk linux-headers-*.
ignis
1
Apa ide di balik pembaruan ini apt-get changelog packagename
ignis

Jawaban:

65

Mampu mereproduksi pengaturan tertentu, ke versi yang tepat, adalah kebutuhan Anda , bukan milik Debian.

Debian hanya mendukung versi tunggal dari setiap paket biner dalam setiap rilis yang diberikan; lawan dari itu adalah bahwa kehati-hatian diambil untuk memastikan bahwa paket pembaruan dalam setiap rilis yang diberikan tidak memperkenalkan regresi, dan ketika kehati-hatian seperti itu tidak mungkin, untuk mendokumentasikan fakta itu. Menyimpan beberapa versi dari paket yang diberikan hanya akan menambah beban dukungan dan persyaratan pengujian: misalnya, pengelola paket harus menguji paket yang diperbarui terhadap semua versi perpustakaan yang tersedia yang mereka gunakan, alih-alih hanya versi yang saat ini didukung ... Paket hanya diperbarui dalam rilis stabil ketika benar-benar diperlukan, yaituuntuk memperbaiki bug serius (termasuk masalah keamanan). Dalam kasus kernel, ini kadang-kadang berarti bahwa ABI kernel berubah, dan nama paket berubah sebagai akibatnya (untuk memaksa membangun kembali paket-paket dependen); ada meta-paket yang dapat Anda menarik bukan hard-coding ABI ( linux-image-amd64, linux-headers-amd64, dll).

Namun ada solusi untuk situasi Anda: setiap sumber yang diterbitkan dan paket biner diarsipkan di snapshot.debian.org . Saat Anda membuat pengaturan berversi, Anda dapat memilih snapshot yang sesuai (misalnya, salah satu snapshot September 2019 ) dan menggunakannya sebagai URL repositori Anda:

deb https://snapshot.debian.org/archive/debian/20190930T084755Z/ buster main

Jika Anda akhirnya mengandalkan ini, silakan gunakan cermin caching dari beberapa jenis, misalnya Apt-Cacher NG . Ini tidak hanya akan mengurangi beban pada server snapshot, itu akan memastikan bahwa Anda memiliki salinan lokal dari semua paket yang Anda butuhkan.

(Situasi berkaitan dengan paket sumber sedikit lebih kompleks, dan arsip memang membawa beberapa versi dari beberapa paket sumber dalam rilis yang diberikan, karena ketergantungan lisensi. Tapi itu tidak relevan di sini. Sebenarnya, Debian memang menyediakan beberapa versi beberapa binari dalam rilis yang didukung: versi saat ini dalam rilis titik saat ini, bersama dengan setiap pembaruan dalam repositori keamanan dan memperbarui repositori; yang terakhir dilipat pada rilis poin berikutnya. Jadi mempertahankan konfigurasi sistem yang dapat direproduksi dan dikontrol versi dapat dilakukan tanpa beralih ke snapshot, selama Anda memperbaruinya setiap kali rilis poin dilakukan.)

Stephen Kitt
sumber
Perhatikan bahwa kadang-kadang beberapa versi sebelumnya tersedia - apt-cache madison packagenameakan menampilkan semua versi yang aptdapat melihat melalui repositori yang dikonfigurasi.
ivanivan
5
(Tolong jangan membebani server snapshot / arsip dengan menggunakannya secara tidak perlu, alih-alih mirror terdekat. Jadi biarkan mirror normal Anda di sources.list Anda dengan prioritas lebih tinggi dari snapshot, sehingga paket masih tersedia dari itu sehingga dapat diambil dengan cara itu .)
Peter Cordes
3
Hanya untuk memverifikasi bahwa saya telah memahami dengan benar: Dalam praktiknya, ini bukan tentang versi yang saya tentukan saat menginstal paket (karena versi yang lebih lama mungkin tidak tersedia), tetapi lebih pada keadaan repositori paket yang saya gunakan. Jadi, jika saya ingin Debian 9.8 'segar' saya memerlukan repositori paket dalam keadaan itu (misalnya snapshot atau repositori yang saya buat sendiri), dan kemudian, tentu saja, paket linux-header- * yang benar tetap tersedia . Jika saya ingin bermigrasi ke Debian 9.9, saya mendapatkan repositori paket ke status terkait dan menjalankan apt-get dist-upgrade. Apakah ini benar?
Flo
2
Ya itu benar.
Stephen Kitt
3
@Flo note, rilis titik itu (seperti debian X.9, atau X.8) hanya dimaksudkan untuk iso yang dapat diunduh, jadi instalasi baru tidak mengunduh banyak paket. Dalam repositori, tidak ada perbedaan antara rilis poin, Anda selalu mendapatkan paket terbaru.
Braiam
16

Jangan mengandalkan server yang tidak berada di bawah kendali Anda untuk mereproduksi status sistem tertentu. Bahkan mengira server Debian cukup dapat diandalkan, Anda tidak pernah tahu apa yang bisa terjadi di masa depan. Ini sangat relevan dengan repositori lain, yang mungkin Anda gunakan.

Anda harus memelihara mirror Anda sendiri untuk mendapatkan status sistem yang dapat diperbanyak. Dengan cara ini Anda bahkan dapat memiliki status produksi untuk sistem normal Anda dan beberapa negara pengujian untuk konfigurasi baru.

Alat manajemen repositori dengan tepat mampu membuat mirror dari repositori. Anda dapat memilih paket untuk di-mirror, membuat snapshot dari konten repositori pada titik waktu tertentu dan menggabungkan beberapa mirror atau snapshots ke dalam satu repositori. Dengan cara ini Anda dapat memiliki status sistem yang sepenuhnya dapat direproduksi.

Charleston
sumber
8

Sementara jawaban Stephen Kitt tentu saja merupakan salah satu solusi yang mungkin, saya pikir akan lebih aman bagi Anda untuk menyimpan salinan paket-paket yang diperlukan.

Saat merekam pengaturan sistem, pastikan untuk menyimpan salinan .debfile -f dari /var/cache/apt/archives/. Anda juga bisa menggunakan apt-get download.

Saat memulihkan pengaturan sistem, Anda harus sangat ketat aptuntuk menghindari memicu tindakan otomatis yang berpotensi berbahaya.

Mungkin akan lebih mudah digunakan dpkgsecara langsung untuk menginstal apa yang Anda inginkan.

Stig Hemmer
sumber
6
Pendekatan IMO yang lebih baik lagi adalah dengan menggunakan cache APT lokal. Itu menghindari masalah di paragraf ketiga Anda, dan juga menghindari keharusan panen /var/cache/apt.
Stephen Kitt
3
Ada dua varian dari ini - satu menggunakan sesuatu seperti apt-mirror untuk mengkloning seluruh repo, yang lain adalah hanya mengunduh paket dan dependensi tertentu . Kemudian snapshot dir - eg dengan btrfs as pkgs-20190501, lalu publikasikan snapshot dir sebagai repo. Saat membangun, masukkan url repo versi (mis. http://debmirror/pkgs-20190501/...) Di sources.list, lalu jalankan apt-get update, apt-get install $ pkgs, dll.
bain