けさらんぱの自由帳

とあるFF14プレイヤーがFF14のこととか関係ないことを書いていく予定のブログです。記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

【FF14】【ID愛でる会Aegis】スカラ観光

スカラの観光に行きたい、と数日前から言っていたのですが、今日やっと行けました。一緒に行ってくれたみんなありがとう!!

いつもの雑まとめです。

1ボスまで

地面からは赤と白のちょっと変わった植物のようなものが生えています。塩湖の底なので、海藻のようなものなのかも知れません。自分はこれを見て、お刺身によくついてくる海藻を思い出しました。多分別物だとは思いますが。

f:id:KesaranPa:20171104023750j:plain

近くには大きな結晶があります。他のIDだとこういうのはだいたいクリスタルなのですが、ここでは塩の結晶ではないかと思います。

f:id:KesaranPa:20171104023539j:plain

そして魚卵。なんだかお腹が空いてきました…

f:id:KesaranPa:20171104024242j:plain

1ボス

f:id:KesaranPa:20171104024518j:plain

このボスは、戦闘が開始されるまで戦闘フィールドをうろうろしています。もしかしたら視界に入らないようにしたら後ろに回り込めるのではと思ったらできてしまいました。その後すぐに見つかってしまいSSは撮れませんでしたが。

2ボスまで

道中の柱に模様があります。下のほうの小さいものは最初文字かと思ったのですが、模様が欠けているだけのようです。その上の大きめの模様は何なんだろう。ゲルモラ関連の場所にゲルモラのシンボルがあるように、これがスカラのシンボルなのかも。

f:id:KesaranPa:20171104025009j:plain

そしてこのエリアは天井にところどころ穴があります。でも真っ白で何も見えません。このSSを撮ったときはエオルゼア時間で夜だったので、このIDは時間が固定されているIDのようです。

f:id:KesaranPa:20171104025518j:plain f:id:KesaranPa:20171104025525j:plain

道中、食器が置いてあるのですが、このIDの奥の方にあるものと違い、財宝という感じではありません。もしかしたらスカラの人々が使用していた物なのかも。でもなんでこんな所にぽつんと置いてあるんだろう。

f:id:KesaranPa:20171104030036j:plain

2ボス

f:id:KesaranPa:20171104030617j:plain

このボスは、時々ファットキャットが中にいます。今回はいなかったのですが、いるときは円形範囲攻撃のときに出てきます。以前撮影したのがこれです。いたりいなかったりするのはシュレディンガーの猫的な話なのでしょうか。それともファットキャットは何かを企んで光の戦士を倒そうとしている…?

f:id:KesaranPa:20171104030624j:plain

3ボスまで

薄暗いダンジョンでよくある、誰がこの蝋燭点けているんだ、っていうやつです。細かいことは考えないことにしましょう。

f:id:KesaranPa:20171104031401j:plain

このエリアの最初の方で、見たことのある大砲が置いてあり、この場所からアラミゴの財宝が置いてあるのだとわかります。

f:id:KesaranPa:20171104031604j:plain

その財宝ですが、ミイラが落ちている近くだったり、ミイラの上に置かれていたりします。これは多分、スカラ時代にお墓だったものを、テオドリックさんが財宝を置くためにミイラを移動させて財宝をつめたんじゃないかと思います。しかしミイラも財宝も置き方が雑です。テオドリックさんの性格かな?

f:id:KesaranPa:20171104031911j:plain f:id:KesaranPa:20171104031921j:plain f:id:KesaranPa:20171104032209j:plain

そしてこのエリアにはところどころに肖像画があります。全て違う人のようですが、一体誰なんだろう。

f:id:KesaranPa:20171104032629j:plain f:id:KesaranPa:20171104032637j:plain f:id:KesaranPa:20171104032644j:plain

テオドリックさんのお抱え呪術師が設置したと思われる祭壇。中央の骨は何なんでしょう。アルドゴートかと思うのですが、呪術師がザナラーンから持ってきたのかな。

f:id:KesaranPa:20171104033110j:plain

そして最後のボス前の封印。この手の模様、いろんなIDで見かけますが、この模様はここ以外で見たことない気がします。

f:id:KesaranPa:20171104033118j:plain

FF14をLinuxの仮想環境で動かす話・その2

ホストOSの設定

VFIOの設定

GPUをパススルーするには、ホストOSがGPUを使わないようにしないといけません。 /etc/modprobe.d/vfio.conf に下記の設定をしています。

options vfio-pci ids=10de:1b80,10de:10f0,1b21:1242 disable_vga=1
blacklist nouveau

10de:1b80はGPU、10de:10f0はGPUのオーディオデバイスHDMI出力)、1b21:1242はUSBコントローラです。 disable_vgablacklist の設定は不要かも知れません。

また、 /etc/mkinitcpio.confMODULESvfio vfio_iommu_type1 vfio_pci vfio_virqfd を追加して、 sudo mkinitcpio -p linux を実行します。

