もっと詳しく

こんにちは、山田ハヤオです。Arch Linux大好き人間です。

みなさんはLinuxを使う時必ずと言ってもいいほどパッケージマネージャを使います。

パッケージマネージャとはAptやPacman、RPMのことで、OSごとに違いがあります。

それらのパッケージマネージャを使うことで、様々なソフトをコマンド1つでインストールできたり、依存関係を自動で解決してくれるなどとメリットは数多くあります。

最悪/usr以下を全部削除してもパッケージマネージャの機能を使えば復元することさえ可能です。

パッケージアーカイブと再パッケージ

さて、パッケージマネージャは名前のとおりファイルや情報の集合をパッケージで管理しています。そしてそのパッケージの実態は特定の形式にそったアーカイブファイルです。

AndroidのApkやUbuntuのDebなどもPCで圧縮ファイルとして解凍することができます。

しかし、パッケージファイルをインストールすることは簡単ですしパッケージマネージャの標準機能ですが、反対というのはなかなかありません。

つまり反対というのはインストールされているソフトからパッケージファイルのみを取り出すことです。

これを標準の機能でできるパッケージマネージャはAndroidしか知りません。(AndroidはApkファイルを簡単に取り出せますね。iPhoneも脱獄すれば可能です。)

今回はこれをArch LinuxのPacmanでやろうというお話です。

どうやってやるのか

PacmanやAptといったパッケージマネージャは、インストールされているパッケージやそのメタ情報を集めたデータベースを持っています。

これに直接アクセスしてデータを読み取り独自でインストール可能な圧縮ファイルを作成していきます。

運の良いことにPacmanのデータベースは(Dconfのような)バイナリではなく非常にシンプルなテキストファイルで構成されています。

このおかげでシェルスクリプトによるデータベースの解析がとても簡単になっています。

ということで今回はテキストの処理が得意なシェルスクリプトを使っていきます。

Pacmanのデータベースはどこにあるのか

Pacmanには、その設定を出力してくれる便利なコマンドが用意されています。

pacman-confコマンドを使ってまずはデータベースがどこに保存されているか確認します。

これでどこにデータベースがあるのかわかりました。

余談ですが、最近ターミナルエミュレータをXfce4-TerminalからKonsoleに切り替えました。

Xfce4でKDE系のツールを使うのはあまり好きではないのですが、画面分割やプロファイル機能など便利な機能がとても多く一目惚れしました。

データベースのディレクトリ構造

先程のディレクトリを調べてみるとlocalsyncという2つのディレクトリがありました。

そして中を見てみると、それぞれの内容がわかってきました。

まず、/var/lib/pacman/syncにはリモートリポジトリの情報が入っているようです。

このデータベースをyay -Syuで更新するんですね。

そして/var/lib/pacman/localには現在インストールされているパッケージの一覧が出てきました。

どうやら1つのパッケージが1つのディレクトリになっているようです。

ここで、ディレクトリ構造がわかりやすいtreeコマンドを使ってみます。

それぞれのディレクトリに入っているファイルの数と名前は一緒のようです。

つまりこれらのファイルを解析していけばそれぞれのバッケージの詳細にアクセスできそうです。

今回はみんな大好きGoogleChromeのパッケージのデータベースを見ていこうと思います。

中のファイルの種類

fileコマンドを使ってそれぞれのファイルの種類を確認してみます。

軽くコマンドの説明をすると、find ./ -mindepth 1で現在のディレクトリのファイルの一覧を出し、xargsコマンドを使って1行ずつfileコマンドを実行しています。

どうやらmtreeファイル以外は単純なテキストファイルのようです。

mtreeファイルだけはバイナリファイルですが、gzipなので簡単に展開できそうです。

descファイルの中身

ではまずはdescファイルから見ていきましょう。

ファイル名からして「Description」の略でパッケージの説明などだと思いますが…

lessコマンドの実行結果です。PKGBUILDで設定された変数などがここに書かれているようです。

セクションを%%で区切っていますね。なんとも珍しい構造…もっとjsonとかiniファイルを期待していたのに()

しかし思ったよりも中身は単純で解析のコードは書きやすそうです。

filesファイルの中身

先程のdescファイルと同じ形式で含まれているファイルの一覧を記してあるようです。

Pacmanフックの実行とかに使われるのでしょうかね…?

どちらにせよ再パッケージの際にはかなり役に立つファイルでしょう。

descファイルとfilesファイルは共通のコードで解析できそうですね。

installファイルの中身

PKGBUILDを書いたことがある人ならわかりますが、installファイルというのはパッケージの作成者が作成するシェルスクリプトの名前と一緒です。

やはりシェルスクリプトですね。

インストール後やインストール前、アップグレード前後や削除の前後でそれぞれ関数を実行できます。

一旦ここまで

データベースの構造がだいたい明らかになったところでここまでとします。

次回ではPacmanのパッケージファイルの方を解析していこうと思います。

③で変換のスクリプトとその仕組みについて話せたらなと思います。

それでは、また今度。(最近ハマってる某YouTuberのセリフをぱくってます)

The post pacmanの再パッケージのお話 その① first appeared on FascodeNetwork Blog.