「 2015年12月 」一覧

クロスコンパイラの作成 (ARM/Barematal)


毎回同じような時期にクロスコンパイラの作成をやっている気がします。
今回は対象を Raspberry PI 2 で、ベアメタル用のクロスコンパイラの作成をテーマにやっています。

使用した環境やツールは以下のようになっています。

  • Ubuntu 15.10 (AMD64)
  • gcc version 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2)

使用したソース類

  • gcc 5.3.0
  • binutils 2.25.1
  • newlib-2.1.0

ディレクトリ構成例

意外とここが大事なので注意してください。自分のやってみた範囲ではコードと中間成果物の位置関係が大事な部分があるようです。ここを対応していないような構成を取ってしまうと、途中でエラーが発生して進めなくなってしまいました。

make作業

binutils, gcc, newlib らを先に説明したような場所に展開します。

基本的には別ディレクトリで作業するため build-* なディレクトリを作成します。

前提条件

先に説明したように、ベアメタルな環境を想定しているため、
この先の手順で作成したコンパイラを用いて linux で動く何かを作ることはできません。
また Raspberry Pi 2を対象として決めているので、 hard float ABI を使用し、arm-mode の命令を使ってほしいという想定で設定を行っています。

binutils 2.25.1

ここでは以下の設定で make, install を行いました.

disable-werror を付けないと、binutils の make に失敗してしまうので、付加してあります。以前はそのようなことがなかったため、ホスト gcc のバージョンが上がっていることによる挙動差かなと思っています。
さて、この binutils らをこの先使用するためにパスを通しておきます。

gcc 5.3.0 1回目

定番の話にはなるのですが、1回目のgcc では C言語のみの設定で gcc のみを生成させます。

newlib 2.1.0

ターゲットのシステムには OS がないため linux の共有オブジェクト群はありません。
システムコール類に当たる部分も自作する環境を考えているので
newlib のシステムコールを外した状態で出来上がるようにしています。
そのオプションが、”disable-newlib-supplied-syscalls” です。

make install の部分で失敗することがあれば、ディレクトリ構成を見直した方がよい感じでした。
試してみた範囲では構成を直しただけで成功するようになりました。

gcc 5.3.0 2回目

libcらが newlib によってできたため、残りの gcc の作業を行います。
先ほどのディレクトリに戻って、 make all で残っていた make作業を再開します。

まとめとこれから

これで C言語が使える gcc が出来上がりました。
C++も使えるようにするのであれば、C++ も有効にしてgccのmake 3回目を行えばよいようです。変更する部分は、 –enable-languages=c,c++ となります。

このようにしてできた gcc で -v で確認してみると以下のようになりました。

