ARM用のDockerイメージをQEMUを使って作る

ARM用のDockerイメージを作る時に、QEMUのqemu-user-staticを使ってCPUエミュレーションを行う方法が紹介されています。

Jetson 上で Docker イメージをビルドするのが辛かったので EC2 上にビルド環境を作った

ARM用のバイナリを作る時に、ARM上のシステムでは時間がかかって仕方ないため、x86_64上のシステムで作ってしまおうということですね。

エミュレーションでどれくらいのスピードが出るのか使ったことがないのでわかりませんが、ARMネイティブで作るよりはいいみたいですね。

最近のQEMUをWindowsで作ってみた

QEMUをWindowsで作るには、MSYS2という環境を使うわけです。msys2-x86_64-20161025.exeというのを使って作ったMSYS2で、去年QEMUを作ろうとしたらエラーで作ることもできずそのままになっていました。

そこで、ちょっと本腰を入れて作ってみました。

エラーは、export dashlessという表示がされるエラーなのですが、調べてみるとMSYS2のエラーのようです。

そこで、pacman -Syuでパッケージを全部アップデートして対処しました。このエラーは出なくなりました。

ところが、capstone.libをmakeするルールがありません、というエラーが出ます。仕方ないのでconfigureに--disable-capstoneをつけて対処しました。

すると、めでたくQEMUを作ることができました。

こんな感じのconfigureです。

./configure --target-list=x86_64-softmmu --python=/usr/bin/python2 --disable-capstone

Python2については、MSYSのものを使ったので指定しています。capstone.libはMinGW64の問題のようでメーリングリストにも出ていましたが、使わないように指定するしか今のところ対処の方法はなかったです。あとtexinfoの警告が出ていますが、MSYS2の問題です。

簡単ですが、何かの参考になれば。

VMware Workstation 14 Player にUbuntu 18.04をインストール

VMware PlayerにUbuntu 18.04をインストールしてみました。最初、VMware Player 12.5.5に簡易インストールを使ってインストールしようとしても途中で止まるため、VMware Playerを14.1.2にアップグレードしました。

ところが、VMware Player 14.1.2を使っても、簡易インストールは、Creating ext4 file systemのところで止まってしまいます。

仕方ないので、簡易インストールはせずに、空のディスクを作って、手動でUbuntu 18.04のDVD-ROMイメージをセットしてインストールしました。
インストールは完了しました。

VMware Toolsは、aptを使ってインストールしました。端末は画面の右クリックのメニューの一番下から起動できます。

sudo apt install open-vm-tools

あと、いろいろな設定は、画面の右上をクリックすると出てくるトンボのようなマークから設定することができます。

電源のブランクスクリーンをしないにしました。プライバシーの画面ロックから自動ロックをオフにしました。

また、画面の右クリックして出てくる画面で、名前をクリックして出てくるアカウント設定から自動ログインをオンに設定しました。このとき、ウィンドウの右上に出てくるロックを解除というボタンを押さないと設定できませんでした。

簡単によく使うものを設定しました。

簡易インストールできない問題は解決できませんでした。VWware PlayerかUbuntuのバージョンアップを待つしかないでしょうか。

IntelのHardware Accelerated Execution Managerがオープンソースになっていた

スマホのAndroidのプログラム開発で、アクセラレーターとして使われているIntel Hardware Accelerated Execution Manager(HAXM)ですが、QEMUでも使えるようになっています。Windowsホストでアクセラレートできるのがいいですね。

これが、昨年2017年の11月にオープンソースになって公開されていました。QEMUのメーリングリストにはメールが出されていました。気づかなかった。

ライセンスは、BSD 3-Clause Licenseです。

作るには、Enterprise WDK 10かVisualStudioとSDK、WDKを使うようになっています。

ソースコードを見てみたのですが、自分が少しプログラムとは離れていたせいで、読めなくなっていました。どうしましょ。

ともあれ、ソースコードが公開されたことは今後にとって良かったのではないでしょうか。

QEMUでHAXMを使う手順が次のところに載っています。

Accelerating QEMU on Windows with HAXM

興味がある方はお試しください。

QEMUのWindowsホストでのHyper-Vのサポート

