
一般化する
version-specific
質問のタイトルに注意してください!質問は〜です。いいえ、どのように
- Debian ホストからインストールされたすべてのパッケージのリストをキャプチャします。
- 他のDebianホストにリストされているパッケージの最新バージョンをインストールします。
問題はむしろ
- ある時点でDebianホストで
- 一つをキャプチャパック地図含む
- インストールされている各パッケージの名前
- 現在インストールされている各パッケージのバージョン
- ...追加のデータが必要です。
- 一つをキャプチャパック地図含む
- その後の作業のために、後で同じホストからパッケージマッピングを復元します。
- パッケージマップにパッケージのみをインストールする
- マップの各パッケージに適切なバージョンのみをインストールしてください。
詳細
やる気
最近、私はDebianコンピュータの1つで「大規模な更新」(つまり、多くのパッケージやカーネルなどの主要なパッケージ、またはその両方を含む)を実行しましたが、「完全に」更新されていません(つまり、主な質問はありません)。将来、Debian コンピュータに誤ったアップデートを適用した場合は、ロールバックできたらと思います。(ㅏ)パッケージは同じボックスに配置されます。(二)以前のバージョンに。 (以前はイメージバックアップをしたことがなくて遅かったです。) 残念ながらどうしたらいいかわかりません。私する方法を知る
- Debianシステムにインストールされているパッケージセットの各パッケージ名のリストをキャプチャします。
- 別のボックスでは、リスト内の各パッケージの最新バージョンをインストールします。
複数のSEを含むこれを行う方法を議論する多くのWebページに感謝します。ほとんど(含む)これ、これとこれ) やや複雑な変更を行います。
- サポート:
dpkg --get-selections > ${PACKAGE_LIST_FILEPATH}
- 再び覆う:
dpkg --set-selections < ${PACKAGE_LIST_FILEPATH}
おそらく、このトピックの最も包括的で最もスクリプト化されたSEは次のとおりです。これcp -R /etc/apt/sources.list*
:ストレージリスト(使用)とストレージキー(使用)の両方をバックアップすることが推奨されるいくつかの方法の1つですが、上記の方法もapt-key exportall
使用します。dpkg
このSEバックアップとインストールにはaptitude
(FWIW、優先的で疑わしい)を使用することをお勧めします。dpkg
このSEdeborphan
バックアップすることをお勧めします。
しかし、上記のいずれもパッケージを保存しません。バージョンだから、それらのどれも私のユースケースに合わない。 (IIUC - 何か逃した?)
仮説
当然、自分のデバイスから任意のファイルをバックアップし、必要に応じて復元できる必要があります。同様に、パッケージをバックアップ/復元でき、定期的に実行されるバックアップツールに統合できる必要があります。幸い、パッケージリストのバックアップ/復元はよく理解されています。bash
バックアップには次のコードを使用できます
## setup
PACKAGE_LIST_FILENAME='package.list' # see use below
REPO_KEYS_FILENAME='repo.keys' # ditto
DATE_FORMAT="%Y%m%d_%H%M%S"
BACKUP_TIMESTAMP="$(date +${DATE_FORMAT})" # get current timestamp, to the second
# Parent directory of that to which you will backup.
BACKUP_ROOT="/media/$(whoami)/my_backup_drive"
BACKUP_DIR="${BACKUP_ROOT}/backup_${BACKUP_TIMESTAMP}"
echo -e "Backing up to ${BACKUP_DIR}" # debugging
# TODO: check BACKUP_DIR is writable, has sufficient freespace, etc
# ASSERT: all following are subdirs of BACKUP_DIR
ETC_BACKUP_DIR="${BACKUP_DIR}/etc" # backup /etc , typically not large
PKG_BACKUP_DIR="${BACKUP_DIR}/packages"
REPO_BACKUP_DIR="${BACKUP_DIR}/repos" # duplicates some of /etc, but disk is cheap ...
for DIR in \
"${ETC_BACKUP_DIR}" \
"${PKG_BACKUP_DIR}" \
"${REPO_BACKUP_DIR}" \
; do
# make the backup dirs
mkdir -p "${DIR}" # TODO: test retval/errorcode, exit on failure
done
PACKAGE_LIST_FILEPATH="${PKG_BACKUP_DIR}/${PACKAGE_LIST_FILENAME}"
touch "${PACKAGE_LIST_FILEPATH}" # TODO: check that it's writable, exit if not
REPO_KEYS_FILEPATH="${REPO_BACKUP_DIR}/${REPO_KEYS_FILENAME}"
touch "${REPO_KEYS_FILEPATH}" # TODO: check that it's writable, exit if not
## backup
## TODO: for all following: test retval/errorcode, exit on failure
## TODO: give user some progress indication (e.g., echo commands)
deborphan -a --no-show-section > "${PACKAGE_LIST_FILEPATH}" # or other op you prefer
sudo cp -R /etc/apt/sources.list* "${REPO_BACKUP_DIR}/"
sudo apt-key exportall > "${REPO_KEYS_FILEPATH}"
rsync --progress /etc "${ETC_BACKUP_DIR}"
bash
たとえば、次のコードを使用して復元できます。
## setup
## (remember to transfer constants used above)
RESTORE_DIR="set this equal to the BACKUP_DIR from which you are restoring!"
ETC_RESTORE_DIR="${RESTORE_DIR}/etc"
PKG_RESTORE_DIR="${RESTORE_DIR}/packages"
REPO_RESTORE_DIR="${PKG_RESTORE_DIR}/repos"
PACKAGE_LIST_FILEPATH="${PKG_RESTORE_DIR}/${PACKAGE_LIST_FILENAME}"
REPO_KEYS_FILEPATH="${REPO_RESTORE_DIR}/${REPO_KEYS_FILENAME}"
## restore
## TODO: test that all following are readable, exit if not
## TODO: for all following: test retval/errorcode, exit on failure
## TODO: give user some progress indication (e.g., echo commands)
rsync --progress "${ETC_BACKUP_DIR}" /etc
# following will overwrite some of /etc restored above
sudo apt-key add "${REPO_KEYS_FILEPATH}"
sudo cp -R "${REPO_RESTORE_DIR}/sources.list*" /etc/apt/
# TODO: CHECK THIS SYNTAX!
# see my question @ https://serverfault.com/questions/56848/install-the-same-debian-packages-on-another-system/61472#comment920243_61472
sudo xargs aptitude --schedule-only install < "${PACKAGE_LIST_FILEPATH}" ; aptitude install
したがって、IIUCでは、パッケージのバージョンを処理するために上記の内容を拡張する必要があります。次の戦略を使用することが可能です。
サポート
- パッケージリストファイルの代わりにパッケージマップファイルを作成します。ありがとうロバートLそしてカスこれで、Debianホストのパッケージマップファイルが便利な形式(1行に1つのパッケージ、各行に{パッケージ名(およびアーキテクチャ、しかし複数の場合のみ)、TAB、パッケージバージョン文字列}を含む)で取得できることがわかりましたです。その後、アクセスできますそれ。
- パッケージ名と
awk '{print $1}' < "${PACKAGE_LIST_FILEPATH}"
- パッケージバージョン
awk '{print $2}' < "${PACKAGE_LIST_FILEPATH}"
- パッケージ名と
- (追加クレジット)パッケージのオリジナル/現在のバージョンをアーカイブします
.deb
(例:カスロ表現)にパッケージ名を指定してdpkg-repack
。 - (追加クレジット)アーカイブされたパッケージをローカルAPTリポジトリに変換します。これは運用の詳細に記載されていることを願っています。この Debian Wiki ページしかし、私はまだこれを理解しようとしています。
また覆う
用語辞書:
*current
ホストの以前の状態を復元するユーザーの試みを示します。 *は、current PMF
現在ホスト用に生成されたパッケージマッピングファイルを表します。パックタプル(キー=パッケージ名、値=パッケージバージョン)が現在インストールされています。 *backup PMF
復元するパッケージタプルを含む古いホスト用に生成されたパッケージマッピングファイルを示します。
- 現在のPMFを作成します。
- 「一般的な手段」を介してリポジトリとキーを回復します(上記を参照)。
- バックアップPMFを読みます。
- 現在のPMFにはあるがバックアップPMFにはない各パッケージタプルの場合:パッケージを削除します(例
sudo aptitude remove [package_name]
:)。 - バックアップPMFの各パッケージタプルに対して、指定されたバージョンのパッケージをインストールします(例
sudo aptitude install [package_name]=[package_version]
:)。ありがとうレイF.リベイロそしてビッグベン8月aptitude
あなたの関心とapt-get
支援に感謝しますinstall package=version
。- (追加クレジット)復元されたストレージに必要なバージョンのパッケージが含まれていない場合は、バックアップローカルAPTストアからインストールしてください。
テスト
年!上記のようなバックアップがないボックスを手動で復元することから始めます(もちろん、まだ上記のようなバックアップがないため)。どのボックス :-) しかし私はコンソール噴出。
答え1
目標を達成するのに役立ついくつかの便利な注意:
次のコマンドを実行して、インストールされているパッケージとそのバージョンのリストをインポートできます。
dpkg-query -W
dpkg-repack
次のコマンドをインストールして実行して、現在インストールされているすべてのパッケージの.debパッケージアーカイブを作成できます。dpkg-query -W | awk '{print $1}' | xargs dpkg-repack
これは現在インストールされているすべてのパッケージです
dpkg-repack
。このアーカイブは、回復プロセスに欠けている重要な部分です。このアーカイブがないと、まったく同じパッケージセットを回復できない可能性があります(特にまたはtesting
を使用している場合unstable
)。警告:
dpkg-repack
すべてのコンテンツを現在のコンテンツに再パッケージ化する(修正された可能性があります)構成ファイル。元のパッケージが必要な場合は、/var/cache/apt/archives
Debianミラーから.debファイルを入手する必要があります。次のガイドラインに従って、.debアーカイブをapt-gettableリポジトリに変換できます。https://wiki.debian.org/HowToSetupADebianRepositoryまたは、すべてをインストールできます
dpkg -iBE *.deb
(またはdpkg -iRBE /path/to/deb/files/
1つのコマンドラインにインストールするには多すぎます)。削除されたパッケージなどの詳細を使用して
-get-selections
保存--set-selections
する必要があります。
答え2
一生懸命努力した後、いくつかの方法を組み合わせて、次のような方法を考えました。
インストールされているすべてのパッケージを正しいDebian名にスナップショットしてください。
dpkg --list | awk '/^ii/ { print $2,$3,$4 ;}'| tr ' ' '_'| tr '\t' '_'| sed 's/$/.deb/g'| sed 's|:amd64||g'| sort -u > dpkg_query_pkgs.txt
適切なキャッシュをクリーンアップし、インストールされているすべてのパッケージを再ダウンロードして、複数のバージョンがないことを確認してください。
apt-get clean; dpkg -l | grep "^ii"| awk ' {print $2} ' | xargs sudo apt-get -y install --reinstall --download-only
または、現在インストールされているバージョンを明示的に渡します。
apt-get clean; dpkg --list | awk '/^ii/ { print $2"="$3 ;}'| xargs sudo apt-get -y install --reinstall --download-only ;
アーカイブからインストールされたDebスナップショット
ls -1 /var/cache/apt/archives| grep deb|sed 's|\%3a|:|g' | sort -u > apt_archives_pkgs.txt
その後、インストールされたdebsとファイルを確認できます
diff -y apt_archives_pkgs.txt dpkg_query_pkgs.txt
これにより、dpkg --listから正しい名前をエクスポートできることをテストでき、その名前はaptキャッシュアーカイブの名前と一致します。
答え3
あなたはそれを使用することができますapt-clone
:
インストールする
sudo apt install apt-clone
インストールされているパッケージ名とバージョンへの参照のみを含む
apt-clone clone filename
小さなアーカイブを作成するには、実行してください。また、後で同じパッケージ構成を同じバージョンに復元するためのfilename.apt-clone.tar.gz
APTファイル、APTキーリング、およびその他の情報も提供されます。sources.list
ターゲットシステム(バックアップ目的で使用されている場合は同じシステムである可能性があります)で実行して
sudo apt-clone restore filename.apt-clone.tar.gz
システム状態を復元します。
追加のヒント:
パッケージが含まれています。Create Cloneを使用すると、レプリケーション
apt-clone clone --with-dpkg-repack filename
アーカイブには、パッケージアーカイブにはない手動でインストールされたパッケージの.debファイルと、パッケージアーカイブに引き続き使用できますが、インストールされたパッケージにはない.debファイルも含まれます。パッケージの .deb ファイルです。バージョン。これらの .deb ファイルはインストールされたファイルに再パッケージされるため、元の .deb ファイルを使用する必要はありません。「バージョンの不一致」。場合によっては
apt-clone clone
、一部のパッケージのバージョンの不一致に関する苦情がある場合があります。パッケージはまだレプリカに含まれており、まったく同じバージョンではありませんが、復元されます。私はこの問題を解決するかどうかを知りません。長期バックアップはありません。このツールは、レプリカとレプリカの復元の間の時間差が小さい場合(数時間から数週間)、最も便利です。システムを正確な状態に復元する場合は、長期システムのバックアップには適していません。これは
apt-clone
、パッケージ名とバージョンへの参照が使用され、一部のパッケージバージョンがパッケージアーカイブから消えたり、PPAパッケージアーカイブ全体が消えたりする可能性があるためです。文書。
apt-clone --help
利用可能な他のオプションに関する正確な情報を提供しますが、man apt-clone
少し古い情報です。