コツがわかればクロスコンパイラの作成は難しい点はなさそうです(たぶん


Proxmox で NFS 共有されているストレージを使う


Proxmox でネットワーク共有されているストレージを使うとライブマイグレーションが可能になります。今回はその準備として、 NFS 共有のストレージを Proxmox に登録させてみるところを説明します

NFSサーバーの登録

Proxmoxの管理画面(ブラウザ)で、 ServerView の Datacenter をクリックします。
するとタブに “Storage” とあるのでこちらを開きます。そして、Add ボタンがあるのでこちらを押すと、種類が出てくるので NFS を選択します。
proxmox-nfs-1
すると以下のような画面が出てくるので各項目を設定します。
proxmox-nfs-2

  • ID: 任意のIDを設定
  • Server: NFS共有しているサーバーのIPアドレス
  • Export: サーバーがexportしているリストが出てくるはずなのでその中から選択
  • Content: 仮想マシンのHDD を格納するなら Disk Image

登録が終わると、仮想マシン作成時のHDD設定の際、以下のようにストレージをどこにするかを選択することができるようになります。
proxmox-nfs-3


Proxmox でクラスタ環境作ってみた&マイグレーション確認


クラスタという表現が曖昧なのでここでは以下のことを指すものとして使います。
各Proxmoxが動いているコンピューターをノードと呼びます。
そのノードは1つのグループに属します。
このグループのことをクラスタと呼びます。

Proxmox でこのクラスタを作ると、クラスタ内のどの環境に WebUI でログインしても属しているノードの情報を確認することができるようになります。
今回は2台の構成でやってみました。このときどちらの WebUI にログインしても以下のように相手方の情報も見ることができます。
proxmox-cluster-1

設定方法

設定の方法ですが、 WebUI から行う方法がわからなかったため、コンソールで作業しました。
またここでは PVE1 をマスター、それ以外をスレーブと考えることにします。

まずは PVE1 側に ssh でログインします。
そして以下のコマンドを実行します。

# pvecm create example-cluster
orosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/urandom.
Writing corosync key to /etc/corosync/authkey.

初回の状態を確認してみます。

# pvecm nodes

Membership information
----------------------
    Nodeid      Votes Name
         1          1 pve (local)

ノードが追加されました(自分のことですが)

続いて PVE2 側に ssh でログインします。
そして以下のコマンドを実行します。ここで指定するIPはマスターのIPを指定してください。
これでメンバーとして PVE2 が登録されます。

# pvecm add 192.168.0.160
copy corosync auth key
stopping pve-cluster service
backup old database
waiting for quorum...OK
generating node certificates
merge known_hosts file
restart services
successfully added node 'pve2' to cluster.

PVE2 側の ssh での作業はこれで終わりなので閉じてもかまいません。

再び PVE1 側にて確認してみます。

# pvecm status
Quorum information
------------------
Date:             **************** 2015
Quorum provider:  corosync_votequorum
Nodes:            2
Node ID:          0x00000001
Ring ID:          8
Quorate:          Yes

Votequorum information
----------------------
Expected votes:   2
Highest expected: 2
Total votes:      2
Quorum:           2
Flags:            Quorate

Membership information
----------------------
    Nodeid      Votes Name
0x00000001          1 192.168.0.160 (local)
0x00000002          1 192.168.0.162
root@pve:~# pvecm status
Quorum information
------------------
Date:             ****************  2015
Quorum provider:  corosync_votequorum
Nodes:            2
Node ID:          0x00000001
Ring ID:          8
Quorate:          Yes

Votequorum information
----------------------
Expected votes:   2
Highest expected: 2
Total votes:      2
Quorum:           2
Flags:            Quorate

Membership information
----------------------
    Nodeid      Votes Name
0x00000001          1 192.168.0.160 (local)
0x00000002          1 192.168.0.162

このようにメンバーの分も含めた情報が出力されます。この状態であれば、 WebUI でログインしたときにも他のノード情報が表示されるようになっていると思います。冒頭に出したスクリーンショットもこの時点のものを出しました。
proxmox-cluster-1

クラスタ構成でできること

クラスタの設定は HA の作業に必須となっています。上記だけでは HA の設定はまだです。
現時点でできることは、

  • 1つのWebUIログインで複数ノードの状態の確認&変更が可能
  • オフラインのVMであれば移譲が可能
  • コンテナであれば移譲が可能(オンラインでいけるらしい。未確認)

ここではVMの移譲について確認したいと思います。

この移動移譲はマイグレーションと表現されています。
Proxmox VE4.0 現時点ではローカルストレージにデータがあるものを参照しているVMは
オンラインでマイグレーションすることができません。
VMがシャットダウンされていれば、ローカルストレージに仮想マシンのHDDを設定していてもマイグレーションが可能です。

やり方は簡単で右クリックしたときのメニューで “Migrate” を選び、移動先のノードを選ぶだけです。
proxmox-cluster-2
proxmox-cluster-3
ここで実行すると以下の画面のようにマイグレーションが開始されます。
proxmox-cluster-4
成功すると pve 側にVMが移動しています。
proxmox-cluster-5

オンラインでマイグレーションさせるには共有ディスクを使うとできるらしいです。
NASなどの別ストレージで NFS 共有できるようにしておいて、PVEノード群にストレージとして登録させておくことでできるようです。
これについてはまた別途実験してみたいと思います。

クラスタから脱退

ノードの障害やメンテナンスなどで該当ノードをクラスタから切り離したいことがあると思います。
全VMを他のノードへ移動させた後でノードをクラスタから切り離します。

このノード内に VM がいない状態になったら、マスター側で作業を行います。
マスター側へ ssh でログインしてコマンドを実行します。

# pvecm delnode pve2

そして該当ノードを電源オフにした状態で、マスタの状態を確認してみます。

# pvecm nodes

Membership information
----------------------
    Nodeid      Votes Name
         1          1 pve (local)

無事に切り離されたことが確認できました。
このとき PVE2 側が電源ONのまま稼働状態にあるとここに表示されたままとなってしまいます。切り離したのに表示されている、なぜだ?!と頭を悩ますことになるので注意しましょう。


続・IGZO 7インチの液晶パネルセットを買った


作成した液晶パネルを使うために、まずはガワを作成しました。
あまりケース等の加工になれていないので、段ボールで作成しています。
igzo-panel-1
HDMIや USB などの接続は下の方から接続するようにしています。

Raspberry Pi 2 に接続

Raspberry Pi 2 に接続してみました。前回の動作確認でも使ったので特に新しいことはないです。

igzo-panel-2

Windows PCに接続

Windows 環境で試してみました。 Intel HD Graphics や NVIDIA Geforce 650 Ti の環境に接続した状態では問題なく認識され、画面を映し出すことができました。

ただしつないですぐの状態では以下のように縦画面で認識されます。
元々がポートレイト標準のパネルのため仕様だと思われます。

igzo-panel-3

画面を回転させて横向きにしてみました。

igzo-panel-4

画面の設定が見にくいと思うので一部だけを再度撮影してみました。縦画面設定にして回転という普段は使わなさそうな設定です。
igzo-panel-5

Jetson TK1 につないでみた

Jetson TK1 が手元にあり、これもモニタを使うと勝手が良さそうなので繋いでみることにしました。
Ubuntu の環境が入っているので、おそらくは NVIDIA のグラフィックスボードを搭載している通常の Linux 環境でも同じだとは思われます。

接続してすぐの状態では以下のように縦画面での認識でしたが、それ以外は問題なさそうです。
igzo-panel-6

igzo-panel-7

もちろん画面回転させての表示も可能でした。
igzo-panel-8

追記

現在では、秋月の通販だけでなく、 Amazon のほうでも購入できるようです。


IGZO 7インチの液晶パネルセットを買った


ラズベリーパイに最適、 7inch IGZO 液晶パネルセットというものが無事に発売開始になったようなので早速買ってきました。個人的にこの製品の最大の魅力は、以下の点だと思っています。

  • HDMI 入力である
  • microUSB で給電。モバイルバッテリで動く
  • 高解像度 1920×1200 のドット数

小さい液晶がほしかったのですが解像度の問題だったり、入力形式の問題でうまく合うものがなく、
モヤモヤしていたのですがこれで一気に解決です。

セット内容

さて、開封の儀。
rasp-igzo-panel-1

パーツ数は3点。パネルと基板2つです。
パネルから伸びるフレキシブルケーブルを基板に接続するところが若干手間取るものの、難しい点はないように思います。もちろん丁寧に扱うことは前提です。

動作確認

組み立てた後、動作確認のためにラズベリーパイに接続して動作確認してみました。
通常のコンフィグファイル(config.txt)の末尾にでも以下のような設定を追記して、以下の確認を行いました。

デフォルトでは縦の方向になっているので、 Landscape で横向きにしています。

rasp-igzo-panel-2
上記のようにうまく映っています!
まだ保護シートを貼ったままなのとフォントサイズについては Raspbian そのままなのでとても文字が小さいです。近くよればまだ読めるかもですが。

まずは動作確認ができたので、これからケースとか側の準備を始めます。

参考

このパネルがなかった場合、以下の製品が自分の目的に合いそうでした。
HDMI入力搭載の7インチ液晶ディスプレイ「
plus one HDMI LCD-7000VH」

こちらは3万円ほどと高いのが難点です。

今回購入したパネルは秋月の通販で購入することができました。
ここで IGZO とでもキーワードを入れてもらえれば見つかると思います。
12/20現在、すでに在庫切れとなっているようで人気のほどがうかがえます。

追記

現在では、秋月の通販だけでなく、 Amazon のほうでも購入できるようです。ちょっと高めですが、入手先が増えるのはいいことだなと思います。


Linux で BonCasLink のクライアント側を実現


前回は BonCasLink のサーバー側の話だったので、今回は逆のクライアントをLinuxでやるお話です。Linuxで録画用のプログラムは recpt1 が標準的なようなのでこれについては既に使えている前提でここでは話を進めていきます。

必要なもの

  • PT3などLinuxでの録画環境が構築された環境
  • BonCasLinkのサーバーが動作している他PC

インストール

BCASに関しての部分をフックするようなプログラムを作成してくれた方がいるのでその成果物である b25-remote を使わせてもらいます。これは Rec10 というプロジェクトのサブプロジェクトという位置づけのようです。

まずはこの Rec10 のコードを取得してきます。こちらは現在 bitbucket 上にあるようです。

取得してきたコードの中に b25-remote というフォルダがあり、この中にソースコードが収められているのでライブラリを以下のようにして作成します。

これでインストールまで完了です。ここで出来る成果物のうち使うのは b25-client.so がキーとなります。

使い方

以下の環境変数を設定します。

  • LD_PRELOAD=”b25-client.so のフルパス”
  • B25_SERVER_IP=BonCasLinkのサーバーが動いているPCのアドレス
  • B25_SERVER_PORT=BonCasLinkのサーバーが動いているPCのポート番号

これらを設定した状態で、 recpt1 を –b25 オプション付きで動かして、うまく動作すれば(映像が見れるようであれば)OKだと思います。

参考

https://osdn.jp/projects/rec10/scm/svn/blobs/head/b25-remote/Readme.txt
のドキュメントを参考にしました。


Proxmox上の仮想マシンにKTV-FSUSB2をパススルー


せっかくなので Proxmox 上に構築した仮想マシンに KTV-FSUSB2 をUSBデバイスのパススルーを使って接続してみました。これらがうまく動いてくれるか見ていきたいと思います。

各仮想マシンに USB デバイスを接続する過程は省略させていただきます。

Windows7 の場合

接続したところちゃんと認識してデバイスマネージャーに出現します。
proxmox-ktvfsusb2n-2
proxmox-ktvfsusb2n-3

しかしながらドライバのインストール後にどうしてもうまくいかず。!が付いたままとなりました。ドライバの署名関連でもなさそうなので Windows についてはひとまずコレで終了

proxmox-ktvfsusb2n-5

CentOS の場合

必要なものは GitHub(https://github.com/sh0/recfsusb2n)からダウンロードしてきました。

早速コンパイルしてみます。

これではエラーが出てしまったので、以下のようにして em2874-core.cpp を開いてコンパイルできない点を修正.

正常にmakeが完了すると recfsusb2n という実行体があるのでこれを適当な場所へコピーしておきます。

それでは早速テストしてみます。適当に 30秒ほど録画してみました。このファイルを Windows7 などの環境へ持って行って確認してみます。

一見ちゃんと動いていそうなのですが、残念なことに、相当なドロップが発生してしまっており、正常な再生が出来る状況ではありませんでした。Windows に比べればここまで出来ましたのですこし惜しい感じです。

まとめ

USBデバイスのパススルーではうまく録画環境はつくれませんでした。もしかすると USB ボードごとをデバイスパススルーするとまた違った結果となるかもしれません。 未検証ですので、 VT-d 対応の Proxmox 環境作ってどなたかやってみてほしいと思います。


Proxmox上のlinuxで BonCasLink のサーバーを実現する


先日 Proxmox 上の仮想マシンで BCAS のカードリーダーを使えるように説明しました。今回はそれを活用したいと思います。 Windows では BonCasLink というソフトウェアがありました。LAN内でBCASを共有してしまおうというやつです。これのサーバー側を Linux で実現するプログラムで bcs-perl というものがあるのでこれを使ってみようと思います。

準備

  • 以前に構築した仮想マシン
  • 仮想マシンにスマートカードリーダーを接続
  • 動作確認のための Windows PCなど

インストール

GitHub(https://github.com/walkure/bcs-perl) にあるので git を使ってローカルに落としてきます。

gitがインストールされていないと思うので準備します。

ここからは専用の一般ユーザー(bcasuser)を作成してこちらで作業しました。Perlスクリプトで実現されているため、clone したら即使えそうだったのですが、改行コードの問題から一度変換してやる必要があります。

まずは実行してカードリーダーの情報を確認します。以下のような感じで出てくると思います。出てこないようであれば、うまくリーダーが接続できていないのでそこから確認してみてください。

この文字列を bcs-perl.pl 内に記載する必要があります。ソースコード中に以下の文字列があるのでこの中に上記で得られた文字列を記入します。

設定したら今度は普通に実行します。
”>>Begin Listening(0.0.0.0:6900)…..”
なる文字列が出てくればうまくうごいていると思います。

動作検証

Windowsなどの環境で BonCasLink のクライアントを動作させて、この仮想マシンに接続させてみます。うまくいかない場合には、仮想マシンのファイアウォールを見直しするとかSELinuxが切れているかを確認してみましょう。

最後に

ここではやりませんが、あとはスクリプトをログアウトしても動くように nohup 付きで起動するとか、自動起動するようにスクリプトを書くとか、体裁を整えるのまでやればより完璧でしょう。


Debian 8 入れてから Proxmox VE 4.0


GA-G41M-Combo に Proxmox VE 4.0 インストールしようとしたらインストーラーの画面解像度が 1024×768 以上を必須としているためインストールできませんでした。このボードに RADEON HD 7750 をつけてみたりしたのですが、オンボードであれ PCIe のボードであれどうにも 800×600 になってしまうようでした。モニターの都合もあるかとおもい、2つほどで試してみたのですが結果は変わらず。

 ハードウェアスペック的には問題ないと思っていたので、HDD を取り出して別環境で Proxmox のインストールだけ行って再び戻すことにしました。結果はこれだったらうまくいきました。

これはこれで手間なので Debian8 をインストールして、その上に Proxmox をインストールしてみるということを試してみます。これもまた Proxmox は対応しているようです。まずは Debian8 をインストールして環境を準備しておきます。
続きを読む


Debian Jessie で RADEON のドライバを入れる


標準インストールで xfce が入った状態だったので気にもしていなかったのですが、glxinfo を実行してみたらレンダラが llvmpipe になっており、ドライバがちゃんと入っていないことに気づきました。

ちょっともったいないので RADEON 用のドライバを入れることにしました。KernelModeSetting のためにはファームを入れろ、と起動時のログにも出ているのを今更ながら発見しました。

まず DRIモジュールとファームウェアバイナリを入れるために、/etc/apt/sources.list を編集します。contrib, non-free がデフォルトのものに追加されたような感じになります。

編集したら更新してから、パッケージを入れます。

あとは再起動後に有効になっていると思います。glxinfo などで llvmpipe ではなく、今回インストールしたドライバが使用されているかと思います。

OpenGL バージョンは 3.3、 OpenGL ES は 3.0 あたりになりそうです。ハードウェアとしては 4.0 もいけるはずなのですが、オープンソースドライバですし仕方ないことなのかもしれません。

glxinfoなど

glxinfo は mesa-utils パッケージにあるようです。

ソフトウェアレンダラだとこのように表示されます。llvmpipe は従来と比べると出来の良いレンダラで割とまともに動作します。