先月のQEMUのメーリングリストで、WindowsホストでアクセラレーターのHyper-Vを使えるようにするパッチが投稿されました。パッチを見てみると、なんとMicrosoftの人が作っています。Microsoftの人がGPLv2のソースコードを提供するなんてことは一昔前には考えられないことですね。

以前、インテルのアクセラレーターを使えるようになるパッチが取り込まれました。

今回これが動くと、特別にアクセラレーターをインストールしなくてもQEMUが速く動くのでいいですね。

メーリングリストではどのバージョンのWindows 10でも動くといっていますが、Hyper-VはWindows 10 Professionalでしか使えないことになっていますね。どちらが正しいのでしょう。

それと、Windows 10 Insider Previewというバージョンでしか動かないようです。次のWindows 10のアップデートで動くということでしょうか。

アクセラレーターはWindows Hypervisor Platform acceleratorという名前で、2月の初めにはソースコードがマージされています。

バイナリを作ろうとしたら、なんかエラーが出て試せていませんが、興味のある方は試してみてはいかがでしょうか。

QNAPの仮想化技術がいいかも

ネットワークストレージQNAP TS-231+を使って、LAMPサーバーを立てると簡単で便利という話が載ってます。

2017年を振り返る。前半はAMD vs Intel、後半は2018年に向けての助走の年!?

仮想化の方法としては、LXCとDockerを組み合わせているそうです。メジャーなソフトであればDockerのイメージがあるのでそれを使うようです。

QNAP TS-231+はメモリが1GBしかないのですが、使いものになるようです。コンテナ型の仮想化のいいところですね。

気をつけないといけないことは、QNAP TS-231+はCPUがARMなので、ARM版のDockerイメージがないと使えません。それと、Dockerのイメージを作ってもVPSやクラウドに展開することができません。Dockerを使っていることで、安定性が気になります。開発目的なら問題ないでしょうか。

Amazonで調べたら、QNAP TS-231Pという方が新しいようです。QNAPのサイトを見るとContainer Stationも使えるようです。久しぶりに欲しいなと思ったのですが、最近プログラム開発をやっていないですし、しばらく様子見ですかね。自分で動かして安定性が知りたいですね。

ARM版Windows 10のバイナリトランスレーション

ARM版のWindows 10が発表されましたね。興味深いのは、ARM版でも、x86版のソフトウェアが動くことです。どうやっているかというと、x86版のソフトをバイナリトランスレーションして、ARMの命令に変換して動かしているのです。

明らかになってきたArm版Windows 10の課題とそのメリット

QEMUでやっていることと同じなので、どれくらい速度が出るのか気になるところです。記事を読むと、Win32のシステムコールにトランスレートした後、呼び出すDLLはネイティブの物を使うようです。この辺が、全部トランスレートして動かすQEMUと違うところでしょうか。サポートするのも32ビットのバイナリのみで、64ビットのソフトは動かないようです。Officeの32ビットが動けばいいやという感じでしょうか。

Intelが自社のチップのスマホで、ARM版のバイナリをx86の命令にトランスレートして動作させていますが、それとは全く逆のことをやっていますね。

Snapdragon 835だと、Cherry TrailとCore i3の間くらいの速度だそうです。あまり速度は気にならないような使い方がメインなのでしょうか。

動作速度より長時間使えることの方が、大切なのかもしれません。

来年には、Snapdragon 845が出るそうですから、そちらの方がいいような気がします。

ともあれ、実際に出てきたときはそれほど高いものにならないといいなと思います。

Windows 10をFall Creators UpdateにアップデートしたときのVMware PlayerとVirtualBox

Windows 10をFall Creators Updateにアップデートしました。

VMware Workstation Player 12.5.5のネットワークがつながらなくなりました。アプリと機能ー>プログラムと機能 から修復を選んで修復。その後、VMware Workstation Playerの設定画面のネットワークアダプタの設定で、VirtualBoxのアダプタを外すことでネットワークにつながりました。

VirtualBoxは動かなくなったので、古いものはアンインストールしてVirtualBoxをダウンロードしてインストールしました。最初5.2.0をインストールしたのですが、画面の大きさが1024x768の固定になってしまったので5.1.30に変えました。5.2系はまだインストールするには早いようです。

