EN JA
MERGEMASTER(8)
MERGEMASTER(8) FreeBSD System Manager's Manual MERGEMASTER(8)

名称

mergemasterアップグレードの間の設定ファイル、その他をマージする

書式

mergemaster [ -scrvhpCP][ -a|iFU][ --run-updates=[always|never]][ -m /path/to/sources][ -t /path/to/temp/root][ -d][ -u N][ -w N][ -A Target architecture][ -D /destdir/path]

解説

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

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

デフォルトで、 /var/tmp/temproot に一時的なルートを作成して、それらにあるファイルのための Version Control System (VCS) Id 文字列 ($FreeBSD) を比較し、文字列がマッチするなら、一時的なファイルを削除します。 Id 文字列がない時や、あっても一致しない場合には、ファイルそのものを比較します。 Id 文字列を無視して、 -s オプションで、全てのファイルを比較するように指定することもできます。 -F オプションを使用すると、 mergemaster は、ファイルの VCS 文字列だけが異なるなら、新しいファイルがインストールされます。

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

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 の前に読み込まれます。コマンドラインで指定されたオプションが最後に更新されますので、両方のファイルに優先します。

比較が終ったとき、temproot ディレクトリに残っているファイルがあるなら、それらは、リストされ、 -a オプションが使用中でないなら、ユーザは、temproot ディレクトリを削除するオプションを与えられます。 temproot ディレクトリにファイルが残っていないなら、そのディレクトリは、削除されます。

オプションは、次の通りです:

-s
全てのファイルの対について diff をとり、厳密な比較をします。この比較は、VCS Id 以外に対し、1 行ずつ実行されます。
-c
unified diff の代わりに context diff を用います。
-r
一時的なルート環境を新規に作ることをせずに、以前掃除したディレクトリで mergemaster を再実行します。このオプションは、他の全てのオプションと一緒に使えます。
-v
処理についてより冗長に出力します。あなたが初めて mergemaster を実行する時には、おそらくこのオプションを付けるべきでしょう。さらにこのオプションは、インストールされている方の /etc にしかないファイルの一覧を提供します。
-a
自動実行。このオプションは、インストールされているものと食い違う全てのファイルを、手で処理するために一時的なディレクトリに残しておきます。もしすでに temproot ディレクトリがある場合には、以前になかったディレクトリに新しく作ります。このオプションは、冗長なフラグを未設定とし、 -i, -F または -U フラグと互換性がありません。 -a を設定すれば、 -w を無意味なものにします。
-h
使用法とヘルプ情報を表示します。
-i
宛先ディレクトリに存在しないファイルは、自動的にインストールします。
-p
世界構築前モード。 {build|install}world に不可欠なファイルのみ比較します。これには、 /etc/make.conf も含まれます。
-F
ファイルの VCS Id ($FreeBSD) だけが異なるなら、新しいファイルをインストールします。
-C
標準の mergemaster の実行の後に、rc.conf[.local] のオプションとデフォルトのものとを比較します。
-P
置き換えるファイルを /var/tmp/mergemaster/preserved-files-<date> または mergemaster rc ファイルで指定したディレクトリに保存します。
-U
ユーザが変更していないファイルの自動アップグレードを試みます。実行中のシステムに影響する新しいバージョンでクリティカルな変更があるとき、このオプションは、危険となるかもしれません。
--run-updates=[always|never]
比較実行の終わりで、newaliases, pwd_mkdb などを常に (always) 実行するか、または決して (never) 実行しないように指定します。このオプションが省略されるなら、デフォルトは、必要に応じて各アップデートごとにユーザにプロンプトを出します。
-m /path/to/sources
make(1) を実行するディレクトリのパスを指定します。 (言い替えるとソースの場所です。 -s がもう使われているので。) mergemaster の前のバージョンでは、はるばる src/etc までのパスを指定する必要がありました。 r186678 からは、 src へのパスを指定する必要があるだけです。 mergemaster は、古いメソッドを使用するなら、利用者のためのパスを変換します。
-t /path/to/temp/root
一時的なルート環境をデフォルトの /var/tmp/temproot の代わりに /path/to/temp/root に作ります。
-d
一時的なルートディレクトリの名前に、日付と時間を足します。 -t オプションを指定しているときに日付も足したいなら、このオプションは、-t の後に置く必要があります。
-u N
umask を数字で指定します。デフォルトは、022 です。
-w N
sdiff(1) コマンドに画面幅を桁数で指定します。デフォルトは、80 です。
-A Target architecture
代わりの TARGET_ARCH アーキテクチャ名を指定します。
-D /path
ファイルをインストールする、宛先ディレクトリを指定します。

環境変数

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

関連ファイル

/etc/mergemaster.rc
$HOME/.mergemasterrc

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

