Anitaで各アーキテクチャ向けのNetBSDを自動インストールする

[NetBSD Advent Calendar 2020](https://qiita.com/advent-calendar/2020/netbsd) 10日目の記事です。
今日は[8日目の記事](https://qiita.com/furandon_pig/items/8599e2b6c18eda41b890)で紹介した[Anita](http://www.gson.org/netbsd/anita/)のさらなる応用例を紹介しようと思います。

## 背景

[8日目の記事](https://qiita.com/furandon_pig/items/8599e2b6c18eda41b890)では[Anita](http://www.gson.org/netbsd/anita/)を利用したNetBSDの自動インストールの手順を紹介しました。
[Anita](http://www.gson.org/netbsd/anita/)は内部的に[qemu](https://www.qemu.org/)や[GXemul](http://gavare.se/gxemul/)を使用しています。NetBSDが対応している各アーキテクチャ向けの自動インストールを試してみたので、今日の記事にて紹介してみようと思います。

## AnitaでインストールできるNetBSD

[Anita](http://www.gson.org/netbsd/anita/)のソースコードを見ると、 `arch_props` に各アーキテクチャと使用する仮想マシンモニタ(VMM)の情報が記載されています。

```py
  57 arch_props = {
  58     'i386': {
  59         'qemu': {
  60             'executable': 'qemu-system-i386',
  61         },
  62         'scratch_disk': 'wd1d',
  63         'boot_from_default': 'floppy',
  64     },
  65     'amd64': {
  66         'qemu': {
  67             'executable': 'qemu-system-x86_64',
  68         },
  69         'scratch_disk': 'wd1d',
  70         'memory_size': '192M',
  71     },
  72     'sparc': {
  73         'qemu': {
  74             'executable': 'qemu-system-sparc',
  75         },
  76         'scratch_disk': 'sd1c',
  77     },
```

ちょっとだけ見やすく整理してみます。 `qemu` や `shimh` 、[qemu](https://www.qemu.org/)や[shimh](https://github.com/simh/simh)、[GXemul](http://gavare.se/gxemul/)が利用できるようです。

```sh
$ grep "': {" anita.py | sed -e "s/': {//" -e "s/^ *'//" | paste - -
i386    qemu
amd64   qemu
sparc   qemu
sparc64 qemu
evbarm-earmv7hf qemu
evbarm-aarch64  qemu
pmax    gxemul
hpcmips gxemul
landisk gxemul
vax     simh
hppa    qemu
macppc  qemu
alpha   qemu
```

## 準備

### qemuのインストール

まずは[qemu](https://www.qemu.org/)をインストールします。[7日目の記事](https://qiita.com/furandon_pig/items/6cd3f5117fcbd9a39a76)にもありますが、パッケージからインストールしたqemuがうまく動作しないため、今回は自前でビルドします。

```sh
$ sudo -i pkg_add -v pkg-config gmake python37
$ 
$ curl -sLO https://download.qemu.org/qemu-5.0.1.tar.xz
$ tar Jxf qemu-5.0.1.tar.xz
$ cd qemu-5.0.1
```

対象となるアーキテクチャ指定してビルドするには、 `--target-list` を指定するようです。

```sh
$ ./configure --help
...中略...
  --target-list=LIST       set target list (default: build everything)
                           Available targets: aarch64-softmmu alpha-softmmu
                           arm-softmmu cris-softmmu hppa-softmmu i386-softmmu
                           lm32-softmmu m68k-softmmu microblaze-softmmu
                           microblazeel-softmmu mips-softmmu mips64-softmmu
                           mips64el-softmmu mipsel-softmmu moxie-softmmu
                           nios2-softmmu or1k-softmmu ppc-softmmu ppc64-softmmu
                           riscv32-softmmu riscv64-softmmu rx-softmmu
                           s390x-softmmu sh4-softmmu sh4eb-softmmu
                           sparc-softmmu sparc64-softmmu tricore-softmmu
                           unicore32-softmmu x86_64-softmmu xtensa-softmmu
                           xtensaeb-softmmu i386-bsd-user sparc-bsd-user
                           sparc64-bsd-user x86_64-bsd-user
```

以下のような指定で `./configure` を実行してビルドします。この例では `qemu-system-aarch64` がビルドされます。

```sh
$ ./configure \
        --prefix=/opt/qemu-5.0.1 \
        --python=/usr/pkg/bin/python3.7 \
        --target-list=aarch64-softmmu
$ gmake
$ sudo gmake install
```

[7日目の記事](https://qiita.com/furandon_pig/items/6cd3f5117fcbd9a39a76)でも解説していますが、[paxctl(8)](https://man.netbsd.org/paxctl.8)で[PaX](https://ja.wikipedia.org/wiki/PaX)まわりの属性を変更しておきます。

```sh
$ sudo paxctl +m /opt/qemu-5.0.1/bin/qemu-system-aarch64
$ sudo paxctl /opt/qemu-5.0.1/bin/qemu-system-aarch64
PaX flags:
  m: mprotect(2) restrictions, explicit disable
```

### gxemulのインストール

[GXemul](http://gavare.se/gxemul/)はそのままパッケージからインストールします。

```sh
$ sudo -i pkg_add -v gxemul
```

これで準備は完了です。

## 各アーキテクチャ向けのNetBSDをインストールしてみる

準備が整ったので各アーキテクチャ向けのNetBSDインストールを試してみます。
[Anita](http://www.gson.org/netbsd/anita/)には対象アーキテクチャを指定するオプションは存在せず、CDイメージの取得URLから自動で対象アーキテクチャと使用すべきVMMを判別してくれます。

 * http://ftp.netbsd.org/pub/NetBSD/NetBSD-9.1/

### NetBSD/aarch64

[NetBSD/evbarm](http://wiki.netbsd.org/ports/evbarm/)のインストール例です。

```sh
$ anita \
    --workdir work \
    --disk-size 2G \
    --memory-size 512M \
    --sets kern-GENERIC,modules,base,etc,comp \
    interact http://ftp.netbsd.org/pub/NetBSD/NetBSD-9.1/evbarm-aarch64/
```

自動インストール完了後、 `qemu-system-aarch64` でNetBSDが起動してきます。

```sh
NetBSD/evbarm (arm64) (constty)

login: root
Dec 11 00:19:44 arm64 login: ROOT LOGIN (root) on tty constty
Last login: Fri Dec 11 00:15:49 2020 on constty
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
    2018, 2019, 2020 The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 9.1 (GENERIC64) #0: Sun Oct 18 19:24:30 UTC 2020

Welcome to NetBSD!

We recommend that you create a non-root account and use su(1) for root access.
arm64# 
```

(当たり前ですが) `uname -a` を実行すると `evbarm` が返ってきます。

```sh
arm64# uname -a
NetBSD arm64 9.1 NetBSD 9.1 (GENERIC64) #0: Sun Oct 18 19:24:30 UTC 2020  mkrepo@mkrepro.NetBSD.org:/usr/src/sys/arch/evbarm/compile/GENERIC64 evbarm
```

### NetBSD/macppc

[NetBSD/macppc](http://wiki.netbsd.org/ports/macppc/)のインストール例です。

```sh
$ anita \
    --workdir work \
    --disk-size 2G \
    --memory-size 512M \
    --sets kern-GENERIC,modules,base,etc,comp \
    interact http://ftp.netbsd.org/pub/NetBSD/NetBSD-9.1/macppc/
```

```sh
NetBSD/macppc (Amnesiac) (ttyZ0)

login: root
Dec 10 16:55:53  login: ROOT LOGIN (root) on tty ttyZ0
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
    2018, 2019, 2020 The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 9.1 (GENERIC) #0: Sun Oct 18 19:24:30 UTC 2020

Welcome to NetBSD!

We recommend that you create a non-root account and use su(1) for root access.
# 
```

```sh
# uname -a 
NetBSD  9.1 NetBSD 9.1 (GENERIC) #0: Sun Oct 18 19:24:30 UTC 2020  mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/macppc/compile/GENERIC macppc
```

### NetBSD/hpcmips

[NetBSD/hpcmips](http://wiki.netbsd.org/ports/hpcmips/)のインストール例です。[NetBSD/evbarm](http://wiki.netbsd.org/ports/evbarm/)と[NetBSD/macppc](http://wiki.netbsd.org/ports/macppc/)は[qemu](https://www.qemu.org/)を利用していますが、こちらは[GXemul](http://gavare.se/gxemul/)の上で動作しています。

```sh
$ anita \
    --workdir work \
    --disk-size 2G \
    --memory-size 512M \
    --sets kern-GENERIC,modules,base,etc,comp \
    interact http://ftp.netbsd.org/pub/NetBSD/NetBSD-9.1/hpcmips/
```

```sh
NetBSD/hpcmips (Amnesiac) (constty)

login: root
Dec 10 17:33:09  login: ROOT LOGIN (root) on tty constty
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
    2018, 2019, 2020 The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 9.1 (GENERIC) #0: Sun Oct 18 19:24:30 UTC 2020

Welcome to NetBSD!

We recommend that you create a non-root account and use su(1) for root access.
# uname -a 
NetBSD  9.1 NetBSD 9.1 (GENERIC) #0: Sun Oct 18 19:24:30 UTC 2020  mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/hpcmips/compile/GENERIC hpcmips
```

## まとめ

[Anita](http://www.gson.org/netbsd/anita/)を使用してNetBSDの各アーキテクチャの自動インストールを行う方法を紹介しました。複数のアーキテクチャへのNetBSDインストールが思っていたよりもお手軽に実施できるため、開発やテストに活用できそうです。

## 参考URL

 * [Anita](http://www.gson.org/netbsd/anita/)
 * [qemu](https://www.qemu.org/)
 * [GXemul](http://gavare.se/gxemul/)