気の向くままに辿るIT/ICT/IoT
システム開発

NetBSDパッケージ・ソフトウェアのアップデート

ホーム前へ次へ
NetBSDのインストールと運用/NetBSD/i386 6.1.x編

NetBSDパッケージ・ソフトウェアのアップデート

NetBSDパッケージ・ソフトウェアのアップデート

 NetBSDにおけるパッケージソフトウェアのアップデートについては、1つ1つ個別に行なう場合とインストール済みパッケージ全てを行なう場合において、それぞれ複数の方法があります。

(『アップデート』と『アップグレード』について)

パッケージを個別にアップデートする場合
pkg_add -uu
make update
make replace
インストール済みパッケージ全てを対象にアップデートする場合
pkgin upgrade(pkgin ug)
pkgin full-upgrade(pkgin fug)
pkg_rolling-replace -u
pkg_chk([-u]、[-a]、[-s](、[-P])オプションを個別 or 併用)
...etc.

 これらには、もう1つの視点として任意のリポジトリ上のバイナリパッケージを元にアップデートする方法とローカルに展開したpkgsrcに収録されたソース情報を元にアップデートする方法、場合によっては、併用する方法などがあります。

 より具体的には、pkg_addとpkginは、バイナリパッケージを元に、pkg_rolling-replaceは、ローカルに展開したpkgsrcに収録されたソース情報を元に、pkg_chkは、ソース、バイナリ個別、もしくは併用によるアップデートが可能となっています。

 更にNetBSDマシンが、複数台、特に同じ構成のマシンがある場合、バイナリにしてもソース情報を元にするにしてもインターネットを介して個々にアップデートするのは、時間の浪費ですが、NetBSD(やOpenBSD/FreeBSD/Gentoo)には、効率的な良い方法があります。

 それは、より高速なマシン1台をアップデートし、そのバイナリを元にSambaやNFS経由で他のマシンのアップデートを実行することです。

 構成が異なる場合、その度合いによっては不完全となる可能性もあるものの、必要なパッケージを全て洗い出しさえすれば、pkg_chk -g(やpkg_chk、pkg_rolling-replace)の実行によって生成されるpkgchk.confといくつかの環境変数を設定することで必要なバイナリを生成、それを元に他のマシンはローカルでアップデートをすることもできるでしょう。

pkg_add -uu

 pkg_add -uuによるアップデートの場合、予めログインシェルに応じた~/.profileなどの構成ファイルにPKG_PATHを適切に設定しておくことでリポジトリ上のバイナリを元に更新することができます。

make update/make replace

 make update、もしくは、make replaceによるアップデートの場合、予めpkgsrcを展開(慣例では/usr/pkgsrc)しておき、以下のCategory/Package_nameパスに移動、PKG_PATHが有効な場合には、unsetしてからmake updateやmake replaceを実行することでソースコード情報を元に更新することができます。

 make updateとmake replaceの違いは、前者が依存関係を含めてアップデートするのに対し、後者は依存関係を考慮せず、当該パッケージのみを強制的に置き換える(アンインストールして再インストールする)ことで加えて前者については、当該パッケージがインストールされていない場合、インストールします。

pkgin upgrade/pkgin ug

 pkgin upgrade/pkgin ugによるアップデートの場合、予め/usr/pkg/etc/pkgin/repositories.confなどの構成ファイルにバイナリのリポジトリを設定しておき、実行するだけでバイナリのリポジトリに、より最新のものがあれば"non autoremovable"としてマークされているインストール済みパッケージ全てを自動的にアップデートしますが、インストール済みパッケージの依存関係上、必要なものとしてリストされているものはアップデートしません。(イマイチ自身なし、原文参照。)

upgrade

Upgrade keepable packages to their newer versions present in the repository. If the installed dependencies match the listed needed dependencies, don't upgrade them. For a complete packages upgrade, full-upgrade shall be used.

pkgin full-upgrade/pkgin fug

 pkgin full-upgrade/pkgin fugによるアップデートの場合、予め/usr/pkg/etc/pkgin/repositories.confなどの構成ファイルにバイナリのリポジトリを設定しておき、実行するとバイナリのリポジトリに、より最新のパッケージが存在する全てのインストール済みパッケージを自動的にアップデートします。

pkg_rolling-replace -u

 pkg_rolling-replaceは、make replaceを元にしたスクリプトでpkg_rolling-replace -uによるアップデートは、pkgchk.conf(例:/usr/pkgsrc/pkgchk.conf)にインストール済みパッケージ情報を保存後、全てのパッケージをアンインストール、先のpkgchk.conf情報からソースコード情報を元に改めてインストールしなおすことでアップデートを行ないます。

