0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

自宅サーバー構築譚:Subversionをインストールして /etc をバージョン管理・Ubuntu 22.04

Last updated at Posted at 2023-01-03

能書き

自宅サーバー構築譚:基本構想に基づく自宅サーバー構築、Ubuntu22.04LTSインストールの続きです。

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

以前も同じ内容を書きましたが、22.04になってどうも勝手が変わったようなので、改めて記事を立てます。

準備

前回の続きなので、実機のコンソールにrootでログインします。

システムのアップデート

何はともあれスナップショット。これを気軽に実行できるのが zfs (及び btrfs )の素晴らしい点です。そしてシステム全体のスナップショットを撮っておけば、何かあってもすぐに復旧できます。

ちなみに、システム関連なので対象は tank/ROOT/ubuntu だけです。それ以外については除外します。

zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_universe
zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_universe
zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(date +%Y%m%d_%H%M%S)_before_universe

しかし前回のままではapt-add-repositoryコマンドは使えない模様。そんな時には下記コマンド、だそうです。

参考文献: Ubuntu Linuxで、add-apt-repositoryしようとして「コマンドがない」って言われたら - CLOVER

apt install --yes software-properties-common
apt update

リポジトリuniverseを追加します。

apt-add-repository universe

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

apt update
apt upgrade

パッケージインストール前のスナップショット

スナップショットはガンガン撮りまくりましょう!HDDの逼迫は心配無用。内部的には差分管理と同じ形になっているので、そんなに消費しません。それでも問題になったら、その時に古いのを削除すればいいんです。

zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_Subversion
zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_Subversion
zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(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@20221228_170030_before_Subversion     0B      -     1.00G  -
tank/ROOT/ubuntu@20221228_165740_before_universe     288K      -     1013M  -

Subversionインストール

パッケージ

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

apt install --yes subversion

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

svn --version | head -n2

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

# svn --version | head -n2
svn, version 1.14.1 (r1886195)
   compiled May 21 2021, 10:52:35 on x86_64-pc-linux-gnu

Subversion のバージョンは 1.14.1 ですか。何が変わったんでしょうね。少なくともレッドブックは……役に立たないとは言わないけど、細かい部分でかなり変わったんじゃないかと思うんだけど。思うんだけど!この手順ではman svninfo svn も表示されない… :sweat:

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

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

なお、失敗した場合のロールバックの方法については以前の記事を参照して下さい。

リポジトリ

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

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

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

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

mkdir /etc/.svn_repo
svnadmin create /etc/.svn_repo/

/etcを作業コピーにする

cd /tmp
mkdir etc
svn import etc file:///etc/.svn_repo/ -m "create project"
rmdir etc
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 Dec 28 17:07 /etc/.svn

バージョン管理

最初の一歩

ちょっと面倒な事になっています。

どうもOpenSSLがデフォルトでインストールされていて、その関係でしょうか、/etc/ssl/certsディレクトリにルート証明書が既に沢山入っているのです。それだけなら良いんですが、1つだけ、ファイル名がUTF-8に変換できないとかいうとんでもないファイルがあります。

# 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で処理できなくなります。

仕方が無いので削除してしまいます。

rm /etc/ssl/certs/NetLock*
ls /etc/ssl/certs/*.0 | while read f; do echo -n $f$'\t'; readlink $f; done | grep NetLock | cut -f 1 | xargs -rt rm
sed -i -e"/NetLock/d" /etc/ca-certificates.conf.dpkg-old /etc/ca-certificates.conf

後は普通に登録します。

cd /etc
svn add *
ls *- | xargs -rt svn revert

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

※ 2023/04/22 いつの間にか除外ファイルが追加されるようになっていましたので、念の為に追記しておきます。

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

# svn st --no-ignore | grep -E "^(\?|I)"
?       .pwd.lock
?       .svn_repo
?       group-
?       gshadow-
?       passwd-
?       shadow-
?       subgid-
?       subuid-

.pwd.lock については以前調べました。バージョン管理は不要です。どうも更新時に設定されるロックファイルらしい。という訳で無視します。

参考文献: Re: What is /etc/.pwd.lock for ? - debian-user Jul 2005 by thread

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

svn ci -m "first commit"

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

svn up /etc

確認

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

# svn log /etc
------------------------------------------------------------------------
r1 | root | 2023-01-03 14:36:56 +0900 (Tue, 03 Jan 2023) | 1 line

first commit
------------------------------------------------------------------------

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

参考文献1: 俺様サーバー構築記 - Subversionサーバーの構築@デスクトップパソコン
参考文献2: 俺様サーバー構築記 - Subversionをインストールして /etc をバージョン管理@全機

無視ファイル

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

svn propset svn:ignore -F <(svn st | cut -b9-) .

状態を確認します。

# cd /etc
# svn st
 M      .
# svn di
Index: .
=================================================
--- .       (revision 1)
+++ .       (working copy)

Property changes on: .
_________________________________________________
Added: svn:ignore
## -0,0 +1,6 ##
+.pwd.lock
+.svn_repo
+group-
+gshadow-
+passwd-
+shadow-

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

svn ci -m"set svn:ignore"

これで/etcをバージョン管理できるようになりました。個人的な好みでSubversionですが。
やったね:thumbsup_tone1:

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?