MERGEMASTER(8)

名称
mergemaster - アップグレード中の設定ファイルその他のマージ

書式
mergemaster [-scrvahipCP] [-m /path/to/sources] [-t /path/to/temp/root] [-d] [-u N] [-w N] [-D /path]

解説
mergemaster ユーティリティは、様々な設定や FreeBSD に関連したファイルをアップデートする作業を 補助するために作られた Bourne シェルスクリプトです。 この作業を始める前に /etc ディレクトリをバックアップしておくことを 強く 勧めます。

このスクリプトは /usr/src/etc/Makefile を使って / から下の仮のルート環境を作成し、そこに様々なファイルを格納します。 [-m] コマンドラインオプションで違うソースディレクトリを指定することや、 [-D] コマンドラインオプションで違う宛先ディレクトリを指定することもできます。 そしてその環境中のそれぞれのファイルを、 インストールされているものと比較します。 スクリプトが新しいファイルに変更点を見つけた場合や、 新しいファイルに対応するインストールされているファイルがない場合には、 それを処理するための 4 つの選択肢を示します。 新しいファイルをそのままインストールする、 新しいファイルは消す、 新旧のファイルを sdiff(1) を使って適切にマージする、 後で手でマージするためにファイルを仮のルート環境に残しておく、 のいずれかを選べます。

デフォルトでは、 /var/tmp/temproot に仮のルートを作り、 cvs(1) バージョン文字列 %Id/%FreeBSD があるファイルについてはそれを比較して、 もし同じであれば仮のファイルを削除します。 $Id 文字列がない時や、あっても一致しない場合には、 ファイルそのものを比較します。 $Id 文字列を無視して全てのファイルを比較するように指定することもできます。

マージメニューのオプションは、 古いファイルに対するカスタマイズを取り出して、 新しいファイルに簡単にマージできるようにデザインされています。 カスタマイズしていないファイルに対するファイルの変更を取り込むために、 マージ機能を使用することもできますが、推奨できません。

mergemaster ユーティリティは umask を調べて、022 以外であれば警告を出します。 ほとんどの設定ファイルは world read パーミッションを与えることが 強制されているわけではありませんが、 そうしないと問題になるかもしれません。 もし 022 以外 の umask を選び、あとで何らかのトラブルが生じた場合、 その原因がこれかもしれません。 /etc/master.passwd は特例として扱います。 このファイルないしマージしたファイルをインストールすることを選択すると、 このファイルのパーミッションはセキュリティ上の理由から 常に 600 (rw-------) になります。 このファイルのアップデート版をインストールした後は、 pwd_mkdb(8) を -p オプション付きで実行して、 パスワードデータベースの再構築と /etc/passwd の作り直しをさせる必要があります。

スクリプトは、 /usr/src/etc/Makefile が作成したファイルに付けた所有者 ID およびグループ ID と、 umask によって指定されたファイルパーミッションを用います。 context diff を選ばない限り、 デフォルトで unified diff を使って差分を表示します。

mergemaster ユーティリティは、 比較開始直前と実行完了前に、指定したスクリプトを読み込みます。 最も簡単な方法は、 .mergemasterrc において、スクリプトへのパスを適切な変数へ設定することです。 比較前に読み込まれるスクリプトは MM_PRE_COMPARE_SCRIPT で指定し、スクリプト完了後に実行するものは MM_EXIT_SCRIPT で指定します。 これが、 ローカルでの修正および特別な処理を行うファイルを指定するための推奨方法です。 これには、比較せずに削除したいファイルも含みます。 指定したスクリプトは、 mergemaster 内部から読み込まれますので、 スクリプトの全変数がカスタムスクリプト中で使用可能です。 /etc/mergemaster.rc も使用可能です。 これは、 .mergemasterrc の前に読み込まれます。 コマンドラインで指定されたオプションが最後に更新されますので、 両方のファイルに優先します。

オプションは以下の通りです:

-s  全てのファイルの対について diff をとり、厳密な比較をします。 この比較は、CVS $Id 以外に対し、1 行ずつ実行されます。

-c  unified diff の代わりに context diff を用います。

-r  仮のルート環境を新規に作ることをせずに、 以前掃除したディレクトリで再実行します。 このオプションは他の全てのオプションと一緒に使えます。

-v  処理についてより冗長に出力します。 あなたが初めて mergemaster を実行する時には、おそらくこのオプションを付けるべきでしょう。 さらにこのオプションは、 インストールされている方の /etc にしかないファイルの一覧を提供します。

-a  自動実行。 このオプションはインストールされているものと食い違う全てのファイルを、 手で処理するために仮のディレクトリに残しておきます。 もしすでに temproot ディレクトリがある場合には、 以前はなかったディレクトリに新しく作ります。 このオプションは冗長フラグを解除しますが、 他の全てのオプションと一緒に使えます。 -a オプションを使うと、-w オプションは無意味になります。

-h  使用法とヘルプ情報を表示します。

-i  宛先ディレクトリに存在しないファイルは、自動的にインストールします。

-p  世界構築前モード。 {build|install}world に不可欠なファイルのみ比較します。 これには /etc/make.conf も含まれます。

-C  標準の mergemaster の実行の後に、rc.conf[.local] のオプションとデフォルトのものとを比較します。

-P  置き換えるファイルを /var/tmp/mergemaster/preserved-files-<date> または mergemaster rc ファイルで指定したディレクトリに保存します。

-m /path/to/sources
    make(1) を実行するディレクトリのパスを指定します。 (言い替えるとソースの場所です。-s がもう使われているので)

