अपने कर्नेल को संकलित करते समय initrd का आकार कैसे कम करें?


13

जब मैं अपना कर्नेल संकलित करता हूं, तो मूल रूप से मैं जो करता हूं वह निम्नलिखित है:

  1. मैं www.kernel.org से स्रोतों को डाउनलोड करता हूं और इसे अनलोक करता हूं।

  2. मैं अपने पिछले .configस्रोतों की प्रतिलिपि बनाता हूं और make menuconfigनए विकल्पों को देखने के लिए कर्नेल की नई नीति के अनुसार कॉन्फ़िगरेशन को संशोधित करता हूं ।

  3. फिर, मैं इसे संकलित करता हूं: make -j 4

  4. अंत में, मैं इसे स्थापित करता हूं su -c 'make modules_install && make install':।

  5. कुछ परीक्षणों के बाद, मैं पुराने कर्नेल (से /bootऔर /lib/modules) को हटा देता हूं और पूरी तरह से नए के साथ चलता हूं (यह अंतिम चरण कई बार मेरे जीवन को बचाता है! यह एक प्रो-टिप है !)।

समस्या यह है कि मुझे हमेशा वही मिलता है /boot/initrd.img-4.x.xजो मेरे वितरण से लोगों की तुलना में बहुत बड़ा है। यहाँ /boot/उदाहरण के रूप में मेरी वर्तमान निर्देशिका की सामग्री :

# ls -alFh
total 243M
drwxr-xr-x  5 root root 4.0K Mar 16 21:26 ./
drwxr-xr-x 25 root root 4.0K Feb 25 09:28 ../
-rw-r--r--  1 root root 2.9M Mar  9 07:39 System.map-4.4.0-1-amd64
-rw-r--r--  1 root root 3.1M Mar 11 22:30 System.map-4.4.5
-rw-r--r--  1 root root 3.2M Mar 16 21:26 System.map-4.5.0
-rw-r--r--  1 root root 170K Mar  9 07:39 config-4.4.0-1-amd64
-rw-r--r--  1 root root 124K Mar 11 22:30 config-4.4.5
-rw-r--r--  1 root root 126K Mar 16 21:26 config-4.5.0
drwxr-xr-x  5 root root  512 Jan  1  1970 efi/
drwxr-xr-x  5 root root 4.0K Mar 16 21:27 grub/
-rw-r--r--  1 root root  19M Mar 10 22:01 initrd.img-4.4.0-1-amd64
-rw-r--r--  1 root root 101M Mar 12 13:59 initrd.img-4.4.5
-rw-r--r--  1 root root 103M Mar 16 21:26 initrd.img-4.5.0
drwx------  2 root root  16K Apr  8  2014 lost+found/
-rw-r--r--  1 root root 3.5M Mar  9 07:30 vmlinuz-4.4.0-1-amd64
-rw-r--r--  1 root root 4.1M Mar 11 22:30 vmlinuz-4.4.5
-rw-r--r--  1 root root 4.1M Mar 16 21:26 vmlinuz-4.5.0

जैसा कि आपने देखा होगा, मेरी initrd.imgफाइलों का आकार मेरे वितरण से लगभग 10 गुना बड़ा है।

तो, क्या मैं अपने कर्नेल को संकलित करते समय कुछ गलत करता हूं? और, मैं अपने आकार को कैसे कम कर सकता हूं initrd.img?


wiki.gentoo.org/wiki/… और देखें कि यह क्या इतना बड़ा बना रहा है। यह या तो कर्नेल मॉड्यूल या लाइब्रेरी ... या पूरी तरह से कुछ और हो सकता है। यदि आप संग्रह की सामग्री को नहीं देखते हैं तो यह केवल अनुमान है।
फ्रॉस्टचुट्ज़

जवाबों:


19

इसका कारण यह है कि सभी कर्नेल मॉड्यूल नहीं छीने जाते हैं। आपको इसके आकार को कम करने की आवश्यकता है।

इस कमांड का उपयोग करें:

