トラブルシューティング

From OpenSimulator

(Difference between revisions)
Jump to: navigation, search
(synced with original page)
m
Line 8: Line 8:
 
== 一般的なヒント ==
 
== 一般的なヒント ==
  
OpenSim の起動が完了して、地域コンソールでコマンドが入力できる状態となっていれば、"config get" や "config save" コマンドを使って、現在の設定を調べることができます。[[Server_Commands]] (または、コンソールで help と入力) に詳しい説明があります。
+
OpenSim の起動が完了して、地域コンソールでコマンドが入力できる状態となっていれば、"config get" や "config save" コマンドを使って、現在の設定を調べることができます。[[サーバコマンド]] (または、コンソールで help と入力) に詳しい説明があります。
  
 
これは、トラブルの原因を究明する際に、誤った設定を修正するのに役に立ちます。
 
これは、トラブルの原因を究明する際に、誤った設定を修正するのに役に立ちます。
Line 103: Line 103:
 
==== UID 重複によるプリム消失  ====
 
==== UID 重複によるプリム消失  ====
  
通常、この問題は save-xml/load-xml ファイルが、-newUID スイッチを使ってオブジェクトの UUID を新しく採番することなく、同じ SIM にロードされた場合に発生します。詳細な情報は [[Server_Commands]] を参照してください (<nowiki>load-xml <filename> -newUID</nowiki>) 。それでもうまくいかなければ、オブジェクトを Shift コピーして空中に持っていき、空中にあるほう(実はこれがコピー) を削除するとうまくいくかもしれません。これで全てのプリムの UID が新しく割り振られます。このオブジェクトはそのままにして、元の load-xml ファイルを他の地域にロードしましょう。
+
通常、この問題は save-xml/load-xml ファイルが、-newUID スイッチを使ってオブジェクトの UUID を新しく採番することなく、同じ SIM にロードされた場合に発生します。詳細な情報は [[サーバコマンド]] を参照してください (<nowiki>load-xml <filename> -newUID</nowiki>) 。それでもうまくいかなければ、オブジェクトを Shift コピーして空中に持っていき、空中にあるほう(実はこれがコピー) を削除するとうまくいくかもしれません。これで全てのプリムの UID が新しく割り振られます。このオブジェクトはそのままにして、元の load-xml ファイルを他の地域にロードしましょう。
  
  

Revision as of 01:46, 7 May 2011


このページには、システム固有の有用な設定や、遭遇する可能性のある問題を解決するためのアドバイスを掲載しています。

Contents

一般的なヒント

OpenSim の起動が完了して、地域コンソールでコマンドが入力できる状態となっていれば、"config get" や "config save" コマンドを使って、現在の設定を調べることができます。サーバコマンド (または、コンソールで help と入力) に詳しい説明があります。

これは、トラブルの原因を究明する際に、誤った設定を修正するのに役に立ちます。

システム固有の設定

CentOS 5

Mono や NAnt をインストールする際は、http://www.mono-project.com/Downloads にある "Linux Installer for x86" を使うとよいでしょう。

SVN は以下のコマンドでインストールできます。

yum install subversion

Mono はデフォルトで /opt にインストールされますので、環境変数に追加しておくとよいでしょう。例えば ~/.bashrt にこのように追記します。

export PATH="/opt/mono-1.2.5/bin:$PATH"
export PKG_CONFIG_PATH="/opt/mono-1.2.5/lib/pkgconfig:$PKG_CONFIG_PATH"
export MANPATH="/opt/mono-1.2.5/share/man:$MANPATH"
export LD_LIBRARY_PATH="/opt/mono-1.2.5/lib:$LD_LIBRARY_PATH"

LD_LIBRARY_PATH を変更したら、ダイナミック・リンクのキャッシュをアップデートしましょう。

ldconfig

それでも "The current runtime framework 'mono-2.0' is not correctly configured in the NAnt configuration file." というエラーが表示されるかもしれません。この場合、こうすると直ります。

yum install glib

ファイアウォールも使っている場合 (具体的には、iptables -L で ACCEPT や REJECT のルールが一覧表示される場合)、他のマシンから SIM にアクセスできるように、必要なポートを開放する必要があるでしょう。スタンドアロンモードではこのようにします。

iptables -I RH-Firewall-1-INPUT -p tcp --dport 9000 -j ACCEPT
iptables -I RH-Firewall-1-INPUT -p udp --dport 9000 -j ACCEPT

CentOS 5.2 64bit で Mono 2.2 をソースからコンパイルして使っている場合 (他のケースでもそうなるかは分かりませんが)、以下のステップを実行する必要があります。

sudo yum install libgdiplus
sudo yum install libexif
sudo ln -s /usr/lib64/libgdiplus.so.0 /usr/lib64/libgdiplus.so
ldconfig

これで私の場合は OpenSim をエラーなしで起動することができ、他のグリッドに接続することもできるようになりました。

Debian 4.0r0

unstalbe のソースを使う場合は、以下のパッケージをインストールすると、うまくいきます。unstable のソースを使うには、/etc/apt/sources.list ファイルを編集して、'etch' や 'stable' を 'unstable' に変更してください。

deb ftp://ftp.debian.org/debian/ unstable main
deb-src ftp://ftp.debian.org/debian/ unstable main

それから、パッケージをアップデートします。

apt-get update
apt-get dist-upgrade

これで、たくさんのパッケージが変更されると思います。環境が破壊されるかもしれません。しかし、私の経験では、unstable のソースを使わないと、パッケージは完全に最新なものとはならず、バージョン不整合の問題が発生します。その結果、 2 つのモジュール、gdiplus.dll と libopenjpeg-libsl-2.1.2.0.so で DllNotFoundException エラーがコンソールに表示されることになります。

ソースが最新になったら、OpenSim のビルドに必要なパッケージをインストールしましょう。

apt-get install subversion mono nant mono-gmcs mono-mjs libmono-microsoft8.0-cil libmono-system-runtime2.0-cil

パッケージが 1 つでも不足していると、エラーが表示されるでしょう。しかし、これらのパッケージがあれば、OpenSim はちゃんとビルドできるはずです。

注: unstable ソースで、ストレージに MySQL を使っている場合、以下のエラーメッセージが表示されます。

Exception: System.NotSupportedException: CodePage 1252 not supported
 at System.Text.Encoding.GetEncoding (Int32 codePage) [0x00000]

動くようにするには、libmono-i18n2.0-cil パッケージをインストールしてみてください。

apt-get install libmono-i18n2.0-cil

Gentoo

Mono の依存パッケージや Mono 自体で、"~x86" にマスクされたパッケージを使うことがあります (プラットフォームが x86 の場合。使用しているプラットフォームに応じて読み替えてください。例: 64 ビットの場合、"~amd64")。次のようにして USE フラグを確認してみましょう。

ACCEPT_KEYWORDS="~x86" emerge -vp subversion nant mono libgdiplus

それから、次のようにしてインストールしましょう。

ACCEPT_KEYWORDS="~x86" emerge subversion nant mono libgdiplus

注: ACCEPT_KEYWORDS="~x86" は Gentoo の /etc/make.conf ファイルでも設定できますが、testing/unstable の全てのパッケージが表示されることになってしまいます。emerge コマンドの先頭でこれを使えば、この変数はこの emerge プロセスにだけ適用されます。

Mac OS X

ここでは、Mono のユニバーサル・バイナリを Mono Project サイトから取得して使っている前提で説明します。

OS X 10.4 を使っている場合、OS X インストール CD から X11 をインストールする必要があります。OS X 10.5 の場合、不要です。

2.0 Framework がサポートされていない旨のエラーが発生したら、pkg-config パスを修正するとよいでしょう。私はこれを ~/.bash_profile に書いています。

export PKG_CONFIG_PATH="/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig/:${PKG_CONFIG_PATH}"

エラーとその対処方法

仕様不備かバグによる問題の回避策

UID 重複によるプリム消失

通常、この問題は save-xml/load-xml ファイルが、-newUID スイッチを使ってオブジェクトの UUID を新しく採番することなく、同じ SIM にロードされた場合に発生します。詳細な情報は サーバコマンド を参照してください (load-xml <filename> -newUID) 。それでもうまくいかなければ、オブジェクトを Shift コピーして空中に持っていき、空中にあるほう(実はこれがコピー) を削除するとうまくいくかもしれません。これで全てのプリムの UID が新しく割り振られます。このオブジェクトはそのままにして、元の load-xml ファイルを他の地域にロードしましょう。


ODE Physics で例外が発生して落ちる (System.EntryPointNotFoundException: dSpaceLockQuery)

次のエラーは、たいてい "libode" のバージョンが合っていないために発生します。

[SCENE] [02-01 22:20:40] System.EntryPointNotFoundException: dSpaceLockQuery

at (wrapper managed-to-native) Ode.NET.d:SpaceLockQuery (intptr)
at OpenSim.Region.Physics.OdePlugin.OdeScene.waitForSpaceUnlock (IntPtr space) [0x00000]
at OpenSim.Region.Physics.OdePlugin.OdeCharacter.AvatarGeomAndBodyCreation (Single npositionX, Single npositionY, Single npositionZ, Single tensor) [0x00000]
at OpenSim.Region.Physics.OdePlugin.OdeCharacter..ctor (System.String avName, OpenSim.Region.Physics.OdePlugin.OdeScene parent_scene, OpenSim.Region.Physics.Manager.PhysicsVector pos) [0x00000]
at OpenSim.Region.Physics.OdePlugin.OdeScene.AddAvatar (System.String avName, OpenSim.Region.Physics.Manager.PhysicsVector position) [0x00000]
at OpenSim.Region.Environment.Scenes.ScenePresence.AddToPhysicalScene () [0x00000]
at OpenSim.Region.Environment.Scenes.ScenePresence.MakeRootAgent (LLVector3 pos, Boolean isFlying) [0x00000]
at OpenSim.Region.Environment.Scenes.Scene.AgentCrossing (UInt64 regionHandle, LLUUID agentID, LLVector3 position, Boolean isFlying) [0x00000]

まず、ファイルシステムを検索して、他の ODE Physics エンジンがないか探してみましょう。

find / -name "libode.so"

それから、最新のバージョンかどうか確認しましょう。

6-8 時間経ってから、MySQL のコネクションでエラーが発生する

MySQL にはタイムアウトがあり、28,800 秒 (8 時間) アクティブでないとコネクションを切断します。たぶんこれが原因で、ユーザサーバが長時間アイドル状態にあるとログインできなくなるのだと思います。この問題が発生したら、タイムアウトを大きな値、例えば 604800 (1 週間) や 31536000 (1 年) に増やしましょう。MySQL コンソールで、次のように入力しましょう。

set global wait_timeout=604800;

System.DllNotFoundException: gdiplus.dll

最初に、libgdiplus.so がダイナミック・リンカが参照できる場所にあるか調べましょう。

/sbin/ldconfig -p | grep libgdiplus

見つからなかったら、libgdiplus.so のあるディレクトリが LD_LIBRARY_PATH 環境変数や、 /etc/ld.so.conf.d/ の *.conf ファイル (例: gdiplus.conf) にあるか確認しましょう。それから ldconfig でキャッシュを更新しましょう。そうすると、ライブラリを見つけられるようになっているはずです。

それでもまだエラーが出る場合、libgdiplus は他のダイナミック・ライブラリにも依存しているため、それらがロードできなければ、libgdiplus もロードできません。これを確かめるには、OpenSim をデバッグ情報を表示させる設定にして起動します。

MONO_LOG_LEVEL=debug mono OpenSim.exe

Mac OS X では、/opt/local/lib/libgdiplus.dylib があるか確認しましょう。存在していたら、root ユーザで /opt/local/etc/mono/config ファイルを編集して、次の行を追加しましょう。

<dllmap dll="gdiplus.dll" target="/opt/local/lib/libgdiplus.dylib" os="!windows"/>

OpenSim の MySQL データベースを WIndows から Linux に移行する

MySql.Data.MySqlClient.MySqlException: Table 'opensim.UserAccounts' doesn't exist

環境: Opensim Server 0.7.0.2, Linux Ubuntu 8.0.4 環境。Mono 2.8, MySQL 5.0 がインストールされた状態。

MySQL 5.0 で稼働している OpenSim 0.7 データベースを Window から Linux に移行した場合、OpenSim サーバにユーザがログインすると、OpenSim サーバコンソールに次のような例外が表示されることがあります。

03:11:10 - [LLOGIN SERVICE]: Exception processing login for (user_name): MySql.Data.MySqlClient.MySqlException: Table 'opensim.UserAccounts' doesn't exist at MySql.Data.MySqlClient.MySqlStream.OpenPacket () [0x00000] in <filename unknown>:0 at MySql.Data.MySqlClient.NativeDriver.ReadResult (System.UInt64& affectedRows, System.Int64& lastInsertId) [0x00000] in <filename unknown>:0 at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet () [0x00000] in <filename unknown>:0 at MySql.Data.MySqlClient.MySqlDataReader.NextResult () [0x00000] in <filename unknown>:0 at MySql.Data.MySqlClient.MySqlStream.OpenPacket () [0x00000] in <filename unknown>:0 at MySql.Data.MySqlClient.NativeDriver.ReadResult (System.UInt64& affectedRows, System.Int64& lastInsertId) [0x00000] in <filename unknown>:0 at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet () [0x00000] in <filename unknown>:0 at MySql.Data.MySqlClient.MySqlDataReader.NextResult () [0x00000] in <filename unknown>:0

クライアントでは、次のようなエラーが表示されます。

Login Failed
Error generating Login Response

この例外は MySQL がテーブル名を格納する仕組みが原因となって発生します。Windows の MySQL サーバでは、テーブル名は大文字小文字を区別しませんが、Linux の MySQL のテーブルはデフォルトで大文字小文字を区別します。このため、OpenSim が大文字で始まる名前でデータベースを検索すると、見つかりません。

一つの解決策は、OpenSim が必要とするテーブルのテーブル名を (ALTER TABLE で) 変えてしまうことです。しかし、最もきれいなやり方は、MySQL の設定を変え、"/etc/mysql/my.cnf" ファイルの [mysqld] セクションで "lower_case_sensitive = 1" とすることです。

# sudo nano /etc/mysql/my.cnf

..........................
[mysqld]
..........................
lower_case_sensitive=1
..........................

これで、MySQL は自動的にテーブル名を小文字に変換して解釈するようになります。MySQL サーバと OpenSim を再起動すると、テーブルは問題なくロードされるようになります。

注: migration テーブルをクリアして OpenSim にデータベースを強制的に再移行させようとしないでください。データベースが損傷する原因となります

不完全なデータ移行にまつわるエラー

OpenSim のデータ格納方法が変更となり、アップグレード時になんらかの原因でデータベースの移行に失敗すると、この問題が発生することがあります。

OpenSim コンソールにこのようなエラーメッセージが表示されます。

 [LLOGIN SERVICE]: Exception processing login for [username]: MySql.Data.MySqlClient.MySqlException: Table 'opensim.UserAccounts' doesn't exist
 at MySql.Data.MySqlClient.MySqlStream.OpenPacket () [0x00000]
 at MySql.Data.MySqlClient.NativeDriver.ReadResult (System.UInt64& affectedRows, System.Int64& lastInsertId) [0x00000]
 at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet () [0x00000]
 at MySql.Data.MySqlClient.MySqlDataReader.NextResult () [0x00000]    at MySql.Data.MySqlClient.MySqlStream.OpenPacket () [0x00000]
 at MySql.Data.MySqlClient.NativeDriver.ReadResult (System.UInt64& affectedRows, System.Int64& lastInsertId) [0x00000]
 at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet () [0x00000]
 at MySql.Data.MySqlClient.MySqlDataReader.NextResult () [0x00000]

この場合、'users' テーブルの内容が 'UserAccounts' に移行されていないにも関わらず、OpenSim は 'UserAccounts' がある前提で動作しようとしていました。また、ビューアにもエラーが表示されます。

Login Failed
Error generating Login Response

移行の失敗の原因となったファイルシステム (私の Linux 場合は、'/var/lib/mysql/...' がぐちゃぐちゃになってました) の権限を変更して、'migration' テーブルを削除し、サーバを再起動させると、私の場合は解決しました 移行時に [non-critical] 警告が発生したので、たぶんもっと適切な方法があったのではと思いますが、私は完全にバックアップをとっていたので、安直な方法でやってしまいました) 。地形データ参照と現在のシェイプ/衣類/アタッチメントデータはなくなってしまいましたが(これは簡単にインワールドで復元できます)、それ以外は私的には大丈夫でした。

Mono や libgdiplus0 をインストールすると、依存関係にある libexif.so.9 が見つからないエラーが発生する

これは Centos5 で現象が確認されましたが、他のオペレーションシステムでも発生することがあります。ftp://rpmfind.net/linux/conectiva/snapshot/i386/RPMS.extra/libexif9-0.5.12-47547cl.i386.rpm をダウンロードしてインストールすれば、解決します。これで、(他に問題がなければ) Mono がインストールできるようになります。

mscorlib.dll アセンブリが見つからない、またはロードできない

NAnt と一緒にインストールされる mscor ライブラリで見つからないものがあると考えられます。NAnt をインストールすれば簡単に解決します。必要なライブラリの 1.0 や 2.0 のバージョンのものが一緒に入っています。

apt-get install nant

External Program Failed: /usr/lib/pkgconfig/../../lib/mono/2.0/gmcs.exe

mono-gmcs を再インストールすると、簡単に直ります。

apt-get install mono-gmcs

The type or namespace name JScript does not exist in the namespace Microsoft

JScript と連呼しているのに注目してください。これがヒントになるかな?

apt-get install mono-mjs libmono-microsoft8.0-cil

Fedora や OpenSUSE では、必要なパッケージは "mono-jscript" になります。

The type or namespace name Tcp does not exist in the namespace System.Runtime.Remoting.Channels

これはインストール一発で簡単に直る問題です。

apt-get install libmono-system-runtime2.0-cil

Missing: libopenjpeg-libsl-2.1.2.0-x86_64.so

おそらく、64 ビットのマシンなのでしょう。以下の手順に沿って作業しましょう。

error while loading shared libraries: libgthread-2.0.so.0: cannot open shared object file

Debian ベースのシステムで、このページの一番上のように導入したが、apt バージョンの Mono ではなく、Web サイトからダウンロードしたインストーラを使っている場合、この問題が発生することがあります。

http://www.mono-project.com/Downloads で .bin をダウンロードして、手順に沿って実行し、完了した後で、"mono --version" を実行すると、このメッセージが表示されます。libglib2.0-0 をインストールする必要があるということです。

apt-get install libglib2.0-0

The current runtime framework 'mono-2.0' is not correctly configured in the NAnt configuration file.

apt バージョンの NAnt を再インストールすると直るようです。

apt-get install nant

この現象は pkg-configmono.pc ファイルにもアクセスできないために発生することもあります。このファイルがあるディレクトリを PKG_CONFIG_PATH 環境変数に追加すると直ります。

