Re: how to use etcupdate?

From: Tomoaki AOKI <junchoon_at_dec.sakura.ne.jp>
Date: Thu, 11 Jan 2024 16:27:43 UTC
青木@名古屋です。

とりあえず最初に。 メールの文字エンコーディングを
(設定可能なら)UTF-8にしておくとアーカイブでの文字化けが
防げます。 例えばSylpheedのメール作成ウィンドウだと表示→
文字エンコーディング→Unicode(UTF-8)にチェックを入れると
切り替わるのですが、Mewは使ったことがないのでどのように
設定するか(設定できるのか)分かりません。


On Thu, 11 Jan 2024 23:37:56 +0900 (JST)
Kazumaro Aoki <ka@flu.if0.org> wrote:

> 青木@名古屋さん
>   和麻呂です
> 
> 早速の助言ありがとうございます。
> 
> handbook 26.6節を要約すると
>   古いsource tree# etcupdate extract
> 新しいsource tree# make installkernel
>   reboot
> 新しいsource tree# etcupdate -p
> 新しいsource tree# make installworld
> 新しいsource tree# etcupdate -B
>   reboot
> というように見えますが、助言頂いたのだと、etcupdateの-B optionをつける
> のがetcupdate extractの方で、本番(?)の方では、なし、ということでしょう
> か。
> 
> etcupdateのonline manualを見てもイマイチ-B optionの挙動がわかっていな
> いので気になっています。

「-B」オプションは自動生成されるファイルをいちいち生成し直さず
srcツリー内で生成済のものをそのまま使う指定で、例えばsendmailの
cfファイルのようなものを想定したものですので、特殊な場合以外は
何も考えずに付けて大丈夫な筈のものです。 私としては、そのあたりの
デフォルトを検討する必要のある開発者がヤラレタ!とならないために
わざわざ指定しなければならなくしてあるセーフティかな、と思っています。
例外は、シャドウパスワードのように「データベースを生成するもの」です。

もうお気づきと思いますが、最期の部分で付けていなかったのはただの
付け忘れです。 申し訳ありません。


> もう一点、git cloneで/usr/srcを取ってきたのですが、FreeBSD ID stringと
> 思われるものが
>   $FreeBSD$
> というように書いてあり、
>   $FreeBSD: releng/12.4/etc/login.access 130151 2004-06-06 11:46:29Z schweikh $
> といった形式より短いのが気になっていて、これが-F optionをつけた時に悪
> さをしているのかなぁと思ったりもしています。

これは、元々は最古のバージョン管理システムSCCSやRCSで使われて
いたものの名残で、短い形式でソースに書かれているとシステム側で
何に対していつ誰が更新したものかに展開されて長い形式に化けます。
現在FreeBSDが使用しているgitでは基本的に使わないようなので、
順次ソースから削除されていっています。

で、先の投稿で話題にされていた「-F」オプションはこれが違っても
他の部分が一致していれば同じと看做せ、という指定です。
これがきっちり展開されていた頃には極めて有用でした。
例えばmainブランチ(旧来でいうcurrent)の/usr/src/Makefileの
履歴だと、[1]で削除されています。

[1]
https://cgit.freebsd.org/src/commit/Makefile?id=d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf


> varmfsは使ってません。ただ、/var/db/etcupdateの存在には気がついたので
> すが、そこを見ても以前の/etcは見当たりませんでした。

etcupdateは、通常時の動作では、デフォルトのディレクトリ構成だと
「-p」オプション無しでは
 ・/var/db/etcupdate/old以下を削除し、
 ・/var/db/etcupdate/current以下の内容を/var/db/etcupdate/old
  以下に移動し、
 ・/usr/src以下から/var/db/etcupdate/current以下に入れるべき
  ものを抽出して構築し、
 ・/etc以下との3wayマージを行う
という処理をしている筈です。 「-p」付きだとテンポラリの作業用
ディレクトリを作ってoldやcurrentはノータッチのまま、/etc/groupと
/etc/master.passwdの処理だけ行う形です。 これが更新されるべき
なのにされていない状態でinstallworldを行うと、新規追加されたり
group/ownerが変更されたりしたファイルで設定すべきグループや
ユーザが存在しないという笑えない状態になってしまいますので
特別扱いされています。 つまり、これら2つのファイルの更新時は
「-p」ありと無しの2回、処理が必要になってしまう訳です。

当然ながら初めて実行するときは/var/db/etcupdate/current自体
まだ存在しないので、必要なディレクトリ構造を作成して既存の
/usr/srcからこれを構築するのが`etcupdate extract`です。

なお、etcupdataには「-n」オプションでDRY-RUNを行う機能があるので、
本番の前に確認しておくのがお薦めです。

# 一時期このオプションが壊れていてツリーのローテーションは
# するのに実際の更新はしないという挙動になっていてこれを
# やってしまうと実際の更新が処理されない悲惨な状態でしたが
# バグレポートして直して貰っていますので今は大丈夫です。

ちなみにetcupdateの正体は/usr/sbin/etcupdateというシェルスクリプト
なので、余裕があれば読んでみると参考になるかもしれません。
私はなかなか読み切れていませんが...。


> なお、viはあんまり得意ではありませんが使えますし、3-way mergeも30年ほ
> ど前になりますが、PVCSとかいう感じの名前のものを使ったことがあるのでわ
> かりますので大丈夫です。

