NetBSD をアップデートする

`NetBSD 7.0` `8.0` `6.1.5P`で動かしていたPC(i386やamd64など)を
sysupgradeで`9.1`へアップデートしたときのメモでしたが、`9.3`へアップデートを行う際にダウンロード先など見直しを行いました。
下記はrootでの実行例です。
必要に応じてsudoなどつけて実行してください。

# sysupgrade インストール
```sh 
# cd /usr/pkgsrc/sysutils/sysupgrade/ ; make install
```

# sysupgrade 設定
`RELEASEDIR`を下記のような感じで編集するだけで大丈夫です。
`i386`の場合は`ARCHIVE_EXTENSION`を`tgz`にする必要があるようです。

```sh
# vi /usr/pkg/etc/sysupgrade.conf
RELEASEDIR="https://cdn.NetBSD.org/pub/NetBSD/NetBSD-9.3/$(uname -m)"
以前はftp://ftp.NetBSD.orgを利用していたのですが速度が遅いので変更です。

==> i386の場合は下記の設定も
ARCHIVE_EXTENSION=tgz
```

# sysupgrade で OS をアップデート
`sysupgrade auto` にて一発アップデートが可能ですが、
カーネルとユーザランドの更新を同時におこなうため、不具合が起きることがあります。
そのため、modulesとkernelのアップデート後、再起動をおこない、新しいカーネルで
立ち上がることを確認後、ユーザランドを更新する手順でアップデートを行います。

```sh
# sysupgrade fetch
sysupgrade: I: Downloading ftp://ftp6.jp.NetBSD.org/pub/NetBSD/NetBSD-9.1/amd64/binary/sets/base.tar.xz into /var/cache/sysupgrade
Trying [2001:240:bb8f:f::10]:21 ...
ftp: Can't connect to `2001:240:bb8f:f::10:21': No route to host
Trying 202.232.140.10:21 ...
Connected to ftp.iij.ad.jp.
....(途中省略)

==> sysupgrade: Command not found. って出ちゃう人は rehash 後にもう一度実行してみてください。
# rehash
# sysupgrade fetch
```
```sh
# sysupgrade modules
sysupgrade: I: Upgrading kernel modules
sysupgrade: I: Extracting modules into /
100% |********************|  8263 KiB    1.11 MiB/s    00:00 ETA
```
```sh
# sysupgrade kernel
sysupgrade: I: Upgrading kernel using GENERIC in /
sysupgrade: I: Backing up 'netbsd' kernel as 'onetbsd'
```
古いカーネルは`/onetbsｄ`にバックアップが取られる。

```
# reboot
```
```sh
# sysupgrade sets
sysupgrade: I: Upgrading base system
sysupgrade: I: Extracting base into /
100% |********************| 41264 KiB    1.07 MiB/s    00:00 ETA
sysupgrade: I: Extracting comp into /
100% |********************| 59332 KiB  435.85 KiB/s    00:00 ETA
sysupgrade: I: Extracting games into /
100% |********************|  2488 KiB  863.82 KiB/s    00:00 ETA
sysupgrade: I: Extracting man into /
100% |********************|  7125 KiB  144.02 KiB/s    00:00 ETA
sysupgrade: I: Extracting misc into /
100% |********************|  4133 KiB  786.05 KiB/s    00:00 ETA
sysupgrade: I: Extracting tests into /
100% |********************|  7202 KiB  310.94 KiB/s    00:00 ETA
sysupgrade: I: Extracting text into /
100% |********************|  1865 KiB  344.38 KiB/s    00:00 ETA
```
```shell-session
# sysupgrade etcupdate
```
下記のような差分を確認する画面が出るので確認して次の画面に進みます。
```
--- /boot.cfg   2012-03-29 03:03:36.000000000 +0900
+++ /tmp/temproot/boot.cfg      2022-08-05 00:30:37.000000000 +0900
@@ -1,7 +1,5 @@
-menu=Boot normally:rndseed /var/db/entropy-file;boot netbsd
-menu=Boot single user:rndseed /var/db/entropy-file;boot netbsd -s
-menu=Disable ACPI:rndseed /var/db/entropy-file;boot netbsd -2
-menu=Disable ACPI and SMP:rndseed /var/db/entropy-file;boot netbsd -12
+menu=Boot normally:rndseed /var/db/entropy-file;boot
+menu=Boot single user:rndseed /var/db/entropy-file;boot -s
 menu=Drop to boot prompt:prompt
 default=1
 timeout=5
