Amazon EC2上のUbuntuでGentooのeix --selectedに相当する, 初期パッケージに含まれていない手動でインストールしたパッケージ一覧を表示する方法
需要と模索
プロダクション環境のUbuntu Serverでアプリケーションの構成の変化で不要になったパッケージを消滅させたくなりました.
EBS容量を20GB取っていないため, 一応容量を節約したいということと, 不要なパッケージは存在するとセキュリティ上の不安が高まる問題があるため, 削除したいですね.
apt-get
とapt-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-installed
でapt
でも抽出できるようですが,
これもシステムに元々入っていたパッケージを含めてしまいますね.
ここまで考えて,
野良アプリケーションとして自前のアプリケーションをビルドしてデプロイしているから問題なわけで,
何かaptの仕様に沿った形でパッケージとして提供すれば良いのではと思えてきました.
そしたら依存ライブラリが減ったときもapt autoremove
に任せることができます.
どうも方法は無いっぽいですね…
強引な手法を取らせてもらいます.
荒業
まずEC2向けのUbuntu Serverのインスタンスを建てます. nanoで良いです.
apt-mark showmanual
で初期パッケージを取得します.
これをコピーしてパッケージを削除したい対象サーバにテキストファイルinit-package
として保存.
cat <(apt-mark showmanual) init-package|sort|uniq -u
で初期パッケージになく,
手動でインストールしたパッケージを抽出.
AWSが秒課金になったから出来る荒業です.