WSL? FreeBSDが使いたいんだけど

WSL/WSL2が盛り上がってるけど，やっぱりFreeBSDが使いたい。

オフィシャルイメージを使い，インストールなしでお手軽にHyper-V上にFreeBSDを構築します。Windows側からssh接続で使うことが前提。Power to serveのFreeBSDなので。

Hyper-Vを使うにはWindows 10 Proが必要。

# 準備
## Hyper-Vを有効にする
Windowsの機能の有効化または無効化 > Hyper-V
「検索するには、ここに入力します」（いわゆる検索窓）で「Windowsの機能の」を打つと出てくる。

<img width="347" alt="enable_Hyper-V.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/4e985475-86ef-6f46-4884-5b79b85f9b28.png">

Windowsを再起動

<img width="471" alt="reboot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/3431c503-9c2b-7b5a-60ab-be656c372ac3.png">


## OpenSSHクライアントのインストール

オプション機能 > 機能の追加 > OpenSSHクライアント

`cmd.exe`（コンソール，黒い画面）で`where ssh`と打って`C:\Windows\System32\OpenSSH\ssh.exe`と出ることを確認する。

私の環境では，scoopのOpenSSHはFreeBSDのvi/nvimの編集で画面が乱れた（`scoop uninstall openssh`で削除した）。

# 仮想マシンの準備

## 仮想マシンイメージのダウンロード

[FreeBSD](https://www.freebsd.org/)の[Download FreeBSD](https://www.freebsd.org/where.html)で最新版の仮想マシンイメージ（Virtual Machine Images）をダウンロード。執筆時点での最新安定板はFreeBSD12.0-RELEASE。アーキテクチャは多くの場合amd64。Hyper-V用のイメージは拡張子が`.vhd.xz`のもの（例えば`FreeBSD-12.0-RELEASE-amd64.vhd.xz`）。

7-zipやunxzなどで解凍して適当な場所に置く。

## 仮想マシンの作成

Hyper-Vマネージャ > 新規 > 新規仮想マシン...

<img width="709" alt="Hyper-V_manager.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/3cd902de-1dd7-bf2a-fa31-340d035af53b.png">
<img width="138" alt="new_virtual_machine.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/3ec294d0-2fff-d16f-0967-74b2dce20a0e.png">

## ウィザード

名前は適当につける。
<img width="528" alt="wizard1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/0c0311f7-d985-325f-f81c-15a87ae8fd4f.png">

### 世代の指定

第１世代。
<img width="528" alt="wizard2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/faf3d5bf-60a3-9c5d-4c8b-a546b7e3420a.png">

### メモリの割り当て
<img width="528" alt="wizard3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/b6016cd0-261f-73a4-5946-950a23588793.png">

### ネットワークの構成

既定ではWindowsと物理インターフェース（Ethernetや無線LANアダプタ）を共有して，内部ネットワークを作る。Windowsからのみアクセスできる。

<img width="528" alt="wizard4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/c52c9085-1806-fb07-dcac-e534ed5371ab.png">

### 仮想ハードディスクの接続

既存の仮想ハードディスクを使用する

<img width="528" alt="wizard5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/6ddcf2f5-0993-b225-f2e8-f472ea6b457d.png">

## 起動

仮想マシンを選択し，接続...をクリック
<img width="709" alt="Hyper-V_manager_connect.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/02c6b9be-39c4-57d8-89d3-6ebecfa4bc24.png">

起動をクリック
<img width="481" alt="connect.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/46065e0a-8d3d-4cab-5349-fd6b9c8d0336.png">

エクステンションの類を入れなくてもキーボードやマウスの自動キャプチャに対応している。

![boot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/ec548514-9388-10c3-12f4-b9dddbb3fe55.png)

お疲れさまでした。

`root`のパスワードは空なのでリターンするだけ。

# その他

## 各種初期設定

### 一般ユーザの作成

```
# adduser
```

追加のグループとして`wheel`に入れておく。

パッケージ

最初はboostrapが実行される。

```
# pkg update
```

FreeBSDだけど`sudo`を入れ`visudo`で以下をアンコメント

```
## Uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL) ALL
```

portsコレクションの利用

```
# portsnap fetch
# portsnap extract
```

pkg/ports充実してます。バージョンも新しいものが多い。`flang`とか`r-base`，`cdo`など入れました。

ただし，texliveは古いのでtexliveのスクリプトでインストールしました。
* [BSD/FreeBSD - TeX Wiki](https://texwiki.texjp.org/?BSD%2FFreeBSD)


## X11アプリケーション

[vcxsrv](https://sourceforge.net/projects/vcxsrv/)を使っているがお好きなものをどうぞ。デスクトップを使うのでなければxorgなどは不要。

`xuth`と確認のため`xclock`と`xeyes`をインストール。

```
# pkg install xauth xclock xeyes
```

```:/etc/ssh/sshd_config
X11Forwarding yes
XAuthLocation /usr/local/bin/xauth
```

残念ながらX11Forwardingはうまくいかない。WSLやHyper-VのUbuntu 19.04からだとうまくいく。仕方がないので`.shrc`に`DISPLAY=WindowsのIPアドレス:0.0`と書いておく。

## LAN内の別のマシンからアクセスする場合

仮想スイッチマネージャーで仮想スイッチを作る。外部ネットワークを選ぶ。一つしかない場合は「管理オペレーティングシステム（つまりWindows）にこのネットワークアダプターの共有を許可する」にチェックするしかない。ネットワークアダプタが複数あれば，チェックせずにWindowsとFreeBSDに別々の物理インターフェースを割り当ててもよい。

仮想マシン（FreeBSD12）の設定...で作成したスイッチを選択する。


## IPアドレスを固定する

[ハンドブック11.5](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/config-network-setup.html)参照。

IPアドレス等はあくまでも例なので環境に合わせて変更すること。（当然の注意で恐縮だが「ネットに出ていたことを何も考えずにコピペしましたが動きません」という若者が多いのでご容赦を。）

`/etc/rc.conf`に指定するIPアドレス（例 192.168.1.99），`netmask`（例 255.255.255.0），ゲートウェイ（`defaultrouter`，例 192.168.1.254）を書く。`root`になって編集。

```/etc/rc.conf
ifconfig_hn0="192.168.1.99 netmask 255.255.255.0"
defaultrouter="192.168.1.254"
```
ネームサーバは`/etc/resol.conf`に書く（例 192.168.1.254）。

```/etc/resolv.conf
nameserver 192.168.1.254
```

### よく使うコマンド確認
ネットワークインターフェースの確認

仮想マシンをWindowsの`hosts`（`%sytemroot%\System32\drivers\etc/hosts`，`%system%`はたぶん`C:\Windows`）に書いておくといいかも。内部ネットワークだと起動のたびにIPアドレスが変わる。

```
$ ifconfig -a
```

`inet`に書いてある数字がIPアドレス。

ネットワークの状態の確認

```
$ netstat -rn
```

インタフェースの再起動

管理者（root）で行う。

```
# service netif restart
```

ルーティングの再起動

```
# service routing restart
```