Saya mencoba menyiapkan lingkungan staging di 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 dijalankan sebagai root dari dalam VM:
# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh [email protected] 'dpkg --get-selections | grep -v deinstall' |
dpkg --set-selections
Sayangnya, arsitektur i386 diperlukan dalam kasus saya; sistem ini asli amd64.
Masalahnya ada pada dpkg --set-selections
dijalankan di VM. Saya memiliki beberapa paket yang memerlukan penanganan khusus (itulah sebenarnya alasan utama mengapa saya menginginkan lingkungan pementasan di tempat pertama) tetapi ketika saya menjalankan perintah terakhir di atas, saya mendapatkan sekitar trilyun baris 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
, yelp
dan zip
.
Sekarang untuk pertanyaan saya:
Apa proses spesifik untuk mentransfer daftar pilihan paket dari satu sistem Debian ke sistem lainnya (dengan asumsi tingkat rilis Debian yang sama, dalam Wheezy) lalu menerapkan perubahan tersebut? Tujuannya adalah keduanya memiliki daftar paket terinstal yang sama, idealnya sedemikian rupa sehingga melakukan diff
antara keluaran dpkg --get-selections
atau dpkg --list
pada keduanya kembali tidak menunjukkan perbedaan.
grep -v deinstall
bagian dipinjam dari Mencegah paket dihapus setelah melakukan dpkg --set-selections
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-selections, 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 ganjil, dan bagian yang sesuai dari output –get-selections 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 acl
dan aglfn
adalah acpi-support-base
, acpid
dan adduser
yang tidak ada kesalahan yang dilaporkan . Tampaknya paket yang kesalahannya dilaporkan adalah un
sesuai dengan dpkg -l
, atau dpkg -l
tidak tahu sama sekali tentang mereka (dpkg-query: no packages found matching ...
). Saya tahu ada beberapa paket yang diinstal secara lokal, tetapi tidak banyak. i386
tidak muncul sampai gcc-4.7-base:i386 install
banyak lebih jauh ke bawah daftar (baris 342 di output –get-selections).
Jawaban yang Diterima:
Untuk mengkloning instalasi Debian, gunakan apt-clone
kegunaan. Ini tersedia (sebagai paket terpisah, bukan bagian dari instalasi default) di Debian sejak wheezy dan di Ubuntu sejak 12.04. Pada mesin yang ada, jalankan
apt-clone clone foo
Ini membuat 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-clone
tidak tersedia, atau jika Anda hanya ingin mereplikasi daftar paket yang diinstal tetapi bukan file konfigurasi apa pun, berikut adalah langkah-langkah manualnya.
-
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
-
Di 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 yakin Anda terpengaruh oleh perubahan dpkg yang tidak kompatibel yang pertama kali membuatnya menjadi mengi. Lihat bug #703092 untuk latar belakang.
Singkat cerita adalah dpkg --set-selections
sekarang hanya menerima nama paket yang ada di file /var/lib/dpkg/status
atau /var/lib/dpkg/available
. Jika Anda hanya menggunakan APT untuk mengelola paket, seperti kebanyakan orang, maka /var/lib/dpkg/available
tidak selalu up-to-date.
Setelah menjalankan apt-get update
dan sebelum menjalankan dpkg --set-selections
dan 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 lainnya yang tidak memerlukan instalasi paket tambahan tetapi akan mengunduh daftar paket lagi adalah
dselect update
Lihat FAQ dpkg untuk informasi lebih lanjut. (Hal ini disebutkan di halaman manual dpkg, tetapi lebih dengan cara yang akan mengingatkan Anda tentang masalah tersebut jika Anda sudah mengetahuinya, bukan dengan cara yang menjelaskan cara menyelesaikan masalah!)
Perhatikan bahwa mengkloning instalasi paket dengan dpkg --set-selections
tidak mengembalikan tanda otomatis/manual di APT. Lihat Memulihkan semua data dan dependensi dari dpkg –set-selections ‘*’ untuk detail selengkapnya. Anda dapat menyimpan tanda pada sistem sumber dengan
apt-mark showauto >auto.list
dan pulihkan pada sistem target dengan
xargs apt-mark auto <auto.list