kazeno memo

メモとか

停電時 CyberPower UPSの管理ツールから Proxmoxノード(ホスト)をシャットダウンさせる

CyberPowerはUPSの管理ツールを無料で配布してるから、apcupsdとかNUTは使わない。

Linuxで動く管理ツールは次の二種類。

  • PowerPanel Business
  • PowerPanel Linux(簡易版)

BusinessはWebのコントロールパネルから操作できるので良いなと思ったけど、VMの中からProxmox(ホストOS)をシャットダウン出来ないっぽいのでPowerPanel Linux(簡易版)を使う。

PowerPanel Linuxの中身はpwrstatというコマンドとpwrstatdというデーモン。

インストール

公式ではDebian系(.deb)とRHEL系(.rpm)、汎用の.tarが配布されている。

.tarに入ってるinstall.shはArchLinuxだと上手く動かなかった。(rc.dにファイル置こうとしてたよう)

探してみるとArchWikiに書いてあった。AURでpowerpanelという名前でパッケージが配布されてる。

$ wget https://aur.archlinux.org/cgit/aur.git/snapshot/powerpanel.tar.gz
$ tar xzf powerpanel.tar.gz
$ cd powerpanel/
$ makepkg -si

インストールが終わったらsystemdのサービスを動かす。

# systemctl enable pwrstatd
# systemctl start pwrstatd

pwrstatdを動かすとUPSからピッってビープ音がなります。

設定

詳しくはArchWIKIと設定ファイル見て下さい。

とりあえずhibernateとメール通知をoffにしました。

Proxmoxをシャットダウン

pwrstatdはシャットダウン条件が揃った時/etc/powerpanel/shutdown.shを実行するみたいです。

中身はsystemctl poweroff

Proxmoxへpoweroffコマンドを送る方法ですが、無難にsshすることにしました。

sshするときにパスワードを要求されると困るのでPublic keyの設定をする。(pwrstatdはRootで動いているので/root/.sshで作業する)

# mkdir /root/.ssh
# ssh-keygen -t ed25519 -C ""

/root/.ssh/config

Host pve
  HostName 10.11.12.13  //ProxmoxのIP
  User root
  IdentityFile /root/.ssh/id_ed25519

これでssh pveと打つだけでProxmoxにSSH接続できるように。一度接続してFingerprintの確認を済ませておく。

先程のshutdown.shをいじる

#!/bin/bash
# systemctl poweroff

ssh pve "poweroff"

これでshutdown.shが実行されProxmoxがシャットダウンされる。

Ryzen CPUでGPU Passthrough出来ない問題

ProxmoxでGPU passthroughをしようと試みたけど、VMGPUを渡せていないようで上手く行かなかった。

が、BIOSのバージョンを上げたらどうにかなった話。

この人と使っているハードも症状も似通っていて、すごく助かった。

結論

  • BIOSのバージョンをAMD AGESA Combo-AM4 1.0.0.4 Patch B(3.70)にする
  • passthroughしたいGPUは2つ目以降のスロットに刺す。

構成

  • CPU
    Ryzen 7 1700
  • Motherboard
    ASRock X470 Master SLI
  • GPU (Host)
    NVIDIA ???
  • GPU (Guest Passthrough)
    NVIDIA GTX 1060

  • OS
    Proxmox 6.3

  • Kernel
    Linux 5.4.78-2-pve x86_64

パススルーのための設定

マザーボードのPCIeスロット

GPU passthrough関連のチュートリアルを見ていると、一番目のPCIeスロットにGPUを刺しているとpassthrough出来ないよ、といった注意が書いてあります。

これは、UEFI(BIOS)が起動時にROM(vBIOS)を改竄してからOS側へ渡すので、passthroughしようとすると、ハイパーバイザが正常に扱えず失敗するということのようです。つまりUEFIにパススルーしたいGPU以外のGPUを使わせれば良いということです。

多くのマザーボードではCPUに近いスロットのGPUを優先して使うようなので、一番目のスロットにホストOS用、二番目のスロットにはゲストOS用のGPUを刺すことになります。

