FreeBSDの自宅鯖にMinecraft-Overviewerを導入してみたときのメモ。誰得。
まぁ大体こんな感じで動いています
Overviewer本体はPythonで書かれているのでPythonが必要。
まずBuildする必要があるらしく、Python2.6本体の他にpython-imagingとpython-numpyが必要らしいのでportsから適当に導入。
$ cd /usr/ports/math/py-numpy
$ sudo make install clean
$ cd /usr/ports/graphics/py-imaging
$ sudo make install clean
公式WikiにあるようにBuildする。
早速使ってみるが怒られる。
$ ./overviewer.py ../minecraft-mapmod/world/ output/
2011-06-18 13:32:38,779 [INFO] Welcome to Minecraft Overviewer!
2011-06-18 13:32:38,780 [INFO] Notice: Not using biome data for tinting
2011-06-18 13:32:38,780 [INFO] Scanning regions
2011-06-18 13:32:39,204 [INFO] Scanning chunks
2011-06-18 13:32:39,242 [INFO] Rending the following tilesets: normal
Traceback (most recent call last):
File “./overviewer.py”, line 298, in
main()
File “./overviewer.py”, line 256, in main
r.go(options.procs)
File “/usr/home/mcraft/minecraft-overviewer/rendernode.py”, line 147, in go
pool = multiprocessing.Pool(processes=procs,initializer=pool_initializer,initargs=(self,))
File “/usr/local/lib/python2.6/multiprocessing/__init__.py”, line 227, in Pool
return Pool(processes, initializer, initargs)
File “/usr/local/lib/python2.6/multiprocessing/pool.py”, line 84, in __init__
self._setup_queues()
File “/usr/local/lib/python2.6/multiprocessing/pool.py”, line 130, in _setup_queues
from .queues import SimpleQueue
File “/usr/local/lib/python2.6/multiprocessing/queues.py”, line 22, in
from multiprocessing.synchronize import Lock, BoundedSemaphore, Semaphore, Condition
File “/usr/local/lib/python2.6/multiprocessing/synchronize.py”, line 33, in
” function, see issue 3770.”)
ImportError: This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.
“sem_open”がなんとからしい。Python2.6のコンパイルオプションを確認。
$ cd /usr/ports/lang/python26
$ sudo make config
するとこんなコンパイルオプションがあるのでチェックを入れてPython2.6を再コンパイルしてインストールし直し
[X] SEM Use POSIX semaphores (experimental)
$ cd /usr/ports/lang/python26
$ sudo make
$ sudo make deinstall
$ sudo make install clean
すると、多分動く。
手動更新は面倒なのでOverviewerをcrontabに登録して定時に動かすようにする。
適当にシェルスクリプトを書いてcrontabに登録する。このままだとpython本体の場所が見つけられず、スクリプトが実行できないので怒られる。
env: python: No such file or directory
とりあえず各スクリプトの一行目の
#!/usr/bin/env python
を、pythonへのパスへ書き換える。通常ならば多分
/usr/local/bin/python
で良いはず。
とりあえずこれで動くはず。
しかし、マルチコア関連の動作がcrontabだと上手く動かないようで、全コアを使って処理をしてくれないのでとても遅い。ログに
sysctl: not found
と出ているのがヒントな気がするか、詳しいことは良くわからないので、頭の悪そうな解決をする。
例えばoverviewer.pyの
cpus = multiprocessing.cpu_count()
を
cpus = 4
に書き換える。要は”multiprocessing.cpu_count()”をコア数で置換すれば良い。4というのはxephの環境が2コア4スレッドで仮想4コアに見えるからだと思う。pythonで実際に確認してみれば良い。
$ python
Python 2.6.6 (r266:84292, Jun 18 2011, 13:53:31)
[GCC 4.2.1 20070719 [FreeBSD]] on freebsd8
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import multiprocessing
>>> multiprocessing.cpu_count()
4
他のスクリプトもすべて書き換えておく。grepなどであぶりだせばいいと思う。
これで全コアを使いきってくれるようになった。xephではAM3:30に更新するようにしている。