カーネルコマンドラインオプションの設定

カーネルコマンドラインオプションに下記の設定を追加しています。

threadirqs intel_iommu=on default_hugepagesz=1G hugepagesz=1G hugepages=8

threadirqs は不要かも知れません。 intel_iommu=on は必須です。 default_hugepagesz=1G hugepagesz=1G hugepages=8 はOSのメモリを仮想環境用に予約しておくために追加しています(この場合は8GiBの静的ヒュージページ)。

仮想環境の設定

仮想環境の設定にはlibvirtを使用しています。OVMFが必要になるので、 Arch LinuxのWiki を参考にして /etc/libvirt/qemu.conf とsystemdの設定をします。

メモリ

ここからlibvirtの定義ファイル( /etc/libvirt/qemu/win.xml )を順番に説明していきます。

<domain type='kvm'>
  <name>win</name>
  <uuid>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</uuid>
  <memory unit='GiB'>8</memory>
  <currentMemory unit='GiB'>8</currentMemory>
  <memoryBacking>
    <hugepages/>
    <nosharepages/>
  </memoryBacking>

容量はカーネルコマンドラインオプションで指定したのと同じ8GiBです。 hugepages は予約した領域(静的ヒュージページ)を使う設定です。手元の環境では静的ヒュージページではなくても動作はしたのですが、空きメモリの断片化が進んだときに何が起こるか分からないので静的ヒュージページを使っています。 nosharepages はメモリマージを無効にしますが、無くてもいいと思います。

CPU

  <vcpu placement='static'>6</vcpu>
  <iothreads>1</iothreads>
  <cputune>
    <vcpupin vcpu='0' cpuset='1'/>
    <vcpupin vcpu='1' cpuset='5'/>
    <vcpupin vcpu='2' cpuset='2'/>
    <vcpupin vcpu='3' cpuset='6'/>
    <vcpupin vcpu='4' cpuset='3'/>
    <vcpupin vcpu='5' cpuset='7'/>
    <emulatorpin cpuset='0'/>
    <iothreadpin iothread='1' cpuset='4'/>
    <vcpusched vcpus='0-5' scheduler='batch'/>
    <iothreadsched iothreads='1' scheduler='batch'/>
  </cputune>

CPUは3コア6スレッド分を仮想環境に割り当てています。仮想CPUの6スレッドとエミュレータスレッドとIOスレッドの8スレッドを物理CPUの8スレッドに固定しているのですが、i7-6700KとQEMUではコア番号とスレッド番号の対応が違っています。

f:id:KesaranPa:20171030231801j:plain

仮想CPUと物理CPUで構成が違うとパフォーマンスに影響がありそうなので、こんな設定になっています。ちなみにコアとスレッドの関係は、適当なLinuxを起動して、 cat /proc/cpuinfo してidを見ると分かります。

システム

  <os>
    <type arch='x86_64' machine='q35'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/ovmf/x64/OVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/qemu/nvram/OVMF_CODE.fd</nvram>
  </os>
  <features>
    <acpi/>
    <apic eoi='on'/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='4095'/>
      <vpindex state='on'/>
      <runtime state='on'/>
      <synic state='on'/>
      <stimer state='on'/>
      <reset state='on'/>
      <vendor_id state='on' value='0123456789ab'/>
    </hyperv>
    <kvm>
      <hidden state='on'/>
    </kvm>
    <vmport state='off'/>
  </features>
  <cpu mode='host-passthrough' check='none'>
    <topology sockets='1' cores='3' threads='2'/>
  </cpu>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup' track='guest'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
    <timer name='hypervclock' present='yes'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <on_lockfailure>poweroff</on_lockfailure>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='yes'/>
  </pm>
  <devices>
    <emulator>/usr/sbin/qemu-system-x86_64</emulator>

