Ubuntu での PPA-Purge:PPA を削除してパッケージを安全に元バージョンへダウングレードする方法

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

5分でできる:ppa-purge のクイックスタート

Ubuntu に PPA を追加していて、それに関連するすべてのパッケージごと削除したい場合、最も手っ取り早い方法はこちらです:

# ステップ 1:ppa-purge をインストール
sudo apt install ppa-purge

# ステップ 2:PPA を削除してパッケージを Ubuntu 公式バージョンへダウングレード
sudo ppa-purge ppa:作者名/ppa名

# 実例:ondrej の Nginx mainline PPA を削除
sudo ppa-purge ppa:ondrej/nginx

それだけです。ppa-purge は自動的に PPA を sources.list から削除し、その PPA からインストールされたすべてのパッケージを Ubuntu の公式バージョンへダウングレードします — 手動での追加作業は一切不要です。

なぜ ppa-purge が必要なのか?手動削除の何が問題なのか?

私は20台以上の VPS に Ubuntu Server 22.04 をインストールしてきましたが、PPA を整理する際には必ずこの手順を最初に使います — add-apt-repository --remove で手動削除するのではなく。

add-apt-repository --remove は仕事の半分しかこなしていません:

  • PPA を sources.list から削除しても、インストール済みのパッケージが自動的にダウングレードされるわけではない
  • PPA のパッケージは通常バージョンが高く、PPA を削除してもマシン上にそのまま残り続ける
  • 後で Ubuntu をアップグレードする際、公式リポジトリとバージョンが合わず dependency の競合が発生する
  • どの PPA からどのパッケージをインストールしたか覚えておくのが難しく、特に数ヶ月後には

具体的な例でイメージしやすく

PHP 8.2 をインストールするために ondrej/php の PPA を追加し、その後 Ubuntu 22.04 のデフォルト(8.1)に戻したいとします。PPA を削除するだけで ppa-purge を使わないと、PHP 8.2 はそのままシステムに残ります。Ubuntu は自動的にダウングレードせず、後の apt upgrade で broken packages のエラーが出ることがあります。

ppa-purge の内部動作:自動で行われる 3 つのステップ

実は ppa-purge はそれほど複雑ではありません — 順番に 3 つのことをするだけです:

  1. PPA の無効化:sources.list.d の PPA 行をコメントアウト(復元しやすいようにファイル自体は削除しない)
  2. PPA 由来のパッケージを特定:インストール済みのバージョンと Ubuntu 公式リポジトリのバージョンを比較
  3. 自動ダウングレード:関連する各パッケージに対して Ubuntu リポジトリのバージョンで apt install を実行

実行後、sources.list.d 内の .list ファイルを確認すると、内容がコメントアウトされているのがわかります:

# ppa-purge 実行後の結果を確認
cat /etc/apt/sources.list.d/ondrej-ubuntu-nginx-jammy.list

# 出力:
# deb https://ppa.launchpadcontent.net/ondrej/nginx/ubuntu/ jammy main
# deb-src https://ppa.launchpadcontent.net/ondrej/nginx/ubuntu/ jammy main

よくある実際のシナリオ

シナリオ 1:PHP の PPA を削除する

# 現在の PPA を確認
ls /etc/apt/sources.list.d/

# ondrej/php の PPA を削除して PHP を Ubuntu バージョンへダウングレード
sudo ppa-purge ppa:ondrej/php

シナリオ 2:PPA の正確な名前を覚えていない場合

PPA の名前を覚えていない場合は、次のコマンドで調べられます:

# マシン上のすべての PPA を一覧表示
grep -r "^deb " /etc/apt/sources.list.d/ | grep ppa.launchpad

# またはパッケージのインストール元を確認
apt-cache policy nginx | grep -i ppa

シナリオ 3:ppa-purge が「no alternative」エラーを報告する場合

Ubuntu の公式リポジトリにそのパッケージのバージョンがない場合、ppa-purge はパッケージを完全に削除するか尋ねます。対処法は 2 つあります:

# 方法 1:不要なパッケージをそのまま削除 — 確認メッセージに承認
sudo ppa-purge ppa:作者名/ppa名

# 方法 2:apt-mark hold で現在のバージョンを保持
sudo apt-mark hold パッケージ名
sudo ppa-purge ppa:作者名/ppa名
# hold されたパッケージはダウングレードも削除もされない
# 必要に応じて完了後に hold を解除
sudo apt-mark unhold パッケージ名

応用編:サーバー上の PPA を完全に管理する

どのパッケージが PPA 由来かを確認する

# パッケージの出所を確認するために apt-show-versions をインストール
sudo apt install apt-show-versions

# Ubuntu 公式以外のパッケージを確認
apt-show-versions | grep -v "Ubuntu"

# 特定のパッケージのバージョンを確認
apt-show-versions nginx

実行前にシミュレーションする

ppa-purge-s フラグをサポートしており、実際にダウングレードせずに影響を受けるパッケージの一覧を事前確認できます:

# ダウングレードされるパッケージを事前確認
sudo ppa-purge -s ppa:作者名/ppa名

purge 後に完全クリーンアップする

デフォルトでは ppa-purge は PPA ファイルをコメントアウトするだけで削除しません。完全にクリーンにしたい場合:

# ppa-purge 後、残った PPA ファイルを削除
sudo rm /etc/apt/sources.list.d/ondrej-ubuntu-nginx-jammy.list
sudo rm -f /etc/apt/sources.list.d/ondrej-ubuntu-nginx-jammy.list.save
sudo apt update

経験から学んだ実践的な Tips

以前、バックアップなしで本番環境の MariaDB PPA を削除したことがあります — 10.11 から 10.6 へのダウングレードで一部のデータファイルが互換性を失い、リストアが必要になりました。午後が丸々潰れました。教訓:データベースエンジンや Web サーバーのような重要なものを提供している PPA を扱う場合は、コマンドを実行する前に必ず VM のスナップショットを取りましょう。

ppa-purge が完了したら、そこで止まらずに後片付けも済ませましょう:

sudo apt update
sudo apt upgrade
sudo apt autoremove
sudo apt autoclean

ダウングレード後にサービスがまだ動いているか?推測せず、すぐ確認しましょう:

# ダウングレード後のバージョンを確認
dpkg -l | grep -E "nginx|php|mariadb"

# サービスがまだ動作しているか確認
sudo systemctl status nginx
sudo systemctl status php8.1-fpm

デスクトップアプリや開発ツールは気軽に直接テストできます。しかしサーバーソフトウェアは話が違います — 本番環境でのダウングレードを一度誤ると、リカバリーに数時間かかることもあります。容赦なくステージング環境で先にテストしてください。

デバッグ時間を大幅に節約する小さな習慣:新しい PPA を追加する前に、理由と依存するパッケージをメモしておきましょう。シンプルな /root/notes/ppa-list.txt ファイルで十分です — 3 ヶ月後に自分自身に感謝することを保証します。

ppa-purge はひとつのことをきちんとこなします:PPA を削除した後、パッケージをディストリビューションの正しいバージョンへ戻すことです。add-apt-repository --remove のように宙に浮いたバージョンを残しません。開発環境やステージングでは気軽に使えます — 本番環境ではバックアップを先に取りましょう

Share: