2016-08-15 80 views
1

我寫了一個linux內核模塊和一個用戶空間應用程序。他們通過netlink進行了很好的溝通。但是當我嘗試在CORE(通用開放式研究模擬器)的仿真節點上運行用戶空間應用程序時,我得到了errno 111(連接被拒絕)。你能幫我找到原因嗎(根據CORE,模擬節點是一個虛擬機,它使用與本地主機相同的內核)?使用netlink虛擬機和內核通信

非常感謝!

回答

0

我的猜測是,它發生是因爲缺乏linux功能(CAP_NET_ADMIN)。您是否檢查了用戶空間進程和虛擬機進程的功能?

+0

嗨加爾卡,謝謝你回答我的問題。我在一年前發佈了它,現在我找到了一個解決方案。問題是我使用Netlink,當兩個通信進程位於相同的網絡和進程空間時,它只支持內核和用戶空間通信。由於CORE節點使用單獨的網絡和進程空間,因此出現錯誤。我試圖讓CORE節點切換到內核空間,然後錯誤消失了。 :) – Tina

+0

嗨,蒂娜。你爲什麼不提交答案,每個人都好奇:) – galka

+0

嗯,我不知道。下一次我會做:) – Tina

0

我得到「連接被拒絕」錯誤的原因是因爲用戶地址和內核地址進程並不駐留在同一個網絡空間中。核心土地進程在「根」空間進行監聽,而用戶地進程正在另一個空間進行發送。

CORE使用Linux虛擬化。它爲每個模擬節點創建獨立的進程和網絡空間。如果應用程序在CORE節點上運行,則其用戶登錄進程有其自己的進程ID空間和網絡堆棧空間。應用程序發送的消息被限制在CORE節點的空間內。

爲了在使用CORE時啓用內核區域和用戶區域通信,我們應該先讓應用程序切換到內核的網絡空間,然後創建一個netlink套接字並通過套接字發送消息。

要切換到內核的網絡空間,我們首先需要安裝/proc/proc_root。然後,在應用程序中,在使用Netlink將消息發送到內核進程之前添加{fd = open("/proc_root/1/ns/net", O_RDONLY); setns(fd, 0);}