ネットワークや設定の問題

この Wiki ページを参照してください。

ログインはできるが、リモートクライアントから地域にログインできない

OpenSimulator/bin/Regions フォルダを開いてください。

0.6.7 以降では、

  1. Regions.ini ファイルの InternalAddress に 0.0.0.0 を指定してみてください。
  2. ExternalHostName=127.0.0.1 を、アクセス可能な DNS ネームに変更する必要があります。例えば、"opensim.example-host.com" や "71.6.131.152" (外部からアクセス可能な IP アドレス) のように書きます。

0.6.6 以前では、

  1. region.xml(default.xml) ファイルの internal_ip_address に 0.0.0.0 を指定してみてください。
    (地域を作成すると、どちらかの名前でファイルができます)
  2. external_host_name="127.0.0.1" を、アクセス可能な DNS ネームに変更する必要があります。例えば、"opensim.example-host.com" や "71.6.131.152" (外部からアクセス可能な IP アドレス) のように書きます。

OpenSim のビルド

ビルドファイルもソリューションファイルも見つかりません

  • Windows では、
runprebuild.bat
  • Linux/Mac/FreeBSD では、
runprebuild.sh

を実行してください。

Visual Studio 2005 で .sln ファイルが開けません

  • Visual Studio 2005 C# を起動してみてください。恐らく、Visual Studio 2005 C++ を起動しようとしているんじゃないでしょうか。これは C# プロジェクトです。

OpenSim の実行

Cygwin シェルで OpenSim.exe を実行すると、一部の DLL でアクセス拒否が発生します

  • 'cd bin' の後に 'chmod a+x *' を実行して、全ての DLL ファイルを実行可能な状態にしてください。

SIM が起動できません

  • 設定 を見てください。

なんかおかしくなった!

svn r3254 以降でアップデートした後にグリッドを起動すると、'owner_uuid' がなんたらかんたらというエラーが出ます

r3254 以降の最近のリビジョンに更新すると、owner_uuid をwe are now using the unused owner_uuid. グリッドによっては、リージョンテーブルを初期化する .sql スクリプトからこの項目が誤って消されてしまったタイミングで MySQL テーブルが作られてしまっています。MySQL にログインして、この SQL クエリを実行し、足りない owner_uuid を追加すると、この問題は解決するはずです。

alter table `regions` add column `owner_uuid` varchar(36) default '00000000-0000-0000-0000-000000000000' not null, comment 'Rev.2';

regions と owner_uuid の周りの記号は、「グレイヴ・アクセント(バッククオート)」です。default や comment の値の周りはシングルクオートです。日本語キーボードでは、Shift + @ でバッククオートが、Shift + 7 でシングルクオートが出てきます。これは MySQL で覚えておきたいことです。

svn r3786 以降でアップデートした後にグリッドを起動すると、'State' がなんたらかんたらというエラーが出ます

