能書き
私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。
/etc
をバージョン管理します。但し私の個人的な好みで、GitではなくSubversionを使います。その為etckeeperは使いません。
既に何度か似たような内容を書いていますが、個人的な備忘の都合で、今回の私的サーバー再構築の為に微妙な手順も全て今回に合わせて書き直します。
目標
/etc
をSubversionでバージョン管理できるように設定し、最初のコミットを実行します。
参考文献
- 自宅サーバー構築譚:Subversionをインストールして /etc をバージョン管理・Ubuntu 22.04 - Qiita
- 自宅サーバー構築譚:Subversionをインストールして /etc をバージョン管理 - Qiita
- Ubuntu Linuxで、add-apt-repositoryしようとして「コマンドがない」って言われたら - CLOVER
- Re: What is /etc/.pwd.lock for ? - debian-user Jul 2005 by thread
/etc
のバージョン管理とは関係ありませんが、もしxmllist
コマンドがあればSubversionのログを自由に操作できます。
- 確認 - 俺様サーバー構築記 - Subversionサーバーの構築@デスクトップパソコン - Qiita
- 確認 - 俺様サーバー構築記 - Subversionをインストールして /etc をバージョン管理@全機 - Qiita
準備
前回の続きなので、サーバーに管理者でログインします。
システムのアップデート
何はともあれスナップショット。これを気軽に実行できるのがzfs(及びbtrfs)の素晴らしい点です。そしてシステム全体のスナップショットを撮っておけば、何かあってもすぐに復旧できます。
sudo zfs snapshot tank/root/ubuntu@$(date +%Y%m%d_%H%M%S)_before_universe
apt
コマンドのリポジトリuniverseを追加します。
sudo apt-add-repository universe
しかし前回のままではapt-add-repository
コマンドは使えない模様。そんな時には下記コマンド、だそうです。参考文献を参照ください。
sudo apt install -y software-properties-common
sudo apt update
今度は成功するでしょう。
sudo apt-add-repository universe
この時、続行するなら[ENTER]を押せ、との表示が出ます。素直にEnterキーを押します。
$ sudo apt-add-repository universe
Adding component(s) 'universe' to all repositories.
Press [ENTER] to continue or Ctrl-c to cancel.
そしてパッケージ関連の更新など。
sudo apt update
sudo apt upgrade
パッケージインストール前のスナップショット
スナップショットはガンガン撮りまくりましょう!HDDの逼迫は心配無用。内部的には差分管理と同じ形になっているので、そんなに消費しません。それでも問題になったら、その時に古いのを削除すればいいんです。
sudo zfs snapshot tank/root/ubuntu@$(date +%Y%m%d_%H%M%S)_before_Subversion
スナップショットを確認します。さっきのアップデート前の物も一緒に見てみます。
Ubuntuはapt
のタイミングで自動的にスナップショットを撮るようで、それが鬱陶しいので、grep -v autozsys
で除外します。
zfs list -t snapshot -S name -r tank/root/ubuntu | grep -v autozsys | head -n3
オプション-S
(Sは大文字)でスナップショット名の逆順を指定しているのがミソ。名前に日時を付けているので、新しい順に表示されます。説明記事を書いたりエビデンスを揃えたりする場合に便利です。
$ zfs list -t snapshot -S name -r tank/root/ubuntu | grep -v autozsys | head -n3
NAME USED AVAIL REFER MOUNTPOINT
tank/root/ubuntu@20230816_160603_before_Subversion 156K - 1.29G -
tank/root/ubuntu@20230816_160202_before_universe 292K - 1.27G -
Subversionインストール
パッケージ
svnパッケージをインストール。
sudo apt install -y subversion
インストールできたか確認します。
svn --version | head -n2
表示内容は、例えば下記のようになります。
$ svn --version | head -n2
svn, version 1.14.1 (r1886195)
compiled May 21 2022, 10:52:35 on x86_64-pc-linux-gnu
Subversionのバージョンは1.14.1ですか。何が変わったんでしょうね。少なくともレッドブックは、役に立たないとは言わないけど、細かい部分でかなり変わったんじゃないかと思うんだけど。思うんだけど!この手順ではman svn
もinfo svn
も表示されません。
そして公式ページでは、ユーザーマニュアルはレッドブックでした。それもかなり古い。
実験的な機能は使わない方が良さそうだからまあいいか(バージョンアップで操作性や機能などが頻繁に変わるっぽい)
リポジトリ
今回はとにかく/etc
のバージョン管理を開始するのが目標ですので、汎用的なプロジェクト用の設定は後日とします。
- Subversion操作用ユーザは作成しません。
/etc
バージョン管理はrootが行います。 - 汎用リポジトリの場所も用意しません。
汎用ではなく/etc
の為のリポジトリの場所は、/etc/.svn_repo
とします。
当然、svnの管理対象外とする設定を忘れてはなりません。その手順は後述。
sudo mkdir /etc/.svn_repo
sudo svnadmin create /etc/.svn_repo/
/etc
を作業コピーにする
cd /tmp
mkdir etc
sudo svn import etc file:///etc/.svn_repo/ -m "create project"
rmdir etc
sudo svn co file:///etc/.svn_repo/ /etc
ちゃんと出来たか確認。
ls -dl /etc/.svn
/etc/.svn
ディレクトリが出来ていればOKです。例えば下記のように表示されればOK。
$ ls -dl /etc/.svn
drwxr-xr-x 4 root root 8 Aug 16 16:09 /etc/.svn
バージョン管理
最初の一歩
ちょっと面倒な事になっています。
どうもOpenSSLがデフォルトでインストールされていて、その関係でしょうか、/etc/ssl/certs
ディレクトリにルート証明書が既に沢山入っているのです。それだけなら良いんですが、1つだけ、ファイル名がUTF-8に変換できないとかいうとんでもないファイルがあります。
$ sudo ls /etc/ssl/certs/NetLock*
'/etc/ssl/certs/NetLock_Arany_=Class_Gold=_F'$'\305\221''tan'$'\303\272''s'$'\303\255''tv'$'\303\241''ny.pem'
本当の所がどうなのかは知りません。知りたいとも思いませんし。とにかくこいつがあるとSubversionで処理できなくなります。
仕方が無いので削除してしまいます。
sudo rm /etc/ssl/certs/NetLock*
sudo ls /etc/ssl/certs/*.0 | while read f; do echo -n $f$'\t'; readlink $f; done | grep NetLock | cut -f 1 | sudo xargs -rt rm
sudo sed -i -e"/NetLock/d" /etc/ca-certificates.conf.dpkg-old /etc/ca-certificates.conf
後は普通に登録します。
cd /etc
sudo svn add *
sudo ls *- | sudo xargs -rt svn revert
svn revert
の結果は下記のように表示されます。
$ sudo ls *- | sudo xargs -rt svn revert
svn revert group- gshadow- passwd- shadow- subgid- subuid-
Reverted 'group-'
Reverted 'gshadow-'
Reverted 'passwd-'
Reverted 'shadow-'
Reverted 'subgid-'
Reverted 'subuid-'
Subversion管理から外したファイルを確認してみます。
sudo svn st --no-ignore | grep -E "^(\?|I)"
結果は下記の通り。
$ sudo svn st --no-ignore | grep -E "^(\?|I)"
? .pwd.lock
? .svn_repo
? group-
? gshadow-
? passwd-
? shadow-
? subgid-
? subuid-
.pwd.lock
については以前調べました。バージョン管理は不要です。どうも更新時に設定されるロックファイルらしい。という訳で無視します。
さて、最初のcommitです。コミットメッセージは何でも良いんですが。
sudo svn ci -m "first commit"
どういう訳か部分的にリビジョン不一致を起こす模様。そのため下記コマンドも実行します。
sudo svn up /etc
確認
ログを表示させてみます。
sudo svn log /etc
こんな風に表示されます。
$ sudo svn log /etc
------------------------------------------------------------------------
r1 | root | 2023-08-16 16:14:23 +0900 (Wed, 16 Aug 2023) | 1 line
first commit
------------------------------------------------------------------------
余談ですが、xmllint
コマンドがあれば、--xml
オプションと組み合わせて色んな値を抽出する事が出来ます。head
とかsed
とかを組み合わせてビクビクしながら調整する必要はありません。が、現状ではインストールされていませんので、参考文献を示すだけにしておきます(参考文献の章を参照)。
無視ファイル
現時点でSubversion管理下に無いファイルは、すべて無視ファイルとして登録します。
sudo bash -c "svn propset svn:ignore -F <(svn st | cut -b9-) ."
状態を確認します。
$ cd /etc
$ sudo svn st
M .
$ sudo svn di
Index: .
===================================================================
--- . (revision 1)
+++ . (working copy)
Property changes on: .
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,8 ##
+.pwd.lock
+.svn_repo
+group-
+gshadow-
+passwd-
+shadow-
+subgid-
+subuid-
これも/etc
の変更ですのでcommitします。
sudo svn ci -m"set svn:ignore"
sudo svn up /etc
仕舞い
これで/etc
をバージョン管理できるようになりました。個人的な好みでSubversionですが。もしgitを使いたい方は、素直にetckeeperを使用した方がよろしいでしょう。私はこれで行きます。