-t /path/to/temp/root
    仮のルート環境をデフォルトの /var/tmp/temproot の代わりに /path/to/temp/root に作ります。

-d  仮のルートディレクトリの名前に、日付と時間を足します。 -t オプションを指定しているときに日付も足したいなら、 このオプションは -t の後に置く必要があります。

-u N
    umask を数字で指定します。デフォルトは 022 です。

-w N
    sdiff(1) コマンドに画面幅を桁数で指定します。 デフォルトは 80 です。

-D /path
    ファイルをインストールする、宛先ディレクトリを指定します。

環境変数
mergemaster ユーティリティは、 PAGER 環境変数がセットされていればそれを使い、さもなくば more(1) を使います。 もし PAGER に、フルパスではなく、 PATH の範囲にないプログラムを指定している場合には、 mergemaster は選択肢とともにどう続行するのかを催促します。 MM_PRE_COMPARE_SCRIPT と MM_EXIT_SCRIPT の変数は、前述のように使用します。 スクリプト内部で使用する他の変数は、後で詳述するように、 .mergemasterrc で指定可能です。

使用例
大抵の場合、あなたがする必要があるのは、 プロンプトで mergemaster と打つことだけで、あとはスクリプトがあなたに代わって全ての作業をします。

context diff を使い、かつ mergemaster が処理が進むにつれ、よりたくさんの説明をするようにするには:

    # mergemaster -cv

mergemaster が仮のルート環境を /usr/tmp/root に作るように指定するには:

    # mergemaster -t /usr/tmp/root

110 桁の画面と、厳密な比較を指定するには:

    # mergemaster -sw 110

関連ファイル
/etc/mergemaster.rc
$HOME/.mergemasterrc

mergemaster ユーティリティは、これらファイルがあれば読み込みます。 コマンドラインオプションは、rc ファイルオプションに優先します。 $HOME/.mergemasterrc は、 /etc/mergemaster.rc に優先します。 全ての値をコメントアウトした例を示します:

    # mergemaster のオプションが、デフォルト値とともに一覧してあります
    # 以下のオプションはコマンドラインが上書きします
    #
    # 仮のルート環境をインストールするディレクトリ
    #TEMPROOT='/var/tmp/temproot'
    #
    # CVS $Id の検査を省略して全てのファイルを比較する厳密な比較
    #STRICT=no
    #
    # unified, context 等の diff の種類
    #DIFF_FLAG='-u'
    #
    # diff への追加オプション。-s を使用するとアンセットできます。
    #DIFF_OPTIONS='-I$FreeBSD:.*[$]'	# Ignores CVS Id tags
    #
    # より詳細な出力とチェックの追加を含める冗長モード
    #VERBOSE=
    #
    # システム上に存在しないファイルは自動的にインストールする
    #AUTO_INSTALL=
    #
    # /etc/rc.conf[.local] と /etc/defaults/rc.conf を比較する
    #COMP_CONFS=yes
    #
    # 置き換えるファイルを保存する
    #PRESERVE_FILES=yes
    #PRESERVE_FILES_DIR=/var/tmp/mergemaster/preserved-files-`date +%y%m%d-%H%M%S`
    #
    # 'make' を実行するディレクトリ (新しいファイルがある場所)
    #SOURCEDIR='/usr/src/etc'
    #
    # mergemaster がデフォルトのファイルモードとの比較に使う umask
    #NEW_UMASK=022
    #
    # ファイルをインストールする、宛先ディレクトリを指定する
    #DESTDIR=
    #
    # 以下のオプションはコマンドラインから上書きできません
    # PAGER にフルパスを含めたくない人用
    #DONT_CHECK_PAGER=
    #
    # 上を 'yes' にしたら、ページャへの PATH が含まれているか確認してください
    #PATH=/bin:/usr/bin:/usr/sbin
    #
    # 新旧の motd ファイルを比較しない
    #IGNORE_MOTD=yes
    #
    # 比較開始前に実行するスクリプトやスクリプト完了後に実行するスクリプト
    # のパスを指定する
    #MM_PRE_COMPARE_SCRIPT=
    #MM_EXIT_SCRIPT=

関連項目
cvs(1), diff(1), make(1), more(1), sdiff(1), pwd_mkdb(8)

/usr/src/etc/Makefile

http://www.FreeBSD.org/doc/handbook/makeworld.html, The Cutting Edge (using make world), Nik Clayton.

(訳注: 日本語版は http://www.jp.FreeBSD.org/www.FreeBSD.org/ja/handbook/makeworld.html )

診断
成功終了、ないしユーザが実行中に手動で脱出した場合には、 終了ステータスは 0 です。

以下に挙げるいずれかの理由で失敗した場合には、終了ステータスは 1 です:

コマンドラインオプションが不正

仮のルート環境を作成するのに失敗

仮のルートにファイルを格納するのに失敗

歴史
mergemaster スクリプトは、 1998 年 3 月 13 日に 私のウェブページの中で もっと単純な形で comproot という名前で最初に公開されました。 仮のルート環境を作るというアイデアは、 上で参照した Nik Clayton の make world tutorial から来ています。

作者
このマニュアルページとスクリプトは Douglas Barton <DougB@FreeBSD.org> が書きました。

バグ
今のところわかっているバグはありません。 なにか問題や、コメントや、提案があれば、どうか作者まで報告してください。 このプログラムになされた改良のいくつかは ユーザからの提案によるものです。ありがとう。