はじめに
この文書はNetBSD Advent Calendar 2017の19日目の記事として書かれました。
pkgsrcでパッケージをアップデートする時に、pkg_rolling-replaceを使ってみよーという記事です。(そのまんま。)
なお、以下に書かれていることは全てpkg_rolling-replaceのmanに記載があります。この記事は、試してみた、という以上の内容はありません。さらに詳しい情報が知りたい場合は、man読んで下さい。
pkg_rolling-replaceって?
最近は、バイナリーパッケージをpkginで使っている人も増えてきたかもしれません。しかし、pkginに慣れなかったり、公式のバイナリーパッケージに適用されている各種オプションが自分と合わなかったり、昔からずっとpkgsrcを使っている等の理由で、pkgsrcを使っている人もまだまだ多いと思います。
pkg_rolling-replaceは、pkgsrc/pkgtools/pkg_rolling-replaceにあるツールです。2006年12月に登場しました。commit logには
pkg_rolling-replace does 'make replace' on one package at a time, tsorting the packages being replaced according to their interdependencies, which avoids most duplicate rebuilds.
とあります。
似たようなアイディアは以前からあったのでしょうけれども、2005年5月にtech-pkgメーリングリストで流れた『Smarter make update / pkg_chk algo』などが良い例だと思います。(これに投稿されたスクリプトを少しだけいじって、使ってみたりしていました。)
pkg_rolling-replaceが登場してからは、アップデートはこれに任せることが多くなりました。
使い方
前提
pkgsrcを使える環境であることです。pkgsrc自体をアップデートしていないと、パッケージもアップデートされないので、注意が必要です。
あるパッケージをアップデートしたい
大抵の場合は、特定のパッケージをアップデートしたいんだけど、make updateしちゃうとひどい目にあうので、対象のパッケージと、依存関係を持つパッケージだけ、make replaceしたくなります。それができます。
まず、アップデートしたいパッケージにマークをつけます。今回は、security/ruby-oauthパッケージを対象にすることにします。パッケージ名を確認します。
% pkg_info | grep oauth ruby23-oauth-0.5.1 OAuth Core Ruby implementation
ruby23-oauthだとわかったので、これをマークします。(複数あるときは、複数マークして下さい。)
pkg_admin set rebuild=YES ruby23-oauth
もし、間違えてマークしまった時は、
pkg_admin set rebuild='' ruby23-oauth
とすればよいです。
あとは、pkg_rolling-replaceを実行するだけです。
pkg_rolling-replace -rsv
-rをつけると、バイナリーパッケージを作成して保存しません。自動的に行われるアップデート作業の中で、バイナリーパッケージは作成されているので、それをとっておきたい場合は、-rをはずして下さい。
-sはstrict modeを有効にします。これをつけていないと、依存関係をもつソフトウェアの更新がされず、結果的に更新対象のソフトが更新後動作しないことがあるので、悩みたくない人は、有効にしておいた方がよいです。
-vはおさっしのとおり、コマンドの作業途中の出力がより冗長になります。自分はどこまで作業が進んだかみたいので、いつもつけています。
全てのパッケージをアップデートしたい
ひとつだけ、じゃなくて、全てのパッケージをアップデートしたい時は、-uオプションをつけます。つまり、
pkg_rolling-replace -rsuv
で、現在インストールしているパッケージが、全てアップデートされます。
QA
途中で止まっちゃうんだけど
たとえば、以下のような感じで止まっちゃうとします。
<snip> => Checking for work-directory references in ruby23-base-2.3.6 => Creating binary package /usr/pkgsrc/lang/ruby23-base/work.x86_64/.packages/ruby23-base-2.3.6.tgz ===> Building binary package for ruby23-base-2.3.6 => Creating binary package /usr/packages/x86_64/All/ruby23-base-2.3.6.tgz ===> Installing binary package of ruby23-base-2.3.6 pkg_add: A different version of ruby23-base-2.3.6 is already installed: ruby23-base-2.3.5 pkg_add: 1 package addition failed *** Error code 1 Stop. make[3]: stopped in /usr/pkgsrc/lang/ruby23-base *** Error code 1 Stop. make[2]: stopped in /usr/pkgsrc/lang/ruby23-base *** Error code 1 Stop. make[1]: stopped in /usr/pkgsrc/lang/ruby23-base *** Error code 1 Stop. make: stopped in /usr/pkgsrc/security/ruby-oauth *** 'make replace' failed for package ruby23-oauth. *** Please read the errors listed above, fix the problem, *** then re-run pkg_rolling-replace to continue. - ruby23-oauth
こうしたときは、既にruby23-baseパッケージができているので、できているパッケージでreplaceしてしまいます。
pkg_add -U /usr/pkgsrc/lang/ruby23-base/work.x86_64/.packages/ruby23-base-2.3.6.tgz
そして、pkg_rolling-replaceを再実行すると、続きが走るので、よいと思います。
ただし、途中で止まっちゃったパッケージがそもそもmake installできなくなっちゃっているパッケージだと、手も足もでません。(時々そういうのがあったりします。)
dry runしたい
-nオプションで可能です。つまり、
pkg_rolling-replace -nrsv
などでできます。
サンプル
ruby23-oauthパッケージをアップデートした結果は、以下のとおりです。ruby23-oauth -> ruby23-base -> ruby23-mikutterとアップデートが行われています。(ruby23-baseは手動でpkg_addしていますけれども。)
あとがき
NetBSD使っているひとって、みんな古くから使っていて初心者なんかいなさそうで(そんなことはない)、英語なんかもすらすら読めて(ぼくはちがう)、デバイスドライバ書いたりカーネルいじったりしていて(ぼくは超ちがう)、っていうすごいはっかー、ていう感じがします。
そんなことは全然全くさっぱりちっともないただの利用者たるぼくですが、何か書いてみることにしました。誰かのお役に立てれば幸いです。
ではでは。
明日のAdvent Calendarは
610tさんの『NanoPi Neo2でNetBSDを動かしてみた』です。楽しみです。
間違いの指摘や、ご意見などは、FrontPageにある連絡先にメールを下さるとうれしいです。
最終更新時間:2017年12月20日 02時05分56秒