作業の全体像
サーバーを新規に構築したとき、元のサーバーと同じパッケージ構成を再現したい場面があります。手作業でパッケージをひとつずつ調べてインストールするのは手間がかかる上、見落としが起きやすいです。
この記事では次の流れで作業を進めます。
- 元サーバーでインストール済みパッケージの一覧をファイルに書き出す
- そのファイルを新サーバーへ移送する
- 新サーバーで差分(足りないパッケージ)を確認する
- 不足しているパッケージをインストールして構成をそろえる
以下では Debian / Ubuntu 系(dpkg・apt)と RHEL / Rocky Linux / AlmaLinux 系(rpm・dnf)に分けて手順を示します。
元サーバーで一覧をファイルに書き出す
Debian / Ubuntu 系の場合
dpkg --get-selections コマンドでインストール済みパッケージとその状態(install / deinstall など)を一覧出力できます。元サーバー上で次のコマンドを実行してください。
dpkg --get-selections > ~/packages.txt
生成される packages.txt は「パッケージ名 ステータス」の2列形式です。依存関係で自動インストールされたものも含む全量が記録されます。
手動でインストールしたパッケージのみを対象にしたい場合は、apt-mark showmanual を使う方法もあります。
apt-mark showmanual | sort > ~/packages-manual.txt
依存パッケージは新サーバーのインストール時に自動で解決されるため、手動インストール分だけを控えておけば十分なケースも多いです。ただし後述の dpkg --set-selections による一括適用は dpkg --get-selections の出力形式と組み合わせて使う前提ですので、どちらの方法を使うかは作業前に決めておいてください。
RHEL / Rocky Linux / AlmaLinux 系の場合
rpm -qa でインストール済みパッケージ名を一覧取得し、ソート済みのファイルとして保存します。
rpm -qa --queryformat "%{NAME}\n" | sort > ~/packages.txt
後の差分比較で comm コマンドを使うため、ここでソートしておくことが重要です。
ファイルを新サーバーへ移送する
元サーバーから新サーバーへ scp でファイルを転送します。
scp ~/packages.txt user@new-server:/tmp/packages.txt
元サーバーから直接 SSH できない環境では、いったん手元の端末に scp でダウンロードしてから新サーバーへアップロードしてください。USB メモリや共有ストレージ経由でも構いません。
新サーバーで差分を確かめる
移送した一覧と新サーバーの現在の状態を比較して、足りないパッケージを洗い出します。comm コマンドはソート済みの2ファイルを受け取り、片方にしか存在しない行を抽出できます。
Debian / Ubuntu 系の場合
元の一覧から「install」ステータスのパッケージ名のみを取り出し、新サーバーの現在の状態と突き合わせます。
# install ステータスのパッケージ名のみ抽出してソート
awk '$2=="install"{print $1}' /tmp/packages.txt | sort > /tmp/pkg_source.txt
# 新サーバーの現在のインストール済みパッケージ名をソートして取得
dpkg --get-selections | awk '$2=="install"{print $1}' | sort > /tmp/pkg_dest.txt
# 元サーバーにあって新サーバーにないもの(差分)を表示
comm -23 /tmp/pkg_source.txt /tmp/pkg_dest.txt
出力されたパッケージ名が新サーバーに不足している一覧です。何も表示されなければ、少なくとも元サーバーのパッケージはすべて新サーバーにも入っていることになります。
RHEL 系の場合
# 新サーバーの現在のパッケージ名一覧を取得
rpm -qa --queryformat "%{NAME}\n" | sort > /tmp/pkg_dest.txt
# 差分を表示(元サーバーにあって新サーバーにないもの)
comm -23 /tmp/packages.txt /tmp/pkg_dest.txt
不足しているパッケージをインストールする
Debian / Ubuntu 系の場合
dpkg --set-selections と apt-get dselect-upgrade を組み合わせると、元の選択状態をそのまま新サーバーに適用できます。
sudo dpkg --set-selections < /tmp/packages.txt
sudo apt-get dselect-upgrade -y
dselect-upgrade は packages.txt の内容に従い、install とマークされたパッケージをインストールします。先ほどの差分確認で特定したパッケージだけを個別にインストールしたい場合は、comm の出力を xargs apt-get install に渡す方法が手軽です。
comm -23 /tmp/pkg_source.txt /tmp/pkg_dest.txt | xargs sudo apt-get install -y
RHEL 系の場合
差分ファイルをそのまま dnf install へ渡してインストールします。
comm -23 /tmp/packages.txt /tmp/pkg_dest.txt | xargs sudo dnf install -y
インストール後に再度 comm で差分を確認できます。何も出力されなければ構成のそろえ作業は完了です。
よくあるつまずきと対処
カーネルやハードウェア依存パッケージでエラーが出る
元サーバーのカーネルモジュールや特定ハードウェア向けのドライバーがリストに含まれていると、新サーバーのカーネルバージョンや機種が異なる場合にインストールに失敗することがあります。エラーログを確認し、問題のあるパッケージを一覧から除外してから再実行してください。
リポジトリが有効化されていない
元サーバーで有効にしていたサードパーティリポジトリ(EPEL や特定ベンダーのリポジトリなど)が新サーバーに設定されていない場合、該当パッケージが見つからずインストールに失敗します。dnf repolist や apt-cache policy でリポジトリの状態を確認してください。
OS のメジャーバージョンが異なる
元サーバーと新サーバーでディストリビューションのメジャーバージョンが違う場合、パッケージ名が変わっていたり、同名でもバージョンが存在しなかったりするケースがあります。一般的には、この場合は差分一覧を目視で確認し、必要なパッケージを個別に判断する必要があります。
comm の比較結果がおかしいcomm はファイルが辞書順にソートされていることを前提とします。書き出し時に sort を通していない場合は、比較前に次のコマンドでソートし直してください。
sort -o /tmp/packages.txt /tmp/packages.txt
大量のパッケージが差分として出る場合
元サーバーと新サーバーで OS のインストール方法(最小構成か、デスクトップ環境込みかなど)が大きく異なると、差分が数百件に上ることがあります。その場合はすべてを一括インストールするのではなく、差分一覧を絞り込んで必要なものだけを選んでインストールする方が安全です。
「コマンドは打てる。次は"現場で通用する型"を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
