MENU

インストール済みパッケージの一覧を控えて別のサーバーで同じ構成をそろえる手順

目次

作業の全体像

サーバーを新規に構築したとき、元のサーバーと同じパッケージ構成を再現したい場面があります。手作業でパッケージをひとつずつ調べてインストールするのは手間がかかる上、見落としが起きやすいです。

この記事では次の流れで作業を進めます。

  • 元サーバーでインストール済みパッケージの一覧をファイルに書き出す
  • そのファイルを新サーバーへ移送する
  • 新サーバーで差分(足りないパッケージ)を確認する
  • 不足しているパッケージをインストールして構成をそろえる

以下では 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日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次