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

名称

etcupdateinstallworld によって更新されないシステムファイルへの更新を管理する

書式

etcupdate [ -nBF][ -d workdir][ -r | -s source | -t tarball][ -A patterns][ -D destdir][ -I patterns][ -L logfile][ -M options]

etcupdate build [ -B][ -d workdir][ -s source][ -L logfile][ -M options] tarball

etcupdate diff [ -d workdir][ -D destdir][ -I patterns][ -L logfile]

etcupdate extract [ -B][ -d workdir][ -s source | -t tarball][ -L logfile][ -M options]

etcupdate resolve [ -d workdir][ -D destdir][ -L logfile]

etcupdate status [ -d workdir][ -D destdir]

解説

etcupdate ユーティリティは、 /etc のファイルのような‘make installworld’の一部として更新されないファイルへの更新を管理するためのツールです。ローカルのバージョンに対して、これらのファイルに行なわれた変更の 3 ウェイマージを行うことによって更新を管理します。また、それは、マシンのクラスタのためのアップグレードを単純化するゴールでユーザの介入の量を最小化するように設計されています。

3 ウェイマージを実行するために、 etcupdate は、それが管理するファイルの現在と以前のバージョンのコピーを保持しています。これらのコピーは、“current” (現在) と“previous” (以前) ツリーとして知られている 2 つのツリーに格納されます。マージの間に、 etcupdate は、各ファイルのローカルのバージョンにマージされる必要がある変更を決定するための各ファイルの“current”と“previous”コピーを比較します。衝突を起こさずにファイルを更新することができるなら、 etcupdate は、ファイルを自動的に更新します。ファイルへのローカルな変更がソースツリーのファイルに行われた変更と衝突するなら、マージの衝突が生成されます。衝突は、マージが終了した後に、解決されなければなりません。 etcupdate ユーティリティは、以前のマージからすべての衝突が解決されるまで、新しいマージを実行しません。

モード

etcupdate ユーティリティは、いくつかの操作モードをサポートしています。モードは、オプションのコマンド引数によって指定されます。存在するなら、コマンドは、コマンド行の最初の引数でなければなりません。コマンドが指定されないなら、デフォルトモードが使用されます。

デフォルトモード

デフォルトモードは、ソースツリーから目的のディレクトリまでの変更をマージします。最初に、“current”と“previous”ツリーを更新します。次に、目的ディレクトリへの変更をマージする 2 つのツリーを比較します。最後に、自動的に操作することができなかったあらゆる条件に対する警告を表示します。

-r オプションが指定されないなら、取られる最初のステップは、“current”と“previous”ツリーを更新することです。“current”ツリーが既に存在するなら、そのツリーは、“previous”ツリーとして保存されます。より古い“previous”ツリーが存在するなら、削除されます。デフォルトで、新しい“current”ツリーは、ソースツリーから構築されます。しかしながら、tarball が -t オプションによって指定されるなら、ツリーは、代わりに、その tarball から抽出されます。

次に、 etcupdate は、“current”と“previous”ツリーのファイルを比較します。ファイルが“current”ツリーから削除されたなら、あらゆるローカルの修正がない場合のみ、目的ディレクトリから削除されます。ファイルが“current”ツリーに追加されたなら、それが既存のファイルを削除しなかった場合のみ、目的ディレクトリにコピーされます。ファイルが“current”ツリーで変更されるなら、 etcupdate は、目的ディレクトリでファイルのバージョンへの変更をマージすることを試みます。マージが衝突に遭遇するなら、衝突マーカがあるファイルのバージョンは、将来の解決のために保存されます。マージが衝突に遭遇しないなら、ファイルのマージされたバージョンは、目的ディレクトリで保存されます。 etcupdate がマージの衝突以外のファイルへの変更で安全にマージすることができないなら、警告を生成します。

更新される各ファイルについて、行は、アクションが取られることを示すために先導する文字で出力されます。指定できるアクションは、次の通りです:

A
追加
C
衝突
D
削除
M
マージ
U
更新

最後に、警告に遭遇しなら、マージが完了した後に、それらが表示されます。

特定のファイルに関して、 etcupdate は、ファイルが更新されるときはいつでも、ポストインストール (post-install) アクションを実行することに注意してください。具体的に、 pwd_mkdb(8) は、 /etc/master.passwd が変更されるなら、起動され、 cap_mkdb(1) は、 /etc/login.conf が変更されるなら、 /etc/login.conf.db を更新するために起動され、 newaliases(1) は、 /etc/mail/aliases が変更されるなら、起動され、そして、 /etc/rc.d/motd は、 /etc/motd が変更されるなら、起動されます。 1 つの例外は、 /etc/mail/aliases が変更され、目的ディレクトリがデフォルトでないなら、警告が代わりに発行されることです。これは、 newaliases(1) コマンドの制限のためです。同様に、 /etc/motd が変更され、目的ディレクトリがデフォルトでないなら、 /etc/rc.d/motd は、そのスクリプトの制限のために実行されません。この場合、警告は、 /etc/rc.d/motd の結果が単に表面的であるとして発行されず、次のリブートで修正されます。

