2016-08-15 6 views
1

私はLinuxカーネルモジュールとユーザースペースアプリケーションを作成しました。彼らはnetlink経由で非常にうまく通信していました。しかし、CORE(Common Open Research Emulator)のエミュレートされたノードでユーザースペースアプリケーションを実行しようとしたときにerrno 111(接続拒否)が発生しました。原因を見つけるのを手伝ってください(COREによると、エミュレートされたノードはローカルマシンと同じカーネルを使用する仮想マシンです)。netlinkを使った仮想マシンとカーネル通信

ありがとうございます!

答えて

0

私の推測では、Linuxの機能(CAP_NET_ADMIN)が不足しているためです。ユーザー空間プロセスとVMプロセスの機能をチェックしましたか?

+0

こんにちはガルカ、私の質問にお答えいただきありがとうございます。私は約1年前にそれを公表しましたが、今私は解決策を見つけました。問題は、2つの通信プロセスが同じネットワークとプロセス空間に配置されている場合にのみ、カーネルとユーザー空間通信をサポートするNetlinkを使用したことでした。 COREノードは別々のネットワークとプロセス空間を使用するため、エラーが発生しました。私はCOREノードをカーネルスペースに切り替えようとしましたが、エラーはなくなりました。 :) – Tina

+0

こんにちは、ティナ。どうしてあなたは答えを提出しなかったのですか?誰も不思議だった:) – galka

+0

まあ、私はそれを知らなかった。次回はやるよ:) – Tina

0

「接続が拒否されました」というエラーが表示されるのは、ユーザーランドとカーネルランドプロセスが同じネットワークスペースに存在しないためです。カーネルランドプロセスは「ルート」空間をリッスンしていたのに対し、ユーザーランドプロセスは別の空間を送信していました。

COREはLinux仮想化を使用します。エミュレートされたノードごとに別々のプロセスとネットワークスペースが作成されます。アプリケーションがCOREノード上で実行されている場合、そのユーザーランドプロセスには独自のプロセスIDスペースとネットワークスタックスペースがあります。アプリケーションによって送信されたメッセージは、COREノード自身のスペース内に閉じ込められました。

COREを使用するときにカーネルとユーザーの通信を有効にするには、アプリケーションをカーネルのネットワークスペースに最初に切り替えてから、netlinkソケットを作成してソケットでメッセージを送信する必要があります。

カーネルのネットワークスペースに切り替えるには、最初に/proc/proc_rootをマウントする必要があります。そして、アプリケーションでは、Netlinkを使用してkernel-landプロセスにメッセージを送信する前に{fd = open("/proc_root/1/ns/net", O_RDONLY); setns(fd, 0);}を追加します。

関連する問題