• 作成:

Amazon EC2上のUbuntuでGentooのeix --selectedに相当する, 初期パッケージに含まれていない手動でインストールしたパッケージ一覧を表示する方法

需要と模索

プロダクション環境のUbuntu Serverでアプリケーションの構成の変化で不要になったパッケージを消滅させたくなりました.

EBS容量を20GB取っていないため, 一応容量を節約したいということと, 不要なパッケージは存在するとセキュリティ上の不安が高まる問題があるため, 削除したいですね.

apt-getapt-cacheは今のUbuntuでは標準ではなく, 全てaptコマンドに統一されました.

他のライブラリに依存されているパッケージはapt autoremoveで消滅しますが, 自分が明示的に入れたパッケージはこれでは消滅しません. 当たり前ですね. 消えたらむしろ困ります.

apt - Ubuntu入門によると, インストールされているパッケージの一覧を表示するにはapt list --installedを使えば良いそうです. しかし, 私が求めているのはそういうことではなく, Gentooでのeix --worldのように明示的にインストールしたパッケージを出したいんですよね. 後, 元々インストールされていたGentooで言うSystemに相当するパッケージを消すつもりはないので, これは表示されないほうが良いです. Gentooで言うとeix --selectedですね.

多分dpkg関連のコマンドを直接触れば出来ると思いますし. 昔Ubuntuを使っていた時はそうしていた記憶があるのですが, せっかくaptにコマンドが集中したのですから, 新しい方法を使いたいですね.

しかし, aptのマニュアルとか見ててもそういうのはないことがわかってきました. dpkg-queryなどにそういう機能がないか調べてみます.

ap-markを使う方式ならインストールしたパッケージ一覧を出せるみたいですね. しかし, comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)は古い形式なのか, gzip: /var/log/installer/initial-status.gz: No such file or directoryと言われてしまい, 元からインストールされていたものも含まれてしまいます. apt - Generating list of manually installed packages and querying individual packages - Ask Ubuntu

dpkg --get-selections | grep -v deinstalでも抽出出来るらしいですが, これもプレインストールされているパッケージを出してしまいます. apt - How to find manually installed packages? - Ask Ubuntu

Gentooだとそもそもインストール直後は最小主義なのでworldファイルを直接編集してもそんなに困りませんし, そもそもeix --selectedがあるので問題ないのですが. Ubuntuはインストール直後から色々入っているから困りものですね.

apt --manual-installedaptでも抽出できるようですが, これもシステムに元々入っていたパッケージを含めてしまいますね.

ここまで考えて, 野良アプリケーションとして自前のアプリケーションをビルドしてデプロイしているから問題なわけで, 何かaptの仕様に沿った形でパッケージとして提供すれば良いのではと思えてきました. そしたら依存ライブラリが減ったときもapt autoremoveに任せることができます.

どうも方法は無いっぽいですね…

強引な手法を取らせてもらいます.

荒業

まずEC2向けのUbuntu Serverのインスタンスを建てます. nanoで良いです.

apt-mark showmanualで初期パッケージを取得します. これをコピーしてパッケージを削除したい対象サーバにテキストファイルinit-packageとして保存.

cat <(apt-mark showmanual) init-package|sort|uniq -uで初期パッケージになく, 手動でインストールしたパッケージを抽出.

AWSが秒課金になったから出来る荒業です.