構築モード

build (構築) モードは、“current”ツリーのスナップショットを含んでいる tarball を構築するために使用されます。デフォルトと抽出モードによって、この tarball を使用することができます。 tarball の使用によって、 etcupdate は、現在の installed world とマッチするソースツリーを要求せずに、マージを実行することができます。 tarball 引数は、作成するファイルの名前を指定します。ファイルは、 bzip2(1) で圧縮された tar(5) ファイルとなります。

差分モード

diff (差分) モードは、目的ディレクトリのファイルのバージョンと“current”ツリーと比較し、変更の unified (ユニファイド) 形式の差分を生成します。ファイルが局所的にどのように修正されたかを判断するために、これを使用することができます。 etcupdate は、 /etc/fstab/etc/rc.conf のようなソースツリーで保守されないファイルを管理しないことに注意してください。

抽出モード

extract (抽出) モードは、新しい“current”ツリーを生成します。デフォルトモードと異なり、あらゆる既存の“current”ツリーを保存せず、既存の“previous”ツリーを修正しません。新しい“current”ツリーは、ソースツリーから構築するか、または tarball から抽出することができます。

解決モード

resolve (解決) モードは、マージの間に遭遇したあらゆる衝突を解決するために使用されます。このモードで、 etcupdate は、それぞれ衝突されたファイルで取るアクションに対してユーザにプロンプトを出して、あらゆる既存の衝突を繰り返します。各ファイルについて、次のアクションが利用可能です:

(p) postpone
今のところこの衝突を無視します。
(df) diff-full
unified 差分としてマージされたファイルに行なわれたすべての変更を表示します。
(e) edit
エディタでマージされたファイルを変更します。
(r) resolved
目的ディレクトリにファイルのマージされたバージョンをインストールします。
(mf) mine-full
目的ディレクトリのファイルのバージョンを使用し、“current”ツリーのファイルに行なわれたあらゆる変更を無視します。
(tf) theirs-full
“current”ツリーからのファイルのバージョンを使用し、ファイルに行われたあらゆる局所的な変更を廃棄します。
(h) help
コマンドのリストを表示します。

ステータスモード

status (ステータス) モードは、最も最近マージされた結果の要約を表示します。最初に、解決されない衝突がある、あらゆるファイルをリストします。次に、最後のマージの間に生成されたあらゆる警告をリストします。最後のマージがあらゆる衝突または警告を生成しないなら、何も出力されません。

オプション

次のオプションが利用可能です。ほとんどのオプションは、すべてのモードに適用しないことに注意してください。
-B
プライベートのオブジェクトツリーで生成されたファイルを構築しません。代わりに、ソースツリーとマッチする以前に構築されたオブジェクトツリーから生成されたファイルを再使用します。これは、ブートストラップするとき、 sendmail(8) の設定ファイルで理由のない衝突を回避するために役に立ちます。また、特定の world build とマッチする tarball を構築するために役に立ちます。
-d workdir
作業ディレクトリとして使用する代替のディレクトリを指定します。仕事ディレクトリは、未解決の衝突と同様に“current”と“previous”ツリーに格納するために使用されます。デフォルトの作業ディレクトリは、 <destdir>/var/db/etcupdate です。
-A patterns
常に、 patterns にリストされたパターンのうちのいずれもマッチする、あらゆるファイルの新しいバージョンをインストールします。各パターンは、 sh(1) シェルパターンとして評価されます。複数のパターンを指定するために、このオプションを複数回指定することができます。また、複数の空白で区切られたパターンは、単一のオプションで指定できます。 IGNORE_FILES 変数または -I オプションを通して指定された無視されるファイルは、インストールされないことに注意してください。
-D destdir
マージのターゲットとして代替の目的ディレクトリを指定します。これは、‘make installworld’で使用される DESTDIR 変数に類似しています。デフォルトの目的ディレクトリは、ローカルマシンで更新する /etc をマージする結果である空の文字列です。
-F
目的ディレクトリのファイルと“current”または“previous”ツリーのいずれかのファイルと比較するとき、FreeBSD ID 文字列の変更を無視します。 diff モードにおいて、これは、出力の FreeBSD ID 文字列の変更のためのノイズ (雑音) を減らします。更新の間に、これは、FreeBSD ID 文字列の変更によって引き起こされる安全な衝突のための取り扱いを単純化することができます。

