雑記帳

ちょっとした文章とかメモ書きとか。

カテゴリーアーカイブ: Linux

GroongaのRustバインディングを書いた

Rustがそろそろ1.0.0ということで最初のRustのリリースの時とだいぶ異なった言語になったらしい、
とのことで再度触れてみました。

触れる題材としてGroongaのバインディングを書いてみることに。

そうして出来上がったのが、Rust + GroongaでRuroonga(るーるんが)です。

(○[○]roongaの名前空間がそろそろ苦しい…。)

最近Rustにはcargoというパッケージマネージャが開発され、それが使われているとのことなのでCargoを使ったプロジェクトになっています。

バインディングを手で書いていたのですが、rust-bindgenがRustのHEAD(1.1.0-dev)で使えたのでRustをビルドしてrust-bindgenで作成しなおしました。

RuroongaはひとまずHaskellでのバインディングと同じように、
GroongaコマンドがRustから発行できること、までを目指して開発しました。

Ruroongaをつい先程Cargoのレジストリに登録したのでCargo.tomlに

ruroonga = "0.1.0"

と指定して使いはじめることができます。

Ansibleでketerのデプロイ環境を整える

Ansibleを触って、keterでのデプロイが出来るまでのAnsible playbookを作成してみました。

目標:AnsibleでサーバーへHaskell開発環境を入れずにketerの環境を作成する。

Yesodのデプロイツールのketerサーバーで実行する段階ではネイティブのバイナリの実行ファイル(ELF)です。

Yesodのデプロイ環境をketerで作成するとプロダクションサーバーに一切開発環境やインタプリタやコンパイラを入れること無くアプリケーションを動かせる、ということになっています。

とってもセキュア!

そうして出来上がったのがこちらのplaybook: ansible-playbook-for-keter-deploy

このplaybookを動かすにはhostへの対象サーバーの記述と、binaryディレクトリへketerのELFバイナリを置く必要があります。

ついでにserverspecでserverの状態を確認するテスト書きました。

  • gcc, clang, ghc等の開発ツールを誤ってインストールしていないか
  • keterがサービスとして動いているか
  • avahi(bonjour) daemonが動いてホスト名の名前解決が行えるか

等のserverspecを書いてあります。(が、テストをどうやってCIするか悩んでいるのでCIはまだしてないです)

Yesodのデプロイ作業はいくらscpで<<Yesod App Name>>.keterをプロダクションサーバーに投げつけるだけとは言え、そこまでの環境を用意するのがめんどくさかったのですが、Ansibleのplaybook化してしまえばYesodのアプリケーションをデプロイするまでの作業がかなりラクになりそうですね。

第九回Kernel/VM探検隊でLTをしました

時間が経ってしまいましたが、Kernel/VM探検隊でLTをしました。

mikutterを使っていたらひょんな事でコミット権を得てしまい、
歴史を感じるコードに右往左往した記録(?)です。

今はTravis CIのVM imageが新しくなっているかも知れないのでGreenになっているかどうか怪しげですが
typoをスナイプしたコミットをしたらGreenでした。
過去600回以上もの間Travis CIがFailureと言い続けていたのをGreenにする作業に(全部ではないですが)貢献できたのは良かったなぁと。

LTではあまり詳しく話せなかったのでどんな事をしてたかはスライド中のリンクを辿るなりして眺めてみて下さい。

Kernel 3.10向けのパッチとか設定とか

Kernel 3.10向けのパッチとか設定とか

VMWareのドライバのビルドが落ちる問題は以下の2つで解決できます。

kernel 3.10のvmnetのパッチ:
http://communities.vmware.com/thread/446113?start=0&tstart=0

vmblockのパッチ:
http://mysticalzero.blogspot.fi/2013/07/vmblock-patch-for-linux-310-vmware.html

→VMWare Player plus 6.0.0で解決済み

NVIDIAの公式ドライバのビルドが落ちる問題は次のパッチで解決できます。

NVIDIAの公式ドライバのKernel 3.10向けパッチ:
http://pastie.org/7942599#5,13,280

→325.15で解決済み。

Kernel 3.10にしてfailed to execute /initと出てkernel panicをする場合

次のconfigを試してみるといいかも知れません。

failed to execute /initと出る場合はCONFIG_BINFMT_SCRIPT=yにする
http://www.linuxquestions.org/questions/slackware-14/kernel-3-10-0-won%27t-run-initrd-slackware-14-0-a-4175468404/

Wandboardで遊ぼう

