PiKVMのインストール

サーバーにはリモートから操作するための管理機能が備えられていることがありますが，通常のパソコンにはそのような機能は付いておらず，リモートから操作するためにはなんらかのアプリをつかって実施する必要があります．
トラブル発生時などは，アプリを使うところまで辿りつかないことも考えられます．なんとかアプリなしでリモート操作できるものがないかを探しているとpikvmというものを見つけました．
[PiKVM](https://pikvm.org/)とパソコンをHDMI,USBケーブルで接続すればリモートから操作できるようになります．

# ハードウェア
+ Raspberry Pi 4 Model B 4GB
+ [PiKVM V3](https://github.com/pikvm/pikvm#pikvm-v3)
+ MicroSD(16GB)
+ ACアダプタ(USB-C)

PiKVM V3はamazonで売っているジェネリック製品の方が入手し易いかも．今回はジェネリック版を利用しました．

# インストール
pikvmの[イメージ](https://pikvm.org/download/)をダウンロード．
利用するハードウェアによってダウンロードするイメージが異なるので注意．
今回は`Raspberry Pi 4, v3 HAT platform`を選択します．


## 圧縮の伸長
```
% xz --decompress v3-hdmi-rpi4-latest.img.xz
```

## SDカードへの書き込み
Linuxを使っているので，ddを使ってイメージをSDカードへ書き込みます．Windowsなら別のソフト([balenaEtcher](https://www.balena.io/etcher)など)を使えばいいでしょう．
/dev/mmcblk0はそれぞれの環境に合わせてください．
```
% sudo dd if=v3-hdmi-rpi4-latest.img of=/dev/mmcblk0 bs=1M conv=fsync status=progress
```

## 圧縮されたイメージを伸長せずに書き込む
```
% xzcat v3-hdmi-rpi4-latest.img.xz | sudo dd of=/dev/mmcblk0 bs=1M conv=fsync status=progress
```
ダウンロードした圧縮イメージをそのまま書き込むこともできます．

## 起動
イメージを書き込んだMicroSDをラズパイ4に挿入して，電源を入れます．

### ログオン
本体のmicro HDMIにディスプレイ，USBにキーボードを接続すれば，consoleを利用できます．
LANに接続しておけば，DHCPでアドレスを取得しているので，ssh経由で接続するのが簡単です．
設定すれば本体のOLEDにIPアドレスを表示できるのですが，初期状態では表示されないため，何らかの方法で割り振られたIPアドレスを確認する必要があります．

初期のID/pwは
| default | console(ssh) | Web IF |
|:-:|:-:|:-:|
|  ID | root  | admin |
| Password  | root  | admin |

になっています．
sshでアクセスする，もしくはブラウザで http\://IPアドレス で接続し，Web IFに接続してTerminalを選ぶとconsoleにアクセスできます．

```
         _____ _  _  ____      ____  __
        |  __ (_)| |/ /\ \    / /  \/  |
        | |__) | | ' /  \ \  / /| \  / |
        |  ___/ ||  <    \ \/ / | |\/| |
        | |   | || . \    \  /  | |  | |
        |_|   |_||_|\_\    \/   |_|  |_|

    Welcome to Pi-KVM - Open Source IP-KVM based on Raspberry Pi
    ____________________________________________________________________________

    The root filesystem of Pi-KVM is mounted in read-only mode by default.
    Use command "rw" to remount it in the RW-mode and "ro" to switch it back.

    To prevent kernel messages from printing to the terminal use "dmesg -n 1".

    To change KVM password use command "kvmd-htpasswd set admin".

    Useful links:
      * https://pikvm.org
      * https://docs.pikvm.org
      * https://wiki.archlinux.org/title/systemd-networkd

[root@pikvm ~]# 
```


### パスワードの変更
初期パスワードを変更するには，
```
[root@pikvm ~]# rw
[root@pikvm ~]# passwd root
New password: 
Retype new password: 
passwd: password updated successfully
[root@pikvm ~]# kvmd-htpasswd set admin
Password: 
Repeat: 

# Note: Users logged in with this username will stay logged in.
# To invalidate their cookies you need to restart kvmd & kvmd-nginx:
#    systemctl restart kvmd kvmd-nginx
# Be careful, this will break your connection to the PiKVM
# and may affect the GPIO relays state. Also don't forget to edit
# the files /etc/kvmd/{vncpasswd,ipmipasswd} and restart
# the corresponding services kvmd-vnc & kvmd-ipmi if necessary.

[root@pikvm ~]# systemctl restart kvmd kvmd-nginx
[root@pikvm ~]# ro
```
### パッケージのアップデート
pikvmはarchlinuxがベースになっているのでアップデートには`pacman`コマンドを利用します．こちらの環境ではproxyサーバーの利用が必須だったので，環境変数を使って指定しました．
archlinuxを使うのは始めてなので，どうやってproxyを設定すべきかわかりませんでしたが，
とても充実しているドキュメントに[プロキシサーバー](https://wiki.archlinux.jp/index.php/%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC)の記載があったので，こちらを参考にしてもいいかもしれません．
```
# rw
# export http_proxy=http://xxxxxx:8080
# export https_proxy=http://xxxxxx:8080
# pacman -Syu
# reboot
```
2023年2月にダウンロードしたイメージ(SHA1:6f7711bbc7c060259787a584144bfca843ba401e
)で試したところ，アップデート前は画面の配信がMJPEGのみしかできませんでしたが，アップデート後にはH.264/WebRTCによる配信も可能になりました．

インストール直後ではMJPEGのみ配信できたので，[H.264/WebRTC Troubleshooting](https://docs.pikvm.org/webrtc/#troubleshooting)
を見て，ipv6の無効化を試したりしましたが結局はパッケージのアップデートが必要だった模様．

### その他の設定

#### ホストネーム
```
hostnamectl set-hostname xxxxx
```
vi /etc/kvmd/meta.yaml
```
server:
    host: xxxxx.domain
```
#### タイムゾーン
```
[root@pikvm ~]# timedatectl set-timezone Asia/Tokyo
```
#### OLEDの有効化
```
systemctl enable --now kvmd-oled kvmd-oled-reboot kvmd-oled-shutdown
```
#### FANの有効化
```
systemctl enable --now kvmd-fan
```

#### ATXの無効化
/etc/kvmd/override.d/atx.conf
```
kvmd:
        atx:
                type: disabled
```
#### H.264の有効化
閉じたネットワークでH.264を有効にするには，
```
systemctl enable --now kvmd-janus-static
```
インターネットに接続できる環境だと
```
systemctl enable --now kvmd-janus
```
こちらだと，インターネット上のstunサーバに接続する．

# PiKVMの利用
ブラウザでPiKVMのIPへ接続すると，認証画面が表示されます．UsernameとPasswordを入力してLoginします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/7decca78-68df-46e2-a4fd-d124b49c8a7f.png)

KVMをクリックすると，接続したパソコンの画面が表示され，キーボードやマウス操作ができます．
TerminalをクリックするとPiKVMのconsoleが開きます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/7b3670e6-f098-c7e8-2156-a4044bd4c041.png)

## 利用シーンの想定
パソコントラブル時のリモート対応に利用しようと考えています．電話だとGUIの操作を説明するのが大変なので．
いまのところ，WiFiは使っていないので，PiKVMにLANケーブルを接続する必要はありますが，PiKVM操作対象となるパソコンとHDMI,USBで接続し，OLEDに表示されるIPを電話で伝えてもらえば，リモートから操作できるのはかなり便利になりそう．いまのところ，こちらで想定している利用はLAN内に限定しますが，Tailscale VPNを使えばLANに限定しなくても利用できそう．

# 参考
+ [憧れのKVM over IPを手軽？に導入](https://zigsow.jp/item/361953/review/372633)
+ [PiKVM Handbook](https://docs.pikvm.org/)