特に、目的ディレクトリのファイルが“previous”ツリーのモジュロの FreeBSD ID 文字列の同じファイルと同一であるなら、ファイルは、あたかもそれが未変更で、ファイルの“current”バージョンがインストールされるかのように、扱われます。同様に、目的ディレクトリのファイルが“current”ツリーのモジュロの FreeBSD ID 文字列の同じファイルと同一であるなら、ファイルの“current”バージョンは、ID 文字列を更新するためにインストールされます。ファイルの“previous”と“current”バージョンが同一であるなら、 etcupdate は、目的ディレクトリのファイルを変更しません。

diff(1) コマンドの制限のために、このオプションは、FreeBSD ID 文字列をクローズするファイルの他の変更があるなら、効果がありません。

-I patterns
patterns にリストされたパターンのいずれかにマッチするあらゆるファイルを無視します。警告または他のメッセージは、マージの間にそれらのファイルのために生成されません。各パターンは、 sh(1) シェルパターンとして評価されます。複数のパターンを指定するために、このオプションを複数回指定することができます。また、複数の空白で区切られたパターンは、単一のオプションで指定できます。
-L logfile
ログファイルのための代替のパスを指定します。 etcupdate ユーティリティは、標準出力と標準エラーとともに、それが起動する各コマンドをこのファイルにログ記録します。デフォルトで、ログファイルは、作業ディレクトリの log と名前が付けられたファイルに格納されます。
-M options
“current”ツリーを構築するとき、 make(1) への追加パラメータとして、 options を渡します。クロス構造のために TARGET または TARGET_ARCH 変数を設定するために、これを使用することができます。
-n
“dry-run”モードを有効にします。目的ディレクトリへのあらゆる変更をマージしません。代わりに、アクションがマージの間に取られるものを報告します。既存の“current”と“previous”ツリーが変更されないことに注意してください。 -r オプションが指定されないなら、一時的な“current”ツリーは、比較を実行するために抽出されます。
-r
マージの間に“current”と“previous”ツリーを更新しません。前のマージ操作を“再実行”するために、これを使用することができます。
-s source
“current”ツリーを構築するか抽出するとき、使用する代替のソースツリーを指定します。デフォルトのソースツリーは、 /usr/src です。
-t tarball
ソースツリーからツリーを構築するのではなく、 build コマンドによって以前に生成された tarball から新しい“current”ツリーを抽出します。

設定ファイル

また、 etcupdate ユーティリティは、 /etc/etcupdate.conf と名前がつけられたオプションの設定ファイルで変数を設定することによって設定することができます。コマンド行オプションは、設定ファイルの設定を上書きすることに注意してください。設定ファイルは、 sh(1) によって実行されるので、設定変数を設定するために、その構文を使用します。次の変数を設定することができます:
ALWAYS_INSTALL
-A オプションに似ている、この変数でリストされたパターンのいずれかにマッチするファイルを常にインストールします。
DESTDIR
-D オプションに似ている代替の目的ディレクトリを指定します。
EDITOR
マージの衝突を編集するプログラムを指定します。
FREEBSD_ID
-F オプションに似ている FreeBSD ID 文字列の変更を無視します。これは、変数を空でない値に設定することによって有効になります。
IGNORE_FILES
-I オプションに似ている、この変数でリストされたパターンのいずれかにマッチするファイルを無視します。
LOGFILE
-L オプションに似ているログファイルのための代替のパスを指定します。
MAKE_OPTIONS
-M オプションに似ている“current”ツリーを構築するとき、 make(1) への追加オプションを渡します。
SRCDIR
-s オプションに似ている代替のソースツリーを指定します。
WORKDIR
-d オプションに似ている代替の作業ディレクトリを指定します。

環境変数

etcupdate ユーティリティは、マージの衝突を編集する EDITOR 環境変数で特定されるプログラムを使用します。 EDITOR が設定されていないなら、デフォルトのエディタとして vi(1) が使用されます。

関連ファイル

/etc/etcupdate.conf
オプションの設定ファイル。
/var/db/etcupdate
デフォルトの作業ディレクトリは、ツリーと他のデータを格納するために使用されます。
/var/db/etcupdate/log
デフォルトのログファイル。

終了ステータス

The etcupdate utility exits 0 on success, and >0 if an error occurs.

使用例

ソースツリーが現在の installed world にマッチするなら、将来のアップグレードのために使用することができるように、 etcupdate をブートストラップするために次を使用することができます:

etcupdate extract

buildworld と installworld プロセスを通してアップグレードした後に、変更をマージするためには:

