LoginSignup
0
0

私的サーバー構築日誌:Subversionをインストールして /etc をバージョン管理・Ubuntu 22.04

Last updated at Posted at 2023-08-16

能書き

私的サーバー構築日誌:仕切り直しからの自宅サーバー構築の続きです。

/etcをバージョン管理します。但し私の個人的な好みで、GitではなくSubversionを使います。その為etckeeperは使いません。

既に何度か似たような内容を書いていますが、個人的な備忘の都合で、今回の私的サーバー再構築の為に微妙な手順も全て今回に合わせて書き直します。

目標

/etcをSubversionでバージョン管理できるように設定し、最初のコミットを実行します。

参考文献

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

準備

前回の続きなので、サーバーに管理者でログインします。

システムのアップデート

何はともあれスナップショット。これを気軽に実行できるのが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 svninfo svnも表示されません。:sweat:

そして公式ページでは、ユーザーマニュアルはレッドブックでした。それもかなり古い。

実験的な機能は使わない方が良さそうだからまあいいか(バージョンアップで操作性や機能などが頻繁に変わるっぽい)

リポジトリ

今回はとにかく/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を使用した方がよろしいでしょう。私はこれで行きます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0