Gigabyteマザーボードだと、UEFIの設定で起動時に使うGPUを指定出来るらしい。

CPUがCore iシリーズやAPUだったり、オンボードGPUが付いているマザーボードの場合はそっちを使えば良い(?)

ハイパーバイザ側でROMファイルを指定する

Proxmox使っているならここを見れば良い

GPUが複数枚用意できない場合、ハイパーバイザ側でオリジナルの(改竄されていない)ROMファイルを読み込ませることで、改竄されたROMを上書きするという方法もある。

ROMファイルを用意する方法は、

  • GPUから抽出
  • TechPowerUpからダウンロード

のいずれか。

GPUから抽出する場合、vfio dump gpu romとかでググれば出てくると思う。

TechPowerUpGPU関連の情報サイト。GPU-ZというツールやGPUの詳細スペック、過去バージョン含めたvBIOSのアーカイブとかあって便利。私は信頼できるサイトだと思ってる。

TechPowerUpのvBIOSファイルは、ファイル先頭にGPU-Z用のヘッダが埋め込まれているのでそのまま使えないようです。ヘッダを除去するスクリプトGithubにたくさんあります。「dump nvidia vbios OR rom site:github.com」などと調べると出てくると思います。

UEFI(BIOS)の設定

次の項目を有効化する。

Proxmoxの設定

/etc/modprobe.d/vfio.conf

options vfio-pci ids=<GPUのID>,<GPU内蔵サウンドデバイスのID> disable_idle_d3=1

IDは# lspci -nnv | less -NVIDIAを検索すれば見つけられる。サウンドバイスも一緒に指定しないとpassthrough出来ないので注意。

disable_idle_d3=1"Refused to change power state, currently in D3"というエラーに対応したとき指定したものなので、必要ないかもしれない。

/etc/modules-load.d/vfio.conf

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=pt"

modprobeを編集したのでupdate-initramfs -uでinitramfsを再生成する。

update-grubGrubのエントリを更新する。

システムを再起動する。

VMの作成

  • BIOSはOVMF (UEFI)
  • Machineはq35
  • Displayはnone

で作成する。

HardwareタブでAddからPCI Deviceを追加する。

  • DeviceはGPUの名前が表示されているのでそれを選ぶ
  • All Functionsにチェック(これでサウンドバイスもまとめて指定できる)
  • Primary GPUにチェック
  • ROM-Barにチェック
  • PCI-Expressにチェック

起動

これでVMを起動するとハングする。

dmesgには、vfio_bar_restore: reset recovery - restoring BARsとかいろいろ出てくる。

lspci -nnvを見てみると、GPUの項目が!!! Unknown header type 7fとだけ表示されている。

原因

BIOS(というかAGESA)の問題らしい。

vfio関連のスレッドを見ているとAGESAのバージョン一つでエラーが出たり治ったりといった感じで結構シビア。

私が使っているマザーボードAMD AGESA Combo-AM4 1.0.0.4 Patch Bが適用されているBIOSのバージョンは3.70。

注意書きを見てみると、

*ASRock do NOT recommend updating this BIOS if Pinnacle, Raven or Summit Ridge CPU is being used on your system.

(Pinnacle, Raven, Summit RidgeのCPUを使っている人は、BIOSの更新おすすめしないよ。)

と書いてあって怖かったけど、GPU passthroughのために4~5回BIOS焼き直してもちゃんと起動できました。(自己責任で!)

そんなわけで、冒頭で述べたようにBIOSを3.70にすることでGPU passthrough出来るようになりました。

protonvpn-cliで起動時に自動接続

protonvpn-cliのインストール

How to use the official ProtonVPN Linux CLI

$ sudo apt install -y openvpn dialog python3-pip python3-setuptools
$ sudo pip3 install protonvpn-cli
$ sudo su -
# protonvpn init

/root.pvpn-cliディレクトリがあることを確認。

Systemdサービスの作成

