俺様サーバー構築記 - パッケージインストール時の手順@ノートパソコン

「[俺様サーバー構築記 - 基本方針](https://qiita.com/katz_engineer/items/dbabcff4e14e9db2b10f)」以来構築を続けてきた俺様パソコン環境ですが、[/etc の管理機能](https://qiita.com/katz_engineer/items/c9afdcb0e2355ed67ede)を追加した結果、パッケージの追加手順が若干複雑になってきました。ここらできちっと手順をまとめておきます。

# 手順詳細

## 事例

例として取り上げるパッケージは dnsutils です。ちょっとした家庭内事情で ```nslookup``` を使おうと思ったら、ArchLinux ではオプション扱いだったんですね… 恐ろしい事に ArchWiki で ```nslookup``` を検索してもヒットしないんですよ…

参考文献：[nslookupコマンドがない！？ - Arch Linux まとめ](https://archlinux.hatenadiary.org/entry/20091017/1255764645)

## ユーザ

以下の手順はすべて root で実施します。

## zfs スナップショット

まずは zfs でスナップショットを撮ります。これは省略しても問題ありませんが、万が一の為に。

```console
# zfs snapshot tank/main@$(date +%Y%m%d_%H%M%S)_before_dnsutils
```

結果を確認したい時には下記が良いでしょう。余計な情報を遮断できます。

```console
# zfs list -t snapshot -o name -S name | head -n2
NAME
tank/main@20190824_181828_before_dnsutils
```

## インストール

次にパッケージのインストール。

オプション ```--noconfirm --noprogressbar``` は付けない方がいいでしょう。付ければ問い合わせ「インストールを行いますか？」は自動的に y 扱いだし、進捗表示も無くなります。エビデンスなどの為に標準出力をリダイレクトするような場合には非常に便利です。しかし更新 ```pacman -Syu``` ならともかくパッケージインストール時には、念のため様子を見ながら進められるようにしておいた方が無難だと私は考えます。

例えば依存パッケージが想定以上に多かった場合など、中断させる必要は無いですか？とまぁそういうリスク判断です。

```console
# pacman -S dnsutils
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (5) dnssec-anchors-20190629-1  geoip-1.6.12-1  geoip-database-20180403-1  lmdb-0.9.24-1  bind-tools-9.14.4-1

合計ダウンロード容量:   2.94 MiB
合計インストール容量:  10.06 MiB

:: インストールを行いますか？ [Y/n] y
:: パッケージを取得します...
 dnssec-anchors-20190629-1-any                      3.6 KiB  0.00B/s 00:00 [##########################################] 100%
 geoip-database-20180403-1-any                   1195.2 KiB  4.12M/s 00:00 [##########################################] 100%
 geoip-1.6.12-1-x86_64                             74.8 KiB   255K/s 00:00 [##########################################] 100%
 lmdb-0.9.24-1-x86_64                              83.9 KiB  1332K/s 00:00 [##########################################] 100%
 bind-tools-9.14.4-1-x86_64                      1649.7 KiB  2.79M/s 00:01 [##########################################] 100%
(5/5) キーリングのキーを確認                                               [##########################################] 100%
(5/5) パッケージの整合性をチェック                                         [##########################################] 100%
(5/5) パッケージファイルのロード                                           [##########################################] 100%
(5/5) ファイルの衝突をチェック                                             [##########################################] 100%
(5/5) 空き容量を確認                                                       [##########################################] 100%
:: パッケージの変更を処理しています...
(1/5) インストール geoip-database                                          [##########################################] 100%
(2/5) インストール geoip                                                   [##########################################] 100%
geoip の提案パッケージ
    geoip-database-extra: city/ASN databases (not needed for country lookups)
(3/5) インストール dnssec-anchors                                          [##########################################] 100%
(4/5) インストール lmdb                                                    [##########################################] 100%
(5/5) インストール bind-tools                                              [##########################################] 100%
:: トランザクション後のフックを実行...
(1/1) Arming ConditionNeedsUpdate...
```

## ```/etc``` 管理

最後に ```/etc``` の Subversion 管理です。

```/etc``` に変化があるか確認します。

```console
# svn st /etc
?       /etc/bind.keys
M       /etc/ld.so.cache
?       /etc/trusted-key.key
```

追加や削除のファイルがあるなら、対応するコマンドを実行します。今回のように2ファイル程度なら手作業で指定しても良いでしょう。沢山あるなら自動化しましょう、下記のように。

念のため削除も示しておきますが、該当ファイルが無ければ実行は不要です。仮に実行してしまっても無害ですが。

```console
# svn st /etc | grep "^?" | cut -b9- | xargs -r svn add
A         /etc/bind.keys
A         /etc/trusted-key.key
# svn st /etc | grep "^!" | cut -b9- | xargs -r svn rm
```

そして commit 。適当なコミットメッセージを付けましょう。日本語でも大丈夫ですが、個人的な好みで英語にしています。サーバも巻き込むプロジェクトでは半角文字だけにしておく方が無難という経験則がありまして。Nanchatte-English ですけども:sweat_smile:

```console
# svn ci /etc -m"install the package dnsutils for nslookup"
追加しています              etc/bind.keys
送信しています              etc/ld.so.cache
追加しています              etc/trusted-key.key
ファイルのデータを送信しています ...done
Committing transaction...
リビジョン 19 をコミットしました。
```

結果の確認方法。XML でログ表示すれば ```xmllint``` コマンドを通した加工が可能になります。何らかの情報をログから抽出する場合には便利でしょう。

```console
# svn log /etc -rHEAD
------------------------------------------------------------------------
r19 | root_akiho | 2019-08-24 18:43:20 +0900 (2019年08月24日 (土)) | 1 line

install the package dnsutils for nslookup
------------------------------------------------------------------------
# svn log /etc -rHEAD --xml
<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry
   revision="19">
<author>root_akiho</author>
<date>2019-08-24T09:43:20.075756Z</date>
<msg>install the package dnsutils for nslookup</msg>
</logentry>
</log>
```

# 以上

基本的な手順は以上ですが、まだ足りない話なんかも幾つかあります。問題発生時の対応など。それについては、実際に対処した場合に追記する予定です。

とは言え大抵はこの手順通りでイケるでしょう。今まで積み上げてきた諸々の苦労(?)との整合性を取りつつパッケージ管理できます。やったね:thumbsup_tone2: