Bagaimana cara saya mereplikasi pilihan paket yang diinstal dari satu sistem Debian ke yang lain? (Debian Wheezy)

19

Saya mencoba mengatur lingkungan pementasan dalam VM, untuk menguji pembaruan sebelum menerapkannya ke sistem utama saya.

Untuk melakukannya, saya telah melakukan instalasi dasar Debian Wheezy (sama seperti pada sistem utama) di VM, kemudian jalankan sebagai root dari dalam VM:

# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh me@main-system 'dpkg --get-selections | grep -v deinstall' | \
  dpkg --set-selections

Arsitektur i386 sayangnya dibutuhkan dalam kasus saya; sistem ini asli amd64.

Masalahnya adalah dengan dpkg --set-selectionsmenjalankan di VM. Saya memang memiliki beberapa paket yang memerlukan penanganan khusus (itu sebenarnya alasan utama mengapa saya ingin lingkungan pementasan di tempat pertama) tetapi ketika saya menjalankan perintah terakhir di atas, saya mendapatkan sekitar trilyun garis output seperti:

dpkg: warning: package not in database at line NNN: package-name

untuk paket yang benar-benar harus tersedia di sistem dasar. Contohnya termasuk xterm, yelpdan zip.

Sekarang untuk pertanyaan saya:

Apa proses khusus untuk mentransfer daftar pemilihan paket dari satu sistem Debian ke sistem lain (dengan asumsi tingkat rilis Debian yang sama, di Wheezy) dan kemudian menerapkan perubahan itu? Tujuannya adalah bahwa keduanya memiliki daftar paket yang sama yang diinstal, idealnya sehingga melakukan diffantara output dpkg --get-selectionsatau dpkg --listkeduanya kembali tidak menunjukkan perbedaan.

Bagian grep -v deinstallini dipinjam dari paket Prevent agar tidak dihapus setelahdpkg --set-selections selesai di Ask Ubuntu.

Saya telah mengubah sumber di VM menjadi sama seperti pada sistem utama, juga menginstal apt-transport-https:

deb https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb [arch=amd64] http://archive.zfsonlinux.org/debian wheezy main

Melihat output --set-selection, saya melihat:

dpkg: warning: package not in database at line 1: a2ps
dpkg: warning: package not in database at line 1: abiword
dpkg: warning: package not in database at line 1: abiword-common
dpkg: warning: package not in database at line 1: abiword-plugin-grammar
dpkg: warning: package not in database at line 1: abiword-plugin-mathview
dpkg: warning: package not in database at line 1: accountsservice
dpkg: warning: package not in database at line 1: acl
dpkg: warning: package not in database at line 4: aglfn
dpkg: warning: package not in database at line 4: aisleriot
dpkg: warning: package not in database at line 4: alacarte
dpkg: warning: package not in database at line 4: alien
...

Nomor baris tampak aneh, dan bagian yang sesuai dari output --get-selection adalah:

a2ps install
abiword install
abiword-common install
abiword-plugin-grammar install
abiword-plugin-mathview install
accountsservice install
acl install
acpi-support-base install
acpid install
adduser install
aglfn install
aisleriot install
alacarte install
alien install

Perhatikan bahwa di antara acldan aglfnsedang acpi-support-base, acpiddan adduser yang tidak ada kesalahan dilaporkan . Tampaknya paket yang melaporkan kesalahannya unsesuai dengan dpkg -l, atau sama dpkg -lsekali tidak tahu tentangnya ( dpkg-query: no packages found matching ...). Saya tahu ada beberapa paket yang diinstal secara lokal, tetapi tidak banyak. i386tidak menemukan sampai gcc-4.7-base:i386 install lebih jauh ke bawah daftar (baris 342 dalam output --get-pilihan).

sebuah CVn
sumber
dpkg --get-selections … | … dpkg --set-selectionsadalah cara untuk mereplikasi pilihan paket. Jika gagal untuk Anda, Anda perlu memberikan lebih banyak informasi tentang alasannya. Posting sumber lengkap Anda pada kedua sistem, output dari dpkg --get-selections, dan transkrip penuh dari dpkg --get-selections(mungkin kita bisa melihat pola dengan melihat apa yang berhasil dan yang tidak). Jika sistem utama amd64 atau i386? Apakah itu berfungsi jika Anda tidak menambahkan arsitektur i386?
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Apakah itu benar-benar harus menjadi output penuh dari dpkg --get-selections(dan saya menganggap Anda maksud dpkg --set-selectionstranskrip?)? Bahkan yang pertama adalah lebih dari 3.600 baris dan benar sekitar 100 KB.
CVn
Anda perlu memposting yang cukup bagi kami untuk mengetahui pola paket mana yang memicu kesalahan dan mana yang tidak (kecuali Anda dapat mencari tahu sendiri). Salinan /var/lib/dpkg/Packages(yang bahkan lebih lama) dapat berguna juga - ini bisa menjadi gejala dari file Paket yang rusak.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Poin menarik. Saya belum benar-benar mempertimbangkan kemungkinan itu, tetapi saya memang menggunakan mirror yang berbeda pada ini. Biarkan saya melihat apakah itu masih terjadi jika saya mengarahkan VM pada mirror Debian yang sama. Bersiap.
CVn
@Gilles Itu tidak benar-benar membuat perbedaan yang jelas, tetapi saya memang menemukan sesuatu yang lain. Lihat pertanyaan yang diperbarui.
CVn