# systemctl edit --force --full protonvpn.service

中身

[Unit]
Description=ProtonVPN
After=syslog.target network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/bin/protonvpn c -f
ExecStop=/usr/bin/protonvpn d
ExecReload=/usr/bin/protonvpn c -f

[Install]
WantedBy=multi-user.target

protonvpn c -fだと一番近いサーバへ接続される。 例えばJPのFREE #2へ接続したいならprotonvpn c jpfree2とすれば良い。

Systemdサービスの有効化

# systemctl enable protonvpn
# systemctl start protonvpn

ip aするとproton0というネットワークインターフェイスが作成されているはず。 ping -6 ipv6.google.comみたいにIPv6接続しようとすると、ブロックされる。これはIPv6 Leakを防ぐための正常な動作。

IPリークテスト

IP/DNS Detect - What is your IP, what is your DNS, what informations you send to websites.

ipleak.netはAirVPNというアクティヴィスト向けVPNサービスが提供しているリークテストで、IPv4,IPv6がインターネット側からどう見えているのか、ブラウザの情報(UAや解像度、JSの有無など)、DNSリークしているかを確認できる。

ちなみに、FirefoxなどでDNS over HTTPS(DoH)を有効にしていると、DNSリークの部分に表示されるのはDoHプロバイダのIPになる。そうでなければ、いま接続しているProtonVPNのサーバアドレスになるはず。

DNSリークテストは他にもある。

リンク

Feature request : autostart at boot & killswitch · Issue #69 · ProtonVPN/protonvpn-cli · GitHub

virt-manager(libvirt)でUSBホストデバイスを追加できない

virt-managerでUSBホストデバイスを追加しようとしたらこんなエラーが出た。

デバイスの追加時にエラーが発生しました:
internal error: vendor cannot be 0.

要はベンダーIDを0にするなってことだと思うけど、デバイスはちゃんと選択しているはず。

XML」タブを覗いてみるとvendor idproduct idが0になっていた(なぜ🤔)

<hostdev mode="subsystem" type="usb" managed="yes">
  <source>
    <vendor id="0x0000"/>
    <product id="0x0000"/>
  </source>
</hostdev>

ということで、lsusbvendor idproduct idを調べて直接XMLを編集してやれば良い。

$ lsusb | grep -i sandisk

Bus 001 Device 002: ID 0781:1234 SanDisk Corp.

この場合vendor idが0781、product idが1234なのでXMLはこんな感じ

<hostdev mode="subsystem" type="usb" managed="yes">
  <source>
    <vendor id="0x0781"/>
    <product id="0x1234"/>
  </source>
</hostdev>

これで問題なくUSBデバイスを追加できる。

調べてみたらlibvirtのバグとのこと。 Cannot add my mouse in QEMU/KVM: "Vendor ID Cannot Be 0" : VFIO

Firefox Multi-Account Containersの設定をバックアップしたい

追記: Firefox Syncで設定を共有できます

要約

  • Firefox のコンフィグディレクト
  • Multi-Account Containers の設定ファイル
  • 設定ファイルの場所
    • %appdata%\Mozilla\Firefox\Profiles\xxxxxxxx.default\containers.json
    • %appdata%\Mozilla\Firefox\Profiles\xxxxxxxx.default\storage\default\moz-extension+++[アドオンのID]^userContextID=1234567890\idb\*.sqlite
  • アドオンIDの調べ方
    1. about:memory を開く
    2. Measure ボタンを押す
    3. 「id=@testpilot-containers」でページ内検索
    4. 「baseURL=」以降がアドオンID

FirefoxのMulti-Account Containersというアドオンの設定を、別のFirefoxへ移行しようと思ったが、どうやら設定のエクスポートは無理なようで。まあ、手動で設定し直しても良いのですが。

ググるそれっぽいIssuesがありました。

ffcontianersという、Multi-Account Containersの設定を簡単に移行できるBashスクリプトがあるようです。ただ、Windowsには対応していないです。

ということで、スクリプトを読んでみると、