etcupdate

マージの間に生成されたあらゆる衝突を解決するためには:

etcupdate resolve

診断

次の警告メッセージがマージの間に生成されるかもしれません。これらの警告のいくつかは、たとえ実施中であったとしても、めったに起きないはずである、不明瞭な場合をカバーすることに注意してください。例えば、ファイルが“current”ツリーのファイルからディレクトリに変更し、ファイルが目的ディレクトリで修正されたなら、警告が引き起こされます。一般的に、警告がパス名を参照するとき、目的ディレクトリの対応するファイルは、マージ操作によって変更されません。
Directory mismatch: <path> (<type>)
path でディレクトリを作成する試みが行われましたが、タイプ“type”の既存のファイルは、既にそのパス名に存在します。
Modified link changed: <file> (<old> became <new>)
file と名前が付けられたシンボリックリンクのターゲットは、“current”ツリーで“old”から“new”に変更されました。シンボリックリンクは、目的ディレクトリの“old”でも“new”でもないターゲットを指すために修正されました。
Modified mismatch: <file> (<new> vs <dest>)
タイプ“new”の file と名前が付けられたファイルは、“current”ツリーで修正されましたが、ファイルは、目的ディレクトリに異なるタイプ“dest”として存在します。
Modified <type> changed: <file> (<old> became <new>)
file と名前がつけられたファイルは、“previous”ツリーの“old”から“current”ツリーのタイプ“new”にタイプを変更しました。タイプ“type”の目的ディレクトリのファイルは、修正されているので、自動的にマージすることができないかもしれません。
Modified <type> remains: <file>
file と名前が付けられたタイプ“type”のファイルは、“current”ツリーから削除されますが、それは、局所的に修正されました。ファイルの修正されたバージョンは、目的ディレクトリに残ります。
Needs update: /etc/mail/aliases.db (required manual update via newaliases(1))
ファイル /etc/mail/aliases は、空でない目的ディレクトリでマージの間に更新されました。 newaliases(1) コマンドの制限のために、 etcupdate は、対応する別名 (aliases) データベースを自動的に更新することができませんでした。
New file mismatch: <file> (<new> vs <dest>)
タイプ“new”の file と名前が付けられた新しいファイルは、“current”ツリーに追加されました。その名前のファイルは、目的ディレクトリに既に存在しますが、それは、異なるタイプ“dest”です。
New link conflict: <file> (<new> vs <dest>)
file と名前が付けられたシンボリックリンクは、“new”にリンクする“current”ツリーに追加されました。同じ名前のシンボリックリンクは、既に目的ディレクトリに存在しますが、それは、異なるターゲット“dest”とリンクします。
Non-empty directory remains: <file>
ディレクトリ file は、“current”ツリーから削除されましたが、それは、目的ディレクトリの追加ファイルを含んでいます。ディレクトリと同様にこれらの追加ファイルは、残ります。
Remove mismatch: <file> (<old> became <new>)
file と名前がつけられたファイルは、“previous”ツリーのタイプ“old”から“current”ツリーのタイプ“new”に変更されますが、それは、目的ディレクトリで削除されていました。
Removed file changed: <file>
file と名前がつけられたファイルは、“current”ツリーで修正されましたが、それは、目的ディレクトリで削除されていました。
Removed link changed: <file> (<old> became <new>)
file と名前がつけられたシンボリックリンクのターゲットは、“current”ツリーで“old”から“new”に変更されましたが、それは、目的ディレクトリで削除されていました。

歴史

etcupdate ユーティリティは、 FreeBSD 10.0 ではじめて登場しました。

作者

etcupdate ユーティリティは、 John Baldwin <jhb@FreeBSD.org>によって書かれました。

バグ

マージを再実行することは、以前のマージから残された衝突を自動的に削除しません。あらゆる衝突は、マージが再実行されるる前に、解決されなければなりません。これが機能またはバグかどうかは明らかではありません。

特定のファイルのための簡単に自動化された衝突を解決する方法はありません。例えば、自動化された方法で特定の衝突を解決するために次の行

etcupdate resolve tf /some/file

に沿った構文を想像することができます。

ファイルの stock バージョンがあるファイルの局所的な修正バージョンを置き換えるために‘revert’コマンドに何か似ていて便利であるかもしれません。例えば:

etcupdate revert /etc/mail/freebsd.cf

etcupdate をブートストラップすることは、しばしば最初のマージで衝突を生じる /etc/mail/*.cf の根拠のない diff の結果となります。ブートストラップするとき、ソースツリーとマッチするオブジェクトツリーが存在するなら、 extract コマンドへ -B フラグを渡すことで、これを対処することができます。

March 16, 2012 FreeBSD