# mergemaster のオプションが、デフォルト値とともに一覧してあります 
# 以下のオプションは、コマンドラインが上書きします 
# 
# ターゲットアーキテクチャ (-A, デフォルトで未設定) 
#ARCHSTRING='TARGET_ARCH=<foo>' 
# 
# sourcedir は、'make' を行うディレクトリ (-m) 
#SOURCEDIR='/usr/src' 
# 
# 一時的なルート環境をインストールするディレクトリ (-t) 
#TEMPROOT='/var/tmp/temproot' 
# 
# ファイルをインストールする、宛先ディレクトリを指定する (-D) 
#DESTDIR= 
# 
# VCS Id の検査をスキップして全てのファイルを比較する厳密な比較 (-s) 
#STRICT=no 
# 
# unified, context 等の diff の種類 (-c) 
#DIFF_FLAG='-u' 
# 
# ファイルの VCS Id だけが異なるなら、新しいファイルをインストール 
# します ($FreeBSD, -F) 
#FREEBSD_ID= 
# 
# より詳細な出力とチェックの追加を含める冗長モード (-v) 
#VERBOSE= 
# 
# システム上に存在しないファイルは、自動的にインストールする (-i) 
#AUTO_INSTALL= 
# 
# 変更されたユーザでない自動的なアップグレードファイル (-U) 
# ***危険*** 
#AUTO_UPGRADE= 
# 
# 終りで newaliases, pwd_mkdb を常に (always) に実行するか、または決して 
# (never) 実行しないかのいずれか (--run-updates) 
#RUN_UPDATES= 
# 
# /etc/rc.conf[.local] と /etc/defaults/rc.conf を比較する (-C) 
#COMP_CONFS= 
# 
# 置き換えるファイルを保存する (-P) 
#PRESERVE_FILES= 
#PRESERVE_FILES_DIR=/var/tmp/mergemaster/preserved-files-`date +%y%m%d-%H%M%S` 
# 
# mergemaster がデフォルトのファイルモードとの比較に使う umask (-u) 
#NEW_UMASK=022 
# 
# 以下のオプションは、コマンドラインから上書きできません 
# 
# 常に比較をを避けるファイル 
#IGNORE_FILES='/etc/motd /etc/printcap foo bar' 
# 
# diff のための追加オプション. -s を使用するとき, 未設定とする. 
#DIFF_OPTIONS='-Bb' # 空白類の変更を無視する 
# 
# AUTO_UPGRADE 目的のために mtree 値のリストを格納する位置 
#MTREEDB='/var/db' 
# 
# PAGER にフルパスを含めたくない人用 
#DONT_CHECK_PAGER= 
# 
# 上を 'yes' にしたら、ページャへの PATH が含まれているか確認してください 
#PATH=/bin:/usr/bin:/usr/sbin 
# 
# プロンプトなしに /etc/rc.d の古いファイルを削除する 
#DELETE_STALE_RC_FILES= 
# 
# 比較開始前に実行するスクリプトやスクリプト完了後に実行するスクリプト 
# のパスを指定する 
#MM_PRE_COMPARE_SCRIPT= 
#MM_EXIT_SCRIPT=

終了ステータス

終了ステータスは、成功して終了すると、またはユーザが実行のある時点で、手動で出て行くなら、0 です。

終了ステータスは、次の理由の 1 つで失敗するなら、1 です:

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

一時的なルート環境の作成に失敗

一時的なルートになることに失敗

<DESTDIR>/etc/fstab の 'nodev' オプションの存在

ファイルのインストールに失敗

使用例

一般的に、利用者が行なう必要があるすべてのことは、プロンプトで mergemaster をタイプすることです、スクリプトは、利用者のためにすべての作業を行ないます。

コンテキスト diff を使用し、それが進行するしたがって、 mergemaster により多くのことを説明させるためには、次を使用します:

# mergemaster -cv

mergemaster/usr/tmp/root に一時的なルート環境を置くことを指定するためには、次を使用します:

# mergemaster -t /usr/tmp/root

厳密な比較で 110 のカラムの画面を指定するためには、次を使用します:

# mergemaster -sw 110

関連項目

diff(1), make(1), more(1), sdiff(1), pwd_mkdb(8)

/usr/src/etc/Makefile Nik Clayton, The Cutting Edge (using make world), http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html. 日本語版は、 http://www.jp.FreeBSD.org/www.FreeBSD.org/doc/ja_JP.eucJP/books/handbook/makeworld.html です。

歴史

mergemaster ユーティリティは、1998 年 3 月 13 日に名前 comproot でより簡単な形式の私のウェブページの 1 つで最初に公表されました。一時的なルート環境を作成するという考えは、上で参照された Nik Clayton の make world tutorial に由来しています。

作者

このマニュアルページとスクリプト自体は、 Douglas Barton <dougb@FreeBSD.org>によって書かれました。
November 1, 2011 FreeBSD