SHW@SHW:/tmp# cd /lib/modules/<new_kernel>
SHW@SHW:/tmp# find . -name *.ko -exec strip --strip-unneeded {} +

यह आकार को काफी कम कर देगा। कमांड से ऊपर निष्पादित करने के बाद, आप initramfs / initrd बनाने के लिए आगे बढ़ सकते हैं


वाह, मैं कभी नहीं होगा कि हालांकि अलग करना मॉड्यूल initrdछवि के आकार को 10 से विभाजित करेगा ... बहुत बहुत धन्यवाद, यह ठीक काम किया!
पेर

के बीच जगह होनी चाहिए {}और +
फक

15

मैंने यह जानने के लिए समस्या पर कुछ अतिरिक्त शोध किया कि मॉड्यूल को प्राप्त करने का सबसे अच्छा तरीका क्या है और यहां मैंने पाया कि पूरी प्रक्रिया है (फिर भी SHW ने उत्तर दिया लेकिन मुझे जो प्रक्रिया मिली वह किसी तरह अधिक मानकीकृत है):

  1. से स्रोतों को डाउनलोड करें www.kernel.orgऔर इसे अनकम्प्रेस्ड करें।

  2. अपने पिछले .configस्रोतों को कॉपी make menuconfigकरें और नए विकल्पों को देखने के लिए एक करें और कर्नेल की नई नीति के अनुसार कॉन्फ़िगरेशन को संशोधित करें।

  3. फिर, इसे संकलित करें:

    $> make -j 4
    
  4. अंत में, इसे स्थापित करें:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. कुछ परीक्षणों के बाद, पुराने कर्नेल को /bootऔर /lib/modulesनिर्देशिकाओं से हटा दें ।

INSTALL_MOD_STRIPजब करने के लिए सेट 1एक जोड़ने strip --strip-debugजब मॉड्यूल है, जो तेजी से आकार को कम करने के लिए पर्याप्त है स्थापित करने।

देखें: INSTALL_MOD_STRIP में Documentation/kbuild/kbuild.txt


7

आप अपने कॉन्फ़िगरेशन को भी बदल सकते हैं initramfs.conf

पर फ़ाइल ढूँढें /etc/initramfs-tools/initramfs.conf

एक सेटिंग है जो कहती है कि MODULES=mostइसमें अधिकांश मॉड्यूल आपकी initrd छवि को शामिल करते हैं।

यह करने के लिए बदलें MODULES=depinitramfs जनरेटर अनुमान लगाता है कि कौन से मॉड्यूल शामिल हैं।

यहाँ initramfs.conf के लिए मैनपेज देखें ।

नोट 1: उपरोक्त चरणों को करने के बाद मेरी initramfs छवि का आकार 282 एमबी से घटकर 99 एमबी हो गया। (यह अभी भी काफी बड़ा है लेकिन इसका एक महत्वपूर्ण सुधार है)

नोट 2: मैंने कर्नेल मॉड्यूल को अलग करने का भी प्रयास किया /lib/modules/<kernel version>। OS अद्यतनों द्वारा आपूर्ति किए गए मॉड्यूल छीन लिए गए हैं (आकार = 211 एमबी) और इस प्रकार संबंधित इंटिरमफ्स छवि लगभग 15 एमबी है। वेनिला कर्नेल के मॉड्यूल को छीनने के बाद जो मैंने खुद को फ़ोल्डर के आकार में संकलित किया था वह था 185 एमबी और इंट्रामफेस इमेज 16 एमबी थी। तो सभी अनुकूलन के बाद आकार 282 एमबी से घटकर 16 एमबी हो गया !! अलग करने के लिए इस कोड का उपयोग करें

find /lib/modules/<kernel_release>/ -iname "*.ko" -exec strip --strip-unneeded {} \;

उपरोक्त कोड <kernel_release>में उस कर्नेल संस्करण से प्रतिस्थापित करें जिसे आप मॉड्यूल से पट्टी करना चाहते हैं।

अधिक चर्चा के लिए इस लिंक को देखें

उपरोक्त कोड के रूप में sudoया चलाया जाना चाहिएsu

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.