私的サーバー構築日誌：Subversionをインストールして /etc をバージョン管理・Ubuntu 24.04 LTS in MicroServer N54L

## 能書き

[私的サーバー構築日誌：仕切り直し](https://qiita.com/katz_engineer/items/1f21de2bd9072c260ae6)からの自宅サーバー構築の続きです。

[MicroServer N54L に Ubuntu24.04LTS をインストールしてZFSで使うように設定した我が家のファイルサーバ](https://qiita.com/katz_engineer/items/bd96a26e0a65ceb28ff7)ですが、[前回](https://qiita.com/katz_engineer/items/5581bbb94874020138d9)はHDDの内の1台を交換しました。

さあここからだ！となる前に、`/etc`をバージョン管理します。但し私の個人的な好みで、GitではなくSubversionを使います。その為etckeeperは使いません。

[既に何度か同じ内容の記事を書いています](https://qiita.com/katz_engineer/items/3e743263a878df2b8aef)が、私の作業記録という事で。

## 目標

[我が家のファイルサーバ MicroServer N54L](https://qiita.com/katz_engineer/items/bd96a26e0a65ceb28ff7)の`/etc`をSubversionでバージョン管理できるように設定し、最初のコミットを実行します。

## 参考文献

- [私的サーバー構築日誌：Subversionをインストールして /etc をバージョン管理・Ubuntu 22.04](https://qiita.com/katz_engineer/items/3e743263a878df2b8aef)

`/etc`のバージョン管理とは関係ありませんが、もし`xmllist`コマンドがあればSubversionのログを自由に操作できます。

- [確認 - 俺様サーバー構築記 - Subversionサーバーの構築@デスクトップパソコン - Qiita](https://qiita.com/katz_engineer/items/b893316b4d1bb7731e87#%E7%A2%BA%E8%AA%8D)
- [確認 - 俺様サーバー構築記 - Subversionをインストールして /etc をバージョン管理@全機 - Qiita](https://qiita.com/katz_engineer/items/29bb4672f69e70944a80#%E7%A2%BA%E8%AA%8D)

## 準備

### システムのアップデート

`apt`コマンドのリポジトリuniverseを追加します。

```console
sudo apt-add-repository universe
```

この時、続行するなら[ENTER]を押せ、との表示が出ます。素直にEnterキーを押します。

```console
$ sudo apt-add-repository universe
Adding component(s) 'universe' to all repositories.
Press [ENTER] to continue or Ctrl-c to cancel.
```

そしてパッケージ関連の更新など。

```console
sudo apt update
```

```console
sudo apt upgrade
```

## Subversionインストール

### パッケージ

svnパッケージをインストール。

```console
sudo apt install -y subversion
```

インストールできたか確認します。

```console
svn --version | head -n2
```

表示内容は、例えば下記のようになります。

```console
$ svn --version | head -n2
svn, version 1.14.3 (r1914484)
   compiled Apr  1 2024, 04:55:49 on x86_64-pc-linux-gnu
```

Subversionのバージョンは1.14.3になりました。そして`man svn`も`info svn`も、公式ページでも、[レッドブック](http://svnbook.red-bean.com/)を読めと書いてありました。

### リポジトリ

今回はとにかく`/etc`のバージョン管理を開始するのが目標ですので、汎用的なプロジェクト用の設定は後日とします。

- Subversion操作用ユーザは作成しません。`/etc`バージョン管理はrootが行います。
- 汎用リポジトリの場所も用意しません。

汎用ではなく`/etc`の為のリポジトリの場所は、`/etc/.svn_repo`とします。

当然、svnの管理対象外とする設定を忘れてはなりません。その手順は後述。

```console
sudo mkdir /etc/.svn_repo
```

```console
sudo svnadmin create /etc/.svn_repo/
```

## `/etc`を作業コピーにする

```console
cd /tmp
mkdir etc
sudo svn import etc file:///etc/.svn_repo/ -m "create project"
```

```console
rmdir etc
sudo svn co file:///etc/.svn_repo/ /etc
```

ちゃんと出来たか確認。

```console
ls -dl /etc/.svn
```

`/etc/.svn`ディレクトリが出来ていればOKです。例えば下記のように表示されればOK。

```console
$ ls -dl /etc/.svn
drwxr-xr-x 4 root root 4096 Nov 28 20:33 /etc/.svn
```

## バージョン管理

### 最初の一歩

※[以前](https://qiita.com/katz_engineer/items/3e743263a878df2b8aef#%E6%9C%80%E5%88%9D%E3%81%AE%E4%B8%80%E6%AD%A9)問題を起こしていたファイル`/etc/ssl/certs/NetLock*`は、今は問題無く処理できるようになったようです。

```console
cd /etc
sudo svn add *
```

```console
sudo ls *- | sudo xargs -rt svn revert
```

`svn revert`の結果は下記のように表示されます。

```console
$ 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管理から外したファイルを確認してみます。

```console
sudo svn st --no-ignore | grep -E "^(\?|I)"
```

結果は下記の通り。

```console
$ sudo svn st --no-ignore | grep -E "^(\?|I)"
?       .pwd.lock
?       .resolv.conf.systemd-resolved.bak
?       .svn_repo
?       .updated
?       group-
?       gshadow-
?       passwd-
?       shadow-
?       subgid-
?       subuid-
```

`.pwd.lock` については[以前調べました](https://qiita.com/katz_engineer/items/c9afdcb0e2355ed67ede#etc-%E7%AE%A1%E7%90%86%E9%96%8B%E5%A7%8B)。バージョン管理は不要です。どうも更新時に設定されるロックファイルらしい。という訳で無視します。

さて、最初のcommitです。コミットメッセージは何でも良いんですが。

```console
sudo svn ci -m "first commit"
```

どういう訳か部分的にリビジョン不一致を起こす模様。そのため下記コマンドも実行します。

```console
sudo svn up /etc
```

### 確認

ログを表示させてみます。

```console
sudo svn log /etc
```

こんな風に表示されます。

```console
$ sudo svn log /etc
------------------------------------------------------------------------
r1 | root | 2024-11-28 20:39:17 +0900 (Thu, 28 Nov 2024) | 1 line

first commit
------------------------------------------------------------------------
```

余談ですが、`xmllint`コマンドがあれば、`--xml`オプションと組み合わせて色んな値を抽出する事が出来ます。`head`とか`sed`とかを組み合わせてビクビクしながら調整する必要はありません。が、現状ではインストールされていませんので、参考文献を示すだけにしておきます（参考文献の章を参照）

### 無視ファイル

現時点でSubversion管理下に無いファイルは、すべて無視ファイルとして登録します。

```console
sudo bash -c "svn propset svn:ignore -F <(svn st | cut -b9-) ."
```

状態を確認します。

```console
$ cd /etc
$ sudo svn st
 M      .
$ sudo svn di
Index: .
===================================================================
--- .   (revision 1)
+++ .   (working copy)

Property changes on: .
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,10 ##
+.pwd.lock
+.resolv.conf.systemd-resolved.bak
+.svn_repo
+.updated
+group-
+gshadow-
+passwd-
+shadow-
+subgid-
+subuid-
```

これも`/etc`の変更ですのでcommitします。

```console
sudo svn ci -m"set svn:ignore"
```

```console
sudo svn up /etc
```

## 仕舞い

これで`/etc`をバージョン管理できるようになりました。個人的な好みでSubversionですが。もしgitを使いたい方は、素直にetckeeperを使用した方がよろしいでしょう。私はこれで行きます。