という2つのファイルに設定が入ってるみたいです。(つまり、2つのファイルを手動でコピーすれば良い。)

ファイルの場所は、

アドオンのIDは環境によって違うので、この方法で特定します。

  1. アドレスバーに about:memory と入力して開く
  2. Measure ボタンを押す(メモリに関する情報が表示される)
  3. Ctrl + F で「id=@testpilot-containers」をページ内検索
  4. ヒットした行をコピーして、baseURL=以降を抽出

インポート

ファイルの場所はわかっているので、インポートは簡単です。

LinuxFirefoxのコンフィグディレクトリは ~/.mozilla/firefox/ 下にあります。

AlpineLinuxにqemu-guest-agentをインストールする

# apk add qemu-guest-agent
# rc-update add qemu-guest-agent

このままだとエラーでqemu-guest-agentが起動しないので、設定ファイルをいじる。

/etc/conf.d/qemu-guest-agent

GA_PATH="/dev/vport2p1"

再起動すると有効になる。

debianにserial経由で接続できるようにする

grub2の場合

/etc/default/grubを編集

  • GRUB_CMDLINE_LINUXconsole=tty0 console=ttyS0,19200n8を追加

  • GRUB_TERMINALserialに変更

  • GRUB_SERIAL_COMMANDserial --speed=19200 --unit=0 --word=8 --parity=no --stop=1を追加

こんな感じ

GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,19200n8"
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1"

最後にgrubの更新

# update-grub

再起動する。

Proxmox post install

  • レポジトリの追加

    1. 有償版レポジトリを無効化

      # rm /etc/apt/source.list.d/pve-enterprise.list
      
    2. 無償版レポジトリを追加

      # echo -e "\n# PVE no-subscription repository\ndeb http://download.proxmox.com/debian/pve buster pve-no-subscription" >> /etc/apt/source.list
      
  • fstrimの有効化

    # systemctl enable fstrim.timer && systemctl start fstrim.timer
    
  • サブスクリプションメッセージの無効化

    # sed -i.bak "s/data.status !== 'Active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
    # systemctl restart pveproxy
    

ZFS関連

  • ポイント

    • 先頭に4GBのswapパーティションを作成したい
    • swap on zvolは微妙?
    • ディスクは4K Sector
    • ディスク3個でRAID-5(raidz-1)
  • swapパーティションの作成

    1. gdiskなどでディスクをGPTでフォーマット
    2. swapとzfs用のパーティションを作成
    • swapの暗号化

      swapパーティションは暗号化されるべきです。

      swap用のパーティション/dev/sda1にあると仮定

      # mkfs.ext2 -L cryptswap /dev/sda1 1M
      # echo -e "\nswap\tLABEL=cryptswap\t/dev/urandom\tswap,offset=2048,cipher=aes-xts-plain64,size=256" >> /etc/crypttab
      # echo -e "\n/dev/mapper/swap\tnone\tswap\tdefaults\t0\t0" >> /etc/fstab
      

      コマンドの意味がわからない場合、ArchWikiを参照しましょう。

  • ZFSでRAID5

    1. ディスク固有のby-idを確認

      # ls -lh /dev/disk/by-id/
      lrwxrwxrwx 1 root root  9 Aug 12 16:26 ata-ST3000DM001-9YN166_S1F0JKRR -> ../../sdc
      lrwxrwxrwx 1 root root  9 Aug 12 16:26 ata-ST3000DM001-9YN166_S1F0JTM1 -> ../../sde
      lrwxrwxrwx 1 root root  9 Aug 12 16:26 ata-ST3000DM001-9YN166_S1F0KBP8 -> ../../sdd
      lrwxrwxrwx 1 root root  9 Aug 12 16:26 ata-ST3000DM001-9YN166_S1F0KDGY -> ../../sdb
      
    2. ZFS poolの作成

      # zpool create -f -o ashift=12 tank raidz1 <ディスクのby-id>
      
      • swapパーティションを別に作成した場合by-idの直後に-part2のようにパーティションを指定

        //例えば
        ata-ST3000DM001-9YN166_S1F0KDGY-part2
        
      • 4K Sectorの場合-o ashift=12を指定

      • /dev/sdaなどのデバイス名を使用すると、ディスク構成を変えたときにエラーが出る可能性があるのでby-idを使う

    3. 確認

      # zpool status
      
  • ZFSの最適化

    • relatime

      # zfs set relatime=on <pool>
      
    • 圧縮

      # zfs set compression=lz4 <pool>
      
    • ZFSが使用するメモリを制限

      /etc/modprobe.d/zfs.conf

      options zfs zfs_arc_max=8589934592
      

      バイト単位で指定

      • 8 GB = 8589934592 Byte
      • 16 GB = 17179869184 Byte
      • 24 GB = 25769803776 Byte
      • 32 GB = 34359738368 Byte

      変更するたびにinitramfsを更新する必要がある

      # update-initramfs -u
      
  • その他

    • スクラブ

      定期的なスクラブが推奨されている

      全ファイルをチェックする様なやつ

      # zpool scrub <pool>
      

      定期的な実行はcronなどを使う(週1で良い)

      systemd用のserviceとtimerもある

      https://github.com/lnicola/systemd-zpool-scrub

    • イベントに関するメールを送信

      # apt install zfs-zed
      # vi /etc/zfs/zed.d/zed.rc
      ZED_EMAIL_ADDR="root"
      # systemctl enable zfs-zed && systemctl start zfs-zed
      

      zfs-zedはrootにメールを送信。rootのメールはproxmoxに設定したメールアドレスに転送される。

       

