FreeBSD Daily Topics

2010年1月18日≪注意≫utmp(5)からutmpxへ切り替え - Ports Collectionからインストールしたアプリケーションは個別に対処が必要

heads-up

utmpx introduced instead of utmp

- 2010年1月13日(協定世界時)のEd Schouten氏のコミット(r202188)からはじまる一連の作業によって、FreeBSDの従来のアカウントデータベースインターフェースutmp(5)が廃止され、代わりにPOSIX標準のutmpxインターフェース(getutxent(3))への置き換えが実施されました。/usr/include/utmp.hは残っていますが中身は残っていません。代わりに/usr/include/utmpx.hを使う必要があります。

utmpとutmpxには基本的に互換性がないため、対応するライブラリであるlibutil.soのバージョンが「libutil.so.8」から「libutil.so.9」へアップグレードされています。システムとカーネルについてはアップデート作業でまとめてアップグレードが可能です。Ports Collectionからインストールしたアプリケーションは個別にアップグレードを実施する必要があります。

まず、Ports Collectionからインストールしたどのアプリケーションやツール、ライブラリが「libutil.so.8」に依存しているかを調べます。たとえば次のようなスクリプトldck(1)を作成し、このスクリプトを「ldck libutil.so.8」のように実行します。

リスト1 ldck(1) - 指定したライブラリに依存しているアプリケーションやツールをリストアップするスクリプト
#!/bin/sh

obsoletelibrary=${1}

find -f /usr/local/lib/ -f /usr/local/bin/ |
while read target
do
    check=$(ldd ${target} 2> /dev/null | grep ${obsoletelibrary})
    if [ -n "${check}" ]
    then
        port=$(grep -E "^${target#/usr/local/}\$" /var/db/pkg/*/+CONTENTS | head -1)
        port=${port#/var/db/pkg/}
        port=${port%%/+CONTENTS*}
        echo "$port"
    fi
done |
sort | uniq
リスト2 libutil.so.8に依存しているアプリの例
bug-buddy-2.28.0 compiz-0.8.4 dasher-4.10.1_1,2 ekiga-2.0.11_6 
emacs-23.0.95_1 eog-2.28.2 evolution-2.28.2 evolution-exchange-2.28.2 
evolution-mapi-0.28.2 farsight2-0.0.17 gnome-control-center-2.28.1_1 
gnome-nettool-2.28.0,1 gnome-panel-2.28.0_1 gnome-power-manager-2.24.4_7 
gnome-spell-1.0.8_3 gnome-system-monitor-2.28.0 gnome-terminal-2.28.2 
gnome-utils-2.28.1,1 gnome-vfs-2.24.2 gnupg-2.0.14 grip-3.2.0_22 
gstreamer-plugins-gnomevfs-0.10.25,3 gvfs-1.4.3 
ja-ibus-anthy-1.2.0.20091127 ja-tomoe-0.6.0_3 libbonoboui-2.24.2 
libgail-gnome-1.20.1_1 libgnome-2.28.0 libgnomeui-2.24.2 libgtop-2.28.0_2 
libpurple-2.6.4 metacity-2.28.0 mousetweaks-2.28.2 perl-5.8.9_3 
pidgin-2.6.4 py26-gnome-2.28.0 py26-gnome-desktop-2.28.0 
py26-gstreamer-0.10.16 py26-libxml2-2.7.6 python26-2.6.4 ruby-1.8.7.248,1 
samba4-devel-4.0.0.a8_2 seahorse-plugins-2.28.1 sudo-1.7.2.2 tdb-1.1.5 
telepathy-farsight-0.0.13 totem-2.28.5 virtualbox-ose-3.1.2 vlc-1.0.4_1,3 
xscreensaver-gnome-hacks-5.10 xterm-253

依存しているアプリケーションやツールをportupgrade(8)を使ってリビルドします。しかしリスト2を見るとわかるように、ruby自身が「libutil.so.8」に依存しているため、このままではportupgrade(8)が使えません。まず次のようにしてrubyをリビルドします。rubyのリビルドにperlが必要になりますが、perlも「libutil.so.8」に依存しているため、順番としてはperl→rubyの順になります。

プロンプト1 まず最初にRubyを再構築
# setenv BATCH YES
# setenv FORCE_PKG_REGISTER YES
# cd /usr/ports/lang/perl5.8/
# make install clean
# cd /usr/ports/lang/ruby18/
# make install clean

次に「portupgrade -f ここにアップグレードするアプリケーションのリスト」のようにして順次アップグレードを実施します。⁠portupgrade -f `ldck libutil.so.8`」のように依存しているものを自動的にリビルドしてもいいでしょう。

ただし、いくつかのアプリケーションはリビルドに失敗します。これはutmpとutmpxに互換性がないためで、アプリケーションによっては手動で書き換えてビルドを通す必要があります。#include部分をutmp.hからutmpx.hに変更する程度でリビルドできるものもあれば、ソースコードの方に若干の変更を加える必要があるもの(ut_nameとut_user程度の済むものもある)から、いくらか書き換えが必要になるものもあります。

リスト3 リビルドに失敗するアプリケーションの例
emacs-23.0.95_1 finch-2.6.4 gnome-libs-1.4.2_13 gnupg-2.0.14
jfbterm-0.6.0 libpurple-2.6.4 pidgin-2.6.4 screen-4.0.3_6

このあたりの対応はアプリケーションごとに個別に実施する必要があるため、自分で修正を加えるか、よくわからない場合はメンテナに対応するようにメールを出して促すといいでしょう。

システムを最新版にアップグレードしたいものの、こういった作業は避けたいという場合は、make installworldを実施したあとの「make delete-old」「make delete-old-libs」を実行せずに「libutil.so.8」関連のファイルを残したままにしておいてください。いずれはアップグレードした方がいいのですが、当面はそのまま使えます。

おすすめ記事

記事・ニュース一覧