すべてのパッケージを保存して復元
Debian/Ubuntu ベースのシステムでは、インストール済みパッケージのリストをファイルにダンプできます
dpkg --get-selections > my_package_list.txt
実行して再度インストールします
apt-cache dumpavail | sudo dpkg --merge-avail
sudo dpkg --set-selections < my_package_list.txt
sudo apt-get dselect-upgrade
最初の行は dpkg
を保証します のデータベースは最新です (現在、ほとんどの人が apt
を使用しています) 独自のデータベースを維持するパッケージをインストールするには)、2 行目で保存した選択内容をインポートし、3 番目のコマンドで選択したパッケージをインストールします。詳細については、Debian 管理者ハンドブックを参照してください。
サードパーティのリポジトリからパッケージをインストールした場合は、上記の復元手順に従う前に、これらのリポジトリを追加する必要があります。
明示的にインストールされたパッケージのみを保存および復元
Aptitude は依存関係を自動的にインストールします (例:アプリケーションに必要なライブラリ)。これらのパッケージには「自動」のフラグが付けられ、不要になった時点で自動的に削除されます。これらの「自動」フラグを保持したい場合は、 dpkg
を使用できません 自動的にインストールされたパッケージを追跡しないためです。代わりに、もう少し不可解なものを使用する必要があります
LC_ALL=C aptitude search -F '%p %C' '~i!~M' > my_package_list.txt
これにより、インストールされているすべてのパッケージが検索されます (~i
) ではなく (!
) ) 自動フラグ付き (~M
)。一致する各パッケージのパッケージ名 (%p
) とステータス (%C
) が出力されます (これは dpkg --get-selections
の出力を模倣しています) )。 LC_ALL=C
すべての出力が母国語に翻訳されることなく英語で行われることを保証します。上記のコマンドを使用して、このリストからパッケージをインストールします。詳細については、aptitude のユーザー マニュアルを参照してください。
<ブロック引用>
Ansible は、オープンソースのソフトウェア プロビジョニング、構成管理、およびアプリケーション展開ツールです。多くの Unix ライクなシステムで実行され、Unix ライクなシステムと Microsoft Windows の両方を構成できます。システム構成を記述する独自の宣言型言語が含まれています
(ウィキペディアより。) ホームページ (Github).
同じカテゴリに他にもいくつかあります。 ansible について読むと、必要に応じて他のものを検索し、比較するための語彙が得られるはずです。 Nixは新しい候補です。 「もっと複雑ですが、ちょうどいいかもしれません」と言う人もいます。シェフも現場にいます。
ホスト名 myhost
の Ansible の例 、モジュール apt
(yum
に置き換えます または何でも):
ansible -K -i myhost, -m apt -a "name=tcpdump,tmux state=present" --become myhost
リスト "tcpdump,tmux" はコンマで拡張できます。 (事実、ホスト名 myhost
固定のホスト インベントリ リストを使用しているのではなく、末尾にコンマが付いたアドホック リストを使用しているため、コマンド ラインで が 2 回使用されます。)
これは表面をなぞっただけで、Ansible には豊富なモジュール コレクションがあります。
たくさんのパッケージをインストールしたいだけなら、単純なワンライナーで次のようにできます:
sudo bash -c 'for package in "tmux" "htop" "gimp"; do apt install -y --no-upgrade "$package"; done'
ループは厳密には必要ではありませんが、ループがないと、apt がリスト内のプログラムを見つけられない場合、他のパッケージのインストールに失敗します。これは、たとえば、ディストリビューションの最新バージョンに切り替えて、古いパッケージがリポジトリ内になくなった場合に発生する可能性があります。オール オア ナッシングを希望する場合は、
を使用します。sudo apt install -y --no-upgrade tmux htop gimp
構成も保存したい場合、検索用語は「dotfiles」になります。ほとんどの場合「.」で始まるため、Unix ライクなシステムの構成はこのように呼ばれます。
それらを保存する手っ取り早い汚い方法は、これらすべての構成ディレクトリを新しいシステムにコピーすることです。より良い方法は、git などのツールを使用してバージョン管理下に置くことです。システムのセットアップには、git、dotbot、および手書きのスクリプトを組み合わせて使用します。
更新
これまでの議論で欠けている点の 1 つは、apt
です。 通常、最低限必要な機能以上のものに必要なパッケージ管理システムは 1 つだけではありません。他のパッケージ管理ツールは snap
かもしれません。 、 pip
、 conda
、 cargo
これは、Alex Stragies による回答で暗黙のうちに対処されています。 Ansible
apt
以外のパッケージを管理するためのモジュールを含む膨大な量のモジュールが含まれています snap
のように と pip
.私の答えは write-your-own-script に焦点を当てているので、それを拡張したいと思います.Ansible
などのよくテストされたフレームワーク 通常、ほとんどのタスクで好まれるはずですが、柔軟性という点では、自分で書いたコードの方が有利だと思います.
小さなサンプル フレームワーク
そのようなフレームワークがどのように見えるかを例示する小さなコードを python で書きました。
#!/usr/bin/env python3
import os
import re
import sys
import subprocess
def read_package_list(path):
package_list=[]
try:
with open(os.path.realpath(path)) as f:
for line in f:
match = re.search(r'^(?!\s*$)(?!#)\w+',line)
if match:
package_list.append(match.group(0))
return package_list
except Exception as e:
print(e.message)
print(e.args)
sys.exit(1)
return package_list
def install_packages(command,package_list,err_log):
try:
with open(err_log,'w+') as f:
for p in package_list:
print('executing '+command+' '+str(p))
out=subprocess.run(command+' '+p,shell=True,stderr=f)
except Exception as e:
print(e.message)
print(e.args)
sys.exit(1)
def main():
args = sys.argv[1:]
package_list = read_package_list(args[1])
err_log=os.path.realpath(args[2])
install_packages(args[0],package_list,err_log)
if __name__ == '__main__':
main()
基本的な構成要素は、改行 (read_package_list
) で区切られたパッケージのリストを処理する関数です。 ) と、シェルでインストーラー コマンドを実行する関数 (install_packages
) ).空白のみの行と #
で始まる行 パッケージリストを読み込むときは無視されます。main
コマンドラインで installer command
として指定できる引数を処理します 、 packagefile
、 errorlog
.
それは私に何をもたらしますか?
好きなインストーラ コマンドを使用できます
./installerscript.py 'apt install --dry-run' myaptpackages.txt apt_err.log
./installerscript.py 'snap install' mysnaps.txt snap_err.log
./installerscript.py 'pip install --user' mypy.txt py_err.log
./installerscript.py 'git clone' repos.txt git_err.log
これは、すべて同じ方法で処理する必要があるパッケージのリストを保持している場合に役立つ場合があります。このようなフレームワークが存在すると、それを改善するのは簡単です。たとえば、インストール プロセスがログに記録される方法をカスタマイズしたり、カスタマイズしたりできます。コマンド ライン引数の処理。もう 1 つの側面は、スクリプトが現在のように各コマンドをルートとして (ルートとして実行する場合) 実行するべきではないということです。