2012-12-12 18 views
5

"rmmod" करने में असमर्थ मैं कर्नेल और उपयोगकर्ता स्पेस कोड दोनों शामिल एक बड़े एम्बेडेड सॉफ़्टवेयर (एआरएम प्रोसेसर, एम्बेडेड लिनक्स 2.6.31, व्यस्त बॉक्स) के साथ काम कर रहा हूं। एक कर्नेल मॉड्यूल सामान्य रूप से पहले लोड होता है, और मॉड्यूल के साथ नेटलिंक सॉकेट स्थापित करने वाला डिमन।मॉड्यूल

यहां मुद्दा यह है कि डेमॉन की हत्या के बाद, मैं अब स्मृति से मॉड्यूल अनलोड करने के लिए कर सकती हूं:

% rmmod _module.ko 
% rmmod: _module.ko: Resource temporarily unavailable 

विश्लेषण कि त्रुटि से पता चला है (वापसी मान -11EAGAIN है, यानी?) try_stop_module() द्वारा kernel/module.c में परिभाषा syscall delete_module() परिभाषा में वापस आ गया है। फंक्शन try_stop_module() बदले में stop_machine() कॉल करता है और यह वह जगह है जहां मैंने अटक गया है,

मुझे यकीन नहीं है कि वास्तव में क्या हो रहा है। मुझे लगता है कि मूल कारण डिमन में कहीं है जो मॉड्यूल से कनेक्शन खोलता है और स्पष्ट रूप से कुछ और बाहर निकलने पर सही ढंग से बंद/साफ़ नहीं होता है (जाहिर है कुछ संदर्भ/ताले जारी नहीं किए जाते हैं?)

क्या किसी के पास है किसी भी विचार को और क्या देखना है और जांच?

+0

बस एक बेवकूफ विचार ... rmmod -f ... अनलोड को मजबूर करना? टिप्पणियों के लिए –

उत्तर

1

सबसे पहले आपको ऐसा करने के लिए एक सुपरसियर होना चाहिए। इसके अलावा आप rmmod -f का उपयोग कर सकते हैं लेकिन यह विकल्प बेहद खतरनाक हो सकता है: जब तक कर्नेल संकलित नहीं किया गया तब तक CONFIG_MODULE_FORCE_UNLOAD सेट नहीं किया गया था। इस विकल्प के साथ, आप मॉड्यूल को हटा सकते हैं जिनका उपयोग किया जा रहा है, या जिन्हें हटाया जाने के लिए डिज़ाइन नहीं किया गया है, या असुरक्षित के रूप में चिह्नित किया गया है।

man rmmod भी पढ़ें।

+0

धन्यवाद। मुझे 'मजबूर' मोड के बारे में पता है, हालांकि मेरे प्लेटफॉर्म व्यस्त बॉक्स के रमोड पर इस विकल्प के साथ संकलित नहीं किया गया है, और मेरा लक्ष्य यह पता लगाने के लिए है कि कौन से डिस्क्रिप्टर अभी भी रखे जा रहे हैं और इसे ठीक कर सकते हैं, यह स्पष्ट रूप से मॉड्यूल में एक बग है या/और डेमॉन। – Mark

+2

एक और बात - यहां मुख्य समस्या यह है कि मॉड्यूल के संदर्भों की संख्या, यानी मॉड्यूल (/ proc/net/modules का तीसरा क्षेत्र) का उपयोग करने वाली कितनी प्रक्रियाएं शून्य नहीं हैं और इस प्रकार मॉड्यूल कर सकता है अनलोड नहीं किया जाएगा। डेमॉन चलाने से पहले, संदर्भ काउंटर 0 है, डिमन लॉन्च होने के बाद, काउंटर 6 तक चला जाता है, हालांकि मुझे उम्मीद है कि केवल 3 ही यह तीन सॉकेट खोलेंगे। तो, डैमन को मारने के बाद, काउंटर 3 तक गिर जाता है, और इस प्रकार मॉड्यूल को अनलोड नहीं किया जा सकता है। क्या अन्य डिस्क्रिप्टर इत्यादि को खोलने के लिए कोई तरीका है? – Mark

1

जांचें कि क्या आपके मॉड्यूल से संबंधित सभी इंटरफेस 'अप' नहीं हैं।

यदि आपके मॉड्यूल से संबंधित इंटरफ़ेस में से कोई भी 'अप' है, तो rmmod विफल हो जाएगा और -11 के साथ रिटर्न होगा।

तो rmmod को कॉल करने से पहले, 'netcfg' कमांड का उपयोग कर सक्रिय इंटरफेस की जांच करें। फिर ifconfig का उपयोग करके, अपना इंटरफ़ेस 'ifconfig <interface_name> down'

के रूप में नीचे rmmod <module_name> चलाने का प्रयास करें। यह काम करेगा !!

1.netcfg <lists out all interfaces> 
2.ifconfig <interface_name> down 
3.rmmod <module_name> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^