Webフレームワークとして使われるDjango、Flask、Ruby on Rails、Sinatraの動向

このところWebフレームワークを調べていて、実際のところ何が一番使われているのか気になりました。

そこで、Stack Overflowでトレンドを調べてみました。調べたのは、Django、Flask、Ruby on Rails、Sinatraです。

次の図が、Stack Overflowにおける過去8年間の質問の割合いを示しています。青がRuby on Rails、橙色がDjango、緑がFlask、赤がSinatraです。

webframework

なんと、今年2017年にDjangoがRuby on Railsを抜いています。また、Flaskは増加しており着実にユーザーの数を増やしていることがうかがえます。また、Sinatraは拡大してみるとRuby on Railsと同様に減少傾向にあります。

Stack Overflowでの質問の数で、一概にユーザーの数がわかるわけではありませんが、初心者の数はRuby on Railsに比べてDjangoの方が増えているのではないかと思います。

Ruby on Railsが減少傾向にあることが気になります。近くの本屋さんでも、Ruby on Railsの本はあまりありません。とういことは、これからRuby on Railsを勉強しようという人がいないということであり、近い将来Ruby on Railsを使う人が減ってしまうことを意味します。

それに対して、Djangoは一定の数を保っていますし、Flaskは増加傾向にあります。近くの本屋さんでも、Pythonの入門書がたくさん置いてありますし、これから学ぶ人が増えていくのではないかと思います。

現状Ruby on Railsのプロジェクトは多いですし、スタートアップ企業では使われていくでしょう。しかし、これからのことを考えるとPythonが確実に広まっていくのかなと思います。

MySQLを同一サーバーで複数立ち上げた時の接続方法

MySQLのレプリケーションを勉強しています。同一サーバーで2つのMySQLを動かしたのですが、スレーブへの接続が難しかったので紹介します。

プログラムは、Oracleのバイナリを使い、Ubuntuのパッケージはアンインストールしました。MySQLのバージョンは5.7.18です。

インストールは、やさしく学べるMySQL運用・管理入門【5.7対応】を見て行いました。

インストール後、同じホストでMySQLをマスターとスレーブで2つ立ち上げました。

起動は簡単で、コンソールを2つ開いてそれぞれ別個に構成ファイルを指定して立ち上げます。

./mysqld --defaults-file=../etc/my.cnf &
./mysqld --defaults-file=../etc/my-slave.cnf &

もちろん、my.cnfとmy-slave.cnfのserver_idや、datadirは異なっています。スレーブ側のportは3307、Unixソケット名は/tmp/mysqlslave.sockです。

ここで、mysqlクライアントでマスターとスレーブの両方に接続しようとしましたが問題が起こりました。次のように2つ接続しましたが、結果は両方ともマスターにつながりました。

./mysql -uroot
./mysql -uroot -P3307

自分は、スレーブ上で作業していると思い込んでいて、マスターにマスターのスレーブになれと命令してしまいました。もちろんエラーになってそんなことできません。

調べてみると、接続方法としてLinux上ではTCP/IPではなく、Unixソケットが優先されるのだそうです。port番号だけでは無視されます。ホスト名にlocalhostを指定してもだめでした。

NGの例

./mysql -uroot -P3307
./mysql -uroot -hlocalhost -P3307

そこで、スレーブに接続するには次のようにIPアドレス127.0.0.1を使うかソケット名を使うと接続できました。--protocolオプションでTCPを指定しても接続できます。

OKの例

./mysql -uroot -h127.0.0.1 -P3307
./mysql -uroot --host=127.0.0.1 --port=3307
./mysql -uroot -P3307 --protocol=tcp
./mysql -uroot -S/tmp/mysqlslave.sock
./mysql -uroot --socket=/tmp/mysqlslave.sock

ホスト名は、localhostだとUnixソケットで、127.0.0.1とIPアドレスにするとTCP/IPが使われます。なんという仕様でしょう。

--protocolオプションでプロトコルを指定すればOKです。

ソケット名を-Sオプションで指定するともちろん接続できますが、ソケット名を一つ一つ覚えるのは大変です。

mysqladminも同じ仕様のようです。気をつけましょう。

仮想化やクラウドについて