OSvでLuaインタープリタを動かす

OSvは、ハイパーバイザやIaaSプラットフォームへアプリケーションをデプロイすることに特化した軽量OSです(※詳しくはこちら)。

OSvでは簡易CLIを実装するためにLua言語が使用されています。
この記事では、CLI以外の任意のLuaプログラムをOSv上で実行してみます。

OSvのビルド

OSvのgitリポジトリからソースコードをcloneします。

git clone https://github.com/cloudius-systems/osv.git
cd osv
git submodule update --init --recursive

OSvに含まれるLuaのビルドスクリプトはliblua.soだけをOSvインスタンスへインストールするようになっており、luaコマンドがインストールされません。
取り敢えずluaコマンドを実行してインタラクティブLuaプログラムを実行してみたいので、以下のようなパッチを当てます。

diff --git a/modules/lua/Makefile b/modules/lua/Makefile
index 64ea417..88ae0e6 100644
--- a/modules/lua/Makefile
+++ b/modules/lua/Makefile
@@ -33,12 +33,13 @@ MAIN=src/liblua.so

 # Local executable used for LuaRocks
 LUA_BIN=$(BDIR)/lua
+LUA_BIN_SO=$(BDIR)/lua.so
 LUA_ROCKS_BIN=$(BDIR)/luarocks

 # List of Lua modules, each module has its own target
 LUA_MODULES=LuaSocket LuaJSON Lua_stdlib LuaFileSystem LuaPath LuaSec

-module: $(MAIN) $(LUA_MODULES)
+module: $(MAIN) $(LUA_MODULES) $(LUA_BIN_SO)

 $(MAIN): $(SRCS)
 	cd src && $(MAKE)
@@ -46,6 +47,10 @@ $(MAIN): $(SRCS)
 $(LUA_BIN): $(MAIN) | $(BDIR)
 	cp src/lua $(LUA_BIN)

+$(LUA_BIN_SO):
+	cd src && gcc -o lua.so lua.o liblua.a -lm -ldl -shared
+	cp src/lua.so $(LUA_BIN_SO)
+
 $(LUA_ARCHIVE): | $(DOWNLOAD)
 	cd $(DOWNLOAD) && \
 	 curl --remote-name --remote-time $(LUA_DOWNLOAD)
diff --git a/modules/lua/module.py b/modules/lua/module.py
index b15ebbc..0d3b6b0 100644
--- a/modules/lua/module.py
+++ b/modules/lua/module.py
@@ -8,3 +8,5 @@ usr_files.add('${OSV_BASE}/modules/lua/out').to('/usr') \
 	.exclude('etc/*') \
 	.exclude('lib/luarocks/**') \
 	.exclude('share/lua/*/luarocks/**')
+
+usr_files.add('${OSV_BASE}/modules/lua/out/bin/lua.so').to('/lua.so')

OSvをLua入りでビルドします。

make image=lua

OSv上でLuaを実行

scripts/run.pyでOSvインスタンスKVM上で起動するとLuaインタプリタが起動してインタラクティブLuaスクリプトが実行出来ます。

./scripts/run.py -n -e /lua.so
OSv v0.16-14-g2514672
eth0: 192.168.122.89
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
>
>
> print("Hello world")
Hello world
> print(type("Hello world"))
string
> = 1 + 2
3