「openSUSEで最強仮想環境！」という甘い話にホイホイ乗ったらハマったことの一覧

勢いだけで用意したので項目の順番とか読みやすさとかはぐちゃぐちゃです。
できそうな時にもうちょっと整理するつもりですが、実際できるかはわかりませんorz

#はじめに
元ネタの[スライドはこちら](https://www.slideshare.net/zgock/opensuse-osc2017)。スライド最後に付け足されている[補足はこちら](https://gist.github.com/zgock999/1c991ef2c74e6119db01fbc4faf7d25e)。
こんなタイトルですが**zgock先生は神**です。これ読む前はやりたくても手をつけられずにいたため、今は崇めています（
もちろん**Alex神**のことも崇めなければこの世界ではやっていけません。

#手元の環境について軽く触れておきます
* i7-6700K + Z170
    * CPU側PCIeにACS問題があると知った今となってはSkylake-Xが欲しくて欲しくて、、
* パススルーさせたいのはGTX980TiとUSBコントローラひとつとNIC
* 人間はopenSUSE初見＆Linux初級者。~~Gentoo使ってるけどemergeすら毎回ググってるし初級者~~
    * 本当はFreeBSD+bhyveでやりたいけど、Skylake/Broadwell+bhyve+PCIpassthruすると~~OSが爆発炎上してド派手に死ぬ~~それは言い過ぎかもしれませんが、[ホスト起動中に大変悲しいことになる](http://imgur.com/wiiU9Bf)ので普通にKVMです
* 書き始める前最後の構築をした時のTumbleweedスナップショットは20170726
    * 構築途上ではUbuntu17.04とかLeap42.2とかUbuntu16.04.2とか色々漂流した果てにTumbleweedに戻ってくることになりました

# ネットワークインストールのときミラーを変更する方法
* 確かLeap42.2も同様だった。*[さっき公開されたばかりなのに早くも好評を自称している42.3](https://ja.opensuse.org/Portal:42.3)は知らん！*
* 件のスライドで`riken.jp`が紹介されている。ぜひ活用したいが……
* 実は、自動起動するYaST2インストーラ上からは**一旦インストールまでたどり着いてから途中でLANケーブル引っこ抜いてダイアログ出させる**、みたいなすごく乱暴な方法を使わない限り無理
* その辺のオンラインガイドではブートストラップ画面でファンクションキー押すみたいなことが書かれているけど、今のバージョンでは何故か機能しない。
    * ではどうすればいいのかというと、**一旦Abortまたは中止を押してこいつを閉じる**とTUIのメニューが現れるので、そこからミラーを設定する
* デフォルトの`downloads.opensuse.org`はダメ絶対。運が悪いと**20KiB/secとかで5GBくらい転送し続ける**状況になる
    * ネットワークインストールの場合、ブートそのものに気の遠くなるような時間がかかる。*かかった。つらかった*
    * 環境が整っている人なら、理研から**バーニング最高速転送**（言い過ぎ）してもらえる
    * ~~NGN IPoE民のための~~IPv6鯖は本家にすらないっぽい

# Skylake環境依存と思われる問題
* 仮想マシンにSMPを設定する、または2048MBを上回るRAMを与えるとOVMFが正しく起動できず、**CPU時間を無限にmogmogするだけのカビゴンVMが誕生**する
  * 二つの条件は片方でも満たすとカビゴン化するので、ゲーマーは*フリーソフト（死語）だと思って遊び始めたら体験版だった時の顔*をする羽目に
     * redditのArch板~~だっけな？~~に同じ症状で悩んでいる人たちがいた~~っぽかった感じがした~~ので、多分これは近頃のOVMFがバグを抱えているということだと推測
         * QEMUも怪しかったが、回避を達成した結果からバックポートすれば**犯人はOVMFだった**
     * なお、この時使ってみたLeap42.2では`vfio`系統のカーネルモジュールをロードさせるのに難儀。いろんな方法を調べたが、手元の環境では奇跡の一回以外は二度とできなくなってしまった……。
     * じゃあ正解はというと、**TumbleweedでKVMの構築まで済ませてからOVMF本体の入ったLeap用rpmをもらってきてコマンドでインストールする**こと
    * 上記問題を回避したいからといって迂闊にLTS版Ubuntuとかの古いカーネルが入るディストロを使うと下記の**Z170利得**が失われて悲しい結果になる
        * Z170チップセットには（英語があんま読めないなりにAlex大明神の記述を見るにどうも半端で苛だたしい実装らしいが）ACSが実装されており、CPU側は相変わらず分離できないながらチップセット側は*幸運な人には*うまく分離してくれる。*してくれた*
            * このため*x4でも大概十分である（偏見）*ゲーム用途の人はACSオーバーライドを使わず、グラボをサウスブリッジ側に回すのも選択肢
            * 他のチップセットで同じことをすると~~まず間違いなく大量のおまけをつける羽目になるので~~素直にCPU側のままACS上書きした方が賢明
            * 同世代の下位であるH170以下でどうなるのかは私の読解力ではわからず要人柱
        * openSUSEのカーネルはTumbleweedでもLeap42.2でもこいつを扱えるが、Ubuntu16.04.2のデフォルトカーネルはこいつを扱えずにチップセット側のパススルーが超どんぶり勘定になってしまう
            * 一回テストで使った17.04のカーネルは恐らく大丈夫だった~~はずだが自信はあんまりない。~~
            * おまけ情報：実は、openSUSEの`ovmf`パッケージには`README`しか入っていない。`qemu-ovmf-x86_64`を入れよう
    * ~~この手のSkylake不具合、大概Haswellは大丈夫でBroadwellは駄目なイメージがある。実際どうかは要人柱~~

#日本語入力メソッドについて
 * どのデスクトップ環境を選んでも、**デフォルトでは~~悪名高い~~iBusになっている**。YaST2インストーラは入れるパッケージを全部手で指定できるようになっているので、気になる人は必ずfcitxに変更
 * *ただ、私がわずかに使った範囲ではiBusで困ることもなかったので、気にならない人は放置でも駄目ではないかも*

#ホストネームについて
 * 地味に**YaST2では設定できない**。素直に`hostnamectl set-hostname`しよう
 * でも現行Tumbleweedでは~~それだけだと`libvirtd`とかがsystemdの片隅で人知れず愚痴ってたりするので~~`hosts`にも書いとく
     * OSが認識する自ホストネームは設定できないYaST2だが、こっちはなぜか設定できる
     * 一方、Leap42.2のYaST2は自分のホストネームもちゃんと設定できた~~気がする~~

#X転送について
 * これは、すらっぐが手持ちのMacを使った限り今のTumbleweedでは何やってもダメ。ファイアウォール切ろうが何しようがディスプレイサーバに弾かれたでござるとかのたまう
 * 一方Leap42.2では何の問題もなくできたので、ただいまのバージョンに何か問題があるのではなかろうか。~~まあ我がMacの`/etc/ssh/ssh_config`他が残念な可能性の方が高そうだけど~~
 * というわけで人によってはスライド通りいきなりnomodesetつけちゃうとドボンするので、あらかじめX転送がうまくいくことを確認してからランレベル下げる準備に入ると良いでしょう

#BIOSについて
 * ASRockの某Z170ﾏﾏﾝを使っているが、x2apicの無効化ビットとやらを解除する設定はどこにも見当たらなかった。このような場合はカーネルオプションには`intel_iommu=on`の他に`intremap=no_x2apic_optout`をつけておきましょう、なんて案内がされている。`dmesg`にも出るので、直接コピペするとoptoutをoutputと書いてしまうこともなくてgood
 * といいつつ、xapicモードのままで現実に何かしんどい問題が発生するのかどうかは不明。そのままでもよかったのかな

#キーボード配列について
 * JISキーボードを使っている場合。インストール時に指定するキーボード配列は、Tumbleweedにおいてはなぜか完了後にYaST2からもう一回設定しないとUSになってしまう。~~dmesgをパイプしようとして気づきイラつくのはもはや一つの儀式と言っても過言ではない~~
 * なおLeapでは何の問題もなくインストール時の配列になってたので、ただいまの（ry

#HiDPIモニタで設定する場合のもろもろ
 * 私の場合は一枚のdGPUさえパススルーできればオッケーだったので、i7-6700K内蔵のHD530はホストに使ってもらいました
     * 本当はMac miniからVNCしたいけど、どうしたことかVNCは繋がるけど肝心の画面は真っ黒
     * UEFIでのプライマリがオンボードになっていても、YaST2はdGPU優先でインストールリスト組んじゃうので`xf86-video-intel`を手動指定しませう
 * **インストール時にデスクトップ環境を好き放題選べる**天国のようなYaST2インストーラだが、HiDPIモニタをお使いの方はKDE PlasmaかGNOMEがよろしい感じ
     * この二つは各々の設定ツールから普通にスケーリングの設定ができるので、私のようなHiDPIありきで27インチしかないUltraHDモニタ使ってるような人はちょっとサイズが大きくてもこいつらを採用した方が後々の不幸が少ない
        * 他の環境ではArchWikiを参考に設定することになるけど、結局拡大してくれるのは文字だけだったりモニタ全部一緒くたに拡大しちゃったりぽつぽつ対象外アプリが生じたりいい感じに残念という印象

#zgock先生の公開されているリポジトリをどうやって使えばいいのか？
 * YaST2から「ソフトウェアリポジトリ」を選択する~~のだが、その先は初めて触った人にはちんぷんちんぷんぷんな世界に突入する~~
 * 追加ボタンを押すとまずリポジトリ名、これは単なる名前~~のくせに2バイト文字が入ってると怒られる~~
 * URLは`build.opensuse.org`のURLでは駄目。スライドに書いてあるURLのページはまずGPG鍵をメモるだけの用途で、Repositories->Go to download repository->開いたページの`download.opensuse.org`なURLをここに入れて進めばOK
     * なおURLスキームが入っていないと怒られるので`http://`からちゃんと打つこと

#zgock先生のパッケージの美味しいいただき方
 * YaST2やメニューからソフトウェア管理を起動すると、インストール直後はタブが三つしかない。左の`表示(V)`の中にリポジトリごとで集計してくれるタブが隠れているので、選んで用意する
 * こうしてzgock先生のパッケージが一覧できるようになるが、油断してはいけない
     * kernel関係がいろいろあるが、当初からチェックが入っている`kernel-default`の`バージョン(V)`内でまずチェック対象をメインリポジトリのものからzgock先生のものに切り替える
        * 通常、このタブはラジオボタンで選択する内容になっているが、カーネル関連のパッケージだけは例外になっておりチェックボックスで複数選択が利くようになっている
        * ここで不用意に他の`kernel-*`パッケージに触れるとOSの起動に失敗して~~`snapper`神に「神は言っている……ここで死ぬ運命ではないと……」してもらう円環の理に導かれて~~しまうことがあるので注意
     * 続いて必要な人は`zfs`のチェックを入れると推奨パッケージでいろんなやつにチェックが入るが、kernel系の奴らは全部公式リポジトリの奴らが指定されてしまうのでこれらもzgock先生のものに変えておくと安心。そうはせず`kernel-default`以外全部公式最新版使った場合どうなるかは試していないので不明。
     * *私はこのあと目についた`zfs-dracut`も入れておいたが、root on zfsにしてるわけでもないのに本当に必要かは不明*
 * 全て適切な操作で完了まで行けば、YaST2から「新しいカーネルになったのでリブートしてちょ」って言われる
 * この後、ZFS入れた人は`systemctl status`すると`degraded`とか言われる
     * `systemctl --failed`すると`zfs`のカーネルモジュールがないっすと申し出があるので、`dkms`先生に`install`してもらいましょう

#今のTumbleweedではYaST2の「ハイパーバイザとツールのインストール」が機能していない
 * 出てくるダイアログでKVMやその管理ツールにチェックを入れても、「インストールに失敗しました」と~~冷たい一言と共に~~閉じてしまう
 * めげずに、`ソフトウェア管理`の方から`表示(V)`→`パターン(N)`で`KVMホストサーバ`にチェックを入れよう
 * ところが、このチェックボックスは`libvirt`をスルーする~~ガバガバ兄貴な~~のでそれには忘れず自分でチェックを入れておくこと
 * *これで動くと思うじゃろ？*……まだ仮想マシンマネージャーは動かない。YaST2の`サービスマネージャ`から`libvirtd`を有効にする作業をきっちりやってやる必要がある
 * なお、**Leap42.2ではこの辺り全く正常に機能した**
    * *でもLeapはLeapで後述の問題で悲しいことになるわけで*
 * ~~しかし、なんかローリングリリースとはいえ作り込み具合のわりに結構各部がゆるゆるなのが気になる……~~

#INITRD_MODULESの書き方について
 * 多分、snapper活用という意味では空っぽの`INITRD_MODULES`を`/etc/sysconfig/kernel`に書いてから`/etc/sysconfigエディタ`で中身を書くのが正しい
     * なお、YaST2の/etc/sysconfigエディタで新しいファイルや項目を作ることはできないし、作った`INITRD_MODULES`も`System`の`Kernel`ではなく`Other`の`etc`の`sysconfig`の`kernel`という~~島流しされたとしか思えない~~位置に出現する。
 * 私はスライドに書かれていた`pci-stub`が必要な場合というのがどんな場合かわからなかったので、`vfio`系だけ登録
 * 変更するとその直後に「変更の有効化」なんてのが出てきてこれ見よがしにチェックマークが入ってからダイアログが閉じるが、**もちろん有効化なんてされていない**
     * 大人しく`mkinitrd`しましょう
     * なお、**Leap42.2は全く同じ作業ができるが、なぜかやってもモジュールを読んではくれない**。その他`/etc/dracut.conf.d/somewhat.conf`など書いても読んでくれず、何かの拍子に一回成功したと思ったらそのカーネルはリブートすると起動しなくなり、何故かsnapper神すら跳ね返し（XFSである/homeのdotfilesあたりに何かあった？）OSごと再構築してもう二度と再現できず、、結局諦めてしまった。

#code 43 hellについて
 * 再構築の度についつい対策し忘れる。~~はいみなさんご一緒に、[NVIDIA: **** you!](https://www.youtube.com/watch?v=iYWzMvlj2RQ)~~
 * ArchWikiを見に行くと、スライドでの指定部の他に[書き足すべき項目がもう一つある旨書かれている](https://wiki.archlinuxjp.org/index.php/OVMF_%E3%81%AB%E3%82%88%E3%82%8B_PCI_%E3%83%91%E3%82%B9%E3%82%B9%E3%83%AB%E3%83%BC#Windows_.E3.81.AE.E4.BB.AE.E6.83.B3.E3.83.9E.E3.82.B7.E3.83.B3.E3.81.AB_NVIDIA_.E3.81.AE_GPU_.E3.82.92.E3.83.91.E3.82.B9.E3.82.B9.E3.83.AB.E3.83.BC.E3.81.97.E3.81.9F.E5.A0.B4.E5.90.88.E3.81.AB_.22Error_43_:_Driver_failed_to_load.22)ので一応参照のこと
 * ~~ところで、ダブルクォーテーション付きで”code 43 hell”でググっても3つしか見つからない上にそのうち2つがこのスライド関連なのですが本当に言われてるんでしょうか~~

#助けて！増やしたはずのCPUスレが1つしかないの！
 * **うろたえるな！**OVMF自身が起動できていれば、`virsh`コマンドからvcpuを増やした上でゲストをリブートせしめれば拙者の場合はなんとかなったでござる。~~それで駄目なら拙者にはわからぬw~~

#vfio-pciでパススルーするデバイスの指定について
 * 先生によればファイル名自由とのことでしたが、openSUSEの場合は元から`99-local.conf`というお誂え向きの空っぽファイルがあるのでこだわりのない人はそこに書けばOK
    * ~~ところで、systemdとかでよく見るこの手のファイル名冒頭の番号は何なのだろう。名前順ソート最適化のため？~~
 * ~~もしかしてこいつに書いては駄目なのかと邪推した結果トラブルシューティングにかかる時間が増えたりしてた~~

#ホストの起動時にwickedがぐずってめっちゃ時間かかる問題
 * **持病です。**直す方法は、お持ちのルータをDHCP及びRSのリクエストにちょっぱやで応答してくれるように仕上げることです 

# 今回参照した資料はもうとっちらかりすぎてあんま覚えてないっす
 * 偉大なる元ネタ様は冒頭でリンク貼ったのでよしとして、、
 * 総合
    * [https://wiki.archlinuxjp.org/index.php/OVMF_による_PCI_パススルー]( https://wiki.archlinuxjp.org/index.php/OVMF_%E3%81%AB%E3%82%88%E3%82%8B_PCI_%E3%83%91%E3%82%B9%E3%82%B9%E3%83%AB%E3%83%BC)
 * IOMMU関連
    * http://qiita.com/nvsofts/items/afe8f61bfd6ac8cdc1c3
    * https://www.howtoforge.com/community/threads/your-bios-is-broken-and-requested-that-x2apic-be-disabled.66428/
 * Leap42.2で困った時参照し~~て奇跡の1ブートののち玉砕し~~た情報源
    * https://forums.opensuse.org/showthread.php/522015-VGA-PCI-Passthrough-guide-on-openSuSE-Leap-42-2/page2
 * VNCとかHiDPIとか
    * https://doc.opensuse.org/documentation/leap/reference/html/book.opensuse.reference/cha.vnc.html
    * https://wiki.archlinuxjp.org/index.php/HiDPI
 * virshについて
    * https://www.ibm.com/support/knowledgecenter/ja/linuxonibm/liabp/liabpcommonvirsh.htm
    * http://qiita.com/TsutomuNakamura/items/22d9d2629a8eb9360865
 * その他多数、URL回収できたらまた貼ります

取り急ぎこんな感じで失礼します<(_ _)>
どうか、KVMで地獄のどハマりを経験する人が減りますように。