収監したDevuanにPGIコンパイラをインストール

## 愚痴

FreeBSD 12になったのでIntel内蔵グラフィックスが動くかなと思い、[wiki](https://wiki.freebsd.org/Graphics#Intel_Graphics)に従ってやってみました。
残念ながら、panicになりnvidiaに戻しました。

## 妄想
FreeBSDには[Linuxバイナリ互換機能](https://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/linuxemu-lbc-install.html)があるので、Linuxを収監（`jail`にインストール）したらPGIコンパイラが入るのではないか、あわよくばGPUが使えたりして...

## 先達

探してみると[先達](https://forums.freebsd.org/threads/setting-up-a-debian-linux-jail-on-freebsd.68434/)がいました。Systemdが問題なのでDebianでなくDevuanを使えとのこと。詳細は[先達](https://forums.freebsd.org/threads/setting-up-a-debian-linux-jail-on-freebsd.68434/)参照ですが、メモしておきます。

## 監獄の準備と収監

### Linuxバイナリ互換機能

* `/etc/rc.conf`で`linux_enable="YES"`
* `emulators/linux_base-c7`をインストール

```
# pkg install linux_base-c7
```

### 監獄用

ルートファイルシステムをZFSでインストールしていたので、監獄用のファイルシステムを準備しました。

```
# zfs create zroot/jail
# zfs create zroot/jail/devuan
# zfs set mountpoint=/jail zroot/jail
```

### 収監

* `sysutils/debootstrap`をインストール
* Devuanのインストール (bootstrap)

32ビットマシンでは`amd64`でなく`i386`にしましょう。

```
# debootstrap --foreign --arch=amd64 stable /path/to/jail http://deb.devuan.org/merged/
```

### Linux用ファイルシステムのマウント

マウントするファイルシステムを分けて書いておきます。

```/etc/fstab.devuan
## Mountpoints for Devuan jail
# Dev       mountpoint        FS        Options           Dump/Check
linprocfs   /jail/devuan/proc linprocfs rw,late 0 0
linsysfs    /jail/devuan/sys  linsysfs  rw,late 0 0
tmpfs       /jail/devuan/tmp  tmpfs     rw,late,mode=1777 0 0 
```

ファイルシステムをマウントする。

```
# mount -F /etc/fstab.devuan `pwd`/sys
# mount -F /etc/fstab.devuan `pwd`/proc
# mount -F /etc/fstab.devuan `pwd`/tmp
# mount -t devfs none dev
```

### Devuanの世界へ

パッケージの最終調整。エラーが出てもインストールされていることがあるようです。`base-files`と`sysvinit-core`が部分的にconfigureされている（`iF`）ことを確認。私の環境では、`sysvinit-core`は`iF`になっていました。

```
# chroot /path/to/jail /bin/bash
# dpkg --force-depends -i /var/cache/apt/archives/*.deb
```

## PGI Community Editionのインストール

いよいよ[PGI Community Edition](https://www.pgroup.com/products/community.htm)をインストールします。FreeBSDでダウンロードしておきます。Devuanにもっていくのは、単に`/jail/devuan/root`に`mv`するだけ。`jail`って便利。

### gccのインストール

ドキュメントの[Installation Guide](https://www.pgroup.com/resources/docs/19.10/x86/pvf-install-guide/index.htm)を見ると`gcc`が必要とのこと。

```
# apt install build-essential file
```

ドキュメントに従って`hello.c`を書いて実行し、`file`コマンドでどんなファイルか確認します。確かにELF 64-bitになっています。感動。

```
# file hello_64
hello_64: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=f410c6f83a7043cba28009b0ddc8c597b9c9804b, not stripped
```

### PGIのインストーラの実行

ディレクトリを作ってその中に展開しましょう。

```
# mkdir pgi
# cd pgi
# tar zxvf ../pgilinux-2019-1910-x86-64.tar.gz
```

* あるはずの`libncurses.so.5`が見つかりませんでした。`LD_LIBRARY_PATH`に入れて実行しても同じでした。
* `/lib64/ld-lsb-x86-64.so.3`が見つからないというエラー。ライセンス管理に使うようなのですが、PGI Community Editionではライセンスサーバは使わないので関係なさそう。

### jailの設定

以下の設定をすれば、`# jail -c devuan`で起動、` # jexec devuan /bin/bash`でDevuanに入り、bashが起動します。

```/etc/jail.conf
devuan {
    host.hostname = "devuan.jail";
    interface = lo0;
    ip4.addr = 127.0.0.5;
    path = "/jail/devuan";
    exec.start = "/etc/init.d/rc 3";
    exec.stop = "/etc/init.d/rc 0";
    persist;

    mount.devfs;
    mount.fstab = /etc/fstab.devuan;

    allow.mount;
    allow.mount.devfs;
}
```

### 一般ユーザの環境設定

`# adduser foo`で一般ユーザを作りました。`# su foo`で一般ユーザになって環境変数を設定します。

```:.bashrc
PGI=/opt/pgi
PATH=$PGI/linux86-64/19.10/bin:$PATH
MANPATH=$MANPATH:$PGI/linux86-64/19.10/man
LM_LICENSE_FILE=$PGI/license.dat
export LM_LICENSE_FILE
```

FortranのHello Worldも問題なく動作しました。しかし

```
$ pgaccelinfo
No accelerators found.
Try pgaccelinfo -v for more information
```

残念。