最近だと、FreeBSD以外でもgitでお目にかかることがあるかと思います。
私はbugzillaなりPhablicatorなりに上がっているパッチを当てていて、
気づかないうちに更新されたものがコミットされてconflict状態に
なっていて慌てることが結構あって見慣れてしまいました。

> ただ、etcupdateで「C」つきのが出てきた時がconflictだという認識がなかっ
> たので、最初はetcupdate resolveを忘れていましたが、とりあえずetcupdate
> のあとにいつでもetcupdate resolveすれば、conflictがあろうとなかろうと
> うまくいくという理解です。
> 
> 青木和麻呂
> 
> 
> 【以下、全文引用】
> From: Tomoaki AOKI <junchoon@dec.sakura.ne.jp>
> Subject: Re: how to use etcupdate?
> Date: Thu, 11 Jan 2024 18:47:44 +0900
> 
> > 青木@名古屋です。
> > 
> > 今更ですが、基本、etcupdateは、初めて使う場合、
> >  ・srcツリーの【更新前】に`etcupdate extract -B`で
> >   比較対象用のツリーを構築
> >  ・srcツリー更新・リビルド・`make installkernel`後、
> >   `etcpudate -p`
> >  ・シングルユーザで再起動後(ZFS関連の更新だと再起動
> >   せず`shutdown now`でシングルユーザに落ちるだけで
> >   処理する必要があるケースも)、`make installworld`後、
> >   `etcupdate -B`で残りを更新。 `make delete-old`を
> >   やるならそちらを先に。 `make delete-old-libs`は
> >   最後の最後、ports等も含めて古いライブラリを使うものが
> >   何も無くなったと確認できた後で。
> > 
> > でだいたいうまくいきますが、"C"マークの付いたアイテム
> > (srcでの変更とローカル設定での変更が衝突)があると
> > 手動での取捨選択が必要になります。 forums.freebsd.orgの
> > 方で、rootのEDITOR環境変数が未設定の場合のデフォルトがvi
> > だったこともあって、特にviに不慣れな人たち中心に阿鼻叫喚の
> > 地獄絵図が。 3ways mergeの扱いがわからないのに加えてviの
> > 操作も分からないという2重苦が蔓延してました。
> > 
> > 和麻呂さん(どちらも青木で紛らわしいので(^^;)の場合、
> > srcの更新前(前のsrcツリーを更新したんですよね?)に
> > 比較用のツリーを用意されているようなので問題なさそうですが、
> > 念の為、varmfs環境ではありませんよね?
> > etcupdateはデフォルトで作業用データを/var/db/etcupdate以下に
> > 構築・保存するので、varmfsな環境だと再起動時に消滅して
> > しまいますので。
> > 
> > 私の場合、etcupdateが初めてsrcに取り込まれてすぐの更新で
> > いきなり試して、最初のステップを演っていなかったため
> > ドツボに嵌まった経験があります。 確か、etcupdateの作業用
> > データ保存先を必死に探して消去し、一旦srcツリーをsvnliteで
> > 強制的に更新前の状態に戻して最初のステップをやり直して
> > 強引に処理したかと思います。
> > 
> > 12月あたりからのforumsの関係しそうなスレッドはこの辺でしょうか。
> > あくまで私が何らかのアクションを行ってWatched threadsにリスト
> > される範囲ですが。 確か、まだあったと思います。
> > 
> >  https://forums.freebsd.org/threads/14-0-release-conflicts-in-etc-passwd-results-in-losing-root.91124/
> > 
> >  https://forums.freebsd.org/threads/14-0-release-upgrade-question-merge-conflict-markers-remain.91079/
> > 
> > 
> > On Thu, 11 Jan 2024 15:00:26 +0900 (JST)
> > Kazumaro Aoki <ka@flu.if0.org> wrote:
> > 
> >> 青木@藤沢市在住です
> >> 
> >> 12RのEoLと前後していくつかの12Rを13Rにupgradeしました。
> >> やってないだけではあるのですがbinary updateは経験がないので、source
> >> treeからのmake installworldです。
> >> 
> >> また、mergemasterは13Rでなくなって14Rからの標準ということもきき、その
> >> 練習を兼ねてhandbook chapter 26.6を見ながら実施しました。
> >> 
> >> まずは、
> >>   etcupdate extract
> >> して、sourceをgitで取りだし、make buildkernel buildworldしました。
> >> 次にmake installkernelして、
> >>   etcupdate -F -p
> >> を実行したところCつきのファイルが出たPCでは次の
> >>   etcupdate resolve
> >> で修正しました。次にmake installworldして、
> >>   etcupdate -F -B
> >> したら、かなりの/etcのファイルが0バイトんなってしまって、困ってます。
> >> 
> >> handbookの方ではetcupdateの-F optionは書いていなかったのではありますが、
> >> online manualを見る限りmergemasterと同じように作業負荷を減らしてくれそ
> >> うに思いつけてみました。これがまずかったのでしょうか?
> >> 
> >> 青木和麻呂 @ 藤沢市在住
> >> 
> > 
> > 
> > -- 
> > 青木 知明  [Tomoaki AOKI]    <junchoon@dec.sakura.ne.jp>

-- 
青木 知明  [Tomoaki AOKI]    <junchoon@dec.sakura.ne.jp>