Wandboard http://www.wandboard.org/ を入手したので色々いじくってみました。

Wandboard dualであればLinuxを動かすのにもちょうどよい性能なのでLinuxを入れてみましょう。

基本的な入れ方は、http://www.eewiki.net/display/linuxonarm/Wandboard を参考にすれば大丈夫です。

Linuxとして使うには(特にXorgを上げる場合には)、linux-swapパーティションを作りましょう。gpartedにより、ブートするmicroSDの後方1GBをlinux-swapにし、他はWikiと同様の設定とします(下図)

Screenshot_from_2013-05-07 06:21:14

Wikiではswapを作っていないので/etc/fstabも書き換えます。

/dev/mmcblk0p2   /              auto  errors=remount-ro  0   1
/dev/mmcblk0p1   /boot/uboot    auto  defaults           0   2
/dev/mmcblk0p3   none           swap  sw                 0   0

こうすることで、swapパーティションが有効になります。

また、Ubuntu11.10の元々のカーネルとWikiにある方法で作成するカーネルでは以下の違いが特に後々重大な影響※を及ぼします。

※重大な影響とは、一般ユーザーでtcp/udpが叩けなかったり、Xorgを上げても無反応になってなってしまうことを指します。

@@ -49,21 +63,9 @@ kernel/drivers/i2c/i2c-core.ko
kernel/drivers/i2c/i2c-dev.ko
kernel/drivers/i2c/busses/i2c-imx.ko
kernel/drivers/input/input-core.ko
-kernel/drivers/input/mousedev.ko
-kernel/drivers/input/evdev.ko
kernel/drivers/input/serio/serio.ko