Jawaban:

17

Untuk mengkloning instalasi Debian, gunakan apt-cloneutilitas. Ini tersedia (sebagai paket terpisah, bukan bagian dari instalasi default) di Debian sejak mengi dan di Ubuntu sejak 12.04. Di mesin yang ada, jalankan

apt-clone clone foo

Ini menciptakan file foo.apt-clone.tar.gz. Salin ke mesin tujuan, dan jalankan

apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz

Jika Anda bekerja dengan sistem lama di mana apt-clonetidak tersedia, atau jika Anda hanya ingin meniru daftar paket yang diinstal tetapi tidak ada file konfigurasi, berikut adalah langkah-langkah manual.

  • Di mesin sumber:

    cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list
    dpkg --get-selections >selections.list
    apt-mark showauto >auto.list
    
  • Pada mesin target:

    cp sources.list /etc/apt/
    apt-get update
    /usr/lib/dpkg/methods/apt/update /var/lib/dpkg/
    dpkg --set-selections <selections.list
    apt-get dselect-upgrade
    xargs apt-mark auto <auto.list
    

Saya percaya bahwa Anda terpengaruh oleh perubahan tidak kompatibel dalam dpkg yang membuatnya menjadi mengi. Lihat bug # 703092 untuk latar belakang.

Ceritanya adalah bahwa dpkg --set-selectionssekarang hanya menerima nama paket yang ada dalam file /var/lib/dpkg/statusatau /var/lib/dpkg/available. Jika Anda hanya menggunakan APT untuk mengelola paket, seperti kebanyakan orang, maka /var/lib/dpkg/availabletidak diperbarui.

Setelah menjalankan apt-get updatedan sebelum menjalankan dpkg --set-selectionsdan apt-get -u dselect-upgrade, jalankan perintah berikut:

apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail

Dari jessie dan seterusnya, Anda dapat menyederhanakan ini menjadi

apt-cache dumpavail | dpkg --merge-avail

Atau, jalankan

/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/

atau bahkan lebih sederhana

apt-get install dctrl-tools
sync-available

Metode sederhana lain yang tidak perlu menginstal paket tambahan tetapi akan mengunduh daftar paket lagi adalah

dselect update

Lihat FAQ dpkg untuk informasi lebih lanjut. (Ini disebutkan di halaman manual dpkg, tetapi lebih dengan cara yang akan mengingatkan Anda tentang masalah ini jika Anda sudah sadar, bukan dengan cara yang menjelaskan bagaimana menyelesaikan masalah!)

Perhatikan bahwa mengkloning instalasi paket dengan dpkg --set-selectionstidak mengembalikan tanda otomatis / manual di APT. Lihat Mengembalikan semua data dan dependensi dari dpkg --set-selection '*' untuk detail lebih lanjut. Anda dapat menyimpan tanda pada sistem sumber dengan

apt-mark showauto >auto.list

dan mengembalikannya pada sistem target dengan

xargs apt-mark auto <auto.list
Gilles 'SANGAT berhenti menjadi jahat'
sumber
3
Masalah ini seharusnya lebih terlihat daripada sebelumnya. Aku tidak percaya aku belum pernah mendengarnya sebelumnya!
Faheem Mitha
Menarik. Akan mencoba ini. Terima kasih!
CVn
@FaheemMitha Ya, saya terkejut bahwa saya belum pernah mendengarnya sebelumnya hari ini. Aku tidak percaya aku belum menggunakannya dpkg --set-selectionssejak pra-mengi!
Gilles 'SANGAT berhenti menjadi jahat'
Oke, itu memberikan daftar peringatan yang jauh lebih pendek --set-selections. Sekarang bagaimana cara menerapkan perubahan? Bahkan apt-get -u dist-upgradehanya menyebutkan segelintir paket (semua yang berhubungan dengan ZFS) di mana seharusnya ada ratusan bahkan ribuan paket yang terpengaruh.
CVn
@ MichaelKjörling Ituapt-get -u dselect-upgrade
Gilles 'SO- berhenti bersikap jahat'
0

Bagaimana saya melakukannya

  1. Pada sumber host:

    apt-get update && apt-get dist-upgrade
    dpkg --get-selection >/tmp/source.sel
    cat /etc/apt/sources.list
    

    peduli /etc/apt/sources.list.djika digunakan ...

    Kemudian salin source.selfile ke host tujuan.

  2. Di host tujuan :

    vi /etc/apt/sources.list 
    

    adaptasikan sources.list bahkan dengan mirror yang berbeda, tetapi daftar komponen yang sama .

    apt-get update
    dselect upgrade
    dpkg --set-selection </tmp/source.sel
    dselect install
    

    Dan sekarang, host tujuan saya sedang menginstal banyak hal, maka saya dapat mengambil waktu untuk memposting ini.

techno
sumber
Mungkin 'upgrade dselect' harus menjadi 'pembaruan dselect' dalam deskripsi 'Bagaimana saya melakukannya' di atas.
Jonathan Kimmitt