pkg_chk

 pkg_chkによるアップデートは、状況に応じたオプション付きで実行、pkgchk.conf(例:/usr/pkgsrc/pkgchk.conf)にインストール済みパッケージ情報を保存後、これを元に依存関係を考慮しつつ、パッケージを1つずつ順次アップデートをしていきます。

 詳細はmanに譲りますが、バイナリを元にするか、ソースコード情報を元にするか、併用するかについては、それぞれ付与するオプションによります。

 pkg_chk -qu(-q -u)とすると更新が必要なインストール済みパッケージ一覧が標準出力に表示されます。

 pkg_chk -gとすると更新が必要なインストール済みパッケージ一覧がpkgchk.conf(慣例では/usr/pkgsrc/pkgchk.conf)に出力されます。

 pkg_chkにおいて-u(=update)オプションは、アップデート用、-b(=binary)オプションはバイナリ、-s(=source)オプションはソースコード用、-a(=addition)は併用するオプションに応じて不足するパッケージを補完・追加インストールする為のオプションです。

 -uオプションを単独で指定するとPKG_PATHに設定されたリポジトリ上のバイナリを元にアップデート、不足するものをpkgsrcを元にインストール・アップデートします。

 -uと-bオプションを併用するとデフォルトではPKG_PATHに設定されたリポジトリ上のバイナリのみを元にアップデートします。

 -sオプションを単独で指定、もしくは、-uオプションと併用するとデフォルトではPACKAGESに設定されたソース情報(デフォルト/usr/pkgsrc)を元にアップデートします。

 -bと-aオプションを併用するとデフォルトではPKG_PATHに設定されたリポジトリ上のバイナリのみを元に不足するパッケージを追加インストールします(が、一時的に必要になるパッケージなどもあり、全てのバイナリが必ず生成されるとは限らないため、実用上は、下記の-Pオプションを使って明示的に全てのパッケージを生成すべく指定の上、予めローカルに生成しておいたパッケージ群のバスをリポジトリとして指定することになるでしょう)。

 -sと-aオプションを併用するとデフォルトではPACKAGESに設定されたソース情報(デフォルト/usr/pkgsrc)のみを元に不足するパッケージを追加インストールします。

 何れのケースも-Pオプションとの併用で元になるリポジトリを、-Cオプションとの併用でアップデート対象のパッケージリストを指定することができます。

 実質、-sと-aオプションを併用するとソース情報を元に全てのインストール済みパッケージをアップデートすることができます。

 尚、-nオプションを併用すれば、実際にはシステムに何の変更も行わず、標準出力で経過を確認することができます。

pkg_rolling-replaceとpkg_chk

 尚、ソースベースでのアップデートを前提とした場合、依存関係を無視してmake replaceを繰り返すpkg_rolling-replaceは、依存関係を考慮して順次アップデートしていくpkg_chkよりも往々にして高速で比較的短時間で完了する一方、依存関係を一切考慮しないため、場合によっては、依存関係が壊れる可能性というリスクもあります。

 ちなみにpkg_rolling-replaceとpkg_chkについては、別途、適宜、環境変数を設定することでアップデート(や補完インストール)に加え、通常は生成されないパッケージをも生成することができます。

 これは、NetBSDマシンが複数台ある場合、他のマシンをバイナリベースで更新したい場合などに有効となる可能性があります。

ソースコードをベースにしつつ最も安全なアップデート

 よって現時点でNetBSDにおいて最も安全にソースコードのコンパイル、ビルドにより、アップデートを行なう(のに加え、自ホストで後で使うとか、他のマシンをバイナリでアップデートできるようにする)方法は、pkg comp pkg chkにあるようにpkg_compでchroot環境を作り、pkg_chk -uanと実際には何もしないnオプション付きでエラーなく完了できることを確認の上、DEPENDS_TARGETやUPDATE_TARGETなど依存関係を含め、バイナリの生成、パッケージのインストールをするように設定しておき、改めてpkg_chk ua、chroot環境に全てのバイナリが生成されるので、これを使って今度は、全てのバイナリをインストールすべく、pkg_chk uabとすることのようです。

 もちろん、この場合、pkg_chk -uanの結果が、芳しくない場合には、調整が必要となります。

NetBSDにおける『アップデート』と『アップグレード』

 モジュール化されたLinuxカーネルは微妙ですが、Linux/PC-UNIX/*BSDにおいては、概ね、『カーネル』の更新は『アップグレード』、『パッケージ・ソフトウェア』の更新は『アップデート』と認識されているような気がしますし、WindowsやMac OS X/OS Xは『カーネル』は内包され、付与された『バージョン名』が変わるものの、こうした場合、何れも『アップグレード』、『セキュリティパッチ』などの更新は『アップデート』と一般的に認識されているものだと思っていました。

 少なくとも個人的には、何を疑う余地なく、そういうイメージがあったのですが、改めてネット検索をしてみると、こうした概念で統一されているわけでもなさそうに見えてきました。

 NetBSDは、まさにその点が微妙でコマンドで見るとsysinst(NetBSDのインストーラ)のカーネル更新メニューは[b:Upgrade NetBSD on a hard disk]であり、システム稼働中にカーネルを更新するコマンドはsysupgrade、ローカルに展開したpkgsrcで個々のパッケージを更新するコマンドの1つは、make updateである一方、のちにできたpkginでは、データベースの更新をupdateとしていることもあってパッケージソフトウェアの更新はupgrade、full-upgradeとなっています。

 また、このページの冒頭のリンク先のNetBSD Wikiでは、パッケージの更新に関するページのタイトルが『how to upgrade packages』となっていますし、他のページでもカーネルやパッケージに関わらず、updateとupgradeが混在しているようです。

 尤もカーネルをソフトウェアと見れば、アップデートでも、他方、パッケージソフトウェアに注目すれば、少なくともメジャーバージョンアップは、アップグレードでも違和感はないわけで便宜上、明確だとわかりやすくていいかも?というレベルの話であるという域を越えない答えのなさそうな話であることに今更ながら気づきました。

ホーム前へ次へ