2010-11-14 459 views

回答

96

它讀取現有的.config文件,並提示用戶在當前內核源文件中找不到的選項。這在採取現有配置並將其移至新內核時非常有用。

+0

謝謝,非常有幫助。 – 2010-11-16 16:11:10

5

用新的/更改/刪除的選項更新舊配置。

18

運行'make oldconfig'之前您需要將內核配置文件從較舊的內核複製到新內核的根目錄中。

您可以在正在運行的系統上找到舊內核配置文件的副本,地址爲/boot/config-3.11.0。另外,內核源代碼在linux-3.11.0/arch/x86/configs/{i386_defconfig/x86_64_defconfig}

CONFIGS如果你的內核源位於位於/ usr/src/linux中

cd /usr/src/linux 
cp /boot/config-3.9.6-gentoo .config 
make oldconfig 
+2

不要以root身份建立內核!請參閱https://www.youtube.com/watch?v=fMeH7wqOwXA#t=15m44s – ted 2015-01-17 17:20:15

2

從這個page

使oldconfig會採取的.config和運行它通過 Kconfig文件的規則,並生成一個與.config配合使用的.config,與 Kconfig規則一致。如果缺少CONFIG值,make oldconfig將詢問它們。

如果.config已經與Kconfig, 中的規則保持一致,那麼使oldconfig本質上是空操作。

如果您要運行make oldconfig,然後再運行make oldconfig a 第二次,第二次不會引起任何額外的更改爲 作出。

13

摘要

如前所述by Ignacio,它更新您的.config你在更新內核源代碼,例如與git pull

它試圖保持您的現有選項。

具有一個腳本是有用的,因爲:

  • 新的選擇可能已添加或刪除舊

  • 內核的Kconfig配置格式有選項:

    • 暗示彼此通過select
    • 依賴另一個通過depends

    這些選項關係使得手動配置解析更加困難。

讓我們手動修改的.config瞭解它是如何解決的配置

首先生成一個默認的配置:

make defconfig 

現在編輯生成.config手動檔來模擬一個內核更新並運行:

make oldconfig 

看看會發生什麼。一些結論:

類型的
  1. 線:

    # CONFIG_XXX is not set 
    

    不是單純的意見,但實際上表明該參數沒有設置。

    例如,如果我們刪除行:

    # CONFIG_DEBUG_INFO is not set 
    

    和運行make oldconfig,它會問我們:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW) 
    

    當它結束後,.config文件將被更新。

    如果您更改該行的任何字符,例如到# CONFIG_DEBUG_INFO,它不算。類型的

  2. 線:

    # CONFIG_XXX is not set 
    

    總是用於一個屬性的否定,雖然:

    CONFIG_XXX=n 
    

    也被理解爲否定。

    例如,如果您刪除# CONFIG_DEBUG_INFO is not set並回答:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW) 
    

    N,則輸出文件包含:

    # CONFIG_DEBUG_INFO is not set 
    

    ,而不是:

    CONFIG_DEBUG_INFO=n 
    

    而且,如果我們手動將該行修改爲:

    CONFIG_DEBUG_INFO=n 
    

    和運行make oldconfig,那麼該行被修改爲:

    # CONFIG_DEBUG_INFO is not set 
    

    沒有oldconfig問我們。

  3. 不符合相關條件的配置文件不會出現在.config上。其他人都這樣做。

    例如,設置:

    CONFIG_DEBUG_INFO=y 
    

    並運行make oldconfig。它現在會問我們:DEBUG_INFO_REDUCEDDEBUG_INFO_SPLIT等configs。

    之前,這些屬性沒有出現在defconfig上。

    如果我們看一下lib/Kconfig.debug它們被定義下,我們看到,他們依賴於DEBUG_INFO

    config DEBUG_INFO_REDUCED 
        bool "Reduce debugging information" 
        depends on DEBUG_INFO 
    

    所以當DEBUG_INFO被關閉,他們並沒有顯示在所有。

  4. 配置文件selected通過打開configs會自動設置而不詢問用戶。

    例如,如果CONFIG_X86=y我們刪除行:

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y 
    

    和運行make oldconfig,線路被重新不用問我們,不像DEBUG_INFO

    這是因爲arch/x86/Kconfig包含:

    config X86 
        def_bool y 
        [...] 
        select ARCH_MIGHT_HAVE_PC_PARPORT 
    

    ,並選擇勢力選項設置爲true。另請參閱:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

  5. 要求約束條件不滿足的配置。

    例如,defconfig已經建立:

    CONFIG_64BIT=y 
    CONFIG_RCU_FANOUT=64 
    

    如果我們編輯:

    CONFIG_64BIT=n 
    

    和運行make oldconfig,它會問我們:

    Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW) 
    

    這是因爲RCU_FANOUT是定義爲init/Kconfig爲:

    config RCU_FANOUT 
        int "Tree-based hierarchical RCU fanout value" 
        range 2 64 if 64BIT 
        range 2 32 if !64BIT 
    

    因此,如果沒有64BIT,最大值爲32,但我們不得不64組對.config,這將使其不一致。

獎金

make olddefconfig集的每一個選項的默認值不求回報交互。它會在make上自動運行,以確保.config在您像我們一樣手動修改它的情況下保持一致。另請參閱:https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

make alldefconfigmake olddefconfig類似,但它也接受要合併的配置片段。這個目標所使用的merge_config.sh腳本:https://stackoverflow.com/a/39440863/895245

如果你想自動化.config修改,是不是太簡單了:How do you non-interactively turn on features in a Linux kernel .config file?

0

它的折磨。而不是包含一個通用的配置文件,他們讓你迴歸9000次產生一個。

+3

嘗試:「是」「| make oldconfig' – 2017-02-20 20:21:57