Linuxサーバでクラウドゲーミングなど メモ

サーバはLinux、クライアントはLinux or Windows

まだ試していないけど、クライアントがLinuxならXpra、WindowsならTurboVNCでいいと思う。 サーバーはヘッドレスなのでXdummyドライバが必要かも?

Windowsゲームの実行

  • Wine
  • Windows on KVM
    • GPU Passthroughが必要でGPU1個占有される

サーバ側ソフト

  • Linux
    • jsmpeg-vnc-linux
      • jsmpeg-vnclinux移植版
      • 開発停止
    • VirtualGL & TurboVNC
      • VirtualGLはVNCGPUアクセラレーションを提供する
      • TurboVNCは高パフォーマンスなVNC
    • GamingAnywhere
      • OSSのParsecっぽいソフト
    • Xpra
      • ゲームできるの?
  • Windows
    • GamingAnywhere
    • jsmpeg-vnc
      • ブラウザとWebSocket経由で通信
      • 開発停止
    • Parsec
    • MoonLight
      • Nvidia GameStreamのプロキシ
      • GeForce Experienceが必要
        • テレメトリ

VirtualGL & TurboVNC

  • VirtualGL
    • VNCOpenGLサポートが無いか貧弱
    • VirtualGLはVNCにまともなOpenGLサポートを提供するソフトウェア
  • TurboVNC
    • TightVNC開発者 & RedHat & VirtualGLによって設立されたプロジェクト

VNC vs Xpra vs SSH X11 Forwarding

Xpra

  • VNCより新しい
  • VirtualGLをサポート
  • HTML5のクライアントがある

Thunarでsftp

Xfceのファイルマネージャー「Thunar」は、sftp経由でリモートサーバに接続できます。

必要なパッケージ

gvfs, sshfs
Void Linuxを使っているので、xbpsでインストールします。

# xbps-install -S gvfs sshfs

Thunarから接続する

  • Thunarを開いて「Ctrl+L」を押し、アドレスバーを選択します。
  • 次のように入力します。
    ssh://ユーザー名@ホスト名
  • パスワードを入力します。
    公開鍵認証を設定している場合は、鍵のパスワードを入力します。

左側のサイドバーにリモートサーバが表示されています。

~/.ssh/configを設定していると、ユーザー名などの入力を省略することができます。

リンク

Thunar を使ってリモートの場所をブラウズする - ArchWiki