Solaris サーバ設定を構成管理
パーツの組み上げ/OpenSolaris インストールも無事完了。OpenSolaris Live CD の ISO イメージの容量が、手元にあった 640M CD-R メディアには収まらなくて、Blu-Ray への移行が進んでいるというご時勢に新品の 720MB CD-R メディアを買い足したことを、「無事」の範疇に含めるならなのだけど。
サーバ稼動させる上での諸々の設定経緯を記録すべく、まずは /etc 配下の Mercurial リポジトリ化を。beadm とか zfs snapshot とかでも設定前状態の保存は可能だけど、試行錯誤の差分を見るにはやっぱり構成管理ツールの出番でしょ。
とりあえず:
- symbolic link ファイルは除外
- hard link カウントが 2 以上のものは手動で hg add
という方針を立てる。Mercurial は symbolic link の管理にも対応しているけど、まぁ、気分の問題ということで。
/etc 直下で hg init したならば、最初に以下の手順で通常ファイルの hg add を実施。
$ cat /tmp/ignore ^./\.hg/ ^./dev/ ^./devices/ ^./saf/zsmon/ ^./svc/ ^./zfs/zpool.cache $ find . -type f -printf '%n %h/%f\n' |\ grep '^1 ' |\ sed 's/^1 //g' |\ grep -v -f /tmp/ignore |\ xargs hg add
上記の /tmp/ignore ファイルの内容の多くに関しては、実は当初から判明していたものではなく、事後のサービス有効化/無効化における更新差分を見て反映させたもの。ま、時系列に沿って書いてもしょうがないしね。
どうやらデカいファイルがあるらしく以下の警告が出るので、notices/LICENSE は hg revert で追加対象から除外しておく。
notices/LICENSE: files over 10MB may cause memory and performance problems (use 'hg revert notices/LICENSE' to unadd the file)
次に、シンボリックリンクに hg status が反応しないように、以下の要領で .hgignore ファイルを作成。
$ find . -type l | sed 's@^\./@@g' > .hgignore
.hgignore の冒頭に "syntax:glob" の追加を忘れずに。
sed による変換の一手間をかけているのは、単に手馴れた Emacs がまだ入っていないので、ファイル名冒頭の "./" 除外を vi とかでゴリゴリ修正するのが面倒だったからで、特に深い意味は無い。
$ hg add .hgignore $ hg status
わらわらと未知(u:unknown)ファイルが列挙されるので、後は個別に対応を。ハードリンクファイルの対応もこの段階で。
そういえば、/etc/rcN.d/ 配下のファイルって、Linux だとシンボリックリンク(最近のは違うのか?)だったけど、Solaris はハードリンクなのね。どちらにしても、/etc/init.d 側だけは hg add しておこう。
結局、冒頭の /tmp/ignore の内容も含めて、以下のエントリを .hgignore へ手動追加。
syntax: re ^rc[0-9S]\.d/ ^dev/ ^devices/ ^saf/zsmon/ ^svc/ ^zfs/zpool.cache
hg status の u(unknown) 出力が妥当なところに落ち着いたなら、hg commit でまずは初期リビジョンを確定。ちなみに現在の hg status 出力は:
$ hg status ? certs/SUNWObjectCA ? crypto/certs/SUNWObjectCA ? inet/secret/wifiwepkey ? inet/wifi ? mnttab ? notices/LICENSE
mnttab は別ファイルシステムになっているので、これは意図的に無視。マウント情報がこのような扱いを受けているのは、ZONE や ZFS でのカーネル連携の際に、通常ファイルを改変するよりも、カーネルモジュール内で諸々の調停を完了した結果(多分 on memory な内容)をファイルとして見せる=特別なファイルシステムを経由する方が、整合性維持等の面で妥当だと判断したのだと思う。