このあたりはよく分かっていないので、コピペしてきたものをつぎはぎしてそのまま使用しています(ぉぃ

ストレージ

    <disk type='block' device='disk'>
      <driver name='qemu' type='raw' cache='writeback' io='threads' discard='unmap'/>
      <source dev='/dev/mapper/vg0-win'/>
      <target dev='sda' bus='scsi'/>
      <boot order='1'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw' cache='writeback' io='threads' discard='unmap'/>
      <source dev='/var/lib/libvirt/images/virtio-win-0.1.141.iso'/>
      <target dev='sdb' bus='sata'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>

io='threads'io='native' の方がいいかも知れません。CDROMにはvirtioのドライバディスクが入っています。Windowsのインストール時にそのままではディスクが読み込めないと言われるので、このイメージ内のドライバをロードします。

PCIeルートポート

    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='pci' index='1' model='pcie-root-port'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>

QEMUのドキュメント によると、PCIeバスのルートには

  • PCIバイス
  • PCIeルートポート
  • PCIe to PCIブリッジ
  • ルートコンプレックス

しか置けないそうです。それ以外のPCIeデバイスを接続するために、PCIeルートポートをPCIeルートに接続しています。

仮想コントローラ

    <controller type='scsi' index='0' model='virtio-scsi'>
      <driver queues='6'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
    </controller>
    <controller type='sata' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
    </controller>
    <controller type='usb' index='0' model='nec-xhci'>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x3'/>
    </controller>
    <interface type='bridge'>
      <mac address='xx:xx:xx:xx:xx:xx'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0' multifunction='on'/>
    </interface>
    <graphics type='vnc' port='59xx' autoport='no' listen='0.0.0.0' keymap='en-us'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='virtio' vram='16384' heads='1' primary='yes'>
        <acceleration accel3d='yes'/>
      </model>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x2'/>
    </video>

色々な仮想コントローラを接続しています。マルチファンクションでできるだけ1つにまとめていますが、デバイスが多くないのでそこまでしなくていいかも知れません。GPUは、VNC経由でマウスとキーボードを使うために接続しています(Windows側で画面は無効にしています)。

パススルーデバイス

    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0' multifunction='on'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </hostdev>

GPUとUSBコントローラをパススルー接続しています。

メモリバルーン

    <memballoon model='none'/>
  </devices>
</domain>

PCIパススルーを使うときは、メモリを動的に増減させることはできないので、無効にしています。

Windowsインストール後の設定

GeForceはMessage Signaled Interrupt (MSI)に対応していますが、何故かデフォルトでは無効になっているので、Windowsインストール後に有効にする必要があります。レジストリエディタで HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\PCI\<XXX>\Device Parameters\Interrupt Management\MessageSignaledInterruptProperties ( <XXX> は各デバイスで異なる) に MSISupported というキーを作って、値を 1 にします。


もしかしたら抜けや間違いがあるかも知れません。何かあったら教えてもらえるとありがたいです。

FF14をLinuxの仮想環境で動かす話・その1

今から1年ほど前、PS4FF14をしていたのですが、自宅サーバーとしても動かしているLinux PCと2台並んでいるのは結構邪魔なので、なんとか1台にしようとしていました。そこでWindowsLinuxデュアルブートのPCに切り換えようとしたのですが、デュアルブートも面倒なところがあるので、ふと仮想環境で動いちゃったりはしないだろうか、と思って試してみました。普通はWindows上でHyper-VとかVirtualBoxLinux環境を動かすものだと思うのですが、Windowsに個人的に不信感があって、PCの根っこを握られるのはできれば避けたい、という理由から、LinuxKVMWindowsFF14を動かそうとしたら結構動いてしまいました。

ただ、日本ではあまりデスクトップPCでLinux使う人が少ないし、Arch Linuxの記事を除くと、日本語ではLinuxの仮想環境でゲームをするという具体的な情報があまりありません。この記事では、誰かの役に立つのかどうかはわかりませんが、Arch Linuxの記事に従いながら、LinuxKVMFF14を動かしているうちの環境と設定を紹介していきます。

ちなみに、ベンチマークはこのくらいになります。ベアメタル環境で動かしたときから10%くらい性能劣化していると思います。

f:id:KesaranPa:20171030023559j:plain

準備

規約の確認

まずは規約の確認です。技術的に可能でも規約で禁止されていたらできません。ファイナルファンタジー® XIV ソフトウェア使用許諾契約を見ると

あなたのコンピュータ又は家庭用ゲーム機(本ソフトウェアによって適宜)にインストールして使用することができ

という書き方になっていて、仮想環境を禁止している雰囲気はなさそうです。

まあ…

(a) 本ソフトウェアを改変、リバースエンジニアリングによる解析、逆コンパイル、「ハッキング」又は逆アセンブルすること、 (中略) すべて禁止されています。

ってあるから、アレとかソレとかアウトのはずなんだけど、黙認されている現状だとねぇ…

とはいえ、規約の解釈は個人で行わないといけないものなので、この記事の内容は鵜呑みにせず各自で判断してください。

ハードウェア構成

うちのPCのハードウェア構成です。単純な仮想環境だと当然ゲームができる性能にはならないので、PCIパススルーというものを利用してGPUをパススルーします。PCIパススルーを利用する関係で、IntelのCPUの場合は システムがVT-x/VT-dに対応していることが必要 となります。

ホストOSソフトウェア環境

仮想環境を実現するためのソフトウェアの構成です。

基本的に現在の最新ですが、ovmfのみqemuの最新バージョンとの相性が悪いので、Testingから持ってきています。カーネルはRTパッチを当てなくてもいい、というかむしろ自力コンパイルも必要ないと思います(ほとんど趣味です)。

仮想環境構成

  • Machine: Q35
  • CPU: Intel Core i7-6700K(3コアのみパススルー)
  • RAM: 8GB
  • dGPU: GeForce GTX 1080(PCIパススルー)
  • xHCI: ASM1142(PCIパススルー)

iGPU(Intel CPU内蔵のGPU)、xHCIのうちSunrise Point-HはホストOS側で使用します。

次回から、具体的な話に入っていきます。

記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。