web-dev-qa-db-ja.com

インストールされたパッケージの選択を1つのDebianシステムから別のシステムに複製するにはどうすればよいですか? (Debian Wheezy)

メインシステムに適用する前に更新プログラムをテストするために、VMにステージング環境をセットアップしようとしています。

これを行うために、VMにDebian Wheezy(メインシステムと同じ)の基本的なインストールを行い、VM内からrootとして実行しました。

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

残念ながら、私の場合はi386アーキテクチャが必要です。システムはAMD64ネイティブです。

問題は、VMで実行される_dpkg --set-selections_にあります。私は特別な処理を必要とするいくつかのパッケージを持っています(これらは実際にステージング環境が最初に必要な主な理由です)が、上記の最後のコマンドを実行すると、次のような膨大な数の出力が得られます。

_dpkg: warning: package not in database at line NNN: package-name
_

基本システムで実際に利用できるはずのパッケージ用。例には、xtermYelpZipなどがあります。

今私の質問のために:

あるDebianシステムから別のDebianシステムにパッケージ選択リストを転送する具体的なプロセスは何ですか(Wheezyで同じDebianリリースレベルを想定)その後、それらの変更を適用しますか?目標両方がインストール済みパッケージの同じリストを持っているということです。理想的には、2つの出力で_dpkg --get-selections_または_dpkg --list_の出力間でdiffを実行しても、違いは示されません。

_grep -v deinstall_の部分は Ask Ubuntuで_dpkg --set-selections_ を実行した後にパッケージが削除されないようにするために借用されました。

VMのソースをメインシステムと同じになるように変更し、_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
_

--set-selectionsの出力を見ると、次のことがわかります。

_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
...
_

行番号は奇妙に見え、-get-selectionsの出力の対応する部分は次のとおりです。

_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
_

aclaglfnの間には_acpi-support-base_、acpidadduserがあり、エラーは報告されていません。エラーが報告されているパッケージは、_dpkg -l_に応じてunであるか、_dpkg -l_がそれらについてまったく考えていないようです(_dpkg-query: no packages found matching ..._)。ローカルにインストールされたパッケージがいくつかあることは知っていますが、多くはありません。 _i386_は、リストのさらに下の_gcc-4.7-base:i386 install_much(--get-selections出力の行342)まではわかりません。

20
a CVn

Debianインストールのクローンを作成するには、 apt-clone ユーティリティを使用します。 Debianではwheezy以降、Ubuntuでは12.04以降で(デフォルトのインストールの一部ではなく、個別のパッケージとして)使用できます。既存のマシンで実行します

apt-clone clone foo

これにより、ファイルfoo.apt-clone.tar.gzが作成されます。それを宛先マシンにコピーして実行します

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

apt-cloneが利用できない古いシステムで作業している場合、またはインストール済みパッケージのリストのみを複製し、設定ファイルは複製したくない場合は、手動の手順を次に示します。

  • ソースマシン:

    cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list
    dpkg --get-selections >selections.list
    apt-mark showauto >auto.list
    
  • ターゲットマシン:

    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
    

私はあなたが最初にwheezyにしたdpkgの互換性のない変更の影響を受けていると思います。背景については bug#703092 を参照してください。

短い話は、dpkg --set-selectionsは現在、ファイル/var/lib/dpkg/statusまたは/var/lib/dpkg/availableに存在するパッケージ名のみを受け入れるということです。 APT=のみを使用して、ほとんどの人のようにパッケージを管理する場合、/var/lib/dpkg/availableは最新に保たれません。

apt-get updateを実行した後、dpkg --set-selectionsおよびapt-get -u dselect-upgradeを実行する前に、次のコマンドを実行します。

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

ジェシー以降、これを単純化して

apt-cache dumpavail | dpkg --merge-avail

または、

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

またはもっと簡単に

apt-get install dctrl-tools
sync-available

追加のパッケージをインストールする必要がなく、パッケージリストを再度ダウンロードする別の簡単な方法は、

dselect update

詳細は dpkg FAQ を参照してください。 (これはdpkgのmanページで言及されていますが、問題を解決する方法を説明する方法ではなく、すでに気付いている場合は問題を思い出させるような方法で!)

dpkg --set-selectionsを使用してパッケージインストールを複製しても、APTの自動/手動マークは復元されません。詳細は dpkg --set-selections '*'からのすべてのデータと依存関係の復元 を参照してください。マークをソースシステムに保存できます

apt-mark showauto >auto.list

そしてそれらをターゲットシステムに復元します

xargs apt-mark auto <auto.list

私がやった方法

  1. On sourceホスト:

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

    /etc/apt/sources.list.d使用する場合...

    次に、source.selファイルを宛先ホストに送信します。

  2. destinationホスト:

    vi /etc/apt/sources.list 
    

    異なるミラーでも、sources.list適応しますが、同じcomponentリストです。

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

    そして今、私のdestination Hostは現在多くのものをインストールしているので、これを投稿するのに少し時間がかかるかもしれません。

1
techno