OpenStackでVDI環境を作ろうとした話

結論から言えばWindows10 – RADEON RX460のGPUパススルー、USBパススルーはできた。
しかし安定性が悪かったので挫折。

どの程度役に立つかはおいておいて、日本語の情報がなくて苦しんだので少しでもアウトプットしておく。

きっかけ

OpenStackってAWSっぽい感じのダッシュボードで仮想マシン管理できるらしいと聞いて、試してみたくなった。メインPC上で集約させて一つのPCしか起動しないようになれば電気代が安くできるのではなどと淡い期待を抱いていた。
これが一週間に及ぶセットアップ地獄の始まりだった。

まずは環境構築

参考になる日本語のページは少ないが、環境構築だけでいえばかなりきっちり書いてくれている人たちがいるのでこの辺りを見つつ入れる。
packstackならこの記事
OpenStack Mitakaの導入 (Win7, Virtual Box, CentOS 7, RDO)
それぞれインストールするならこの記事
VirtualBoxで作成したCentOSにOpenStackを構築する(環境編)

初っ端からログイン画面で最新のChromeだとログインできないという罠。Edgeを使った。
packstackでインストールする場合、SAHARAは使用していなくてもなぜかCPUを使い続ける現象が発生したので要らなければ外したほうがいいかも。

Windowsの仮想マシンを用意

参考:OpenStackで使用可能なWindows10イメージの作成方法
WindowsはvirtioのHDDを認識してくれないので、別途作った仮想マシンのファイルをOpenStackに投げ込む。後々困らないようにvirtio-winの中身はマイドキュメントあたりに移しておいたほうが安心。(一回イーサネットアダプタのドライバをqcow2に含め忘れて詰んだ)

PCIパススルー

GPUもUSBコントローラもPCIデバイスなので、手順はまとめます。
GPUパススルーは言わずもがなですが、USBコントローラもセットでパススルーしてやれば普通のデスクトップ環境のように使えて幸せになれます。
ちゃんと動けば。

grubの上書き

参考: CentOS7 KVMでPCIパススルー(GPU含む)
GRUB_CMDLINE_LINUX_DEFAULT に次を追加(intel_iommuはインテルの場合のみ)
自分はpci-stub.idsはUSBコントローラの物のみ追加しました。

そのあと、コマンドで

ブラックリストへの追加も行う。

/etc/nova/nova.confの書き換え

めちゃくちゃハマりポイント

パススルーするデバイスの指定をします。ここではvendor_id,product_idをそれぞれ1002:47ef、1b12:1242とを例にして記述します。
まずはpci_aliasを設定。フレーバーにデバイスを指定するときの名前です。複数ある時は分けて書きます。

次にpci_passthrough_whitelistを設定。複数ある時はJsonのArrayにまとめます。

vendor_id,product_idの16進部分は小文字で書きましょう
コンフィグファイルのバリデーションには引っかからないのに、インスタンスを起動したタイミングで実行できるホストが無いというエラーが吐かれます。単純に文字列比較してる…?

scheduler_available_filtersの追加

scheduler_default_filtersに追加

flavorにPCIデバイスを追加するときの書き方


あとは tail /var/log/nova/nova-* 等してERRORを探してください。
スタックトレースが出てるので、ソースを追いましょう。(エラーメッセージでググって情報にたどり着けるのはレアです)

カテゴリー: 未分類 | コメントする

[Java]定期的に処理をさせる

これまでJavaでバッチを作成して、Javaのバッチを起動するシェルスクリプトをcronから起動するなんて事をやっていたのですが、JavaVMを常時起動させてもっと短い間隔で処理をしたいと思っていました。


追記:
java.util.Timerクラスで全く同じことができるようです。知らなかった。。


やろうとしたこと

・10秒に1回処理をしたい
・多重に起動したくない(簡単なら処理終了から10秒経過したタイミングで再度実行したい)

昔に組んだシステムではcronで5分毎にJavaのバッチを起動し、さらにJavaのバッチ側で特定のポートのListenを試行して、多重起動を防止していました。
この実装では処理終了から5分ではなく、5分に1回動こうとしているため、バッチが6分かかった場合などに4分間隙間が空いていました。
それを防ごうと機能を追加していった結果アプリケーションの動作フロー全体がスパゲティになっていた。。閑話休題。

ScheduledExecutorService

探していたら目的にぴったりの標準APIがありました。

こんな感じ。
このAPIが追加されたのは1.5のようですが、上のサンプルコードではラムダ式を使っているのでJava8の必要があります。

サンプルコード中で使用しているscheduleWithFixedDelayメソッドを使用すると、実行後からの時間を指定できます。
scheduleAtFixedRateメソッドにすると実行時間に関係なく可能な限り指定時間ごとに呼び出されるようです。こちらは多重起動もありえるみたい。
今回のコードではnewSingleThreadScheduledExecutor()でScheduledExecutorServiceを作成しているので、多重起動は起こりません。

