続・玩式草子 ―戯れせんとや生まれけん―

第50回Plamo Linuxの遊び方[その1]

前回紹介したように、久しぶりのメジャーバージョンアップとなるPlamo-8.0/8.1を6月に公開しました。ご存知の方も多いと思いますが、Plamo Linuxの始まりは、こちらにも紹介されている、最古参のLinuxディストリビューションであるSlackware Linuxを日本語化するための追加パッケージ集でした。

Slackwareが生まれたころはソフトウェアの国際化が不十分で、たいていのソフトウェアは英語にしか対応しておらず、日本語を扱うには改造(パッチあて)してビルドし直すことが必要でした。それら日本語化パッチは国内ではいくつも開発されてはいたものの、ソフトウェアの開発元やSlackwareの公式パッケージに採用されるには至らず、いったん英語版をインストールしてから日本語化版で置き替える作業が必要で、その作業を簡単にしようと始めたのがPlamo Linuxの前身のPlagiawareでした。

Linux用の日本語版パッケージの作成は、当時豊橋技術科学大学におられた真鍋敬士さんの⁠JE(Japanese Environment)⁠プロジェクトの成果でした。

その後、日本語環境をより使いやすくするためにSlackwareからforkして、多くの人々の協力を得ながら独自のディストリビューションとして歩んで来ました。forkした当初はSlackwareのパッケージを日本語化版で置きかえたり、日本語環境に必要なソフトウェアを追加する程度でしたが、収録するソフトウェアの構成やシステムの起動方法、パッケージの作り方などに改造を加えていった結果、Slackwareとはかなり異なるディストリビューションになりました。

Plamo Linuxは、筆者を含めたメンテナが自分たちに使いやすいように開発を進めてきたので、初心者向けの体系だった解説記事等はありません。そこで8.0/8.1をリリースした機会に、興味を持っていただいた方の手掛かりになるよう、他のディストリビューションと異なるPlamo Linuxの特徴的な部分を紹介してみようと思います。

配布パッケージとパッケージ管理システム

「Linuxの配布パッケージ」というとRed Hat系が採用している"rpm"やDebian系が採用している"deb"が主流ですが、Plamo Linuxではそれらとは異なるtzstという形式を採用しています。この形式は、⁠インストールしたいファイルをtarで固めてzstdで圧縮した」だけのもので、"rpm"や"dpkg"といった専用ツールは必要なく、zstdやtarといった標準コマンドだけで操作できます。

もちろん、後述するようにパッケージをインストール/アンインストールするための専用ツールも用意しています。

