NetBSD-currentのインストールをスクリプトで楽にしてみる

[NetBSD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/netbsd) 3日目の記事です。今日はNetBSD-currentのインストールを少しだけ楽にする方法を紹介しようと思います。

## NetBSD-currentのインストール

[昨日の記事](https://qiita.com/furandon_pig/items/6373fdf0bd7995f0fcee)ではNetBSD-currentのインストール手順を紹介していました。基本的にはNetBSD-currentの配布物のダウンロードと展開ののち、 `/etc` を更新するというシンプルな手順ですが、手動で行おうとすると思いのほか煩雑です。加えて、NetBSD-currentは頻繁(2,3日間隔くらい)にビルドされ、成果物がアップロードされるため、できるだけ楽な手順でNetBSD-currentのインストールを行えるようにしておきたいところです。

## スクリプト化して楽をする

楽な手順にするアプローチは単純な話で、同じような手順を流す個所はスクリプト化してしまうというものです。今回のケースだと、NetBSD-currnetの配布物ダウンロードと展開部分をスクリプト化する形になります。

### NetBSD-current配布物のダウンロードスクリプト

NetBSD-current配布物のダウンロードスクリプトは以下になります。スクリプト実行時点での最新ビルドを判別して配布物をダウンロードします。

https://gist.github.com/furandon-pig/75cea66c637dd7001add1e33d9ee0f68

以下のような感じで実行します。この例では12/2にビルドされた成果物をダウンロードしています。

```sh
# ./download-current-release.sh
[Sun Dec  3 17:14:58 JST 2023] download directory: 02-Dec-2023_1429
[Sun Dec  3 17:14:58 JST 2023] download kern-GENERIC.tar.xz...
[Sun Dec  3 17:15:09 JST 2023] download base.tar.xz...
[Sun Dec  3 17:16:01 JST 2023] download comp.tar.xz...
[Sun Dec  3 17:17:36 JST 2023] download etc.tar.xz...
[Sun Dec  3 17:17:40 JST 2023] download man.tar.xz...
[Sun Dec  3 17:17:51 JST 2023] download modules.tar.xz...
[Sun Dec  3 17:18:03 JST 2023] download misc.tar.xz...
[Sun Dec  3 17:18:11 JST 2023] download MD5...
```

### NetBSD-current配布物の展開スクリプト

NetBSD-current配布物を展開するスクリプトは以下になります。配布物を含んだディレクトリを指定し、その中にあるファイルを順次展開するという動作になっています。

https://gist.github.com/furandon-pig/db56ababde6425010427d3e9bc7b6d0a

以下のような感じで実行します。スクリプトで展開されるのはユーザランドの配布物であり、配布物にふくまれるカーネルはあらかじめ手動で展開・カーネルの置き換えと再起動を行っておく必要があります。

```sh
# cd 02-Dec-2023_1429
# ls -l
total 152386
-rw-r--r--  1 root  wheel      1223 Dec  3 17:18 MD5
-rw-r--r--  1 root  wheel  49279876 Dec  3 17:16 base.tar.xz
-rw-r--r--  1 root  wheel  75252784 Dec  3 17:17 comp.tar.xz
-rw-r--r--  1 root  wheel    508248 Dec  3 17:17 etc.tar.xz
-rw-r--r--  1 root  wheel   8870808 Dec  3 17:15 kern-GENERIC.tar.xz
-rw-r--r--  1 root  wheel   7849744 Dec  3 17:17 man.tar.xz
-rw-r--r--  1 root  wheel   4150676 Dec  3 17:18 misc.tar.xz
-rw-r--r--  1 root  wheel   9856792 Dec  3 17:18 modules.tar.xz
#
# # 配布物に含まれるカーネルは手動で展開・ファイルコピーしておく。
# tar Jxvf kern-GENERIC.tar.xz
x ./netbsd
# ls -lh netbsd
-rwxr-xr-x  1 root  wheel   28M Dec  2 08:56 netbsd
#
# cp /netbsd /netbsd.old
# cp netbsd /netbsd  # カーネルの置き換え。
#
# # 置き換えたカーネルに切り替えるため、いったん再起動する。
# shutdown -r now
```

再起動後に上記のスクリプトを実行します。ユーザランドの配布物の展開・インストールと `/etc` のチェック・自動更新が行われます。

```sh
# time ./install-current-release.sh -d 02-Dec-2023_1429
[Sun Dec  3 17:39:31 JST 2023] extract base.tar.xz...
[Sun Dec  3 17:39:54 JST 2023] extract comp.tar.xz...
[Sun Dec  3 17:41:00 JST 2023] extract man.tar.xz...
[Sun Dec  3 17:41:08 JST 2023] extract misc.tar.xz...
[Sun Dec  3 17:41:09 JST 2023] extract modules.tar.xz...
[Sun Dec  3 17:41:11 JST 2023] /usr/sbin/postinstall -s etc.tar.xz check
...
[Sun Dec  3 17:41:24 JST 2023] /usr/sbin/postinstall -s etc.tar.xz fix
...
Please execute 'etcupdate' and reboot.

# # /usr/sbin/etcupdate -s ~/etc.tgz
# # shutdown -r now
```

`etcupdate` は対話的に実行する必要があるため、この部分は手動で実行します。 `/etc` の更新手順については[昨日の記事](https://qiita.com/furandon_pig/items/6373fdf0bd7995f0fcee#etc%E3%81%AE%E6%9B%B4%E6%96%B0)にて解説しています。

```sh
# /usr/sbin/etcupdate -s 02-Dec-2023_1429/etc.tar.xz
```

`/etc` の更新が完了したら再起動し、NetBSD-currentのインストールは完了です。

```sh
# shutdown -r now
```

## まとめ

NetBSD-currentのインストールをスクリプトで少しだけ楽にしてみました。 `/etc` の更新まではスクリプト化できませんでしたが、NetBSD-currentを頻繁にインストールする際の手間をだいぶ減らすことができました。