(END)
```
差分の確認したら下記のような画面で `d 何もしないのか` `i 上書きするのか` `m マージするのか` (意訳)などなど出るのでいい感じにする。
もう一度、先ほどの差分を見たい場合は `v` で確認できます。

```
File: /boot.cfg (modified)

Please select one of the following operations:

  d  Don't install the new file (keep your old file)
  i  Install the new file (overwrites your local modifications!)
  m  Merge the currently installed and new files
  s  Show the differences between the currently installed and new files
  su  Show differences in unified format ("diff -u")
  sc  Show differences in context format ("diff -c")
  ss  Show differences side by side ("sdiff -w81")
  scommand Show differences using the specified diff-like command
  v  Show the new file

What do you want to do? [Leave it for later]
```

全て終わると下記のような感じでtemprootを削除するかどうか聞かれます。
普通はいらないと思います。

```
Remove /tmp/temproot? (y/[n])
```

上記の回答が終わると自動でpostinstallが始まります。
```
*** Running /usr/sbin/postinstall
```

問題が起きると下記のようになるので対応します。
エラーになった原因の対応が終わったら `To fix, run:` に提示してある `postinstall` コマンドを実行し、failedがなくなれば完了です。
```
obsolete check:
	Remove obsolete directory /var/lock
postinstall checks passed: bluetooth ddbonpanic defaults dhcpcd dhcpcdrundir envsys fontconfig gid gpio hosts iscsi makedev motd named pam periodic pf pwd_mkdb ssh wscons x11 xkb uid varrwho tcpdumpchroot atf catpages manconf ptyfsoldnodes varshm
postinstall checks failed: mtree rc obsolete
To fix, run:
    sh /usr/sbin/postinstall -s /var/cache/sysupgrade/etc.tar.xz -d / fix mtree rc obsolete
Note that this may overwrite local changes.
*** All done
```

上記の問題の対応例
```
# rm -fr /var/lock/
# sh /usr/sbin/postinstall -s /var/cache/sysupgrade/etc.tar.xz -d / fix mtree rc obsolete
Note: Creating temporary directory /tmp/_postinstall.7323.0/etc.tgz
Note: Extracting files from /var/cache/sysupgrade/etc.tar.xz
Source directory: /tmp/_postinstall.7323.0/etc.tgz
 (extracted from: /var/cache/sysupgrade/etc.tar.xz)
Target directory: /
mtree fix:
	Copied /tmp/_postinstall.7323.0/etc.tgz/etc/mtree/special to /etc/mtree/special
rc fix:
	Copied /tmp/_postinstall.7323.0/etc.tgz/etc/rc.d/ntpd to /etc/rc.d/ntpd
	Copied /tmp/_postinstall.7323.0/etc.tgz/etc/rc.d/ntpdate to /etc/rc.d/ntpdate
	Copied /tmp/_postinstall.7323.0/etc.tgz/etc/rc.d/postfix to /etc/rc.d/postfix
	Copied /tmp/_postinstall.7323.0/etc.tgz/etc/rc.d/sshd to /etc/rc.d/sshd
	(Checking for blacklistd from /tmp/_postinstall.7323.0/etc.tgz/etc/rc.d instead of /tmp/_postinstall.7323.0/etc.tgz/external/bsd/blacklist/etc/rc.d)
obsolete fix:
	Removed obsolete directory /var/lock
postinstall fixes passed: mtree rc obsolete
postinstall fixes failed:
```

最後にアップデートするためにダウンロード(fetch)したkenrelなど一式を削除します。
```shell-session
# sysupgrade clean
sysupgrade: I: Cleaning downloaded files
```
以上、お疲れさまでした。

# Tips
最近の`amd64`はパッケージが`tar.zx`で圧縮されているのですが
OS付属の`bsdtar`が古すぎるとオプションで`[J]`がサポートされておらず
`sysupgrade`途中でコケることがあります。
そのような場合は`pkgsrc`で`bsdtar`を入れて`/bin/tar`を上書きして回避しています。


```sh:bsdtarが古すぎてコケた例
# sysupgrade module
sysupgrade: I: Upgrading kernel modules
sysupgrade: I: Extracting modules into /
tar: unknown option -- J
usage: tar [-]{crtux}[-befhjklmopqvwzHOPSXZ014578] [archive] [blocksize]
           [-C directory] [-T file] [-s replstr] [file ...]
```

```shell-session:最新のbsdtarインストールと/bin/tarの上書き
# cd /usr/pkgsrc/archivers/bsdtar ; make install
# cp -p /usr/pkg/bin/bsdtar /bin/tar
```