単発で時間指定して処理を走らせることもできる。詳しくはJavadoc参照。

mainメソッドが終わってもScheduledExecutorServiceが生きているとVMのプロセスは死なないので注意してください。

確かめてみるとこんな感じ。
・ScheduledExecutorServiceがnewされて、何もscheduleしていないとプロセスは止まる。
・何かscheduleした場合はfutureのcancelだけではプロセスは生き残る。
・shutdownしたらプロセスは止まる。

おまけ:cronもどきのライブラリ

実はcronで秒まで指定できないのを失念していたので色々探してしまった。
ただ、曜日や毎時10分と15分、などといった複雑な条件を指定したければライブラリを使うしかなさそうなので機会があれば使うかも。

・cron4j
cronとして使うにはシンプルだったが、秒単位での動作はできなかった(当たり前)。

・quartz
簡単には使えそうになかったので確かめなかった。

カテゴリー: Java, プログラミング関連 | コメントする

LINE Bot APIを試してみた

ローカルの開発環境からメッセージを送信するところまで試してみた。
Javaで呼び出したコードが全然ヒットしなかったので雑だけど公開してみる。

続きを読む

カテゴリー: Java, Web関連, サーバ関連 | 1件のコメント

TrueTypeFontのファイルフォーマット調べ書き

なんとなく調べてみました。
日本語のまとまった文献がほとんどなくてしんどかった。

続きを読む

カテゴリー: プログラミング関連 | コメントする

[ツール]BFNT+ファイル→PNG変換

PC98でmaster libに頼った時にお世話になった*.bftという画像ファイル。

調べてみるとBFNT+フォーマットというらしい。残念ながら時代の流れで消えていってしまったのか、検索しても最近の日本語のページは全然ヒットしませんでした。

昔のフロッピーから発見したBFTファイルを掘り出したのですが、見れるソフトがなかったためPNGに起こすツールを作りました。もしかすると他に使う人がいるかもしれませんので公開しておきます。需要なさそうだし汎用性なくて(※後述)実用に耐えるか不明ですが。

このプログラムを使用したことによる損失に関しては一切の責任を負えませんので、自己責任でお使いください。

BFTConv.zip

BFNT+の形式で保存されている、現存するファイル自体がレアな代物だと思います。自分の手元には1つしかなかったので、このプログラムはそれ専用に組んでいます。

具体的にはサイズ32×32で色数16,画像数64固定になっています。

この条件以外の画像に使用したい場合は、ソースを添付してあるので改造してみてください。

サイズや画像数は定数で指定してあるだけなので書き換えるだけで通ると思いますが、色数が変わると1ピクセルごとの情報を格納する方法が変わるため頑張る必要がありそうです。

カテゴリー: Java, プログラミング関連 | コメントする

【Java】リフレクションの高速化手法-改訂版

メソッド名やその引数が可変な状況でのリフレクションは非常にパフォーマンスが悪いです。その処理をネイティブでの呼び出しと同レベルまで引き上げるのが今回のお題です。

続きを読む

カテゴリー: Java, プログラミング関連 | 1件のコメント

[JSP]continueを使ったらコンパイルエラーになる時の対処

本当に自分用メモなので最小限。

JSPを書くときは可読性をすこしでも上げようとしてifやforの閉じ括弧は行の初めに書いているのですが、以下の記述でコンパイルエラーが発生しました。

なぜコンパイルエラーになったかというと、continue;の後に改行を打ち出す処理が付け加えられて到達不可能なコードが生成されていた模様。

こうやると正しくコンパイルできた。

カテゴリー: Java, プログラミング関連 | コメントする

Twitter連携アプリの権限について

あらすじ

先日、「ツイート数カウントくん」というTwitter連携アプリを認証していた12万アカウントから一斉にブロック・フォロー処理が実行される事件がありました。

続きを読む

カテゴリー: サービス関係のお知らせ | タグ: | コメントする

[C#]他プロセスのコマンドライン引数を取得

ダメ元で探したら、Win32_Processから取れるよ、というヒントを見つけた。

Win32_Processってどう使うんだ? と悩んでいたらここにたどり着きました。

さすがにこれだけでは寂しいので、サンプルコード書いたものを続きを読むの中に置いておきます。上記サイトを参考に組ませて頂きました。

続きを読む

カテゴリー: C#, プログラミング関連 | コメントする

simutransのサーバーをCentOSに建てるメモ

流れ

この頃simutransというフリーゲーム落として、箱庭っぽくのんびり眺めているのですが、どうせなら昼夜問わず動かし続けた方が箱庭なんじゃないか?と思いサーバーを建てた。

続きを読む

カテゴリー: サーバ関連, 日記的な物 | コメントする