r3786 以降では、SQLite の 'primshapes' テーブルに、新たに 'State' フィールドが追加されました。このフィールドは tree や grass を不揮発化するのに使用されます。起動すると何もない地域ができあがります。OpenSim は 'State' フィールドを見つけられないので、何をすればいいのかわからないからです。一番よい解決策は、SQLiteBrowser などの SQLite テーブルのエディタ (http://sqlitebrowser.sourceforge.net/ でダウンロードしてください) を使って、足りないフィールドを作成することです。

alter table primshapes add column State integer default 0

SQLiteBrowser を起動して、File > Open Database と辿り、OpenSim.db ファイルをブラウズして開きます。そして、"Execute SQL" タブを開き、上のコマンドを "SQL String" テキストボックスにコピー&ペーストします。それから、"Execute Query" ボタンをクリックします。

Region Handshake (地域のハンドシェイク) でタイムアウトになります

  • Regions フォルダにある設定ファイルに正しい IP アドレスが記載されていますか?
  • OpenSim が動作しているサーバにはインターフェースが複数存在しませんか?OpenSim は外向きの UDP パケットを特定の IP アドレスに割り当てず、デフォルトでアクセスする IP アドレスが、地域が UDP で応答する際の IP アドレスになります。他の IP アドレスで地域を設定してしまうと、接続時にタイムアウトになります。

OpenSim に接続できません

接続できますが、移動することができません

クライアントから接続できるのに、アバターがくるくる回って移動しない場合は、SIM が正しく設定されていません。最初のログイン処理は完了しましたが、クライアントと SIM の間でパケット通信が成立していない状態です。おそらく、SIM のネットワーク設定が正しくないと思われます。

  • 設定 を参照してください。

しょっちゅうアバターが固まります

ちょうど今はプリムのデータベース同期でボトルネックがあります。このため、短時間 (5〜10秒) アバターがハングすることがありますが、いったんデータベースと同期がとれれば大丈夫です。これは既知の問題で、データの格納処理の一部にある古い構造が原因となっています。

世界地図を見れません

  • OpenSim を Linux サーバで動作させているときにこの問題が発生することがあります。グリッドモード、スタンドアロンモードに関わらず発生します。
  • 症状:SL ビューアで世界地図を開くと、SIM が世界地図に表示されなかったり、サーバコンソールに OpenJPEG 関連のエラーが表示されたり、現在のセッションがフリーズしたり、などなど。。
  • 原因:SVN の source trunk に正しい libopenjpeg-libsl ライブラリが含まれていません。
  • 原因その2:"defaultstripe.png" が OpenSim フォルダにないか、壊れています。
  • 解決策:libsecondlife (svn co svn://opensecondlife.org/libsl/trunk) の最新のソースを取得し、openjpeg-libsl サブディレクトリで 'make' し、生成された libopenjpeg-libsl-2.1.2.0.so を OpenSim の bin サブディレクトリにコピーして、既にあるものを上書きします。
  • 再コンパイルして、OpenSim を再起動してください。

コンソールに出力される例外

以下にコンソールに出力される可能性のある例外を列挙します。意味と、問題であるか否かを説明しています。

System.DllNotFoundException: ./libopenjpeg-libsl-2.1.2.0.so

Failed generating terrain map: System.DllNotFoundException: ./libopenjpeg-libsl-2.1.2.0.so

at (wrapper managed-to-native) OpenJPEGNet.OpenJPEG:LibslAllocDecoded OpenJPEGNet.OpenJPEG/LibslImage&)
at OpenJPEGNet.OpenJPEG.Encode (System.Byte[] decoded, Int32 width, Int32 height, Int32 components, Boolean lossless) [0x00000]
at OpenJPEGNet.OpenJPEG.EncodeFromImage (System.Drawing.Bitmap bitmap, Boolean lossless) [0x00000]
at OpenSim.Region.Terrain.TerrainEngine.ExportJpegImage (System.String gradientmap) [0x00000]

Linux で動作させており、ネイティブのライブラリ libopenjpeg-libsl-2.1.2.0.so がシステムと合っていません。以下の原因が考えられます。

  • 古いプロセッサで動作させている (libopenjpeg が最適化オプションつきでコンパイルされている)
  • 64 ビットモードで動作させようとしている (ネイティブライブラリはどれも 64 ビット向けにビルドされていません)

ソースから libopenjpeg を再ビルドしするか、互換環境で動作させてみましょう。 次のようにします。

svn co svn://openmv.org/libsl/libopenmetaverse/trunk libsl
cd libsl/openjpeg-libsl/
make

それから、 libopenjpeg-libsl-2.1.2.0.so を OpenSim の bin フォルダにコピーします。

System.NullReferenceException at OpenSim.Region.Communications.Local.LocalLoginService.PrepareLoginToRegion

[LOGIN END]: XMLRPC Login failed, System.NullReferenceException: Object reference not set to an instance of an object

at OpenSim.Region.Communications.Local.LocalLoginService.PrepareLoginToRegion (OpenSim.Framework.RegionInfo regionInfo, OpenSim.Framework.UserProfileData user, OpenSim.Framework.Communications.LoginResponse response) [0x00000] in /home/sim/svn/opensim/OpenSim/Region/Communications/Local/LocalLoginService.cs:293
at OpenSim.Region.Communications.Local.LocalLoginService.CustomiseResponse (OpenSim.Framework.Communications.LoginResponse response, OpenSim.Framework.UserProfileData theUser, System.String startLocationRequest) [0x00520] in /home/sim/svn/opensim/OpenSim/Region/Communications/Local/LocalLoginService.cs:253
at OpenSim.Framework.Communications.LoginService.XmlRpcLoginMethod (Nwc.XmlRpc.XmlRpcRequest request) [0x00369] in /home/sim/svn/opensim/OpenSim/Framework/Communications/LoginService.cs:252

実在しないドメイン名を地域の External Host Name に指定してしまうなどしたため、OpenSim の初回起動に失敗しています。このため、初期化は一部だけしか行われていません。この問題を解決するには、bin フォルダを削除して、svn update を行い、再ビルドしてデータベースをパージ (完全消去) する必要があります。

Exception: System.NotImplementedException: The requested feature is not implemented.

次のようなメッセージで始まる例外が発生したら、

Exception: System.NotImplementedException: The requested feature is not implemented. at (wrapper managed-to-native) System.Threading.Interlocked:Add (int&,int) at System.Threading.ReaderWriterLockSlim.TryEnterReadLock (Int32 millisecondsTimeout) [0x000e3] in

Mono に誤って --optimize=-all というオプションを渡してしまったと考えられます。Mono はコンパイルで System.Threading.Interlocked クラスのメソッドの「最適化された」バージョンを作ってしまうのが問題となっています。これらの最適化はコンパイルしている環境にある素のアセンブラを使って行われます (ビルド時に自動的に検出されます) 。--optimize=-all を渡すと、ランタイムはこれらの関数が最適化されていることを検出し、無効にします。このため、次にクラスがこれらの関数の呼び出しを行うと、ランタイムはメソッドのネイティブな実装がないとみなします!これは、全ての System.Threading 同期プリミティブに影響します。OpenSimulator はスレッドや排他制御に大きく依存していますので、この処理機構がないと何もできません。おそらく、Mono の将来のバージョンには --optimize=-all を渡すことができるようになり、例外を発生させるのではなく、最適化されていない実装 (例:pthreads) を出してくるようになるのでしょう。

Mono で (ネイティブコードでエラーが発生しているなど) ローレベルで発生している問題をデバッグしようとするとき、--optimize=-all を渡すのは適切なやり方とは言えません。代わりに、環境変数 MONO_LOG_LEVEL=debug を設定し、--debug スイッチを Mono に渡してプログラムを起動させましょう。他のプロセスと同じようにして、gdb でも Mono を動かすことができます。

グリッドモード

SIM を起動しましたが、どのグリッドにも接続されていません

OpneSim を最初に起動するときに、設定が必要です。

  • 設定 を参照してください。

OpenSim.Grid.UserServer.exe を起動しましたが、エラーが発生します

  • 設定 を参照してください。

私のグリッドはユーザが1人だけのときはうまくいくのですが、同時に2人のユーザがログインすると2人とも固まります

  • 環境変数に MONO_THREADS_PER_CPU="100" を export してあるか確認しましょう。

20 分以内に私の地域は CPU100% になって、地域がハングします

  • Mono が 1.9.1 以前の場合は、2.2 にアップグレードしましょう。

ハイパーグリッド

ハイパーグリッドを有効にして OpenSim を起動すると、インベントリがロードされません!

  • グリッドモードで動作させようとしている場合、まず OpenSim.ini を調べて、グリッドサーバの DNS ネームやアドレスが自分からもインターネットからもアクセスできるか確認しましょう。
  • UGAIM サーバの XML 設定ファイルを調べて、全部の項目にインターネットからアクセスできる IP アドレスが記載されているか確認しましょう。
    • 心当たりがあり、UGAIM サーバのアドレスを変更しなければならない場合は、UGAIM の変更後の IP アドレスを参照するようにするために、データベースに間に合わせの SQL クエリを発行してグリッドのユーザアカウントを更新する必要があります。

SQL サーバにログインし、データベースをグリッドに合わせて変更しましょう。XML 設定ファイルで UGAIM サービスのアドレスを変更した後、次のコマンドで、ユーザのホームインベントリやアセットの URI が更新されます。

     update users set userInventoryURI="http://new.UGAIM.address:8004" where userInventoryURI = "http://old.UGAIM.address:8004";
     update users set userAssetURI="http://new.UGAIM.address:8003" where userAssetURI = "http://old.UGAIM.address:8003";

スクリプトエンジンの問題

スクリプトをコンパイルすると "Primitive: Error compiling script: unknown char: . error" と表示されます

スクリプトを ( .NETX で) コンパイルしようとすると、このようなエラーが表示される場合があります。

Primitive: Error compiling script: unknown char: .

コンソールでは、次のように表示されます。

11:06:37 - [ScriptEngine.DotNetEngine]: Unloading script
11:06:37 - Exception in MaintenanceLoopThread. Thread will recover after 5 sec throttle. Exception: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.

at System.Collections.Generic.Dictionary`2[OpenSim.Region.ScriptEngine.Interfaces.IEventReceiver, OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Dataserver].get_Item (IEventReceiver key) [0x00000]
at OpenSim.Region.ScriptEngine.Shared.Api.AsyncCommandManager.RemoveScript (IEventReceiver engine, UInt32 localID, UUID itemID) [0x00000]
at OpenSim.Region.ScriptEngine.DotNetEngine.ScriptManager._StopScript (UInt32 localID, UUID itemID) [0x00000]
at OpenSim.Region.ScriptEngine.DotNetEngine.ScriptManager.DoScriptLoadUnload () [0x00000]
at OpenSim.Region.ScriptEngine.DotNetEngine.MaintenanceThread.MaintenanceLoop () [0x00000]

11:06:37 - [ScriptEngine.DotNetEngine]: Loading script
11:06:37 - [ScriptEngine.DotNetEngine]: ScriptManager StartScript: localID: 720001, itemID: 88c9d28c-6004-4609-a707-717190de044a
11:06:37 - [Compiler]: Compiled new assembly for fad15951-f9aa-493f-be68-2aaf5ff8a3c9
11:06:37 - [SCRIPT]: Compiled assetID fad15951-f9aa-493f-be68-2aaf5ff8a3c9: ScriptEngines/a83150da-1ab1-11dd-89fb-0014853ee9da/CommonCompiler_compiled_fad15951-f9aa-493f-be68-2aaf5ff8a3c9.dll
11:06:37 - [ScriptEngine.DotNetEngine]: AppDomain Loading: OpenSim.Region.ScriptEngine.Shared, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

これは Linux で、デフォルトロケール ( "C" ) でない場合に発生します。

env LANG=C mono --debug OpenSim.exe
  • ロケール設定を変更するという手もあります。私が使っている '.bash_profile' はこのような感じになっています。
export LC_ALL=C
export LANG=C

この方法で Linux でのロケール設定を行うのはあまり良くないというのは私も承知していますが、この方法でスクラッチから Linux をインストールした環境でうまくいきました。

追伸: Melanie が数週間前にソースコードの一部を修正して、この手の問題が回避されるようになったようです。

スクリプトをコンパイルすると "Primitive: Error compiling script: ApplicationName='gmcs', ..." と表示されます

スクリプトを ( .NETX で) コンパイルしようとすると、このようなエラーが表示される場合があります。

Primitive: Error compiling script:
ApplicationName='gmcs', CommandLine='/target:library /debug+ /optimize- /out:

"ScriptEngines/430c29d0-c5c6-11dd-ad8b-0800200c9a66/CommonCompiler_compiled_fbe5e682-afae-4f1a-805b-0125031101f7.dll"
/r:"/usr/lib/opensim/bin/OpenSim.Region.ScriptEngine.Shared.dll"
/r:"/usr/lib/opensim/bin/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll" --
"/tmp/11b81aac/594d02ce.0.cs" ', CurrentDirectory=

右クリックメニューで、"Touch" などの他の機能が使えなくなります。

インストールした Mono が壊れている可能性があります (つまり、Mono として認識されているが、Ubuntu 8.10 Intrepid マシンに gmcs がインストールされていない)。

mono-gmcs (sudo apt-get install mono-gmcs) が正しくインストールされているか確認してください。

ロケールの問題

一部の OpenSim ユーザがグリッドモードで OpenSim リージョンサーバのクラッシュに見舞われることがあります。

この問題の解決策を探るため、さまざまなテストを作成しました。

最初にこの問題に見舞われたのは、OpenSim SVN.6660 の時です。接続しているユーザがいないのに、OpenSim リージョンサーバが不定期にクラッシュしていました (1時間後だったり、5時間後だったり、...) 。

最初に思いついた案は、SVN の最新の版にアップグレードすることですが、うまくいかず、同じ問題が発生しました。このため、他のサーバ (同じOS, 同じパラメタ, 同じ Mono バージョン, ...) で正常に動作している、以前の SVN リリース (SVN.6575) で実験してみました。うまくいかず、同じ問題が発生しました。

それから、ロケールをいろいろいじってみました。サーバを起動させるのに使っている screen UNIX コマンドライン・ユーティリティをリコンパイルしてみましたが、だめでした。

このため、サーバのメモリの使われ方を調べてみました。すると、最新の SVN リリースでは、OpenSim サーバがマルチリージョン/グリッドモードで動作するのに必要なメモリ容量が増加していることに気づきました。なので、MySQL サーバをより少ないメモリで動作するようにチューニングしました。幾分ましになりましたが、それでも OpenSim リージョンサーバは不定期にクラッシュし続けました (しかし以前よりは長くもちました) 。

このため、screen コマンドライン引数をいろいろいじってみました。... 全てのテストで、--debug 引数がサーバにインパクトを与えているという結果となりました。

最初のころは、以下のようなコマンドで OpenSim を起動していました。

/screen -S Region-service -d -m --debug mono OpenSim.exe

--debug 引数がなければ、全てがより安定して動作しているように見えました。

ロケールについて言えば、mantis や、opensim-dev や opensim-users のスレッドを読むと分かるように、"en_US" や "C" のロケールに対応していないシステムでの動作には問題があります。

サーバを再セットアップして、全部 "en_US.UTF8" で動作するようにしました。

Ubuntu 8.0.4 server では、

# cat /etc/default/locale
LANG="en_US.UTF-8"

# cat /var/lib/locales/supported.d/local
fr_FR.UTF-8 UTF-8
en_US.UTF-8 UTF-8

# cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
LANG="en_US"
LANGUAGE="en_US"

そして、おそらく以下の手順も必要でしょう。

# sudo dpkg-reconfigure locales

screen コマンドの引数は最終的にこうなります。

screen -S Region-service -d -m -U mono OpenSim.exe

これで、OpenSim SVN.6575 がクラッシュせずに 48 時間動作し続けるようになりました。そして SVN.6735 も。

この情報が役に立つと幸いです。

以下参考情報: スクリプト類のサンプルが、原文に掲載されています。

General
About This Wiki