さて、それでは実際にPlamo Linuxの配布パッケージを見てみましょう。例として、組み込み式データベースライブラリSQlite-3.39.4をPlamo Linux用にビルドしたsqlite-3.39.4-x86_64-B1.tzstというパッケージを用います。Plamo Linuxでは、パッケージ名は'-⁠ハイフン)'区切りの4つの部分から構成され、先頭(例では"sqlite")の部分をベース(base)⁠、以下、バージョン("3.39.4"⁠⁠、アーキ(arch)("x86_64"⁠⁠、ビルド番号("B1"⁠⁠」と呼んでいます。拡張子の"tzst"は"tar + zstd"を示し、以前はgzipで圧縮した"tgz"やxzで圧縮した"txz"を使っていました。

$ ls -l *tzst
-rw-rw-r-- 1 kojima users 1,389,814 10月 26日 2022年 sqlite-3.39.4-x86_64-B1.tzst

このファイルはtarをzstdで固めただけなので、"file"コマンドでは「zstdな圧縮ファイル」と報告され、zstdに対応したtarなら直接中身を確認できます。

$ file sqlite-3.39.4-x86_64-B1.tzst 
sqlite-3.39.4-x86_64-B1.tzst: Zstandard compressed data (v0.8+), Dictionary ID: None
$ tar tvf sqlite-3.39.4-x86_64-B1.tzst 
drwxr-xr-x root/root         0 2022-10-26 18:49:27 usr/
drwxr-xr-x root/root         0 2022-10-26 18:49:27 usr/lib/
drwxr-xr-x root/root         0 2022-10-26 18:49:27 usr/lib/pkgconfig/
-rw-r--r-- root/root       280 2022-10-26 18:49:27 usr/lib/pkgconfig/sqlite3.pc
...

「tarを圧縮ツールで固めたパッケージ」はSlackwareから受け継いでいる特徴で、最近のSlackwareでは高圧縮率を誇るxzで圧縮したtxz(tar+xz)形式を利用しています。一方、最近、人気が高まっているArch Linuxも配布パッケージはtarをzstdで圧縮したtar.zstdを用いているようです。

tzst形式はtarとzstdさえあれば手動で展開、インストールできますが、Plamo Linuxでもパッケージをインストール/アンインストールするためのコマンドは用意しています。それがinstallpkgremovepkgupdatepkgです。

installpkg

パッケージをインストールするにはinstallpkgコマンドを使います。"installpkg"は/usr/bin/等のシステム領域に書き込むためルート権限が必要で、rootユーザから実行するか"sudo"経由で実行する必要があります。

$ sudo installpkg sqlite-3.39.4-x86_64-B1.tzst 
[sudo] kojima のパスワード: ****
sqlite-3.39.4-x86_64-B1 のインストール中
PACKAGE DESCRIPTION:
sqlite-3.39.4-x86_64-B1 のインストールスクリプトを実行中

"installpkg"は、

  1. "/var/log/packages/<ベース名>"ファイルが存在するかをチェック(存在すればインストール済みとしてエラー終了)
  2. ルートディレクトリ(/)に移動してパッケージを展開
  3. パッケージの情報を"/var/log/packages/<ベース名>"に記録
  4. パッケージに添付されたインストールスクリプト(/install/doinst.sh)を実行

という処理を行います。

説明の都合上、sqlite-3.39.4-x86_64-B1.tzstをinstallpkgでインストールできたように示しましたが、本来このパッケージはPlamo-8.0/8.1のインストール時に自動的にインストールされるため、後述のようにいったんremovepkgで削除しておかないと、installpkgではインストールできません。

/var/log/packages/以下に記録されるパッケージ情報は平文のテキストファイルで、名前やサイズ、インストール元といった情報に加え、そのパッケージからインストールしたファイルの一覧が記録されています。Plamo Linuxではこの/var/log/packages/以下が、インストールしたパッケージのデータベースとなります。

$ head /var/log/packages/sqlite 
PACKAGE NAME:     sqlite-3.39.4-x86_64-B1
COMPRESSED PACKAGE SIZE:     1357 K
UNCOMPRESSED PACKAGE SIZE:     3540 K
PACKAGE LOCATION: sqlite-3.39.4-x86_64-B1.tzst
PACKAGE DESCRIPTION:
FILE LIST:
usr/
usr/lib/
usr/lib/pkgconfig/
usr/lib/pkgconfig/sqlite3.pc
...

updatepkg

さて、SQLiteのソースリポジトリを調べると3.42.0という新しいバージョンが公開されていたので、バージョンアップすることにしましょう。パッケージ作成方法については回を改めて紹介することにして、ここでは"sqlite-3.42.0-x86_64-B1.tzst"というパッケージが用意できたものとして話を進めます。

Plamo Linuxではパッケージの更新(バージョンアップ)にはupdatepkgコマンドを使います。"updatepkg"もシステム領域のファイルを操作するので、実行にはroot権限が必要です。

$ sudo updatepkg sqlite-3.42.0-x86_64-B1.tzst 
[sudo] kojima のパスワード:
removing sqlite-3.39.4

Removing package sqlite...
Removing files:
  --> Deleting symlink usr/lib/libsqlite3.so
  --> Deleting symlink usr/lib/libsqlite3.so.0
...
sqlite-3.42.0-x86_64-B1 のインストール中
PACKAGE DESCRIPTION:
sqlite-3.42.0-x86_64-B1 のインストールスクリプトを実行中

"updatepkg"は、更新したいパッケージと"/var/log/packages/<ベース名>"に記録されたインストール済みパッケージのバージョンやビルド番号を比較して、引数に指定したパッケージの方が新しい(バージョンが上)と判断すれば、古いパッケージを削除してから新しいパッケージをインストールします。

/var/log/packages/に該当するファイルが無ければそのままインストールします。

一方,インストール済みパッケージの方がバージョンが上だった場合,"updatepkg"はその旨を報告して終了します。たとえば、updatepkgで"sqlite-3.42.0-x86_64-B1.tzst"を再インストールしようとすると、このようなエラーになります。"old:1, new:1"と表示されているのは、バージョンが同じだったためビルド番号も比較したことを示します。

$ sudo updatepkg sqlite-3.42.0-x86_64-B1.tzst 
old:1, new:1
same or newer vesion(sqlite-3.42.0,B1) has been installed.
installation stopped for sqlite-3.42.0-x86_64-B1.tzst

"updatepkg"は,デフォルトではバージョンが上のパッケージにしか更新できないものの、バージョンチェックを飛ばして強制的に更新する"-f"オプションも用意しています。この機能はパッケージ中の一部ファイルを削除してしまって再インストールが必要になったり、新バージョンでは問題が生じて古いバージョンに戻さないといけない場合などに便利です。

$ sudo updatepkg sqlite-3.39.4-x86_64-B1.tzst 
same or newer vesion(sqlite-3.42.0) has been installed.
installation stopped for sqlite-3.39.4-x86_64-B1.tzst

$ sudo updatepkg -f sqlite-3.39.4-x86_64-B1.tzst 
Removing package sqlite...
Removing files:
  --> Deleting symlink usr/lib/libsqlite3.so
...
sqlite-3.39.4-x86_64-B1 のインストール中
PACKAGE DESCRIPTION:
sqlite-3.39.4-x86_64-B1 のインストールスクリプトを実行中

removepkg

パッケージを削除するにはremovepkgコマンドを使います。removepkgは/var/log/packages/<ベース名>に記録されている情報を使ってインストールしたファイルを削除するため、引数にはパッケージのベース名を指定します。

$ sudo removepkg sqlite
[sudo] kojima のパスワード:

Removing package sqlite...
Removing files:
  --> Deleting symlink usr/lib/libsqlite3.so
  --> Deleting symlink usr/lib/libsqlite3.so.0
...
--> Deleting empty directory usr/share/doc/sqlite-version-3.39.4

removepkgでパッケージを削除すると、/var/log/packages/以下の情報も削除されます。

$ ls /var/log/packages/sqlite
ls: '/var/log/packages/sqlite' にアクセスできません: そのようなファイルやディレクトリはありません

/var/log/packages/以下に記録が無ければ(=未インストール状態ならば⁠⁠、"installpkg"コマンドが使えます。

$ sudo installpkg sqlite-3.42.0-x86_64-B1.tzst 
[sudo] kojima のパスワード:
sqlite-3.42.0-x86_64-B1 のインストール中
PACKAGE DESCRIPTION:
sqlite-3.42.0-x86_64-B1 のインストールスクリプトを実行中

お気付きの方もいらっしゃると思いますが、元々のパッケージ管理ツールはSlackware由来の"installpkg"と"removepkg"で、"updatepkg"はバージョンチェックした上でこれらのコマンドを実行するラッパー(wrapper)になっています。


今回はPlamo Linuxのパッケージ管理ツールを紹介しました。最初に述べたように、Plamoのパッケージはtarをzstdで固めたシンプルな形式で、紹介した管理ツールもシェルスクリプトです。

installpkgとremovepkgはSlackwareが使っていたコードをPlamo用に改造し、updatepkgは「いちいちremovepkgしないとinstallpkgできないのは不便だから」と手元で書いた記憶があります。

installpkg/removepkgには、実行履歴を/var/log/install.logに記録する機能も追加しています。このファイルを見れば、いつごろどのパッケージをインストール/アンインストールしたかがわかります。

$ less /var/log/install.log
i Thu Jun  8 12:41:23 JST 2023: aaa_base-7.0-noarch-B3
i Thu Jun  8 12:41:23 JST 2023: bzip2-1.0.8-x86_64-B1
i Thu Jun  8 12:41:37 JST 2023: db-6.2.38-x86_64-B1
i Thu Jun  8 12:41:37 JST 2023: dcron-4.5-x86_64-B4
....
r Sat Aug  5 16:50:29 JST 2023: sqlite
i Sat Aug  5 16:50:45 JST 2023: sqlite-3.39.4-x86_64-B1
r Sat Aug  5 21:46:59 JST 2023: sqlite
i Sat Aug  5 21:47:05 JST 2023: sqlite-3.42.0-x86_64-B1

ファイルの各行がひとつのパッケージに対応し、先頭の"i"がインストール、"r"がアンインストールを示します。⁠しばらく前からシステムが不安定になった」ような場合、この履歴から原因を思いつくこともあるのでぜひご活用ください。

おすすめ記事

記事・ニュース一覧