あ…れ…evdev.koとmousedev.koがカーネルにbuiltinされてない…これでハマりました…orz evdevってXorgの入力に関わるところなんですね…知らなかった
(参考:http://www.yamasita.jp/linkstation/2012/03/120326_evdev.html)

CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_EVDEV=y

としましょう。

また、これ:

CONFIG_ANDROID_PARANOID_NETWORK=y

も後々困った事になるのでnにしておきましょう。このコンフィグが有効だとLinuxでは[sudo] rootでしかeth0をつかめなくなります。

このように。

# CONFIG_ANDROID_PARANOID_NETWORK is not set

また、後に回すとめんどくさいので起動直後に日本語ロケールを有効にします。

$ sudo locale-gen ja_JP.UTF-8
$ sudo update-locale LANG=ja_JP.UTF-8 LC_MESSAGES=POSIX

あとは、

$ sudo apt-get install lightdm
$ sudo apt-get install xubuntu-desktop

するだけでGUI環境ができます、Ubuntu便利ダナー…

あとは、gccを入れるなり、Monoを突っ込むなり、ghcを入れるなりしましょう。どれもapt-getで入ります。

% cat /proc/cpuinfo
Processor    : ARMv7 Processor rev 10 (v7l)
processor    : 0
BogoMIPS    : 790.52

processor    : 1
BogoMIPS    : 790.52

Features    : swp half thumb fastmult vfp edsp thumbee neon vfpv3
CPU implementer    : 0x41
CPU architecture: 7
CPU variant    : 0x2
CPU part    : 0xc09
CPU revision    : 10

Hardware    : Wandboard
Revision    : 61011
Serial        : 0000000000000000

WandboardのARM CPUはarmhfでdual coreなようですね。

% uname -a
Linux arm 3.0.35-wand3 #1 SMP PREEMPT Sat May 4 06:16:05 JST 2013 armv7l armv7l armv7l GNU/Linux

また、カーネルが古いので3.8から入ったf2fsはWikiの方法を踏襲すると使えません…残念!

追記:githubにevdevを有効にしたWandboard向けカーネルコンフィグをpushしました。
https://github.com/cosmo0920/LinuxKernelconfig/blob/master/3.0.35-wand3.config

更に追記:Wandboardの公式イメージのUbuntu11.10がグラフィックアクセラレーションが効くようになったのに加え、vivante_drv.so(WandboardのGPUのXorgのドライバ)がUbuntu12.10でうまくmakeできない&Ubuntu13.04でXorgが立ち上がらないので公式イメージを使うようにしました…orz

Kernel 3.9でv4l2loopbackを使う

Kernel 3.9ではV4L2に変更があります。

「3.8までのV4L2」は以下のV4L2 int deviceが該当します。
deprecated表示になっているのでV4L2を使う際は使うのは推奨されなくなりました。
v4l2loopbackデバイスを使う際はカーネルコンフィグで有効にしましょう。

Screenshot_from_2013-04-30 23:31:06

その上のV4L2 sub-device userspace APIだけにチェックを入れた場合にv4l2loopback/webcamstudioのカーネルモジュールをinsmodしようとすると次のエラーが出ます。

$ sudo insmod webcamstudio.ko
insmod: error inserting 'webcamstudio.ko': -1 Unknown symbol in module
$ dmesg
[  ... ] webcamstudio: Unknown symbol video_ioctl2 (err 0)
[  ... ] webcamstudio: Unknown symbol video_devdata (err 0)
[  ... ] webcamstudio: Unknown symbol video_unregister_device (err 0)
[  ... ] webcamstudio: Unknown symbol video_device_alloc (err 0)
[  ... ] webcamstudio: Unknown symbol __video_register_device (err 0)
[  ... ] webcamstudio: Unknown symbol video_device_release (err 0)

また、webcamstudioは0.57系にとどまっているのではなく、より新しいものに更新しましょう。
Ubuntu12.04+で起動できない問題は既に修正済みです:
http://code.google.com/p/webcamstudio/issues/detail?id=75#c38

bundlerでmikutter

mikutterにはdevel/debian配下に開発用スクリプトがあったのですが、明らかに更新されてないのでbundlerを使ってみることにしました。

bundlerはGemfileを必要とします。

mikutter用の最低限のGemfileは次のようになります。

source "https://rubygems.org/"
ruby '2.0.0'
gem "gtk2"
gem "ruby-hmac"

これで、bundleの管理下に依存関係を解決したgemが入ります。

$ [sudo] bundle install

すると、bundlerがgemを管理するようになります。

rbenvをインストールして、更にruby-2.0.0p0をインストールした上で上記のコマンドを使えばシステムのrubyの更新が遅くても快適なruby環境が手に入ります。

rbenvを用いてインストールした場合のmikutterの起動スクリプトの一例:

#!/usr/bin/env bash
#mikutter directory
GEM=<path to mikutter>/mikutter.rb
DIR=<path to mikutter>
RUBY=/home/`whoami`/.rbenv/shims/ruby

cd $DIR
$RUBY -rubygems $GEM

追記:上の方法だと–path指定したものが読み込まれないので、
bundlerを使っているならbundle execしたほうが良さそうです。

#!/usr/bin/env bash
#mikutter directory
DIR=<path to mikutter>

source ~/.bashrc
cd $DIR
bundle exec ruby mikutter.rb

Linuxカーネル3.8でVMWare Playerを使う

カーネルを上げると何かしら動かない箇所が出てしまいます。

今度はVMWareのドライバでした…orz

環境:
Ubuntu Linux 12.04.2 LTS
Kernel 3.8.1

VMCIがコンパイルエラーとなってしまいます。
これは、Hotplug関連のマクロである__devexit_p,__devinit,__devexitなどが、カーネル3.8以降で削除されているためです。

という訳でこれを修正してみます。
linux-3.8_vmci_pci_hotplug_struct.patch:

--- vmci-only/linux/driver.c    2012-11-01 16:22:03.000000000 +0900
+++ vmci-only/linux/driver.c.edited    2013-03-01 04:21:08.402942111 +0900
@@ -124,7 +124,11 @@ static struct pci_driver vmci_driver = {
.name     = "vmci",
.id_table = vmci_ids,
.probe = vmci_probe_device,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
.remove = __devexit_p(vmci_remove_device),
+#else
+   .remove = vmci_remove_device,
+#endif
};

#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
@@ -1750,7 +1754,11 @@ vmci_enable_msix(struct pci_dev *pdev) /
*-----------------------------------------------------------------------------
*/

-static int __devinit
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
+ static int __devinit
+#else
+ static int
+#endif
vmci_probe_device(struct pci_dev *pdev,           // IN: vmci PCI device
const struct pci_device_id *id) // IN: matching device ID
{
@@ -1978,7 +1986,11 @@ vmci_probe_device(struct pci_dev *pdev,
*-----------------------------------------------------------------------------
*/

-static void __devexit
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
+ static void __devexit
+#else
+ static void
+#endif
vmci_remove_device(struct pci_dev* pdev)
{
struct vmci_device *dev = pci_get_drvdata(pdev);

このパッチを当てるには次のようにします。 vmci_patch.sh:

cd /usr/lib/vmware/modules/source
tar -xf vmci.tar
cd vmci-only
patch -p1 < [path to patchfile]
cd ..
tar -cf vmci.tar vmci-only/
#出典:http://communities.vmware.com/thread/432897

これで、パッチが当たりました。カーネルモジュールのビルドは次のようにします。

$ sudo vmware-modconfig --console --install-all

これにより、何もエラーが出ていなければ3.8でもVMWare player 5.0.1を使うことができます。

もしもkernel/version.hでエラーとなるなら次の対策もする必要があります→Linuxカーネル3.7でVMWare Playerを使う

参考:[patch] Vmware 9 on Linux Kernel 3.8rc4

追記:VMWare player 5.0.2でこの問題は解決しました。

Webcamstudioを修正して3.7.1+カーネルでも使ってみる

webcamstudio本家では永らく更新が止まっており、メンテナンスだけになってしまっているプロジェクトだそうで。

Linuxでは未だに仮想カメラとしてのこなれているソフトは少ないので修正して動くようにしてみました。

環境:Ubuntu Linux 12.04.2LTS
Kernel 3.7.9

これで動くようにしてみます。

http://code.google.com/p/webcamstudio/ にてまだ入手することができます。

先ずはwebcamstudio_0.57beta4_all.debを入手してきます。

$ sudo dpkg -i webcamstudio_0.57beta4_all.deb

当然の事ながらそのままではカーネル3.7.9には対応していないのでインストールが完了しません。

そこで、次のパッチを適用します:

–diff_webcamstudio.patch–

--- webcamstudio.c.orig	2013-02-19 07:55:42.593627911 +0900
+++ webcamstudio.c	2013-02-20 05:47:54.094668804 +0900
@@ -1435,7 +1435,9 @@ init_buffers        (struct webcamstudio
     b->length            = buffer_size;
     b->field             = V4L2_FIELD_NONE;
     b->flags             = 0;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,6,1)
     b->input             = 0;
+#endif
     b->m.offset          = i * buffer_size;
     b->memory            = V4L2_MEMORY_MMAP;
     b->sequence          = 0;
@@ -1464,6 +1466,11 @@ init_vdev           (struct video_device
   vdev->minor        = -1;
   if (debug > 1)
     vdev->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
+#ifdef VFL_DIR_M2M
+  vdev->vfl_dir = VFL_DIR_M2M;
+#endif
+
   MARK();
 }

これにより、構造体からinputメンバが削られた影響を回避することができます。
(このあたりはv4l2loopbackの新しいカーネルへの対応の実装を参考にしています)
もうひとつ、Ubuntu 12.04.2LTSではjava6の提供がなくなっているのでこちらも対応が必要です。
そこで、次のパッチを適用します:

–diff_webcamstudio_shexec_modify.patch–

--- webcamstudio.orig    2012-06-20 22:31:10.117328614 +0900
+++ webcamstudio_patched    2012-06-20 22:45:07.207331138 +0900
@@ -3,10 +3,27 @@
# Patrick Balleux 2009
# Version 0.57beta4
INSTALLDIR=/usr/lib/webcamstudio
-JAVA_DIR=/usr/lib/jvm/java-6-openjdk/bin
-if [ -f $JAVA_DIR/java ]
+ARCH=$(uname -i)
+case $ARCH in
+    x86_64)
+        UNAME=-amd64
+        ;;
+    i386)
+        #UNAME=
+        ;;
+esac
+JAVA_DIR=/usr/lib/jvm/java-6-openjdk$UNAME/bin
+OPENJDK7_DIR=/usr/lib/jvm/java-7-openjdk$UNAME/bin
+ORACLE_JAVA_DIR=/usr/lib/jvm/java-7-oracle/bin
+if [ -f $OPENJDK7_DIR/java ]
then
-    JAVA_DIR=/usr/lib/jvm/java-6-openjdk/bin
+    JAVA_DIR=/usr/lib/jvm/java-7-openjdk$UNAME/bin
+elif [ -f $JAVA_DIR/java ]
+then
+    JAVA_DIR=/usr/lib/jvm/java-6-openjdk$UNAME/bin
+elif [ -f $ORACLE_JAVA_DIR/java ]
+then
+    JAVA_DIR=/usr/lib/jvm/java-7-oracle/bin
else
JAVA_DIR=/usr/lib/jvm/java-6-sun/bin
fi

ここで、

$ sudo patch `which webcamstudio` < diff_webcamstudio_shexec_modify.patch

とします。続いて、

$ sudo patch  /usr/share/webcamstudio/webcastudio-src/webcastudio.c < diff_webcamstudio.patch

とします。これによりwebcamstudio側の準備ができました。

$ sudo make install

とすると、webcamstudio.koが生成されます。

$ sudo insmod webcamstudio.ko

とした時に、何もエラーもなくdmesgが次のようであれば終了です。

$ dmesg
...
[  ...  ] v4l2loopack driver version 1.0.2 loaded
--webcamstudio--

もしも次のエラーがあった場合は次のステップへ。

$ sudo insmod webcamstudio.ko
insmod: error inserting 'webcamstudio.ko': -1 Unknown symbol in module
$ dmesg
[  ... ] webcamstudio: Unknown symbol video_ioctl2 (err 0)
[  ... ] webcamstudio: Unknown symbol video_devdata (err 0)
[  ... ] webcamstudio: Unknown symbol video_unregister_device (err 0)
[  ... ] webcamstudio: Unknown symbol video_device_alloc (err 0)
[  ... ] webcamstudio: Unknown symbol __video_register_device (err 0)
[  ... ] webcamstudio: Unknown symbol video_device_release (err 0)

カーネルモジュールのvideodev.koが読み込まれていないようです。
カーネル3.6.11からV4Lの階層が変わっているらしく、もしかするとvideodev.koがコンパイルされていないかもしれません。

$ cd <path-to-Kernelsource tree>/linux-3.7/
$ make xconfig

http://nlug.ml1.co.uk/2013/01/gentoo-kernel-3-6-11-webcams-v4l-uvc-video-kernel-config-change/3798 によると、

まず、V4Lを3.7で有効に扱うためには、
MEDIA_CAMERA_SUPPORTをyにする必要があります。

Location:
-> Device Drivers
-> Multimedia support (MEDIA_SUPPORT [=m])

これにより、CONFIG_VIDEO_V4L2_SUBDEV_APIをyにできるようになります。

Depends on: MEDIA_SUPPORT [=m] && VIDEO_DEV [=m] && MEDIA_CONTROLLER [=y] && EXPERIMENTAL [=y]

なので、このカーネルコンフィグではvideodev.koがmakeされるようになります。

参考画像:

Screenshot_from_2013-02-20 06:23:14

このカーネルコンフィグのカーネルを用いれば、/usr/share/webcamstudio/webcamstudio-src/にて

$ sudo make install

をすると

[sudo] password for <user>:
make -C /lib/modules/`uname -r`/build M=/usr/share/webcamstudio/webcamstudio-src modules_install
make[1]: ディレクトリ `/usr/src/linux-headers-3.7.9-custom-fornewercore2' に入ります
  INSTALL /usr/share/webcamstudio/webcamstudio-src/webcamstudio.ko
  DEPMOD  3.7.9-custom-fornewercore2
make[1]: ディレクトリ `/usr/src/linux-headers-3.7.9-custom-fornewercore2' から出ます
depmod -ae
WARNING: -e needs -E or -F
$ dmesg
...
[  ... ] v4l2loopack driver version 1.0.2 loaded

となり、ちゃんとロードされます。まさかカーネルコンフィグの仕業でwebcamstudioカーネルモジュールが読み込めなくなっているとは思わなかった。。。

ちゃんと起動できている。

$ webcamstudio
Using JRE: /usr/lib/jvm/java-7-openjdk-amd64/bin
OS is Linux
DEBUG: WebcamStudio video device (video0)
DEBUG: WebcamStudio video device (video0)
Starting iWebcamera Detection...
NetworkStream available on port 4888
You can use FFMPEG to connect to this stream...
ffmpeg -f ogg -i tcp://127.0.0.1:4888 test.ogg

どうやら動いているようだ。
Screenshot_from_2013-02-20 05:40:24

Linuxカーネル3.7でVMWare Playerを使う

Linuxカーネル3.7ではinclude/linux/version.hの位置が移動してます。

その為、VMWareのカーネルモジュールをインストールするときに正常なヘッダーのディレクトリでないと怒られてしまいます。以下のようなスクリプトで修正すると正常にインストールできます。

#!/usr/bin/env sh
HEAEDERSROOT=/lib/modules/`uname -r`/build
sudo ln -s ${HEAEDERSROOT}/include/generated/uapi/linux/version.h ${HEAEDERSROOT}/include/linux/version.h

参考:http://coji.coji.jp/wp/kernel3-7nvidia-linux-x86-310-19vmware-workstation9-0-1/
http://communities.vmware.com/thread/422617