Foltia を KVM上に構築する

# 概要
定番録画サーバキット [Foltia](https://foltia.com/ANILOC/) の最新版は6.1.10. このリリースのベースは CentOS 6.10. すでにサポート終了を迎えており、開発元も CentOS 8ベースへの移行を宣言している. でも、CentOS 8 も2021/12/31 で[サポート終了](https://blog.centos.org/2020/12/future-is-centos-stream/). 

* おそらく次期 Foltiaへのバージョンアップは再インストールが必要になる
* 出たとしても、更なる移行が必要になる

Migration が最初から見えているのだから、移行前後のOSを一台のサーバで同時に構築させられるよう、Foltia を仮想化させることした。基本方針は下記の通り。

* Foltia の自体はKVM上に作る。
* 録画イメージは基盤側にSambaサーバを構築し、そこに保存させる。Foltiaからはcifsで取りにこさせる。

#前提
## 物理構成
主な構成部品。

| パーツ | 型番 | 備考|
|--------|--------|--------|
|CPU|Intel Core i3-9100| VT-d対応必須|
|マザーボード| B365M-ITX/ac|VT-d対応にできるオプションが必須|
|キャプチャカード| PX-W3PE4| Foltia 5.0.4移行で対応. PCI接続は電源供給のみ、データ転送は**内部USB**. 一世を風靡したPT3は販売終了し、後継品もない様子.|
|ICカードリーダ|SCR3310/v2.0|定番品 |

## ターゲットディストリビューション
|ディストリビューション | バージョン |備考 |
|--------|--------|--------|
|Ubuntu |20.04| 基盤側. 素直に最新のLTSを選択|
|Foltia | 6.1.10|ベースは CentOS 6.10 |

## 利用する主なソフトウェア

| Software | 概要 |備考|
|--------|--------|--------|
|KVM/QEMU/Virt| ハイパーバイザ| |
|bridge-utils|LinuxをL2化| KVM上のノードをBridge接続させるために必要|
|Samba|ファイルサーバ|録画ファイルはFoltiaに持たせず、基盤側に置く|
|Cockpit|サーバ管理ツール|Web GUIでKVMをコントロール|

#構築
## BIOS設定
vt-dを有効にする。これがないとKVMが使えない。

## KVMの構築
Ubuntu 20.04をインストール。特段のこだわりはなし。

### KVMのインストール
```sh
$ sudo apt update
$ sudo apt install -y qemu qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager
$ sudo reboot
```

### 権限付与
* KVMを動かしたいユーザに権限を付与する
* KVMを保存する場所へのアクセス権を制御するため、shared グループを作り、KVM管理者とqemuでのアクセスを許可する。

```sh
$ sudo adduser `id -un` libvirt
Adding user '<username>' to group 'libvirt' ...
$ sudo adduser `id -un` kvm
Adding user '<username>' to group 'kvm' ...
$ sudo groupadd shared
$ sudo usermod --append --groups shared $(id -un)
$ sudo usermod --append --groups shared qemu
```

### Storage Poolの設定
OSイメージと仮想マシンをどこに置くかを定義。`/home/shared` 配下に配備するとした。
FHS的にどこに置くべきなのかは規定をまだ見つけられていない。
Foltiaのイメージファイルを`/home/shared/images/`配下に配備する。isoイメージは`qemu`ユーザに
よるアクセスできる必要があることに注意。

```sh
sudo mkdir -p /home/shared/images/
sudo mkdir -p /home/shared/kvm_volumes/
sudo chown -R root:shared /home/shared/
sudo chmod -R o-rwx /home/shared/

virsh --connect qemu:///system pool-define-as default dir --target /home/shared/kvm_volumes/
virsh --connect qemu:///system pool-define-as images dir --target /home/shared/images/
```

### Storage Poolの起動
Storage poolは設定しただけでは使えない。明示的に起動する必要がある。サーバとしての起動権限なのに、rootじゃあないのが少し不思議。

```sh
# pool の起動
virsh --connect qemu:///system pool-start default
virsh --connect qemu:///system pool-start images

# pool の自動起動
virsh --connect qemu:///system pool-auto-start default
virsh --connect qemu:///system pool-auto-start images
```

### Networkの設定
KVM ではデフォルトではホスト側の持つアドレスにNAPTされて外部と通信する。今回の Foltiaは外部に対してサーバとして動作させるため、Bridge 接続でNAPTなしに外部と出す必要がある。1:1 NATすればよいんだろうけど、そこは調べてない。

```sh
$ cat /etc/netplan/01-network-manager-all.yaml
# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: networkd
  ethernets:
        eno1: #ここは実機に合わせる
   bridges:
        br0:
            interfaces:
                - eno1
            dhcp4: false
            dhcp6: false
            addresses:
                - 192.168.1.66/24 # ← ホストのアドレス
            gateway4: 192.168.1.1 # ← デフォルトゲートウェイのアドレス
            nameservers:
                addresses:
                    - 192.168.1.1
            parameters:
                forward-delay: 0
                stp: false
            optional: true
```

再起動するか、`sudo netplan apply`で反映できる。


### Cockpitの準備
Foltia は基本Web UIのみだが、サーバインストール時だけはGUIが必要になる。サーバに xrdpを入れてvirt-manager でオペレーションをすることも考えたが、メンテナンス性を考えてサーバ管理ツール Cockpit の仮想マシンプラグインを利用することにした。 KVM のWeb GUI で良いものがないのかと色々と探ったが、数年前に開発が止まったものばかりだった。しかしCockpitについては [Git hub](https://github.com/cockpit-project/cockpit)を見る限り、現時点で活発に開発が続けられているようだった。

```sh
sudo apt update
sudo apt install cockpit cockpit-machines cockpit-system cockpit-bridge
```
でインストールすれば、`http://サーバアドレス:9090`でログインできる。認証はKVMサーバへのログインアカウントで良い。

### KVM構築の参考
* [KVM をインストールして設定する](https://qiita.com/tkarube/items/7e02d1f9e93d107c616b) 
* [KVMの初期設定、及びvirsh, virt-installによるVM作成](https://endy-tech.hatenablog.jp/entry/kvm_setup_and_libvirt_cli)
* [CockpitによるKVM操作](https://endy-tech.hatenablog.jp/entry/kvm_cockpit)

## Sambaサーバの構築
Foltiaで録画したファイルの保存先はデフォルトだと`/dev/tank/tv`となる。これはlvmで構築されたボリューム。ただ、下記の理由から今回は基盤サーバ上にSambaを動かすことにした。

* データ量が死ぬほど多く、仮想側に持たせるとマイグレーションに膨大な時間がかかる
* 仮想イメージに問題があった時、データ回収困難である
* ディスク部分を仮想にすることによるオーバーヘッドを抑制したい

この辺りは色々と議論ありそう。

### 録画イメージの保存場所
ディスクの容量管理を考え、KVMと同じshared ディレクトリ配下に入れることとした。`/home/shared`を別ディスクに切り出したかったので。

```sh
sudo mkdir -p /home/shared/tv
```

### Sambaのインストール
Ubuntuの標準パッケージをそのままインストール。

```sh
sudo apt install samba
```

### Sambaの設定
GUIツール「SWAT」は、すでにメンテナンスが止まって久しい。Ubuntu では`system-config-samba`による Config作成支援もあったが、これも18.04までに廃止された。結局、`smb.conf`を直接編集するしかない。

### SMBプロトコル
Ubuntu 20.04と Foltia 6.1.10 (CentOS 6.10)が対応するSMBプロトコルが異なり、明示的に合わせる必要がある。

|OS | Sambaバージョン |最低限のデフォルトProtocol |最上位のデフォルトProtocol|
|--------|--------|--------|--------|
|Ubuntu | 4.11.6| SMB3|SMB3|
|Foltia | 3.6.23| CORE| SMB2|

で、**Samba 4.xではSBM2に対応していない**。というわけで、両者でANDの取れる`NT1`とする必要があった。

### smb.conf
追加したポイントだけ。自宅内で利用するため、アクセス制限はsmb.conf内でのACLのみとし、ユーザ認証は省略してguestアクセスとした。


```sh
[global]
unix charset = UTF-8      # エンコーディング指定。
dos charset = CP932       # Windowsでのエンコーディング指定。
server min protocol = NT1 # Foltia側に合わせて設定
(snip)
#### Networking ####
   interfaces = 192.168.1.66/24 br0  #SMBを受け入れるサーバのアドレスとInterfaceを明示
   hosts allow =192.168.1. localhost #Sambaへのアクセスを認めるアドレスを192.168.1.0/24に限定
(snip)
[share]
  path = /home/shared/tv
  comment = Allow All users to read/write
  writable = yes
  guest ok = yes
  guest only = yes
```

コマンドを反映させる前にvalidationを実施する。

```sh
testparm -v
```

問題なければプロセスを再起動してアクセス確認。

```sh
sudo service smbd restart
```
### 参考
* [SambaのSMBプロトコルのサポート状況](https://qiita.com/szly/items/de9df09b832d43d4d45c)

---

## Foltiaのインストール
### OSイメージ名
`virt-install` でインストールするとき、インストールしたいOSが既知のどんなOSに近いかをKVMに知らせる必要がある。その「既知のOS名」は`libosinfo-bin`パッケージに含まれる`osinfo-query`で調べられる。

```sh
$ sudo apt install libosinfo-bin
$ osinfo-query os family=linux|grep CentOS
(snip)
 centos6.10           | CentOS 6.10  | 6.10     | http://centos.org/centos/6.10
(snip)
```


### USB パススルー
KVM上のFoltiaから、物理サーバ上に取り付けたキャプチャカードとカードリーダへアクセスできるようにする。`lsusb`で特定できるので、BusとデバイスのIDを控える。キャプチャカードにPT3とかのPCIカードを使った場合、これはPCIパススルーとなる。

```sh
$ lsmod
(snip)
Bus 001 Device 007: ID XXXX:XXXX N'Able (DataBook) Technologies, Inc.
(snip)
Bus 001 Device 003: ID XXXX:XXXX SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader
(snip)
```

Plex社のキャプチャカードだが、内部チップ的には*N'Able*のものになるらしい。dmesgで見ると、Plex社の名前が見えた。


### virt-install
これでようやくインストール準備が整った。`virt-install`コマンドでインストール。Cockpitからもインストール自体はできるが、検証したタイミングでは`--host-device`指定ができない。インストール後にUSBデバイスをリダイレクトさせることもできない。virt-managerではオプションあってインストール後に接続できそうだったが、エラーになった。回避策が見つけられず、素直にコマンドラインで実施。

```sh
$ virt-install \
    --hvm \
    --name=Foltia_Test \
    --vcpus=2 \
    --memory=4096 \
    --disk=/home/shared/kvm_volumes/Foltia_Test.qcow2,size=64 \
    --network=bridge:br0 \ #最初に作ったbridgeの名称を指定
    --arch=x86_64 \
    --os-type linux \
    --os-variant centos6.10 \
    --host-device 001.003 \ #先ほど控えたBUS/デバイスIDを入力
    --host-device 001.007 \ #先ほど控えたBUS/デバイスIDを入力
    --cdrom=/home/shared/images/foltia_ANIME_LOCKER-install-RXX-DVD-XXX.iso \
    --graphics vnc,keymap=ja
```

インストール開始のメッセージが出たら Cockpitにアクセスし、VNCの画面でFoltia がDHCPで掴んだアドレスとインストール続行に必要なキーを確認する。これ以降はFoltiaのインストールマニュアルに従う。