CentOS6でG3258のIntel HD Graphicsドライバが認識されない問題

録画環境を前回の記事の通りに作った。 次はTSファイルをエンコードする環境を構築する。 画質にそこまでこだわりはないので、QSVを使ってH264に圧縮する。 その過程でグラフィックドライバが認識されないという問題にぶち当たったので解決法を乗せる

riosu.hateblo.jp

環境

M/B: H97-PLUS
CPU: Pentium Dual-Core G3258 BOX
OS: CentOS release 6.9

*注 もちろんCPUがQSV対応でないとそもそも駄目である

ドライバ導入

yum install xorg-x11-drv-intel.x86_64 xorg-x11-drv-intel.x86_64-devel
reboot

認識されない

lshwを使って確認してみたところドライバが認識されていない (lshwはyumで導入した yum install lshw

% sudo lshw -c video
  *-display UNCLAIMED
       description: VGA compatible controller
       product: Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
       vendor: Intel Corporation
       physical id: 2
       bus info: pci@0000:00:02.0
       version: 06
       width: 64 bits
       clock: 33MHz
       capabilities: msi pm vga_controller bus_master cap_list
       configuration: latency=0
       resources: memory:f7800000-f7bfffff memory:e0000000-efffffff(prefetchable) ioport:f000(size=64)

UNLCAIMEDになっている。ドライバが認識されていない場合上記の表示になるらしい。 この状態ではVAAPIが利用できない。

解決方法

grubで起動するときに渡されているオプション nomodeset が悪さをしているらしい。 /boot/grub/menu.lst を編集して nomodeset を削除する。

vim /boot/grub/menu.lst
[before]
kernel /vmlinuz-2.6.32-696.1.1.el6.x86_64 ro root=/dev/mapper/vg_hoge-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_hoge/lv_root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=jp106 rd_LVM_LV=vg_hoge/lv_swap rd_NO_DM rhgb quiet

[after]
kernel /vmlinuz-2.6.32-696.1.1.el6.x86_64 ro root=/dev/mapper/vg_hoge-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_hoge/lv_root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=jp106 rd_LVM_LV=vg_hoge/lv_swap rd_NO_DM rhgb quiet

この後リブートしたらちゃんと認識される。

% sudo lshw -c video                                                                                            [main]
  *-display
       description: VGA compatible controller
       product: Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
       vendor: Intel Corporation
       physical id: 2
       bus info: pci@0000:00:02.0
       version: 06
       width: 64 bits
       clock: 33MHz
       capabilities: msi pm vga_controller bus_master cap_list rom
       configuration: driver=i915 latency=0
       resources: irq:27 memory:f7800000-f7bfffff memory:e0000000-efffffff(prefetchable) ioport:f000(size=64)

悪戦苦闘しつつドライバ導入まで成功したが、VAAPIは簡単には動かなかった。その記事はまた別途書く予定。 ざっくりいうと、libva/intel-vaapi-driver/libva-utilsの最新版をソースからビルドすればうまくいった。

PX-W3PE+CentOS6+recpt1+Chinachu γで録画環境構築

今までWindows上でEpgDataCap_Bonを使って録画環境を構築していたが、自宅サーバLinux系一本にまとめたかったので更改することにした。 TVチューナーとしてPX-W3PEをしている関係でOSに縛りがあったので、普段利用しないCentOS6を入れたがとりあえず動いている。

OSの選定

PX-W3PEはRedhat系のドライバしか公開されていないので、とりあえずインストールしようとしたUbuntuの導入は断念。 また、Kernel 3.x系 (CentOS7等)では動作しないという情報もあり、CentOS6.9を導入することにした。

lab.planetleaf.com

ドライバの導入

CentOS6.9のインストールは割愛。フィーリングでインストール

ドライバファイルは現在公式サイトからはリンクが貼られない形になっている模様。 直リンクではダウンロードできるので、下記Wikiに貼り付けてあるURLからダウンロード www22.atwiki.jp

インストール方法は下記サイトを参考にした。またBCASカードリーダについても下記サイトを参考に。 quail.mydns.jp

recpt1の導入

上記サイトにも記載されているが、巷に出回っているrecpt1はPX-W3PEに対応してない。 そのため foltia ANIME LOCKER に付属しているものを利用するか、PX-W3PEに対応したrectp1のソースを探し、コンパイルする必要がある。

それらしきリポジトリを発見したので使わせてもらっている。 github.com

導入方法はリポジトリ内のドキュメント参照

px_drv/px_drv.md at main · project-pp/px_drv · GitHub

arib25の導入とテスト

例によって下記サイトを参考にさせていただいた。 quail.mydns.jp

いろんなサイトにrecpt1の動作確認コマンドが乗っているが、PX-W3PEの場合は上記サイトの通りに、デバイスを指定してあげないとうまく動作しなかったので注意

recpt1 --device /dev/asv52202 --sid hd 24 10 ~/test.ts

mirakuru/chinachuの導入

基本的に公式Wikiを参考にすれば問題なし。いくつか補足する。 github.com

nodeのバージョン

CentOS6ではyumで入るノードのバージョンが必須環境であるnode6.5.0より下なため、自前で6.5.0以上7.0.0以下のものを入れる必要がある。 うろ覚えだが、nを使ってこんな感じに入れる

$ yum install epel-release
$ yum install nodejs npm
$ npm install -g n
$ n 6.5.0
$ yum remove nodejs npm
$ node -v
v6.5.0

mirakurunのtunersコンフィグ

sudo /usr/local/bin/mirakurun config tuners

 name: PXW3PX-S1
  types:
    - BS
    - CS
  command: recpt1 --device /dev/asv52200 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PXW3PX-S2
  types:
    - BS
    - CS
  command: recpt1 --device /dev/asv52201 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PXW3PX-T1
  types:
    - GR
  command: recpt1 --device /dev/asv52202 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PXW3PX-T2
  types:
    - GR
  command: recpt1 --device /dev/asv52203 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

mirakurunのチャンネル設定

下記サイトを参考にした。ただし、mirakuru@2.1.0以上にはチャンネルスキャン機能があるので、そちらを利用するほうが良さそう www.jifu-labo.net github.com


これにて録画環境の構築完了。 この後、CentOS6でQSV(VAAPI)を使ったエンコード環境を作ろうと奮闘するのだが、それは別記事にて。

Node+Express+Mongodbでのログイン認証機能の実装

最近、Node+Express+MongoDBという環境でのログイン機能を実装する機会があったので、残しておきます。
MongoDB

必要モジュール

mongoDBを利用するために以下の3つをpackage.jsonに追加し、インストールします

  • connect-mongo : セッションをMongoDBに保存するために利用
  • mongoose : MongoDBと接続してfindしたりsaveしたり
  • crypto : sha1ハッシュを計算するために利用

コード

必要部分のコードをまとめてみました。解説はそのうちするかも。

仮想HIDドライバvmulti (1) : コンパイルからインストールまで

仮想HIDデバイスドライバとして有名らしい「vmulti(Virtual Maltiple HID Driver)」について、日本語の情報が一切引っかからなかったので備忘録として書いていきます。今回はVisual Studio 2012でのコンパイル方法と、OSへのインストール方法をまとめてみました。どなたかのためになれば幸いです。

vmulti(Virtual Maltiple HID Driver)で何が可能なのか

以下のデバイスの入力をエミュレートすることができます。

  • マルチタッチ
  • マウス
  • ディジタイザ
  • キーボード
  • ジョイスティック

例えば、このドライバに対して「マウスを相対位置指定で(100, 100)に移動させてくれ」とリクエストを投げると、実際にマウスドライバの動作をエミュレートしてくれて、マウスがちゃんと移動します。
マクロをドライバレベルで動作させたりする用途にも利用できると思います。

Windows Driver Kit(WDK)のインストール

注意: Visual Studioをインストールしていない場合は、先にVisual Studioをインストールしてください。
(そうしないと、Project作成画面にWDKが表示されません)

Windows Driver Kit Downloads

ソースのダウンロード

Google Project Hostingからソースをダウンロード/チェックアウトします。

下記ページからzipでも落とせます
/ - vmulti - Virtual Multiple HID Driver - Google Project Hosting

ソースは以下の4つのプロジェクトを含んでいます。

  • vmulti: vmultiドライバ
  • hidkmdf: Hid miniport to be used as an upper layer for supporting KMDF based driver for HID devices. (よくわからん)
  • vmulticlient: vmultiドライバにアクセスするための静的ライブラリ
  • testvmulti: 上記の静的ライブラリを用いて、実際にドライバを使ってみるテストアプリケーション

ソリューションを開く(vmulticlient, testvmulti)

ダウンロードしたzip内にあるソリューションファイル(vmulticlient.sln)を開きます。
Visual Studio 2012で開くと、アップグレードを要求されるので、OKしておきます。

このソリューションにはvmulticlientとtestvmultiのプロジェクトが入っています。
vmultiとhidkmdfは別ディレクトリにプロジェクトファイルのみが存在します。

vmultiとhidkmdfをVisual Studioで開き、コンパイルする

ファイル → 開く → Conver Sources/Dirs...
vmulti: ./vmulti/sys/sources
hidkmdf: ./vmulti/hidmapper/sources

一度これを行うと、それぞれのディレクトリにプロジェクトが作成されます。
これを、vmulticlientなどのソリューションに追加することで、ひとつのソリューション内で全て開発できます。

vmulti/hidkmdfのコンパイル

それぞれのプロジェクトでビルドすれば以下のファイルが生成されます。

  • vmulti.sys
  • vmulti.inf
  • hidkmdf.sys

ビルドするときは、動作対象のWindowsバージョンとx64/x86を適切に選択しましょう。

vmulticlient/testvmultiをコンパイルする

普通にそのままビルドしても私の環境だとできなかったので、プロパティを少々変更しました。

windows.hが開けない

fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory

プロジェクト → プロパティ → 構成プロパティ → C/C++ → 全般
にある「追加のインクルードディレクトリ」に以下を追加

$(WindowsSDK_IncludePath)

excpt.hが開けない

fatal error C1083: include ファイルを開けません。'excpt.h': No such file or directory

上記と同様に「追加のインクルードディレクトリ」に以下を追加

C:\Program Files %28x86%29\Microsoft Visual Studio 11.0\VC\include

ドライバのインストール

64bitOSを利用している場合、デフォルトだとドライバに署名がないとインストール出来ません。
自己署名をすることで回避可能だと思うのですが、うまく行かなかったので、苦肉の策として採用した、OSのテストモード化の方法と、自己署名作業を途中まで記しておきます。
いつか、自己署名が出来たら更新します。

テストモード

テストモードにすることで、未署名ドライバを動作可能です。ただしセキュリティ的によろしくありません。

bcdedit /set TESTSIGNING ON

その後、ドライバをインストールします

devcon.exe install vmulti.inf djpnewton\vmulti 

自己署名

下記の方法でうまく行かなかったため、なにか間違っていると思われます。
どなたかご教授いただければ幸いです。

makecert

証明書を作成します。

makecert -r -n "CN=LocalSign" -ss LocalCertStore -sr LocalMachine -pe

mmc

作成した証明書を登録します。

  1. プログラムを指定して実行「mmc.exe」
  2. ファイル → スナップインの追加と削除 にて「証明書(コンピュータアカウント)」を追加
  3. LocalCertStore/証明書/LocalSignが存在するか確認する
  4. LocalSignを「信頼されたルート証明書」と「信頼された発行元」にコピー

inf2cat

カタログファイルを作成します

c:\Program Files (x86)\Windows Kits\8.0\Tools\x64> inf2cat /driver:"c:\tmp\vmulti" /os:7_x64

signtool

署名します

signtool sign /s LocalCertStore /n "LocalSign" /t http://timestamp.verisign.com/scripts/timestamp.dll vmulti.cat
signtool sign /s LocalCertStore /n "LocalSign" /t http://timestamp.verisign.com/scripts/timestamp.dll vmulti.sys
signtool sign /s LocalCertStore /n "LocalSign" /t http://timestamp.verisign.com/scripts/timestamp.dll hidkmdf.sys

devcon.exe

ドライバをインストールします

devcon.exe install vmulti.inf djpnewton\vmulti 

うまくインストール出来たかどうかやエラーなどは以下のログファイルに出力されています。

c:\Windows\inf\setupapi.dev.log

C#でLua: LuaInterfaceの後継NLua

C#Luaを利用するためのライブラリを探していたところ、LuaInterfaceというものが一般的に使われているということがわかった。

luainterface - A library for integration between the Lua language and Microsoft .NET platform's Common Language Runtime (CLR) - Google Project Hosting

公式サイトに行ってみたところ、LuaInterfaceからforkされたNLuaというライブラリを作者がおすすめしていたので、そちらを使ってみることとした。プロジェクトページによると、Android/iOS/WPなど様々な環境で動作するらしい。

NLua/NLua · GitHub

ダウンロード

NLua/NLua · GitHub
README.mdに記載されているダウンロードボタンからダウンロードすれば良い

参照の追加

Visual Studio 2012: プロジェクト→参照の追加→参照

基本的な使い方

基本的にLuaInterfaceと同様の使い方が可能のようだ。
おさきまっくら [C#][Lua]Luaのあれこれおぼえがき
2012-03-31 - 結果だけでなく過程も見てください

ただ一点注意として、Lua5.2を利用しているということが挙げられる。
ネット上にある多くのLuaInterfaceに関する記事はLua5.1向けに書かれており、そのままだと動かないことがある。

Lua5.1とLua5.2の違いについては以下のサイトを参照
Lua 5.1とLua5.2の違い - エンジニアのソフトウェア的愛情

staticメゾットの登録

あるクラスのstaticメゾットを登録したい場合以下のようにすれば良い。

オーバーロードがあるメゾットの登録

オーバーロードがあるメゾットはGetMethodの第二引数に対象メゾットの引数のタイプを指定してあげて特定すれば良い

モジュール

Lua5.2からはmoduleというものが使えなくなったらしい。
少し調べてみたが、代替機能が見つからなかったので、次のサイトを参考にmoduleを代替した。
Luaのモジュールを穴が空くまで見つめてみる - プログラミングの魔物

読み込み先ディレクトリを追加するにはpackage.pathを使う
requireのパスあれこれ | -闘いたい過去-
(注) ただし上記のサイトに書かれてるobj.getinfoはLua5.2で動かないっぽい

とりあえずこんな感じで使ってる

他プロセスのメモリを読む(C++編)

メモリの読み込み自体はWin32APIのReadProcessMemoryを使えば良い。
ただし、WindowsVista以降ではASLR(Address space layout randomization)機能により、実行ファイルなどの配置アドレスがランダムになっている。そのため、まずはその実行ファイルのメインモジュールの先頭アドレスを取得し、そこからの相対位置指定でメモリを読むことにする。


メインモジュールの先頭アドレスはPEB(Process Enviroment Block)内のImageBaseAddressの値を見れば良い。
(その他にGetModuleHandler(NULL)でも取得できるらしい)

ターゲットプロセスのハンドルを取得

プロセスのベースアドレスを取得

プロセスハンドルからNtQueryInformationProcessを使ってPROCESS_BASIC_INFORMATIONを取得する。
その中にPBEのベースアドレスがあるので、それを利用してReadProcessMemoryを行う

PBE構造体

既存の定義ではImageBaseAddressが載っていないので、以下の構造体定義を行う。

ベースアドレス取得

実際にメモリ内容を取得してみる

ドライバの自己署名

ドライバの自己署名で一部詰まったので、ここに残しておく

自己署名参考サイト

Microsoft Technet
http://technet.microsoft.com/ja-jp/library/dd919238(v=ws.10).aspx

詰まったところと解決法

inf2catが見つからない

inf2catにパスが通ってなかった。環境変数に追加するか、直接以下の場所で実行する

c:\Program Files (x86)\Windows Kits\8.0\Tools\x64> inf2cat /driver:"c:\tmp\vmulti" /os:7_x64

inf2catが見つからない(2)

cmd.exeだと実行できないっぽい?のでVSのコマンドプロンプトで起動する

スタートメニュ → すべてのプログラム → Microsoft Visual Studio 2012
→ Visual Studio Tools→ VS2012 x64 Native Tools コマンド プロンプトを開く

inf2catを実行すると「<ファイル名> does not exist」というエラーがでる

下記のように実行するとエラーが出た。

c:\Program Files (x86)\Windows Kits\8.0\Tools\x64> inf2cat /driver:"c:\tmp\vmulti\vmulti.inf" /os:7_x64
c:\tmp\vmulti\vmulti.inf does not exist.

inf2catのdriverに指定するのは、.infファイル名ではなく、.infファイルがあるフォルダパスである。
直感的ではないので要注意

inf2catを実行すると「Parameter format not correct.」というエラーがでる

c:\Program Files (x86)\Windows Kits\8.0\Tools\x64> inf2cat /driver:"c:\tmp\vmulti\" /os:7_x64
Parameter format not correct.

先ほどのエラーと異なるので、.infの読み込みまではいったと勘違いしてしまったため、かなり時間を消費してしまった。
結論としては、指定したパスの最後が「\」で終わってることが原因であった。
「\」を削除して「c:\tmp\vmulti」に変更したら問題なくなった。

inf2catを実行すると「DriverVer set to incorrect date」というエラーがでる

c:\Program Files (x86)\Windows Kits\8.0\Tools\x64> inf2cat /driver:"c:\tmp\vmulti" /os:7_x64
......................
Signability test failed.

Errors:
22.9.7: DriverVer set to incorrect date (postdated DriverVer not allowed) in \vmulti.inf. The current date (UTC) is 9/2/2013.

今回は、エラーメッセージが親切である。.infファイル内のDriverVerを表示されている日時(UTC)より前に修正してやれば良い。
.infを自動生成した時に、DriverVerにJSTでの現在時刻が挿入されたことが原因であった。
DriverVerにはUTCで記述する必要がある